[
  {
    "path": ".agents/README.md",
    "content": "@_@\n"
  },
  {
    "path": ".agents/skills/wagmi-development/SKILL.md",
    "content": "---\nname: wagmi-development\ndescription: Creates Wagmi features across all layers - core actions, query options, framework bindings. Use when adding new actions, hooks, or working across packages/core, packages/react, packages/vue.\n---\n\n# Wagmi Development\n\nFull-stack patterns for adding Wagmi features. This skill covers Viem-based actions only (not Wagmi config actions).\n\n## Layer Overview\n\n1. **Core Action** (`packages/core/src/actions/`) - Base functionality wrapping Viem\n2. **Query Options** (`packages/core/src/query/`) - TanStack Query integration\n3. **Framework Bindings** - React (`packages/react/src/hooks/`), Vue (`packages/vue/src/composables/`)\n\n---\n\n## 1. Core Action\n\n### Structure\n\n```ts\nimport {\n  type MyActionErrorType as viem_MyActionErrorType,\n  type MyActionParameters as viem_MyActionParameters,\n  type MyActionReturnType as viem_MyActionReturnType,\n  myAction as viem_myAction,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter, ConnectorParameter } from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type MyActionParameters<config extends Config = Config> = Compute<\n  ChainIdParameter<config> & viem_MyActionParameters\n>\n\nexport type MyActionReturnType = viem_MyActionReturnType\n\nexport type MyActionErrorType = viem_MyActionErrorType\n\n/** https://wagmi.sh/core/api/actions/myAction */\nexport async function myAction<config extends Config>(\n  config: config,\n  parameters: MyActionParameters<config>,\n): Promise<MyActionReturnType> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  const action = getAction(client, viem_myAction, 'myAction')\n  return action(rest)\n}\n```\n\n### Key Rules\n\n- **Viem imports**: Prefix with `viem_` (e.g., `viem_getBalance`)\n- **Client access**: \n  - Read-only: `config.getClient({ chainId })`\n  - Wallet: `await getConnectorClient(config, { chainId, connector, account })`\n  - Mixed: Use `getConnectorClient` for account, `getClient` for action (see `estimateGas.ts`)\n- **Parameters**: Add `ChainIdParameter<config>` always. Add `ConnectorParameter` for wallet actions.\n- **Type params**: Mirror Viem's type params for inference. Use `const` modifier for literal inference (abi, args).\n- **Spread**: Omit wagmi-specific props (`chainId`, `connector`) when calling Viem action.\n\n### Testing\n\n**Runtime tests** (`action.test.ts`):\n```ts\nimport { abi, address, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\nimport { myAction } from './myAction.js'\n\ntest('default', async () => {\n  await expect(myAction(config, { /* required params */ })).resolves.toMatchInlineSnapshot(`...`)\n})\n\ntest('parameters: chainId', async () => { /* test chainId param */ })\n\ntest('behavior: error case', async () => { /* test error handling */ })\n```\n\n**Type tests** (`action.test-d.ts`) - only if action has type inference:\n```ts\nimport { config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\nimport { myAction } from './myAction.js'\n\ntest('default', async () => {\n  const result = await myAction(config, { /* params */ })\n  expectTypeOf(result).toEqualTypeOf<ExpectedType>()\n})\n```\n\n**Type benchmarks** (`action.bench-d.ts`) - only if action has type inference:\n```ts\nimport { attest } from '@ark/attest'\nimport { test } from 'vitest'\nimport type { MyActionParameters } from './myAction.js'\n\ntest('default', () => {\n  type Result = MyActionParameters<typeof abi.erc20, 'balanceOf'>\n  const res = {} as Result\n  attest.instantiations([12345, 'instantiations'])\n  attest(res.args).type.toString.snap(`readonly [account: \\`0x\\${string}\\`]`)\n})\n```\n\n**Wallet action tests**: Connect before, disconnect after:\n```ts\ntest('default', async () => {\n  await connect(config, { connector })\n  await expect(myAction(config, { /* params */ })).resolves.toMatchInlineSnapshot(`...`)\n  await disconnect(config, { connector })\n})\n```\n\n---\n\n## 2. Query Options\n\nQuery (read-only) or Mutation (wallet) options for TanStack Query.\n\n### Query Structure\n\n```ts\nimport {\n  type MyActionErrorType,\n  type MyActionParameters,\n  type MyActionReturnType,\n  myAction,\n} from '../actions/myAction.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions, structuralSharing } from './utils.js'\n\nexport type MyActionOptions<\n  config extends Config,\n  selectData = MyActionData,\n> = Compute<ExactPartial<MyActionParameters<config>> & ScopeKeyParameter> &\n  QueryParameter<MyActionQueryFnData, MyActionErrorType, selectData, MyActionQueryKey<config>>\n\nexport function myActionQueryOptions<\n  config extends Config,\n  selectData = MyActionData,\n>(\n  config: config,\n  options: MyActionOptions<config, selectData> = {},\n): MyActionQueryOptions<config, selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(options.requiredParam && (options.query?.enabled ?? true)),\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      if (!parameters.requiredParam) throw new Error('requiredParam is required')\n      const result = await myAction(config, {\n        ...(parameters as MyActionParameters),\n        requiredParam: parameters.requiredParam,\n      })\n      return result ?? null\n    },\n    queryKey: myActionQueryKey(options),\n    structuralSharing, // include when returning complex objects/arrays\n  }\n}\n\nexport type MyActionQueryFnData = Compute<MyActionReturnType>\nexport type MyActionData = MyActionQueryFnData\n\nexport function myActionQueryKey<config extends Config>(\n  options: Compute<ExactPartial<MyActionParameters<config>> & ScopeKeyParameter> = {},\n) {\n  return ['myAction', filterQueryOptions(options)] as const\n}\n\nexport type MyActionQueryKey<config extends Config> = ReturnType<typeof myActionQueryKey<config>>\n\nexport type MyActionQueryOptions<\n  config extends Config,\n  selectData = MyActionData,\n> = QueryOptions<MyActionQueryFnData, MyActionErrorType, selectData, MyActionQueryKey<config>>\n```\n\n### Mutation Structure\n\n```ts\nimport type { MutationOptions, MutationParameter } from '../types/query.js'\n\nexport type MyActionOptions<config extends Config, context = unknown> = MutationParameter<\n  MyActionData,\n  MyActionErrorType,\n  MyActionVariables<config>,\n  context\n>\n\nexport function myActionMutationOptions<config extends Config, context>(\n  config: config,\n  options: MyActionOptions<config, context> = {},\n): MyActionMutationOptions<config> {\n  return {\n    ...options.mutation,\n    mutationFn: async (variables) => {\n      return myAction(config, variables)\n    },\n    mutationKey: ['myAction'],\n  }\n}\n\nexport type MyActionMutationOptions<config extends Config> = MutationOptions<\n  MyActionData,\n  MyActionErrorType,\n  MyActionVariables<config>\n>\n```\n\n### Key Rules\n\n- **ExactPartial vs UnionExactPartial**: Use `ExactPartial` for simple types, `UnionExactPartial` for complex unions (contract actions)\n- **enabled**: Based on required params being truthy\n- **structuralSharing**: Include when action returns objects/arrays\n- **filterQueryOptions**: Filters common non-serializable props. Skip props like `onReplaced` manually in query key.\n- **Query key**: Always `['actionName', filterQueryOptions(options)]`\n\n### Testing\n\n```ts\nimport { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\nimport { myActionQueryOptions } from './myAction.js'\n\ntest('default', () => {\n  expect(myActionQueryOptions(config, {})).toMatchInlineSnapshot(`\n    {\n      \"enabled\": false,\n      \"queryFn\": [Function],\n      \"queryKey\": [\"myAction\", {}],\n    }\n  `)\n})\n\ntest('enabled', () => {\n  expect(myActionQueryOptions(config, { requiredParam: 'value' }).enabled).toBe(true)\n})\n\ntest('queryFn: calls query fn', async () => {\n  const options = myActionQueryOptions(config, { requiredParam: 'value' })\n  const result = await options.queryFn({ queryKey: options.queryKey } as any)\n  expect(result).toMatchInlineSnapshot(`...`)\n})\n```\n\n---\n\n## 3. Framework Bindings\n\n### React Query Hook\n\n```ts\n'use client'\nimport type { Config, MyActionErrorType, ResolvedRegister } from '@wagmi/core'\nimport type { Compute } from '@wagmi/core/internal'\nimport {\n  type MyActionData,\n  type MyActionOptions,\n  myActionQueryOptions,\n} from '@wagmi/core/query'\nimport type { ConfigParameter } from '../types/properties.js'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseMyActionParameters<\n  config extends Config = Config,\n  selectData = MyActionData,\n> = Compute<MyActionOptions<config, selectData> & ConfigParameter<config>>\n\nexport type UseMyActionReturnType<selectData = MyActionData> =\n  UseQueryReturnType<selectData, MyActionErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useMyAction */\nexport function useMyAction<\n  config extends Config = ResolvedRegister['config'],\n  selectData = MyActionData,\n>(\n  parameters: UseMyActionParameters<config, selectData> = {},\n): UseMyActionReturnType<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = myActionQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n    query: parameters.query,\n  })\n  return useQuery(options)\n}\n```\n\n### React Mutation Hook\n\n```ts\n'use client'\nimport { useMutation } from '@tanstack/react-query'\nimport type { Config, ResolvedRegister, MyActionErrorType } from '@wagmi/core'\nimport {\n  type MyActionData,\n  type MyActionMutate,\n  type MyActionMutateAsync,\n  type MyActionOptions,\n  type MyActionVariables,\n  myActionMutationOptions,\n} from '@wagmi/core/query'\nimport type { ConfigParameter } from '../types/properties.js'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseMyActionParameters<config extends Config = Config, context = unknown> =\n  MyActionOptions<config, context> & ConfigParameter<config>\n\nexport type UseMyActionReturnType<config extends Config = Config, context = unknown> =\n  UseMutationReturnType<\n    MyActionData,\n    MyActionErrorType,\n    MyActionVariables<config>,\n    context,\n    MyActionMutate<config, context>,\n    MyActionMutateAsync<config, context>\n  >\n\n/** https://wagmi.sh/react/api/hooks/useMyAction */\nexport function useMyAction<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: UseMyActionParameters<config, context> = {},\n): UseMyActionReturnType<config, context> {\n  const config = useConfig(parameters)\n  const options = myActionMutationOptions(config, parameters)\n  const mutation = useMutation(options)\n  type Return = UseMyActionReturnType<config, context>\n  return {\n    ...mutation,\n    mutate: mutation.mutate as Return['mutate'],\n    mutateAsync: mutation.mutateAsync as Return['mutateAsync'],\n  }\n}\n```\n\n### Vue Composable (Query)\n\n```ts\nimport type { Config, MyActionErrorType, ResolvedRegister } from '@wagmi/core'\nimport type { Compute } from '@wagmi/core/internal'\nimport {\n  type MyActionData,\n  type MyActionOptions,\n  myActionQueryOptions,\n} from '@wagmi/core/query'\nimport { computed } from 'vue'\nimport type { ConfigParameter } from '../types/properties.js'\nimport type { DeepMaybeRef } from '../types/ref.js'\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseMyActionParameters<\n  config extends Config = Config,\n  selectData = MyActionData,\n> = Compute<DeepMaybeRef<MyActionOptions<config, selectData> & ConfigParameter<config>>>\n\nexport type UseMyActionReturnType<selectData = MyActionData> =\n  UseQueryReturnType<selectData, MyActionErrorType>\n\n/** https://wagmi.sh/vue/api/composables/useMyAction */\nexport function useMyAction<\n  config extends Config = ResolvedRegister['config'],\n  selectData = MyActionData,\n>(\n  parameters: UseMyActionParameters<config, selectData> = {},\n): UseMyActionReturnType<selectData> {\n  const params = computed(() => deepUnref(parameters))\n  const config = useConfig(params)\n  const chainId = useChainId({ config })\n  const options = computed(() =>\n    myActionQueryOptions(config as any, {\n      ...params.value,\n      chainId: params.value.chainId ?? chainId.value,\n      query: params.value.query,\n    }),\n  )\n  return useQuery(options as any) as any\n}\n```\n\n### Framework Rules\n\n| Rule | React | Vue |\n|------|-------|-----|\n| Top directive | `'use client'` | None |\n| Parameters wrapper | `Compute<...>` | `Compute<DeepMaybeRef<...>>` |\n| Reactivity | Direct | `computed()` + `deepUnref()` |\n| Doc URL | `wagmi.sh/react/api/hooks/` | `wagmi.sh/vue/api/composables/` |\n\n**Shared rules:**\n- `ResolvedRegister['config']`: Use in function signature only, not type defs\n- No `enabled`/`structuralSharing` in hooks: Handled by queryOptions\n\n### Testing\n\n**Query hook test-d.ts**:\n```ts\nimport { abi } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\nimport { useMyAction } from './useMyAction.js'\n\ntest('select data', () => {\n  const result = useMyAction({\n    /* params */\n    query: {\n      select(data) {\n        expectTypeOf(data).toEqualTypeOf<ExpectedDataType>()\n        return data\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<ExpectedDataType>()\n})\n```\n\n**Mutation hook test-d.ts**:\n```ts\nimport { expectTypeOf, test } from 'vitest'\nimport { useMyAction } from './useMyAction.js'\n\ntest('context', () => {\n  const { mutate } = useMyAction({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toMatchTypeOf<{ /* expected shape */ }>()\n        return { foo: 'bar' }\n      },\n      onError(error, variables, context) { /* test types */ },\n      onSuccess(data, variables, context) { /* test types */ },\n      onSettled(data, error, variables, context) { /* test types */ },\n    },\n  })\n\n  mutate({ /* params */ }, {\n    onSuccess(data, variables, context) { /* test inference */ },\n  })\n})\n```\n\n---\n\n## Exports\n\nAdd to `exports/index.ts` in respective package:\n\n```ts\n// packages/core/src/exports/index.ts\nexport {\n  type MyActionParameters,\n  type MyActionReturnType,\n  type MyActionErrorType,\n  myAction,\n} from '../actions/myAction.js'\n\n// packages/core/src/exports/query.ts\nexport {\n  type MyActionData,\n  type MyActionOptions,\n  type MyActionQueryFnData,\n  type MyActionQueryKey,\n  type MyActionQueryOptions,\n  myActionQueryKey,\n  myActionQueryOptions,\n} from '../query/myAction.js'\n\n// packages/react/src/exports/index.ts\nexport {\n  type UseMyActionParameters,\n  type UseMyActionReturnType,\n  useMyAction,\n} from '../hooks/useMyAction.js'\n```\n\n---\n\n## Verification\n\n```bash\n# Format\npnpm format\n\n# Type check (all or filtered)\npnpm check:types\npnpm --filter @wagmi/core check:types\npnpm --filter wagmi check:types\n\n# Test (all or filtered)\npnpm test\npnpm test --project core\npnpm test --project react\n\n# Update test snapshots\npnpm vitest -u\n\n# Type benchmarks\npnpm bench:types\n\n# Viem version mismatch in test snapshots\npnpm version:update:viem\n\n# Build (all or filtered)\npnpm run clean && pnpm build\npnpm --filter @wagmi/core build\n```\n"
  },
  {
    "path": ".changeset/README.md",
    "content": "# Changesets\n\nHello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works\nwith multi-package repos, or single-package repos to help you version and publish your code. You can\nfind the full documentation for it [in our repository](https://github.com/changesets/changesets)\n\nWe have a quick list of common questions to get you started engaging with this project in\n[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)\n"
  },
  {
    "path": ".changeset/brave-hens-rare.md",
    "content": "---\n\"wagmi\": minor\n\"@wagmi/vue\": patch\n\"@wagmi/solid\": patch\n---\n\nUpdate MetaMask connector from `@metamask/sdk` to the new `@metamask/connect-evm`.\n\n```bash\nnpm install @metamask/connect-evm\nnpm uninstall @metamask/sdk\n```\n"
  },
  {
    "path": ".changeset/config.json",
    "content": "{\n  \"$schema\": \"https://unpkg.com/@changesets/config@3.0.5/schema.json\",\n  \"changelog\": [\n    \"@svitejs/changesets-changelog-github-compact\",\n    { \"repo\": \"wevm/wagmi\" }\n  ],\n  \"commit\": false,\n  \"access\": \"public\",\n  \"fixed\": [],\n  \"linked\": [],\n  \"baseBranch\": \"main\",\n  \"updateInternalDependencies\": \"minor\",\n  \"ignore\": [\n    \"*-register\",\n    \"@wagmi/test\",\n    \"site\",\n    \"next-app\",\n    \"nuxt-app\",\n    \"vite-*\"\n  ]\n}\n"
  },
  {
    "path": ".changeset/fix-tempo-webauthn-chain-id.md",
    "content": "---\n\"@wagmi/core\": patch\n---\n\nFixed chainId not being passed to Tempo webAuthn key authorization\n"
  },
  {
    "path": ".changeset/upset-trains-lick.md",
    "content": "---\n\"@wagmi/connectors\": major\n---\n\nMigrated MetaMask connector from `@metamask/sdk` to the new `@metamask/connect-evm` package.\n\n## Breaking Changes\n\n### New Peer Dependency\n\nYou must install `@metamask/connect-evm` as a peer dependency:\n\n```bash\nnpm install @metamask/connect-evm\n# or\npnpm add @metamask/connect-evm\n```\n\n### Parameter Changes\n\nThe connector parameters have been simplified and changed to align with the new SDK.\n\n**Removed options:**\n\n- `dappMetadata` - Use `dapp` instead\n- `logging` - Use `debug` instead\n- `headless` - Use `ui.headless` instead\n- `checkInstallationImmediately`\n- `checkInstallationOnAllCalls`\n- `preferDesktop` - Use `ui.preferExtension` instead\n- `openDeeplink` - Use `mobile.preferredOpenLink` instead\n- `extensionOnly`\n- `infuraAPIKey`\n- `communicationLayerPreference`\n- `communicationServerUrl`\n- `enableAnalytics`\n- `shouldShimWeb3`\n- `storage`\n- `timer`\n- `i18nOptions`\n- `modals`\n- All communication layer options\n\n**New options:**\n\n- `dapp` - Dapp identification (`{ name: string, url?: string, iconUrl?: string }`)\n- `debug` - Enable debug logging (boolean)\n- `mobile` - Mobile-specific options:\n  - `preferredOpenLink` - Custom function to open deeplinks (required for React Native)\n  - `useDeeplink` - Use `metamask://` deeplink vs `https://metamask.app.link` universal link\n- `ui` - UI configuration options:\n  - `headless` - Disable built-in UI\n  - `preferExtension` - Prefer browser extension over mobile\n  - `showInstallModal` - Show install modal when MetaMask is not installed\n- `transport` - Transport configuration:\n  - `extensionId` - Extension ID for browser extension transport\n\n**Preserved options:**\n\n- `connectAndSign` - Shortcut to connect and sign a message\n- `connectWith` - Connect with any RPC method\n\n### Migration Example\n\n**Before:**\n\n```ts\nimport { metaMask } from 'wagmi/connectors'\n\nmetaMask({\n  dappMetadata: {\n    name: 'My DApp',\n    url: 'https://mydapp.com',\n    iconUrl: 'https://mydapp.com/icon.png',\n  },\n  logging: { sdk: true },\n})\n```\n\n**After:**\n\n```ts\nimport { metaMask } from 'wagmi/connectors'\n\nmetaMask({\n  dapp: {\n    name: 'My DApp',\n    url: 'https://mydapp.com',\n    iconUrl: 'https://mydapp.com/icon.png',\n  },\n  debug: true,\n})\n```\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": "@tmm @jxom\n\n/packages/connectors/src/gemini @mikelxc\n/packages/connectors/src/metaMask @wenfix @ffmcgee725 @jiexi @adonesky1 @chakra-guy\n/packages/connectors/src/safe @DaniSomoza @dasanra @mikhailxyz @yagopv\n/packages/connectors/src/walletConnect @ganchoradkov @glitch-txs @ignaciosantise @tomiir\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "[View Contributing Guide on wagmi.sh](https://wagmi.sh/dev/contributing)"
  },
  {
    "path": ".github/DISCUSSION_TEMPLATE/connector-request.yml",
    "content": "title: '[Connector Request] '\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Thanks for your interest in contributing a new Connector to the Wagmi! If you haven't already, please read the [Contributing Guidelines](https://wagmi.sh/dev/contributing). Once you submit the form, the Wagmi team will follow up in the discussion thread to discuss next steps.\n\n        Please note that in order for connector requests to be accepted, the team creating the Connector must [sponsor Wagmi](https://github.com/sponsors/wevm). It takes time and effort to maintain third-party connectors. Wagmi is an OSS project that depends on sponsors and grants to continue our work. Please get in touch via [dev@wevm.dev](mailto:dev@wevm.dev) if you have questions about sponsoring.\n\n  - type: textarea\n    attributes:\n      label: What **novel use-case** does the Connector provide?\n      description: |\n        A novel use-case is likely one that is not already covered by or not easily extended from another Connector (such as the `injected` or `walletConnect`).\n\n        Examples of **novel** use-cases could be a connector that integrates with:\n\n        - the injected `window.ethereum` provider (a la `injected`)\n        - a series of wallets via QR Codes or Mobile Deep Links (a la `walletConnect`)\n        - a wallet with it's own SDK (a la `coinbaseWallet`)\n        - hardware wallet(s) via Web USB/Bluetooth\n        - an Externally Owned Account via a private key or some other method\n\n        Examples of **nonnovel** use-cases would be a connector that:\n\n        - extends another connector (e.g. `walletConnect`) with no significant differences in functionality other than branding, etc.\n      placeholder: Info on what makes this connector different.\n    validations:\n      required: true\n\n  - type: textarea\n    attributes:\n      label: Are the Connector's integrations production-ready and generally available?\n      description: Connectors are intended to be used by consumers in production as part of Wagmi. As such, the Connector and all dependencies must be production-ready and generally available. This means your connector should not rely on non-production software or be restricted to a limited group of users. For example, if your connector requires a wallet that has a closed beta, it is not ready for inclusion in Wagmi.\n      placeholder: Info about the Connector and any dependencies (e.g. browser extension, wallet app, npm package).\n    validations:\n      required: true\n\n  - type: checkboxes\n    attributes:\n      label: Are you committed to actively maintaining the Connector?\n      description: It is critical connectors are updated in a timely manner and actively maintained so that users of Wagmi can rely on them in production settings. The Wagmi core team will provide as much assistance as possible to keep connectors up-to-date with breaking changes from Wagmi, but it is your responsibility to ensure that any dependencies and issues/discussions related to the Connector are handled in a timely manner. If this is not done, the Connector could be removed from the future versions.\n      options:\n        - label: Yes, my team is or I am committed to actively maintaining the Connector.\n          required: true\n\n  - type: textarea\n    attributes:\n      label: Additional comments\n      description: Feel free to jot down any additional info you think might be helpful.\n      placeholder: Additional comments, questions, feedback.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "content": "name: Bug Report\ndescription: Report bugs or issues.\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Thanks for taking the time to fill out this bug report! The more info you provide, the more we can help you.\n\n        If you are a [Wagmi Sponsor](https://github.com/sponsors/wevm?metadata_campaign=gh_issue), your issues are prioritized.\n\n  - type: checkboxes\n    attributes:\n      label: Check existing issues\n      description: By submitting this issue, you checked there isn't [already an issue](https://github.com/wevm/wagmi/issues) for this bug.\n      options:\n        - label: I checked there isn't [already an issue](https://github.com/wevm/wagmi/issues) for the bug I encountered.\n          required: true\n\n  - type: textarea\n    attributes:\n      label: Describe the bug\n      description: Clear and concise description of the bug. If you intend to submit a PR for this issue, tell us in the description. Thanks!\n      placeholder: I am doing… What I expect is… What is actually happening…\n    validations:\n      required: true\n\n  - type: input\n    id: reproduction\n    attributes:\n      label: Link to Minimal Reproducible Example\n      description: \"Please provide a link that can reproduce the problem: [new.wagmi.sh](https://new.wagmi.sh) for runtime issues or [TypeScript Playground](https://www.typescriptlang.org/play) for type issues. For most issues, you will likely get asked to provide a minimal reproducible example so why not add one now :) If a report is vague (e.g. just snippets, generic error message, screenshot, etc.) and has no reproduction, it will receive a \\\"Needs Reproduction\\\" label and be auto-closed.\"\n      placeholder: https://new.wagmi.sh\n    validations:\n      required: false\n\n  - type: textarea\n    attributes:\n      label: Steps To Reproduce\n      description: Steps or code snippets to reproduce the behavior.\n    validations:\n      required: false\n\n  - type: dropdown\n    attributes:\n      label: What Wagmi package(s) are you using?\n      multiple: true\n      options:\n        - 'wagmi'\n        - '@wagmi/cli'\n        - '@wagmi/connectors'\n        - '@wagmi/core'\n        - '@wagmi/vue'\n        - 'create-wagmi'\n    validations:\n      required: true\n\n  - type: input\n    attributes:\n      label: Wagmi Package(s) Version(s)\n      description: What version of the Wagmi packages you selected above are you using? If using multiple, separate with comma (e.g. `wagmi@x.y.z, @wagmi/cli@x.y.z`).\n      placeholder: x.y.z (do not write `latest`)\n    validations:\n      required: true\n\n  - type: input\n    attributes:\n      label: Viem Version\n      description: What version of [Viem](https://viem.sh) are you using?\n      placeholder: x.y.z (do not write `latest`)\n    validations:\n      required: true\n\n  - type: input\n    attributes:\n      label: TypeScript Version\n      description: What version of TypeScript are you using? Wagmi requires `typescript@>=5`.\n      placeholder: x.y.z (do not write `latest`)\n    validations:\n      required: false\n\n  - type: textarea\n    attributes:\n      label: Anything else?\n      description: Anything that will give us more context about the issue you are encountering. Framework version (e.g. React, Vue), app framework (e.g. Next.js, Nuxt), bundler, etc.\n    validations:\n      required: false\n\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\ncontact_links:\n  - name: Get Help\n    url: https://github.com/wevm/wagmi/discussions/new?category=q-a\n    about: Ask a question and discuss with other community members.\n\n  - name: Feature Request\n    url: https://github.com/wevm/wagmi/discussions/new?category=ideas\n    about: Request features or brainstorm ideas for new functionality.\n\n  - name: Connector Request\n    url: https://github.com/wevm/wagmi/discussions/new?category=connector-request\n    about: Kick off a request for a new connector\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/docs_issue.yml",
    "content": "name: Documentation Issue\ndescription: Tell us about missing or incorrect documentation.\nlabels: ['Area: Docs']\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Thank you for submitting a documentation request. It helps make Wagmi better.\n\n        If it's a small change, like misspelling or example that needs updating, feel free to submit a PR instead of creating this issue.\n\n  - type: dropdown\n    attributes:\n      label: What is the type of issue?\n      multiple: true\n      options:\n        - Documentation is missing\n        - Documentation is incorrect\n        - Documentation is confusing\n        - Example code is not working\n        - Something else\n\n  - type: textarea\n    attributes:\n      label: What is the issue?\n    validations:\n      required: true\n\n  - type: textarea\n    attributes:\n      label: Where did you find it?\n      description: Please provide the URL(s) where you found this issue.\n    validations:\n      required: true\n"
  },
  {
    "path": ".github/README.md",
    "content": "<!-- > [!IMPORTANT] -->\n<!-- > Wagmi is participating in Gitcoin Grants round 21. Consider <a href=\"https://explorer.gitcoin.co/#/round/42161/389/74\">supporting the project</a>. Thank you. 🙏 -->\n\n<br>\n\n<p align=\"center\">\n  <a href=\"https://wagmi.sh\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/wevm/wagmi/main/.github/logo-dark.svg\">\n      <img alt=\"wagmi logo\" src=\"https://raw.githubusercontent.com/wevm/wagmi/main/.github/logo-light.svg\" width=\"auto\" height=\"60\">\n    </picture>\n  </a>\n</p>\n\n<p align=\"center\">\n  Reactive primitives for Ethereum apps\n<p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.com/package/wagmi\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://img.shields.io/npm/v/wagmi?colorA=21262d&colorB=21262d\">\n      <img src=\"https://img.shields.io/npm/v/wagmi?colorA=f6f8fa&colorB=f6f8fa\" alt=\"Version\">\n    </picture>\n  </a>\n  <a href=\"https://scorecard.dev/viewer/?uri=github.com/ossf/scorecard\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://img.shields.io/ossf-scorecard/github.com/wevm/wagmi?label=openssf+scorecard&style=flat&color=21262d&labelColor=21262d\">\n      <img src=\"https://img.shields.io/ossf-scorecard/github.com/wevm/wagmi?label=openssf+scorecard&style=flat&color=f6f8fa&labelColor=f6f8fa\" alt=\"OpenSSF Best Practices\">\n    </picture>\n  </a>\n  <a href=\"https://www.bestpractices.dev/en/projects/11233\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://img.shields.io/badge/openssf_best_practices-passing-21262d?labelColor=21262d\">\n      <img src=\"https://img.shields.io/badge/openssf_best_practices-passing-f6f8fa?labelColor=f6f8fa\" alt=\"OpenSSF Best Practices\">\n    </picture>\n  </a>\n  <br />\n  <a href=\"https://github.com/wevm/wagmi/blob/main/LICENSE\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://img.shields.io/npm/l/wagmi?colorA=21262d&colorB=21262d\">\n      <img src=\"https://img.shields.io/npm/l/wagmi?colorA=f6f8fa&colorB=f6f8fa\" alt=\"MIT License\">\n    </picture>\n  </a>\n  <a href=\"https://www.npmjs.com/package/wagmi\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://img.shields.io/npm/dm/@wagmi/core?colorA=21262d&colorB=21262d\">\n      <img src=\"https://img.shields.io/npm/dm/@wagmi/core?colorA=f6f8fa&colorB=f6f8fa\" alt=\"Downloads per month\">\n    </picture>\n  </a>\n  <a href=\"https://bestofjs.org/projects/wagmi\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://img.shields.io/endpoint?colorA=21262d&colorB=21262d&url=https://bestofjs-serverless.now.sh/api/project-badge?fullName=wevm%2Fviem%26since=daily\">\n      <img src=\"https://img.shields.io/endpoint?colorA=f6f8fa&colorB=f6f8fa&url=https://bestofjs-serverless.now.sh/api/project-badge?fullName=wevm%2Fviem%26since=daily\" alt=\"Best of JS\">\n    </picture>\n  </a>\n  <a href=\"https://app.codecov.io/gh/wevm/wagmi\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://img.shields.io/codecov/c/github/wevm/wagmi?colorA=21262d&colorB=21262d\">\n      <img src=\"https://img.shields.io/codecov/c/github/wevm/wagmi?colorA=f6f8fa&colorB=f6f8fa\" alt=\"Code coverage\">\n    </picture>\n  </a>\n</p>\n\n---\n\n## Documentation\n\nFor documentation and guides, visit [wagmi.sh](https://wagmi.sh).\n\n## Community\n\nFor help, discussion about best practices, or any other conversation that would benefit from being searchable:\n\n[Discuss Wagmi on GitHub](https://github.com/wevm/wagmi/discussions)\n\nFor casual chit-chat with others using the framework:\n\n[Join the Wagmi Discord](https://discord.gg/SghfWBKexF)\n\n## Contributing\n\nContributions to Wagmi are greatly appreciated! If you're interested in contributing to Wagmi, please read the [Contributing Guide](https://wagmi.sh/dev/contributing) **before submitting a pull request**.\n\n## Sponsors\n\nIf you find Wagmi useful or use it for work, please consider [sponsoring Wagmi](https://github.com/sponsors/wevm?metadata_campaign=gh_readme_support). Thank you 🙏\n\n<p>\n  <a href=\"https://paradigm.xyz\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/paradigm-dark.svg\">\n      <img alt=\"paradigm logo\" src=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/paradigm-light.svg\" width=\"auto\" height=\"70\">\n    </picture>\n  </a>\n  <a href=\"https://tempo.xyz\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/tempo-dark.svg\">\n      <img alt=\"tempo logo\" src=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/tempo-light.svg\" width=\"auto\" height=\"70\">\n    </picture>\n  </a>\n</p>\n\n<p>\n  <a href=\"https://twitter.com/family\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/family-dark.svg\">\n      <img alt=\"family logo\" src=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/family-light.svg\" width=\"auto\" height=\"50\">\n    </picture>\n  </a>\n  <a href=\"https://twitter.com/context\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/context-dark.svg\">\n      <img alt=\"context logo\" src=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/context-light.svg\" width=\"auto\" height=\"50\">\n    </picture>\n  </a>\n  <a href=\"https://dynamic.xyz\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/dynamic-dark.svg\">\n      <img alt=\"Dynamic logo\" src=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/dynamic-light.svg\" width=\"auto\" height=\"50\">\n    </picture>\n  </a>\n  <a href=\"https://sushi.com\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/sushi-dark.svg\">\n      <img alt=\"Sushi logo\" src=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/sushi-light.svg\" width=\"auto\" height=\"50\">\n    </picture>\n  </a>\n  <a href=\"https://stripe.com\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/stripe-dark.svg\">\n      <img alt=\"Stripe logo\" src=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/stripe-light.svg\" width=\"auto\" height=\"50\">\n    </picture>\n  </a>\n  <a href=\"https://www.privy.io\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/privy-dark.svg\">\n      <img alt=\"Privy logo\" src=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/privy-light.svg\" width=\"auto\" height=\"50\">\n    </picture>\n  </a>\n  <a href=\"https://pancakeswap.finance/\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/pancake-dark.svg\">\n      <img alt=\"pancake logo\" src=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/pancake-light.svg\" width=\"auto\" height=\"50\">\n    </picture>\n  </a>\n  <a href=\"https://pimlico.io\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/pimlico-dark.svg\">\n      <img alt=\"pimlico logo\" src=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/pimlico-light.svg\" width=\"auto\" height=\"50\">\n    </picture>\n  </a>\n  <a href=\"https://zora.co\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/zora-dark.svg\">\n      <img alt=\"zora logo\" src=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/zora-light.svg\" width=\"auto\" height=\"50\">\n    </picture>\n  </a>\n  <a href=\"https://syndicate.io\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/syndicate-dark.svg\">\n      <img alt=\"syndicate logo\" src=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/syndicate-light.svg\" width=\"auto\" height=\"50\">\n    </picture>\n  </a>\n  <a href=\"https://relay.link\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/relay-dark.svg\">\n      <img alt=\"relay logo\" src=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/relay-light.svg\" width=\"auto\" height=\"50\">\n    </picture>\n  </a>\n  <a href=\"https://polymarket.com\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/polymarket-dark.svg\">\n      <img alt=\"polymarket logo\" src=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/polymarket-light.svg\" width=\"auto\" height=\"50\">\n    </picture>\n  </a>\n  <a href=\"https://sequence.xyz\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/sequence-dark.svg\">\n      <img alt=\"sequence logo\" src=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/sequence-light.svg\" width=\"auto\" height=\"50\">\n    </picture>\n  </a>\n  <a href=\"https://web3auth.io\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/web3auth-dark.svg\">\n      <img alt=\"web3auth logo\" src=\"https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/web3auth-light.svg\" width=\"auto\" height=\"50\">\n    </picture>\n  </a>\n</p>\n\n[Sponsor Wagmi](https://github.com/sponsors/wevm?metadata_campaign=gh_readme_support_bottom)\n\n<br />\n<br />\n\n<a href=\"https://vercel.com/?utm_source=wevm&utm_campaign=oss\">\n  <img src=\"https://www.datocms-assets.com/31049/1618983297-powered-by-vercel.svg\" alt=\"Powered by Vercel\" height=\"35\">\n</a>\n\n\n"
  },
  {
    "path": ".github/SECURITY.md",
    "content": "# Security Policy\n\n## Reporting a Vulnerability\n\nContact [dev@wevm.dev](mailto:dev@wevm.dev).\n\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n  - package-ecosystem: 'github-actions'\n    directory: '/'\n    schedule:\n      interval: 'monthly'\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "<!-- What is this PR solving? Write a clear description or reference the issues it solves (e.g. `fixes #123`). What other alternatives have you explored? Are there any parts you think require more attention from reviewers? -->\n\n<!----------------------------------------------------------------------\nBefore creating the pull request, please make sure you do the following:\n\n- Read the Contributing Guidelines at https://wagmi.sh/dev/contributing\n- Check that there isn't already a PR that solves the problem the same way. If you find a duplicate, please help us review it.\n- Update the corresponding documentation if needed.\n- Include relevant tests that fail without this PR, but pass with it.\n\nThank you for contributing to Wagmi!\n----------------------------------------------------------------------->\n"
  },
  {
    "path": ".github/workflows/changesets.yml",
    "content": "name: Changesets\non:\n  push:\n    branches: [main]\npermissions:\n  contents: read\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: true\n\njobs:\n  verify:\n    name: Verify\n    permissions:\n      contents: write\n    uses: ./.github/workflows/verify.yml\n    secrets: inherit\n\n  changesets:\n    name: Publish\n    needs: verify\n    # prevents this action from running on forks\n    if: github.repository == 'wevm/wagmi'\n    permissions:\n      contents: write # to create release (changesets/action)\n      id-token: write # OpenID Connect token needed for provenance\n      pull-requests: write # to create pull request (changesets/action)\n    runs-on: ubuntu-latest\n    timeout-minutes: 5\n\n    steps:\n      - name: Clone repository\n        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8\n        with:\n          # This makes Actions fetch all Git history so that Changesets can generate changelogs with the correct commits\n          fetch-depth: 0\n\n      - name: Install dependencies\n        uses: wevm/actions/.github/actions/pnpm@f7ad7f00e16e73322562922c241f21f0c7ffbbec\n        with:\n          node-version: 24.5\n\n      - name: PR or publish\n        uses: changesets/action@e0145edc7d9d8679003495b11f87bd8ef63c0cba # v1.5.3\n        with:\n          title: 'chore: version packages'\n          commit: 'chore: version packages'\n          createGithubReleases: ${{ github.ref == 'refs/heads/main' }}\n          publish: pnpm changeset:publish\n          version: pnpm changeset:version\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Publish canary release\n        if: steps.changesets.outputs.published != 'true'\n        continue-on-error: true\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        run: |\n          git reset --hard origin/main\n          pnpm changeset version --no-git-tag --snapshot canary\n          pnpm changeset:prepublish\n          pnpm changeset publish --no-git-tag --snapshot canary --tag canary\n"
  },
  {
    "path": ".github/workflows/issue-labeled.yml",
    "content": "name: Issue Labeled\npermissions:\n  issues: write\n\non:\n  issues:\n    types: [labeled]\n\njobs:\n  issue-labeled:\n    if: ${{ github.repository_owner == 'wevm' }}\n    uses: wevm/actions/.github/workflows/issue-labeled.yml@f7ad7f00e16e73322562922c241f21f0c7ffbbec\n    with:\n      needs-reproduction-body: |\n        Hello @${{ github.event.issue.user.login }}. \n\n        Please provide a [minimal reproduction](https://stackoverflow.com/help/minimal-reproducible-example) using [StackBlitz](https://new.wagmi.sh), [TypeScript Playground](https://www.typescriptlang.org/play) (for type issues), or a separate minimal GitHub repository.\n\n        [Minimal reproductions are required](https://antfu.me/posts/why-reproductions-are-required) as they save us a lot of time reproducing your config/environment and issue, and allow us to help you faster.\n\n        Once a minimal reproduction is added, a team member will confirm it works, then re-open the issue.\n"
  },
  {
    "path": ".github/workflows/lock-issue.yml",
    "content": "name: Lock Issue\npermissions:\n  issues: write\n\non:\n  schedule:\n    - cron: '0 0 * * *'\n\njobs:\n  lock-issue:\n    if: ${{ github.repository_owner == 'wevm' }}\n    uses: wevm/actions/.github/workflows/lock-issue.yml@f7ad7f00e16e73322562922c241f21f0c7ffbbec\n    with:\n      issue-comment: |\n        This issue has been locked since it has been closed for more than 14 days.\n\n        If you found a concrete bug or regression related to it, please open a new [bug report](https://github.com/wevm/wagmi/issues/new?template=bug_report.yml) with a reproduction against the latest Wagmi version. If you have any questions or comments you can create a new [discussion thread](https://github.com/wevm/wagmi/discussions).\n  \n"
  },
  {
    "path": ".github/workflows/pull-request.yml",
    "content": "name: Pull Request\non:\n  pull_request:\n    types: [opened, reopened, synchronize, ready_for_review]\npermissions:\n  contents: read\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}\n  cancel-in-progress: true\n\njobs:\n  verify:\n    name: Verify\n    permissions:\n      contents: write\n    uses: ./.github/workflows/verify.yml\n    secrets: inherit\n\n  publish:\n    name: Publish preview release\n    # prevents this action from running on forks\n    if: github.repository == 'wevm/wagmi'\n    permissions:\n      contents: read\n    runs-on: ubuntu-latest\n    timeout-minutes: 5\n\n    steps:\n      - name: Clone repository\n        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8\n\n      - name: Install dependencies\n        uses: wevm/actions/.github/actions/pnpm@f7ad7f00e16e73322562922c241f21f0c7ffbbec\n        with:\n          node-version: 24.5\n\n      - name: Publish to pkg.pr.new\n        run: |\n          pnpm changeset:prepublish\n          pnpx pkg-pr-new publish --pnpm --compact './packages/*'\n        env:\n          PKG_PR_NEW: true\n\n  size:\n    name: Size\n    permissions:\n      contents: read\n      pull-requests: write\n    runs-on: ubuntu-latest\n    timeout-minutes: 5\n\n    steps:\n      - name: Clone repository\n        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8\n\n      - name: Install dependencies\n        uses: wevm/actions/.github/actions/pnpm@f7ad7f00e16e73322562922c241f21f0c7ffbbec\n        with:\n          node-version: 24.5\n\n      - name: Report build size\n        uses: preactjs/compressed-size-action@946a292cd35bd1088e0d7eb92b69d1a8d5b5d76a\n        with:\n          pattern: 'packages/**/dist/**'\n          repo-token: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/scorecard.yml",
    "content": "name: Scorecard\non:\n  # For Branch-Protection check. Only the default branch is supported. See\n  # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection\n  branch_protection_rule:\n  # To guarantee Maintained check is occasionally updated. See\n  # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained\n  schedule:\n    - cron: '22 13 * * 0'\n  push:\n    branches: [ \"main\" ]\n\n# Declare default permissions as read only.\npermissions: read-all\n\njobs:\n  analysis:\n    name: Scorecard analysis\n    runs-on: ubuntu-latest\n    # `publish_results: true` only works when run from the default branch. conditional can be removed if disabled.\n    if: github.event.repository.default_branch == github.ref_name || github.event_name == 'pull_request'\n    permissions:\n      # Needed to upload the results to code-scanning dashboard.\n      security-events: write\n      # Needed to publish results and get a badge (see publish_results below).\n      id-token: write\n\n    steps:\n      - name: \"Checkout code\"\n        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0\n        with:\n          persist-credentials: false\n\n      - name: \"Run analysis\"\n        uses: ossf/scorecard-action@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1\n        with:\n          results_file: results.sarif\n          results_format: sarif\n          publish_results: true\n\n      - name: \"Upload artifact\"\n        uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1\n        with:\n          name: SARIF file\n          path: results.sarif\n          retention-days: 5\n\n      - name: \"Upload to code-scanning\"\n        uses: github/codeql-action/upload-sarif@80cb6b56b93de3e779c7d476d9100d06fb87c877 # codeql-bundle-v2.23.2\n        with:\n          sarif_file: results.sarif\n"
  },
  {
    "path": ".github/workflows/verify.yml",
    "content": "name: Verify\non:\n  workflow_call:\n  workflow_dispatch:\npermissions:\n  contents: read\n\njobs:\n  check:\n    name: Check\n    permissions:\n      contents: write\n    runs-on: ubuntu-latest\n    timeout-minutes: 5\n\n    steps:\n      - name: Clone repository\n        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8\n        with:\n          token: ${{ secrets.GH_PTOKEN }}\n\n      - name: Install dependencies\n        uses: wevm/actions/.github/actions/pnpm@f7ad7f00e16e73322562922c241f21f0c7ffbbec\n        with:\n          node-version: 24.5\n\n      - name: Audit dependencies\n        run: pnpm audit\n\n      - name: Check repo\n        run: pnpm check:repo\n\n      - name: Check code\n        run: pnpm check\n\n      - name: Update package versions\n        run: pnpm version:update\n      \n      - uses: stefanzweifel/git-auto-commit-action@778341af668090896ca464160c2def5d1d1a3eb0 # v6.0.1\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        with:\n          commit_message: 'chore: format'\n          commit_user_name: 'github-actions[bot]'\n          commit_user_email: 'github-actions[bot]@users.noreply.github.com'\n\n  build:\n    name: Build\n    permissions:\n      contents: read\n    needs: check\n    runs-on: ubuntu-latest\n    timeout-minutes: 5\n\n    steps:\n      - name: Clone repository\n        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8\n\n      - name: Install dependencies\n        uses: wevm/actions/.github/actions/pnpm@f7ad7f00e16e73322562922c241f21f0c7ffbbec\n        with:\n          node-version: 24.5\n\n      - name: Build\n        run: pnpm clean && pnpm build\n\n      - name: Publint\n        run: pnpm test:build\n\n      - name: Check for unused files, dependencies, and exports\n        run: pnpm knip --production\n\n  types:\n    name: Types\n    permissions:\n      contents: read\n    needs: check\n    runs-on: ubuntu-latest\n    timeout-minutes: 5\n    strategy:\n      matrix:\n        typescript-version: ['5.7.3', '5.8.3', '5.9.3', 'latest']\n        viem-version: ['2.46.0', 'latest']\n\n    steps:\n      - name: Clone repository\n        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8\n\n      - name: Install dependencies\n        uses: wevm/actions/.github/actions/pnpm@f7ad7f00e16e73322562922c241f21f0c7ffbbec\n        with:\n          node-version: 24.5\n\n      - run: pnpm add -D -w typescript@${{ matrix.typescript-version }} viem@${{ matrix.viem-version }}\n\n      - name: Link packages\n        run: pnpm preconstruct\n\n      - name: Check types\n        run: pnpm check:types\n\n      - name: Bench types\n        run: pnpm bench:types\n\n      # Redundant with `pnpm check:types`\n      # If Vitest adds special features in the future, e.g. type coverage, can add this back!\n      # - name: Test types\n      #   run: pnpm test:typecheck\n\n  test:\n    name: Test\n    permissions:\n      contents: read\n    runs-on: ubuntu-latest\n    timeout-minutes: 20\n    strategy:\n      max-parallel: 4\n      matrix:\n        shard: [1, 2, 3, 4]\n        total-shards: [4]\n\n    steps:\n      - name: Clone repository\n        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8\n\n      - name: Install dependencies\n        uses: wevm/actions/.github/actions/pnpm@f7ad7f00e16e73322562922c241f21f0c7ffbbec\n        with:\n          node-version: 24.5\n\n      - name: Setup Docker\n        uses: docker/setup-docker-action@v4\n\n      - name: Set up foundry\n        uses: foundry-rs/foundry-toolchain@50d5a8956f2e319df19e6b57539d7e2acb9f8c1e # v1.5.0\n        with:\n          version: nightly\n\n      - name: Cache Playwright\n        uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb\n        id: playwright-cache\n        with:\n          path: ~/.cache/ms-playwright\n          key: ${{ runner.os }}-playwright-${{ hashFiles('pnpm-lock.yaml') }}\n\n      - name: Install Playwright\n        if: steps.playwright-cache.outputs.cache-hit != 'true'\n        run: pnpm exec playwright install chromium --with-deps\n\n      - name: Pull Tempo Docker image\n        run: docker pull ghcr.io/tempoxyz/tempo:latest\n\n      - name: Run tests\n        uses: nick-fields/retry@ce71cc2ab81d554ebbe88c79ab5975992d79ba08\n        with:\n          command: CI=true pnpm test:cov --shard=${{ matrix.shard }}/${{ matrix.total-shards }} --retry=3 --bail=1\n          max_attempts: 3\n          timeout_minutes: 5\n        env:\n          VITE_MAINNET_FORK_URL: ${{ secrets.VITE_MAINNET_FORK_URL }}\n          VITE_OPTIMISM_FORK_URL: ${{ secrets.VITE_OPTIMISM_FORK_URL }}\n\n      - name: Upload coverage reports to Codecov\n        uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7\n        with:\n          token: ${{ secrets.CODECOV_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "*.vitest-temp.json\n.DS_Store\n.attest\n.next\n.nuxt\n.pnpm-debug.log*\n.tanstack\n.wrangler\n_\ncache\ncoverage\ndist\nnode_modules\ntsconfig.tsbuildinfo\n\n# local env files\n.env\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n.envrc\n\n# proxy packages\npackages/cli/config\npackages/cli/plugins\npackages/core/actions\npackages/core/chains\npackages/core/codegen\npackages/core/experimental\npackages/core/internal\npackages/core/query\npackages/core/tempo\npackages/react/actions\npackages/react/chains\npackages/react/codegen\npackages/react/connectors\npackages/react/experimental\npackages/react/internal\npackages/react/query\npackages/react/tempo\npackages/solid/actions\npackages/solid/chains\npackages/solid/connectors\npackages/solid/internal\npackages/solid/query\npackages/vue/actions\npackages/vue/chains\npackages/vue/connectors\npackages/vue/internal\npackages/vue/nuxt\npackages/vue/query\n.vercel\n.env*.local\n"
  },
  {
    "path": ".vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"biomejs.biome\",\n    \"orta.vscode-twoslash-queries\",\n    \"Vue.volar\"\n  ]\n}\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"editor.defaultFormatter\": \"biomejs.biome\",\n  \"editor.formatOnSave\": true,\n  \"typescript.enablePromptUseWorkspaceTsdk\": true,\n  \"typescript.preferences.importModuleSpecifier\": \"shortest\",\n  \"typescript.tsdk\": \"node_modules/typescript/lib\",\n  \"editor.codeActionsOnSave\": {\n    \"source.fixAll.biome\": \"explicit\"\n  },\n  \"[javascript][javascriptreact][json][typescript][typescriptreact]\": {\n    \"editor.defaultFormatter\": \"biomejs.biome\"\n  },\n  \"[vue]\": {\n    \"editor.defaultFormatter\": \"Vue.volar\"\n  }\n}\n"
  },
  {
    "path": ".vscode/workspace.code-workspace",
    "content": "{\n  \"folders\": [\n    {\n      \"name\": \"docs\",\n      \"path\": \"../docs\"\n    },\n    {\n      \"name\": \"packages\",\n      \"path\": \"../packages\"\n    },\n    {\n      \"name\": \"playgrounds\",\n      \"path\": \"../playgrounds\"\n    }\n  ]\n}\n"
  },
  {
    "path": "FUNDING.json",
    "content": "{\n  \"drips\": {\n    \"ethereum\": {\n      \"ownedBy\": \"0xd2135CfB216b74109775236E36d4b433F1DF507B\"\n    }\n  },\n  \"opRetro\": {\n    \"projectId\": \"0xc0615947773148cbc340b175fb9afc98dbb4e0acd31d018b1ee41a5538785abf\"\n  }\n}\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2022-present weth, LLC\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "biome.json",
    "content": "{\n  \"$schema\": \"./node_modules/@biomejs/biome/configuration_schema.json\",\n  \"files\": {\n    \"includes\": [\n      \"**\",\n      \"!**/CHANGELOG.md\",\n      \"!**/pnpm-lock.yaml\",\n      \"!**/routeTree.gen.ts\",\n      \"!**/tsconfig.base.json\",\n      \"!**/worker-configuration.d.ts\"\n    ]\n  },\n  \"formatter\": {\n    \"enabled\": true,\n    \"formatWithErrors\": false,\n    \"indentStyle\": \"space\",\n    \"indentWidth\": 2,\n    \"lineWidth\": 80\n  },\n  \"linter\": {\n    \"includes\": [\"**\", \"!**/packages/create-wagmi/templates/**/*\"],\n    \"enabled\": true,\n    \"rules\": {\n      \"recommended\": true,\n      \"a11y\": {\n        \"useButtonType\": \"off\"\n      },\n      \"complexity\": {\n        \"noImportantStyles\": \"off\"\n      },\n      \"correctness\": {\n        \"noUnusedVariables\": \"error\",\n        \"useExhaustiveDependencies\": \"error\"\n      },\n      \"performance\": {\n        \"noBarrelFile\": \"error\",\n        \"noReExportAll\": \"error\",\n        \"noDelete\": \"off\"\n      },\n      \"style\": {\n        \"noNonNullAssertion\": \"off\",\n        \"noParameterAssign\": \"error\",\n        \"useAsConstAssertion\": \"error\",\n        \"useDefaultParameterLast\": \"error\",\n        \"useEnumInitializers\": \"error\",\n        \"useSelfClosingElements\": \"error\",\n        \"useSingleVarDeclarator\": \"error\",\n        \"noUnusedTemplateLiteral\": \"error\",\n        \"useNumberNamespace\": \"error\",\n        \"noInferrableTypes\": \"error\",\n        \"noUselessElse\": \"error\",\n        \"useConsistentArrayType\": {\n          \"level\": \"error\",\n          \"options\": {\n            \"syntax\": \"shorthand\"\n          }\n        }\n      },\n      \"suspicious\": {\n        \"noArrayIndexKey\": \"off\",\n        \"noConfusingVoidType\": \"off\",\n        \"noExplicitAny\": \"off\",\n        \"noConsole\": {\n          \"level\": \"error\",\n          \"options\": {\n            \"allow\": [\"log\"]\n          }\n        },\n        \"noTsIgnore\": \"off\"\n      }\n    }\n  },\n  \"javascript\": {\n    \"formatter\": {\n      \"quoteStyle\": \"single\",\n      \"trailingCommas\": \"all\",\n      \"semicolons\": \"asNeeded\"\n    }\n  },\n  \"assist\": {\n    \"actions\": {\n      \"source\": {\n        \"organizeImports\": \"on\"\n      }\n    }\n  },\n  \"overrides\": [\n    {\n      \"includes\": [\"**/*.vue\"],\n      \"linter\": {\n        \"rules\": {\n          \"correctness\": {\n            \"noUnusedImports\": \"off\",\n            \"noUnusedVariables\": \"off\"\n          }\n        }\n      }\n    },\n    {\n      \"includes\": [\"site/snippets/**\"],\n      \"linter\": {\n        \"rules\": {\n          \"correctness\": {\n            \"noUnusedImports\": \"off\"\n          }\n        }\n      }\n    },\n    {\n      \"includes\": [\"scripts/**/*.ts\"],\n      \"linter\": {\n        \"rules\": {\n          \"suspicious\": {\n            \"noConsole\": {\n              \"level\": \"off\",\n              \"options\": {\n                \"allow\": [\"log\"]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"includes\": [\"playgrounds/**\"],\n      \"linter\": {\n        \"rules\": {\n          \"style\": {\n            \"useNodejsImportProtocol\": \"off\"\n          }\n        }\n      }\n    }\n  ],\n  \"vcs\": {\n    \"enabled\": true,\n    \"clientKind\": \"git\",\n    \"useIgnoreFile\": true\n  }\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"workspace\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"build\": \"pnpm run --filter @wagmi/core --filter @wagmi/cli --filter create-wagmi build && pnpm run --filter @wagmi/connectors build && pnpm run --filter wagmi --filter @wagmi/solid --filter @wagmi/vue build\",\n    \"bench:types\": \"TYPES=true vitest bench-d.ts\",\n    \"changeset:prepublish\": \"pnpm clean && pnpm version:update && pnpm build && node scripts/formatPackageJson.ts && node scripts/generateProxyPackages.ts\",\n    \"changeset:publish\": \"pnpm changeset:prepublish && changeset publish\",\n    \"changeset:version\": \"changeset version && pnpm version:update && pnpm format\",\n    \"check\": \"biome check --write\",\n    \"check:repo\": \"sherif -i viem\",\n    \"check:types\": \"pnpm run --r --parallel check:types && tsc --noEmit\",\n    \"check:unused\": \"pnpm clean && knip\",\n    \"clean\": \"pnpm run --r --parallel clean && rm -rf packages/**/*.json.tmp\",\n    \"deps\": \"pnpx taze -r\",\n    \"deps:ci\": \"pnpx actions-up\",\n    \"dev\": \"pnpm dev:react\",\n    \"dev:cli\": \"pnpm --filter cli dev\",\n    \"dev:core\": \"pnpm --filter vite-core dev\",\n    \"dev:create-wagmi\": \"pnpm --filter create-wagmi dev\",\n    \"dev:next\": \"pnpm --filter next-app dev\",\n    \"dev:nuxt\": \"pnpm --filter nuxt-app dev\",\n    \"dev:react\": \"pnpm --filter vite-react dev\",\n    \"dev:solid\": \"pnpm --filter vite-solid dev\",\n    \"dev:solid-start\": \"pnpm --filter solid-start-app dev\",\n    \"dev:start\": \"pnpm --filter tanstack-start dev\",\n    \"dev:vue\": \"pnpm --filter vite-vue dev\",\n    \"docs:dev\": \"pnpm --filter site dev\",\n    \"format\": \"biome format --write\",\n    \"postinstall\": \"pnpm preconstruct\",\n    \"preconstruct\": \"node scripts/preconstruct.ts\",\n    \"preinstall\": \"pnpx only-allow pnpm\",\n    \"prepare\": \"pnpm simple-git-hooks\",\n    \"test\": \"vitest\",\n    \"test:build\": \"node scripts/generateProxyPackages.ts && pnpm run --r --parallel test:build\",\n    \"test:cov\": \"vitest run --coverage\",\n    \"test:update\": \"vitest --update\",\n    \"version:update\": \"node scripts/updateVersion.ts\",\n    \"version:update:viem\": \"node scripts/updateViemVersion.ts\"\n  },\n  \"devDependencies\": {\n    \"@arethetypeswrong/cli\": \"^0.16.4\",\n    \"@ark/attest\": \"^0.56.0\",\n    \"@biomejs/biome\": \"^2.2.4\",\n    \"@changesets/cli\": \"^3.0.0-next.0\",\n    \"@svitejs/changesets-changelog-github-compact\": \"^1.2.0\",\n    \"@types/node\": \"^24.5.1\",\n    \"@vitejs/plugin-react\": \"catalog:\",\n    \"@vitest/browser\": \"^4.0.16\",\n    \"@vitest/browser-playwright\": \"^4.0.16\",\n    \"@vitest/coverage-v8\": \"^4.0.16\",\n    \"@wagmi/test\": \"workspace:*\",\n    \"happy-dom\": \"^20.0.0\",\n    \"knip\": \"^5.69.0\",\n    \"playwright\": \"1.56.1\",\n    \"prool\": \"^0.2.3\",\n    \"publint\": \"^0.3.18\",\n    \"react\": \"catalog:\",\n    \"react-dom\": \"catalog:\",\n    \"sherif\": \"^1.0.0\",\n    \"simple-git-hooks\": \"^2.11.1\",\n    \"solid-js\": \"catalog:\",\n    \"testcontainers\": \"^11.13.0\",\n    \"typescript\": \"^5.9.3\",\n    \"viem\": \"2.47.5\",\n    \"vite-plugin-react-fallback-throttle\": \"^0.1.1\",\n    \"vite-plugin-solid\": \"catalog:\",\n    \"vitest\": \"^4.0.16\",\n    \"vitest-browser-react\": \"^2.0.2\"\n  },\n  \"packageManager\": \"pnpm@10.22.0\",\n  \"devEngines\": {\n    \"runtime\": {\n      \"name\": \"node\",\n      \"version\": \"^24.5.1\",\n      \"onFail\": \"download\"\n    }\n  },\n  \"simple-git-hooks\": {\n    \"pre-commit\": \"pnpm check\"\n  },\n  \"knip\": {\n    \"ignore\": [\n      \"**/templates/**\",\n      \"**/hardhat.config.js\",\n      \"packages/**/*.bench-d.ts\",\n      \"scripts/**\"\n    ],\n    \"ignoreWorkspaces\": [\n      \"packages/register-tests/**\",\n      \"packages/test\",\n      \"playgrounds/**\",\n      \"site/**\"\n    ],\n    \"workspaces\": {\n      \"packages/cli\": {\n        \"entry\": [\n          \"src/cli.ts!\",\n          \"src/exports/{config,index,plugins}.ts!\",\n          \"types/*.d.ts!\"\n        ],\n        \"ignore\": [\n          \"test/{constants,setup,utils}.ts\"\n        ]\n      },\n      \"packages/connectors\": {\n        \"entry\": \"src/exports/index.ts!\",\n        \"ignoreDependencies\": [\n          \"@base-org/account\",\n          \"@coinbase/wallet-sdk\",\n          \"@metamask/connect-evm\",\n          \"@safe-global/safe-apps-provider\",\n          \"@safe-global/safe-apps-sdk\",\n          \"@wagmi/core\",\n          \"@walletconnect/ethereum-provider\",\n          \"porto\"\n        ]\n      },\n      \"packages/core\": {\n        \"entry\": \"src/exports/{actions,chains,codegen,experimental,index,internal,query,tempo}.ts!\",\n        \"ignore\": [\n          \"test/setup.ts\"\n        ],\n        \"ignoreDependencies\": [\n          \"@tanstack/query-core\",\n          \"ox\"\n        ]\n      },\n      \"packages/create-wagmi\": {\n        \"entry\": \"src/cli.ts!\"\n      },\n      \"packages/react\": {\n        \"entry\": [\n          \"src/exports/{actions,chains,codegen,connectors,experimental,index,query,tempo}.ts!\",\n          \"src/exports/actions/experimental.ts!\"\n        ],\n        \"ignore\": [\n          \"test/setup.ts\"\n        ]\n      },\n      \"packages/test\": {\n        \"entry\": [\n          \"src/setup.ts!\",\n          \"src/setup.global.ts!\",\n          \"src/setup.global.types.ts!\",\n          \"src/exports/{index,react,tempo}.ts!\",\n          \"src/tempo/setup.ts!\",\n          \"src/tempo/setup.global.ts!\"\n        ]\n      },\n      \"packages/vue\": {\n        \"entry\": [\n          \"src/exports/{actions,chains,connectors,index,nuxt,query}.ts!\",\n          \"src/exports/actions/experimental.ts!\"\n        ],\n        \"ignore\": [\n          \"src/nuxt/runtime/*\",\n          \"test/setup.ts\"\n        ],\n        \"ignoreDependencies\": [\n          \"nuxt\"\n        ]\n      },\n      \"packages/solid\": {\n        \"entry\": [\n          \"src/exports/{actions,chains,connectors,index,query}.ts!\",\n          \"src/exports/actions/experimental.ts!\"\n        ],\n        \"ignore\": [\n          \"test/setup.ts\"\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/cli/CHANGELOG.md",
    "content": "# @wagmi/cli\n\n## 2.10.0\n\n### Minor Changes\n\n- **Breaking:** Removed `routescan` plugin (former sponsor). If you still need this plugin, vendor the [source code](https://github.com/wevm/wagmi/blob/ed2d473172e8d063f29400b8edcec33e5d21a659/packages/cli/src/plugins/routescan.ts) into your project directly. ([`9dbdd82`](https://github.com/wevm/wagmi/commit/9dbdd8277808eb361fe7fe01ea34e4c6bb85c7a5))\n\n## 2.9.0\n\n### Minor Changes\n\n- Added `includeBroadcasts` option to Foundry plugin to automatically populate deployments mapping from `run-latest.json` files in the `broadcast/` directory. ([#4908](https://github.com/wevm/wagmi/pull/4908))\n\n## 2.8.0\n\n### Minor Changes\n\n- Added option to React plugin to disable generating hooks for each function/event in ABI. ([#4866](https://github.com/wevm/wagmi/pull/4866))\n\n## 2.7.1\n\n### Patch Changes\n\n- Bumped chains for block explorer plugins. ([`ed2d473`](https://github.com/wevm/wagmi/commit/ed2d473172e8d063f29400b8edcec33e5d21a659))\n\n## 2.7.0\n\n### Minor Changes\n\n- Updated block explorer plugins supported chains. ([#4830](https://github.com/wevm/wagmi/pull/4830))\n\n## 2.6.0\n\n### Minor Changes\n\n- Bumped internal deps. ([#4808](https://github.com/wevm/wagmi/pull/4808))\n\n## 2.5.1\n\n### Patch Changes\n\n- [#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.\n\n## 2.5.0\n\n### Minor Changes\n\n- [`1edb09f7b69da3d7819d0e070e875e2c6fe8015d`](https://github.com/wevm/wagmi/commit/1edb09f7b69da3d7819d0e070e875e2c6fe8015d) Thanks [@tmm](https://github.com/tmm)! - Added testnets to `routescan` plugin\n\n## 2.4.0\n\n### Minor Changes\n\n- [#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.\n\n## 2.3.2\n\n### Patch Changes\n\n- [#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\n\n## 2.3.1\n\n### Patch Changes\n\n- [#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.\n\n## 2.3.0\n\n### Minor Changes\n\n- [#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\n\n## 2.2.1\n\n### Patch Changes\n\n- [`7b0dbe3886c1a7c6dbbdab945d7436ec20ad8f93`](https://github.com/wevm/wagmi/commit/7b0dbe3886c1a7c6dbbdab945d7436ec20ad8f93) Thanks [@tmm](https://github.com/tmm)! - Updated block explorer chains.\n\n## 2.2.0\n\n### Minor Changes\n\n- [#4503](https://github.com/wevm/wagmi/pull/4503) [`8fce8a6f97aa2ee5fd1bda6a3ece422b10324b5a`](https://github.com/wevm/wagmi/commit/8fce8a6f97aa2ee5fd1bda6a3ece422b10324b5a) Thanks [@tmm](https://github.com/tmm)! - Updated Etherscan Plugin to use Etherscan API v2.\n\n- [#4507](https://github.com/wevm/wagmi/pull/4507) [`6f09cc57935891e1c67d6df3459f6998985c69dc`](https://github.com/wevm/wagmi/commit/6f09cc57935891e1c67d6df3459f6998985c69dc) Thanks [@tmm](https://github.com/tmm)! - Added `tryFetchProxyImplementation` flag to Etherscan Plugin to enable fetching the implementation ABI instead of the proxy ABI.\n\n## 2.1.22\n\n### Patch Changes\n\n- [#4462](https://github.com/wevm/wagmi/pull/4462) [`0b2238d27cecbcd33aee64fb0e30ddc18b6ddf74`](https://github.com/wevm/wagmi/commit/0b2238d27cecbcd33aee64fb0e30ddc18b6ddf74) Thanks [@groninge01](https://github.com/groninge01)! - Added Sonic to Etherscan plugin.\n\n## 2.1.21\n\n### Patch Changes\n\n- [#4457](https://github.com/wevm/wagmi/pull/4457) [`21ec74da7f93fc13e253d7b35ddeddc23422a6c1`](https://github.com/wevm/wagmi/commit/21ec74da7f93fc13e253d7b35ddeddc23422a6c1) Thanks [@tmm](https://github.com/tmm)! - Removed internal dependency.\n\n## 2.1.20\n\n### Patch Changes\n\n- [#4450](https://github.com/wevm/wagmi/pull/4450) [`7b9a6bb35881b657a00bdd7ccd7edea32660f5bf`](https://github.com/wevm/wagmi/commit/7b9a6bb35881b657a00bdd7ccd7edea32660f5bf) Thanks [@tmm](https://github.com/tmm)! - Removed internal usage of `fs-extra`.\n\n## 2.1.19\n\n### Patch Changes\n\n- [#4449](https://github.com/wevm/wagmi/pull/4449) [`3fa5c238baa13d948e89974b0bb8530f8fa264fd`](https://github.com/wevm/wagmi/commit/3fa5c238baa13d948e89974b0bb8530f8fa264fd) Thanks [@tmm](https://github.com/tmm)! - Removed `ora` for `nanospinner`.\n\n## 2.1.18\n\n### Patch Changes\n\n- [#4399](https://github.com/wevm/wagmi/pull/4399) [`bc18673e4c272e3b60a1b6016934fe3fbeb6d93a`](https://github.com/wevm/wagmi/commit/bc18673e4c272e3b60a1b6016934fe3fbeb6d93a) Thanks [@tmm](https://github.com/tmm)! - Added Polygon Amoy to Sourcify and Etherscan plugins.\n\n## 2.1.17\n\n### Patch Changes\n\n- [#4370](https://github.com/wevm/wagmi/pull/4370) [`cb58b1ea3ad40e77210f24eb598f9d2306db998c`](https://github.com/wevm/wagmi/commit/cb58b1ea3ad40e77210f24eb598f9d2306db998c) Thanks [@talentlessguy](https://github.com/talentlessguy)! - Bumped internal dependencies.\n\n## 2.1.16\n\n### Patch Changes\n\n- [#4224](https://github.com/wevm/wagmi/pull/4224) [`b0eb89c2a0781bb3434996fa53ee7ceb3bb44db9`](https://github.com/wevm/wagmi/commit/b0eb89c2a0781bb3434996fa53ee7ceb3bb44db9) Thanks [@roderik](https://github.com/roderik)! - Fixed package detection for Bun.\n\n## 2.1.15\n\n### Patch Changes\n\n- [`0bb8b562ae04ecfeb2d6b2f1b980ebae31dc127e`](https://github.com/wevm/wagmi/commit/0bb8b562ae04ecfeb2d6b2f1b980ebae31dc127e) Thanks [@tmm](https://github.com/tmm)! - Improved TypeScript `'exactOptionalPropertyTypes'` support.\n\n## 2.1.14\n\n### Patch Changes\n\n- [#4120](https://github.com/wevm/wagmi/pull/4120) [`59407bf1276a46e6f1f22a370dde71c92524cd0f`](https://github.com/wevm/wagmi/commit/59407bf1276a46e6f1f22a370dde71c92524cd0f) Thanks [@tmm](https://github.com/tmm)! - Fixed an issue where the Foundry and Hardhat plugins' `exclude` option was ignored.\n\n## 2.1.13\n\n### Patch Changes\n\n- [`7264d1f450727f6ba0cbea8aa1c7a83e22a5bf20`](https://github.com/wevm/wagmi/commit/7264d1f450727f6ba0cbea8aa1c7a83e22a5bf20) Thanks [@tmm](https://github.com/tmm)! - Fixed generate not exiting for long-running processes.\n\n## 2.1.12\n\n### Patch Changes\n\n- [`ac038b29623ccb0d2fee40d9f943c8df28138dac`](https://github.com/wevm/wagmi/commit/ac038b29623ccb0d2fee40d9f943c8df28138dac) Thanks [@tmm](https://github.com/tmm)! - Updated Foundry default excludes.\n\n## 2.1.11\n\n### Patch Changes\n\n- [#4084](https://github.com/wevm/wagmi/pull/4084) [`b54203bf8fa911e6f14b9675980cf38fb95d7d3e`](https://github.com/wevm/wagmi/commit/b54203bf8fa911e6f14b9675980cf38fb95d7d3e) Thanks [@tmm](https://github.com/tmm)! - Reduced internal dependencies.\n\n## 2.1.10\n\n### Patch Changes\n\n- [#4051](https://github.com/wevm/wagmi/pull/4051) [`275e78b0e585f0ec9da2f9661ce9990aed18e9f4`](https://github.com/wevm/wagmi/commit/275e78b0e585f0ec9da2f9661ce9990aed18e9f4) Thanks [@tmm](https://github.com/tmm)! - Updated Sourcify plugin internals.\n\n## 2.1.9\n\n### Patch Changes\n\n- [`f9346dbcffaf57a8949cb96e43df111a89d733b1`](https://github.com/wevm/wagmi/commit/f9346dbcffaf57a8949cb96e43df111a89d733b1) Thanks [@tmm](https://github.com/tmm)! - Updated Foundry plugin default excludes.\n\n## 2.1.8\n\n### Patch Changes\n\n- [#3957](https://github.com/wevm/wagmi/pull/3957) [`7d00680f73b090eb34af928ae74277bec1973953`](https://github.com/wevm/wagmi/commit/7d00680f73b090eb34af928ae74277bec1973953) Thanks [@cstoneham](https://github.com/cstoneham)! - Added Blast to Etherscan plugin\n\n## 2.1.7\n\n### Patch Changes\n\n- [`1122678bbad0232590bd4060a73752de2c84982d`](https://github.com/wevm/wagmi/commit/1122678bbad0232590bd4060a73752de2c84982d) Thanks [@tmm](https://github.com/tmm)! - Published unpublished changes in [#3756](https://github.com/wevm/wagmi/pull/3756).\n\n## 2.1.6\n\n### Patch Changes\n\n- [#3756](https://github.com/wevm/wagmi/pull/3756) [`c7d6f467`](https://github.com/wevm/wagmi/commit/c7d6f4679125fd2f6cca5b5ef362abf47e37f934) Thanks [@jrfrantz](https://github.com/jrfrantz)! - Added basescan to etherscan cli plugin\n\n## 2.1.5\n\n### Patch Changes\n\n- [`e1ca4e63`](https://github.com/wevm/wagmi/commit/e1ca4e637ae6cec7f5902b0a2c0e0efc3b751a1d) Thanks [@tmm](https://github.com/tmm)! - Added title to CLI process.\n\n- [#3723](https://github.com/wevm/wagmi/pull/3723) [`d6bc98ca`](https://github.com/wevm/wagmi/commit/d6bc98ca0ce9081f192f62e0b0fcfea3cb07a2bb) Thanks [@leecobaby](https://github.com/leecobaby)! - Broadened TypeScript detection.\n\n## 2.1.4\n\n### Patch Changes\n\n- [#3737](https://github.com/wevm/wagmi/pull/3737) [`11020fed`](https://github.com/wevm/wagmi/commit/11020fedfc68639eace241e328331cff43bf91af) Thanks [@oskarvu](https://github.com/oskarvu)! - Added Gnosis to Etherscan plugin.\n\n## 2.1.3\n\n### Patch Changes\n\n- [#3660](https://github.com/wevm/wagmi/pull/3660) [`11a22a23`](https://github.com/wevm/wagmi/commit/11a22a23d88c025cde9c91610e9ddf62cd4fa650) Thanks [@JazzBashara](https://github.com/JazzBashara)! - Replaced SnowTrace with SnowScan for the Etherscan plugin\n\n## 2.1.2\n\n### Patch Changes\n\n- [#3641](https://github.com/wevm/wagmi/pull/3641) [`0a866403`](https://github.com/wevm/wagmi/commit/0a866403182ea6b8ba7f976c45be294e48fb7de8) Thanks [@cmwhited](https://github.com/cmwhited)! - Added Arbitrum Sepolia testnet to Etherscan plugin\n\n- [#3633](https://github.com/wevm/wagmi/pull/3633) [`a1d3d1ab`](https://github.com/wevm/wagmi/commit/a1d3d1ab2b023c61c0dbb5d7bf867a9fca673630) Thanks [@pegahcarter](https://github.com/pegahcarter)! - Added Fraxtal to Etherscan plugin\n\n- [#3616](https://github.com/wevm/wagmi/pull/3616) [`2a9f4473`](https://github.com/wevm/wagmi/commit/2a9f4473adc5bcdddf388389387ed5459583769e) Thanks [@petermazzocco](https://github.com/petermazzocco)! - Added Holesky Testnet to Etherscan Plugin\n\n## 2.1.1\n\n### Patch Changes\n\n- [#3579](https://github.com/wevm/wagmi/pull/3579) [`a057919c`](https://github.com/wevm/wagmi/commit/a057919ca3942adeed90af2e343403dc5274e84c) Thanks [@FaisalAli19](https://github.com/FaisalAli19)! - Added Optimism Sepolia Etherscan support\n\n## 2.1.0\n\n### Minor Changes\n\n- [#3506](https://github.com/wevm/wagmi/pull/3506) [`134eb4a1`](https://github.com/wevm/wagmi/commit/134eb4a1e0e29aab87bd5c7cdf05b06dfd7c4fc4) Thanks [@vmaark](https://github.com/vmaark)! - Added resolution of TypeScript Wagmi CLI config to determine if TypeScript generated output is allowed.\n\n## 2.0.4\n\n### Patch Changes\n\n- [#3462](https://github.com/wevm/wagmi/pull/3462) [`d25573ea`](https://github.com/wevm/wagmi/commit/d25573ea03358f967953e37c176b220a7b341769) Thanks [@cruzdanilo](https://github.com/cruzdanilo)! - Upgraded dependencies\n\n## 2.0.3\n\n### Patch Changes\n\n- [#3410](https://github.com/wevm/wagmi/pull/3410) [`55e31c3e`](https://github.com/wevm/wagmi/commit/55e31c3e96c2cbd1d9eb44e5a89f4365489c8310) Thanks [@o-az](https://github.com/o-az)! - Fixed actions plugin issue where `functionName` was used instead of `eventName` for generated contract event actions.\n\n## 2.0.2\n\n### Patch Changes\n\n- [#3371](https://github.com/wevm/wagmi/pull/3371) [`8294d9e5`](https://github.com/wevm/wagmi/commit/8294d9e5b358018ba869b2018cd7ed95462e021f) Thanks [@iceanddust](https://github.com/iceanddust)! - Fixed prop name when generating contract event watch hooks\n\n## 2.0.1\n\n### Major Changes\n\n- [#3333](https://github.com/wevm/wagmi/pull/3333) [`b3a0baaa`](https://github.com/wevm/wagmi/commit/b3a0baaaee7decf750d376aab2502cd33ca4825a) Thanks [@tmm](https://github.com/tmm)! - Wagmi CLI 2.0.\n\n  [Breaking Changes & Migration Guide](https://wagmi.sh/cli/guides/migrate-from-v1-to-v2)\n\n## 1.5.2\n\n### Patch Changes\n\n- [#3051](https://github.com/wagmi-dev/wagmi/pull/3051) [`4704d351`](https://github.com/wagmi-dev/wagmi/commit/4704d351164d39704a4e375c06525554fcc8340e) Thanks [@oxSaturn](https://github.com/oxSaturn)! - Fixed ESM require issue for prettier\n\n## 1.5.1\n\n### Patch Changes\n\n- [#3035](https://github.com/wagmi-dev/wagmi/pull/3035) [`187bf96c`](https://github.com/wagmi-dev/wagmi/commit/187bf96c9fd31675b9d17a7cb4d4e24eea3fa777) Thanks [@cruzdanilo](https://github.com/cruzdanilo)! - ignore foundry invariant lib\n\n## 1.5.0\n\n### Minor Changes\n\n- [#2956](https://github.com/wevm/wagmi/pull/2956) [`2abeb285`](https://github.com/wevm/wagmi/commit/2abeb285674af3e539cc2550b1f5027b1eb0c895) Thanks [@tmm](https://github.com/tmm)! - Replaced `@wagmi/chains` with `viem/chains`.\n\n## 1.4.1\n\n### Patch Changes\n\n- [#2962](https://github.com/wevm/wagmi/pull/2962) [`8ac5b572`](https://github.com/wevm/wagmi/commit/8ac5b57254f77eeb0e07dd83f7d49f396d4581d8) Thanks [@tmm](https://github.com/tmm)! - Fixed esbuild version\n\n## 1.4.0\n\n### Minor Changes\n\n- [#2946](https://github.com/wevm/wagmi/pull/2946) [`1c3228bf`](https://github.com/wevm/wagmi/commit/1c3228bf3fe99b0900b2c9a223c9b81c70bdcd90) Thanks [@tomquirk](https://github.com/tomquirk)! - Added default chain ID to generated `useContractRead` hook.\n\n### Patch Changes\n\n- [#2547](https://github.com/wevm/wagmi/pull/2547) [`8c3889fe`](https://github.com/wevm/wagmi/commit/8c3889fe82c5a1ddb29e74e3863ea6f4917b777a) Thanks [@Iamshankhadeep](https://github.com/Iamshankhadeep)! - Deterministic CLI output\n\n- [#2958](https://github.com/wevm/wagmi/pull/2958) [`b31f36d5`](https://github.com/wevm/wagmi/commit/b31f36d522a634f53d44349d6a9ea47f59d84d7a) Thanks [@tmm](https://github.com/tmm)! - Removed generated file header\n\n- [#2960](https://github.com/wevm/wagmi/pull/2960) [`5d4c4592`](https://github.com/wevm/wagmi/commit/5d4c4592009568cd0b096906a424f27469721a42) Thanks [@tmm](https://github.com/tmm)! - Updated esbuild version\n\n## 1.3.0\n\n### Minor Changes\n\n- [#2616](https://github.com/wevm/wagmi/pull/2616) [`c282a8f7`](https://github.com/wevm/wagmi/commit/c282a8f786d57fec77c931fe99dc20220e843bc8) Thanks [@portdeveloper](https://github.com/portdeveloper)! - Added sepolia chain id\n\n## 1.2.1\n\n### Patch Changes\n\n- [#2607](https://github.com/wevm/wagmi/pull/2607) [`79335b4c`](https://github.com/wevm/wagmi/commit/79335b4c0fcd5e8152a2a1d28314c634db9d9cbf) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed opitmism goerli chain id\n\n## 1.2.0\n\n### Minor Changes\n\n- [#2536](https://github.com/wevm/wagmi/pull/2536) [`85e9760a`](https://github.com/wevm/wagmi/commit/85e9760a140cb169ac6236d9466b96e2105dd193) Thanks [@tmm](https://github.com/tmm)! - Changed `Address` type import from ABIType to viem.\n\n## 1.1.0\n\n### Minor Changes\n\n- [#2482](https://github.com/wevm/wagmi/pull/2482) [`8764b54a`](https://github.com/wevm/wagmi/commit/8764b54aab68020063946112e8fe52aff650c99c) Thanks [@tmm](https://github.com/tmm)! - Bumped minimum TypeScript version to v5.0.4.\n\n### Patch Changes\n\n- [#2484](https://github.com/wevm/wagmi/pull/2484) [`3adf1f4f`](https://github.com/wevm/wagmi/commit/3adf1f4feab863cb7b5d52c81ad46f7e4eb56f09) Thanks [@jxom](https://github.com/jxom)! - Updated `abitype` to 0.8.7\n\n- [#2484](https://github.com/wevm/wagmi/pull/2484) [`3adf1f4f`](https://github.com/wevm/wagmi/commit/3adf1f4feab863cb7b5d52c81ad46f7e4eb56f09) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n## 1.0.3\n\n### Patch Changes\n\n- [#2441](https://github.com/wevm/wagmi/pull/2441) [`326edee4`](https://github.com/wevm/wagmi/commit/326edee4bc85db84a7a4e3768e33785849ab8d8e) Thanks [@tmm](https://github.com/tmm)! - Fixed internal type issue\n\n## 1.0.2\n\n### Patch Changes\n\n- [#2430](https://github.com/wevm/wagmi/pull/2430) [`71d92029`](https://github.com/wevm/wagmi/commit/71d92029ee4344842cd41698858a330fee95b6e0) Thanks [@tmm](https://github.com/tmm)! - Added message when command is not found.\n\n## 1.0.1\n\n### Patch Changes\n\n- [`ea651cd7`](https://github.com/wevm/wagmi/commit/ea651cd7fc75b7866272605467db11fd6e1d81af) Thanks [@jxom](https://github.com/jxom)! - Downgraded abitype.\n\n## 1.0.0\n\n### Major Changes\n\n- [#2235](https://github.com/wevm/wagmi/pull/2235) [`5be0655c`](https://github.com/wevm/wagmi/commit/5be0655c8e48b25d38009022461fbf611af54349) Thanks [@jxom](https://github.com/jxom)! - Released v1. Read [Migration Guide](https://next.wagmi.sh/react/migration-guide#1xx-breaking-changes).\n\n## 1.0.0-next.7\n\n### Patch Changes\n\n- Fixed react plugin generic.\n\n## 1.0.0-next.6\n\n### Major Changes\n\n- Updated references.\n\n## 1.0.0-next.5\n\n### Major Changes\n\n- Added `config.setConnectors`\n\n## 1.0.0-next.4\n\n### Major Changes\n\n- Updated viem.\n  Removed `goerli` export from main entrypoint.\n\n## 1.0.0-next.3\n\n### Major Changes\n\n- Updated references.\n\n## 1.0.0-next.2\n\n### Major Changes\n\n- Updated dependencies\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/chains@1.0.0-next.0\n\n## 1.0.0-next.1\n\n### Major Changes\n\n- updated viem\n\n## 1.0.0-next.0\n\n### Major Changes\n\n- [`a7dda00c`](https://github.com/wevm/wagmi/commit/a7dda00c5b546f8b2c42b527e4d9ac1b9e9ab1fb) Thanks [@jxom](https://github.com/jxom)! - Released v1.\n\n### Patch Changes\n\n- Updated dependencies [[`a7dda00c`](https://github.com/wevm/wagmi/commit/a7dda00c5b546f8b2c42b527e4d9ac1b9e9ab1fb)]:\n  - @wagmi/core@1.0.0-next.0\n  - wagmi@1.0.0-next.0\n\n## 0.1.15\n\n### Patch Changes\n\n- [#2145](https://github.com/wevm/wagmi/pull/2145) [`2520743c`](https://github.com/wevm/wagmi/commit/2520743c417a158a00d5edca13a9aa92cefb0cfd) Thanks [@tmm](https://github.com/tmm)! - Fixed issue using Hardhat Plugin with npm.\n\n## 0.1.14\n\n### Patch Changes\n\n- [#2039](https://github.com/wevm/wagmi/pull/2039) [`bac893ab`](https://github.com/wevm/wagmi/commit/bac893ab26012d4d8741c4f80e8b8813aee26f0c) Thanks [@tmm](https://github.com/tmm)! - Updated references.\n\n- [#2039](https://github.com/wevm/wagmi/pull/2039) [`bac893ab`](https://github.com/wevm/wagmi/commit/bac893ab26012d4d8741c4f80e8b8813aee26f0c) Thanks [@tmm](https://github.com/tmm)! - Fixed Actions plugin `overridePackageName` option.\n\n## 0.1.13\n\n### Patch Changes\n\n- [#2000](https://github.com/wevm/wagmi/pull/2000) [`01254765`](https://github.com/wevm/wagmi/commit/01254765eb37b77aca26500c00c721f08a260912) Thanks [@tmm](https://github.com/tmm)! - Fixed React plugin name conflict.\n\n## 0.1.12\n\n### Patch Changes\n\n- [#1992](https://github.com/wevm/wagmi/pull/1992) [`efc93cad`](https://github.com/wevm/wagmi/commit/efc93cadacdb9c9960644dabe4ae837d384df52b) Thanks [@tmm](https://github.com/tmm)! - Refactored internals from ethers to viem.\n\n## 0.1.11\n\n### Patch Changes\n\n- [#1916](https://github.com/wevm/wagmi/pull/1916) [`950490fd`](https://github.com/wevm/wagmi/commit/950490fd132b3fb5b3455e77b58d70f134b8e5c9) Thanks [@technophile-04](https://github.com/technophile-04)! - Updated React plugin to use `Address` type instead of hardcoding `` `0x{string}` ``.\n\n## 0.1.10\n\n### Patch Changes\n\n- [#1892](https://github.com/wevm/wagmi/pull/1892) [`d3d6973b`](https://github.com/wevm/wagmi/commit/d3d6973ba9407e490140d2434eb83aad88d6e10d) Thanks [@greg-schrammel](https://github.com/greg-schrammel)! - Fixed generated read hooks `select` type.\n\n## 0.1.9\n\n### Patch Changes\n\n- [#1886](https://github.com/wevm/wagmi/pull/1886) [`36e119c6`](https://github.com/wevm/wagmi/commit/36e119c6d4bc28a7ae15c9602d0c613bc9681356) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed package detection for yarn^3\n\n## 0.1.8\n\n### Patch Changes\n\n- [#1884](https://github.com/wevm/wagmi/pull/1884) [`cc03bb44`](https://github.com/wevm/wagmi/commit/cc03bb44268874f95203de67f6d32586e34c0857) Thanks [@roninjin10](https://github.com/roninjin10)! - Added better compatibility for yarn@^3 in `@wagmi/cli`.\n\n## 0.1.7\n\n### Patch Changes\n\n- [#1841](https://github.com/wevm/wagmi/pull/1841) [`cb707f01`](https://github.com/wevm/wagmi/commit/cb707f01cbdcc62a70cf5c8a162d77948d6b6a56) Thanks [@tmm](https://github.com/tmm)! - Added [Sourcify](https://sourcify.dev) CLI plugin.\n\n## 0.1.6\n\n### Patch Changes\n\n- [#1803](https://github.com/wevm/wagmi/pull/1803) [`09b13538`](https://github.com/wevm/wagmi/commit/09b13538abcde879034293cae39551c30cc81445) Thanks [@shotaronowhere](https://github.com/shotaronowhere)! - Swapped deprecated Arbitrum Rinkeby for Arbitrum Goerli URL for Etherscan Plugin.\n\n## 0.1.5\n\n### Patch Changes\n\n- [#1788](https://github.com/wevm/wagmi/pull/1788) [`c3e16d82`](https://github.com/wevm/wagmi/commit/c3e16d82c9c39b8b1c2f3c51037e11d642a20cd6) Thanks [@tmm](https://github.com/tmm)! - Fixed CLI import\n\n## 0.1.4\n\n### Patch Changes\n\n- [#1779](https://github.com/wevm/wagmi/pull/1779) [`97346750`](https://github.com/wevm/wagmi/commit/973467505dc2bb46198a3e9fe6072306170d24c0) Thanks [@tmm](https://github.com/tmm)! - Made `project` optional for Foundry plugin\n\n## 0.1.3\n\n### Patch Changes\n\n- [#1754](https://github.com/wevm/wagmi/pull/1754) [`298728b5`](https://github.com/wevm/wagmi/commit/298728b5918fa15b6b5b082597204a268d4b01f1) Thanks [@tmm](https://github.com/tmm)! - Updated project resolution for Foundry and Hardhat plugins.\n\n- [#1738](https://github.com/wevm/wagmi/pull/1738) [`37c221d0`](https://github.com/wevm/wagmi/commit/37c221d0f4d175084e23a6b172d72f177bfa0c81) Thanks [@roninjin10](https://github.com/roninjin10)! - Added automatic Foundry config detection for artifacts directory.\n\n## 0.1.2\n\n### Patch Changes\n\n- [#1743](https://github.com/wevm/wagmi/pull/1743) [`379315fa`](https://github.com/wevm/wagmi/commit/379315fa359c3118b5d200ec50db3812b0cdd984) Thanks [@kyscott18](https://github.com/kyscott18)! - Add celoscan to `etherscan` plugin\n\n## 0.1.1\n\n### Patch Changes\n\n- [#1736](https://github.com/wevm/wagmi/pull/1736) [`7c43e431`](https://github.com/wevm/wagmi/commit/7c43e431e2eb970610cc6490cee6a4093655a683) Thanks [@tmm](https://github.com/tmm)! - Fixed generated address object key type.\n\n## 0.1.0\n\n### Minor Changes\n\n- [#1732](https://github.com/wevm/wagmi/pull/1732) [`01e21897`](https://github.com/wevm/wagmi/commit/01e2189747a5c22dc758c6d719b4145adc2a643c) Thanks [@tmm](https://github.com/tmm)! - Initial release\n"
  },
  {
    "path": "packages/cli/README.md",
    "content": "# @wagmi/cli\n\nManage and generate code from Ethereum ABIs\n\n## Installation\n\n```bash\npnpm add @wagmi/cli\n```\n\n## Documentation\n\nFor documentation and guides, visit [wagmi.sh](https://wagmi.sh).\n"
  },
  {
    "path": "packages/cli/package.json",
    "content": "{\n  \"name\": \"@wagmi/cli\",\n  \"description\": \"Manage and generate code from Ethereum ABIs\",\n  \"version\": \"2.10.0\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/wevm/wagmi.git\",\n    \"directory\": \"packages/cli\"\n  },\n  \"scripts\": {\n    \"build\": \"pnpm run build:esm+types\",\n    \"build:esm+types\": \"tsc --project tsconfig.build.json --outDir ./dist/esm --declaration --declarationMap --declarationDir ./dist/types\",\n    \"check:types\": \"tsc --noEmit\",\n    \"clean\": \"rm -rf dist tsconfig.tsbuildinfo config plugins\",\n    \"dev\": \"bun src/cli.ts\",\n    \"test:build\": \"publint --strict && attw --pack --ignore-rules cjs-resolves-to-esm\"\n  },\n  \"files\": [\n    \"dist/**\",\n    \"!dist/**/*.tsbuildinfo\",\n    \"src/**/*.ts\",\n    \"!src/**/*.test.ts\",\n    \"!src/**/*.test-d.ts\",\n    \"/config\",\n    \"/plugins\"\n  ],\n  \"bin\": {\n    \"wagmi\": \"./dist/esm/cli.js\"\n  },\n  \"sideEffects\": false,\n  \"type\": \"module\",\n  \"main\": \"./dist/esm/exports/index.js\",\n  \"types\": \"./dist/types/exports/index.d.ts\",\n  \"typings\": \"./dist/types/exports/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/types/exports/index.d.ts\",\n      \"default\": \"./dist/esm/exports/index.js\"\n    },\n    \"./config\": {\n      \"types\": \"./dist/types/exports/config.d.ts\",\n      \"default\": \"./dist/esm/exports/config.js\"\n    },\n    \"./plugins\": {\n      \"types\": \"./dist/types/exports/plugins.d.ts\",\n      \"default\": \"./dist/esm/exports/plugins.js\"\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"typesVersions\": {\n    \"*\": {\n      \"config\": [\n        \"./dist/types/exports/config.d.ts\"\n      ],\n      \"plugins\": [\n        \"./dist/types/exports/plugins.d.ts\"\n      ]\n    }\n  },\n  \"peerDependencies\": {\n    \"typescript\": \">=5.7.3\"\n  },\n  \"peerDependenciesMeta\": {\n    \"typescript\": {\n      \"optional\": true\n    }\n  },\n  \"dependencies\": {\n    \"abitype\": \"^1.1.1\",\n    \"bundle-require\": \"^5.1.0\",\n    \"cac\": \"^6.7.14\",\n    \"change-case\": \"^5.4.4\",\n    \"chokidar\": \"4.0.1\",\n    \"dedent\": \"^0.7.0\",\n    \"dotenv\": \"^16.3.1\",\n    \"dotenv-expand\": \"^10.0.0\",\n    \"esbuild\": \"~0.25.4\",\n    \"escalade\": \"3.2.0\",\n    \"fdir\": \"^6.1.1\",\n    \"nanospinner\": \"1.2.2\",\n    \"pathe\": \"^1.1.2\",\n    \"picocolors\": \"^1.0.0\",\n    \"picomatch\": \"^3.0.0\",\n    \"prettier\": \"^3.0.3\",\n    \"viem\": \"2.x\",\n    \"zod\": \"^4.1.11\"\n  },\n  \"devDependencies\": {\n    \"@types/dedent\": \"^0.7.2\",\n    \"@types/node\": \"^24.5.1\",\n    \"fixturez\": \"^1.1.0\",\n    \"msw\": \"^2.4.9\"\n  },\n  \"contributors\": [\n    \"awkweb.eth <t@wevm.dev>\",\n    \"jxom.eth <j@wevm.dev>\"\n  ],\n  \"funding\": \"https://github.com/sponsors/wevm\",\n  \"keywords\": [\n    \"wagmi\",\n    \"eth\",\n    \"ethereum\",\n    \"dapps\",\n    \"wallet\",\n    \"web3\",\n    \"cli\"\n  ]\n}\n"
  },
  {
    "path": "packages/cli/src/cli.ts",
    "content": "#!/usr/bin/env node\nimport { cac } from 'cac'\n\nimport { type Generate, generate } from './commands/generate.js'\nimport { type Init, init } from './commands/init.js'\nimport * as logger from './logger.js'\nimport { version } from './version.js'\n\nconst cli = cac('wagmi')\n\ncli\n  .command('generate', 'generate code based on configuration')\n  .option('-c, --config <path>', '[string] path to config file')\n  .option('-r, --root <path>', '[string] root path to resolve config from')\n  .option('-w, --watch', '[boolean] watch for changes')\n  .example((name) => `${name} generate`)\n  .action(async (options: Generate) => {\n    await generate(options)\n    if (!options.watch) process.exit(0)\n  })\n\ncli\n  .command('init', 'create configuration file')\n  .option('-c, --config <path>', '[string] path to config file')\n  .option('-r, --root <path>', '[string] root path to resolve config from')\n  .example((name) => `${name} init`)\n  .action(async (options: Init) => {\n    await init(options)\n    process.exit(0)\n  })\n\ncli.help()\ncli.version(version)\n\nvoid (async () => {\n  try {\n    process.title = 'node (wagmi)'\n  } catch {}\n\n  try {\n    // Parse CLI args without running command\n    cli.parse(process.argv, { run: false })\n    if (!cli.matchedCommand) {\n      if (cli.args.length === 0) {\n        if (!cli.options.help && !cli.options.version) cli.outputHelp()\n      } else throw new Error(`Unknown command: ${cli.args.join(' ')}`)\n    }\n    await cli.runMatchedCommand()\n  } catch (error) {\n    logger.error(`\\n${(error as Error).message}`)\n    process.exit(1)\n  }\n})()\n"
  },
  {
    "path": "packages/cli/src/commands/generate.test.ts",
    "content": "import { readFile } from 'node:fs/promises'\nimport dedent from 'dedent'\nimport { resolve } from 'pathe'\nimport { afterEach, beforeEach, expect, test, vi } from 'vitest'\n\nimport { createFixture, typecheck, watchConsole } from '../../test/utils.js'\nimport { generate } from './generate.js'\n\nlet console: ReturnType<typeof watchConsole>\nbeforeEach(() => {\n  console = watchConsole()\n  vi.useFakeTimers()\n\n  const date = new Date(2023, 0, 30, 12)\n  vi.setSystemTime(date)\n})\n\nafterEach(() => {\n  vi.restoreAllMocks()\n  vi.useRealTimers()\n})\n\ntest('generates output', async () => {\n  const { dir } = await createFixture({\n    files: {\n      tsconfig: true,\n      'wagmi.config.js': dedent`\n          export default {\n            out: 'generated.js',\n            contracts: [\n              {\n                abi: [],\n                name: 'Foo',\n              },\n            ],\n          }\n        `,\n    },\n  })\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  await generate()\n\n  expect(console.formatted).toMatchInlineSnapshot(`\n    \"- Validating plugins\n    √ Validating plugins\n    - Resolving contracts\n    √ Resolving contracts\n    - Running plugins\n    √ Running plugins\n    - Writing to generated.js\n    √ Writing to generated.js\"\n  `)\n})\n\ntest('generates typescript output', async () => {\n  const { dir, paths } = await createFixture({\n    files: {\n      tsconfig: true,\n      'wagmi.config.ts': dedent`\n          export default {\n            out: 'generated.ts',\n            contracts: [\n              {\n                abi: [],\n                name: 'Foo',\n              },\n            ],\n          }\n        `,\n    },\n  })\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  await generate()\n\n  expect(console.formatted).toMatchInlineSnapshot(`\n    \"- Validating plugins\n    √ Validating plugins\n    - Resolving contracts\n    √ Resolving contracts\n    - Running plugins\n    √ Running plugins\n    - Writing to generated.ts\n    √ Writing to generated.ts\"\n  `)\n  await expect(typecheck(paths.tsconfig)).resolves.toMatchInlineSnapshot('\"\"')\n})\n\ntest('generates output with plugin', async () => {\n  const { dir } = await createFixture({\n    files: {\n      tsconfig: true,\n      'wagmi.config.ts': dedent`\n          export default {\n            out: 'generated.ts',\n            contracts: [\n              {\n                abi: [],\n                name: 'Foo',\n              },\n            ],\n            plugins: [\n              {\n                name: 'Test',\n                async run({ contracts, isTypeScript, outputs }) {\n                  return {\n                    imports: '/* imports test */',\n                    prepend: '/* prepend test */',\n                    content: '/* content test */',\n                  }\n                },\n              },\n            ],\n          }\n        `,\n    },\n  })\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  await generate()\n\n  expect(console.formatted).toMatchInlineSnapshot(`\n    \"- Validating plugins\n    √ Validating plugins\n    - Resolving contracts\n    √ Resolving contracts\n    - Running plugins\n    √ Running plugins\n    - Writing to generated.ts\n    √ Writing to generated.ts\"\n  `)\n  /* eslint-disable no-irregular-whitespace */\n  await expect(\n    readFile(resolve(dir, 'generated.ts'), 'utf8'),\n  ).resolves.toMatchInlineSnapshot(`\n      \"/* imports test */\n\n      /* prepend test */\n\n      //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n      // Foo\n      //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n      export const fooAbi = [] as const\n\n      //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n      // Test\n      //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n      /* content test */\n      \"\n    `)\n  /* eslint-enable no-irregular-whitespace */\n})\n\ntest('behavior: invalid cli options', async () => {\n  const { dir } = await createFixture()\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  await expect(\n    generate({\n      // @ts-expect-error possible to pass untyped options through from cli\n      config: 1,\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [Error: Invalid option\n    - Invalid input: expected string, received number at \\`config\\`]\n  `)\n})\n\ntest('behavior: config not found', async () => {\n  const { dir } = await createFixture()\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  await expect(generate()).rejects.toThrowErrorMatchingInlineSnapshot(\n    '[Error: Config not found]',\n  )\n})\n\ntest('behavior: config not found for path', async () => {\n  const { dir } = await createFixture()\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  try {\n    await generate({ config: 'wagmi.config.js' })\n  } catch (error) {\n    expect(\n      (error as Error).message.replace(dir, 'path/to/project'),\n    ).toMatchInlineSnapshot('\"Config not found at wagmi.config.js\"')\n  }\n})\n\ntest('behavior: config out not unique', async () => {\n  const { dir } = await createFixture({\n    files: {\n      'wagmi.config.js': dedent`\n            export default [\n              {\n                out: 'generated.ts',\n                contracts: [\n                  {\n                    abi: [],\n                    name: 'Foo',\n                  },\n                ]\n              },\n              {\n                out: 'generated.ts',\n                contracts: [\n                  {\n                    abi: [],\n                    name: 'Foo',\n                  },\n                ],\n              },\n            ]\n          `,\n    },\n  })\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  await expect(generate()).rejects.toThrowErrorMatchingInlineSnapshot(\n    `[Error: out \"generated.ts\" must be unique.]`,\n  )\n})\n\ntest('behavior: config contract names not unique', async () => {\n  const { dir } = await createFixture({\n    files: {\n      'wagmi.config.js': dedent`\n            export default {\n              out: 'generated.ts',\n              contracts: [\n                {\n                  abi: [],\n                  name: 'Foo',\n                },\n                {\n                  abi: [],\n                  name: 'Foo',\n                },\n              ],\n            }\n          `,\n    },\n  })\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  await expect(generate()).rejects.toThrowErrorMatchingInlineSnapshot(\n    `[Error: Contract name \"Foo\" must be unique.]`,\n  )\n})\n\ntest('behavior: displays message if no contracts found', async () => {\n  const { dir } = await createFixture({\n    files: {\n      'wagmi.config.js': \"export default { out: 'generated.ts' }\",\n    },\n  })\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  await generate()\n\n  expect(console.formatted).toMatchInlineSnapshot(\n    `\n    \"- Validating plugins\n    √ Validating plugins\n    - Resolving contracts\n    × Resolving contracts\n    No contracts found.\"\n  `,\n  )\n})\n\ntest('behavior: throws when abi is invalid', async () => {\n  const { dir } = await createFixture({\n    files: {\n      'wagmi.config.js': dedent`\n              export default {\n                out: 'generated.ts',\n                contracts: [\n                  {\n                    abi: [{\n                      type: 'function',\n                      name: 'balanceOf',\n                      stateMutability: 'view',\n                      inputs: [{ type: 'address' }],\n                    }],\n                    name: 'Foo',\n                  },\n                ],\n              }\n            `,\n    },\n  })\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  await expect(generate()).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [Error: Invalid ABI for contract \"Foo\"\n    - Invalid input at \\`[0]\\`]\n  `)\n})\n\ntest('behavior: throws when address is invalid', async () => {\n  const { dir } = await createFixture({\n    files: {\n      'wagmi.config.js': dedent`\n              export default {\n                out: 'generated.ts',\n                contracts: [\n                  {\n                    abi: [],\n                    address: '0xfoo',\n                    name: 'Foo',\n                  },\n                ],\n              }\n            `,\n    },\n  })\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  await expect(generate()).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [Error: Invalid address for contract \"Foo\"\n    - Invalid input]\n  `)\n})\n\ntest('behavior: throws when multichain address is invalid', async () => {\n  const { dir } = await createFixture({\n    files: {\n      'wagmi.config.js': dedent`\n              export default {\n                out: 'generated.ts',\n                contracts: [\n                  {\n                    abi: [],\n                    address: {\n                      1: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n                      5: '0xfoo',\n                    },\n                    name: 'Foo',\n                  },\n                ],\n              }\n            `,\n    },\n  })\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  await expect(generate()).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [Error: Invalid address for contract \"Foo\"\n    - Invalid address at \\`5\\`]\n  `)\n})\n\ntest('behavior: displays message if using --watch flag without watchers configured', async () => {\n  const { dir } = await createFixture({\n    files: {\n      'wagmi.config.js': dedent`\n            export default {\n              out: 'generated.ts',\n              contracts: [\n                {\n                  abi: [],\n                  name: 'Foo',\n                },\n              ],\n            }\n          `,\n    },\n  })\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  await generate({ watch: true })\n\n  expect(console.formatted).toMatchInlineSnapshot(`\n    \"- Validating plugins\n    √ Validating plugins\n    - Resolving contracts\n    √ Resolving contracts\n    - Running plugins\n    √ Running plugins\n    - Writing to generated.ts\n    √ Writing to generated.ts\n    Used --watch flag, but no plugins are watching.\"\n  `)\n})\n\ntest.todo('behavior: save config file logs change')\ntest.todo('behavior: updates on add file')\ntest.todo('behavior: updates on change file')\ntest.todo('behavior: updates on unlink file')\ntest.todo('behavior: runs watch command')\ntest.todo('behavior: shuts down watch on SIGINT/SIGTERM')\n"
  },
  {
    "path": "packages/cli/src/commands/generate.ts",
    "content": "import { mkdir, writeFile } from 'node:fs/promises'\nimport { Abi as AbiSchema } from 'abitype/zod'\nimport { camelCase } from 'change-case'\nimport type { ChokidarOptions, FSWatcher } from 'chokidar'\nimport { watch } from 'chokidar'\nimport { default as dedent } from 'dedent'\nimport { basename, dirname, resolve } from 'pathe'\nimport pc from 'picocolors'\nimport { type Abi, type Address, getAddress } from 'viem'\nimport { z } from 'zod'\n\nimport type { Contract, ContractConfig, Plugin, Watch } from '../config.js'\nimport { fromZodError } from '../errors.js'\nimport * as logger from '../logger.js'\nimport { findConfig } from '../utils/findConfig.js'\nimport { format } from '../utils/format.js'\nimport { getAddressDocString } from '../utils/getAddressDocString.js'\nimport { getIsUsingTypeScript } from '../utils/getIsUsingTypeScript.js'\nimport { resolveConfig } from '../utils/resolveConfig.js'\n\nconst Generate = z.object({\n  /** Path to config file */\n  config: z.string().optional(),\n  /** Directory to search for config file */\n  root: z.string().optional(),\n  /** Watch for file system changes to config and plugins */\n  watch: z.boolean().optional(),\n})\nexport type Generate = z.infer<typeof Generate>\n\nexport async function generate(options: Generate = {}) {\n  // Validate command line options\n  try {\n    await Generate.parseAsync(options)\n  } catch (error) {\n    if (error instanceof z.ZodError)\n      throw fromZodError(error, { prefix: 'Invalid option' })\n    throw error\n  }\n\n  // Get cli config file\n  const configPath = await findConfig(options)\n  if (!configPath) {\n    if (options.config)\n      throw new Error(`Config not found at ${pc.gray(options.config)}`)\n    throw new Error('Config not found')\n  }\n\n  const resolvedConfigs = await resolveConfig({ configPath })\n  const isTypeScript = await getIsUsingTypeScript()\n\n  type Watcher = FSWatcher & { config?: Watch }\n  const watchers: Watcher[] = []\n  const watchWriteDelay = 100\n  const watchOptions = {\n    atomic: true,\n    // awaitWriteFinish: true,\n    ignoreInitial: true,\n    persistent: true,\n  } satisfies ChokidarOptions\n\n  const outNames = new Set<string>()\n  const isArrayConfig = Array.isArray(resolvedConfigs)\n  const configs = isArrayConfig ? resolvedConfigs : [resolvedConfigs]\n  for (const config of configs) {\n    if (isArrayConfig)\n      logger.log(`Using config ${pc.gray(basename(configPath))}`)\n    if (!config.out) throw new Error('out is required.')\n    if (outNames.has(config.out))\n      throw new Error(`out \"${config.out}\" must be unique.`)\n    outNames.add(config.out)\n\n    // Collect contracts and watch configs from plugins\n    const plugins = (config.plugins ?? []).map((x, i) => ({\n      ...x,\n      id: `${x.name}-${i}`,\n    }))\n    const spinner = logger.spinner('Validating plugins')\n    spinner.start()\n    for (const plugin of plugins) {\n      await plugin.validate?.()\n    }\n    spinner.success()\n\n    // Add plugin contracts to config contracts\n    const contractConfigs = config.contracts ?? []\n    const watchConfigs: Watch[] = []\n    spinner.start('Resolving contracts')\n    for (const plugin of plugins) {\n      if (plugin.watch) watchConfigs.push(plugin.watch)\n      if (plugin.contracts) {\n        const contracts = await plugin.contracts()\n        contractConfigs.push(...contracts)\n      }\n    }\n\n    // Get contracts from config\n    const contractNames = new Set<string>()\n    const contractMap = new Map<string, Contract>()\n    for (const contractConfig of contractConfigs) {\n      if (contractNames.has(contractConfig.name))\n        throw new Error(\n          `Contract name \"${contractConfig.name}\" must be unique.`,\n        )\n      const contract = await getContract({ ...contractConfig, isTypeScript })\n      contractMap.set(contract.name, contract)\n\n      contractNames.add(contractConfig.name)\n    }\n\n    // Sort contracts by name Ascending (low to high) as the key is `String`\n    const sortedAscContractMap = new Map([...contractMap].sort())\n    const contracts = [...sortedAscContractMap.values()]\n    if (!contracts.length && !options.watch) {\n      spinner.error()\n      logger.warn('No contracts found.')\n      return\n    }\n    spinner.success()\n\n    // Run plugins\n    const imports = []\n    const prepend = []\n    const content = []\n    type Output = {\n      plugin: Pick<Plugin, 'name'>\n    } & Awaited<ReturnType<NonNullable<Plugin['run']>>>\n    const outputs: Output[] = []\n    spinner.start('Running plugins')\n    for (const plugin of plugins) {\n      if (!plugin.run) continue\n      const result = await plugin.run({\n        contracts,\n        isTypeScript,\n        outputs,\n      })\n      outputs.push({\n        plugin: { name: plugin.name },\n        ...result,\n      })\n      if (!result.imports && !result.prepend && !result.content) continue\n      content.push(getBannerContent({ name: plugin.name }), result.content)\n      result.imports && imports.push(result.imports)\n      result.prepend && prepend.push(result.prepend)\n    }\n    spinner.success()\n\n    // Write output to file\n    spinner.start(`Writing to ${pc.gray(config.out)}`)\n    await writeContracts({\n      content,\n      contracts,\n      imports,\n      prepend,\n      filename: config.out,\n    })\n    spinner.success()\n\n    if (options.watch) {\n      if (!watchConfigs.length) {\n        logger.log(pc.gray('Used --watch flag, but no plugins are watching.'))\n        continue\n      }\n      logger.log()\n      logger.log('Setting up watch process')\n\n      // Watch for changes\n      let timeout: NodeJS.Timeout | null\n      for (const watchConfig of watchConfigs) {\n        const paths =\n          typeof watchConfig.paths === 'function'\n            ? await watchConfig.paths()\n            : watchConfig.paths\n        const watcher = watch(paths, watchOptions)\n        // Watch for changes to files, new files, and deleted files\n        watcher.on('all', async (event, path) => {\n          if (event !== 'change' && event !== 'add' && event !== 'unlink')\n            return\n\n          let needsWrite = false\n          if (event === 'change' || event === 'add') {\n            const eventFn =\n              event === 'change' ? watchConfig.onChange : watchConfig.onAdd\n            const config = await eventFn?.(path)\n            if (!config) return\n            const contract = await getContract({ ...config, isTypeScript })\n            contractMap.set(contract.name, contract)\n            needsWrite = true\n          } else if (event === 'unlink') {\n            const name = await watchConfig.onRemove?.(path)\n            if (!name) return\n            contractMap.delete(name)\n            needsWrite = true\n          }\n\n          // Debounce writes\n          if (needsWrite) {\n            if (timeout) clearTimeout(timeout)\n            timeout = setTimeout(async () => {\n              timeout = null\n              // Sort contracts by name Ascending (low to high) as the key is `String`\n              const sortedAscContractMap = new Map([...contractMap].sort())\n              const contracts = [...sortedAscContractMap.values()]\n              const imports = []\n              const prepend = []\n              const content = []\n              const outputs: Output[] = []\n              for (const plugin of plugins) {\n                if (!plugin.run) continue\n                const result = await plugin.run({\n                  contracts,\n                  isTypeScript,\n                  outputs,\n                })\n                outputs.push({\n                  plugin: { name: plugin.name },\n                  ...result,\n                })\n                if (!result.imports && !result.prepend && !result.content)\n                  continue\n                content.push(\n                  getBannerContent({ name: plugin.name }),\n                  result.content,\n                )\n                result.imports && imports.push(result.imports)\n                result.prepend && prepend.push(result.prepend)\n              }\n\n              const spinner = logger.spinner(\n                `Writing to ${pc.gray(config.out)}`,\n              )\n              spinner.start()\n              await writeContracts({\n                content,\n                contracts,\n                imports,\n                prepend,\n                filename: config.out,\n              })\n              spinner.success()\n            }, watchWriteDelay)\n            needsWrite = false\n          }\n        })\n\n        // Run parallel command on ready\n        if (watchConfig.command)\n          watcher.on('ready', async () => {\n            await watchConfig.command?.()\n          })\n        ;(watcher as Watcher).config = watchConfig\n        watchers.push(watcher)\n      }\n    }\n  }\n\n  if (!watchers.length) return\n\n  // Watch `@wagmi/cli` config file for changes\n  const watcher = watch(configPath).on('change', async (path) => {\n    logger.log(\n      `> Found a change to config ${pc.gray(\n        basename(path),\n      )}. Restart process for changes to take effect.`,\n    )\n  })\n  watchers.push(watcher)\n\n  // Display message and close watchers on exit\n  process.once('SIGINT', shutdown)\n  process.once('SIGTERM', shutdown)\n  async function shutdown() {\n    logger.log()\n    logger.log('Shutting down watch process')\n    const promises = []\n    for (const watcher of watchers) {\n      if (watcher.config?.onClose) promises.push(watcher.config?.onClose?.())\n      promises.push(watcher.close())\n    }\n    await Promise.allSettled(promises)\n    process.exit(0)\n  }\n}\n\nasync function getContract({\n  abi,\n  address,\n  name,\n  isTypeScript,\n}: ContractConfig & { isTypeScript: boolean }): Promise<Contract> {\n  const constAssertion = isTypeScript ? ' as const' : ''\n  const abiName = `${camelCase(name)}Abi`\n  try {\n    abi = (await AbiSchema.parseAsync(abi)) as Abi\n  } catch (error) {\n    if (error instanceof z.ZodError)\n      throw fromZodError(error, {\n        prefix: `Invalid ABI for contract \"${name}\"`,\n      })\n    throw error\n  }\n  const docString =\n    typeof address === 'object'\n      ? dedent`\\n\n        /**\n         ${getAddressDocString({ address })}\n        */\n      `\n      : ''\n  let content = dedent`\n    ${getBannerContent({ name })}\n\n    ${docString}\n    export const ${abiName} = ${JSON.stringify(abi)}${constAssertion}\n  `\n\n  let meta: Contract['meta'] = { abiName }\n  if (address) {\n    let resolvedAddress: Address | Record<number, Address>\n    try {\n      const Address = z\n        .string()\n        .regex(/^0x[a-fA-F0-9]{40}$/, { message: 'Invalid address' })\n        .transform((val) => getAddress(val)) as z.ZodType<Address>\n      const MultiChainAddress = z.record(z.string(), Address)\n      const AddressSchema = z.union([Address, MultiChainAddress])\n      resolvedAddress = await AddressSchema.parseAsync(address)\n    } catch (error) {\n      if (error instanceof z.ZodError)\n        throw fromZodError(error, {\n          prefix: `Invalid address for contract \"${name}\"`,\n        })\n      throw error\n    }\n\n    const addressName = `${camelCase(name)}Address`\n    const configName = `${camelCase(name)}Config`\n    meta = {\n      ...meta,\n      addressName,\n      configName,\n    }\n\n    const addressContent =\n      typeof resolvedAddress === 'string'\n        ? JSON.stringify(resolvedAddress)\n        : // Remove quotes from chain id key\n          JSON.stringify(resolvedAddress, null, 2).replace(/\"(\\d*)\":/gm, '$1:')\n    content = dedent`\n      ${content}\n\n      ${docString}\n      export const ${addressName} = ${addressContent}${constAssertion}\n\n      ${docString}\n      export const ${configName} = { address: ${addressName}, abi: ${abiName} }${constAssertion}\n    `\n  }\n\n  return { abi, address, content, meta, name }\n}\n\nasync function writeContracts({\n  content,\n  contracts,\n  imports,\n  prepend,\n  filename,\n}: {\n  content: string[]\n  contracts: Contract[]\n  imports: string[]\n  prepend: string[]\n  filename: string\n}) {\n  // Assemble code\n  let code = dedent`\n    ${imports.join('\\n\\n') ?? ''}\n\n    ${prepend.join('\\n\\n') ?? ''}\n  `\n  for (const contract of contracts) {\n    code = dedent`\n      ${code}\n\n      ${contract.content}\n    `\n  }\n  code = dedent`\n    ${code}\n    \n    ${content.join('\\n\\n') ?? ''}\n  `\n\n  // Format and write output\n  const cwd = process.cwd()\n  const outPath = resolve(cwd, filename)\n  await mkdir(dirname(outPath), { recursive: true })\n  const formatted = await format(code)\n  await writeFile(outPath, formatted)\n}\n\nfunction getBannerContent({ name }: { name: string }) {\n  return dedent`\n  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n  // ${name}\n  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n  `\n}\n"
  },
  {
    "path": "packages/cli/src/commands/init.test.ts",
    "content": "import { existsSync } from 'node:fs'\nimport { mkdir, readFile } from 'node:fs/promises'\nimport { resolve } from 'pathe'\nimport { afterEach, beforeEach, expect, test, vi } from 'vitest'\n\nimport { createFixture, watchConsole } from '../../test/utils.js'\nimport { defaultConfig } from '../config.js'\nimport { init } from './init.js'\n\nlet console: ReturnType<typeof watchConsole>\nbeforeEach(() => {\n  console = watchConsole()\n})\n\nafterEach(() => {\n  vi.restoreAllMocks()\n})\n\ntest('creates config file', async () => {\n  const { dir } = await createFixture()\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  const configFile = await init()\n\n  expect(existsSync(configFile)).toBeTruthy()\n  expect(await readFile(configFile, 'utf-8')).toMatchInlineSnapshot(`\n      \"// @ts-check\n\n      /** @type {import('@wagmi/cli').Config} */\n      export default {\n        out: 'src/generated.js',\n        contracts: [],\n        plugins: [],\n      }\n      \"\n    `)\n  expect(\n    console.formatted.replaceAll(dir, 'path/to/project'),\n  ).toMatchInlineSnapshot(`\n    \"- Creating config\n    √ Creating config\n    Config created at wagmi.config.js\"\n  `)\n})\n\ntest('parameters: config', async () => {\n  const { dir } = await createFixture()\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  const configFile = await init({\n    config: 'foo.config.ts',\n  })\n\n  expect(existsSync(configFile)).toBeTruthy()\n  expect(await readFile(configFile, 'utf-8')).toMatchInlineSnapshot(`\n        \"// @ts-check\n\n        /** @type {import('@wagmi/cli').Config} */\n        export default {\n          out: 'src/generated.js',\n          contracts: [],\n          plugins: [],\n        }\n        \"\n      `)\n  expect(\n    console.formatted.replaceAll(dir, 'path/to/project'),\n  ).toMatchInlineSnapshot(`\n    \"- Creating config\n    √ Creating config\n    Config created at foo.config.ts\"\n  `)\n})\n\ntest('parameters: content', async () => {\n  const { dir } = await createFixture({\n    files: {\n      'tsconfig.json': '{}',\n    },\n  })\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  const configFile = await init({\n    content: {\n      ...defaultConfig,\n      out: 'foo/bar/baz.ts',\n    },\n  })\n\n  expect(existsSync(configFile)).toBeTruthy()\n  expect(await readFile(configFile, 'utf-8')).toMatchInlineSnapshot(`\n      \"import { defineConfig } from '@wagmi/cli'\n\n      export default defineConfig({\n        out: 'foo/bar/baz.ts',\n        contracts: [],\n        plugins: [],\n      })\n      \"\n    `)\n  expect(\n    console.formatted.replaceAll(dir, 'path/to/project'),\n  ).toMatchInlineSnapshot(`\n    \"- Creating config\n    √ Creating config\n    Config created at wagmi.config.ts\"\n  `)\n})\n\ntest('parameters: root', async () => {\n  const { dir } = await createFixture()\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n  mkdir(resolve(dir, 'foo'))\n\n  const configFile = await init({\n    root: 'foo/',\n  })\n\n  expect(existsSync(configFile)).toBeTruthy()\n  expect(await readFile(configFile, 'utf-8')).toMatchInlineSnapshot(`\n        \"// @ts-check\n\n        /** @type {import('@wagmi/cli').Config} */\n        export default {\n          out: 'src/generated.js',\n          contracts: [],\n          plugins: [],\n        }\n        \"\n      `)\n  expect(\n    console.formatted.replaceAll(dir, 'path/to/project'),\n  ).toMatchInlineSnapshot(`\n    \"- Creating config\n    √ Creating config\n    Config created at foo/wagmi.config.js\"\n  `)\n})\n\ntest('behavior: creates config file in TypeScript format', async () => {\n  const { dir } = await createFixture({\n    files: {\n      'tsconfig.json': '{}',\n    },\n  })\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  const configFile = await init()\n\n  expect(existsSync(configFile)).toBeTruthy()\n  expect(await readFile(configFile, 'utf-8')).toMatchInlineSnapshot(`\n      \"import { defineConfig } from '@wagmi/cli'\n\n      export default defineConfig({\n        out: 'src/generated.ts',\n        contracts: [],\n        plugins: [],\n      })\n      \"\n    `)\n  expect(\n    console.formatted.replaceAll(dir, 'path/to/project'),\n  ).toMatchInlineSnapshot(`\n    \"- Creating config\n    √ Creating config\n    Config created at wagmi.config.ts\"\n  `)\n})\n\ntest('behavior: displays config file location when config exists', async () => {\n  const { dir } = await createFixture({\n    files: {\n      'wagmi.config.ts': '',\n    },\n  })\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  const configFile = await init()\n\n  expect(\n    console.formatted.replaceAll(configFile, 'path/to/project/wagmi.config.ts'),\n  ).toMatchInlineSnapshot('\"Config already exists at wagmi.config.ts\"')\n})\n"
  },
  {
    "path": "packages/cli/src/commands/init.ts",
    "content": "import { writeFile } from 'node:fs/promises'\nimport dedent from 'dedent'\nimport { relative, resolve } from 'pathe'\nimport pc from 'picocolors'\nimport { z } from 'zod'\n\nimport { type Config, defaultConfig } from '../config.js'\nimport { fromZodError } from '../errors.js'\nimport * as logger from '../logger.js'\nimport { findConfig } from '../utils/findConfig.js'\nimport { format } from '../utils/format.js'\nimport { getIsUsingTypeScript } from '../utils/getIsUsingTypeScript.js'\n\nexport type Init = {\n  /** Path to config file */\n  config?: string\n  /** Watch for file system changes to config and plugins */\n  content?: Config\n  /** Directory to init config file */\n  root?: string\n}\n\nconst Init = z.object({\n  config: z.string().optional(),\n  content: z.object({}).optional(),\n  root: z.string().optional(),\n})\n\nexport async function init(options: Init = {}) {\n  // Validate command line options\n  try {\n    await Init.parseAsync(options)\n  } catch (error) {\n    if (error instanceof z.ZodError)\n      throw fromZodError(error, { prefix: 'Invalid option' })\n    throw error\n  }\n\n  // Check for existing config file\n  const configPath = await findConfig(options)\n  if (configPath) {\n    logger.info(\n      `Config already exists at ${pc.gray(\n        relative(process.cwd(), configPath),\n      )}`,\n    )\n    return configPath\n  }\n\n  const spinner = logger.spinner('Creating config')\n  spinner.start()\n  // Check if project is using TypeScript\n  const isUsingTypeScript = await getIsUsingTypeScript()\n  const rootDir = resolve(options.root || process.cwd())\n  let outPath: string\n  if (options.config) {\n    outPath = resolve(rootDir, options.config)\n  } else {\n    const extension = isUsingTypeScript ? 'ts' : 'js'\n    outPath = resolve(rootDir, `wagmi.config.${extension}`)\n  }\n\n  let content: string\n  if (isUsingTypeScript) {\n    const config = options.content ?? defaultConfig\n    content = dedent(`\n      import { defineConfig } from '@wagmi/cli'\n      \n      export default defineConfig(${JSON.stringify(config)})\n    `)\n  } else {\n    const config = options.content ?? {\n      ...defaultConfig,\n      out: defaultConfig.out.replace('.ts', '.js'),\n    }\n    content = dedent(`\n      // @ts-check\n\n      /** @type {import('@wagmi/cli').Config} */\n      export default ${JSON.stringify(config, null, 2).replace(\n        /\"(\\d*)\":/gm,\n        '$1:',\n      )}\n    `)\n  }\n\n  const formatted = await format(content)\n  await writeFile(outPath, formatted)\n  spinner.success()\n  logger.success(\n    `Config created at ${pc.gray(relative(process.cwd(), outPath))}`,\n  )\n\n  return outPath\n}\n"
  },
  {
    "path": "packages/cli/src/config.test.ts",
    "content": "import { expect, test, vi } from 'vitest'\n\nimport { type Config, defineConfig } from './config.js'\n\ntest('object', () => {\n  const config: Config = {\n    contracts: [],\n    out: 'wagmi.ts',\n    plugins: [],\n  }\n  expect(defineConfig(config)).toEqual(config)\n})\n\ntest('array', () => {\n  const config: Config = {\n    contracts: [],\n    out: 'wagmi.ts',\n    plugins: [],\n  }\n  expect(defineConfig([config, config])).toEqual([config, config])\n})\n\ntest('function', () => {\n  const config = vi.fn().mockImplementation(() => ({\n    contracts: [],\n    out: 'wagmi.ts',\n    plugins: [],\n  }))\n  expect(defineConfig(config)).toEqual(config)\n})\n\ntest('async function', () => {\n  const config = vi.fn().mockImplementation(async () => ({\n    contracts: [],\n    out: 'wagmi.ts',\n    plugins: [],\n  }))\n  expect(defineConfig(config)).toEqual(config)\n})\n"
  },
  {
    "path": "packages/cli/src/config.ts",
    "content": "import type { Abi, Address } from 'viem'\n\nimport type { Compute, MaybeArray, MaybePromise } from './types.js'\n\nexport type ContractConfig<\n  chainId extends number = number,\n  requiredChainId extends number | undefined = undefined,\n> = {\n  /**\n   * Contract ABI\n   */\n  abi: Abi\n  /**\n   * Contract address or addresses.\n   *\n   * Accepts an object `{ [chainId]: address }` to support multiple chains.\n   *\n   * @example\n   * '0x314159265dd8dbb310642f98f50c066173c1259b'\n   *\n   * @example\n   * {\n   *   1: '0x314159265dd8dbb310642f98f50c066173c1259b',\n   *   5: '0x112234455c3a32fd11230c42e7bccd4a84e02010',\n   * }\n   */\n  address?:\n    | Address\n    | (requiredChainId extends number\n        ? Record<requiredChainId, Address> & Partial<Record<chainId, Address>>\n        : Record<chainId, Address>)\n    | undefined\n  /**\n   * Name of contract.\n   */\n  name: string\n}\n\nexport type Contract = Compute<\n  ContractConfig & {\n    /** Generated string content */\n    content: string\n    /** Meta info about contract */\n    meta: {\n      abiName: string\n      addressName?: string | undefined\n      configName?: string | undefined\n    }\n  }\n>\n\nexport type Watch = {\n  /** Command to run along with watch process */\n  command?: (() => MaybePromise<void>) | undefined\n  /** Paths to watch for changes. */\n  paths: string[] | (() => MaybePromise<string[]>)\n  /** Callback that fires when file is added */\n  onAdd?:\n    | ((path: string) => MaybePromise<ContractConfig | undefined>)\n    | undefined\n  /** Callback that fires when file changes */\n  onChange: (path: string) => MaybePromise<ContractConfig | undefined>\n  /** Callback that fires when watcher is shutdown */\n  onClose?: (() => MaybePromise<void>) | undefined\n  /** Callback that fires when file is removed */\n  onRemove?: ((path: string) => MaybePromise<string | undefined>) | undefined\n}\n\nexport type Plugin = {\n  /** Contracts provided by plugin */\n  contracts?: (() => MaybePromise<ContractConfig[]>) | undefined\n  /** Plugin name */\n  name: string\n  /** Run plugin logic */\n  run?:\n    | ((config: {\n        /** All resolved contracts from config and plugins */\n        contracts: Contract[]\n        /** Whether TypeScript is detected in project */\n        isTypeScript: boolean\n        /** Previous plugin outputs */\n        outputs: readonly {\n          plugin: Pick<Plugin, 'name'>\n          imports?: string\n          prepend?: string\n          content: string\n        }[]\n      }) => MaybePromise<{\n        imports?: string\n        prepend?: string\n        content: string\n      }>)\n    | undefined\n  /**\n   * Validate plugin configuration or other @wagmi/cli settings require for plugin.\n   */\n  validate?: (() => MaybePromise<void>) | undefined\n  /** File system watch config */\n  watch?: Watch | undefined\n}\n\nexport type Config = {\n  /** Contracts to use in commands */\n  contracts?: ContractConfig[] | undefined\n  /** Output file path */\n  out: string\n  /** Plugins to run */\n  plugins?: Plugin[] | undefined\n}\n\nexport function defineConfig(\n  config: MaybeArray<Config> | (() => MaybePromise<MaybeArray<Config>>),\n) {\n  return config\n}\n\nexport const defaultConfig = {\n  out: 'src/generated.ts',\n  contracts: [],\n  plugins: [],\n} satisfies Config\n"
  },
  {
    "path": "packages/cli/src/errors.ts",
    "content": "import type * as z from 'zod'\n\nclass ValidationError extends Error {\n  details: z.core.$ZodIssue[]\n\n  constructor(\n    message: string,\n    options: {\n      details: z.core.$ZodIssue[]\n    },\n  ) {\n    super(message)\n    this.details = options.details\n  }\n}\n\n// From https://github.com/causaly/zod-validation-error\nexport function fromZodError(\n  zError: z.ZodError,\n  {\n    maxIssuesInMessage = 99,\n    issueSeparator = '\\n- ',\n    prefixSeparator = '\\n- ',\n    prefix = 'Validation Error',\n  }: {\n    maxIssuesInMessage?: number\n    issueSeparator?: string\n    prefixSeparator?: string\n    prefix?: string\n  } = {},\n): ValidationError {\n  function joinPath(arr: Array<string | number | symbol>): string {\n    return arr.reduce<string>((acc, value) => {\n      if (typeof value === 'number') return `${acc}[${value}]`\n      const separator = acc === '' ? '' : '.'\n      return acc + separator + value.toString()\n    }, '')\n  }\n\n  const reason = zError.issues\n    // limit max number of issues printed in the reason section\n    .slice(0, maxIssuesInMessage)\n    // format error message\n    .map((issue) => {\n      const { message, path } = issue\n      if (path.length > 0) return `${message} at \\`${joinPath(path)}\\``\n      return message\n    })\n    // concat as string\n    .join(issueSeparator)\n\n  const message = reason ? [prefix, reason].join(prefixSeparator) : prefix\n\n  return new ValidationError(message, {\n    details: zError.issues,\n  })\n}\n"
  },
  {
    "path": "packages/cli/src/exports/config.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport * as Exports from './config.js'\n\ntest('exports', () => {\n  expect(Object.keys(Exports)).toMatchInlineSnapshot(`\n    [\n      \"defaultConfig\",\n      \"defineConfig\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/cli/src/exports/config.ts",
    "content": "// biome-ignore lint/performance/noBarrelFile: entrypoint module\nexport {\n  type Config,\n  type Contract,\n  type ContractConfig,\n  defaultConfig,\n  defineConfig,\n  type Plugin,\n  type Watch,\n} from '../config.js'\n"
  },
  {
    "path": "packages/cli/src/exports/index.test-d.ts",
    "content": "import { expectTypeOf } from 'vitest'\n\n// noop test because vitest typecheck fails unless each workspace project has type test\nexpectTypeOf(1).toEqualTypeOf<number>()\n"
  },
  {
    "path": "packages/cli/src/exports/index.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport * as Exports from './index.js'\n\ntest('exports', () => {\n  expect(Object.keys(Exports)).toMatchInlineSnapshot(`\n    [\n      \"defineConfig\",\n      \"logger\",\n      \"loadEnv\",\n      \"version\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/cli/src/exports/index.ts",
    "content": "// biome-ignore lint/performance/noBarrelFile: entrypoint module\nexport {\n  type Config,\n  type ContractConfig,\n  defineConfig,\n  type Plugin,\n} from '../config.js'\n\n// biome-ignore lint/performance/noReExportAll: entrypoint module\nexport * as logger from '../logger.js'\n\nexport { loadEnv } from '../utils/loadEnv.js'\n\nexport { version } from '../version.js'\n"
  },
  {
    "path": "packages/cli/src/exports/plugins.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport * as Exports from './plugins.js'\n\ntest('exports', () => {\n  expect(Object.keys(Exports)).toMatchInlineSnapshot(`\n    [\n      \"actions\",\n      \"blockExplorer\",\n      \"etherscan\",\n      \"fetch\",\n      \"foundry\",\n      \"foundryDefaultExcludes\",\n      \"hardhat\",\n      \"hardhatDefaultExcludes\",\n      \"react\",\n      \"sourcify\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/cli/src/exports/plugins.ts",
    "content": "// biome-ignore lint/performance/noBarrelFile: entrypoint module\nexport { type ActionsConfig, actions } from '../plugins/actions.js'\n\nexport {\n  type BlockExplorerConfig,\n  blockExplorer,\n} from '../plugins/blockExplorer.js'\n\nexport { type EtherscanConfig, etherscan } from '../plugins/etherscan.js'\n\nexport { type FetchConfig, fetch } from '../plugins/fetch.js'\n\nexport {\n  type FoundryConfig,\n  foundry,\n  foundryDefaultExcludes,\n} from '../plugins/foundry.js'\n\nexport {\n  type HardhatConfig,\n  hardhat,\n  hardhatDefaultExcludes,\n} from '../plugins/hardhat.js'\n\nexport { type ReactConfig, react } from '../plugins/react.js'\n\nexport { type SourcifyConfig, sourcify } from '../plugins/sourcify.js'\n"
  },
  {
    "path": "packages/cli/src/logger.test.ts",
    "content": "import { afterEach, expect, test, vi } from 'vitest'\n\nimport { watchConsole } from '../test/utils.js'\n\nimport * as logger from './logger.js'\n\nconst mockLog = vi.fn()\n\nafterEach(() => {\n  vi.restoreAllMocks()\n})\n\ntest.each(['success', 'info', 'log', 'warn', 'error'])('%s()', (level) => {\n  const spy = vi.spyOn(logger, level as any)\n  spy.mockImplementation(mockLog)\n  const loggerFn = (logger as any)[level]\n  loggerFn(level)\n  expect(spy).toHaveBeenCalledWith(level)\n})\n\ntest('spinner', () => {\n  const console = watchConsole()\n  const spinner = logger.spinner('start')\n  spinner.start()\n  spinner.success('success')\n  spinner.error('error')\n  expect(console.formatted).toMatchInlineSnapshot(`\n    \"- start\n    √ success\n    × error\"\n  `)\n})\n"
  },
  {
    "path": "packages/cli/src/logger.ts",
    "content": "import { format as utilFormat } from 'node:util'\nimport { createSpinner } from 'nanospinner'\nimport pc from 'picocolors'\n\nfunction format(args: any[]) {\n  return utilFormat(...args)\n    .split('\\n')\n    .join('\\n')\n}\n\nexport function success(...args: any[]) {\n  console.log(pc.green(format(args)))\n}\n\nexport function info(...args: any[]) {\n  // biome-ignore lint/suspicious/noConsole: logger\n  console.info(pc.blue(format(args)))\n}\n\nexport function log(...args: any[]) {\n  console.log(pc.white(format(args)))\n}\n\nexport function warn(...args: any[]) {\n  // biome-ignore lint/suspicious/noConsole: logger\n  console.warn(pc.yellow(format(args)))\n}\n\nexport function error(...args: any[]) {\n  // biome-ignore lint/suspicious/noConsole: logger\n  console.error(pc.red(format(args)))\n}\n\nexport function spinner(text: string) {\n  return createSpinner(text, {\n    color: 'yellow',\n  })\n}\n"
  },
  {
    "path": "packages/cli/src/plugins/__fixtures__/foundry/.gitignore",
    "content": "# Compiler files\ncache/\nout/\n\n# Ignores development broadcast logs\n!/broadcast\n/broadcast/*/31337/\n/broadcast/**/dry-run/\n\n# Dotenv file\n.env\n"
  },
  {
    "path": "packages/cli/src/plugins/__fixtures__/foundry/foundry.toml",
    "content": "[profile.default]\nlibs = ['lib']\nout = 'out'\nsolc = '0.8.13'\nsrc = 'src'\n\n# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options\n"
  },
  {
    "path": "packages/cli/src/plugins/__fixtures__/foundry/src/Counter.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.13;\n\ncontract Counter {\n  uint256 public number;\n\n  function setNumber(uint256 newNumber) public {\n    number = newNumber;\n  }\n\n  function increment() public {\n    number++;\n  }\n}\n"
  },
  {
    "path": "packages/cli/src/plugins/__fixtures__/foundry/src/Foo.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.13;\n\ncontract Foo {\n  string public bar;\n\n  function setFoo(string memory baz) public {\n    bar = baz;\n  }\n}\n\n"
  },
  {
    "path": "packages/cli/src/plugins/__fixtures__/hardhat/.gitignore",
    "content": "node_modules\n.env\ncoverage\ncoverage.json\ntypechain\ntypechain-types\n\n# Hardhat files\ncache\nartifacts"
  },
  {
    "path": "packages/cli/src/plugins/__fixtures__/hardhat/contracts/Counter.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.13;\n\ncontract Counter {\n  uint256 public number;\n\n  function setNumber(uint256 newNumber) public {\n    number = newNumber;\n  }\n\n  function increment() public {\n    number++;\n  }\n}\n"
  },
  {
    "path": "packages/cli/src/plugins/__fixtures__/hardhat/contracts/Foo.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.13;\n\ncontract Foo {\n  string public bar;\n\n  function setFoo(string memory baz) public {\n    bar = baz;\n  }\n}\n"
  },
  {
    "path": "packages/cli/src/plugins/__fixtures__/hardhat/hardhat.config.js",
    "content": "import { defineConfig } from 'hardhat/config'\n\nexport default defineConfig({\n  solidity: '0.8.17',\n})\n"
  },
  {
    "path": "packages/cli/src/plugins/__fixtures__/hardhat/package.json",
    "content": "{\n  \"name\": \"hardhat-fixture\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"devDependencies\": {\n    \"hardhat\": \"^3.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/cli/src/plugins/__snapshots__/blockExplorer.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`fetches ABI 1`] = `\n[\n  {\n    \"abi\": [\n      {\n        \"inputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"constructor\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"approved\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"Approval\",\n        \"type\": \"event\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": false,\n            \"internalType\": \"bool\",\n            \"name\": \"approved\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"name\": \"ApprovalForAll\",\n        \"type\": \"event\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"Transfer\",\n        \"type\": \"event\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"approve\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"balanceOf\",\n        \"outputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"getApproved\",\n        \"outputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"\",\n            \"type\": \"address\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"isApprovedForAll\",\n        \"outputs\": [\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"mint\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"name\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"ownerOf\",\n        \"outputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"\",\n            \"type\": \"address\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"safeTransferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n          {\n            \"internalType\": \"bytes\",\n            \"name\": \"_data\",\n            \"type\": \"bytes\",\n          },\n        ],\n        \"name\": \"safeTransferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"approved\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"name\": \"setApprovalForAll\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"bytes4\",\n            \"name\": \"interfaceId\",\n            \"type\": \"bytes4\",\n          },\n        ],\n        \"name\": \"supportsInterface\",\n        \"outputs\": [\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"symbol\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"tokenURI\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"pure\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"totalSupply\",\n        \"outputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"transferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n    ],\n    \"address\": \"0xaf0326d92b97df1221759476b072abfd8084f9be\",\n    \"name\": \"WagmiMintExample\",\n  },\n]\n`;\n\nexports[`fetches ABI with multichain deployment 1`] = `\n[\n  {\n    \"abi\": [\n      {\n        \"inputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"constructor\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"approved\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"Approval\",\n        \"type\": \"event\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": false,\n            \"internalType\": \"bool\",\n            \"name\": \"approved\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"name\": \"ApprovalForAll\",\n        \"type\": \"event\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"Transfer\",\n        \"type\": \"event\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"approve\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"balanceOf\",\n        \"outputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"getApproved\",\n        \"outputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"\",\n            \"type\": \"address\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"isApprovedForAll\",\n        \"outputs\": [\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"mint\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"name\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"ownerOf\",\n        \"outputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"\",\n            \"type\": \"address\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"safeTransferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n          {\n            \"internalType\": \"bytes\",\n            \"name\": \"_data\",\n            \"type\": \"bytes\",\n          },\n        ],\n        \"name\": \"safeTransferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"approved\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"name\": \"setApprovalForAll\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"bytes4\",\n            \"name\": \"interfaceId\",\n            \"type\": \"bytes4\",\n          },\n        ],\n        \"name\": \"supportsInterface\",\n        \"outputs\": [\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"symbol\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"tokenURI\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"pure\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"totalSupply\",\n        \"outputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"transferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n    ],\n    \"address\": {\n      \"1\": \"0xaf0326d92b97df1221759476b072abfd8084f9be\",\n      \"10\": \"0xaf0326d92b97df1221759476b072abfd8084f9be\",\n    },\n    \"name\": \"WagmiMintExample\",\n  },\n]\n`;\n"
  },
  {
    "path": "packages/cli/src/plugins/__snapshots__/etherscan.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`fetches ABI 1`] = `\n[\n  {\n    \"abi\": [\n      {\n        \"inputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"constructor\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"approved\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"Approval\",\n        \"type\": \"event\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": false,\n            \"internalType\": \"bool\",\n            \"name\": \"approved\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"name\": \"ApprovalForAll\",\n        \"type\": \"event\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"Transfer\",\n        \"type\": \"event\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"approve\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"balanceOf\",\n        \"outputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"getApproved\",\n        \"outputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"\",\n            \"type\": \"address\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"isApprovedForAll\",\n        \"outputs\": [\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"mint\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"name\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"ownerOf\",\n        \"outputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"\",\n            \"type\": \"address\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"safeTransferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n          {\n            \"internalType\": \"bytes\",\n            \"name\": \"_data\",\n            \"type\": \"bytes\",\n          },\n        ],\n        \"name\": \"safeTransferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"approved\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"name\": \"setApprovalForAll\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"bytes4\",\n            \"name\": \"interfaceId\",\n            \"type\": \"bytes4\",\n          },\n        ],\n        \"name\": \"supportsInterface\",\n        \"outputs\": [\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"symbol\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"tokenURI\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"pure\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"totalSupply\",\n        \"outputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"transferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n    ],\n    \"address\": {\n      \"1\": \"0xaf0326d92b97df1221759476b072abfd8084f9be\",\n    },\n    \"name\": \"WagmiMintExample\",\n  },\n]\n`;\n\nexports[`fetches ABI with multichain deployment 1`] = `\n[\n  {\n    \"abi\": [\n      {\n        \"inputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"constructor\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"approved\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"Approval\",\n        \"type\": \"event\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": false,\n            \"internalType\": \"bool\",\n            \"name\": \"approved\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"name\": \"ApprovalForAll\",\n        \"type\": \"event\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"Transfer\",\n        \"type\": \"event\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"approve\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"balanceOf\",\n        \"outputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"getApproved\",\n        \"outputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"\",\n            \"type\": \"address\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"isApprovedForAll\",\n        \"outputs\": [\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"mint\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"name\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"ownerOf\",\n        \"outputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"\",\n            \"type\": \"address\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"safeTransferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n          {\n            \"internalType\": \"bytes\",\n            \"name\": \"_data\",\n            \"type\": \"bytes\",\n          },\n        ],\n        \"name\": \"safeTransferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"approved\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"name\": \"setApprovalForAll\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"bytes4\",\n            \"name\": \"interfaceId\",\n            \"type\": \"bytes4\",\n          },\n        ],\n        \"name\": \"supportsInterface\",\n        \"outputs\": [\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"symbol\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"tokenURI\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"pure\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"totalSupply\",\n        \"outputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"transferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n    ],\n    \"address\": {\n      \"1\": \"0xaf0326d92b97df1221759476b072abfd8084f9be\",\n      \"10\": \"0xaf0326d92b97df1221759476b072abfd8084f9be\",\n    },\n    \"name\": \"WagmiMintExample\",\n  },\n]\n`;\n\nexports[`tryFetchProxyImplementation: fetches ABI 1`] = `\n[\n  {\n    \"abi\": [\n      {\n        \"inputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"constructor\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"approved\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"Approval\",\n        \"type\": \"event\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": false,\n            \"internalType\": \"bool\",\n            \"name\": \"approved\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"name\": \"ApprovalForAll\",\n        \"type\": \"event\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"Transfer\",\n        \"type\": \"event\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"approve\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"balanceOf\",\n        \"outputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"getApproved\",\n        \"outputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"\",\n            \"type\": \"address\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"isApprovedForAll\",\n        \"outputs\": [\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"mint\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"name\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"ownerOf\",\n        \"outputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"\",\n            \"type\": \"address\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"safeTransferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n          {\n            \"internalType\": \"bytes\",\n            \"name\": \"_data\",\n            \"type\": \"bytes\",\n          },\n        ],\n        \"name\": \"safeTransferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"approved\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"name\": \"setApprovalForAll\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"bytes4\",\n            \"name\": \"interfaceId\",\n            \"type\": \"bytes4\",\n          },\n        ],\n        \"name\": \"supportsInterface\",\n        \"outputs\": [\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"symbol\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"tokenURI\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"pure\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"totalSupply\",\n        \"outputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"transferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n    ],\n    \"address\": {\n      \"1\": \"0xaf0326d92b97df1221759476b072abfd8084f9be\",\n    },\n    \"name\": \"WagmiMintExample\",\n  },\n]\n`;\n\nexports[`tryFetchProxyImplementation: fetches implementation ABI 1`] = `\n[\n  {\n    \"abi\": [\n      {\n        \"constant\": false,\n        \"inputs\": [\n          {\n            \"name\": \"newImplementation\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"upgradeTo\",\n        \"outputs\": [],\n        \"payable\": false,\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"constant\": false,\n        \"inputs\": [\n          {\n            \"name\": \"newImplementation\",\n            \"type\": \"address\",\n          },\n          {\n            \"name\": \"data\",\n            \"type\": \"bytes\",\n          },\n        ],\n        \"name\": \"upgradeToAndCall\",\n        \"outputs\": [],\n        \"payable\": true,\n        \"stateMutability\": \"payable\",\n        \"type\": \"function\",\n      },\n      {\n        \"constant\": true,\n        \"inputs\": [],\n        \"name\": \"implementation\",\n        \"outputs\": [\n          {\n            \"name\": \"\",\n            \"type\": \"address\",\n          },\n        ],\n        \"payable\": false,\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"constant\": false,\n        \"inputs\": [\n          {\n            \"name\": \"newAdmin\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"changeAdmin\",\n        \"outputs\": [],\n        \"payable\": false,\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"constant\": true,\n        \"inputs\": [],\n        \"name\": \"admin\",\n        \"outputs\": [\n          {\n            \"name\": \"\",\n            \"type\": \"address\",\n          },\n        ],\n        \"payable\": false,\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"name\": \"_implementation\",\n            \"type\": \"address\",\n          },\n        ],\n        \"payable\": false,\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"constructor\",\n      },\n      {\n        \"payable\": true,\n        \"stateMutability\": \"payable\",\n        \"type\": \"fallback\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": false,\n            \"name\": \"previousAdmin\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": false,\n            \"name\": \"newAdmin\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"AdminChanged\",\n        \"type\": \"event\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": false,\n            \"name\": \"implementation\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"Upgraded\",\n        \"type\": \"event\",\n      },\n    ],\n    \"address\": {\n      \"1\": \"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\",\n    },\n    \"name\": \"FiatToken\",\n  },\n]\n`;\n"
  },
  {
    "path": "packages/cli/src/plugins/__snapshots__/fetch.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`fetches ABI 1`] = `\n[\n  {\n    \"abi\": [\n      {\n        \"inputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"constructor\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"approved\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"Approval\",\n        \"type\": \"event\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": false,\n            \"internalType\": \"bool\",\n            \"name\": \"approved\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"name\": \"ApprovalForAll\",\n        \"type\": \"event\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"Transfer\",\n        \"type\": \"event\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"approve\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"balanceOf\",\n        \"outputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"getApproved\",\n        \"outputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"\",\n            \"type\": \"address\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"isApprovedForAll\",\n        \"outputs\": [\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"mint\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"name\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"ownerOf\",\n        \"outputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"\",\n            \"type\": \"address\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"safeTransferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n          {\n            \"internalType\": \"bytes\",\n            \"name\": \"_data\",\n            \"type\": \"bytes\",\n          },\n        ],\n        \"name\": \"safeTransferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"approved\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"name\": \"setApprovalForAll\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"bytes4\",\n            \"name\": \"interfaceId\",\n            \"type\": \"bytes4\",\n          },\n        ],\n        \"name\": \"supportsInterface\",\n        \"outputs\": [\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"symbol\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"tokenURI\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"pure\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"totalSupply\",\n        \"outputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"transferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n    ],\n    \"address\": \"0xaf0326d92b97df1221759476b072abfd8084f9be\",\n    \"name\": \"WagmiMintExample\",\n  },\n]\n`;\n"
  },
  {
    "path": "packages/cli/src/plugins/__snapshots__/routescan.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`fetches ABI 1`] = `\n[\n  {\n    \"abi\": [\n      {\n        \"inputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"constructor\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"approved\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"Approval\",\n        \"type\": \"event\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": false,\n            \"internalType\": \"bool\",\n            \"name\": \"approved\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"name\": \"ApprovalForAll\",\n        \"type\": \"event\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"Transfer\",\n        \"type\": \"event\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"approve\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"balanceOf\",\n        \"outputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"getApproved\",\n        \"outputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"\",\n            \"type\": \"address\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"isApprovedForAll\",\n        \"outputs\": [\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"mint\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"name\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"ownerOf\",\n        \"outputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"\",\n            \"type\": \"address\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"safeTransferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n          {\n            \"internalType\": \"bytes\",\n            \"name\": \"_data\",\n            \"type\": \"bytes\",\n          },\n        ],\n        \"name\": \"safeTransferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"approved\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"name\": \"setApprovalForAll\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"bytes4\",\n            \"name\": \"interfaceId\",\n            \"type\": \"bytes4\",\n          },\n        ],\n        \"name\": \"supportsInterface\",\n        \"outputs\": [\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"symbol\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"tokenURI\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"pure\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"totalSupply\",\n        \"outputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"transferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n    ],\n    \"address\": {\n      \"1\": \"0xaf0326d92b97df1221759476b072abfd8084f9be\",\n    },\n    \"name\": \"WagmiMintExample\",\n  },\n]\n`;\n\nexports[`fetches ABI with multichain deployment 1`] = `\n[\n  {\n    \"abi\": [\n      {\n        \"inputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"constructor\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"approved\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"Approval\",\n        \"type\": \"event\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": false,\n            \"internalType\": \"bool\",\n            \"name\": \"approved\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"name\": \"ApprovalForAll\",\n        \"type\": \"event\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"Transfer\",\n        \"type\": \"event\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"approve\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"balanceOf\",\n        \"outputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"getApproved\",\n        \"outputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"\",\n            \"type\": \"address\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"isApprovedForAll\",\n        \"outputs\": [\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"mint\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"name\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"ownerOf\",\n        \"outputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"\",\n            \"type\": \"address\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"safeTransferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n          {\n            \"internalType\": \"bytes\",\n            \"name\": \"_data\",\n            \"type\": \"bytes\",\n          },\n        ],\n        \"name\": \"safeTransferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"approved\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"name\": \"setApprovalForAll\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"bytes4\",\n            \"name\": \"interfaceId\",\n            \"type\": \"bytes4\",\n          },\n        ],\n        \"name\": \"supportsInterface\",\n        \"outputs\": [\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"symbol\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"tokenURI\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"pure\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"totalSupply\",\n        \"outputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"transferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n    ],\n    \"address\": {\n      \"1\": \"0xaf0326d92b97df1221759476b072abfd8084f9be\",\n      \"10\": \"0xaf0326d92b97df1221759476b072abfd8084f9be\",\n    },\n    \"name\": \"WagmiMintExample\",\n  },\n]\n`;\n\nexports[`tryFetchProxyImplementation: fetches ABI 1`] = `\n[\n  {\n    \"abi\": [\n      {\n        \"inputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"constructor\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"approved\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"Approval\",\n        \"type\": \"event\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": false,\n            \"internalType\": \"bool\",\n            \"name\": \"approved\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"name\": \"ApprovalForAll\",\n        \"type\": \"event\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": true,\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"Transfer\",\n        \"type\": \"event\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"approve\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"balanceOf\",\n        \"outputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"getApproved\",\n        \"outputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"\",\n            \"type\": \"address\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"owner\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"isApprovedForAll\",\n        \"outputs\": [\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"mint\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"name\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"ownerOf\",\n        \"outputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"\",\n            \"type\": \"address\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"safeTransferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n          {\n            \"internalType\": \"bytes\",\n            \"name\": \"_data\",\n            \"type\": \"bytes\",\n          },\n        ],\n        \"name\": \"safeTransferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"operator\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"approved\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"name\": \"setApprovalForAll\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"bytes4\",\n            \"name\": \"interfaceId\",\n            \"type\": \"bytes4\",\n          },\n        ],\n        \"name\": \"supportsInterface\",\n        \"outputs\": [\n          {\n            \"internalType\": \"bool\",\n            \"name\": \"\",\n            \"type\": \"bool\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"symbol\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"tokenURI\",\n        \"outputs\": [\n          {\n            \"internalType\": \"string\",\n            \"name\": \"\",\n            \"type\": \"string\",\n          },\n        ],\n        \"stateMutability\": \"pure\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"totalSupply\",\n        \"outputs\": [\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"internalType\": \"address\",\n            \"name\": \"from\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"address\",\n            \"name\": \"to\",\n            \"type\": \"address\",\n          },\n          {\n            \"internalType\": \"uint256\",\n            \"name\": \"tokenId\",\n            \"type\": \"uint256\",\n          },\n        ],\n        \"name\": \"transferFrom\",\n        \"outputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n    ],\n    \"address\": {\n      \"1\": \"0xaf0326d92b97df1221759476b072abfd8084f9be\",\n    },\n    \"name\": \"WagmiMintExample\",\n  },\n]\n`;\n\nexports[`tryFetchProxyImplementation: fetches implementation ABI 1`] = `\n[\n  {\n    \"abi\": [\n      {\n        \"constant\": false,\n        \"inputs\": [\n          {\n            \"name\": \"newImplementation\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"upgradeTo\",\n        \"outputs\": [],\n        \"payable\": false,\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"constant\": false,\n        \"inputs\": [\n          {\n            \"name\": \"newImplementation\",\n            \"type\": \"address\",\n          },\n          {\n            \"name\": \"data\",\n            \"type\": \"bytes\",\n          },\n        ],\n        \"name\": \"upgradeToAndCall\",\n        \"outputs\": [],\n        \"payable\": true,\n        \"stateMutability\": \"payable\",\n        \"type\": \"function\",\n      },\n      {\n        \"constant\": true,\n        \"inputs\": [],\n        \"name\": \"implementation\",\n        \"outputs\": [\n          {\n            \"name\": \"\",\n            \"type\": \"address\",\n          },\n        ],\n        \"payable\": false,\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"constant\": false,\n        \"inputs\": [\n          {\n            \"name\": \"newAdmin\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"changeAdmin\",\n        \"outputs\": [],\n        \"payable\": false,\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"function\",\n      },\n      {\n        \"constant\": true,\n        \"inputs\": [],\n        \"name\": \"admin\",\n        \"outputs\": [\n          {\n            \"name\": \"\",\n            \"type\": \"address\",\n          },\n        ],\n        \"payable\": false,\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"name\": \"_implementation\",\n            \"type\": \"address\",\n          },\n        ],\n        \"payable\": false,\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"constructor\",\n      },\n      {\n        \"payable\": true,\n        \"stateMutability\": \"payable\",\n        \"type\": \"fallback\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": false,\n            \"name\": \"previousAdmin\",\n            \"type\": \"address\",\n          },\n          {\n            \"indexed\": false,\n            \"name\": \"newAdmin\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"AdminChanged\",\n        \"type\": \"event\",\n      },\n      {\n        \"anonymous\": false,\n        \"inputs\": [\n          {\n            \"indexed\": false,\n            \"name\": \"implementation\",\n            \"type\": \"address\",\n          },\n        ],\n        \"name\": \"Upgraded\",\n        \"type\": \"event\",\n      },\n    ],\n    \"address\": {\n      \"1\": \"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\",\n    },\n    \"name\": \"FiatToken\",\n  },\n]\n`;\n"
  },
  {
    "path": "packages/cli/src/plugins/__snapshots__/sourcify.test.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`fetches ABI 1`] = `\n[\n  {\n    \"abi\": [\n      {\n        \"inputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"constructor\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"name\": \"pubkey\",\n            \"type\": \"bytes\",\n          },\n          {\n            \"name\": \"withdrawal_credentials\",\n            \"type\": \"bytes\",\n          },\n          {\n            \"name\": \"amount\",\n            \"type\": \"bytes\",\n          },\n          {\n            \"name\": \"signature\",\n            \"type\": \"bytes\",\n          },\n          {\n            \"name\": \"index\",\n            \"type\": \"bytes\",\n          },\n        ],\n        \"name\": \"DepositEvent\",\n        \"type\": \"event\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"name\": \"pubkey\",\n            \"type\": \"bytes\",\n          },\n          {\n            \"name\": \"withdrawal_credentials\",\n            \"type\": \"bytes\",\n          },\n          {\n            \"name\": \"signature\",\n            \"type\": \"bytes\",\n          },\n          {\n            \"name\": \"deposit_data_root\",\n            \"type\": \"bytes32\",\n          },\n        ],\n        \"name\": \"deposit\",\n        \"outputs\": [],\n        \"stateMutability\": \"payable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"get_deposit_count\",\n        \"outputs\": [\n          {\n            \"type\": \"bytes\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"get_deposit_root\",\n        \"outputs\": [\n          {\n            \"type\": \"bytes32\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"name\": \"interfaceId\",\n            \"type\": \"bytes4\",\n          },\n        ],\n        \"name\": \"supportsInterface\",\n        \"outputs\": [\n          {\n            \"type\": \"bool\",\n          },\n        ],\n        \"stateMutability\": \"pure\",\n        \"type\": \"function\",\n      },\n    ],\n    \"address\": {\n      \"1\": \"0x00000000219ab540356cbb839cbe05303d7705fa\",\n    },\n    \"name\": \"DepositContract\",\n  },\n]\n`;\n\nexports[`fetches ABI with multichain deployment 1`] = `\n[\n  {\n    \"abi\": [\n      {\n        \"inputs\": [],\n        \"stateMutability\": \"nonpayable\",\n        \"type\": \"constructor\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"name\": \"pubkey\",\n            \"type\": \"bytes\",\n          },\n          {\n            \"name\": \"withdrawal_credentials\",\n            \"type\": \"bytes\",\n          },\n          {\n            \"name\": \"amount\",\n            \"type\": \"bytes\",\n          },\n          {\n            \"name\": \"signature\",\n            \"type\": \"bytes\",\n          },\n          {\n            \"name\": \"index\",\n            \"type\": \"bytes\",\n          },\n        ],\n        \"name\": \"DepositEvent\",\n        \"type\": \"event\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"name\": \"pubkey\",\n            \"type\": \"bytes\",\n          },\n          {\n            \"name\": \"withdrawal_credentials\",\n            \"type\": \"bytes\",\n          },\n          {\n            \"name\": \"signature\",\n            \"type\": \"bytes\",\n          },\n          {\n            \"name\": \"deposit_data_root\",\n            \"type\": \"bytes32\",\n          },\n        ],\n        \"name\": \"deposit\",\n        \"outputs\": [],\n        \"stateMutability\": \"payable\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"get_deposit_count\",\n        \"outputs\": [\n          {\n            \"type\": \"bytes\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [],\n        \"name\": \"get_deposit_root\",\n        \"outputs\": [\n          {\n            \"type\": \"bytes32\",\n          },\n        ],\n        \"stateMutability\": \"view\",\n        \"type\": \"function\",\n      },\n      {\n        \"inputs\": [\n          {\n            \"name\": \"interfaceId\",\n            \"type\": \"bytes4\",\n          },\n        ],\n        \"name\": \"supportsInterface\",\n        \"outputs\": [\n          {\n            \"type\": \"bool\",\n          },\n        ],\n        \"stateMutability\": \"pure\",\n        \"type\": \"function\",\n      },\n    ],\n    \"address\": {\n      \"100\": \"0xC4c622862a8F548997699bE24EA4bc504e5cA865\",\n      \"137\": \"0xC4c622862a8F548997699bE24EA4bc504e5cA865\",\n    },\n    \"name\": \"Community\",\n  },\n]\n`;\n"
  },
  {
    "path": "packages/cli/src/plugins/actions.test.ts",
    "content": "import { erc20Abi } from 'viem'\nimport { expect, test } from 'vitest'\n\nimport { actions } from './actions.js'\n\ntest('default', async () => {\n  const result = await actions().run?.({\n    contracts: [\n      {\n        name: 'erc20',\n        abi: erc20Abi,\n        content: '',\n        meta: {\n          abiName: 'erc20Abi',\n        },\n      },\n    ],\n    isTypeScript: true,\n    outputs: [],\n  })\n\n  expect(result?.imports).toMatchInlineSnapshot(`\n    \"import { createReadContract, createWriteContract, createSimulateContract, createWatchContractEvent } from '@wagmi/core/codegen'\n    \"\n  `)\n  expect(result?.content).toMatchInlineSnapshot(`\n    \"/**\n     * Wraps __{@link readContract}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const readErc20 = /*#__PURE__*/ createReadContract({ abi: erc20Abi })\n\n    /**\n     * Wraps __{@link readContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"allowance\"\\`\n     */\n    export const readErc20Allowance = /*#__PURE__*/ createReadContract({ abi: erc20Abi, functionName: 'allowance' })\n\n    /**\n     * Wraps __{@link readContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"balanceOf\"\\`\n     */\n    export const readErc20BalanceOf = /*#__PURE__*/ createReadContract({ abi: erc20Abi, functionName: 'balanceOf' })\n\n    /**\n     * Wraps __{@link readContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"decimals\"\\`\n     */\n    export const readErc20Decimals = /*#__PURE__*/ createReadContract({ abi: erc20Abi, functionName: 'decimals' })\n\n    /**\n     * Wraps __{@link readContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"name\"\\`\n     */\n    export const readErc20Name = /*#__PURE__*/ createReadContract({ abi: erc20Abi, functionName: 'name' })\n\n    /**\n     * Wraps __{@link readContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"symbol\"\\`\n     */\n    export const readErc20Symbol = /*#__PURE__*/ createReadContract({ abi: erc20Abi, functionName: 'symbol' })\n\n    /**\n     * Wraps __{@link readContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"totalSupply\"\\`\n     */\n    export const readErc20TotalSupply = /*#__PURE__*/ createReadContract({ abi: erc20Abi, functionName: 'totalSupply' })\n\n    /**\n     * Wraps __{@link writeContract}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const writeErc20 = /*#__PURE__*/ createWriteContract({ abi: erc20Abi })\n\n    /**\n     * Wraps __{@link writeContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"approve\"\\`\n     */\n    export const writeErc20Approve = /*#__PURE__*/ createWriteContract({ abi: erc20Abi, functionName: 'approve' })\n\n    /**\n     * Wraps __{@link writeContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"transfer\"\\`\n     */\n    export const writeErc20Transfer = /*#__PURE__*/ createWriteContract({ abi: erc20Abi, functionName: 'transfer' })\n\n    /**\n     * Wraps __{@link writeContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"transferFrom\"\\`\n     */\n    export const writeErc20TransferFrom = /*#__PURE__*/ createWriteContract({ abi: erc20Abi, functionName: 'transferFrom' })\n\n    /**\n     * Wraps __{@link simulateContract}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const simulateErc20 = /*#__PURE__*/ createSimulateContract({ abi: erc20Abi })\n\n    /**\n     * Wraps __{@link simulateContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"approve\"\\`\n     */\n    export const simulateErc20Approve = /*#__PURE__*/ createSimulateContract({ abi: erc20Abi, functionName: 'approve' })\n\n    /**\n     * Wraps __{@link simulateContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"transfer\"\\`\n     */\n    export const simulateErc20Transfer = /*#__PURE__*/ createSimulateContract({ abi: erc20Abi, functionName: 'transfer' })\n\n    /**\n     * Wraps __{@link simulateContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"transferFrom\"\\`\n     */\n    export const simulateErc20TransferFrom = /*#__PURE__*/ createSimulateContract({ abi: erc20Abi, functionName: 'transferFrom' })\n\n    /**\n     * Wraps __{@link watchContractEvent}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const watchErc20Event = /*#__PURE__*/ createWatchContractEvent({ abi: erc20Abi })\n\n    /**\n     * Wraps __{@link watchContractEvent}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`eventName\\` set to \\`\"Approval\"\\`\n     */\n    export const watchErc20ApprovalEvent = /*#__PURE__*/ createWatchContractEvent({ abi: erc20Abi, eventName: 'Approval' })\n\n    /**\n     * Wraps __{@link watchContractEvent}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`eventName\\` set to \\`\"Transfer\"\\`\n     */\n    export const watchErc20TransferEvent = /*#__PURE__*/ createWatchContractEvent({ abi: erc20Abi, eventName: 'Transfer' })\"\n  `)\n})\n\ntest('address', async () => {\n  const result = await actions().run?.({\n    contracts: [\n      {\n        name: 'erc20',\n        abi: erc20Abi,\n        content: '',\n        meta: {\n          abiName: 'erc20Abi',\n          addressName: 'erc20Address',\n        },\n      },\n    ],\n    isTypeScript: true,\n    outputs: [],\n  })\n\n  expect(result?.content).toMatchInlineSnapshot(`\n    \"/**\n     * Wraps __{@link readContract}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const readErc20 = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address })\n\n    /**\n     * Wraps __{@link readContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"allowance\"\\`\n     */\n    export const readErc20Allowance = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'allowance' })\n\n    /**\n     * Wraps __{@link readContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"balanceOf\"\\`\n     */\n    export const readErc20BalanceOf = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'balanceOf' })\n\n    /**\n     * Wraps __{@link readContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"decimals\"\\`\n     */\n    export const readErc20Decimals = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'decimals' })\n\n    /**\n     * Wraps __{@link readContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"name\"\\`\n     */\n    export const readErc20Name = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'name' })\n\n    /**\n     * Wraps __{@link readContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"symbol\"\\`\n     */\n    export const readErc20Symbol = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'symbol' })\n\n    /**\n     * Wraps __{@link readContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"totalSupply\"\\`\n     */\n    export const readErc20TotalSupply = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'totalSupply' })\n\n    /**\n     * Wraps __{@link writeContract}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const writeErc20 = /*#__PURE__*/ createWriteContract({ abi: erc20Abi, address: erc20Address })\n\n    /**\n     * Wraps __{@link writeContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"approve\"\\`\n     */\n    export const writeErc20Approve = /*#__PURE__*/ createWriteContract({ abi: erc20Abi, address: erc20Address, functionName: 'approve' })\n\n    /**\n     * Wraps __{@link writeContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"transfer\"\\`\n     */\n    export const writeErc20Transfer = /*#__PURE__*/ createWriteContract({ abi: erc20Abi, address: erc20Address, functionName: 'transfer' })\n\n    /**\n     * Wraps __{@link writeContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"transferFrom\"\\`\n     */\n    export const writeErc20TransferFrom = /*#__PURE__*/ createWriteContract({ abi: erc20Abi, address: erc20Address, functionName: 'transferFrom' })\n\n    /**\n     * Wraps __{@link simulateContract}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const simulateErc20 = /*#__PURE__*/ createSimulateContract({ abi: erc20Abi, address: erc20Address })\n\n    /**\n     * Wraps __{@link simulateContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"approve\"\\`\n     */\n    export const simulateErc20Approve = /*#__PURE__*/ createSimulateContract({ abi: erc20Abi, address: erc20Address, functionName: 'approve' })\n\n    /**\n     * Wraps __{@link simulateContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"transfer\"\\`\n     */\n    export const simulateErc20Transfer = /*#__PURE__*/ createSimulateContract({ abi: erc20Abi, address: erc20Address, functionName: 'transfer' })\n\n    /**\n     * Wraps __{@link simulateContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"transferFrom\"\\`\n     */\n    export const simulateErc20TransferFrom = /*#__PURE__*/ createSimulateContract({ abi: erc20Abi, address: erc20Address, functionName: 'transferFrom' })\n\n    /**\n     * Wraps __{@link watchContractEvent}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const watchErc20Event = /*#__PURE__*/ createWatchContractEvent({ abi: erc20Abi, address: erc20Address })\n\n    /**\n     * Wraps __{@link watchContractEvent}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`eventName\\` set to \\`\"Approval\"\\`\n     */\n    export const watchErc20ApprovalEvent = /*#__PURE__*/ createWatchContractEvent({ abi: erc20Abi, address: erc20Address, eventName: 'Approval' })\n\n    /**\n     * Wraps __{@link watchContractEvent}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`eventName\\` set to \\`\"Transfer\"\\`\n     */\n    export const watchErc20TransferEvent = /*#__PURE__*/ createWatchContractEvent({ abi: erc20Abi, address: erc20Address, eventName: 'Transfer' })\"\n  `)\n})\n\ntest('legacy hook names', async () => {\n  const result = await actions({ getActionName: 'legacy' }).run?.({\n    contracts: [\n      {\n        name: 'erc20',\n        abi: erc20Abi,\n        content: '',\n        meta: {\n          abiName: 'erc20Abi',\n          addressName: 'erc20Address',\n        },\n      },\n    ],\n    isTypeScript: true,\n    outputs: [],\n  })\n\n  expect(result?.content).toMatchInlineSnapshot(`\n    \"/**\n     * Wraps __{@link readContract}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const readErc20 = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address })\n\n    /**\n     * Wraps __{@link readContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"allowance\"\\`\n     */\n    export const readErc20Allowance = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'allowance' })\n\n    /**\n     * Wraps __{@link readContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"balanceOf\"\\`\n     */\n    export const readErc20BalanceOf = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'balanceOf' })\n\n    /**\n     * Wraps __{@link readContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"decimals\"\\`\n     */\n    export const readErc20Decimals = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'decimals' })\n\n    /**\n     * Wraps __{@link readContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"name\"\\`\n     */\n    export const readErc20Name = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'name' })\n\n    /**\n     * Wraps __{@link readContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"symbol\"\\`\n     */\n    export const readErc20Symbol = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'symbol' })\n\n    /**\n     * Wraps __{@link readContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"totalSupply\"\\`\n     */\n    export const readErc20TotalSupply = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'totalSupply' })\n\n    /**\n     * Wraps __{@link writeContract}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const writeErc20 = /*#__PURE__*/ createWriteContract({ abi: erc20Abi, address: erc20Address })\n\n    /**\n     * Wraps __{@link writeContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"approve\"\\`\n     */\n    export const writeErc20Approve = /*#__PURE__*/ createWriteContract({ abi: erc20Abi, address: erc20Address, functionName: 'approve' })\n\n    /**\n     * Wraps __{@link writeContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"transfer\"\\`\n     */\n    export const writeErc20Transfer = /*#__PURE__*/ createWriteContract({ abi: erc20Abi, address: erc20Address, functionName: 'transfer' })\n\n    /**\n     * Wraps __{@link writeContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"transferFrom\"\\`\n     */\n    export const writeErc20TransferFrom = /*#__PURE__*/ createWriteContract({ abi: erc20Abi, address: erc20Address, functionName: 'transferFrom' })\n\n    /**\n     * Wraps __{@link simulateContract}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const prepareWriteErc20 = /*#__PURE__*/ createSimulateContract({ abi: erc20Abi, address: erc20Address })\n\n    /**\n     * Wraps __{@link simulateContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"approve\"\\`\n     */\n    export const prepareWriteErc20Approve = /*#__PURE__*/ createSimulateContract({ abi: erc20Abi, address: erc20Address, functionName: 'approve' })\n\n    /**\n     * Wraps __{@link simulateContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"transfer\"\\`\n     */\n    export const prepareWriteErc20Transfer = /*#__PURE__*/ createSimulateContract({ abi: erc20Abi, address: erc20Address, functionName: 'transfer' })\n\n    /**\n     * Wraps __{@link simulateContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"transferFrom\"\\`\n     */\n    export const prepareWriteErc20TransferFrom = /*#__PURE__*/ createSimulateContract({ abi: erc20Abi, address: erc20Address, functionName: 'transferFrom' })\n\n    /**\n     * Wraps __{@link watchContractEvent}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const watchErc20Event = /*#__PURE__*/ createWatchContractEvent({ abi: erc20Abi, address: erc20Address })\n\n    /**\n     * Wraps __{@link watchContractEvent}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`eventName\\` set to \\`\"Approval\"\\`\n     */\n    export const watchErc20ApprovalEvent = /*#__PURE__*/ createWatchContractEvent({ abi: erc20Abi, address: erc20Address, eventName: 'Approval' })\n\n    /**\n     * Wraps __{@link watchContractEvent}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`eventName\\` set to \\`\"Transfer\"\\`\n     */\n    export const watchErc20TransferEvent = /*#__PURE__*/ createWatchContractEvent({ abi: erc20Abi, address: erc20Address, eventName: 'Transfer' })\"\n  `)\n})\n\ntest('override package name', async () => {\n  const result = await actions({ overridePackageName: 'wagmi' }).run?.({\n    contracts: [\n      {\n        name: 'erc20',\n        abi: erc20Abi,\n        content: '',\n        meta: {\n          abiName: 'erc20Abi',\n        },\n      },\n    ],\n    isTypeScript: true,\n    outputs: [],\n  })\n\n  expect(result?.imports).toMatchInlineSnapshot(`\n    \"import { createReadContract, createWriteContract, createSimulateContract, createWatchContractEvent } from 'wagmi/codegen'\n    \"\n  `)\n})\n"
  },
  {
    "path": "packages/cli/src/plugins/actions.ts",
    "content": "import { pascalCase } from 'change-case'\n\nimport type { Contract, Plugin } from '../config.js'\nimport type { Compute, RequiredBy } from '../types.js'\nimport { getAddressDocString } from '../utils/getAddressDocString.js'\nimport { getIsPackageInstalled } from '../utils/packages.js'\n\nexport type ActionsConfig = {\n  getActionName?:\n    | 'legacy' // TODO: Deprecate `'legacy'` option\n    | ((options: {\n        contractName: string\n        itemName?: string | undefined\n        type: 'read' | 'simulate' | 'watch' | 'write'\n      }) => string)\n  overridePackageName?: '@wagmi/core' | 'wagmi' | undefined\n}\n\ntype ActionsResult = Compute<RequiredBy<Plugin, 'run'>>\n\nexport function actions(config: ActionsConfig = {}): ActionsResult {\n  return {\n    name: 'Action',\n    async run({ contracts }) {\n      const imports = new Set<string>([])\n      const content: string[] = []\n      const pure = '/*#__PURE__*/'\n\n      const actionNames = new Set<string>()\n      for (const contract of contracts) {\n        let hasReadFunction = false\n        let hasWriteFunction = false\n        let hasEvent = false\n        const readItems = []\n        const writeItems = []\n        const eventItems = []\n        for (const item of contract.abi) {\n          if (item.type === 'function')\n            if (\n              item.stateMutability === 'view' ||\n              item.stateMutability === 'pure'\n            ) {\n              hasReadFunction = true\n              readItems.push(item)\n            } else {\n              hasWriteFunction = true\n              writeItems.push(item)\n            }\n          else if (item.type === 'event') {\n            hasEvent = true\n            eventItems.push(item)\n          }\n        }\n\n        let innerContent: string\n        if (contract.meta.addressName)\n          innerContent = `abi: ${contract.meta.abiName}, address: ${contract.meta.addressName}`\n        else innerContent = `abi: ${contract.meta.abiName}`\n\n        if (hasReadFunction) {\n          const actionName = getActionName(\n            config,\n            actionNames,\n            'read',\n            contract.name,\n          )\n          const docString = genDocString('readContract', contract)\n          const functionName = 'createReadContract'\n          imports.add(functionName)\n          content.push(\n            `${docString}\nexport const ${actionName} = ${pure} ${functionName}({ ${innerContent} })`,\n          )\n\n          const names = new Set<string>()\n          for (const item of readItems) {\n            if (item.type !== 'function') continue\n            if (\n              item.stateMutability !== 'pure' &&\n              item.stateMutability !== 'view'\n            )\n              continue\n\n            // Skip overrides since they are captured by same hook\n            if (names.has(item.name)) continue\n            names.add(item.name)\n\n            const hookName = getActionName(\n              config,\n              actionNames,\n              'read',\n              contract.name,\n              item.name,\n            )\n            const docString = genDocString('readContract', contract, {\n              name: 'functionName',\n              value: item.name,\n            })\n            content.push(\n              `${docString}\nexport const ${hookName} = ${pure} ${functionName}({ ${innerContent}, functionName: '${item.name}' })`,\n            )\n          }\n        }\n\n        if (hasWriteFunction) {\n          {\n            const actionName = getActionName(\n              config,\n              actionNames,\n              'write',\n              contract.name,\n            )\n            const docString = genDocString('writeContract', contract)\n            const functionName = 'createWriteContract'\n            imports.add(functionName)\n            content.push(\n              `${docString}\nexport const ${actionName} = ${pure} ${functionName}({ ${innerContent} })`,\n            )\n\n            const names = new Set<string>()\n            for (const item of writeItems) {\n              if (item.type !== 'function') continue\n              if (\n                item.stateMutability !== 'nonpayable' &&\n                item.stateMutability !== 'payable'\n              )\n                continue\n\n              // Skip overrides since they are captured by same hook\n              if (names.has(item.name)) continue\n              names.add(item.name)\n\n              const actionName = getActionName(\n                config,\n                actionNames,\n                'write',\n                contract.name,\n                item.name,\n              )\n              const docString = genDocString('writeContract', contract, {\n                name: 'functionName',\n                value: item.name,\n              })\n              content.push(\n                `${docString}\nexport const ${actionName} = ${pure} ${functionName}({ ${innerContent}, functionName: '${item.name}' })`,\n              )\n            }\n          }\n\n          {\n            const actionName = getActionName(\n              config,\n              actionNames,\n              'simulate',\n              contract.name,\n            )\n            const docString = genDocString('simulateContract', contract)\n            const functionName = 'createSimulateContract'\n            imports.add(functionName)\n            content.push(\n              `${docString}\nexport const ${actionName} = ${pure} ${functionName}({ ${innerContent} })`,\n            )\n\n            const names = new Set<string>()\n            for (const item of writeItems) {\n              if (item.type !== 'function') continue\n              if (\n                item.stateMutability !== 'nonpayable' &&\n                item.stateMutability !== 'payable'\n              )\n                continue\n\n              // Skip overrides since they are captured by same hook\n              if (names.has(item.name)) continue\n              names.add(item.name)\n\n              const actionName = getActionName(\n                config,\n                actionNames,\n                'simulate',\n                contract.name,\n                item.name,\n              )\n              const docString = genDocString('simulateContract', contract, {\n                name: 'functionName',\n                value: item.name,\n              })\n              content.push(\n                `${docString}\nexport const ${actionName} = ${pure} ${functionName}({ ${innerContent}, functionName: '${item.name}' })`,\n              )\n            }\n          }\n        }\n\n        if (hasEvent) {\n          const actionName = getActionName(\n            config,\n            actionNames,\n            'watch',\n            contract.name,\n          )\n          const docString = genDocString('watchContractEvent', contract)\n          const functionName = 'createWatchContractEvent'\n          imports.add(functionName)\n          content.push(\n            `${docString}\nexport const ${actionName} = ${pure} ${functionName}({ ${innerContent} })`,\n          )\n\n          const names = new Set<string>()\n          for (const item of eventItems) {\n            if (item.type !== 'event') continue\n\n            // Skip overrides since they are captured by same hook\n            if (names.has(item.name)) continue\n            names.add(item.name)\n\n            const actionName = getActionName(\n              config,\n              actionNames,\n              'watch',\n              contract.name,\n              item.name,\n            )\n            const docString = genDocString('watchContractEvent', contract, {\n              name: 'eventName',\n              value: item.name,\n            })\n            content.push(\n              `${docString}\nexport const ${actionName} = ${pure} ${functionName}({ ${innerContent}, eventName: '${item.name}' })`,\n            )\n          }\n        }\n      }\n\n      const importValues = [...imports.values()]\n\n      let packageName = '@wagmi/core/codegen'\n      if (config.overridePackageName) {\n        switch (config.overridePackageName) {\n          case '@wagmi/core':\n            packageName = '@wagmi/core/codegen'\n            break\n          case 'wagmi':\n            packageName = 'wagmi/codegen'\n            break\n        }\n      } else if (await getIsPackageInstalled({ packageName: 'wagmi' }))\n        packageName = 'wagmi/codegen'\n      else if (await getIsPackageInstalled({ packageName: '@wagmi/core' }))\n        packageName = '@wagmi/core/codegen'\n\n      return {\n        imports: importValues.length\n          ? `import { ${importValues.join(', ')} } from '${packageName}'\\n`\n          : '',\n        content: content.join('\\n\\n'),\n      }\n    },\n  }\n}\n\nfunction genDocString(\n  actionName: string,\n  contract: Contract,\n  item?: { name: string; value: string },\n) {\n  let description = `Wraps __{@link ${actionName}}__ with \\`abi\\` set to __{@link ${contract.meta.abiName}}__`\n  if (item) description += ` and \\`${item.name}\\` set to \\`\"${item.value}\"\\``\n\n  const docString = getAddressDocString({ address: contract.address })\n  if (docString)\n    return `/**\n * ${description}\n * \n ${docString}\n */`\n\n  return `/**\n * ${description}\n */`\n}\n\nfunction getActionName(\n  config: ActionsConfig,\n  actionNames: Set<string>,\n  type: 'read' | 'simulate' | 'watch' | 'write',\n  contractName: string,\n  itemName?: string | undefined,\n) {\n  const ContractName = pascalCase(contractName)\n  const ItemName = itemName ? pascalCase(itemName) : undefined\n\n  let actionName: string\n  if (typeof config.getActionName === 'function')\n    actionName = config.getActionName({\n      type,\n      contractName: ContractName,\n      itemName: ItemName,\n    })\n  else if (typeof config.getActionName === 'string' && type === 'simulate') {\n    actionName = `prepareWrite${ContractName}${ItemName ?? ''}`\n  } else {\n    actionName = `${type}${ContractName}${ItemName ?? ''}`\n    if (type === 'watch') actionName = `${actionName}Event`\n  }\n\n  if (actionNames.has(actionName))\n    throw new Error(\n      `Action name \"${actionName}\" must be unique for contract \"${contractName}\". Try using \\`getActionName\\` to create a unique name.`,\n    )\n\n  actionNames.add(actionName)\n  return actionName\n}\n"
  },
  {
    "path": "packages/cli/src/plugins/blockExplorer.test.ts",
    "content": "import { setupServer } from 'msw/node'\nimport { afterAll, afterEach, beforeAll, expect, test } from 'vitest'\n\nimport {\n  address,\n  apiKey,\n  getHandlers,\n  unverifiedContractAddress,\n} from '../../test/utils.js'\nimport { blockExplorer } from './blockExplorer.js'\n\nconst baseUrl = 'https://api.etherscan.io/v2/api'\nconst server = setupServer(...getHandlers(baseUrl))\n\nbeforeAll(() => server.listen())\nafterEach(() => server.resetHandlers())\nafterAll(() => server.close())\n\ntest('fetches ABI', async () => {\n  await expect(\n    blockExplorer({\n      apiKey,\n      baseUrl,\n      contracts: [{ name: 'WagmiMintExample', address }],\n    }).contracts!(),\n  ).resolves.toMatchSnapshot()\n})\n\ntest('fetches ABI with multichain deployment', async () => {\n  await expect(\n    blockExplorer({\n      apiKey,\n      baseUrl,\n      contracts: [\n        { name: 'WagmiMintExample', address: { 1: address, 10: address } },\n      ],\n    }).contracts?.(),\n  ).resolves.toMatchSnapshot()\n})\n\ntest('fails to fetch for unverified contract', async () => {\n  await expect(\n    blockExplorer({\n      apiKey,\n      baseUrl,\n      contracts: [\n        { name: 'WagmiMintExample', address: unverifiedContractAddress },\n      ],\n    }).contracts?.(),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(\n    '[Error: Contract source code not verified]',\n  )\n})\n"
  },
  {
    "path": "packages/cli/src/plugins/blockExplorer.ts",
    "content": "import { camelCase } from 'change-case'\nimport type { Address } from 'viem'\nimport { z } from 'zod'\n\nimport type { ContractConfig } from '../config.js'\nimport { fromZodError } from '../errors.js'\nimport type { Compute } from '../types.js'\nimport { fetch } from './fetch.js'\n\nexport type BlockExplorerConfig = {\n  /**\n   * API key for block explorer. Appended to the request URL as query param `&apikey=${apiKey}`.\n   */\n  apiKey?: string | undefined\n  /**\n   * Base URL for block explorer.\n   */\n  baseUrl: string\n  /**\n   * Duration in milliseconds to cache ABIs.\n   *\n   * @default 1_800_000 // 30m in ms\n   */\n  cacheDuration?: number | undefined\n  /**\n   * Chain ID for block explorer. Appended to the request URL as query param `&chainId=${chainId}`.\n   */\n  chainId?: number | undefined\n  /**\n   * Contracts to fetch ABIs for.\n   */\n  contracts: Compute<Omit<ContractConfig, 'abi'>>[]\n  /**\n   * Function to get address from contract config.\n   */\n  getAddress?:\n    | ((config: { address: NonNullable<ContractConfig['address']> }) => Address)\n    | undefined\n  /**\n   * Name of source.\n   */\n  name?: ContractConfig['name'] | undefined\n}\n\nconst BlockExplorerResponse = z.discriminatedUnion('status', [\n  z.object({\n    status: z.literal('1'),\n    message: z.literal('OK'),\n    result: z\n      .string()\n      .transform((val) => JSON.parse(val) as ContractConfig['abi']),\n  }),\n  z.object({\n    status: z.literal('0'),\n    message: z.literal('NOTOK'),\n    result: z.string(),\n  }),\n])\n\n/**\n * Fetches contract ABIs from block explorers, supporting `?module=contract&action=getabi` requests.\n */\nexport function blockExplorer(config: BlockExplorerConfig) {\n  const {\n    apiKey,\n    baseUrl,\n    cacheDuration,\n    chainId,\n    contracts,\n    getAddress = ({ address }) => {\n      if (typeof address === 'string') return address\n      return Object.values(address)[0]!\n    },\n    name = 'Block Explorer',\n  } = config\n\n  return fetch({\n    cacheDuration,\n    contracts,\n    name,\n    getCacheKey({ contract }) {\n      if (typeof contract.address === 'string')\n        return `${camelCase(name)}:${contract.address}`\n      return `${camelCase(name)}:${JSON.stringify(contract.address)}`\n    },\n    async parse({ response }) {\n      const json = await response.json()\n      const parsed = await BlockExplorerResponse.safeParseAsync(json)\n      if (!parsed.success)\n        throw fromZodError(parsed.error, { prefix: 'Invalid response' })\n      if (parsed.data.status === '0') throw new Error(parsed.data.result)\n      return parsed.data.result\n    },\n    request({ address }) {\n      if (!address) throw new Error('address is required')\n      return {\n        url: `${baseUrl}?${chainId ? `chainId=${chainId}&` : ''}module=contract&action=getabi&address=${getAddress(\n          {\n            address,\n          },\n        )}${apiKey ? `&apikey=${apiKey}` : ''}`,\n      }\n    },\n  })\n}\n"
  },
  {
    "path": "packages/cli/src/plugins/etherscan.test.ts",
    "content": "import { mkdir, rm } from 'node:fs/promises'\nimport { setupServer } from 'msw/node'\nimport { afterAll, afterEach, beforeAll, expect, test } from 'vitest'\n\nimport {\n  address,\n  apiKey,\n  getHandlers,\n  invalidApiKey,\n  proxyAddress,\n  timeoutAddress,\n  unverifiedContractAddress,\n} from '../../test/utils.js'\nimport { etherscan } from './etherscan.js'\nimport { getCacheDir } from './fetch.js'\n\nconst server = setupServer(...getHandlers())\n\nbeforeAll(() => server.listen())\nafterEach(() => server.resetHandlers())\nafterAll(() => server.close())\n\ntest('fetches ABI', async () => {\n  await expect(\n    etherscan({\n      apiKey,\n      chainId: 1,\n      contracts: [{ name: 'WagmiMintExample', address }],\n    }).contracts?.(),\n  ).resolves.toMatchSnapshot()\n})\n\ntest('fetches ABI with multichain deployment', async () => {\n  await expect(\n    etherscan({\n      apiKey,\n      chainId: 1,\n      contracts: [\n        { name: 'WagmiMintExample', address: { 1: address, 10: address } },\n      ],\n    }).contracts?.(),\n  ).resolves.toMatchSnapshot()\n})\n\ntest('fails to fetch for unverified contract', async () => {\n  await expect(\n    etherscan({\n      apiKey,\n      chainId: 1,\n      contracts: [\n        { name: 'WagmiMintExample', address: unverifiedContractAddress },\n      ],\n    }).contracts?.(),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(\n    '[Error: Contract source code not verified]',\n  )\n})\n\ntest('missing address for chainId', async () => {\n  await expect(\n    etherscan({\n      apiKey,\n      chainId: 1,\n      // @ts-expect-error `chainId` and `keyof typeof contracts[number].address` mismatch\n      contracts: [{ name: 'WagmiMintExample', address: { 10: address } }],\n    }).contracts?.(),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(\n    `[Error: No address found for chainId \"1\". Make sure chainId \"1\" is set as an address.]`,\n  )\n})\n\ntest('invalid api key', async () => {\n  await expect(\n    etherscan({\n      apiKey: invalidApiKey,\n      chainId: 1,\n      contracts: [{ name: 'WagmiMintExample', address: timeoutAddress }],\n    }).contracts?.(),\n  ).rejects.toThrowErrorMatchingInlineSnapshot('[Error: Invalid API Key]')\n})\n\ntest('tryFetchProxyImplementation: fetches ABI', async () => {\n  const cacheDir = getCacheDir()\n  await mkdir(cacheDir, { recursive: true })\n\n  await expect(\n    etherscan({\n      apiKey,\n      chainId: 1,\n      contracts: [{ name: 'WagmiMintExample', address }],\n      tryFetchProxyImplementation: true,\n    }).contracts?.(),\n  ).resolves.toMatchSnapshot()\n\n  await rm(cacheDir, { recursive: true })\n})\n\ntest('tryFetchProxyImplementation: fetches implementation ABI', async () => {\n  const cacheDir = getCacheDir()\n  await mkdir(cacheDir, { recursive: true })\n\n  await expect(\n    etherscan({\n      apiKey,\n      chainId: 1,\n      contracts: [{ name: 'FiatToken', address: proxyAddress }],\n      tryFetchProxyImplementation: true,\n    }).contracts?.(),\n  ).resolves.toMatchSnapshot()\n\n  await rm(cacheDir, { recursive: true })\n})\n"
  },
  {
    "path": "packages/cli/src/plugins/etherscan.ts",
    "content": "import { mkdir, writeFile } from 'node:fs/promises'\nimport { Address as AddressSchema } from 'abitype/zod'\nimport { camelCase } from 'change-case'\nimport { join } from 'pathe'\nimport type { Abi, Address } from 'viem'\nimport { z } from 'zod'\n\nimport type { ContractConfig } from '../config.js'\nimport { fromZodError } from '../errors.js'\nimport type { Compute } from '../types.js'\nimport { fetch, getCacheDir } from './fetch.js'\n\nexport type EtherscanConfig<chainId extends number> = {\n  /**\n   * Etherscan API key.\n   *\n   * Create or manage keys at https://etherscan.io/myapikey\n   */\n  apiKey: string\n  /**\n   * Duration in milliseconds to cache ABIs.\n   *\n   * @default 1_800_000 // 30m in ms\n   */\n  cacheDuration?: number | undefined\n  /**\n   * Chain ID to use for fetching ABI.\n   *\n   * If `address` is an object, `chainId` is used to select the address.\n   *\n   * View supported chains on the [Etherscan docs](https://docs.etherscan.io/etherscan-v2/getting-started/supported-chains).\n   */\n  chainId: (chainId extends ChainId ? chainId : never) | (ChainId & {})\n  /**\n   * Contracts to fetch ABIs for.\n   */\n  contracts: Compute<Omit<ContractConfig<ChainId, chainId>, 'abi'>>[]\n  /**\n   * Whether to try fetching proxy implementation address of the contract\n   *\n   * @default false\n   */\n  tryFetchProxyImplementation?: boolean | undefined\n}\n\n/**\n * Fetches contract ABIs from Etherscan.\n */\nexport function etherscan<chainId extends ChainId>(\n  config: EtherscanConfig<chainId>,\n) {\n  const {\n    apiKey,\n    cacheDuration = 1_800_000,\n    chainId,\n    tryFetchProxyImplementation = false,\n  } = config\n\n  const contracts = config.contracts.map((x) => ({\n    ...x,\n    address:\n      typeof x.address === 'string' ? { [chainId]: x.address } : x.address,\n  })) as Omit<ContractConfig, 'abi'>[]\n\n  const name = 'Etherscan'\n\n  const getCacheKey: Parameters<typeof fetch>[0]['getCacheKey'] = ({\n    contract,\n  }) => {\n    if (typeof contract.address === 'string')\n      return `${camelCase(name)}:${contract.address}`\n    return `${camelCase(name)}:${JSON.stringify(contract.address)}`\n  }\n\n  return fetch({\n    cacheDuration,\n    contracts,\n    name,\n    getCacheKey,\n    async parse({ response }) {\n      const json = await response.json()\n      const parsed = await GetAbiResponse.safeParseAsync(json)\n      if (!parsed.success)\n        throw fromZodError(parsed.error, { prefix: 'Invalid response' })\n      if (parsed.data.status === '0') throw new Error(parsed.data.result)\n      return parsed.data.result\n    },\n    async request(contract) {\n      if (!contract.address) throw new Error('address is required')\n\n      const resolvedAddress = (() => {\n        if (!contract.address) throw new Error('address is required')\n        if (typeof contract.address === 'string') return contract.address\n        const contractAddress = contract.address[chainId]\n        if (!contractAddress)\n          throw new Error(\n            `No address found for chainId \"${chainId}\". Make sure chainId \"${chainId}\" is set as an address.`,\n          )\n        return contractAddress\n      })()\n\n      const options = {\n        address: resolvedAddress,\n        apiKey,\n        chainId,\n      }\n\n      let abi: Abi | undefined\n      const implementationAddress = await (async () => {\n        if (!tryFetchProxyImplementation) return\n        const json = await globalThis\n          .fetch(buildUrl({ ...options, action: 'getsourcecode' }))\n          .then((res) => res.json())\n        const parsed = await GetSourceCodeResponse.safeParseAsync(json)\n        if (!parsed.success)\n          throw fromZodError(parsed.error, { prefix: 'Invalid response' })\n        if (parsed.data.status === '0') throw new Error(parsed.data.result)\n        if (!parsed.data.result[0]) return\n        abi = parsed.data.result[0].ABI\n        return parsed.data.result[0].Implementation as Address\n      })()\n\n      if (abi) {\n        const cacheDir = getCacheDir()\n        await mkdir(cacheDir, { recursive: true })\n        const cacheKey = getCacheKey({ contract })\n        const cacheFilePath = join(cacheDir, `${cacheKey}.json`)\n        await writeFile(\n          cacheFilePath,\n          `${JSON.stringify({ abi, timestamp: Date.now() + cacheDuration }, undefined, 2)}\\n`,\n        )\n      }\n\n      return {\n        url: buildUrl({\n          ...options,\n          action: 'getabi',\n          address: implementationAddress || resolvedAddress,\n        }),\n      }\n    },\n  })\n}\n\nfunction buildUrl(options: {\n  action: 'getabi' | 'getsourcecode'\n  address: Address\n  apiKey: string\n  chainId: ChainId | undefined\n}) {\n  const baseUrl = 'https://api.etherscan.io/v2/api'\n  const { action, address, apiKey, chainId } = options\n  return `${baseUrl}?${chainId ? `chainId=${chainId}&` : ''}module=contract&action=${action}&address=${address}${apiKey ? `&apikey=${apiKey}` : ''}`\n}\n\nconst GetAbiResponse = z.discriminatedUnion('status', [\n  z.object({\n    status: z.literal('1'),\n    message: z.literal('OK'),\n    result: z.string().transform((val) => JSON.parse(val) as Abi),\n  }),\n  z.object({\n    status: z.literal('0'),\n    message: z.literal('NOTOK'),\n    result: z.string(),\n  }),\n])\n\nconst GetSourceCodeResponse = z.discriminatedUnion('status', [\n  z.object({\n    status: z.literal('1'),\n    message: z.literal('OK'),\n    result: z.array(\n      z.discriminatedUnion('Proxy', [\n        z.object({\n          ABI: z.string().transform((val) => JSON.parse(val) as Abi),\n          Implementation: AddressSchema,\n          Proxy: z.literal('1'),\n        }),\n        z.object({\n          ABI: z.string().transform((val) => JSON.parse(val) as Abi),\n          Implementation: z.string(),\n          Proxy: z.literal('0'),\n        }),\n      ]),\n    ),\n  }),\n  z.object({\n    status: z.literal('0'),\n    message: z.literal('NOTOK'),\n    result: z.string(),\n  }),\n])\n\n// Supported chains\n// https://docs.etherscan.io/etherscan-v2/getting-started/supported-chains\ntype ChainId =\n  | 1 // Ethereum Mainnet\n  | 11155111 // Sepolia Testnet\n  | 17000 // Holesky Testnet\n  | 560048 // Hoodi Testnet\n  | 56 // BNB Smart Chain Mainnet\n  | 97 // BNB Smart Chain Testnet\n  | 137 // Polygon Mainnet\n  | 80002 // Polygon Amoy Testnet\n  | 8453 // Base Mainnet\n  | 84532 // Base Sepolia Testnet\n  | 42161 // Arbitrum One Mainnet\n  | 42170 // Arbitrum Nova Mainnet\n  | 421614 // Arbitrum Sepolia Testnet\n  | 59144 // Linea Mainnet\n  | 59141 // Linea Sepolia Testnet\n  | 81457 // Blast Mainnet\n  | 168587773 // Blast Sepolia Testnet\n  | 10 // OP Mainnet\n  | 11155420 // OP Sepolia Testnet\n  | 43114 // Avalanche C-Chain\n  | 43113 // Avalanche Fuji Testnet\n  | 199 // BitTorrent Chain Mainnet\n  | 1029 // BitTorrent Chain Testnet\n  | 42220 // Celo Mainnet\n  | 11142220 // Celo Sepolia Testnet\n  | 25 // Cronos Mainnet\n  | 252 // Fraxtal Mainnet\n  | 2522 // Fraxtal Testnet\n  | 100 // Gnosis\n  | 5000 // Mantle Mainnet\n  | 5003 // Mantle Sepolia Testnet\n  | 43521 // Memecore Testnet\n  | 1284 // Moonbeam Mainnet\n  | 1285 // Moonriver Mainnet\n  | 1287 // Moonbase Alpha Testnet\n  | 204 // opBNB Mainnet\n  | 5611 // opBNB Testnet\n  | 534352 // Scroll Mainnet\n  | 534351 // Scroll Sepolia Testnet\n  | 167000 // Taiko Mainnet\n  | 167012 // Taiko Hoodi\n  | 324 // zkSync Mainnet\n  | 300 // zkSync Sepolia Testnet\n  | 50 // XDC Mainnet\n  | 51 // XDC Apothem Testnet\n  | 33139 // ApeChain Mainnet\n  | 33111 // ApeChain Curtis Testnet\n  | 480 // World Mainnet\n  | 4801 // World Sepolia Testnet\n  | 50104 // Sophon Mainnet\n  | 531050104 // Sophon Sepolia Testnet\n  | 146 // Sonic Mainnet\n  | 14601 // Sonic Testnet\n  | 130 // Unichain Mainnet\n  | 1301 // Unichain Sepolia Testnet\n  | 2741 // Abstract Mainnet\n  | 11124 // Abstract Sepolia Testnet\n  | 80094 // Berachain Mainnet\n  | 80069 // Berachain Bepolia Testnet\n  | 1923 // Swellchain Mainnet\n  | 1924 // Swellchain Testnet\n  | 10143 // Monad Testnet\n  | 999 // HyperEVM Mainnet\n  | 747474 // Katana Mainnet\n  | 737373 // Katana Bokuto\n  | 1329 // Sei Mainnet\n  | 1328 // Sei Testnet\n"
  },
  {
    "path": "packages/cli/src/plugins/fetch.test.ts",
    "content": "import { mkdir, rm, writeFile } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { setupServer } from 'msw/node'\nimport { afterAll, afterEach, beforeAll, expect, test } from 'vitest'\n\nimport {\n  address,\n  apiKey,\n  getHandlers,\n  timeoutAddress,\n  unverifiedContractAddress,\n} from '../../test/utils.js'\nimport { fetch, getCacheDir } from './fetch.js'\n\nconst baseUrl = 'https://api.etherscan.io/v2/api'\nconst server = setupServer(...getHandlers(baseUrl))\n\nbeforeAll(() => server.listen())\nafterEach(() => server.resetHandlers())\nafterAll(() => server.close())\n\ntype Fetch = Parameters<typeof fetch>[0]\nconst request: Fetch['request'] = ({ address }) => {\n  return {\n    url: `${baseUrl}?module=contract&action=getabi&address=${address}&apikey=${apiKey}`,\n  }\n}\nconst parse: Fetch['parse'] = async ({ response }) => {\n  const data = (await response.json()) as\n    | { status: '1'; message: 'OK'; result: string }\n    | { status: '0'; message: 'NOTOK'; result: string }\n  if (data.status === '0') throw new Error(data.result)\n  return JSON.parse(data.result)\n}\n\ntest('fetches ABI', async () => {\n  await expect(\n    fetch({\n      contracts: [{ name: 'WagmiMintExample', address }],\n      request,\n      parse,\n    }).contracts?.(),\n  ).resolves.toMatchSnapshot()\n})\n\ntest('fails to fetch for unverified contract', async () => {\n  await expect(\n    fetch({\n      contracts: [\n        { name: 'WagmiMintExample', address: unverifiedContractAddress },\n      ],\n      request,\n      parse,\n    }).contracts?.(),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(\n    '[Error: Contract source code not verified]',\n  )\n})\n\ntest('aborts request', async () => {\n  await expect(\n    fetch({\n      contracts: [{ name: 'WagmiMintExample', address: timeoutAddress }],\n      request,\n      parse,\n      timeoutDuration: 1_000,\n    }).contracts?.(),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(\n    '[AbortError: This operation was aborted]',\n  )\n})\n\ntest('reads from cache', async () => {\n  const cacheDir = `${homedir}/.wagmi-cli/plugins/fetch/cache`\n  await mkdir(cacheDir, { recursive: true })\n\n  const contract = {\n    name: 'WagmiMintExample',\n    address: timeoutAddress,\n  } as const\n  const cacheKey = JSON.stringify(contract)\n  const cacheFilePath = `${cacheDir}/${cacheKey}.json`\n  await writeFile(\n    cacheFilePath,\n    JSON.stringify(\n      {\n        abi: [\n          {\n            inputs: [],\n            name: 'mint',\n            outputs: [],\n            stateMutability: 'nonpayable',\n            type: 'function',\n          },\n        ],\n        timestamp: Date.now() + 30_000,\n      },\n      null,\n      2,\n    ),\n  )\n\n  await expect(\n    fetch({\n      contracts: [contract],\n      request,\n      parse,\n    }).contracts?.(),\n  ).resolves.toMatchInlineSnapshot(`\n      [\n        {\n          \"abi\": [\n            {\n              \"inputs\": [],\n              \"name\": \"mint\",\n              \"outputs\": [],\n              \"stateMutability\": \"nonpayable\",\n              \"type\": \"function\",\n            },\n          ],\n          \"address\": \"0xecb504d39723b0be0e3a9aa33d646642d1051ee1\",\n          \"name\": \"WagmiMintExample\",\n        },\n      ]\n    `)\n\n  await rm(cacheDir, { recursive: true })\n})\n\ntest('fails and reads from cache', async () => {\n  const cacheDir = getCacheDir()\n  await mkdir(cacheDir, { recursive: true })\n\n  const contract = {\n    name: 'WagmiMintExample',\n    address: timeoutAddress,\n  } as const\n  const cacheKey = JSON.stringify(contract)\n  const cacheFilePath = `${cacheDir}/${cacheKey}.json`\n  await writeFile(\n    cacheFilePath,\n    JSON.stringify(\n      {\n        abi: [\n          {\n            inputs: [],\n            name: 'mint',\n            outputs: [],\n            stateMutability: 'nonpayable',\n            type: 'function',\n          },\n        ],\n        timestamp: Date.now() - 30_000,\n      },\n      null,\n      2,\n    ),\n  )\n\n  await expect(\n    fetch({\n      contracts: [contract],\n      request,\n      parse,\n      timeoutDuration: 1,\n    }).contracts?.(),\n  ).resolves.toMatchInlineSnapshot(`\n      [\n        {\n          \"abi\": [\n            {\n              \"inputs\": [],\n              \"name\": \"mint\",\n              \"outputs\": [],\n              \"stateMutability\": \"nonpayable\",\n              \"type\": \"function\",\n            },\n          ],\n          \"address\": \"0xecb504d39723b0be0e3a9aa33d646642d1051ee1\",\n          \"name\": \"WagmiMintExample\",\n        },\n      ]\n    `)\n\n  await rm(cacheDir, { recursive: true })\n})\n"
  },
  {
    "path": "packages/cli/src/plugins/fetch.ts",
    "content": "import { mkdir, readFile, writeFile } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { join } from 'pathe'\n\nimport type { Abi } from 'viem'\nimport type { ContractConfig, Plugin } from '../config.js'\nimport type { Compute, RequiredBy } from '../types.js'\n\nexport type FetchConfig = {\n  /**\n   * Duration in milliseconds to cache ABIs from request.\n   *\n   * @default 1_800_000 // 30m in ms\n   */\n  cacheDuration?: number | undefined\n  /**\n   * Contracts to fetch ABIs for.\n   */\n  contracts: Compute<Omit<ContractConfig, 'abi'>>[]\n  /**\n   * Function for creating a cache key for contract.\n   */\n  getCacheKey?:\n    | ((config: { contract: Compute<Omit<ContractConfig, 'abi'>> }) => string)\n    | undefined\n  /**\n   * Name of source.\n   */\n  name?: ContractConfig['name'] | undefined\n  /**\n   * Function for parsing ABI from fetch response.\n   *\n   * @default ({ response }) => response.json()\n   */\n  parse?:\n    | ((config: {\n        response: Response\n      }) => ContractConfig['abi'] | Promise<ContractConfig['abi']>)\n    | undefined\n  /**\n   * Function for returning a request to fetch ABI from.\n   */\n  request: (config: {\n    address?: ContractConfig['address'] | undefined\n    name: ContractConfig['name']\n  }) =>\n    | { url: RequestInfo; init?: RequestInit | undefined }\n    | Promise<{ url: RequestInfo; init?: RequestInit | undefined }>\n  /**\n   * Duration in milliseconds before request times out.\n   *\n   * @default 5_000 // 5s in ms\n   */\n  timeoutDuration?: number | undefined\n}\n\ntype FetchResult = Compute<RequiredBy<Plugin, 'contracts'>>\n\n/** Fetches and parses contract ABIs from network resource with `fetch`. */\nexport function fetch(config: FetchConfig): FetchResult {\n  const {\n    cacheDuration = 1_800_000,\n    contracts: contractConfigs,\n    getCacheKey = ({ contract }) => JSON.stringify(contract),\n    name = 'Fetch',\n    parse = ({ response }) => response.json(),\n    request,\n    timeoutDuration = 5_000,\n  } = config\n\n  return {\n    async contracts() {\n      const cacheDir = getCacheDir()\n      await mkdir(cacheDir, { recursive: true })\n\n      const timestamp = Date.now() + cacheDuration\n      const contracts = []\n      for (const contract of contractConfigs) {\n        const cacheKey = getCacheKey({ contract })\n        const cacheFilePath = join(cacheDir, `${cacheKey}.json`)\n        const cachedFile = JSON.parse(\n          await readFile(cacheFilePath, 'utf8').catch(() => 'null'),\n        )\n\n        let abi: Abi | undefined\n        if (cachedFile?.timestamp > Date.now()) abi = cachedFile.abi\n        else {\n          const controller = new globalThis.AbortController()\n          const timeout = setTimeout(() => controller.abort(), timeoutDuration)\n          try {\n            const { url, init } = await request(contract)\n            const response = await globalThis.fetch(url, {\n              ...init,\n              signal: controller.signal,\n            })\n            clearTimeout(timeout)\n\n            abi = await parse({ response })\n            await writeFile(\n              cacheFilePath,\n              `${JSON.stringify({ abi, timestamp }, undefined, 2)}\\n`,\n            )\n          } catch (error) {\n            clearTimeout(timeout)\n            try {\n              // Attempt to read from cache if fetch fails.\n              abi = JSON.parse(await readFile(cacheFilePath, 'utf8')).abi\n            } catch {}\n            if (!abi) throw error\n          }\n        }\n\n        if (!abi) throw Error('Failed to fetch ABI for contract.')\n        contracts.push({ abi, address: contract.address, name: contract.name })\n      }\n      return contracts\n    },\n    name,\n  }\n}\n\nexport function getCacheDir() {\n  return join(homedir(), '.wagmi-cli/plugins/fetch/cache')\n}\n"
  },
  {
    "path": "packages/cli/src/plugins/foundry.test.ts",
    "content": "import fs from 'node:fs/promises'\nimport fixtures from 'fixturez'\nimport { dirname, resolve } from 'pathe'\nimport { afterEach, expect, test, vi } from 'vitest'\n\nimport { foundry } from './foundry.js'\n\nconst f = fixtures(__dirname)\n\nafterEach(() => {\n  vi.restoreAllMocks()\n})\n\ntest('forge not installed', async () => {\n  const dir = f.temp()\n  await expect(\n    foundry({\n      project: dir,\n      forge: {\n        path: '/path/to/forge',\n      },\n    }).validate?.(),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [Error: forge must be installed to use Foundry plugin.\n    To install, follow the instructions at https://book.getfoundry.sh/getting-started/installation]\n  `)\n})\n\ntest('project does not exist', async () => {\n  const dir = f.temp()\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  try {\n    await foundry({ project: '../path/to/project' }).validate?.()\n  } catch (error) {\n    expect(\n      (error as Error).message.replace(dirname(dir), '..'),\n    ).toMatchInlineSnapshot('\"Foundry project ../path/to/project not found.\"')\n  }\n})\n\ntest('validates without project', async () => {\n  const dir = resolve(__dirname, '__fixtures__/foundry/')\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  await expect(foundry().validate?.()).resolves.toBeUndefined()\n})\n\ntest('contracts', async () => {\n  await expect(\n    foundry({\n      project: resolve(__dirname, '__fixtures__/foundry/'),\n      exclude: ['Foo.sol/**'],\n    }).contracts?.(),\n  ).resolves.toMatchInlineSnapshot(`\n      [\n        {\n          \"abi\": [\n            {\n              \"inputs\": [],\n              \"name\": \"increment\",\n              \"outputs\": [],\n              \"stateMutability\": \"nonpayable\",\n              \"type\": \"function\",\n            },\n            {\n              \"inputs\": [],\n              \"name\": \"number\",\n              \"outputs\": [\n                {\n                  \"internalType\": \"uint256\",\n                  \"name\": \"\",\n                  \"type\": \"uint256\",\n                },\n              ],\n              \"stateMutability\": \"view\",\n              \"type\": \"function\",\n            },\n            {\n              \"inputs\": [\n                {\n                  \"internalType\": \"uint256\",\n                  \"name\": \"newNumber\",\n                  \"type\": \"uint256\",\n                },\n              ],\n              \"name\": \"setNumber\",\n              \"outputs\": [],\n              \"stateMutability\": \"nonpayable\",\n              \"type\": \"function\",\n            },\n          ],\n          \"address\": undefined,\n          \"name\": \"Counter\",\n        },\n      ]\n    `)\n})\n\ntest('contracts without project', async () => {\n  const dir = resolve(__dirname, '__fixtures__/foundry/')\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  await expect(\n    foundry({\n      exclude: ['Foo.sol/**'],\n    }).contracts?.(),\n  ).resolves.toMatchInlineSnapshot(`\n      [\n        {\n          \"abi\": [\n            {\n              \"inputs\": [],\n              \"name\": \"increment\",\n              \"outputs\": [],\n              \"stateMutability\": \"nonpayable\",\n              \"type\": \"function\",\n            },\n            {\n              \"inputs\": [],\n              \"name\": \"number\",\n              \"outputs\": [\n                {\n                  \"internalType\": \"uint256\",\n                  \"name\": \"\",\n                  \"type\": \"uint256\",\n                },\n              ],\n              \"stateMutability\": \"view\",\n              \"type\": \"function\",\n            },\n            {\n              \"inputs\": [\n                {\n                  \"internalType\": \"uint256\",\n                  \"name\": \"newNumber\",\n                  \"type\": \"uint256\",\n                },\n              ],\n              \"name\": \"setNumber\",\n              \"outputs\": [],\n              \"stateMutability\": \"nonpayable\",\n              \"type\": \"function\",\n            },\n          ],\n          \"address\": undefined,\n          \"name\": \"Counter\",\n        },\n      ]\n    `)\n})\n\ntest('broadcast deployments', async () => {\n  const dir = f.temp()\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  const broadcastDir = resolve(dir, 'broadcast')\n  const scriptDir = resolve(broadcastDir, 'Deploy.s.sol')\n  const chainDir = resolve(scriptDir, '1')\n  await fs.mkdir(chainDir, { recursive: true })\n  const broadcastContent = {\n    transactions: [\n      {\n        transactionType: 'CREATE',\n        contractName: 'Counter',\n        contractAddress: '0x1234567890123456789012345678901234567890',\n        additionalContracts: [\n          {\n            contractName: 'Library',\n            contractAddress: '0x0987654321098765432109876543210987654321',\n          },\n        ],\n      },\n    ],\n  }\n  await fs.writeFile(\n    resolve(chainDir, 'run-latest.json'),\n    JSON.stringify(broadcastContent, null, 2),\n  )\n\n  const artifactsDir = resolve(dir, 'out')\n  await fs.mkdir(artifactsDir, { recursive: true })\n  const counterArtifact = {\n    abi: [\n      {\n        inputs: [],\n        name: 'increment',\n        outputs: [],\n        stateMutability: 'nonpayable',\n        type: 'function',\n      },\n    ],\n  }\n  const libraryArtifact = {\n    abi: [\n      {\n        inputs: [],\n        name: 'helper',\n        outputs: [],\n        stateMutability: 'pure',\n        type: 'function',\n      },\n    ],\n  }\n  await fs.writeFile(\n    resolve(artifactsDir, 'Counter.json'),\n    JSON.stringify(counterArtifact, null, 2),\n  )\n  await fs.writeFile(\n    resolve(artifactsDir, 'Library.json'),\n    JSON.stringify(libraryArtifact, null, 2),\n  )\n\n  await expect(\n    foundry({\n      includeBroadcasts: true,\n    }).contracts?.(),\n  ).resolves.toMatchInlineSnapshot(`\n      [\n        {\n          \"abi\": [\n            {\n              \"inputs\": [],\n              \"name\": \"increment\",\n              \"outputs\": [],\n              \"stateMutability\": \"nonpayable\",\n              \"type\": \"function\",\n            },\n          ],\n          \"address\": {\n            \"1\": \"0x1234567890123456789012345678901234567890\",\n          },\n          \"name\": \"Counter\",\n        },\n        {\n          \"abi\": [\n            {\n              \"inputs\": [],\n              \"name\": \"helper\",\n              \"outputs\": [],\n              \"stateMutability\": \"pure\",\n              \"type\": \"function\",\n            },\n          ],\n          \"address\": {\n            \"1\": \"0x0987654321098765432109876543210987654321\",\n          },\n          \"name\": \"Library\",\n        },\n      ]\n    `)\n})\n\ntest('broadcast deployments filters CALL transactions', async () => {\n  const dir = f.temp()\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  const broadcastDir = resolve(dir, 'broadcast')\n  const scriptDir = resolve(broadcastDir, 'Deploy.s.sol')\n  const chainDir = resolve(scriptDir, '1')\n  await fs.mkdir(chainDir, { recursive: true })\n  const broadcastContent = {\n    transactions: [\n      {\n        transactionType: 'CREATE',\n        contractName: 'Counter',\n        contractAddress: '0x1234567890123456789012345678901234567890',\n        additionalContracts: [],\n      },\n      {\n        transactionType: 'CALL',\n        contractName: 'CalledContract',\n        contractAddress: '0xCCCC000000000000000000000000000000000000',\n        additionalContracts: [],\n      },\n      {\n        transactionType: 'CREATE2',\n        contractName: 'Factory',\n        contractAddress: '0xFFFF000000000000000000000000000000000000',\n        additionalContracts: [],\n      },\n    ],\n  }\n  await fs.writeFile(\n    resolve(chainDir, 'run-latest.json'),\n    JSON.stringify(broadcastContent, null, 2),\n  )\n\n  const artifactsDir = resolve(dir, 'out')\n  await fs.mkdir(artifactsDir, { recursive: true })\n  const counterArtifact = {\n    abi: [\n      {\n        inputs: [],\n        name: 'increment',\n        outputs: [],\n        stateMutability: 'nonpayable',\n        type: 'function',\n      },\n    ],\n  }\n  const factoryArtifact = {\n    abi: [\n      {\n        inputs: [],\n        name: 'deploy',\n        outputs: [],\n        stateMutability: 'nonpayable',\n        type: 'function',\n      },\n    ],\n  }\n  await fs.writeFile(\n    resolve(artifactsDir, 'Counter.json'),\n    JSON.stringify(counterArtifact, null, 2),\n  )\n  await fs.writeFile(\n    resolve(artifactsDir, 'Factory.json'),\n    JSON.stringify(factoryArtifact, null, 2),\n  )\n\n  const result = await foundry({\n    includeBroadcasts: true,\n  }).contracts?.()\n\n  const counter = result?.find((c) => c.name === 'Counter')\n  expect(counter?.address).toEqual({\n    '1': '0x1234567890123456789012345678901234567890',\n  })\n\n  const calledContract = result?.find((c) => c.name === 'CalledContract')\n  expect(calledContract).toBeUndefined()\n\n  const factory = result?.find((c) => c.name === 'Factory')\n  expect(factory?.address).toEqual({\n    '1': '0xFFFF000000000000000000000000000000000000',\n  })\n})\n\ntest('watch callbacks use broadcast deployments', async () => {\n  const dir = f.temp()\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  const broadcastDir = resolve(dir, 'broadcast')\n  const scriptDir = resolve(broadcastDir, 'Deploy.s.sol')\n  const chainDir = resolve(scriptDir, '1')\n  await fs.mkdir(chainDir, { recursive: true })\n  const broadcastContent = {\n    transactions: [\n      {\n        transactionType: 'CREATE',\n        contractName: 'Counter',\n        contractAddress: '0x1234567890123456789012345678901234567890',\n        additionalContracts: [],\n      },\n    ],\n  }\n  await fs.writeFile(\n    resolve(chainDir, 'run-latest.json'),\n    JSON.stringify(broadcastContent, null, 2),\n  )\n\n  const artifactsDir = resolve(dir, 'out')\n  await fs.mkdir(artifactsDir, { recursive: true })\n  const counterArtifact = {\n    abi: [\n      {\n        inputs: [],\n        name: 'increment',\n        outputs: [],\n        stateMutability: 'nonpayable',\n        type: 'function',\n      },\n    ],\n  }\n  await fs.writeFile(\n    resolve(artifactsDir, 'Counter.json'),\n    JSON.stringify(counterArtifact, null, 2),\n  )\n\n  const plugin = foundry({\n    includeBroadcasts: true,\n  })\n\n  await plugin.contracts?.()\n\n  const artifactPath = resolve(artifactsDir, 'Counter.json')\n  const contract = await plugin.watch.onChange?.(artifactPath)\n\n  expect(contract).toMatchObject({\n    name: 'Counter',\n    address: {\n      '1': '0x1234567890123456789012345678901234567890',\n    },\n  })\n})\n"
  },
  {
    "path": "packages/cli/src/plugins/foundry.ts",
    "content": "import { execSync, spawn, spawnSync } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { readFile } from 'node:fs/promises'\nimport dedent from 'dedent'\nimport { fdir } from 'fdir'\nimport { basename, extname, join, resolve } from 'pathe'\nimport pc from 'picocolors'\nimport { z } from 'zod'\n\nimport type { ContractConfig, Plugin } from '../config.js'\nimport * as logger from '../logger.js'\nimport type { Compute, RequiredBy } from '../types.js'\n\nexport const foundryDefaultExcludes = [\n  'Base.sol/**',\n  'Common.sol/**',\n  'Components.sol/**',\n  'IERC165.sol/**',\n  'IERC20.sol/**',\n  'IERC721.sol/**',\n  'IMulticall2.sol/**',\n  'MockERC20.sol/**',\n  'MockERC721.sol/**',\n  'Script.sol/**',\n  'StdAssertions.sol/**',\n  'StdChains.sol/**',\n  'StdCheats.sol/**',\n  'StdError.sol/**',\n  'StdInvariant.sol/**',\n  'StdJson.sol/**',\n  'StdMath.sol/**',\n  'StdStorage.sol/**',\n  'StdStyle.sol/**',\n  'StdToml.sol/**',\n  'StdUtils.sol/**',\n  'Test.sol/**',\n  'Vm.sol/**',\n  'build-info/**',\n  'console.sol/**',\n  'console2.sol/**',\n  'safeconsole.sol/**',\n  '**.s.sol/*.json',\n  '**.t.sol/*.json',\n]\n\nexport type FoundryConfig = {\n  /**\n   * Project's artifacts directory.\n   *\n   * Same as your project's `--out` (`-o`) option.\n   *\n   * @default foundry.config#out | 'out'\n   */\n  artifacts?: string | undefined\n  /**\n   * Set contracts in `run-latest.json` files in the `broadcast/` directory as deployments.\n   *\n   * @dev broadcast deployments can be overridden by including the contract in the deployments mapping.\n   *\n   * @default false\n   */\n  includeBroadcasts?: boolean | undefined\n  /** Mapping of addresses to attach to artifacts. */\n  deployments?: { [key: string]: ContractConfig['address'] } | undefined\n  /** Artifact files to exclude. */\n  exclude?: string[] | undefined\n  /** [Forge](https://book.getfoundry.sh/forge) configuration */\n  forge?:\n    | {\n        /**\n         * Remove build artifacts and cache directories on start up.\n         *\n         * @default false\n         */\n        clean?: boolean | undefined\n        /**\n         * Build Foundry project before fetching artifacts.\n         *\n         * @default true\n         */\n        build?: boolean | undefined\n        /**\n         * Path to `forge` executable command\n         *\n         * @default \"forge\"\n         */\n        path?: string | undefined\n        /**\n         * Rebuild every time a watched file or directory is changed.\n         *\n         * @default true\n         */\n        rebuild?: boolean | undefined\n      }\n    | undefined\n  /** Artifact files to include. */\n  include?: string[] | undefined\n  /** Optional prefix to prepend to artifact names. */\n  namePrefix?: string | undefined\n  /** Path to foundry project. */\n  project?: string | undefined\n}\n\ntype FoundryResult = Compute<\n  RequiredBy<Plugin, 'contracts' | 'validate' | 'watch'>\n>\n\nconst FoundryConfigSchema = z.object({\n  out: z.string().default('out'),\n  src: z.string().default('src'),\n})\n\n/** Resolves ABIs from [Foundry](https://github.com/foundry-rs/foundry) project. */\nexport function foundry(config: FoundryConfig = {}): FoundryResult {\n  const {\n    artifacts,\n    includeBroadcasts = false,\n    deployments = {},\n    exclude = foundryDefaultExcludes,\n    forge: {\n      clean = false,\n      build = true,\n      path: forgeExecutable = 'forge',\n      rebuild = true,\n    } = {},\n    include = ['*.json'],\n    namePrefix = '',\n  } = config\n\n  let allDeployments: { [key: string]: ContractConfig['address'] } = deployments\n\n  function getContractName(artifactPath: string, usePrefix = true) {\n    const filename = basename(artifactPath)\n    const extension = extname(artifactPath)\n    return `${usePrefix ? namePrefix : ''}${filename.replace(extension, '')}`\n  }\n\n  async function getContract(\n    artifactPath: string,\n    contractDeployments: {\n      [key: string]: ContractConfig['address']\n    } = allDeployments,\n  ) {\n    const artifact = await JSON.parse(await readFile(artifactPath, 'utf8'))\n    return {\n      abi: artifact.abi,\n      address: contractDeployments[getContractName(artifactPath, false)],\n      name: getContractName(artifactPath),\n    }\n  }\n\n  function getArtifactPaths(artifactsDirectory: string) {\n    const crawler = new fdir().withBasePath().globWithOptions(\n      include.map((x) => `${artifactsDirectory}/**/${x}`),\n      {\n        dot: true,\n        ignore: exclude.map((x) => `${artifactsDirectory}/**/${x}`),\n      },\n    )\n    return crawler.crawl(artifactsDirectory).withPromise()\n  }\n\n  async function getBroadcastDeployments(broadcastDirectory: string) {\n    const deployments: { [key: string]: Record<number, string> } = {}\n\n    const crawler = new fdir()\n      .withBasePath()\n      .glob('**/run-latest.json')\n      .filter((path) => path.includes('/broadcast/'))\n    const broadcastFiles = await crawler.crawl(broadcastDirectory).withPromise()\n    for (const broadcastFile of broadcastFiles) {\n      try {\n        const broadcast = JSON.parse(await readFile(broadcastFile, 'utf8'))\n\n        // Extract chainId from path: broadcast/.../[chainId]/run-latest.json\n        const pathParts = broadcastFile.split('/')\n        const chainIdPart = pathParts[pathParts.length - 2]\n        if (!chainIdPart) continue\n        const chainId = Number.parseInt(chainIdPart, 10)\n        if (Number.isNaN(chainId)) continue\n\n        const transactions = broadcast.transactions || []\n        for (const tx of transactions) {\n          if (\n            tx.transactionType !== 'CREATE' &&\n            tx.transactionType !== 'CREATE2'\n          )\n            continue\n          if (tx.contractName && tx.contractAddress) {\n            const contractName = tx.contractName\n            const contractAddress = tx.contractAddress\n            if (!deployments[contractName]) {\n              deployments[contractName] = {}\n            }\n            deployments[contractName][chainId] = contractAddress\n          }\n          const additionalContracts = tx.additionalContracts || []\n          for (const additional of additionalContracts) {\n            if (additional.contractName && additional.contractAddress) {\n              const contractName = additional.contractName\n              const contractAddress = additional.contractAddress\n              if (!deployments[contractName]) {\n                deployments[contractName] = {}\n              }\n              deployments[contractName][chainId] = contractAddress\n            }\n          }\n        }\n      } catch (error) {\n        logger.warn(\n          `Failed to parse broadcast file ${broadcastFile}: ${(error as Error).message}`,\n        )\n      }\n    }\n\n    return deployments\n  }\n\n  const project = resolve(process.cwd(), config.project ?? '')\n\n  let foundryConfig: z.infer<typeof FoundryConfigSchema> = {\n    out: 'out',\n    src: 'src',\n  }\n  try {\n    const result = spawnSync(\n      forgeExecutable,\n      ['config', '--json', '--root', project],\n      {\n        encoding: 'utf-8',\n        shell: true,\n      },\n    )\n    if (result.error) throw result.error\n    if (result.status !== 0)\n      throw new Error(`Failed with code ${result.status}`)\n    if (result.signal) throw new Error('Process terminated by signal')\n    foundryConfig = FoundryConfigSchema.parse(JSON.parse(result.stdout))\n  } catch {\n  } finally {\n    foundryConfig = {\n      ...foundryConfig,\n      out: artifacts ?? foundryConfig.out,\n    }\n  }\n\n  const artifactsDirectory = join(project, foundryConfig.out)\n\n  return {\n    async contracts() {\n      if (clean)\n        execSync(`${forgeExecutable} clean --root ${project}`, {\n          encoding: 'utf-8',\n          stdio: 'pipe',\n        })\n      if (build)\n        execSync(`${forgeExecutable} build --root ${project}`, {\n          encoding: 'utf-8',\n          stdio: 'pipe',\n        })\n      if (!existsSync(artifactsDirectory))\n        throw new Error('Artifacts not found.')\n      if (includeBroadcasts) {\n        const broadcastDeployments = Object.fromEntries(\n          Object.entries(await getBroadcastDeployments(project)).map(\n            ([contractName, chainAddresses]) => [\n              contractName,\n              chainAddresses as ContractConfig['address'],\n            ],\n          ),\n        )\n        allDeployments = { ...broadcastDeployments, ...deployments }\n      }\n      const artifactPaths = await getArtifactPaths(artifactsDirectory)\n      const contracts = []\n      for (const artifactPath of artifactPaths) {\n        const contract = await getContract(artifactPath, allDeployments)\n        if (!contract.abi?.length) continue\n        contracts.push(contract)\n      }\n      return contracts\n    },\n    name: 'Foundry',\n    async validate() {\n      // Check that project directory exists\n      if (!existsSync(project))\n        throw new Error(`Foundry project ${pc.gray(config.project)} not found.`)\n\n      // Ensure forge is installed\n      if (clean || build || rebuild)\n        try {\n          execSync(`${forgeExecutable} --version`, {\n            encoding: 'utf-8',\n            stdio: 'pipe',\n          })\n        } catch (_error) {\n          throw new Error(dedent`\n            forge must be installed to use Foundry plugin.\n            To install, follow the instructions at https://book.getfoundry.sh/getting-started/installation\n          `)\n        }\n    },\n    watch: {\n      command: rebuild\n        ? async () => {\n            logger.log(\n              `${pc.magenta('Foundry')} Watching project at ${pc.gray(\n                project,\n              )}`,\n            )\n            const subprocess = spawn(forgeExecutable, [\n              'build',\n              '--watch',\n              '--root',\n              project,\n            ])\n            subprocess.stdout?.on('data', (data) => {\n              process.stdout.write(`${pc.magenta('Foundry')} ${data}`)\n            })\n\n            process.once('SIGINT', shutdown)\n            process.once('SIGTERM', shutdown)\n            function shutdown() {\n              subprocess?.kill()\n            }\n          }\n        : undefined,\n      paths: [\n        ...include.map((x) => `${artifactsDirectory}/**/${x}`),\n        ...exclude.map((x) => `!${artifactsDirectory}/**/${x}`),\n      ],\n      async onAdd(path) {\n        return getContract(path)\n      },\n      async onChange(path) {\n        return getContract(path)\n      },\n      async onRemove(path) {\n        return getContractName(path)\n      },\n    },\n  }\n}\n"
  },
  {
    "path": "packages/cli/src/plugins/hardhat.test.ts",
    "content": "import fixtures from 'fixturez'\nimport { dirname, resolve } from 'pathe'\nimport { afterEach, expect, test, vi } from 'vitest'\n\nimport { hardhat } from './hardhat.js'\n\nconst f = fixtures(__dirname)\n\nafterEach(() => {\n  vi.restoreAllMocks()\n})\n\ntest('validate', async () => {\n  const temp = f.temp()\n  await expect(\n    hardhat({ project: temp }).validate?.(),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(\n    '[Error: hardhat must be installed to use Hardhat plugin.]',\n  )\n})\n\ntest('project does not exist', async () => {\n  const dir = f.temp()\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  try {\n    await hardhat({ project: '../path/to/project' }).validate?.()\n  } catch (error) {\n    expect(\n      (error as Error).message.replace(dirname(dir), '..'),\n    ).toMatchInlineSnapshot('\"Hardhat project ../path/to/project not found.\"')\n  }\n})\n\ntest('contracts', async () => {\n  await expect(\n    hardhat({\n      project: resolve(__dirname, '__fixtures__/hardhat/'),\n      exclude: ['Foo.sol/**'],\n    }).contracts?.(),\n  ).resolves.toMatchInlineSnapshot(`\n      [\n        {\n          \"abi\": [\n            {\n              \"inputs\": [],\n              \"name\": \"increment\",\n              \"outputs\": [],\n              \"stateMutability\": \"nonpayable\",\n              \"type\": \"function\",\n            },\n            {\n              \"inputs\": [],\n              \"name\": \"number\",\n              \"outputs\": [\n                {\n                  \"internalType\": \"uint256\",\n                  \"name\": \"\",\n                  \"type\": \"uint256\",\n                },\n              ],\n              \"stateMutability\": \"view\",\n              \"type\": \"function\",\n            },\n            {\n              \"inputs\": [\n                {\n                  \"internalType\": \"uint256\",\n                  \"name\": \"newNumber\",\n                  \"type\": \"uint256\",\n                },\n              ],\n              \"name\": \"setNumber\",\n              \"outputs\": [],\n              \"stateMutability\": \"nonpayable\",\n              \"type\": \"function\",\n            },\n          ],\n          \"address\": undefined,\n          \"name\": \"Counter\",\n        },\n      ]\n    `)\n}, 10_000)\n"
  },
  {
    "path": "packages/cli/src/plugins/hardhat.ts",
    "content": "import { execSync, spawn } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { readFile } from 'node:fs/promises'\nimport { fdir } from 'fdir'\nimport { basename, extname, join, resolve } from 'pathe'\nimport pc from 'picocolors'\n\nimport type { ContractConfig, Plugin } from '../config.js'\nimport * as logger from '../logger.js'\nimport type { Compute, RequiredBy } from '../types.js'\nimport { getIsPackageInstalled, getPackageManager } from '../utils/packages.js'\n\nexport const hardhatDefaultExcludes = ['build-info/**', '*.dbg.json']\n\nexport type HardhatConfig = {\n  /**\n   * Project's artifacts directory.\n   *\n   * Same as your project's `artifacts` [path configuration](https://hardhat.org/hardhat-runner/docs/config#path-configuration) option.\n   *\n   * @default 'artifacts/'\n   */\n  artifacts?: string | undefined\n  /** Mapping of addresses to attach to artifacts. */\n  deployments?: { [key: string]: ContractConfig['address'] } | undefined\n  /** Artifact files to exclude. */\n  exclude?: string[] | undefined\n  /** Commands to run */\n  commands?:\n    | {\n        /**\n         * Remove build artifacts and cache directories on start up.\n         *\n         * @default `${packageManger} hardhat clean`\n         */\n        clean?: string | boolean | undefined\n        /**\n         * Build Hardhat project before fetching artifacts.\n         *\n         * @default `${packageManger} hardhat compile`\n         */\n        build?: string | boolean | undefined\n        /**\n         * Command to run when watched file or directory is changed.\n         *\n         * @default `${packageManger} hardhat compile`\n         */\n        rebuild?: string | boolean | undefined\n      }\n    | undefined\n  /** Artifact files to include. */\n  include?: string[] | undefined\n  /** Optional prefix to prepend to artifact names. */\n  namePrefix?: string | undefined\n  /** Path to Hardhat project. */\n  project: string\n  /**\n   * Project's artifacts directory.\n   *\n   * Same as your project's `sources` [path configuration](https://hardhat.org/hardhat-runner/docs/config#path-configuration) option.\n   *\n   * @default 'contracts/'\n   */\n  sources?: string | undefined\n}\n\ntype HardhatResult = Compute<\n  RequiredBy<Plugin, 'contracts' | 'validate' | 'watch'>\n>\n\n/** Resolves ABIs from [Hardhat](https://github.com/NomicFoundation/hardhat) project. */\nexport function hardhat(config: HardhatConfig): HardhatResult {\n  const {\n    artifacts = 'artifacts',\n    deployments = {},\n    exclude = hardhatDefaultExcludes,\n    commands = {},\n    include = ['*.json'],\n    namePrefix = '',\n    sources = 'contracts',\n  } = config\n\n  function getContractName(artifact: { contractName: string }) {\n    return `${namePrefix}${artifact.contractName}`\n  }\n\n  async function getContract(artifactPath: string) {\n    const artifact = await JSON.parse(await readFile(artifactPath, 'utf8'))\n    return {\n      abi: artifact.abi,\n      address: deployments[artifact.contractName],\n      name: getContractName(artifact),\n    }\n  }\n\n  function getArtifactPaths(artifactsDirectory: string) {\n    const crawler = new fdir().withBasePath().globWithOptions(\n      include.map((x) => `${artifactsDirectory}/**/${x}`),\n      {\n        dot: true,\n        ignore: exclude.map((x) => `${artifactsDirectory}/**/${x}`),\n      },\n    )\n    return crawler.crawl(artifactsDirectory).withPromise()\n  }\n\n  const project = resolve(process.cwd(), config.project)\n  const artifactsDirectory = join(project, artifacts)\n  const sourcesDirectory = join(project, sources)\n\n  const { build = true, clean = false, rebuild = true } = commands\n  return {\n    async contracts() {\n      if (clean) {\n        const packageManager = await getPackageManager(true)\n        const [command, ...options] = (\n          typeof clean === 'boolean' ? `${packageManager} hardhat clean` : clean\n        ).split(' ')\n        execSync(`${command!} ${options.join(' ')}`, {\n          cwd: project,\n          encoding: 'utf-8',\n          stdio: 'pipe',\n        })\n      }\n      if (build) {\n        const packageManager = await getPackageManager(true)\n        const [command, ...options] = (\n          typeof build === 'boolean'\n            ? `${packageManager} hardhat compile`\n            : build\n        ).split(' ')\n        execSync(`${command!} ${options.join(' ')}`, {\n          cwd: project,\n          encoding: 'utf-8',\n          stdio: 'pipe',\n        })\n      }\n      if (!existsSync(artifactsDirectory))\n        throw new Error('Artifacts not found.')\n\n      const artifactPaths = await getArtifactPaths(artifactsDirectory)\n      const contracts = []\n      for (const artifactPath of artifactPaths) {\n        const contract = await getContract(artifactPath)\n        if (!contract.abi?.length) continue\n        contracts.push(contract)\n      }\n      return contracts\n    },\n    name: 'Hardhat',\n    async validate() {\n      // Check that project directory exists\n      if (!existsSync(project))\n        throw new Error(`Hardhat project ${pc.gray(project)} not found.`)\n\n      // Check that `hardhat` is installed\n      const packageName = 'hardhat'\n      const isPackageInstalled = await getIsPackageInstalled({\n        packageName,\n        cwd: project,\n      })\n      if (isPackageInstalled) return\n      throw new Error(`${packageName} must be installed to use Hardhat plugin.`)\n    },\n    watch: {\n      command: rebuild\n        ? async () => {\n            logger.log(\n              `${pc.blue('Hardhat')} Watching project at ${pc.gray(project)}`,\n            )\n\n            const [command, ...options] = (\n              typeof rebuild === 'boolean'\n                ? `${await getPackageManager(true)} hardhat compile`\n                : rebuild\n            ).split(' ')\n\n            const { watch } = await import('chokidar')\n            const watcher = watch(sourcesDirectory, {\n              atomic: true,\n              awaitWriteFinish: true,\n              ignoreInitial: true,\n              persistent: true,\n            })\n            watcher.on('all', async (event, path) => {\n              if (event !== 'change' && event !== 'add' && event !== 'unlink')\n                return\n              logger.log(\n                `${pc.blue('Hardhat')} Detected ${event} at ${basename(path)}`,\n              )\n              const subprocess = spawn(command!, options, {\n                cwd: project,\n              })\n              subprocess.stdout?.on('data', (data) => {\n                process.stdout.write(`${pc.blue('Hardhat')} ${data}`)\n              })\n            })\n\n            process.once('SIGINT', shutdown)\n            process.once('SIGTERM', shutdown)\n            async function shutdown() {\n              await watcher.close()\n            }\n          }\n        : undefined,\n      paths: [\n        artifactsDirectory,\n        ...include.map((x) => `${artifactsDirectory}/**/${x}`),\n        ...exclude.map((x) => `!${artifactsDirectory}/**/${x}`),\n      ],\n      async onAdd(path) {\n        return getContract(path)\n      },\n      async onChange(path) {\n        return getContract(path)\n      },\n      async onRemove(path) {\n        const filename = basename(path)\n        const extension = extname(path)\n        // Since we can't use `getContractName`, guess from path\n        const removedContractName = `${namePrefix}${filename.replace(\n          extension,\n          '',\n        )}`\n        const artifactPaths = await getArtifactPaths(artifactsDirectory)\n        for (const artifactPath of artifactPaths) {\n          const contract = await getContract(artifactPath)\n          // If contract with same name exists, don't remove\n          if (contract.name === removedContractName) return\n        }\n        return removedContractName\n      },\n    },\n  }\n}\n"
  },
  {
    "path": "packages/cli/src/plugins/react.test.ts",
    "content": "import { erc20Abi } from 'viem'\nimport { expect, test } from 'vitest'\n\nimport { react } from './react.js'\n\ntest('default', async () => {\n  const result = await react().run?.({\n    contracts: [\n      {\n        name: 'erc20',\n        abi: erc20Abi,\n        content: '',\n        meta: {\n          abiName: 'erc20Abi',\n        },\n      },\n    ],\n    isTypeScript: true,\n    outputs: [],\n  })\n\n  expect(result?.imports).toMatchInlineSnapshot(`\n    \"import { createUseReadContract, createUseWriteContract, createUseSimulateContract, createUseWatchContractEvent } from 'wagmi/codegen'\n    \"\n  `)\n  expect(result?.content).toMatchInlineSnapshot(`\n    \"/**\n     * Wraps __{@link useReadContract}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const useReadErc20 = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi })\n\n    /**\n     * Wraps __{@link useReadContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"allowance\"\\`\n     */\n    export const useReadErc20Allowance = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, functionName: 'allowance' })\n\n    /**\n     * Wraps __{@link useReadContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"balanceOf\"\\`\n     */\n    export const useReadErc20BalanceOf = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, functionName: 'balanceOf' })\n\n    /**\n     * Wraps __{@link useReadContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"decimals\"\\`\n     */\n    export const useReadErc20Decimals = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, functionName: 'decimals' })\n\n    /**\n     * Wraps __{@link useReadContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"name\"\\`\n     */\n    export const useReadErc20Name = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, functionName: 'name' })\n\n    /**\n     * Wraps __{@link useReadContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"symbol\"\\`\n     */\n    export const useReadErc20Symbol = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, functionName: 'symbol' })\n\n    /**\n     * Wraps __{@link useReadContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"totalSupply\"\\`\n     */\n    export const useReadErc20TotalSupply = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, functionName: 'totalSupply' })\n\n    /**\n     * Wraps __{@link useWriteContract}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const useWriteErc20 = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi })\n\n    /**\n     * Wraps __{@link useWriteContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"approve\"\\`\n     */\n    export const useWriteErc20Approve = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi, functionName: 'approve' })\n\n    /**\n     * Wraps __{@link useWriteContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"transfer\"\\`\n     */\n    export const useWriteErc20Transfer = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi, functionName: 'transfer' })\n\n    /**\n     * Wraps __{@link useWriteContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"transferFrom\"\\`\n     */\n    export const useWriteErc20TransferFrom = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi, functionName: 'transferFrom' })\n\n    /**\n     * Wraps __{@link useSimulateContract}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const useSimulateErc20 = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi })\n\n    /**\n     * Wraps __{@link useSimulateContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"approve\"\\`\n     */\n    export const useSimulateErc20Approve = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi, functionName: 'approve' })\n\n    /**\n     * Wraps __{@link useSimulateContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"transfer\"\\`\n     */\n    export const useSimulateErc20Transfer = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi, functionName: 'transfer' })\n\n    /**\n     * Wraps __{@link useSimulateContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"transferFrom\"\\`\n     */\n    export const useSimulateErc20TransferFrom = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi, functionName: 'transferFrom' })\n\n    /**\n     * Wraps __{@link useWatchContractEvent}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const useWatchErc20Event = /*#__PURE__*/ createUseWatchContractEvent({ abi: erc20Abi })\n\n    /**\n     * Wraps __{@link useWatchContractEvent}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`eventName\\` set to \\`\"Approval\"\\`\n     */\n    export const useWatchErc20ApprovalEvent = /*#__PURE__*/ createUseWatchContractEvent({ abi: erc20Abi, eventName: 'Approval' })\n\n    /**\n     * Wraps __{@link useWatchContractEvent}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`eventName\\` set to \\`\"Transfer\"\\`\n     */\n    export const useWatchErc20TransferEvent = /*#__PURE__*/ createUseWatchContractEvent({ abi: erc20Abi, eventName: 'Transfer' })\"\n  `)\n})\n\ntest('address', async () => {\n  const result = await react().run?.({\n    contracts: [\n      {\n        name: 'erc20',\n        abi: erc20Abi,\n        content: '',\n        meta: {\n          abiName: 'erc20Abi',\n          addressName: 'erc20Address',\n        },\n      },\n    ],\n    isTypeScript: true,\n    outputs: [],\n  })\n\n  expect(result?.content).toMatchInlineSnapshot(`\n    \"/**\n     * Wraps __{@link useReadContract}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const useReadErc20 = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address })\n\n    /**\n     * Wraps __{@link useReadContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"allowance\"\\`\n     */\n    export const useReadErc20Allowance = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'allowance' })\n\n    /**\n     * Wraps __{@link useReadContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"balanceOf\"\\`\n     */\n    export const useReadErc20BalanceOf = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'balanceOf' })\n\n    /**\n     * Wraps __{@link useReadContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"decimals\"\\`\n     */\n    export const useReadErc20Decimals = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'decimals' })\n\n    /**\n     * Wraps __{@link useReadContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"name\"\\`\n     */\n    export const useReadErc20Name = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'name' })\n\n    /**\n     * Wraps __{@link useReadContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"symbol\"\\`\n     */\n    export const useReadErc20Symbol = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'symbol' })\n\n    /**\n     * Wraps __{@link useReadContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"totalSupply\"\\`\n     */\n    export const useReadErc20TotalSupply = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'totalSupply' })\n\n    /**\n     * Wraps __{@link useWriteContract}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const useWriteErc20 = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi, address: erc20Address })\n\n    /**\n     * Wraps __{@link useWriteContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"approve\"\\`\n     */\n    export const useWriteErc20Approve = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi, address: erc20Address, functionName: 'approve' })\n\n    /**\n     * Wraps __{@link useWriteContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"transfer\"\\`\n     */\n    export const useWriteErc20Transfer = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi, address: erc20Address, functionName: 'transfer' })\n\n    /**\n     * Wraps __{@link useWriteContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"transferFrom\"\\`\n     */\n    export const useWriteErc20TransferFrom = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi, address: erc20Address, functionName: 'transferFrom' })\n\n    /**\n     * Wraps __{@link useSimulateContract}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const useSimulateErc20 = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi, address: erc20Address })\n\n    /**\n     * Wraps __{@link useSimulateContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"approve\"\\`\n     */\n    export const useSimulateErc20Approve = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi, address: erc20Address, functionName: 'approve' })\n\n    /**\n     * Wraps __{@link useSimulateContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"transfer\"\\`\n     */\n    export const useSimulateErc20Transfer = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi, address: erc20Address, functionName: 'transfer' })\n\n    /**\n     * Wraps __{@link useSimulateContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"transferFrom\"\\`\n     */\n    export const useSimulateErc20TransferFrom = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi, address: erc20Address, functionName: 'transferFrom' })\n\n    /**\n     * Wraps __{@link useWatchContractEvent}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const useWatchErc20Event = /*#__PURE__*/ createUseWatchContractEvent({ abi: erc20Abi, address: erc20Address })\n\n    /**\n     * Wraps __{@link useWatchContractEvent}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`eventName\\` set to \\`\"Approval\"\\`\n     */\n    export const useWatchErc20ApprovalEvent = /*#__PURE__*/ createUseWatchContractEvent({ abi: erc20Abi, address: erc20Address, eventName: 'Approval' })\n\n    /**\n     * Wraps __{@link useWatchContractEvent}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`eventName\\` set to \\`\"Transfer\"\\`\n     */\n    export const useWatchErc20TransferEvent = /*#__PURE__*/ createUseWatchContractEvent({ abi: erc20Abi, address: erc20Address, eventName: 'Transfer' })\"\n  `)\n})\n\ntest('legacy hook names', async () => {\n  const result = await react({ getHookName: 'legacy' }).run?.({\n    contracts: [\n      {\n        name: 'erc20',\n        abi: erc20Abi,\n        content: '',\n        meta: {\n          abiName: 'erc20Abi',\n          addressName: 'erc20Address',\n        },\n      },\n    ],\n    isTypeScript: true,\n    outputs: [],\n  })\n\n  expect(result?.content).toMatchInlineSnapshot(`\n    \"/**\n     * Wraps __{@link useReadContract}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const useErc20Read = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address })\n\n    /**\n     * Wraps __{@link useReadContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"allowance\"\\`\n     */\n    export const useErc20Allowance = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'allowance' })\n\n    /**\n     * Wraps __{@link useReadContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"balanceOf\"\\`\n     */\n    export const useErc20BalanceOf = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'balanceOf' })\n\n    /**\n     * Wraps __{@link useReadContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"decimals\"\\`\n     */\n    export const useErc20Decimals = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'decimals' })\n\n    /**\n     * Wraps __{@link useReadContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"name\"\\`\n     */\n    export const useErc20Name = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'name' })\n\n    /**\n     * Wraps __{@link useReadContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"symbol\"\\`\n     */\n    export const useErc20Symbol = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'symbol' })\n\n    /**\n     * Wraps __{@link useReadContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"totalSupply\"\\`\n     */\n    export const useErc20TotalSupply = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'totalSupply' })\n\n    /**\n     * Wraps __{@link useWriteContract}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const useErc20Write = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi, address: erc20Address })\n\n    /**\n     * Wraps __{@link useWriteContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"approve\"\\`\n     */\n    export const useErc20Approve = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi, address: erc20Address, functionName: 'approve' })\n\n    /**\n     * Wraps __{@link useWriteContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"transfer\"\\`\n     */\n    export const useErc20Transfer = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi, address: erc20Address, functionName: 'transfer' })\n\n    /**\n     * Wraps __{@link useWriteContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"transferFrom\"\\`\n     */\n    export const useErc20TransferFrom = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi, address: erc20Address, functionName: 'transferFrom' })\n\n    /**\n     * Wraps __{@link useSimulateContract}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const usePrepareErc20Write = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi, address: erc20Address })\n\n    /**\n     * Wraps __{@link useSimulateContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"approve\"\\`\n     */\n    export const usePrepareErc20Approve = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi, address: erc20Address, functionName: 'approve' })\n\n    /**\n     * Wraps __{@link useSimulateContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"transfer\"\\`\n     */\n    export const usePrepareErc20Transfer = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi, address: erc20Address, functionName: 'transfer' })\n\n    /**\n     * Wraps __{@link useSimulateContract}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`functionName\\` set to \\`\"transferFrom\"\\`\n     */\n    export const usePrepareErc20TransferFrom = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi, address: erc20Address, functionName: 'transferFrom' })\n\n    /**\n     * Wraps __{@link useWatchContractEvent}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const useErc20Event = /*#__PURE__*/ createUseWatchContractEvent({ abi: erc20Abi, address: erc20Address })\n\n    /**\n     * Wraps __{@link useWatchContractEvent}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`eventName\\` set to \\`\"Approval\"\\`\n     */\n    export const useErc20ApprovalEvent = /*#__PURE__*/ createUseWatchContractEvent({ abi: erc20Abi, address: erc20Address, eventName: 'Approval' })\n\n    /**\n     * Wraps __{@link useWatchContractEvent}__ with \\`abi\\` set to __{@link erc20Abi}__ and \\`eventName\\` set to \\`\"Transfer\"\\`\n     */\n    export const useErc20TransferEvent = /*#__PURE__*/ createUseWatchContractEvent({ abi: erc20Abi, address: erc20Address, eventName: 'Transfer' })\"\n  `)\n})\n\ntest('abi item hooks disabled', async () => {\n  const result = await react({ abiItemHooks: false }).run?.({\n    contracts: [\n      {\n        name: 'erc20',\n        abi: erc20Abi,\n        content: '',\n        meta: {\n          abiName: 'erc20Abi',\n        },\n      },\n    ],\n    isTypeScript: true,\n    outputs: [],\n  })\n\n  expect(result?.imports).toMatchInlineSnapshot(`\n    \"import { createUseReadContract, createUseWriteContract, createUseSimulateContract, createUseWatchContractEvent } from 'wagmi/codegen'\n    \"\n  `)\n  expect(result?.content).toMatchInlineSnapshot(`\n    \"/**\n     * Wraps __{@link useReadContract}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const useReadErc20 = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi })\n\n    /**\n     * Wraps __{@link useWriteContract}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const useWriteErc20 = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi })\n\n    /**\n     * Wraps __{@link useSimulateContract}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const useSimulateErc20 = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi })\n\n    /**\n     * Wraps __{@link useWatchContractEvent}__ with \\`abi\\` set to __{@link erc20Abi}__\n     */\n    export const useWatchErc20Event = /*#__PURE__*/ createUseWatchContractEvent({ abi: erc20Abi })\"\n  `)\n})\n"
  },
  {
    "path": "packages/cli/src/plugins/react.ts",
    "content": "import { pascalCase } from 'change-case'\n\nimport type { Contract, Plugin } from '../config.js'\nimport type { Compute, RequiredBy } from '../types.js'\nimport { getAddressDocString } from '../utils/getAddressDocString.js'\n\nexport type ReactConfig = Compute<\n  {\n    abiItemHooks?: boolean | undefined\n  } & (\n    | {\n        /** @deprecated */\n        getHookName: 'legacy'\n      }\n    | {\n        getHookName?: (options: {\n          contractName: string\n          itemName?: string | undefined\n          type: 'read' | 'simulate' | 'watch' | 'write'\n        }) => `use${string}`\n      }\n  )\n>\n\ntype ReactResult = Compute<RequiredBy<Plugin, 'run'>>\n\nexport function react(config: ReactConfig = {}): ReactResult {\n  return {\n    name: 'React',\n    async run({ contracts }) {\n      const imports = new Set<string>([])\n      const content: string[] = []\n      const pure = '/*#__PURE__*/'\n\n      const hookNames = new Set<string>()\n      const isAbiItemHooksEnabled = config.abiItemHooks ?? true\n\n      for (const contract of contracts) {\n        let hasReadFunction = false\n        let hasWriteFunction = false\n        let hasEvent = false\n        const readItems = []\n        const writeItems = []\n        const eventItems = []\n        for (const item of contract.abi) {\n          if (item.type === 'function')\n            if (\n              item.stateMutability === 'view' ||\n              item.stateMutability === 'pure'\n            ) {\n              hasReadFunction = true\n              readItems.push(item)\n            } else {\n              hasWriteFunction = true\n              writeItems.push(item)\n            }\n          else if (item.type === 'event') {\n            hasEvent = true\n            eventItems.push(item)\n          }\n        }\n\n        let innerContent: string\n        if (contract.meta.addressName)\n          innerContent = `abi: ${contract.meta.abiName}, address: ${contract.meta.addressName}`\n        else innerContent = `abi: ${contract.meta.abiName}`\n\n        if (hasReadFunction) {\n          const hookName = getHookName(config, hookNames, 'read', contract.name)\n          const docString = genDocString('useReadContract', contract)\n          const functionName = 'createUseReadContract'\n          imports.add(functionName)\n          content.push(\n            `${docString}\nexport const ${hookName} = ${pure} ${functionName}({ ${innerContent} })`,\n          )\n\n          if (isAbiItemHooksEnabled) {\n            const names = new Set<string>()\n            for (const item of readItems) {\n              if (item.type !== 'function') continue\n              if (\n                item.stateMutability !== 'pure' &&\n                item.stateMutability !== 'view'\n              )\n                continue\n\n              // Skip overrides since they are captured by same hook\n              if (names.has(item.name)) continue\n              names.add(item.name)\n\n              const hookName = getHookName(\n                config,\n                hookNames,\n                'read',\n                contract.name,\n                item.name,\n              )\n              const docString = genDocString('useReadContract', contract, {\n                name: 'functionName',\n                value: item.name,\n              })\n              content.push(\n                `${docString}\nexport const ${hookName} = ${pure} ${functionName}({ ${innerContent}, functionName: '${item.name}' })`,\n              )\n            }\n          }\n        }\n\n        if (hasWriteFunction) {\n          {\n            const hookName = getHookName(\n              config,\n              hookNames,\n              'write',\n              contract.name,\n            )\n            const docString = genDocString('useWriteContract', contract)\n            const functionName = 'createUseWriteContract'\n            imports.add(functionName)\n            content.push(\n              `${docString}\nexport const ${hookName} = ${pure} ${functionName}({ ${innerContent} })`,\n            )\n\n            if (isAbiItemHooksEnabled) {\n              const names = new Set<string>()\n              for (const item of writeItems) {\n                if (item.type !== 'function') continue\n                if (\n                  item.stateMutability !== 'nonpayable' &&\n                  item.stateMutability !== 'payable'\n                )\n                  continue\n\n                // Skip overrides since they are captured by same hook\n                if (names.has(item.name)) continue\n                names.add(item.name)\n\n                const hookName = getHookName(\n                  config,\n                  hookNames,\n                  'write',\n                  contract.name,\n                  item.name,\n                )\n                const docString = genDocString('useWriteContract', contract, {\n                  name: 'functionName',\n                  value: item.name,\n                })\n                content.push(\n                  `${docString}\nexport const ${hookName} = ${pure} ${functionName}({ ${innerContent}, functionName: '${item.name}' })`,\n                )\n              }\n            }\n          }\n\n          {\n            const hookName = getHookName(\n              config,\n              hookNames,\n              'simulate',\n              contract.name,\n            )\n            const docString = genDocString('useSimulateContract', contract)\n            const functionName = 'createUseSimulateContract'\n            imports.add(functionName)\n            content.push(\n              `${docString}\nexport const ${hookName} = ${pure} ${functionName}({ ${innerContent} })`,\n            )\n\n            if (isAbiItemHooksEnabled) {\n              const names = new Set<string>()\n              for (const item of writeItems) {\n                if (item.type !== 'function') continue\n                if (\n                  item.stateMutability !== 'nonpayable' &&\n                  item.stateMutability !== 'payable'\n                )\n                  continue\n\n                // Skip overrides since they are captured by same hook\n                if (names.has(item.name)) continue\n                names.add(item.name)\n\n                const hookName = getHookName(\n                  config,\n                  hookNames,\n                  'simulate',\n                  contract.name,\n                  item.name,\n                )\n                const docString = genDocString(\n                  'useSimulateContract',\n                  contract,\n                  {\n                    name: 'functionName',\n                    value: item.name,\n                  },\n                )\n                content.push(\n                  `${docString}\nexport const ${hookName} = ${pure} ${functionName}({ ${innerContent}, functionName: '${item.name}' })`,\n                )\n              }\n            }\n          }\n        }\n\n        if (hasEvent) {\n          const hookName = getHookName(\n            config,\n            hookNames,\n            'watch',\n            contract.name,\n          )\n          const docString = genDocString('useWatchContractEvent', contract)\n          const functionName = 'createUseWatchContractEvent'\n          imports.add(functionName)\n          content.push(\n            `${docString}\nexport const ${hookName} = ${pure} ${functionName}({ ${innerContent} })`,\n          )\n\n          if (isAbiItemHooksEnabled) {\n            const names = new Set<string>()\n            for (const item of eventItems) {\n              if (item.type !== 'event') continue\n\n              // Skip overrides since they are captured by same hook\n              if (names.has(item.name)) continue\n              names.add(item.name)\n\n              const hookName = getHookName(\n                config,\n                hookNames,\n                'watch',\n                contract.name,\n                item.name,\n              )\n              const docString = genDocString(\n                'useWatchContractEvent',\n                contract,\n                {\n                  name: 'eventName',\n                  value: item.name,\n                },\n              )\n              content.push(\n                `${docString}\nexport const ${hookName} = ${pure} ${functionName}({ ${innerContent}, eventName: '${item.name}' })`,\n              )\n            }\n          }\n        }\n      }\n\n      const importValues = [...imports.values()]\n\n      return {\n        imports: importValues.length\n          ? `import { ${importValues.join(', ')} } from 'wagmi/codegen'\\n`\n          : '',\n        content: content.join('\\n\\n'),\n      }\n    },\n  }\n}\n\nfunction genDocString(\n  hookName: string,\n  contract: Contract,\n  item?: { name: string; value: string },\n) {\n  let description = `Wraps __{@link ${hookName}}__ with \\`abi\\` set to __{@link ${contract.meta.abiName}}__`\n  if (item) description += ` and \\`${item.name}\\` set to \\`\"${item.value}\"\\``\n\n  const docString = getAddressDocString({ address: contract.address })\n  if (docString)\n    return `/**\n * ${description}\n * \n ${docString}\n */`\n\n  return `/**\n * ${description}\n */`\n}\n\nfunction getHookName(\n  config: ReactConfig,\n  hookNames: Set<string>,\n  type: 'read' | 'simulate' | 'watch' | 'write',\n  contractName: string,\n  itemName?: string | undefined,\n) {\n  const ContractName = pascalCase(contractName)\n  const ItemName = itemName ? pascalCase(itemName) : undefined\n\n  let hookName: string\n  if (typeof config.getHookName === 'function')\n    hookName = config.getHookName({\n      type,\n      contractName: ContractName,\n      itemName: ItemName,\n    })\n  else if (typeof config.getHookName === 'string') {\n    switch (type) {\n      case 'read':\n        hookName = `use${ContractName}${ItemName ?? 'Read'}`\n        break\n      case 'simulate':\n        hookName = `usePrepare${ContractName}${ItemName ?? 'Write'}`\n        break\n      case 'watch':\n        hookName = `use${ContractName}${ItemName ?? ''}Event`\n        break\n      case 'write':\n        hookName = `use${ContractName}${ItemName ?? 'Write'}`\n        break\n    }\n  } else {\n    hookName = `use${pascalCase(type)}${ContractName}${ItemName ?? ''}`\n    if (type === 'watch') hookName = `${hookName}Event`\n  }\n\n  if (hookNames.has(hookName))\n    throw new Error(\n      `Hook name \"${hookName}\" must be unique for contract \"${contractName}\". Try using \\`getHookName\\` to create a unique name.`,\n    )\n\n  hookNames.add(hookName)\n  return hookName\n}\n"
  },
  {
    "path": "packages/cli/src/plugins/sourcify.test.ts",
    "content": "import { HttpResponse, http } from 'msw'\nimport { setupServer } from 'msw/node'\nimport { afterAll, afterEach, beforeAll, expect, test } from 'vitest'\n\nimport { depositAbi } from '../../test/constants.js'\nimport { sourcify } from './sourcify.js'\n\nconst baseUrl = 'https://sourcify.dev/server/v2/contract'\nconst address = '0x00000000219ab540356cbb839cbe05303d7705fa'\nconst chainId = 1\nconst multichainAddress = '0xC4c622862a8F548997699bE24EA4bc504e5cA865'\nconst multichainIdGnosis = 100\nconst multichainIdPolygon = 137\nconst successJson = {\n  abi: depositAbi,\n}\n\nconst handlers = [\n  http.get(`${baseUrl}/${chainId}/${address}`, () =>\n    HttpResponse.json(successJson),\n  ),\n  http.get(`${baseUrl}/${multichainIdGnosis}/${address}`, () =>\n    HttpResponse.json({}, { status: 404 }),\n  ),\n  http.get(`${baseUrl}/${multichainIdGnosis}/${multichainAddress}`, () =>\n    HttpResponse.json(successJson),\n  ),\n  http.get(`${baseUrl}/${multichainIdPolygon}/${multichainAddress}`, () =>\n    HttpResponse.json(successJson),\n  ),\n]\n\nconst server = setupServer(...handlers)\n\nbeforeAll(() => server.listen())\nafterEach(() => server.resetHandlers())\nafterAll(() => server.close())\n\ntest('fetches ABI', async () => {\n  await expect(\n    sourcify({\n      chainId: chainId,\n      contracts: [{ name: 'DepositContract', address }],\n    }).contracts?.(),\n  ).resolves.toMatchSnapshot()\n})\n\ntest('fetches ABI with multichain deployment', async () => {\n  await expect(\n    sourcify({\n      chainId: 100,\n      contracts: [\n        {\n          name: 'Community',\n          address: { 100: multichainAddress, 137: multichainAddress },\n        },\n      ],\n    }).contracts?.(),\n  ).resolves.toMatchSnapshot()\n})\n\ntest('fails to fetch for unverified contract', async () => {\n  await expect(\n    sourcify({\n      chainId: 100,\n      contracts: [{ name: 'DepositContract', address }],\n    }).contracts?.(),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(\n    '[Error: Contract not found in Sourcify repository.]',\n  )\n})\n\ntest('missing address for chainId', async () => {\n  await expect(\n    sourcify({\n      chainId: 1,\n      // @ts-expect-error `chainId` and `keyof typeof contracts[number].address` mismatch\n      contracts: [{ name: 'DepositContract', address: { 10: address } }],\n    }).contracts?.(),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(\n    `[Error: No address found for chainId \"1\". Make sure chainId \"1\" is set as an address.]`,\n  )\n})\n"
  },
  {
    "path": "packages/cli/src/plugins/sourcify.ts",
    "content": "import { Abi as AbiSchema } from 'abitype/zod'\nimport type { Address } from 'viem'\nimport { z } from 'zod'\n\nimport type { ContractConfig } from '../config.js'\nimport { fromZodError } from '../errors.js'\nimport type { Compute } from '../types.js'\nimport { fetch } from './fetch.js'\n\nexport type SourcifyConfig<chainId extends number> = {\n  /**\n   * Duration in milliseconds to cache ABIs.\n   *\n   * @default 1_800_000 // 30m in ms\n   */\n  cacheDuration?: number | undefined\n  /**\n   * Chain id to use for fetching ABI.\n   *\n   * If `address` is an object, `chainId` is used to select the address.\n   *\n   * See https://docs.sourcify.dev/docs/chains for supported chains.\n   */\n  chainId: (chainId extends ChainId ? chainId : never) | (ChainId & {})\n  /**\n   * Contracts to fetch ABIs for.\n   */\n  contracts: Compute<Omit<ContractConfig<ChainId, chainId>, 'abi'>>[]\n}\n\nconst SourcifyResponse = z.object({\n  abi: AbiSchema,\n})\n\n/** Fetches contract ABIs from Sourcify. */\nexport function sourcify<chainId extends ChainId>(\n  config: SourcifyConfig<chainId>,\n) {\n  const { cacheDuration, chainId, contracts: contracts_ } = config\n\n  const contracts = contracts_.map((x) => ({\n    ...x,\n    address:\n      typeof x.address === 'string' ? { [chainId]: x.address } : x.address,\n  })) as Omit<ContractConfig, 'abi'>[]\n\n  return fetch({\n    cacheDuration,\n    contracts,\n    async parse({ response }) {\n      if (response.status === 404)\n        throw new Error('Contract not found in Sourcify repository.')\n\n      const json = await response.json()\n      const parsed = await SourcifyResponse.safeParseAsync(json)\n      if (!parsed.success)\n        throw fromZodError(parsed.error, { prefix: 'Invalid response' })\n\n      if (parsed.data.abi) return parsed.data.abi as ContractConfig['abi']\n      throw new Error('contract not found')\n    },\n    request({ address }) {\n      if (!address) throw new Error('address is required')\n\n      let contractAddress: Address | undefined\n      if (typeof address === 'string') contractAddress = address\n      else if (typeof address === 'object') contractAddress = address[chainId]\n\n      if (!contractAddress)\n        throw new Error(\n          `No address found for chainId \"${chainId}\". Make sure chainId \"${chainId}\" is set as an address.`,\n        )\n      return {\n        url: `https://sourcify.dev/server/v2/contract/${chainId}/${contractAddress}?fields=abi`,\n      }\n    },\n  })\n}\n\n// Supported chains\n// https://docs.sourcify.dev/docs/chains\ntype ChainId =\n  | 1 // Ethereum Mainnet\n  | 560048 // Ethereum Testnet Hoodi\n  | 11155111 // Ethereum Testnet Sepolia\n  | 17000 // Ethereum Testnet Holesky\n  | 5 // Ethereum Testnet Goerli\n  | 3 // Ethereum Testnet Ropsten\n  | 4 // Ethereum Testnet Rinkeby\n  | 96969696 //  Privix Chain Testnet\n  | 180 // AME Chain Mainnet\n  | 78430 // Amplify Subnet\n  | 1339 // Elysium Mainnet\n  | 421613 // Arbitrum Goerli\n  | 42170 // Arbitrum Nova\n  | 42161 // Arbitrum One\n  | 421614 // Arbitrum Sepolia\n  | 421611 // Arbitrum Rinkeby\n  | 10242 // Arthera Mainnet\n  | 10243 // Arthera Testnet\n  | 592 // Astar\n  | 6321 // Aura Euphoria Testnet\n  | 6322 // Aura Mainnet\n  | 1313161554 // Aurora Mainnet\n  | 1313161555 // Aurora Testnet\n  | 43114 // Avalanche C-Chain\n  | 43113 // Avalanche Fuji Testnet\n  | 223 // B2 Mainnet\n  | 56 // BNB Smart Chain Mainnet\n  | 97 // BNB Smart Chain Testnet\n  | 8453 // Base\n  | 84531 // Base Goerli Testnet\n  | 84532 // Base Sepolia Testnet\n  | 4337 // Beam\n  | 13337 // Beam Testnet\n  | 641230 // Bear Network Chain Mainnet\n  | 200901 // Bitlayer Mainnet\n  | 200810 // Bitlayer Testnet\n  | 7171 // Bitrock Mainnet\n  | 7771 // Bitrock Testnet\n  | 81457 // Blast\n  | 288 // Boba Network\n  | 28 // Boba Network Rinkeby Testnet\n  | 78431 // Bulletin Subnet\n  | 534 // Candle\n  | 7700 // Canto\n  | 7701 // Canto Tesnet\n  | 44787 // Celo Alfajores Testnet\n  | 62320 // Celo Baklava Testnet\n  | 42220 // Celo Mainnet\n  | 11142220 // Celo Sepolia Testnet\n  | 5115 // Citrea Testnet\n  | 78432 // Conduit Subnet\n  | 1030 // Conflux eSpace\n  | 1116 // Core Blockchain Mainnet\n  | 1115 // Core Blockchain Testnet\n  | 1114 // Core Blockchain Testnet2\n  | 21000000 // Corn\n  | 44 // Crab Network\n  | 25 // Cronos Mainnet\n  | 4157 // CrossFi Testnet\n  | 3737 // Crossbell\n  | 103090 // Crystaleum\n  | 33111 // Curtis\n  | 53935 // DFK Chain\n  | 335 // DFK Chain Test\n  | 46 // Darwinia Network\n  | 43 // Darwinia Pangolin Testnet\n  | 666666666 // Degen Chain\n  | 432204 // Dexalot Subnet\n  | 432201 // Dexalot Subnet Testnet\n  | 2000 // Dogechain Mainnet\n  | 2021 // Edgeware EdgeEVM Mainnet\n  | 648 // Endurance Smart Chain Mainnet\n  | 39797 // Energi Mainnet\n  | 49797 // Energi Testnet\n  | 246 // Energy Web Chain\n  | 73799 // Energy Web Volta Testnet\n  | 61 // Ethereum Classic\n  | 42793 // Etherlink Mainnet\n  | 128123 // Etherlink Testnet\n  | 9001 // Evmos\n  | 9000 // Evmos Testnet\n  | 250 // Fantom Opera\n  | 26100 // Ferrum Quantum Portal Network\n  | 314159 // Filecoin - Calibration testnet\n  | 314 // Filecoin - Mainnet\n  | 14 // Flare Mainnet\n  | 252 // Fraxtal\n  | 2522 // Fraxtal Testnet\n  | 122 // Fuse Mainnet\n  | 17069 // Garnet Holesky\n  | 486217935 // Gather Devnet Network\n  | 192837465 // Gather Mainnet Network\n  | 356256156 // Gather Testnet Network\n  | 100 // Gnosis\n  | 10200 // Gnosis Chiado Testnet\n  | 71402 // Godwoken Mainnet\n  | 71401 // Godwoken Testnet v1\n  | 19011 // HOME Verse Mainnet\n  | 216 // Happychain Testnet\n  | 54211 // Haqq Chain Testnet\n  | 11235 // Haqq Network\n  | 295 // Hedera Mainnet\n  | 16350 // Incentiv Devnet\n  | 96 // KUB Mainnet\n  | 25925 // KUB Testnet\n  | 1001 // Kaia Kairos Testnet\n  | 8217 // Kaia Mainnet\n  | 2222 // Kava\n  | 2221 // Kava Testnet\n  | 420420 // Kekchain\n  | 420666 // Kekchain (kektest)\n  | 2037 // Kiwi Subnet\n  | 255 // Kroma\n  | 2358 // Kroma Sepolia\n  | 10849 // Lamina1\n  | 10850 // Lamina1 Identity\n  | 767368 // Lamina1 Identity Testnet\n  | 764984 // Lamina1 Testnet\n  | 1891 // Lightlink Pegasus Testnet\n  | 1890 // Lightlink Phoenix Mainnet\n  | 59144 // Linea\n  | 59141 // Linea Sepolia\n  | 1135 // Lisk\n  | 957 // Lyra Chain\n  | 22776 // MAP Protocol\n  | 212 // MAPO Makalu\n  | 5000 // Mantle\n  | 5003 // Mantle Sepolia Testnet\n  | 7078815900 // Mekong\n  | 333000333 // Meld\n  | 222000222 // Kanazawa\n  | 4200 // Merlin Mainnet\n  | 82 // Meter Mainnet\n  | 83 // Meter Testnet\n  | 1088 // Metis Andromeda Mainnet\n  | 59902 // Metis Sepolia Testnet\n  | 31612 // Mezo\n  | 9996 // Mind Smart Chain Mainnet\n  | 9977 // Mind Smart Chain Testnet\n  | 34443 // Mode\n  | 919 // Mode Testnet\n  | 1287 // Moonbase Alpha\n  | 1284 // Moonbeam\n  | 1285 // Moonriver\n  | 62621 // MultiVAC Mainnet\n  | 10 // OP Mainnet\n  | 11155420 // OP Sepolia Testnet\n  | 42262 // Oasis Emerald\n  | 42261 // Oasis Emerald Testnet\n  | 23294 // Oasis Sapphire\n  | 23295 // Oasis Sapphire Testnet\n  | 311752642 // OneLedger Mainnet\n  | 4216137055 // OneLedger Testnet Frankenstein\n  | 970 // Oort Mainnet\n  | 28528 // Optimism Bedrock (Goerli Alpha Testnet)\n  | 420 // Optimism Goerli Testnet\n  | 69 // Optimism Kovan\n  | 4000 // Ozone Chain Mainnet\n  | 16180 // PLYR PHI\n  | 62831 // PLYR TAU Testnet\n  | 99 // POA Network Core\n  | 77 // POA Network Sokol\n  | 11297108109 // Palm\n  | 11297108099 // Palm Testnet\n  | 13381 // Phoenix Mainnet\n  | 2206132 // PlatON Dev Testnet2\n  | 210425 // PlatON Mainnet\n  | 12898 // PlayFair Testnet Subnet\n  | 80002 // Amoy\n  | 137 // Polygon Mainnet\n  | 80001 // Mumbai\n  | 1101 // Polygon zkEVM\n  | 2442 // Polygon zkEVM Cardona Testnet\n  | 16969696 // Privix Chain Mainnet\n  | 369 // PulseChain\n  | 35441 // Q Mainnet\n  | 35443 // Q Testnet\n  | 690 // Redstone\n  | 1433 // Rikeza Network Mainnet\n  | 570 // Rollux Mainnet\n  | 57000 // Rollux Testnet\n  | 2020 // Ronin Mainnet\n  | 30 // Rootstock Mainnet\n  | 534352 // Scroll\n  | 534351 // Scroll Sepolia Testnet\n  | 336 // Shiden\n  | 2044 // Shrapnel Subnet\n  | 2038 // Shrapnel Testnet\n  | 111000 // Siberium Test Network\n  | 19 // Songbird Canary-Network\n  | 1516 // Story Odyssey Testnet\n  | 105105 // Stratis Mainnet\n  | 205205 // Auroria Testnet\n  | 2048 // Stratos\n  | 2047 // Stratos Testnet\n  | 5330 // Superseed\n  | 1291 // Swisstronik Testnet\n  | 1149 // Symplexia Smart Chain\n  | 57 // Syscoin Mainnet\n  | 5700 // Syscoin Tanenbaum Testnet\n  | 167000 // Taiko Alethia\n  | 167006 // Taiko Eldfell L3\n  | 167005 // Taiko Grimsvotn L2\n  | 5845 // Tangle\n  | 841 // Taraxa Mainnet\n  | 842 // Taraxa Testnet\n  | 2017 // Adiri\n  | 40 // Telos EVM Mainnet\n  | 41 // Telos EVM Testnet\n  | 7668 // The Root Network - Mainnet\n  | 7672 // The Root Network - Porcini Testnet\n  | 710420 // Tiltyard Mainnet Subnet\n  | 1127469 // Tiltyard Subnet\n  | 723107 // TixChain Testnet\n  | 6119 // UPTN\n  | 8 // Ubiq\n  | 130 // Unichain\n  | 100009 // VeChain\n  | 100010 // VeChain Testnet\n  | 106 // Velas EVM Mainnet\n  | 11111 // WAGMI\n  | 888 // Wanchain\n  | 999 // Wanchain Testnet\n  | 51 // XDC Apothem Network\n  | 50 // XDC Network\n  | 660279 // Xai Mainnet\n  | 37714555429 // Xai Testnet v2\n  | 202401 // YMTECH-BESU Testnet\n  | 42766 // ZKFair Mainnet\n  | 383414847825 // Zeniq\n  | 7000 // ZetaChain Mainnet\n  | 7001 // ZetaChain Testnet\n  | 32769 // Zilliqa 2\n  | 32770 // Zilliqa 2 EVM proto-mainnet\n  | 33103 // Zilliqa 2 EVM proto-testnet\n  | 33101 // Zilliqa 2 Testnet\n  | 48898 // Zircuit Garfield Testnet\n  | 48900 // Zircuit Mainnet\n  | 48899 // Zircuit Testnet\n  | 7777777 // Zora\n  | 999999999 // Zora Sepolia Testnet\n  | 7200 // exSat Mainnet\n  | 839999 // exSat Testnet\n  | 3338 // peaq\n  | 300 // zkSync Sepolia Testnet\n"
  },
  {
    "path": "packages/cli/src/types.ts",
    "content": "export type Compute<type> = { [key in keyof type]: type[key] } & unknown\n\nexport type MaybeArray<T> = T | T[]\n\nexport type MaybePromise<T> = T | Promise<T>\n\nexport type RequiredBy<TType, TKeys extends keyof TType> = Required<\n  Pick<TType, TKeys>\n> &\n  Omit<TType, TKeys>\n"
  },
  {
    "path": "packages/cli/src/utils/findConfig.test.ts",
    "content": "import { afterEach, expect, test, vi } from 'vitest'\n\nimport { createFixture } from '../../test/utils.js'\nimport { findConfig } from './findConfig.js'\n\nafterEach(() => {\n  vi.restoreAllMocks()\n})\n\ntest('finds config file', async () => {\n  const { dir, paths } = await createFixture({\n    files: { 'wagmi.config.ts': '' },\n  })\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  await expect(findConfig()).resolves.toBe(paths['wagmi.config.ts'])\n})\n\ntest('finds config file at location', async () => {\n  const { dir, paths } = await createFixture({\n    files: { 'wagmi.config.ts': '' },\n  })\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  await expect(findConfig({ config: paths['wagmi.config.ts'] })).resolves.toBe(\n    paths['wagmi.config.ts'],\n  )\n})\n\ntest('finds config file at root', async () => {\n  const { dir, paths } = await createFixture({\n    files: { 'wagmi.config.ts': '' },\n  })\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  await expect(findConfig({ root: dir })).resolves.toBe(\n    paths['wagmi.config.ts'],\n  )\n})\n"
  },
  {
    "path": "packages/cli/src/utils/findConfig.ts",
    "content": "import { existsSync } from 'node:fs'\nimport escalade from 'escalade'\nimport { resolve } from 'pathe'\n\n// Do not reorder\n// In order of preference files are checked\nconst configFiles = [\n  'wagmi.config.ts',\n  'wagmi.config.js',\n  'wagmi.config.mjs',\n  'wagmi.config.mts',\n]\n\ntype FindConfigParameters = {\n  /** Config file name */\n  config?: string | undefined\n  /** Config file directory */\n  root?: string | undefined\n}\n\n/**\n * Resolves path to wagmi CLI config file.\n */\nexport async function findConfig(parameters: FindConfigParameters = {}) {\n  const { config, root } = parameters\n  const rootDir = resolve(root || process.cwd())\n  if (config) {\n    const path = resolve(rootDir, config)\n    if (existsSync(path)) return path\n    return\n  }\n  const configPath = await escalade(rootDir, (_dir, names) => {\n    for (const name of names) {\n      if (configFiles.includes(name)) return name\n    }\n    return undefined\n  })\n  return configPath\n}\n"
  },
  {
    "path": "packages/cli/src/utils/format.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport { format } from './format.js'\n\ntest('formats code', async () => {\n  await expect(\n    format(`const           foo = \"bar\"`),\n  ).resolves.toMatchInlineSnapshot(`\n    \"const foo = 'bar'\n    \"\n  `)\n})\n"
  },
  {
    "path": "packages/cli/src/utils/format.ts",
    "content": "import prettier from 'prettier'\n\nexport async function format(content: string) {\n  const config = await prettier.resolveConfig(process.cwd())\n  return prettier.format(content, {\n    arrowParens: 'always',\n    endOfLine: 'lf',\n    parser: 'typescript',\n    printWidth: 80,\n    semi: false,\n    singleQuote: true,\n    tabWidth: 2,\n    trailingComma: 'all',\n    ...config,\n    plugins: [],\n  })\n}\n"
  },
  {
    "path": "packages/cli/src/utils/getAddressDocString.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport { getAddressDocString } from './getAddressDocString.js'\n\ntest('address', async () => {\n  expect(\n    getAddressDocString({\n      address: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n    }),\n  ).toMatchInlineSnapshot('\"\"')\n})\n\ntest('multichain address with known chain ids', async () => {\n  expect(\n    getAddressDocString({\n      address: {\n        1: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n        5: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n        10: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n      },\n    }),\n  ).toMatchInlineSnapshot(`\n    \"* - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e)\n    * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e)\n    * - [__View Contract on Op Mainnet Optimism Explorer__](https://optimistic.etherscan.io/address/0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e)\"\n  `)\n})\n\ntest('multichain address with unknown chain id', async () => {\n  expect(\n    getAddressDocString({\n      address: {\n        1: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n        2: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n      },\n    }),\n  ).toMatchInlineSnapshot(\n    `\n    \"* - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e)\n    * - [__View Contract on Expanse Network Expanse Explorer__](https://explorer.expanse.tech/address/0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e)\"\n  `,\n  )\n})\n"
  },
  {
    "path": "packages/cli/src/utils/getAddressDocString.ts",
    "content": "import { capitalCase } from 'change-case'\nimport dedent from 'dedent'\nimport * as allChains from 'viem/chains'\n\nimport type { Contract } from '../config.js'\n\nconst chainMap: Record<allChains.Chain['id'], allChains.Chain> = {}\nfor (const chain of Object.values(allChains)) {\n  if (typeof chain !== 'object') continue\n  if (!('id' in chain)) continue\n  chainMap[chain.id] = chain\n}\n\nexport function getAddressDocString(parameters: {\n  address: Contract['address']\n}) {\n  const { address } = parameters\n  if (!address || typeof address === 'string') return ''\n\n  if (Object.keys(address).length === 1)\n    return `* ${getLink({\n      address: address[Number.parseInt(Object.keys(address)[0]!, 10)]!,\n      chainId: Number.parseInt(Object.keys(address)[0]!, 10),\n    })}`\n\n  const addresses = Object.entries(address).filter(\n    (x) => chainMap[Number.parseInt(x[0], 10)],\n  )\n  if (addresses.length === 0) return ''\n  if (addresses.length === 1 && addresses[0])\n    return `* ${getLink({\n      address: addresses[0][1],\n      chainId: Number.parseInt(addresses[0][0], 10)!,\n    })}`\n\n  return dedent`\n    ${addresses.reduce((prev, curr) => {\n      const chainId = Number.parseInt(curr[0], 10)\n      const address = curr[1]\n      return `${prev}\\n* - ${getLink({ address, chainId })}`\n    }, '')}\n  `\n}\n\nfunction getLink({ address, chainId }: { address: string; chainId: number }) {\n  const chain = chainMap[chainId]\n  if (!chain) return ''\n  const blockExplorer = chain.blockExplorers?.default\n  if (!blockExplorer) return ''\n  return `[__View Contract on ${capitalCase(chain.name)} ${capitalCase(\n    blockExplorer.name,\n  )}__](${blockExplorer.url}/address/${address})`\n}\n"
  },
  {
    "path": "packages/cli/src/utils/getIsUsingTypeScript.test.ts",
    "content": "import { afterEach, expect, test, vi } from 'vitest'\n\nimport { createFixture } from '../../test/utils.js'\nimport { getIsUsingTypeScript } from './getIsUsingTypeScript.js'\n\nafterEach(() => {\n  vi.restoreAllMocks()\n})\n\ntest('true if has tsconfig', async () => {\n  const { dir } = await createFixture({\n    files: {\n      'tsconfig.json': '',\n    },\n  })\n\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  await expect(getIsUsingTypeScript()).resolves.toBe(true)\n})\n\ntest('true if has wagmi.config', async () => {\n  const { dir } = await createFixture({\n    files: {\n      'wagmi.config.ts': '',\n    },\n  })\n\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  await expect(getIsUsingTypeScript()).resolves.toBe(true)\n})\n\ntest('false', async () => {\n  const { dir } = await createFixture()\n\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  await expect(getIsUsingTypeScript()).resolves.toBe(false)\n})\n"
  },
  {
    "path": "packages/cli/src/utils/getIsUsingTypeScript.ts",
    "content": "import escalade from 'escalade'\n\nexport async function getIsUsingTypeScript() {\n  try {\n    const cwd = process.cwd()\n    const tsconfig = await escalade(cwd, (_dir, names) => {\n      const files = [\n        'tsconfig.json',\n        'tsconfig.base.json',\n        'tsconfig.lib.json',\n        'tsconfig.node.json',\n      ]\n      for (const name of names) {\n        if (files.includes(name)) return name\n      }\n      return undefined\n    })\n    if (tsconfig) return true\n\n    const wagmiConfig = await escalade(cwd, (_dir, names) => {\n      const files = ['wagmi.config.ts', 'wagmi.config.mts']\n      for (const name of names) {\n        if (files.includes(name)) return name\n      }\n      return undefined\n    })\n    if (wagmiConfig) return true\n\n    return false\n  } catch {\n    return false\n  }\n}\n"
  },
  {
    "path": "packages/cli/src/utils/loadEnv.test.ts",
    "content": "import { afterEach, expect, test, vi } from 'vitest'\n\nimport { createFixture } from '../../test/utils.js'\nimport { loadEnv } from './loadEnv.js'\n\nafterEach(() => {\n  vi.restoreAllMocks()\n})\n\ntest('loads env', async () => {\n  const { dir } = await createFixture({\n    files: {\n      '.env': `\n        FOO=bar\n        SOME_ENV_VAR=1\n        `,\n    },\n  })\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  expect(loadEnv()).toMatchInlineSnapshot(`\n      {\n        \"FOO\": \"bar\",\n        \"SOME_ENV_VAR\": \"1\",\n      }\n    `)\n})\n\ntest('loads env from envDir', async () => {\n  const { dir } = await createFixture({\n    files: {\n      '.env': `\n        FOO=bar\n        SOME_ENV_VAR=1\n        `,\n    },\n  })\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  expect(loadEnv({ envDir: dir })).toMatchInlineSnapshot(`\n      {\n        \"FOO\": \"bar\",\n        \"SOME_ENV_VAR\": \"1\",\n      }\n    `)\n})\n\ntest('loads env with mode', async () => {\n  const mode = 'dev'\n  const { dir } = await createFixture({\n    files: {\n      [`.env.${mode}`]: `\n        FOO=bar\n        SOME_ENV_VAR=1\n        `,\n    },\n  })\n  const spy = vi.spyOn(process, 'cwd')\n  spy.mockImplementation(() => dir)\n\n  expect(loadEnv({ mode })).toMatchInlineSnapshot(`\n      {\n        \"FOO\": \"bar\",\n        \"SOME_ENV_VAR\": \"1\",\n      }\n    `)\n})\n\ntest('throws error when mode is \"local\"', async () => {\n  expect(() => {\n    loadEnv({ mode: 'local' })\n  }).toThrowErrorMatchingInlineSnapshot(\n    `[Error: \"local\" cannot be used as a mode name because it conflicts with the .local postfix for .env files.]`,\n  )\n})\n"
  },
  {
    "path": "packages/cli/src/utils/loadEnv.ts",
    "content": "import { existsSync, readFileSync, statSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { parse } from 'dotenv'\nimport { expand } from 'dotenv-expand'\n\n// https://github.com/vitejs/vite/blob/main/packages/vite/src/node/env.ts#L7\nexport function loadEnv(\n  config: { mode?: string; envDir?: string } = {},\n): Record<string, string> {\n  const mode = config.mode\n  if (mode === 'local') {\n    throw new Error(\n      `\"local\" cannot be used as a mode name because it conflicts with the .local postfix for .env files.`,\n    )\n  }\n\n  const envFiles = [\n    /** default file */ '.env',\n    /** local file */ '.env.local',\n    ...(mode\n      ? [\n          /** mode file */ `.env.${mode}`,\n          /** mode local file */ `.env.${mode}.local`,\n        ]\n      : []),\n  ]\n\n  const envDir = config.envDir ?? process.cwd()\n  const parsed = Object.fromEntries(\n    envFiles.flatMap((file) => {\n      const path = lookupFile(envDir, [file], {\n        pathOnly: true,\n        rootDir: envDir,\n      })\n      if (!path) return []\n      return Object.entries(parse(readFileSync(path)))\n    }),\n  )\n\n  try {\n    // let environment variables use each other\n    expand({ parsed })\n  } catch (error) {\n    // custom error handling until https://github.com/motdotla/dotenv-expand/issues/65 is fixed upstream\n    // check for message \"TypeError: Cannot read properties of undefined (reading 'split')\"\n    if ((error as Error).message.includes('split')) {\n      throw new Error(\n        'dotenv-expand failed to expand env vars. Maybe you need to escape `$`?',\n      )\n    }\n    throw error\n  }\n\n  return parsed\n}\n\nfunction lookupFile(\n  dir: string,\n  formats: string[],\n  options?: {\n    pathOnly?: boolean\n    rootDir?: string\n    predicate?: (file: string) => boolean\n  },\n): string | undefined {\n  for (const format of formats) {\n    const fullPath = join(dir, format)\n    if (existsSync(fullPath) && statSync(fullPath).isFile()) {\n      const result = options?.pathOnly\n        ? fullPath\n        : readFileSync(fullPath, 'utf-8')\n      if (!options?.predicate || options.predicate(result)) {\n        return result\n      }\n    }\n  }\n\n  const parentDir = dirname(dir)\n  if (\n    parentDir !== dir &&\n    (!options?.rootDir || parentDir.startsWith(options?.rootDir))\n  )\n    return lookupFile(parentDir, formats, options)\n\n  return undefined\n}\n"
  },
  {
    "path": "packages/cli/src/utils/packages.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport { getIsPackageInstalled, getPackageManager } from './packages.js'\n\ntest('getIsPackageInstalled: true', async () => {\n  await expect(getIsPackageInstalled({ packageName: 'vitest' })).resolves.toBe(\n    true,\n  )\n})\n\ntest('getIsPackageInstalled: false', async () => {\n  await expect(\n    getIsPackageInstalled({ packageName: 'vitest-unknown' }),\n  ).resolves.toBe(false)\n})\n\ntest('getPackageManager', async () => {\n  await expect(getPackageManager()).resolves.toMatchInlineSnapshot('\"pnpm\"')\n})\n"
  },
  {
    "path": "packages/cli/src/utils/packages.ts",
    "content": "import { execSync } from 'node:child_process'\nimport { promises as fs } from 'node:fs'\nimport { resolve } from 'node:path'\n\nexport async function getIsPackageInstalled(parameters: {\n  packageName: string\n  cwd?: string\n}) {\n  const { packageName, cwd = process.cwd() } = parameters\n  try {\n    const packageManager = await getPackageManager()\n    const command = (() => {\n      switch (packageManager) {\n        case 'yarn':\n          return ['why', packageName]\n        case 'bun':\n          return ['pm', 'ls', '--all']\n        default:\n          return ['ls', packageName]\n      }\n    })()\n\n    const result = execSync(`${packageManager} ${command.join(' ')}`, {\n      cwd,\n      encoding: 'utf-8',\n      stdio: 'pipe',\n    })\n\n    // For Bun, we need to check if the package name is in the output\n    if (packageManager === 'bun') return result.includes(packageName)\n\n    return result !== ''\n  } catch (_error) {\n    return false\n  }\n}\n\nexport async function getPackageManager(executable?: boolean | undefined) {\n  const userAgent = process.env.npm_config_user_agent\n  if (userAgent) {\n    if (userAgent.includes('pnpm')) return 'pnpm'\n    // The yarn@^3 user agent includes npm, so yarn must be checked first.\n    if (userAgent.includes('yarn')) return 'yarn'\n    if (userAgent.includes('npm')) return executable ? 'npx' : 'npm'\n    if (userAgent.includes('bun')) return executable ? 'bunx' : 'bun'\n  }\n\n  const packageManager = await detect()\n  if (packageManager === 'npm' && executable) return 'npx'\n  return packageManager\n}\n\ntype PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun'\n\nasync function detect(\n  parameters: { cwd?: string; includeGlobalBun?: boolean } = {},\n) {\n  const { cwd, includeGlobalBun } = parameters\n  const type = await getTypeofLockFile(cwd)\n  if (type) {\n    return type\n  }\n  const [hasYarn, hasPnpm, hasBun] = await Promise.all([\n    hasGlobalInstallation('yarn'),\n    hasGlobalInstallation('pnpm'),\n    includeGlobalBun && hasGlobalInstallation('bun'),\n  ])\n  if (hasYarn) return 'yarn'\n  if (hasPnpm) return 'pnpm'\n  if (hasBun) return 'bun'\n  return 'npm'\n}\n\nconst cache = new Map()\n\nfunction hasGlobalInstallation(pm: PackageManager): boolean {\n  const key = `has_global_${pm}`\n  if (cache.has(key)) return cache.get(key)\n\n  try {\n    const result = execSync(`${pm} --version`, {\n      encoding: 'utf-8',\n      stdio: 'pipe',\n    })\n    const isGlobal = /^\\d+.\\d+.\\d+$/.test(result)\n    cache.set(key, isGlobal)\n    return isGlobal\n  } catch {\n    return false\n  }\n}\n\nfunction getTypeofLockFile(cwd = '.'): Promise<PackageManager | null> {\n  const key = `lockfile_${cwd}`\n  if (cache.has(key)) {\n    return Promise.resolve(cache.get(key))\n  }\n\n  return Promise.all([\n    pathExists(resolve(cwd, 'yarn.lock')),\n    pathExists(resolve(cwd, 'package-lock.json')),\n    pathExists(resolve(cwd, 'pnpm-lock.yaml')),\n    pathExists(resolve(cwd, 'bun.lockb')),\n  ]).then(([isYarn, isNpm, isPnpm, isBun]) => {\n    let value: PackageManager | null = null\n\n    if (isYarn) value = 'yarn'\n    else if (isPnpm) value = 'pnpm'\n    else if (isBun) value = 'bun'\n    else if (isNpm) value = 'npm'\n\n    cache.set(key, value)\n    return value\n  })\n}\n\nasync function pathExists(p: string) {\n  try {\n    await fs.access(p)\n    return true\n  } catch {\n    return false\n  }\n}\n"
  },
  {
    "path": "packages/cli/src/utils/resolveConfig.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport { createFixture } from '../../test/utils.js'\nimport { defaultConfig } from '../config.js'\nimport { findConfig } from './findConfig.js'\nimport { resolveConfig } from './resolveConfig.js'\n\ntest.skip('resolves config', async () => {\n  const { paths } = await createFixture({\n    files: {\n      'wagmi.config.ts': `\n        import { defineConfig } from '@wagmi/cli'\n\n        export default defineConfig(${JSON.stringify(defaultConfig)})\n        `,\n    },\n  })\n\n  const configPath = await findConfig({\n    config: paths['wagmi.config.ts'],\n  })\n  await expect(\n    resolveConfig({ configPath: configPath! }),\n  ).resolves.toMatchInlineSnapshot(`\n      {\n        \"contracts\": [],\n        \"out\": \"src/generated.ts\",\n        \"plugins\": [],\n      }\n    `)\n})\n\ntest.skip('resolves function config', async () => {\n  const { paths } = await createFixture({\n    files: {\n      'wagmi.config.ts': `\n        import { defineConfig } from '@wagmi/cli'\n\n        export default defineConfig(() => (${JSON.stringify(defaultConfig)}))\n        `,\n    },\n  })\n\n  const configPath = await findConfig({\n    config: paths['wagmi.config.ts'],\n  })\n  await expect(\n    resolveConfig({ configPath: configPath! }),\n  ).resolves.toMatchInlineSnapshot(`\n      {\n        \"contracts\": [],\n        \"out\": \"src/generated.ts\",\n        \"plugins\": [],\n      }\n    `)\n})\n\ntest.skip('resolves array config', async () => {\n  const { paths } = await createFixture({\n    files: {\n      'wagmi.config.ts': `\n        import { defineConfig } from '@wagmi/cli'\n\n        export default defineConfig([${JSON.stringify(defaultConfig)}])\n        `,\n    },\n  })\n\n  const configPath = await findConfig({\n    config: paths['wagmi.config.ts'],\n  })\n  await expect(\n    resolveConfig({ configPath: configPath! }),\n  ).resolves.toMatchInlineSnapshot(`\n      [\n        {\n          \"contracts\": [],\n          \"out\": \"src/generated.ts\",\n          \"plugins\": [],\n        },\n      ]\n    `)\n})\n"
  },
  {
    "path": "packages/cli/src/utils/resolveConfig.ts",
    "content": "import { bundleRequire } from 'bundle-require'\n\nimport type { Config } from '../config.js'\nimport type { MaybeArray } from '../types.js'\n\ntype ResolveConfigParameters = {\n  /** Path to config file */\n  configPath: string\n}\n\n/** Bundles and returns wagmi config object from path. */\nexport async function resolveConfig(\n  parameters: ResolveConfigParameters,\n): Promise<MaybeArray<Config>> {\n  const { configPath } = parameters\n  const res = await bundleRequire({ filepath: configPath })\n  let config = res.mod.default\n  if (config.default) config = config.default\n  if (typeof config !== 'function') return config\n  return await config()\n}\n"
  },
  {
    "path": "packages/cli/src/version.ts",
    "content": "export const version = '2.10.0'\n"
  },
  {
    "path": "packages/cli/test/constants.ts",
    "content": "import { parseAbi } from 'viem'\n\nexport const wagmiAbi = parseAbi([\n  'constructor()',\n  'event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)',\n  'event ApprovalForAll(address indexed owner, address indexed operator, bool approved)',\n  'event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)',\n  'function approve(address to, uint256 tokenId)',\n  'function balanceOf(address owner) view returns (uint256)',\n  'function getApproved(uint256 tokenId) view returns (address)',\n  'function isApprovedForAll(address owner, address operator) view returns (bool)',\n  'function mint()',\n  'function name() view returns (string)',\n  'function ownerOf(uint256 tokenId) view returns (address)',\n  'function safeTransferFrom(address from, address to, uint256 tokenId)',\n  'function safeTransferFrom(address from, address to, uint256 tokenId, bytes _data)',\n  'function setApprovalForAll(address operator, bool approved)',\n  'function supportsInterface(bytes4 interfaceId) view returns (bool)',\n  'function symbol() view returns (string)',\n  'function tokenURI(uint256 tokenId) pure returns (string)',\n  'function totalSupply() view returns (uint256)',\n  'function transferFrom(address from, address to, uint256 tokenId)',\n])\n\nexport const depositAbi = parseAbi([\n  'constructor()',\n  'event DepositEvent(bytes pubkey, bytes withdrawal_credentials, bytes amount, bytes signature, bytes index)',\n  'function deposit(bytes pubkey, bytes withdrawal_credentials, bytes signature, bytes32 deposit_data_root) payable',\n  'function get_deposit_count() view returns (bytes)',\n  'function get_deposit_root() view returns (bytes32)',\n  'function supportsInterface(bytes4 interfaceId) pure returns (bool)',\n])\n"
  },
  {
    "path": "packages/cli/test/setup.ts",
    "content": "import { mkdir } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport type { createSpinner as nanospinner_createSpinner } from 'nanospinner'\nimport { join } from 'pathe'\nimport { vi } from 'vitest'\n\nconst cacheDir = join(homedir(), '.wagmi-cli/plugins/fetch/cache')\nawait mkdir(cacheDir, { recursive: true })\n\nvi.mock('nanospinner', async (importOriginal) => {\n  const mod = await importOriginal<{\n    createSpinner: typeof nanospinner_createSpinner\n  }>()\n\n  function createSpinner(\n    initialText: string,\n    opts: Parameters<typeof nanospinner_createSpinner>[1],\n  ) {\n    let currentText = ''\n    const spinner = mod.createSpinner(initialText, opts)\n    return {\n      ...spinner,\n      start(text = initialText) {\n        console.log(`- ${text}`)\n        spinner.start(text)\n        currentText = text\n      },\n      success(text = currentText) {\n        console.log(`√ ${text}`)\n        spinner.success(text)\n      },\n      error(text = currentText) {\n        // biome-ignore lint/suspicious/noConsole: logging error\n        console.error(`× ${text}`)\n        spinner.error(text)\n      },\n    }\n  }\n  return { createSpinner }\n})\n\nvi.mock('picocolors', async () => {\n  function pass(input: string | number | null | undefined) {\n    return input\n  }\n  return {\n    default: {\n      blue: pass,\n      gray: pass,\n      green: pass,\n      red: pass,\n      white: pass,\n      yellow: pass,\n    },\n  }\n})\n"
  },
  {
    "path": "packages/cli/test/utils.ts",
    "content": "import { spawnSync } from 'node:child_process'\nimport { cp, mkdir, symlink, writeFile } from 'node:fs/promises'\nimport fixtures from 'fixturez'\nimport { HttpResponse, http } from 'msw'\nimport * as path from 'pathe'\nimport { vi } from 'vitest'\n\nconst f = fixtures(__dirname)\n\ntype Json =\n  | string\n  | number\n  | boolean\n  | null\n  | { [property: string]: Json }\n  | Json[]\n\nexport async function createFixture<\n  TFiles extends { [filename: string]: string | Json } & {\n    tsconfig?: true\n  },\n>(config: { copyNodeModules?: boolean; dir?: string; files?: TFiles } = {}) {\n  const dir = config.dir ?? f.temp()\n  await mkdir(dir, { recursive: true })\n\n  // Create test files\n  const paths: { [_ in keyof TFiles]: string } = {} as any\n  await Promise.all(\n    (Object.keys(config.files ?? {}) as (keyof TFiles)[]).map(\n      async (filename_) => {\n        let file: Json | true | undefined\n        let filename = filename_\n        if (filename === 'tsconfig') {\n          filename = 'tsconfig.json'\n          file = getTsConfig(dir)\n        } else file = config.files![filename]\n\n        const filePath = path.join(dir, filename.toString())\n        await mkdir(path.dirname(filePath), { recursive: true })\n\n        await writeFile(\n          filePath,\n          typeof file === 'string' ? file : JSON.stringify(file, null, 2),\n        )\n        paths[filename === 'tsconfig.json' ? 'tsconfig' : filename] = filePath\n      },\n    ),\n  )\n\n  if (config.copyNodeModules) {\n    await symlink(\n      path.join(__dirname, '../node_modules'),\n      path.join(dir, 'node_modules'),\n      'dir',\n    )\n    await cp(\n      path.join(__dirname, '../package.json'),\n      path.join(dir, 'package.json'),\n    )\n  }\n\n  return {\n    dir,\n    paths: paths,\n  }\n}\n\ntype TsConfig = {\n  compilerOptions: { [property: string]: any }\n  exclude: string[]\n  include: string[]\n}\nfunction getTsConfig(baseUrl: string) {\n  return {\n    compilerOptions: {\n      allowJs: true,\n      baseUrl: '.',\n      esModuleInterop: true,\n      forceConsistentCasingInFileNames: true,\n      incremental: true,\n      isolatedModules: true,\n      jsx: 'preserve',\n      lib: ['dom', 'dom.iterable', 'esnext'],\n      module: 'esnext',\n      moduleResolution: 'node',\n      noEmit: true,\n      paths: {\n        '@wagmi/cli': [path.relative(baseUrl, 'packages/cli/src')],\n        '@wagmi/cli/*': [path.relative(baseUrl, 'packages/cli/src/*')],\n        '@wagmi/connectors': [\n          path.relative(baseUrl, 'packages/connectors/src'),\n        ],\n        '@wagmi/connectors/*': [\n          path.relative(baseUrl, 'packages/connectors/src/*'),\n        ],\n        '@wagmi/core': [path.relative(baseUrl, 'packages/core/src')],\n        '@wagmi/core/*': [path.relative(baseUrl, 'packages/core/src/*')],\n        wagmi: [path.relative(baseUrl, 'packages/react/src')],\n        'wagmi/*': [path.relative(baseUrl, 'packages/react/src/*')],\n      },\n      resolveJsonModule: true,\n      skipLibCheck: true,\n      strict: true,\n      target: 'es6',\n    },\n    include: [`${baseUrl}/**/*.ts`, `${baseUrl}/**/*.tsx`],\n    exclude: ['node_modules'],\n  } as TsConfig\n}\n\nexport function watchConsole() {\n  type Console = 'info' | 'log' | 'warn' | 'error'\n  const output: { [_ in Console | 'all']: string[] } = {\n    info: [],\n    log: [],\n    warn: [],\n    error: [],\n    all: [],\n  }\n  function handleOutput(method: Console) {\n    return (message: string) => {\n      output[method].push(message)\n      output.all.push(message)\n    }\n  }\n  return {\n    // biome-ignore lint/suspicious/noConsole: logging\n    debug: console.debug,\n    info: vi.spyOn(console, 'info').mockImplementation(handleOutput('info')),\n    log: vi.spyOn(console, 'log').mockImplementation(handleOutput('log')),\n    warn: vi.spyOn(console, 'warn').mockImplementation(handleOutput('warn')),\n    error: vi.spyOn(console, 'error').mockImplementation(handleOutput('error')),\n    output,\n    get formatted() {\n      return output.all.join('\\n')\n    },\n  }\n}\n\nexport async function typecheck(project: string) {\n  try {\n    const result = spawnSync(\n      'tsc',\n      ['--noEmit', '--target', 'es2021', '--pretty', 'false', '-p', project],\n      {\n        encoding: 'utf-8',\n        stdio: 'pipe',\n      },\n    )\n    if (result.error) throw result.error\n    if (result.status !== 0)\n      throw new Error(`Failed with code ${result.status}`)\n    if (result.signal) throw new Error('Process terminated by signal')\n    return result.stdout\n  } catch (error) {\n    throw new Error(\n      (error as Error).message.replaceAll(\n        path.dirname(project),\n        '/path/to/project',\n      ),\n    )\n  }\n}\n\nexport const apiKey = 'abc'\nexport const invalidApiKey = 'xyz'\nexport const address = '0xaf0326d92b97df1221759476b072abfd8084f9be'\nexport const proxyAddress = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'\nexport const implementationAddress =\n  '0x43506849d7c04f9138d1a2050bbf3a0c054402dd'\nexport const unverifiedContractAddress =\n  '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'\nexport const timeoutAddress = '0xecb504d39723b0be0e3a9aa33d646642d1051ee1'\n\nexport function getHandlers(baseUrl = 'https://api.etherscan.io/v2/api') {\n  return [\n    http.get(baseUrl, async ({ request }) => {\n      const url = new URL(request.url)\n      const search = url.search.replace(/^\\?chainId=\\d&/, '?')\n\n      if (\n        search ===\n        `?module=contract&action=getabi&address=${unverifiedContractAddress}&apikey=${apiKey}`\n      )\n        return HttpResponse.json({\n          status: '0',\n          message: 'NOTOK',\n          result: 'Contract source code not verified',\n        })\n\n      if (\n        search ===\n        `?module=contract&action=getabi&address=${timeoutAddress}&apikey=${invalidApiKey}`\n      )\n        return HttpResponse.json({\n          status: '0',\n          message: 'NOTOK',\n          result: 'Invalid API Key',\n        })\n\n      if (\n        search ===\n        `?module=contract&action=getabi&address=${address}&apikey=${apiKey}`\n      )\n        return HttpResponse.json({\n          status: '1',\n          message: 'OK',\n          result:\n            '[{\"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\"}]',\n        })\n\n      if (\n        search ===\n        `?module=contract&action=getabi&address=${timeoutAddress}&apikey=${apiKey}`\n      ) {\n        await new Promise((resolve) => setTimeout(resolve, 10_000))\n        return HttpResponse.json({})\n      }\n\n      if (\n        search ===\n        `?module=contract&action=getabi&address=${implementationAddress}&apikey=${apiKey}`\n      )\n        return HttpResponse.json({\n          status: '1',\n          message: 'OK',\n          result:\n            '[{\"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\"}]',\n        })\n\n      if (\n        search ===\n        `?module=contract&action=getsourcecode&address=${proxyAddress}&apikey=${apiKey}`\n      )\n        return HttpResponse.json({\n          status: '1',\n          message: 'OK',\n          result: [\n            {\n              SourceCode: '...',\n              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\"}]',\n              ContractName: 'FiatTokenProxy',\n              CompilerVersion: 'v0.4.24+commit.e67f0147',\n              OptimizationUsed: '0',\n              Runs: '200',\n              ConstructorArguments:\n                '0000000000000000000000000882477e7895bdc5cea7cb1552ed914ab157fe56',\n              EVMVersion: 'Default',\n              Library: '',\n              LicenseType: '',\n              Proxy: '1',\n              Implementation: '0x43506849d7c04f9138d1a2050bbf3a0c054402dd',\n              SwarmSource:\n                'bzzr://a4a547cfc7202c5acaaae74d428e988bc62ad5024eb0165532d3a8f91db4ed24',\n            },\n          ],\n        })\n\n      if (\n        search ===\n        `?module=contract&action=getsourcecode&address=${address}&apikey=${apiKey}`\n      )\n        return HttpResponse.json({\n          status: '1',\n          message: 'OK',\n          result: [\n            {\n              SourceCode: '...',\n              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\"}]',\n              ContractName: 'WagmiMintExample',\n              CompilerVersion: 'v0.8.11+commit.d7f03943',\n              OptimizationUsed: '1',\n              Runs: '10000',\n              ConstructorArguments: '',\n              EVMVersion: 'Default',\n              Library: '',\n              LicenseType: '',\n              Proxy: '0',\n              Implementation: '',\n              SwarmSource: '',\n            },\n          ],\n        })\n\n      throw new Error(`Unhandled request: ${search}`)\n    }),\n  ]\n}\n"
  },
  {
    "path": "packages/cli/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"include\": [\"src/**/*.ts\"],\n  \"exclude\": [\"src/**/*.test.ts\"],\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"types\": [\"@types/node\"]\n  }\n}\n"
  },
  {
    "path": "packages/cli/tsconfig.json",
    "content": "{\n  \"extends\": \"./tsconfig.build.json\",\n  \"include\": [\"src/**/*.ts\", \"test/**/*.ts\", \"types/**/*.d.ts\"],\n  \"exclude\": []\n}\n"
  },
  {
    "path": "packages/cli/types/fixturez.d.ts",
    "content": "declare module 'fixturez' {\n  interface FixturezOpts {\n    glob?: string\n    cleanup?: boolean\n    root?: string\n  }\n\n  interface Fixturez {\n    find(basename: string): string\n    copy(basename: string): string\n    temp(): string\n    cleanup(): void\n  }\n\n  function fixturez(dirname: string, opts?: FixturezOpts): Fixturez\n\n  export = fixturez\n}\n"
  },
  {
    "path": "packages/connectors/CHANGELOG.md",
    "content": "# @wagmi/connectors\n\n## 7.2.1\n\n### Patch Changes\n\n- Updated dependencies [[`8b96e2f`](https://github.com/wevm/wagmi/commit/8b96e2f46d9b3441d3b499b03924700ac0629be6)]:\n  - @wagmi/core@3.4.0\n\n## 7.2.0\n\n### Minor Changes\n\n- **Breaking:** Removed `gemini` connector (former sponsor). If you still need this connector, vendor the [source code](https://github.com/wevm/wagmi/blob/9bbf13eac895669e70b233de767c8731d221f16e/packages/connectors/src/gemini.ts) into your project directly. ([`9dbdd82`](https://github.com/wevm/wagmi/commit/9dbdd8277808eb361fe7fe01ea34e4c6bb85c7a5))\n\n### Patch Changes\n\n- Updated dependencies [[`c1dedd9`](https://github.com/wevm/wagmi/commit/c1dedd99c0a1878d7cd48476946868636ac81dd8)]:\n  - @wagmi/core@3.3.4\n\n## 7.1.7\n\n### Patch Changes\n\n- Updated dependencies [[`4b3f5a3`](https://github.com/wevm/wagmi/commit/4b3f5a3f7b3f242e8fbc1f08ae2f81ae13c5e09f)]:\n  - @wagmi/core@3.3.3\n\n## 7.1.6\n\n### Patch Changes\n\n- Updated dependencies [[`68e17db`](https://github.com/wevm/wagmi/commit/68e17db7ff84982db8f52f54e6f047c5efab62ab)]:\n  - @wagmi/core@3.3.2\n\n## 7.1.5\n\n### Patch Changes\n\n- Updated dependencies [[`7f756bd`](https://github.com/wevm/wagmi/commit/7f756bda12cd332016f0bb3a2f20307c37499309)]:\n  - @wagmi/core@3.3.1\n\n## 7.1.4\n\n### Patch Changes\n\n- Updated dependencies [[`dfe7904`](https://github.com/wevm/wagmi/commit/dfe790426d5ac24d55eacdf8d0193292de801911), [`d503a2c`](https://github.com/wevm/wagmi/commit/d503a2cb6ef96018669a66d03f72a2b2b06dc0fb), [`5399840`](https://github.com/wevm/wagmi/commit/53998407645edd95d85e50a931acaed87c05e256), [`5978cc5`](https://github.com/wevm/wagmi/commit/5978cc508ac837be88ed84c15ea5aa805f59005a), [`67612ed`](https://github.com/wevm/wagmi/commit/67612edfbcb971b71c86964aae72ff3ef80bbe10), [`dbe9484`](https://github.com/wevm/wagmi/commit/dbe9484c1a635c3fc9b658a7d8e34ccc0a82ed1d)]:\n  - @wagmi/core@3.3.0\n\n## 7.1.3\n\n### Patch Changes\n\n- Updated dependencies [[`979fe26`](https://github.com/wevm/wagmi/commit/979fe265e5273a8b49a4469ffab88b1a18b1aeaa), [`979fe26`](https://github.com/wevm/wagmi/commit/979fe265e5273a8b49a4469ffab88b1a18b1aeaa), [`e4541de`](https://github.com/wevm/wagmi/commit/e4541def76a1744dc36c188453265cc6e9d83722)]:\n  - @wagmi/core@3.2.3\n\n## 7.1.2\n\n### Patch Changes\n\n- Updated dependencies [[`4fefa57`](https://github.com/wevm/wagmi/commit/4fefa576014820b454344b579282ddecde5c7994)]:\n  - @wagmi/core@3.2.2\n\n## 7.1.1\n\n### Patch Changes\n\n- Updated dependencies [[`a373b50`](https://github.com/wevm/wagmi/commit/a373b504f2ba199ca63ec0da6138ad1aa12a3a8f)]:\n  - @wagmi/core@3.2.1\n\n## 7.1.0\n\n### Patch Changes\n\n- Updated dependencies [[`2ee3f55`](https://github.com/wevm/wagmi/commit/2ee3f559a2637c7aab3fca6c7d196cf238ecd63d)]:\n  - @wagmi/core@3.2.0\n\n## 7.0.7\n\n### Patch Changes\n\n- Updated dependencies [[`14989e4`](https://github.com/wevm/wagmi/commit/14989e425a36b765a6a24e5abf1782c2a26c70db)]:\n  - @wagmi/core@3.1.0\n\n## 7.0.6\n\n### Patch Changes\n\n- Updated dependencies [[`a5c4381`](https://github.com/wevm/wagmi/commit/a5c4381563374018dca0074017b21181ac027e9a)]:\n  - @wagmi/core@3.0.2\n\n## 7.0.5\n\n### Patch Changes\n\n- Fixed published exports. ([`ed86500`](https://github.com/wevm/wagmi/commit/ed86500fbd56e5f543cb04e990b2dadc08d8b3b5))\n\n## 7.0.4\n\n### Patch Changes\n\n- Fixed internal dynamic imports when using Webpack ([#4911](https://github.com/wevm/wagmi/pull/4911))\n\n## 7.0.3\n\n### Patch Changes\n\n- Updated dependencies [[`058c8c1`](https://github.com/wevm/wagmi/commit/058c8c18459a69a4aa2141e34640273a06a819f4)]:\n  - @wagmi/core@3.0.1\n\n## 7.0.2\n\n### Patch Changes\n\n- Fixed account ordering in `baseAccount` connection response ([#4882](https://github.com/wevm/wagmi/pull/4882))\n\n## 7.0.1\n\n### Patch Changes\n\n- Fixed `baseAccount` reconnect behavior ([#4884](https://github.com/wevm/wagmi/pull/4884))\n\n## 7.0.0\n\n### Major Changes\n\n- 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))\n\n  #### baseAccount\n\n  [`baseAccount`](https://wagmi.sh/core/api/connectors/baseAccount) requires `@base-org/account`\n\n  ```\n  pnpm add @base-org/account@~2.4.0\n  ```\n\n  #### coinbaseWallet\n\n  [`coinbaseWallet`](https://wagmi.sh/core/api/connectors/coinbaseWallet) requires `@coinbase/wallet-sdk`\n\n  ```\n  pnpm add @coinbase/wallet-sdk@~4.3.6\n  ```\n\n  #### gemini\n\n  [`gemini`](https://wagmi.sh/core/api/connectors/gemini) requires `@gemini-wallet/core`\n\n  ```\n  pnpm add @gemini-wallet/core@~0.3.1\n  ```\n\n  #### metaMask\n\n  [`metaMask`](https://wagmi.sh/core/api/connectors/metaMask) requires `@metamask/sdk`\n\n  ```\n  pnpm add @metamask/sdk@~0.33.1\n  ```\n\n  #### porto\n\n  [`porto`](https://wagmi.sh/core/api/connectors/porto) requires `porto`\n\n  ```\n  pnpm add porto@~0.2.35\n  ```\n\n  #### safe\n\n  [`safe`](https://wagmi.sh/core/api/connectors/safe) requires `@safe-global/safe-apps-provider` and `@safe-global/safe-apps-sdk`\n\n  ```\n  pnpm add @safe-global/safe-apps-provider@~0.18.6 @safe-global/safe-apps-sdk@~9.1.0\n  ```\n\n  #### walletConnect\n\n  [`walletConnect`](https://wagmi.sh/core/api/connectors/walletConnect) requires `walletconnect/ethereum-provider`\n\n  ```\n  pnpm add @walletconnect/ethereum-provider@~2.21.1\n  ```\n\n### Patch Changes\n\n- Updated dependencies [[`73e7326`](https://github.com/wevm/wagmi/commit/73e7326ac21303d7790765c78a7076b319b2ad26)]:\n  - @wagmi/core@3.0.0\n\n## 6.2.0\n\n### Minor Changes\n\n- Added support for `'wallet_connect'` capabilities to `baseAccount` connector ([#4877](https://github.com/wevm/wagmi/pull/4877))\n\n## 6.1.4\n\n### Patch Changes\n\n- Bumped Gemini package version ([`2ddb506`](https://github.com/wevm/wagmi/commit/2ddb506b67fcb2abb464765d2af88df2eb58de60))\n\n## 6.1.3\n\n### Patch Changes\n\n- Added warning to `walletConnect` about vulnerability and relicensing. ([`65cf154`](https://github.com/wevm/wagmi/commit/65cf1544d65bfb1fb830c405a371e8cd3c3fb73e))\n\n## 6.1.2\n\n### Patch Changes\n\n- Bumped connector deps ([#4843](https://github.com/wevm/wagmi/pull/4843))\n\n## 6.1.1\n\n### Patch Changes\n\n- Bumped Porto version ([`990dd23`](https://github.com/wevm/wagmi/commit/990dd2339e96b302931056e0fb898bd2dd42a04d))\n\n## 6.1.0\n\n### Minor Changes\n\n- Added `getPortoInstance` method to `porto`. ([#4837](https://github.com/wevm/wagmi/pull/4837))\n\n## 6.0.1\n\n### Patch Changes\n\n- Updated dependencies [[`74100b0`](https://github.com/wevm/wagmi/commit/74100b0dea2dfe7b057fdbe1660596554c70642e)]:\n  - @wagmi/core@2.22.1\n\n## 6.0.0\n\n### Patch Changes\n\n- Updated dependencies [[`ebb2352`](https://github.com/wevm/wagmi/commit/ebb2352375e05e52d0bcf6ae1a60ac4e798bf29f)]:\n  - @wagmi/core@2.22.0\n\n## 5.11.2\n\n### Patch Changes\n\n- Added `chainId` parameter on `walletConnect#getProvider` ([#4806](https://github.com/wevm/wagmi/pull/4806))\n\n- Updated dependencies [[`866aeb0`](https://github.com/wevm/wagmi/commit/866aeb0e6361ef9114246e50149c1077bc05bf10)]:\n  - @wagmi/core@2.21.2\n\n## 5.11.1\n\n### Patch Changes\n\n- Updated `porto`. ([`41eb70e`](https://github.com/wevm/wagmi/commit/41eb70e072774b282053a5e98669a7d01c0e2438))\n\n- Pulled `porto` connector implementation. ([#4801](https://github.com/wevm/wagmi/pull/4801))\n\n## 5.11.0\n\n### Minor Changes\n\n- Added `porto` connector. ([#4794](https://github.com/wevm/wagmi/pull/4794))\n\n## 5.10.2\n\n### Patch Changes\n\n- Updated dependencies [[`72b703a`](https://github.com/wevm/wagmi/commit/72b703ab379c74ecf88f637cf47f31786c823a48)]:\n  - @wagmi/core@2.21.1\n\n## 5.10.1\n\n### Patch Changes\n\n- 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))\n\n## 5.10.0\n\n### Minor Changes\n\n- [#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.\n\n### Patch Changes\n\n- Updated dependencies [[`8736133a13eb82099e20468b735525a266fdfd6c`](https://github.com/wevm/wagmi/commit/8736133a13eb82099e20468b735525a266fdfd6c)]:\n  - @wagmi/core@2.21.0\n\n## 5.9.9\n\n### Patch Changes\n\n- Updated dependencies [[`ce06e137e7bfaf000464b1cecd6c86e19a66ebcf`](https://github.com/wevm/wagmi/commit/ce06e137e7bfaf000464b1cecd6c86e19a66ebcf)]:\n  - @wagmi/core@2.20.3\n\n## 5.9.8\n\n### Patch Changes\n\n- [#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`.\n\n## 5.9.7\n\n### Patch Changes\n\n- Updated dependencies [[`986b96427a4bb743d2673dfbc7e8cb5041316db3`](https://github.com/wevm/wagmi/commit/986b96427a4bb743d2673dfbc7e8cb5041316db3)]:\n  - @wagmi/core@2.20.2\n\n## 5.9.6\n\n### Patch Changes\n\n- Updated dependencies [[`d4c367ca46c508598c997cf229a31593a1e2b8b8`](https://github.com/wevm/wagmi/commit/d4c367ca46c508598c997cf229a31593a1e2b8b8)]:\n  - @wagmi/core@2.20.1\n\n## 5.9.5\n\n### Patch Changes\n\n- Updated dependencies [[`a13aa2b68890f180f6ac3f741cbb9817494cb66c`](https://github.com/wevm/wagmi/commit/a13aa2b68890f180f6ac3f741cbb9817494cb66c)]:\n  - @wagmi/core@2.20.0\n\n## 5.9.4\n\n### Patch Changes\n\n- [#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\n\n## 5.9.3\n\n### Patch Changes\n\n- [#4759](https://github.com/wevm/wagmi/pull/4759) [`909324d28c81e15c9df312b277dcff1983fbae4d`](https://github.com/wevm/wagmi/commit/909324d28c81e15c9df312b277dcff1983fbae4d) Thanks [@mikelxc](https://github.com/mikelxc)! - Added Gemini\n\n## 5.9.2\n\n### Patch Changes\n\n- Updated dependencies [[`b5f017dbc707729eb0b36d617352be224d1139d4`](https://github.com/wevm/wagmi/commit/b5f017dbc707729eb0b36d617352be224d1139d4)]:\n  - @wagmi/core@2.19.0\n\n## 5.9.1\n\n### Patch Changes\n\n- [`6fbafd425e488dbeee8404162dbeb3c737eeb8cf`](https://github.com/wevm/wagmi/commit/6fbafd425e488dbeee8404162dbeb3c737eeb8cf) Thanks [@jxom](https://github.com/jxom)! - Updated `@base-org/account`\n\n- Updated dependencies [[`6514ba29a5acb918773235fed0238d7d679d06d5`](https://github.com/wevm/wagmi/commit/6514ba29a5acb918773235fed0238d7d679d06d5)]:\n  - @wagmi/core@2.18.1\n\n## 5.9.0\n\n### Minor Changes\n\n- [#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.\n\n### Patch Changes\n\n- Updated dependencies [[`eac550ae5b49f96a7e3404a6d88adc62d3889013`](https://github.com/wevm/wagmi/commit/eac550ae5b49f96a7e3404a6d88adc62d3889013)]:\n  - @wagmi/core@2.18.0\n\n## 5.8.6\n\n### Patch Changes\n\n- [#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\n\n## 5.8.5\n\n### Patch Changes\n\n- Updated dependencies [[`7ce242b549d8cc78e6c319d9ee419693da36704c`](https://github.com/wevm/wagmi/commit/7ce242b549d8cc78e6c319d9ee419693da36704c)]:\n  - @wagmi/core@2.17.3\n\n## 5.8.4\n\n### Patch Changes\n\n- [#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\n\n## 5.8.3\n\n### Patch Changes\n\n- [#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`\n\n## 5.8.2\n\n### Patch Changes\n\n- Updated dependencies [[`29297a48af72b537173d948ccd2fe37d39914c66`](https://github.com/wevm/wagmi/commit/29297a48af72b537173d948ccd2fe37d39914c66), [`07370106d5fb6b8fe300992d93abf25b3d0eaf57`](https://github.com/wevm/wagmi/commit/07370106d5fb6b8fe300992d93abf25b3d0eaf57)]:\n  - @wagmi/core@2.17.2\n\n## 5.8.1\n\n### Patch Changes\n\n- Updated dependencies [[`01f64e64fa4f85cdd30023903f972f4f9023681f`](https://github.com/wevm/wagmi/commit/01f64e64fa4f85cdd30023903f972f4f9023681f)]:\n  - @wagmi/core@2.17.1\n\n## 5.8.0\n\n### Minor Changes\n\n- [#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`.\n\n## 5.7.13\n\n### Patch Changes\n\n- [#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\n\n- [#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`.\n\n- Updated dependencies [[`799ee4d4b23c2ecd64e3f3668e67634e81939719`](https://github.com/wevm/wagmi/commit/799ee4d4b23c2ecd64e3f3668e67634e81939719)]:\n  - @wagmi/core@2.17.0\n\n## 5.7.12\n\n### Patch Changes\n\n- [#4608](https://github.com/wevm/wagmi/pull/4608) [`b59c024b23c69f5459b17390531207cfdf126ce4`](https://github.com/wevm/wagmi/commit/b59c024b23c69f5459b17390531207cfdf126ce4) Thanks [@jxom](https://github.com/jxom)! - Updated `@walletconnect/ethereum-provider`.\n\n## 5.7.11\n\n### Patch Changes\n\n- Updated dependencies [[`a4bd0623eed28e3761a27295831a60ad835f0ee0`](https://github.com/wevm/wagmi/commit/a4bd0623eed28e3761a27295831a60ad835f0ee0)]:\n  - @wagmi/core@2.16.7\n\n## 5.7.10\n\n### Patch Changes\n\n- [#4573](https://github.com/wevm/wagmi/pull/4573) [`e944812ebc234a72c1417b77cff341166f5e0fef`](https://github.com/wevm/wagmi/commit/e944812ebc234a72c1417b77cff341166f5e0fef) Thanks [@ganchoradkov](https://github.com/ganchoradkov)! - updated `@walletconnect/ethereum-provider` to `2.19.1`\n\n- Updated dependencies [[`edf47477b2f6385a1c3ae01d36a8498c47f30a0b`](https://github.com/wevm/wagmi/commit/edf47477b2f6385a1c3ae01d36a8498c47f30a0b)]:\n  - @wagmi/core@2.16.6\n\n## 5.7.9\n\n### Patch Changes\n\n- [#4571](https://github.com/wevm/wagmi/pull/4571) [`5b7101fddb61df56e34b2e02b46bc409e496eaf9`](https://github.com/wevm/wagmi/commit/5b7101fddb61df56e34b2e02b46bc409e496eaf9) Thanks [@ganchoradkov](https://github.com/ganchoradkov)! - Updated `@walletconnect/ethereum-provider` to `2.19.0`\n\n## 5.7.8\n\n### Patch Changes\n\n- Updated dependencies [[`d0c9a86921a4e939373cc6e763284e53f2a2e93c`](https://github.com/wevm/wagmi/commit/d0c9a86921a4e939373cc6e763284e53f2a2e93c)]:\n  - @wagmi/core@2.16.5\n\n## 5.7.7\n\n### Patch Changes\n\n- [`507f864d91238bfd423d0e36d3619eb9f6e52eec`](https://github.com/wevm/wagmi/commit/507f864d91238bfd423d0e36d3619eb9f6e52eec) Thanks [@jxom](https://github.com/jxom)! - Updated `@coinbase/wallet-sdk`.\n\n- Updated dependencies [[`507f864d91238bfd423d0e36d3619eb9f6e52eec`](https://github.com/wevm/wagmi/commit/507f864d91238bfd423d0e36d3619eb9f6e52eec)]:\n  - @wagmi/core@2.16.4\n\n## 5.7.6\n\n### Patch Changes\n\n- [#4524](https://github.com/wevm/wagmi/pull/4524) [`639952c97f0fe3927106f42d3c9f7f366cdf7f7a`](https://github.com/wevm/wagmi/commit/639952c97f0fe3927106f42d3c9f7f366cdf7f7a) Thanks [@chakra-guy](https://github.com/chakra-guy)! - Updated MetaMask SDK.\n\n- [#4525](https://github.com/wevm/wagmi/pull/4525) [`5aa2c095f7bfb6dfcf91c6945c3e1f9c9dd05766`](https://github.com/wevm/wagmi/commit/5aa2c095f7bfb6dfcf91c6945c3e1f9c9dd05766) Thanks [@EdouardBougon](https://github.com/EdouardBougon)! - Added Phantom flag to Injected Connector.\n\n## 5.7.5\n\n### Patch Changes\n\n- [#4512](https://github.com/wevm/wagmi/pull/4512) [`a257e8d4f97431a4af872cda1817b4ae17c7bbed`](https://github.com/wevm/wagmi/commit/a257e8d4f97431a4af872cda1817b4ae17c7bbed) Thanks [@EdouardBougon](https://github.com/EdouardBougon)! - Fixed MetaMask switchChain/addChain handling.\n\n## 5.7.4\n\n### Patch Changes\n\n- [#4505](https://github.com/wevm/wagmi/pull/4505) [`c8a257e0f6d2ece013b873895c35769a8a804fdc`](https://github.com/wevm/wagmi/commit/c8a257e0f6d2ece013b873895c35769a8a804fdc) Thanks [@chakra-guy](https://github.com/chakra-guy)! - Bumped Metamask SDK Version (changes include [bug fixes and minor changes](https://github.com/MetaMask/metamask-sdk/pull/1194)).\n\n## 5.7.3\n\n### Patch Changes\n\n- [#4480](https://github.com/wevm/wagmi/pull/4480) [`384a1d91597622eb59e1c05dc13ce25017c5b6d8`](https://github.com/wevm/wagmi/commit/384a1d91597622eb59e1c05dc13ce25017c5b6d8) Thanks [@RodeRickIsWatching](https://github.com/RodeRickIsWatching)! - Fixed invocation of default storage.\n\n- Updated dependencies [[`384a1d91597622eb59e1c05dc13ce25017c5b6d8`](https://github.com/wevm/wagmi/commit/384a1d91597622eb59e1c05dc13ce25017c5b6d8)]:\n  - @wagmi/core@2.16.3\n\n## 5.7.2\n\n### Patch Changes\n\n- [`012907032b532a438fce48f407470250cbc8f0c6`](https://github.com/wevm/wagmi/commit/012907032b532a438fce48f407470250cbc8f0c6) Thanks [@jxom](https://github.com/jxom)! - Fixed assignment in `getDefaultStorage`.\n\n- Updated dependencies [[`012907032b532a438fce48f407470250cbc8f0c6`](https://github.com/wevm/wagmi/commit/012907032b532a438fce48f407470250cbc8f0c6)]:\n  - @wagmi/core@2.16.2\n\n## 5.7.1\n\n### Patch Changes\n\n- [#4471](https://github.com/wevm/wagmi/pull/4471) [`9c8c35a3b829f2c58edcd3a29e2dcd99974d7470`](https://github.com/wevm/wagmi/commit/9c8c35a3b829f2c58edcd3a29e2dcd99974d7470) Thanks [@EdouardBougon](https://github.com/EdouardBougon)! - Improved MetaMask chain switching behavior.\n\n- Updated dependencies [[`3892ebd21c06beef4b28ece4e70d2a38807bce6f`](https://github.com/wevm/wagmi/commit/3892ebd21c06beef4b28ece4e70d2a38807bce6f)]:\n  - @wagmi/core@2.16.1\n\n## 5.7.0\n\n### Minor Changes\n\n- [#4440](https://github.com/wevm/wagmi/pull/4440) [`e3f63a02c1f7d80481804584f262bc98dab0400d`](https://github.com/wevm/wagmi/commit/e3f63a02c1f7d80481804584f262bc98dab0400d) Thanks [@johanneskares](https://github.com/johanneskares)! - Added Coinbase Smart Wallet \"Instant Onboarding\" mode to `coinbaseWallet`.\n\n## 5.6.2\n\n### Patch Changes\n\n- [#4437](https://github.com/wevm/wagmi/pull/4437) [`adf2253b10c6d4fc583e4bc9f01a8ef5ca267c85`](https://github.com/wevm/wagmi/commit/adf2253b10c6d4fc583e4bc9f01a8ef5ca267c85) Thanks [@chybisov](https://github.com/chybisov)! - Bumped `@safe-global/safe-apps-provider` version to `0.18.5`.\n\n## 5.6.1\n\n### Patch Changes\n\n- [#4458](https://github.com/wevm/wagmi/pull/4458) [`987404f590c1d29ebb3cb68928f5e54aa032793d`](https://github.com/wevm/wagmi/commit/987404f590c1d29ebb3cb68928f5e54aa032793d) Thanks [@EdouardBougon](https://github.com/EdouardBougon)! - Fixed MetaMask internal metadata handling.\n\n## 5.6.0\n\n### Minor Changes\n\n- [#4453](https://github.com/wevm/wagmi/pull/4453) [`070e48480194c8d7f45bda1d7dd1346e6f5d7227`](https://github.com/wevm/wagmi/commit/070e48480194c8d7f45bda1d7dd1346e6f5d7227) Thanks [@tmm](https://github.com/tmm)! - Added narrowing to `config.connectors`.\n\n### Patch Changes\n\n- [#4456](https://github.com/wevm/wagmi/pull/4456) [`8b0726c1106fce88b782e676498eabf0718b2619`](https://github.com/wevm/wagmi/commit/8b0726c1106fce88b782e676498eabf0718b2619) Thanks [@EdouardBougon](https://github.com/EdouardBougon)! - Bumped MetaMask SDK and fixed internal metadata handling.\n- Updated dependencies [[`afea6b67822a7a2b96901ec851441d27ee0f7a52`](https://github.com/wevm/wagmi/commit/afea6b67822a7a2b96901ec851441d27ee0f7a52), [`070e48480194c8d7f45bda1d7dd1346e6f5d7227`](https://github.com/wevm/wagmi/commit/070e48480194c8d7f45bda1d7dd1346e6f5d7227)]:\n  - @wagmi/core@2.16.0\n\n## 5.5.3\n\n### Patch Changes\n\n- [#4433](https://github.com/wevm/wagmi/pull/4433) [`06e186cd679b27fe195309110e766fcf46d4efbc`](https://github.com/wevm/wagmi/commit/06e186cd679b27fe195309110e766fcf46d4efbc) Thanks [@Aerilym](https://github.com/Aerilym)! - Bumped Metamask SDK version to `0.31.1`.\n\n- Updated dependencies [[`06e186cd679b27fe195309110e766fcf46d4efbc`](https://github.com/wevm/wagmi/commit/06e186cd679b27fe195309110e766fcf46d4efbc)]:\n  - @wagmi/core@2.15.2\n\n## 5.5.2\n\n### Patch Changes\n\n- [#4422](https://github.com/wevm/wagmi/pull/4422) [`e563ef69130a511fd6f3f72ed4cd4fbe1390541f`](https://github.com/wevm/wagmi/commit/e563ef69130a511fd6f3f72ed4cd4fbe1390541f) Thanks [@abretonc7s](https://github.com/abretonc7s)! - Bumped MetaMask SDK.\n\n## 5.5.1\n\n### Patch Changes\n\n- Updated dependencies [[`b8bbb409f4934538e3dd6cac5aaf7346292d0693`](https://github.com/wevm/wagmi/commit/b8bbb409f4934538e3dd6cac5aaf7346292d0693)]:\n  - @wagmi/core@2.15.1\n\n## 5.5.0\n\n### Minor Changes\n\n- [#4417](https://github.com/wevm/wagmi/pull/4417) [`42e65ea4fea99c639817088bba915e0933d17141`](https://github.com/wevm/wagmi/commit/42e65ea4fea99c639817088bba915e0933d17141) Thanks [@jxom](https://github.com/jxom)! - Removed simulation in `writeContract` & `sendTransaction`.\n\n### Patch Changes\n\n- Updated dependencies [[`42e65ea4fea99c639817088bba915e0933d17141`](https://github.com/wevm/wagmi/commit/42e65ea4fea99c639817088bba915e0933d17141)]:\n  - @wagmi/core@2.15.0\n\n## 5.4.0\n\n### Minor Changes\n\n- [#4409](https://github.com/wevm/wagmi/pull/4409) [`7ca62b44cd997d48f92c2b81343726a5908aa00b`](https://github.com/wevm/wagmi/commit/7ca62b44cd997d48f92c2b81343726a5908aa00b) Thanks [@fan-zhang-sv](https://github.com/fan-zhang-sv)! - Added `preference` object for Coinbase Wallet connector.\n\n## 5.3.10\n\n### Patch Changes\n\n- [#4406](https://github.com/wevm/wagmi/pull/4406) [`a13aa8d7c38eb3cc8171a02d6302e6d12cf6bcb3`](https://github.com/wevm/wagmi/commit/a13aa8d7c38eb3cc8171a02d6302e6d12cf6bcb3) Thanks [@tmm](https://github.com/tmm)! - Added additional RDNS to MetaMask Connector.\n\n- Updated dependencies [[`a13aa8d7c38eb3cc8171a02d6302e6d12cf6bcb3`](https://github.com/wevm/wagmi/commit/a13aa8d7c38eb3cc8171a02d6302e6d12cf6bcb3)]:\n  - @wagmi/core@2.14.6\n\n## 5.3.9\n\n### Patch Changes\n\n- [`b12a04eeec985c48d2feac94b011d41fb29ca23e`](https://github.com/wevm/wagmi/commit/b12a04eeec985c48d2feac94b011d41fb29ca23e) Thanks [@tmm](https://github.com/tmm)! - Bumped Coinbase Wallet SDK version.\n\n## 5.3.8\n\n### Patch Changes\n\n- [#4390](https://github.com/wevm/wagmi/pull/4390) [`dac62dc99a0679fa632a0fae49873d6053d06b35`](https://github.com/wevm/wagmi/commit/dac62dc99a0679fa632a0fae49873d6053d06b35) Thanks [@chybisov](https://github.com/chybisov)! - Bumped Safe Apps Provider version.\n\n- Updated dependencies [[`6b9bbacdc7bffd44fc2165362a5e65fd434e7646`](https://github.com/wevm/wagmi/commit/6b9bbacdc7bffd44fc2165362a5e65fd434e7646)]:\n  - @wagmi/core@2.14.5\n\n## 5.3.7\n\n### Patch Changes\n\n- Updated dependencies [[`e08681c81fbdf475213e2d0f4c5517d0abf4e743`](https://github.com/wevm/wagmi/commit/e08681c81fbdf475213e2d0f4c5517d0abf4e743)]:\n  - @wagmi/core@2.14.4\n\n## 5.3.6\n\n### Patch Changes\n\n- [#4385](https://github.com/wevm/wagmi/pull/4385) [`7558ff3133c11bc4c49473d08ee9a47eaa12df5b`](https://github.com/wevm/wagmi/commit/7558ff3133c11bc4c49473d08ee9a47eaa12df5b) Thanks [@cb-jake](https://github.com/cb-jake)! - Bumped Coinbase Wallet SDK version.\n\n## 5.3.5\n\n### Patch Changes\n\n- [`7fe78f2d09778fc01fd0cffe85ba198e64999275`](https://github.com/wevm/wagmi/commit/7fe78f2d09778fc01fd0cffe85ba198e64999275) Thanks [@tmm](https://github.com/tmm)! - Fixed MetaMask connector not returning provider in some cases.\n\n- Updated dependencies [[`cb7dd2ebb871d0be8f1a11a8cd8ce592cd74b7c7`](https://github.com/wevm/wagmi/commit/cb7dd2ebb871d0be8f1a11a8cd8ce592cd74b7c7)]:\n  - @wagmi/core@2.14.3\n\n## 5.3.4\n\n### Patch Changes\n\n- [#4371](https://github.com/wevm/wagmi/pull/4371) [`b6861a4c378dab78d8751ae0ac2aa425f3c24b8f`](https://github.com/wevm/wagmi/commit/b6861a4c378dab78d8751ae0ac2aa425f3c24b8f) Thanks [@iceanddust](https://github.com/iceanddust)! - Fixed Safe connector not working in some Vite apps\n\n- Updated dependencies [[`d0d0963bb5904a15cf0355862d62dd141ce0c31c`](https://github.com/wevm/wagmi/commit/d0d0963bb5904a15cf0355862d62dd141ce0c31c), [`ecac0ba36243d94c9199d0bd21937104c835d9a0`](https://github.com/wevm/wagmi/commit/ecac0ba36243d94c9199d0bd21937104c835d9a0)]:\n  - @wagmi/core@2.14.2\n\n## 5.3.3\n\n### Patch Changes\n\n- [#4362](https://github.com/wevm/wagmi/pull/4362) [`83c6d16b7d6dddfa6bda036e04f00ec313c6248c`](https://github.com/wevm/wagmi/commit/83c6d16b7d6dddfa6bda036e04f00ec313c6248c) Thanks [@EdouardBougon](https://github.com/EdouardBougon)! - Fixed MetaMask connector internal logic.\n\n## 5.3.2\n\n### Patch Changes\n\n- [#4357](https://github.com/wevm/wagmi/pull/4357) [`8970cc51398e1ac713435533096215c6d31ffdf9`](https://github.com/wevm/wagmi/commit/8970cc51398e1ac713435533096215c6d31ffdf9) Thanks [@tmm](https://github.com/tmm)! - Bumped dependencies.\n\n## 5.3.1\n\n### Patch Changes\n\n- Updated dependencies [[`052e72e1f8c1c14fcbdce04a9f8fa7ec28d83702`](https://github.com/wevm/wagmi/commit/052e72e1f8c1c14fcbdce04a9f8fa7ec28d83702), [`b250fc21ee577b2a75c5a34ff684f62fb4ad771a`](https://github.com/wevm/wagmi/commit/b250fc21ee577b2a75c5a34ff684f62fb4ad771a)]:\n  - @wagmi/core@2.14.1\n\n## 5.3.0\n\n### Minor Changes\n\n- [#4343](https://github.com/wevm/wagmi/pull/4343) [`f43e074f473820b208a6295d7c97f847332f1a1d`](https://github.com/wevm/wagmi/commit/f43e074f473820b208a6295d7c97f847332f1a1d) Thanks [@tmm](https://github.com/tmm)! - Added `rdns` property to connector interface. This is used to filter out duplicate [EIP-6963](https://eips.ethereum.org/EIPS/eip-6963) injected providers when [`createConfig#multiInjectedProviderDiscovery`](https://wagmi.sh/core/api/createConfig#multiinjectedproviderdiscovery) is enabled and `createConfig#connectors` already matches EIP-6963 providers' `rdns` property.\n\n### Patch Changes\n\n- Updated dependencies [[`f43e074f473820b208a6295d7c97f847332f1a1d`](https://github.com/wevm/wagmi/commit/f43e074f473820b208a6295d7c97f847332f1a1d)]:\n  - @wagmi/core@2.14.0\n\n## 5.2.2\n\n### Patch Changes\n\n- [#4347](https://github.com/wevm/wagmi/pull/4347) [`5ae49af590ff168426c9c283d54c34ae5148fcd9`](https://github.com/wevm/wagmi/commit/5ae49af590ff168426c9c283d54c34ae5148fcd9) Thanks [@EdouardBougon](https://github.com/EdouardBougon)! - Added workaround for MetaMask mobile sometimes disconnecting.\n\n- [#4350](https://github.com/wevm/wagmi/pull/4350) [`f3182b22e6e454d9bd74f1b940ef34431fd9555d`](https://github.com/wevm/wagmi/commit/f3182b22e6e454d9bd74f1b940ef34431fd9555d) Thanks [@abretonc7s](https://github.com/abretonc7s)! - Updated MetaMask SDK.\n\n- Updated dependencies [[`c05caabc20c3ced9682cfc7ba1f3f7dcfece0703`](https://github.com/wevm/wagmi/commit/c05caabc20c3ced9682cfc7ba1f3f7dcfece0703)]:\n  - @wagmi/core@2.13.9\n\n## 5.2.1\n\n### Patch Changes\n\n- [#4345](https://github.com/wevm/wagmi/pull/4345) [`91a40f2db08e3a91db421b8732a5511a1e6c88fd`](https://github.com/wevm/wagmi/commit/91a40f2db08e3a91db421b8732a5511a1e6c88fd) Thanks [@tmm](https://github.com/tmm)! - Bumped MetaMask SDK.\n\n## 5.2.0\n\n### Minor Changes\n\n- [#4337](https://github.com/wevm/wagmi/pull/4337) [`34a0c3b7eea778aee7c27f7ace5e4b2be4e8a0a4`](https://github.com/wevm/wagmi/commit/34a0c3b7eea778aee7c27f7ace5e4b2be4e8a0a4) Thanks [@tmm](https://github.com/tmm)! - Added \"Connect and Sign\" behavior to MetaMask Connector.\n\n## 5.1.15\n\n### Patch Changes\n\n- [`3b2123664b7ac66848390739e855c3b9702ab60c`](https://github.com/wevm/wagmi/commit/3b2123664b7ac66848390739e855c3b9702ab60c) Thanks [@tmm](https://github.com/tmm)! - Bumped WalletConnect Provider.\n\n## 5.1.14\n\n### Patch Changes\n\n- [#4207](https://github.com/wevm/wagmi/pull/4207) [`56f2482508f2ba71bd6b0295c70c6abca7101e57`](https://github.com/wevm/wagmi/commit/56f2482508f2ba71bd6b0295c70c6abca7101e57) Thanks [@Smert](https://github.com/Smert)! - Updated chain switch listener for `injected` and `metaMask` to be more robust.\n\n- Updated dependencies [[`56f2482508f2ba71bd6b0295c70c6abca7101e57`](https://github.com/wevm/wagmi/commit/56f2482508f2ba71bd6b0295c70c6abca7101e57)]:\n  - @wagmi/core@2.13.8\n\n## 5.1.13\n\n### Patch Changes\n\n- Updated dependencies [[`be75c2d4ef636d7362420ab0a106bfdf63f5d1e6`](https://github.com/wevm/wagmi/commit/be75c2d4ef636d7362420ab0a106bfdf63f5d1e6)]:\n  - @wagmi/core@2.13.7\n\n## 5.1.12\n\n### Patch Changes\n\n- Updated dependencies [[`edcbf5d6fbe92f639bead800502edda9e0aa39f1`](https://github.com/wevm/wagmi/commit/edcbf5d6fbe92f639bead800502edda9e0aa39f1)]:\n  - @wagmi/core@2.13.6\n\n## 5.1.11\n\n### Patch Changes\n\n- [#4271](https://github.com/wevm/wagmi/pull/4271) [`82404c960e04c83e0bae6e1e12459ef9debf9554`](https://github.com/wevm/wagmi/commit/82404c960e04c83e0bae6e1e12459ef9debf9554) Thanks [@omridan159](https://github.com/omridan159)! - Bumped MetaMask SDK.\n\n- [#4227](https://github.com/wevm/wagmi/pull/4227) [`d07ad7f63a018256908a673d078aaf79e47ac703`](https://github.com/wevm/wagmi/commit/d07ad7f63a018256908a673d078aaf79e47ac703) Thanks [@xianchenxc](https://github.com/xianchenxc)! - Fixed MetaMask Connector throwing error after switching to a chain that was just added via `'wallet_addEthereumChain'`.\n\n## 5.1.10\n\n### Patch Changes\n\n- [#4255](https://github.com/wevm/wagmi/pull/4255) [`81de006e66121a18c61945c1f9b8426c83a5713c`](https://github.com/wevm/wagmi/commit/81de006e66121a18c61945c1f9b8426c83a5713c) Thanks [@tomiir](https://github.com/tomiir)! - Bumped `@walletconnect/ethereum-provider` from version `2.15.3` to version `2.16.1`.\n\n- Updated dependencies [[`f47ce8f6d263e49fdff90b8edb3190142d2657bb`](https://github.com/wevm/wagmi/commit/f47ce8f6d263e49fdff90b8edb3190142d2657bb)]:\n  - @wagmi/core@2.13.5\n\n## 5.1.9\n\n### Patch Changes\n\n- [#4243](https://github.com/wevm/wagmi/pull/4243) [`21bd0e473d374cbbd7a01bececa6022d529026ba`](https://github.com/wevm/wagmi/commit/21bd0e473d374cbbd7a01bececa6022d529026ba) Thanks [@tomiir](https://github.com/tomiir)! - Bumped `@walletconnect/ethereum-provider` from version `2.15.2` to version `2.15.3`\n\n- [#4251](https://github.com/wevm/wagmi/pull/4251) [`5c89c6853e616437a3be2b019db895451fecfb3c`](https://github.com/wevm/wagmi/commit/5c89c6853e616437a3be2b019db895451fecfb3c) Thanks [@tmm](https://github.com/tmm)! - Bumped MM SDK.\n\n## 5.1.8\n\n### Patch Changes\n\n- [`b580ad4edff1721e0b9d138cf5ae2ec74d2374c7`](https://github.com/wevm/wagmi/commit/b580ad4edff1721e0b9d138cf5ae2ec74d2374c7) Thanks [@tmm](https://github.com/tmm)! - Bumped WalletConnect Provider.\n\n## 5.1.7\n\n### Patch Changes\n\n- [#4213](https://github.com/wevm/wagmi/pull/4213) [`91fd81a068789c5020e891f539bcad8f54a7a52f`](https://github.com/wevm/wagmi/commit/91fd81a068789c5020e891f539bcad8f54a7a52f) Thanks [@tomiir](https://github.com/tomiir)! - Updated `@walletconnect/ethereum-provider` from version `2.15.0` to version `2.15.1`.\n\n## 5.1.6\n\n### Patch Changes\n\n- [#4208](https://github.com/wevm/wagmi/pull/4208) [`3168616298cbb6135d0ffda771cba4126e83eba8`](https://github.com/wevm/wagmi/commit/3168616298cbb6135d0ffda771cba4126e83eba8) Thanks [@tomiir](https://github.com/tomiir)! - Updated WalletConnect Ethereum Provider version from `2.14.0` to `2.15.0`.\n\n- [#4211](https://github.com/wevm/wagmi/pull/4211) [`d7608ef9a79459465dc8c06a2ab740465c881907`](https://github.com/wevm/wagmi/commit/d7608ef9a79459465dc8c06a2ab740465c881907) Thanks [@tmm](https://github.com/tmm)! - Added default name for MetaMask Connector.\n\n## 5.1.5\n\n### Patch Changes\n\n- Updated dependencies [[`b4c8971788c70b09479946ecfa998cff2f1b3953`](https://github.com/wevm/wagmi/commit/b4c8971788c70b09479946ecfa998cff2f1b3953)]:\n  - @wagmi/core@2.13.4\n\n## 5.1.4\n\n### Patch Changes\n\n- Updated dependencies [[`871dbdbfe59ac8ad01d1ec6150ea7b091b7b7de4`](https://github.com/wevm/wagmi/commit/871dbdbfe59ac8ad01d1ec6150ea7b091b7b7de4)]:\n  - @wagmi/core@2.13.3\n\n## 5.1.3\n\n### Patch Changes\n\n- Updated dependencies [[`1b9b523fa9b9dfe839aecdf4b40caa9547d7e594`](https://github.com/wevm/wagmi/commit/1b9b523fa9b9dfe839aecdf4b40caa9547d7e594)]:\n  - @wagmi/core@2.13.2\n\n## 5.1.2\n\n### Patch Changes\n\n- [`abb490dac4f0f02f46cb0878e7ca9a0db6aada56`](https://github.com/wevm/wagmi/commit/abb490dac4f0f02f46cb0878e7ca9a0db6aada56) Thanks [@tmm](https://github.com/tmm)! - Bumped MetaMask SDK version.\n\n- [`28e0e5c9a4f856583f9d36a807502bd51a0c6ec2`](https://github.com/wevm/wagmi/commit/28e0e5c9a4f856583f9d36a807502bd51a0c6ec2) Thanks [@tmm](https://github.com/tmm)! - Bumped WalletConnect Ethereum Provider version.\n\n## 5.1.1\n\n### Patch Changes\n\n- Updated dependencies [[`07c1227f306d0efb9421d4bb77a774f92f5fcf45`](https://github.com/wevm/wagmi/commit/07c1227f306d0efb9421d4bb77a774f92f5fcf45)]:\n  - @wagmi/core@2.13.1\n\n## 5.1.0\n\n### Minor Changes\n\n- [#4162](https://github.com/wevm/wagmi/pull/4162) [`a73a7737b756886b388f120ae423e72cca53e8a0`](https://github.com/wevm/wagmi/commit/a73a7737b756886b388f120ae423e72cca53e8a0) Thanks [@jxom](https://github.com/jxom)! - Added functionality for consumer-defined RPC URLs (`config.transports`) to be propagated to the WalletConnect & MetaMask Connectors.\n\n### Patch Changes\n\n- Updated dependencies [[`a73a7737b756886b388f120ae423e72cca53e8a0`](https://github.com/wevm/wagmi/commit/a73a7737b756886b388f120ae423e72cca53e8a0)]:\n  - @wagmi/core@2.13.0\n\n## 5.0.26\n\n### Patch Changes\n\n- [`8d81df5cc884d0a210dedd3c1ea0e2e9e52b83c5`](https://github.com/wevm/wagmi/commit/8d81df5cc884d0a210dedd3c1ea0e2e9e52b83c5) Thanks [@tmm](https://github.com/tmm)! - Fixed `metaMask` connector switch chain issue.\n\n- Updated dependencies [[`5bc8c8877810b2eec24a829df87dce40a51e6f20`](https://github.com/wevm/wagmi/commit/5bc8c8877810b2eec24a829df87dce40a51e6f20)]:\n  - @wagmi/core@2.12.2\n\n## 5.0.25\n\n### Patch Changes\n\n- [#4146](https://github.com/wevm/wagmi/pull/4146) [`cc996e08e930c9e88cf753a1e874652059e81a3b`](https://github.com/wevm/wagmi/commit/cc996e08e930c9e88cf753a1e874652059e81a3b) Thanks [@jxom](https://github.com/jxom)! - Updated `@safe-global/safe-apps-sdk` + `@safe-global/safe-apps-provider` dependencies.\n\n- Updated dependencies [[`cc996e08e930c9e88cf753a1e874652059e81a3b`](https://github.com/wevm/wagmi/commit/cc996e08e930c9e88cf753a1e874652059e81a3b)]:\n  - @wagmi/core@2.12.1\n\n## 5.0.24\n\n### Patch Changes\n\n- Updated dependencies [[`5581a810ef70308e99c6f8b630cd4bca59f64afc`](https://github.com/wevm/wagmi/commit/5581a810ef70308e99c6f8b630cd4bca59f64afc)]:\n  - @wagmi/core@2.12.0\n\n## 5.0.23\n\n### Patch Changes\n\n- [`d3814ab4b88f9f0e052b53bc3d458df87b43f01d`](https://github.com/wevm/wagmi/commit/d3814ab4b88f9f0e052b53bc3d458df87b43f01d) Thanks [@jxom](https://github.com/jxom)! - Updated `mipd` dependency.\n\n- Updated dependencies [[`b08013eaa9ce97c02f8a7128ea400e3da7ef74bb`](https://github.com/wevm/wagmi/commit/b08013eaa9ce97c02f8a7128ea400e3da7ef74bb), [`d3814ab4b88f9f0e052b53bc3d458df87b43f01d`](https://github.com/wevm/wagmi/commit/d3814ab4b88f9f0e052b53bc3d458df87b43f01d)]:\n  - @wagmi/core@2.11.8\n\n## 5.0.22\n\n### Patch Changes\n\n- [`0bb8b562ae04ecfeb2d6b2f1b980ebae31dc127e`](https://github.com/wevm/wagmi/commit/0bb8b562ae04ecfeb2d6b2f1b980ebae31dc127e) Thanks [@tmm](https://github.com/tmm)! - Improved TypeScript `'exactOptionalPropertyTypes'` support.\n\n- Updated dependencies [[`0bb8b562ae04ecfeb2d6b2f1b980ebae31dc127e`](https://github.com/wevm/wagmi/commit/0bb8b562ae04ecfeb2d6b2f1b980ebae31dc127e)]:\n  - @wagmi/core@2.11.7\n\n## 5.0.21\n\n### Patch Changes\n\n- [#4094](https://github.com/wevm/wagmi/pull/4094) [`ff0760b5900114bcfdf420a9fba3cc278ac95afe`](https://github.com/wevm/wagmi/commit/ff0760b5900114bcfdf420a9fba3cc278ac95afe) Thanks [@omridan159](https://github.com/omridan159)! - Bumped MetaMask SDK to fix `metaMask` connector error bubbling.\n\n- Updated dependencies [[`95965c1f19d480b97f2b297a077a9e607dee32ad`](https://github.com/wevm/wagmi/commit/95965c1f19d480b97f2b297a077a9e607dee32ad)]:\n  - @wagmi/core@2.11.6\n\n## 5.0.20\n\n### Patch Changes\n\n- [`43fa971d34cac57fa5a2898ad4d839b95d7af37c`](https://github.com/wevm/wagmi/commit/43fa971d34cac57fa5a2898ad4d839b95d7af37c) Thanks [@tmm](https://github.com/tmm)! - Bumped Coinbase Wallet SDK and fixed `metaMask` connector hang on mobile.\n\n## 5.0.19\n\n### Patch Changes\n\n- [#4083](https://github.com/wevm/wagmi/pull/4083) [`b7ad208030d9f2e3f89912ff76b16cdbd848feda`](https://github.com/wevm/wagmi/commit/b7ad208030d9f2e3f89912ff76b16cdbd848feda) Thanks [@omridan159](https://github.com/omridan159)! - Bumped MetaMask SDK\n\n## 5.0.18\n\n### Patch Changes\n\n- [#4081](https://github.com/wevm/wagmi/pull/4081) [`44d24620c9e3957f3245d14d6a042736371df70b`](https://github.com/wevm/wagmi/commit/44d24620c9e3957f3245d14d6a042736371df70b) Thanks [@tmm](https://github.com/tmm)! - Bumped MetaMask SDK\n\n## 5.0.17\n\n### Patch Changes\n\n- Updated dependencies [[`04f2b846b113f3d300d82c9fa75212f1805817c5`](https://github.com/wevm/wagmi/commit/04f2b846b113f3d300d82c9fa75212f1805817c5)]:\n  - @wagmi/core@2.11.5\n\n## 5.0.16\n\n### Patch Changes\n\n- [#4071](https://github.com/wevm/wagmi/pull/4071) [`02c38c28d1aa0ad7a61c33775de603ed974c5c1b`](https://github.com/wevm/wagmi/commit/02c38c28d1aa0ad7a61c33775de603ed974c5c1b) Thanks [@omridan159](https://github.com/omridan159)! - Bumped MetaMask SDK\n\n- Updated dependencies [[`9e8345cd56186b997b5e56deaa2cfc69b30d15f6`](https://github.com/wevm/wagmi/commit/9e8345cd56186b997b5e56deaa2cfc69b30d15f6)]:\n  - @wagmi/core@2.11.4\n\n## 5.0.15\n\n### Patch Changes\n\n- Updated dependencies [[`8974e6269bb5d7bfaa90db0246bc7d13e8bff798`](https://github.com/wevm/wagmi/commit/8974e6269bb5d7bfaa90db0246bc7d13e8bff798)]:\n  - @wagmi/core@2.11.3\n\n## 5.0.14\n\n### Patch Changes\n\n- Updated dependencies [[`b4d9ef79deb554ee20fed6666a474be5e7cdd522`](https://github.com/wevm/wagmi/commit/b4d9ef79deb554ee20fed6666a474be5e7cdd522)]:\n  - @wagmi/core@2.11.2\n\n## 5.0.13\n\n### Patch Changes\n\n- [`9c862d8d63e3d692a22cef2a90782b74a9103f17`](https://github.com/wevm/wagmi/commit/9c862d8d63e3d692a22cef2a90782b74a9103f17) Thanks [@tmm](https://github.com/tmm)! - Reverted internal module loading utility.\n\n- Updated dependencies [[`9c862d8d63e3d692a22cef2a90782b74a9103f17`](https://github.com/wevm/wagmi/commit/9c862d8d63e3d692a22cef2a90782b74a9103f17)]:\n  - @wagmi/core@2.11.1\n\n## 5.0.12\n\n### Patch Changes\n\n- Updated dependencies [[`06bb598a7f04c7b167f5b7ff6d46bd15886a6a14`](https://github.com/wevm/wagmi/commit/06bb598a7f04c7b167f5b7ff6d46bd15886a6a14), [`24a45b269bd0214a29d6f82a84ac66ef8c3f3822`](https://github.com/wevm/wagmi/commit/24a45b269bd0214a29d6f82a84ac66ef8c3f3822)]:\n  - @wagmi/core@2.11.0\n\n## 5.0.11\n\n### Patch Changes\n\n- [#4020](https://github.com/wevm/wagmi/pull/4020) [`e3b124ce414b8fd1b2214e2c5a28dc72158a13d1`](https://github.com/wevm/wagmi/commit/e3b124ce414b8fd1b2214e2c5a28dc72158a13d1) Thanks [@tmm](https://github.com/tmm)! - Added reconnection support to `metaMask` on mobile and use deeplinks by default.\n\n- Updated dependencies [[`f2a7cefab96691ebed8b8e45ffde071c47b58dbe`](https://github.com/wevm/wagmi/commit/f2a7cefab96691ebed8b8e45ffde071c47b58dbe), [`f0ea0b2a7fe193dadfeb49a4c8031ee451c638b5`](https://github.com/wevm/wagmi/commit/f0ea0b2a7fe193dadfeb49a4c8031ee451c638b5)]:\n  - @wagmi/core@2.10.6\n\n## 5.0.10\n\n### Patch Changes\n\n- [`560952acd4bfe33db6c7c07b35c613cef278677c`](https://github.com/wevm/wagmi/commit/560952acd4bfe33db6c7c07b35c613cef278677c) Thanks [@tmm](https://github.com/tmm)! - Captured Coinbase Smart Wallet error when closing window as EIP-1193 `4001` error.\n\n## 5.0.9\n\n### Patch Changes\n\n- [`32cdd7b7dc5aff916c040628519562c3a99d418d`](https://github.com/wevm/wagmi/commit/32cdd7b7dc5aff916c040628519562c3a99d418d) Thanks [@tmm](https://github.com/tmm)! - Bumped `@metamask/sdk` to remove peer dependency install warning.\n\n## 5.0.8\n\n### Patch Changes\n\n- [#3997](https://github.com/wevm/wagmi/pull/3997) [`c1952d1ff7f0a491dc88595a49159451b07b5621`](https://github.com/wevm/wagmi/commit/c1952d1ff7f0a491dc88595a49159451b07b5621) Thanks [@nateReiners](https://github.com/nateReiners)! - Bumped Coinbase Wallet SDK.\n\n## 5.0.7\n\n### Patch Changes\n\n- Updated dependencies [[`030c7c2cb380dfd67a2182f62e2aa7a6e1601898`](https://github.com/wevm/wagmi/commit/030c7c2cb380dfd67a2182f62e2aa7a6e1601898)]:\n  - @wagmi/core@2.10.5\n\n## 5.0.6\n\n### Patch Changes\n\n- Updated dependencies [[`51fde8a0433b4fff357c1a8d7e08b41b4c86c968`](https://github.com/wevm/wagmi/commit/51fde8a0433b4fff357c1a8d7e08b41b4c86c968)]:\n  - @wagmi/core@2.10.4\n\n## 5.0.5\n\n### Patch Changes\n\n- [#3979](https://github.com/wevm/wagmi/pull/3979) [`70dd28669dd8d2ce08217cd02e29a8fbba7a08d4`](https://github.com/wevm/wagmi/commit/70dd28669dd8d2ce08217cd02e29a8fbba7a08d4) Thanks [@tmm](https://github.com/tmm)! - Fixed `walletConnect` connector.\n\n## 5.0.4\n\n### Patch Changes\n\n- [#3972](https://github.com/wevm/wagmi/pull/3972) [`be9e1b8a9818b92eb0654a20d9471e9e39329e7e`](https://github.com/wevm/wagmi/commit/be9e1b8a9818b92eb0654a20d9471e9e39329e7e) Thanks [@nateReiners](https://github.com/nateReiners)! - Bumped Coinbase Wallet SDK.\n\n## 5.0.3\n\n### Patch Changes\n\n- [#3962](https://github.com/wevm/wagmi/pull/3962) [`2804a8a583b1874271154898b4bae38756ef581c`](https://github.com/wevm/wagmi/commit/2804a8a583b1874271154898b4bae38756ef581c) Thanks [@tmm](https://github.com/tmm)! - Added timeout to `getInfo` called in `safe` connector since [non-Safe App iFrames cause it to not resolve](https://github.com/safe-global/safe-apps-sdk/issues/263#issuecomment-1029835840).\n\n- Updated dependencies [[`2804a8a583b1874271154898b4bae38756ef581c`](https://github.com/wevm/wagmi/commit/2804a8a583b1874271154898b4bae38756ef581c)]:\n  - @wagmi/core@2.10.3\n\n## 5.0.2\n\n### Patch Changes\n\n- [#3940](https://github.com/wevm/wagmi/pull/3940) [`a5071f581dfdfb961718873643a2fc629101c72a`](https://github.com/wevm/wagmi/commit/a5071f581dfdfb961718873643a2fc629101c72a) Thanks [@jxom](https://github.com/jxom)! - Fixed usage of `metaMask` connector in Vite environments.\n\n- Updated dependencies [[`a5071f581dfdfb961718873643a2fc629101c72a`](https://github.com/wevm/wagmi/commit/a5071f581dfdfb961718873643a2fc629101c72a)]:\n  - @wagmi/core@2.10.2\n\n## 5.0.1\n\n### Patch Changes\n\n- Bumped versions.\n\n- Updated dependencies []:\n  - @wagmi/core@2.10.1\n\n## 5.0.0\n\n### Major Changes\n\n- [#3928](https://github.com/wevm/wagmi/pull/3928) [`3117e71825f9c58a0d718f3d1686f1a191fa9cb1`](https://github.com/wevm/wagmi/commit/3117e71825f9c58a0d718f3d1686f1a191fa9cb1) Thanks [@tmm](https://github.com/tmm)! - **Breaking:** Updated default Coinbase SDK in `coinbaseWallet` Connector to v4.x.\n\n  Added a `version` property (defaults to `'4'`) to the `coinbaseWallet` Connector to target a version of the Coinbase SDK:\n\n  ```diff\n  coinbaseWallet({\n  + version: '3' | '4',\n  })\n  ```\n\n  If `headlessMode` property is set to `true`, then the Connector will target v3 of the Coinbase SDK.\n\n  The following properties are removed in v4 of the `coinbaseWallet` Connector:\n\n  - `chainId`\n  - `darkMode`\n  - `diagnosticLogger`\n  - `enableMobileDeepLink`\n  - `jsonRpcUrl`\n  - `linkApiUrl`\n  - `overrideIsCoinbaseBrowser`\n  - `overrideIsCoinbaseWallet`\n  - `overrideIsMetaMask`\n  - `reloadOnDisconnect`\n  - `uiConstructor`\n\n  Consumers can still use the above properties in v3 by passing `version: '3'` to the Connector. However, please note that v3 of the Coinbase SDK is deprecated and will be removed in a future release.\n\n### Patch Changes\n\n- Updated dependencies [[`3117e71825f9c58a0d718f3d1686f1a191fa9cb1`](https://github.com/wevm/wagmi/commit/3117e71825f9c58a0d718f3d1686f1a191fa9cb1)]:\n  - @wagmi/core@2.10.0\n\n## 4.3.10\n\n### Patch Changes\n\n- [#3906](https://github.com/wevm/wagmi/pull/3906) [`32fcb4a31dde6b0206961d8ffe9c651f8a459c67`](https://github.com/wevm/wagmi/commit/32fcb4a31dde6b0206961d8ffe9c651f8a459c67) Thanks [@tmm](https://github.com/tmm)! - Added support for Vue.\n\n- Updated dependencies [[`32fcb4a31dde6b0206961d8ffe9c651f8a459c67`](https://github.com/wevm/wagmi/commit/32fcb4a31dde6b0206961d8ffe9c651f8a459c67)]:\n  - @wagmi/core@2.9.8\n\n## 4.3.9\n\n### Patch Changes\n\n- [#3924](https://github.com/wevm/wagmi/pull/3924) [`1f58734f88458e0f6adb05c99f0c90f36ab286b8`](https://github.com/wevm/wagmi/commit/1f58734f88458e0f6adb05c99f0c90f36ab286b8) Thanks [@jxom](https://github.com/jxom)! - Refactored `isChainsStale` logic in `walletConnect` connector.\n\n- Updated dependencies [[`1f58734f88458e0f6adb05c99f0c90f36ab286b8`](https://github.com/wevm/wagmi/commit/1f58734f88458e0f6adb05c99f0c90f36ab286b8)]:\n  - @wagmi/core@2.9.7\n\n## 4.3.8\n\n### Patch Changes\n\n- [#3917](https://github.com/wevm/wagmi/pull/3917) [`05948fdad5bb4a56b08916d45b3dec2cb1e5f55b`](https://github.com/wevm/wagmi/commit/05948fdad5bb4a56b08916d45b3dec2cb1e5f55b) Thanks [@jxom](https://github.com/jxom)! - Updated `@metamask/sdk`.\n\n- Updated dependencies [[`05948fdad5bb4a56b08916d45b3dec2cb1e5f55b`](https://github.com/wevm/wagmi/commit/05948fdad5bb4a56b08916d45b3dec2cb1e5f55b)]:\n  - @wagmi/core@2.9.6\n\n## 4.3.7\n\n### Patch Changes\n\n- Updated dependencies [[`4fecbbb66d0aacd03b8c62a6455d11a33cde8f85`](https://github.com/wevm/wagmi/commit/4fecbbb66d0aacd03b8c62a6455d11a33cde8f85)]:\n  - @wagmi/core@2.9.5\n\n## 4.3.6\n\n### Patch Changes\n\n- Updated dependencies [[`e6139a97c4b8804d734b1547b5e3921ce01fbe24`](https://github.com/wevm/wagmi/commit/e6139a97c4b8804d734b1547b5e3921ce01fbe24)]:\n  - @wagmi/core@2.9.4\n\n## 4.3.5\n\n### Patch Changes\n\n- [#3904](https://github.com/wevm/wagmi/pull/3904) [`addca28ebc20f1a4367c35fe9ef786decff9c87e`](https://github.com/wevm/wagmi/commit/addca28ebc20f1a4367c35fe9ef786decff9c87e) Thanks [@jxom](https://github.com/jxom)! - Updated `@walletconnect/ethereum-provider`.\n\n- Updated dependencies [[`addca28ebc20f1a4367c35fe9ef786decff9c87e`](https://github.com/wevm/wagmi/commit/addca28ebc20f1a4367c35fe9ef786decff9c87e)]:\n  - @wagmi/core@2.9.3\n\n## 4.3.4\n\n### Patch Changes\n\n- [#3902](https://github.com/wevm/wagmi/pull/3902) [`204b7b624612405500ec098fb9e35facd3f74ca4`](https://github.com/wevm/wagmi/commit/204b7b624612405500ec098fb9e35facd3f74ca4) Thanks [@jxom](https://github.com/jxom)! - Made third-party SDK imports type-only.\n\n- Updated dependencies [[`204b7b624612405500ec098fb9e35facd3f74ca4`](https://github.com/wevm/wagmi/commit/204b7b624612405500ec098fb9e35facd3f74ca4)]:\n  - @wagmi/core@2.9.2\n\n## 4.3.3\n\n### Patch Changes\n\n- Updated dependencies [[`cda6a5d5`](https://github.com/wevm/wagmi/commit/cda6a5d56328330fbde050b4ef40b01c58d2519a)]:\n  - @wagmi/core@2.9.1\n\n## 4.3.2\n\n### Patch Changes\n\n- Updated dependencies [[`017828fc`](https://github.com/wevm/wagmi/commit/017828fc027c7a84b54ea9d627e9389f4d60d6c2)]:\n  - @wagmi/core@2.9.0\n\n## 4.3.1\n\n### Patch Changes\n\n- Updated dependencies [[`d4a78eb0`](https://github.com/wevm/wagmi/commit/d4a78eb07119d2e5617e52481ac7d6c6d1583ddc)]:\n  - @wagmi/core@2.8.1\n\n## 4.3.0\n\n### Minor Changes\n\n- [#3868](https://github.com/wevm/wagmi/pull/3868) [`c2af20b8`](https://github.com/wevm/wagmi/commit/c2af20b88cf16970d087faaec10b463357a5836e) Thanks [@jxom](https://github.com/jxom)! - Added `supportsSimulation` property to connectors that indicates if the connector's wallet supports contract simulation.\n\n### Patch Changes\n\n- Updated dependencies [[`0d141f17`](https://github.com/wevm/wagmi/commit/0d141f171d6ec44bcbfc9c876565b5e2fb8af6de), [`c2af20b8`](https://github.com/wevm/wagmi/commit/c2af20b88cf16970d087faaec10b463357a5836e)]:\n  - @wagmi/core@2.8.0\n\n## 4.2.0\n\n### Minor Changes\n\n- [#3857](https://github.com/wevm/wagmi/pull/3857) [`d4274c03`](https://github.com/wevm/wagmi/commit/d4274c03a6af5f2d26d31432016ebc14950a330e) Thanks [@tmm](https://github.com/tmm)! - Added `addEthereumChainParameter` to `switchChain`-related methods.\n\n### Patch Changes\n\n- Updated dependencies [[`d4274c03`](https://github.com/wevm/wagmi/commit/d4274c03a6af5f2d26d31432016ebc14950a330e), [`4781a405`](https://github.com/wevm/wagmi/commit/4781a4056d4ffc2c74f96a75429e9b2cd2417ad8), [`400c960b`](https://github.com/wevm/wagmi/commit/400c960b30d701c134850c695ae903a382c29b5b)]:\n  - @wagmi/core@2.7.0\n\n## 4.1.28\n\n### Patch Changes\n\n- [`e3c832a1`](https://github.com/wevm/wagmi/commit/e3c832a12c301f9b0ee129d877b3101d220ba8b2) Thanks [@jxom](https://github.com/jxom)! - Fixed undefined `navigator` issue in MetaMask connector.\n\n- Updated dependencies [[`e3c832a1`](https://github.com/wevm/wagmi/commit/e3c832a12c301f9b0ee129d877b3101d220ba8b2)]:\n  - @wagmi/core@2.6.19\n\n## 4.1.27\n\n### Patch Changes\n\n- [#3848](https://github.com/wevm/wagmi/pull/3848) [`dd40a41c`](https://github.com/wevm/wagmi/commit/dd40a41c526ab60a288aff2250ed8dba92a27b16) Thanks [@jxom](https://github.com/jxom)! - Updated MetaMask SDK.\n\n- Updated dependencies [[`dd40a41c`](https://github.com/wevm/wagmi/commit/dd40a41c526ab60a288aff2250ed8dba92a27b16)]:\n  - @wagmi/core@2.6.18\n\n## 4.1.26\n\n### Patch Changes\n\n- Updated dependencies [[`a97bfbae`](https://github.com/wevm/wagmi/commit/a97bfbaeb615cfef04665e5e7348d85d17f960f0)]:\n  - @wagmi/core@2.6.17\n\n## 4.1.25\n\n### Patch Changes\n\n- [#3788](https://github.com/wevm/wagmi/pull/3788) [`42ad380d`](https://github.com/wevm/wagmi/commit/42ad380d9a5d8bc0f61d73612142dea9d098de5e) Thanks [@tmm](https://github.com/tmm)! - Refactored connectors to remove unnecessarily event listeners.\n\n- Updated dependencies [[`42ad380d`](https://github.com/wevm/wagmi/commit/42ad380d9a5d8bc0f61d73612142dea9d098de5e)]:\n  - @wagmi/core@2.6.16\n\n## 4.1.24\n\n### Patch Changes\n\n- Updated dependencies [[`b907d5ac`](https://github.com/wevm/wagmi/commit/b907d5ac3a746bcbccc06d1fe78c5bd8f9a7d685)]:\n  - @wagmi/core@2.6.15\n\n## 4.1.23\n\n### Patch Changes\n\n- Updated dependencies [[`b3b54ef1`](https://github.com/wevm/wagmi/commit/b3b54ef179c5fa0d1694d38d4b808549a0550409), [`3da20bb8`](https://github.com/wevm/wagmi/commit/3da20bb80e7c3efeef8227ced66ad615370fc242), [`a3d1858f`](https://github.com/wevm/wagmi/commit/a3d1858fce448d2b70e36ee692ef1589b74e9d3f)]:\n  - @wagmi/core@2.6.14\n\n## 4.1.22\n\n### Patch Changes\n\n- Updated dependencies [[`b80236dc`](https://github.com/wevm/wagmi/commit/b80236dc623095fe8f1e1d10957d7776fb6ab48b)]:\n  - @wagmi/core@2.6.13\n\n## 4.1.21\n\n### Patch Changes\n\n- Updated dependencies [[`a59069e9`](https://github.com/wevm/wagmi/commit/a59069e9fab45dd606bb89a7f829fe94c51a5494), [`0acd3132`](https://github.com/wevm/wagmi/commit/0acd31320f534993af566be5490c2978b6184f66)]:\n  - @wagmi/core@2.6.12\n\n## 4.1.20\n\n### Patch Changes\n\n- [`e1ca4e63`](https://github.com/wevm/wagmi/commit/e1ca4e637ae6cec7f5902b0a2c0e0efc3b751a1d) Thanks [@tmm](https://github.com/tmm)! - Deprecated `normalizeChainId`. Use `Number` instead.\n\n- Updated dependencies [[`e1ca4e63`](https://github.com/wevm/wagmi/commit/e1ca4e637ae6cec7f5902b0a2c0e0efc3b751a1d)]:\n  - @wagmi/core@2.6.11\n\n## 4.1.19\n\n### Patch Changes\n\n- Updated dependencies [[`dbdca8fd`](https://github.com/wevm/wagmi/commit/dbdca8fd14b90c166222a66a373c1b33c06ce019)]:\n  - @wagmi/core@2.6.10\n\n## 4.1.18\n\n### Patch Changes\n\n- Updated dependencies [[`d56edf4f`](https://github.com/wevm/wagmi/commit/d56edf4f27c52acc7a0f57114454b0d3e22cacd6)]:\n  - @wagmi/core@2.6.9\n\n## 4.1.17\n\n### Patch Changes\n\n- Updated dependencies [[`e46bcd47`](https://github.com/wevm/wagmi/commit/e46bcd4738a18da15b53f6612b614379c1985374)]:\n  - @wagmi/core@2.6.8\n\n## 4.1.16\n\n### Patch Changes\n\n- [`1c1fee6a`](https://github.com/wevm/wagmi/commit/1c1fee6ab8f01f7734ac6ce05093fa8e388beb3e) Thanks [@jxom](https://github.com/jxom)! - Updated `@walletconnect/ethereum-provider`.\n\n- [#3653](https://github.com/wevm/wagmi/pull/3653) [`88a2d744`](https://github.com/wevm/wagmi/commit/88a2d744a1315908c9e54156026df3ad2435ad44) Thanks [@tash-2s](https://github.com/tash-2s)! - Fixed error occurring when adding chains without explorers to MetaMask.\n\n- Updated dependencies [[`b479b5e8`](https://github.com/wevm/wagmi/commit/b479b5e8a5866cba792862f22e6352c4fb566137), [`f5648dd2`](https://github.com/wevm/wagmi/commit/f5648dd28b3576b628f57732b89287f55acbb1c1), [`1c1fee6a`](https://github.com/wevm/wagmi/commit/1c1fee6ab8f01f7734ac6ce05093fa8e388beb3e), [`88a2d744`](https://github.com/wevm/wagmi/commit/88a2d744a1315908c9e54156026df3ad2435ad44)]:\n  - @wagmi/core@2.6.7\n\n## 4.1.15\n\n### Patch Changes\n\n- Updated dependencies [[`a91c0b64`](https://github.com/wevm/wagmi/commit/a91c0b64ba8b3e6537a560e69724eb601f26af27)]:\n  - @wagmi/core@2.6.6\n\n## 4.1.14\n\n### Patch Changes\n\n- [#3591](https://github.com/wevm/wagmi/pull/3591) [`ca5decdb`](https://github.com/wevm/wagmi/commit/ca5decdb712f81e3f5dab933a94b967bca5b6af4) Thanks [@tmm](https://github.com/tmm)! - Fixed Coinbase Wallet import.\n\n- Updated dependencies [[`c677dcd2`](https://github.com/wevm/wagmi/commit/c677dcd245dccdf69289a3d66dded237b09570a2)]:\n  - @wagmi/core@2.6.5\n\n## 4.1.13\n\n### Patch Changes\n\n- [#3569](https://github.com/wevm/wagmi/pull/3569) [`fa25b448`](https://github.com/wevm/wagmi/commit/fa25b4482504b4d9729a5687ea6d6dc959265bc0) Thanks [@svenvoskamp](https://github.com/svenvoskamp)! - Updated dependencies.\n\n- [#3558](https://github.com/wevm/wagmi/pull/3558) [`895f28e8`](https://github.com/wevm/wagmi/commit/895f28e873af7c8eda5ca85734ff67c8979fd950) Thanks [@tmm](https://github.com/tmm)! - Fixed connector warnings.\n\n- Updated dependencies [[`7c6618e6`](https://github.com/wevm/wagmi/commit/7c6618e6a0eb1ff39cf8f66b34d3ddc14be538fe), [`895f28e8`](https://github.com/wevm/wagmi/commit/895f28e873af7c8eda5ca85734ff67c8979fd950)]:\n  - @wagmi/core@2.6.4\n\n## 4.1.12\n\n### Patch Changes\n\n- Updated dependencies [[`9c3b85dd`](https://github.com/wevm/wagmi/commit/9c3b85dd0a9a4a593e1d7e029345275735330e32), [`2a72214a`](https://github.com/wevm/wagmi/commit/2a72214a2901d6b6ddd39f80238aa0bd4db670a7)]:\n  - @wagmi/core@2.6.3\n\n## 4.1.11\n\n### Patch Changes\n\n- [#3518](https://github.com/wevm/wagmi/pull/3518) [`338e857d`](https://github.com/wevm/wagmi/commit/338e857d8cb2fe85e13d9207bef14cada1c1962d) Thanks [@tmm](https://github.com/tmm)! - Bumped dependencies.\n\n- Updated dependencies [[`414eb048`](https://github.com/wevm/wagmi/commit/414eb048af492caac70c0e874dfc87c30702804a), [`338e857d`](https://github.com/wevm/wagmi/commit/338e857d8cb2fe85e13d9207bef14cada1c1962d)]:\n  - @wagmi/core@2.6.2\n\n## 4.1.10\n\n### Patch Changes\n\n- [#3510](https://github.com/wevm/wagmi/pull/3510) [`660ff80d`](https://github.com/wevm/wagmi/commit/660ff80d5b046967a446eba43ee54b8359a37d0d) Thanks [@tmm](https://github.com/tmm)! - Fixed issue where connectors returning multiple addresses didn't checksum correctly.\n\n- Updated dependencies [[`660ff80d`](https://github.com/wevm/wagmi/commit/660ff80d5b046967a446eba43ee54b8359a37d0d), [`101a7dd1`](https://github.com/wevm/wagmi/commit/101a7dd131b0cae2dc25579ecab9044290efd37b)]:\n  - @wagmi/core@2.6.1\n\n## 4.1.9\n\n### Patch Changes\n\n- [#3496](https://github.com/wevm/wagmi/pull/3496) [`ba7f8a75`](https://github.com/wevm/wagmi/commit/ba7f8a758efb07664c6e401b5e7e325e7c62341b) Thanks [@tmm](https://github.com/tmm)! - Bumped dependencies.\n\n- Updated dependencies [[`ba7f8a75`](https://github.com/wevm/wagmi/commit/ba7f8a758efb07664c6e401b5e7e325e7c62341b)]:\n  - @wagmi/core@2.6.0\n\n## 4.1.8\n\n### Patch Changes\n\n- Updated dependencies [[`ca98041d`](https://github.com/wevm/wagmi/commit/ca98041d1b39893d90246929485f4db0d1c6f9f7)]:\n  - @wagmi/core@2.5.0\n\n## 4.1.7\n\n### Patch Changes\n\n- [#3427](https://github.com/wevm/wagmi/pull/3427) [`370f1b4a`](https://github.com/wevm/wagmi/commit/370f1b4a3f154d181acf381c31c2e7862e22c0e4) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Bumped dependencies.\n\n- Updated dependencies [[`370f1b4a`](https://github.com/wevm/wagmi/commit/370f1b4a3f154d181acf381c31c2e7862e22c0e4)]:\n  - @wagmi/core@2.4.0\n\n## 4.1.6\n\n### Patch Changes\n\n- Updated dependencies [[`3be5bb7b`](https://github.com/wevm/wagmi/commit/3be5bb7b0b38646e12e6da5c762ef74dff66bcc2)]:\n  - @wagmi/core@2.3.1\n\n## 4.1.5\n\n### Patch Changes\n\n- [#3459](https://github.com/wevm/wagmi/pull/3459) [`d950b666`](https://github.com/wevm/wagmi/commit/d950b666b56700ca039ce16cdfdf34564991e7f5) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Bumped dependencies\n\n- [`1cfb6e5a`](https://github.com/wevm/wagmi/commit/1cfb6e5a875e707abcee00dd5739e87da05e8c90) Thanks [@jxom](https://github.com/jxom)! - Bumped listener limit on WalletConnect connector.\n\n- Updated dependencies [[`d950b666`](https://github.com/wevm/wagmi/commit/d950b666b56700ca039ce16cdfdf34564991e7f5), [`90ef39bb`](https://github.com/wevm/wagmi/commit/90ef39bb0f4ecb3c914d317875348e35ba0f4524), [`1cfb6e5a`](https://github.com/wevm/wagmi/commit/1cfb6e5a875e707abcee00dd5739e87da05e8c90)]:\n  - @wagmi/core@2.3.0\n\n## 4.1.4\n\n### Patch Changes\n\n- [#3443](https://github.com/wevm/wagmi/pull/3443) [`007024a6`](https://github.com/wevm/wagmi/commit/007024a684ddbecf924cdc06dd6a8854fc3d5eeb) Thanks [@jmrossy](https://github.com/jmrossy)! - Bumped dependencies.\n\n- [#3447](https://github.com/wevm/wagmi/pull/3447) [`a02a26ad`](https://github.com/wevm/wagmi/commit/a02a26ad030d3afb78f744377d61b5c60b65d97a) Thanks [@tmm](https://github.com/tmm)! - Bumped dependencies.\n\n- Updated dependencies [[`a02a26ad`](https://github.com/wevm/wagmi/commit/a02a26ad030d3afb78f744377d61b5c60b65d97a), [`007024a6`](https://github.com/wevm/wagmi/commit/007024a684ddbecf924cdc06dd6a8854fc3d5eeb)]:\n  - @wagmi/core@2.2.1\n\n## 4.1.3\n\n### Patch Changes\n\n- Updated dependencies [[`00bf10a4`](https://github.com/wevm/wagmi/commit/00bf10a428b0d1c5dac35ebf25b19571e033ac26), [`64c073f6`](https://github.com/wevm/wagmi/commit/64c073f6c2720961e2d6aff986670b73dbfab9c3), [`fb6c4148`](https://github.com/wevm/wagmi/commit/fb6c4148d9e9e2fccfbe74c8f343b444dc68dec5)]:\n  - @wagmi/core@2.2.0\n\n## 4.1.2\n\n### Patch Changes\n\n- Updated dependencies [[`e00b8205`](https://github.com/wevm/wagmi/commit/e00b82058685751637edfa9a6b2d196a12549fe7)]:\n  - @wagmi/core@2.1.2\n\n## 4.1.1\n\n### Patch Changes\n\n- [`ec0d8b41`](https://github.com/wevm/wagmi/commit/ec0d8b4112181fefb11025e436a94a6114761d37) Thanks [@tmm](https://github.com/tmm)! - Added note to `metaMask` connector.\n\n- Updated dependencies [[`64b82282`](https://github.com/wevm/wagmi/commit/64b82282c1e57e77c25aa0814673780e4d11edd4), [`ec0d8b41`](https://github.com/wevm/wagmi/commit/ec0d8b4112181fefb11025e436a94a6114761d37)]:\n  - @wagmi/core@2.1.1\n\n## 4.1.0\n\n### Minor Changes\n\n- Updated dependencies [[`c9cd302e`](https://github.com/wevm/wagmi/commit/c9cd302e1c65c980deaee2e12567c2a8ec08b399)]:\n  - @wagmi/core@2.1.0\n\n## 4.0.2\n\n### Patch Changes\n\n- [#3384](https://github.com/wevm/wagmi/pull/3384) [`ee868c33`](https://github.com/wevm/wagmi/commit/ee868c3385dae511230b6ddcb5627c1293cc1844) Thanks [@tmm](https://github.com/tmm)! - Fixed connectors not bubbling error when connecting with `chainId` and subsequent user rejection.\n\n- Updated dependencies [[`ee868c33`](https://github.com/wevm/wagmi/commit/ee868c3385dae511230b6ddcb5627c1293cc1844)]:\n  - @wagmi/core@2.0.2\n\n## 4.0.1\n\n### Major Changes\n\n- [#3333](https://github.com/wevm/wagmi/pull/3333) [`b3a0baaa`](https://github.com/wevm/wagmi/commit/b3a0baaaee7decf750d376aab2502cd33ca4825a) Thanks [@tmm](https://github.com/tmm)! - Added support for Wagmi 2.0.\n\n### Patch Changes\n\n- Updated dependencies [[`b3a0baaa`](https://github.com/wevm/wagmi/commit/b3a0baaaee7decf750d376aab2502cd33ca4825a)]:\n  - @wagmi/core@2.0.0\n\n## 3.1.11\n\n### Patch Changes\n\n- [#3361](https://github.com/wevm/wagmi/pull/3361) [`bbbbf587`](https://github.com/wevm/wagmi/commit/bbbbf587e41bae12b072b7a7c897d580fc07cd2b) Thanks [@0xAsimetriq](https://github.com/0xAsimetriq)! - Updated WalletConnect connector dependencies\n\n## 3.1.10\n\n### Patch Changes\n\n- [`53ca1f7e`](https://github.com/wevm/wagmi/commit/53ca1f7eb411d912e11fcce7e03bd61ed067959c) Thanks [@tmm](https://github.com/tmm)! - Removed LedgerConnector due to security vulnerability\n\n## 3.1.9\n\n### Patch Changes\n\n- [#3114](https://github.com/wevm/wagmi/pull/3114) [`51eca0fb`](https://github.com/wevm/wagmi/commit/51eca0fbaea6932f31a5b8b4213f0252280053e2) Thanks [@akathecoder](https://github.com/akathecoder)! - Added Okto Wallet to Injected Wallets Connector\n\n- [#3299](https://github.com/wevm/wagmi/pull/3299) [`b02020b3`](https://github.com/wevm/wagmi/commit/b02020b3724e0228198f35817611bb063295906e) Thanks [@dasanra](https://github.com/dasanra)! - Fixed issue with [Safe SDK](https://github.com/wevm/viem/issues/579) by bumping `@safe-global/safe-apps-provider@0.18.1`\n\n## 3.1.8\n\n### Patch Changes\n\n- [#3197](https://github.com/wevm/wagmi/pull/3197) [`e8f7bcbc`](https://github.com/wevm/wagmi/commit/e8f7bcbcd9c038a901c29e71769682c088efe2ac) Thanks [@ByteZhang1024](https://github.com/ByteZhang1024)! - Added OneKey Wallet to injected connector flags.\n\n## 3.1.7\n\n### Patch Changes\n\n- [#3276](https://github.com/wevm/wagmi/pull/3276) [`83223a06`](https://github.com/wevm/wagmi/commit/83223a0659e2f675d897a1d3374c7af752c16abf) Thanks [@glitch-txs](https://github.com/glitch-txs)! - Removed required namespaces from WalletConnect connector\n\n## 3.1.6\n\n### Patch Changes\n\n- [#3236](https://github.com/wevm/wagmi/pull/3236) [`cc7e18f2`](https://github.com/wevm/wagmi/commit/cc7e18f2e7f6b8b989f60f0b05aee70e996a9975) Thanks [@0xAsimetriq](https://github.com/0xAsimetriq)! - Updated @walletconnect/ethereum-provider\n\n- [#3236](https://github.com/wevm/wagmi/pull/3236) [`cc7e18f2`](https://github.com/wevm/wagmi/commit/cc7e18f2e7f6b8b989f60f0b05aee70e996a9975) Thanks [@0xAsimetriq](https://github.com/0xAsimetriq)! - Updated @walletconnect/ethereum-provider\n\n## 3.1.5\n\n### Patch Changes\n\n- [#3220](https://github.com/wagmi-dev/wagmi/pull/3220) [`a1950449`](https://github.com/wagmi-dev/wagmi/commit/a1950449127ddf72fff8ecd1fc34c3690befbb05) Thanks [@rkalis](https://github.com/rkalis)! - Fixed a bug where injected walets with an empty providers array could not connect\n\n## 3.1.4\n\n### Patch Changes\n\n- [#3115](https://github.com/wagmi-dev/wagmi/pull/3115) [`4e6ec415`](https://github.com/wagmi-dev/wagmi/commit/4e6ec4151baece94e940e227e0e3711c7f8534d9) Thanks [@bifot](https://github.com/bifot)! - Added SafePal injected name mapping.\n\n## 3.1.3\n\n### Patch Changes\n\n- [#3141](https://github.com/wagmi-dev/wagmi/pull/3141) [`e78aa337`](https://github.com/wagmi-dev/wagmi/commit/e78aa337c454f04b41a3cbd381d25270dd4a0afd) Thanks [@einaralex](https://github.com/einaralex)! - Updated WalletConnect libraries.\n\n## 3.1.2\n\n### Patch Changes\n\n- [#3009](https://github.com/wagmi-dev/wagmi/pull/3009) [`3aaba328`](https://github.com/wagmi-dev/wagmi/commit/3aaba32808ddb4035ec885f96992c91078056715) Thanks [@0xAsimetriq](https://github.com/0xAsimetriq)! - Update WalletConnect dependencies\n\n## 3.1.1\n\n### Patch Changes\n\n- [#2973](https://github.com/wevm/wagmi/pull/2973) [`bf831bb3`](https://github.com/wevm/wagmi/commit/bf831bb30df8037cc4312342d0fe3c045408c2fe) Thanks [@masm](https://github.com/masm)! - Added Zeal wallet\n\n## 3.1.0\n\n### Minor Changes\n\n- [#2956](https://github.com/wevm/wagmi/pull/2956) [`2abeb285`](https://github.com/wevm/wagmi/commit/2abeb285674af3e539cc2550b1f5027b1eb0c895) Thanks [@tmm](https://github.com/tmm)! - Replaced `@wagmi/chains` with `viem/chains`.\n\n## 3.0.0\n\n### Patch Changes\n\n- 0306383: Updated WalletConnect dependencies\n- Updated dependencies [d1ef9b4]\n- Updated dependencies [484c846]\n  - @wagmi/chains@1.8.0\n\n## 2.7.0\n\n### Minor Changes\n\n- a270cb9: Updated WalletConnect dependencies.\n\n### Patch Changes\n\n- 06cc1b4: Add SubWallet injected flags\n- 131a337: Added Desig Wallet name mapping.\n- e089d7d: Added Fordefi Wallet name mapping.\n- ce84d0a: Added Coin98 Wallet injected flags.\n- Updated dependencies [8fdacd8]\n- Updated dependencies [2e9283a]\n- Updated dependencies [a432a2b]\n- Updated dependencies [408740a]\n- Updated dependencies [6794a61]\n- Updated dependencies [0c5a32b]\n- Updated dependencies [ebc85ec]\n- Updated dependencies [5683df2]\n- Updated dependencies [414ff36]\n- Updated dependencies [4f514c6]\n- Updated dependencies [1cf72bc]\n- Updated dependencies [cd68471]\n- Updated dependencies [baf3143]\n- Updated dependencies [9737f24]\n- Updated dependencies [7797238]\n- Updated dependencies [3846811]\n- Updated dependencies [0ea344c]\n  - @wagmi/chains@1.7.0\n\n## 2.6.6\n\n### Patch Changes\n\n- 56c127d: Updated WalletConnect dependencies.\n- Updated dependencies [4b411d2]\n- Updated dependencies [df697ac]\n- Updated dependencies [186f5a7]\n- Updated dependencies [a96b514]\n- Updated dependencies [0a6e6da]\n  - @wagmi/chains@1.5.0\n\n## 2.6.5\n\n### Patch Changes\n\n- 51e346e: Updated WalletConnectConnector logic to handle individual namespaces like eip155:\\*\n\n## 2.6.4\n\n### Patch Changes\n\n- 0a57de2: Added conditional for WalletConnectConnector optionalChains\n\n## 2.6.3\n\n### Patch Changes\n\n- f2d532d: Updated WalletConnect dependencies, exposed `relayUrl` option for `WalletConnectConnector`\n- ff53857: Fixed issue importing `EthereumProvider` in Vite environments.\n- Updated dependencies [d642e1d]\n- Updated dependencies [3027d7b]\n- Updated dependencies [97dbd44]\n  - @wagmi/chains@1.4.0\n\n## 2.6.2\n\n### Patch Changes\n\n- 27bb1b3: Added explicit type annotations for the `getWalletClient()` method.\n\n## 2.6.1\n\n### Patch Changes\n\n- a3507a9: Updated @walletconnect/ethereum-provider dependency\n\n## 2.6.0\n\n### Minor Changes\n\n- 32dc317: Updated @walletconnect/ethereum-provider and @walletconnect/modal dependencies\n\n## 2.5.0\n\n### Minor Changes\n\n- 57e674e: Updated `@safe-global/safe-apps-sdk` & `@safe-global/safe-apps-provider`\n\n## 2.4.0\n\n### Patch Changes\n\n- f21c8e0: Added WalletConnect v2 support to Ledger connector.\n- 27482bb: Add HAQQ Wallet detection\n- 7d6aa43: Exported `normalizeChainId`.\n- Updated dependencies [62b8209]\n- Updated dependencies [106ac13]\n- Updated dependencies [8b3f5e5]\n  - @wagmi/chains@1.3.0\n\n## 2.3.0\n\n### Minor Changes\n\n- 28219ae: Added metadata property to WalletConnect init function\n- 6fef949: Updated @walletconnect/modal and @walletconnect/ethereum-provider deps\n\n### Patch Changes\n\n- 72f6465: Added `TTWallet` to `getInjectedName` list\n- Updated dependencies [a7cbd04]\n- Updated dependencies [f6ee133]\n  - @wagmi/chains@1.2.0\n\n## 2.2.0\n\n### Minor Changes\n\n- 6c841d4: Changed `Address` type import from ABIType to viem.\n\n### Patch Changes\n\n- 09c83f8: Update @walletconnect/ethereum-provider, Replace @web3modal/standalone with @walletconnect/modal, Fix issue with wallet_addEthereumChain method in WalletConnectConnector\n\n## 2.1.1\n\n### Patch Changes\n\n- c24de75: Updated `@walletconnect/ethereum-provider` and `@web3modal/standalone` dependencies.\n- 605c422: Bumped `viem` peer dependency.\n- dc1c546: Throw ResourceUnavailableError on -30002 errors.\n\n## 2.1.0\n\n### Minor Changes\n\n- b001569: Bumped minimum TypeScript version to v5.0.4.\n\n### Patch Changes\n\n- 0f05b2b: Updated `abitype` to `0.8.7`.\n- 6aea7ee: Fixed internal types.\n- b187cb0: Added `isNovaWallet` injected flag.\n- 5e44429: Added Edgeware mainnet and testnet\n- b18b314: Updated @walletconnect/ethereum-provider and @web3modal/standalone dependencies\n- Updated dependencies [b62a199]\n- Updated dependencies [b001569]\n- Updated dependencies [260ab59]\n- Updated dependencies [6aea7ee]\n- Updated dependencies [5e44429]\n  - @wagmi/chains@1.0.0\n\n## 2.0.0\n\n### Patch Changes\n\n- Updated dependencies [36c14b2]\n  - @wagmi/chains@0.3.0\n\n## 1.0.5\n\n### Patch Changes\n\n- fa61dfe: Updated viem.\n- Updated dependencies [577d2a0]\n  - @wagmi/chains@0.2.25\n\n## 1.0.4\n\n### Patch Changes\n\n- bbbd11b: Corrected Rabby Wallet name\n- Updated dependencies [0639a1f]\n  - @wagmi/chains@0.2.24\n\n## 1.0.3\n\n### Patch Changes\n\n- 64dfe61: Update @web3modal/standalone to v2.4.1, Update @walletconnect/ethereum-provider to 2.7.4\n- bab7ad8: Added Defiant to injected connector flags\n- 44cde07: Added Talisman wallet flag\n\n## 1.0.2\n\n### Patch Changes\n\n- bce5a0c: Removed chain fallback when instantiating a Wallet Client.\n\n## 1.0.1\n\n### Patch Changes\n\n- [`ea651cd7`](https://github.com/wevm/wagmi/commit/ea651cd7fc75b7866272605467db11fd6e1d81af) Thanks [@jxom](https://github.com/jxom)! - Downgraded abitype.\n\n## 1.0.0\n\n### Major Changes\n\n- 7e274f5: Released v1.\n\n### Patch Changes\n\n- 0966bf7: Changed Kucoin Wallet name mapping to Halo Wallet\n\n## 1.0.0-next.5\n\n### Major Changes\n\n- Updated references.\n\n## 1.0.0-next.4\n\n### Major Changes\n\n- Updated references.\n\n## 1.0.0-next.3\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/chains@1.0.0-next.0\n\n## 1.0.0-next.2\n\n### Major Changes\n\n- updated viem\n\n## 1.0.0-next.1\n\n### Major Changes\n\n- [`a7dda00c`](https://github.com/wevm/wagmi/commit/a7dda00c5b546f8b2c42b527e4d9ac1b9e9ab1fb) Thanks [@jxom](https://github.com/jxom)! - Released v1.\n\n## 1.0.0-next.0\n\n### Major Changes\n\n- 33488cf: Released v1.\n\n## 0.3.19\n\n### Patch Changes\n\n- 274eef3: - Updated @web3modal/standalone to 2.3.7\n  - Updated @walletconnect/ethereum-provider to 2.7.1\n- 41697df: Updated @walletconnect/ethereum-provider version to 2.7.2\n- 82dcb72: Added Enkrypt extension detection\n\n## 0.3.18\n\n### Patch Changes\n\n- f66e065: Added BlockWallet to injected connector flags.\n\n## 0.3.17\n\n### Patch Changes\n\n- 12ab5d1: Updated @coinbase/wallet-sdk to 3.6.6\n\n## 0.3.16\n\n### Patch Changes\n\n- c1e3ddf: Reverted ABIType version change.\n\n## 0.3.15\n\n### Patch Changes\n\n- d4825e6: Fixed ABIType version to match downstream packages.\n\n## 0.3.14\n\n### Patch Changes\n\n- c25ac82: Added more flags to `MetaMaskConnector` `getProvider` check.\n- b19a932: Updated @web3modal/standalone to 2.3.0, @walletconnect/ethereum-provider to 2.7.0\n- cdc387e: Added `ImToken` to `getInjectedName` list\n\n## 0.3.13\n\n### Patch Changes\n\n- 2a21d27: Updated `@coinbase/wallet-sdk` to `3.6.4`\n\n## 0.3.12\n\n### Patch Changes\n\n- 9bb22b6: Updated `@walletconnect/ethereum-provider` to `2.6.2`, relaxed `@web3modal/standalone` version requirement\n- 0d7625b: Added Rabby to injected connector flags\n- f63d7fd: Added correct error to switch network cause.\n\n## 0.3.11\n\n### Patch Changes\n\n- 0778abc: Renamed `isTally` injected provider to `Taho`\n\n## 0.3.10\n\n### Patch Changes\n\n- 4267020: Added `qrModalOptions` option to `WalletConnectConnector`\n- e78fb0a: Pinned WalletConnect dependencies\n\n## 0.3.9\n\n### Patch Changes\n\n- 5cd0afc: Added `isZerion` to `InjectedProviderFlags` and `getInjectedName`\n- be4825e: Added GameStop Wallet to injected connector flags\n\n## 0.3.8\n\n### Patch Changes\n\n- 11f3fe2: Fixed issue where `UNSTABLE_shimOnConnectSelectAccount` would not bubble up error for MetaMask if request to connect was already active.\n\n## 0.3.7\n\n### Patch Changes\n\n- 04c0e47: Fixed issue switching chain after adding to MetaMask.\n\n## 0.3.6\n\n### Patch Changes\n\n- 85330c1: Removed `InjectedConnector` `shimChainChangedDisconnect` shim (no longer necessary).\n\n## 0.3.5\n\n### Patch Changes\n\n- 8b1a526: Added Dawn wallet flag\n\n## 0.3.4\n\n### Patch Changes\n\n- 6b15d6f: Updated `@walletconnect/ethereum-provider` to `2.5.1`.\n- 1f452e7: Added OKX Wallet to injected connector flags.\n- a4d9083: Added Backpack wallet to injected connector flags.\n- 6a4af48: Enabled support for programmatic chain switching on `LedgerConnector` & added `\"ledger\"` to the switch chain regex on `WalletConnectLegacyConnector`.\n\n## 0.3.3\n\n### Patch Changes\n\n- f24ce0c: Updated @walletconnect/ethereum-provider to 2.4.8\n- e3a3fee: Added \"uniswap wallet\" to the regex that determines wallets allowed to switch chains in the WalletConnect legacy connector\n- 641af48: Added name mapping for Bifrost Wallet\n- 4d2c90a: Added name mapping for Phantom\n- 3d276d0: Added Status as the name of the injected connector for the Status App\n\n## 0.3.2\n\n### Patch Changes\n\n- 13a6a07: Updated `@walletconnect/ethereum-provider` to `2.4.7`.\n\n## 0.3.1\n\n### Patch Changes\n\n- a23c40f: Added name mapping for [Frontier](https://frontier.xyz) Wallet\n- d779fb3: Added name mapping for HyperPay.\n\n## 0.3.0\n\n### Minor Changes\n\n- c4d5bb5: **Breaking:** Removed the `version` config option for `WalletConnectConnector`.\n\n  `WalletConnectConnector` now uses WalletConnect v2 by default. WalletConnect v1 is now `WalletConnectLegacyConnector`.\n\n  ### WalletConnect v2\n\n  ```diff\n  import { WalletConnectConnector } from '@wagmi/connectors/walletConnect'\n\n  const connector = new WalletConnectConnector({\n    options: {\n  -   version: '2',\n      projectId: 'abc',\n    },\n  })\n  ```\n\n  ### WalletConnect v1\n\n  ```diff\n  -import { WalletConnectConnector } from '@wagmi/connectors/walletConnect'\n  +import { WalletConnectLegacyConnector } from '@wagmi/connectors/walletConnectLegacy'\n\n  -const connector = new WalletConnectConnector({\n  +const connector = new WalletConnectLegacyConnector({\n    options: {\n      qrcode: true,\n    },\n  })\n  ```\n\n## 0.2.7\n\n### Patch Changes\n\n- 57f1226: Added name mapping for XDEFI\n\n## 0.2.6\n\n### Patch Changes\n\n- bb1b88c: Added name mapping for Bitski injected wallet\n- fcb5595: Fixed shim disconnect key to read from defined Connector ID.\n- 49f8853: Fixed `SafeConnector` import type error that existed for specific build environments.\n\n## 0.2.5\n\n### Patch Changes\n\n- 5d121f2: Added `isApexWallet` to injected `window.ethereum` flags.\n- e3566eb: Updated `@web3modal/standalone` to `2.1.1` for WalletConnectConnector.\n\n## 0.2.4\n\n### Patch Changes\n\n- a4f31bc: Added Connector for [Safe](https://safe.global) wallet\n- d5e25d9: Locked ethers peer dependency version to >=5.5.1 <6\n\n## 0.2.3\n\n### Patch Changes\n\n- 6fa74dd: Updated `@walletconnect/universal-provider`\n  Added more signable methods to WC v2.\n\n## 0.2.2\n\n### Patch Changes\n\n- 6b0725b: Fixed race condition between `switchNetwork` and mutation Hooks that use `chainId` (e.g. `sendTransaction`).\n\n## 0.2.1\n\n### Patch Changes\n\n- 942fcde: Updated `@walletconnect/universal-provider` and `@web3modal/standalone` packages for WalletConnectConnector (v2).\n\n  Improved initialization flow for `@walletconnect/universal-provider` for WalletConnectConnector (v2).\n\n## 0.2.0\n\n### Minor Changes\n\n- be33c7d: Chains are now narrowed to their most specific type using the TypeScript [`satisfies`](https://devblogs.microsoft.com/typescript/announcing-typescript-4-9/#the-satisfies-operator) operator.\n\n## 0.1.10\n\n### Patch Changes\n\n- d75e8d2: Fixed ABIType version mismatch between packages.\n\n## 0.1.9\n\n### Patch Changes\n\n- 8c3fc00: Added public RPC URL to Connector fallback chains\n\n## 0.1.8\n\n### Patch Changes\n\n- 5e6dc30: Replaced legacy qrcodemodal with web3modal for WalletConnect v2.\n\n## 0.1.7\n\n### Patch Changes\n\n- be4add2: Added `isRainbow` flag to `InjectedConnector`.\n\n## 0.1.6\n\n### Patch Changes\n\n- 3dfc558: Add `switchSigner` method to `MockProvider`.\n\n## 0.1.5\n\n### Patch Changes\n\n- 7dce4b5: Bumped WalletConnect Universal Provider version.\n\n## 0.1.4\n\n### Patch Changes\n\n- 4cec598: Added CJS escape hatch bundle under the \"cjs\" tag.\n\n## 0.1.3\n\n### Patch Changes\n\n- 822bc88: The `WalletConnectConnector` now supports WalletConnect v2.\n\n  It can be enabled by setting `version` to `'2'` and supplying a [WalletConnect Cloud `projectId`](https://cloud.walletconnect.com/sign-in).\n\n## 0.1.2\n\n### Patch Changes\n\n- 5e5f37f: Fixed issue where connecting to MetaMask may return with a stale address\n\n## 0.1.1\n\n### Patch Changes\n\n- 919790c: Updated `@ledgerhq/connect-kit-loader` to `1.0.1`\n\n## 0.1.0\n\n### Minor Changes\n\n- 5db7cba: Added `LedgerConnector`\n- 55a0ca2: Initial release of the `@wagmi/connectors` package – a collection of Connectors for wagmi.\n"
  },
  {
    "path": "packages/connectors/README.md",
    "content": "# @wagmi/connectors\n\nCollection of connectors for Wagmi\n\n## Installation\n\n```bash\npnpm add @wagmi/connectors @wagmi/core viem\n```\n\n## Documentation\n\nFor documentation and guides, visit [wagmi.sh](https://wagmi.sh).\n"
  },
  {
    "path": "packages/connectors/package.json",
    "content": "{\n  \"name\": \"@wagmi/connectors\",\n  \"description\": \"Collection of connectors for Wagmi\",\n  \"version\": \"7.2.1\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/wevm/wagmi.git\",\n    \"directory\": \"packages/connectors\"\n  },\n  \"scripts\": {\n    \"build\": \"pnpm run build:esm+types\",\n    \"build:esm+types\": \"tsc --project tsconfig.build.json --outDir ./dist/esm --declaration --declarationMap --declarationDir ./dist/types\",\n    \"check:types\": \"tsc --noEmit\",\n    \"clean\": \"rm -rf dist tsconfig.tsbuildinfo\",\n    \"test:build\": \"publint --strict && attw --pack --ignore-rules cjs-resolves-to-esm\"\n  },\n  \"files\": [\n    \"dist/**\",\n    \"!dist/**/*.tsbuildinfo\",\n    \"src/**/*.ts\",\n    \"!src/**/*.test.ts\",\n    \"!src/**/*.test-d.ts\"\n  ],\n  \"sideEffects\": false,\n  \"type\": \"module\",\n  \"main\": \"./dist/esm/exports/index.js\",\n  \"types\": \"./dist/types/exports/index.d.ts\",\n  \"typings\": \"./dist/types/exports/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/types/exports/index.d.ts\",\n      \"default\": \"./dist/esm/exports/index.js\"\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"peerDependencies\": {\n    \"@base-org/account\": \"^2.5.1\",\n    \"@coinbase/wallet-sdk\": \"^4.3.6\",\n    \"@metamask/connect-evm\": \"~0.9.0\",\n    \"@safe-global/safe-apps-provider\": \"~0.18.6\",\n    \"@safe-global/safe-apps-sdk\": \"^9.1.0\",\n    \"@wagmi/core\": \"workspace:*\",\n    \"@walletconnect/ethereum-provider\": \"^2.21.1\",\n    \"porto\": \"~0.2.35\",\n    \"typescript\": \">=5.7.3\",\n    \"viem\": \"2.x\"\n  },\n  \"peerDependenciesMeta\": {\n    \"@base-org/account\": {\n      \"optional\": true\n    },\n    \"@coinbase/wallet-sdk\": {\n      \"optional\": true\n    },\n    \"@metamask/connect-evm\": {\n      \"optional\": true\n    },\n    \"@safe-global/safe-apps-provider\": {\n      \"optional\": true\n    },\n    \"@safe-global/safe-apps-sdk\": {\n      \"optional\": true\n    },\n    \"@walletconnect/ethereum-provider\": {\n      \"optional\": true\n    },\n    \"porto\": {\n      \"optional\": true\n    },\n    \"typescript\": {\n      \"optional\": true\n    }\n  },\n  \"devDependencies\": {\n    \"@base-org/account\": \"catalog:\",\n    \"@coinbase/wallet-sdk\": \"catalog:\",\n    \"@metamask/connect-evm\": \"catalog:\",\n    \"@safe-global/safe-apps-provider\": \"catalog:\",\n    \"@safe-global/safe-apps-sdk\": \"catalog:\",\n    \"@wagmi/core\": \"workspace:*\",\n    \"@walletconnect/ethereum-provider\": \"catalog:\",\n    \"msw\": \"^2.4.9\",\n    \"porto\": \"catalog:\"\n  },\n  \"contributors\": [\n    \"awkweb.eth <t@wevm.dev>\",\n    \"jxom.eth <j@wevm.dev>\"\n  ],\n  \"funding\": \"https://github.com/sponsors/wevm\",\n  \"keywords\": [\n    \"react\",\n    \"hooks\",\n    \"eth\",\n    \"ethereum\",\n    \"dapps\",\n    \"wallet\",\n    \"web3\",\n    \"abi\"\n  ]\n}\n"
  },
  {
    "path": "packages/connectors/src/baseAccount.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { baseAccount } from './baseAccount.js'\n\ntest('setup', () => {\n  const connectorFn = baseAccount({ appName: 'wagmi' })\n  const connector = config._internal.connectors.setup(connectorFn)\n  expect(connector.name).toEqual('Base Account')\n})\n"
  },
  {
    "path": "packages/connectors/src/baseAccount.ts",
    "content": "import type { createBaseAccountSDK, ProviderInterface } from '@base-org/account'\nimport {\n  ChainNotConfiguredError,\n  type Connector,\n  createConnector,\n} from '@wagmi/core'\nimport type { Mutable, Omit } from '@wagmi/core/internal'\nimport {\n  type AddEthereumChainParameter,\n  type Address,\n  getAddress,\n  type Hex,\n  numberToHex,\n  type ProviderRpcError,\n  SwitchChainError,\n  UserRejectedRequestError,\n} from 'viem'\n\nexport type BaseAccountParameters = Mutable<\n  Omit<\n    Parameters<typeof createBaseAccountSDK>[0],\n    'appChainIds' // set via wagmi config\n  >\n>\n\nexport function baseAccount(parameters: BaseAccountParameters = {}) {\n  type Provider = ProviderInterface\n  type Properties = {\n    connect<withCapabilities extends boolean = false>(parameters?: {\n      chainId?: number | undefined\n      capabilities?:\n        | {\n            signInWithEthereum?: {\n              chainId?: string | undefined\n              domain?: string | undefined\n              expirationTime?: string | undefined\n              issuedAt?: string | undefined\n              nonce: string\n              notBefore?: string | undefined\n              requestId?: string | undefined\n              resources?: string[] | undefined\n              scheme?: string | undefined\n              statement?: string | undefined\n              uri?: string | undefined\n              version?: string | undefined\n            }\n            [capability: string]: any\n          }\n        | undefined\n      isReconnecting?: boolean | undefined\n      withCapabilities?: withCapabilities | boolean | undefined\n    }): Promise<{\n      accounts: withCapabilities extends true\n        ? readonly {\n            address: Address\n            capabilities: WalletConnectResponseCapabilities\n          }[]\n        : readonly Address[]\n      chainId: number\n    }>\n  }\n  type WalletConnectResponseCapabilities = {\n    signInWithEthereum?: { message: string; signature: Hex } | undefined\n    [capability: string]: any\n  }\n\n  let walletProvider: Provider | undefined\n\n  let accountsChanged: Connector['onAccountsChanged'] | undefined\n  let chainChanged: Connector['onChainChanged'] | undefined\n  let disconnect: Connector['onDisconnect'] | undefined\n\n  return createConnector<Provider, Properties>((config) => ({\n    id: 'baseAccount',\n    name: 'Base Account',\n    rdns: 'app.base.account',\n    type: 'baseAccount',\n    async connect({ chainId, withCapabilities, ...rest } = {}) {\n      try {\n        const provider = await this.getProvider()\n\n        const targetChainId = chainId ?? config.chains[0]?.id\n        if (!targetChainId) throw new ChainNotConfiguredError()\n\n        let { accounts, currentChainId } = await (async () => {\n          if (rest.isReconnecting)\n            return {\n              accounts: (\n                (await provider.request({\n                  method: 'eth_accounts',\n                  params: [],\n                })) as string[]\n              ).map((x) => ({ address: getAddress(x) })),\n              currentChainId: await this.getChainId(),\n            }\n          const response = (await provider.request({\n            method: 'wallet_connect',\n            params: [\n              {\n                capabilities:\n                  'capabilities' in rest && rest.capabilities\n                    ? rest.capabilities\n                    : {},\n                chainIds: [\n                  numberToHex(targetChainId),\n                  ...config.chains\n                    .filter((x) => x.id !== targetChainId)\n                    .map((x) => numberToHex(x.id)),\n                ],\n              },\n            ],\n          })) as {\n            accounts: {\n              address: Address\n              capabilities?: WalletConnectResponseCapabilities | undefined\n            }[]\n            chainIds: Hex[]\n          }\n          const orderedAccounts = (await provider.request({\n            method: 'eth_accounts',\n          })) as Address[]\n          const accounts = orderedAccounts.map(\n            (account1) =>\n              response.accounts.find(\n                (account2) => account2.address === account1,\n              ) ?? { address: account1 },\n          )\n          return {\n            accounts: accounts.map((account) => ({\n              address: getAddress(account.address),\n              capabilities: account.capabilities ?? {},\n            })),\n            currentChainId: Number(response.chainIds[0]),\n          }\n        })()\n\n        if (!accountsChanged) {\n          accountsChanged = this.onAccountsChanged.bind(this)\n          provider.on('accountsChanged', accountsChanged)\n        }\n        if (!chainChanged) {\n          chainChanged = this.onChainChanged.bind(this)\n          provider.on('chainChanged', chainChanged)\n        }\n        if (!disconnect) {\n          disconnect = this.onDisconnect.bind(this)\n          provider.on('disconnect', disconnect)\n        }\n\n        // Switch to chain if provided\n        if (chainId && currentChainId !== chainId) {\n          const chain = await this.switchChain!({ chainId }).catch((error) => {\n            if (error.code === UserRejectedRequestError.code) throw error\n            return { id: currentChainId }\n          })\n          currentChainId = chain?.id ?? currentChainId\n        }\n\n        return {\n          // TODO(v3): Make `withCapabilities: true` default behavior\n          accounts: (withCapabilities\n            ? accounts\n            : accounts.map((account) => account.address)) as never,\n          chainId: currentChainId,\n        }\n      } catch (error) {\n        if (\n          /(user closed modal|accounts received is empty|user denied account|request rejected)/i.test(\n            (error as Error).message,\n          )\n        )\n          throw new UserRejectedRequestError(error as Error)\n        throw error\n      }\n    },\n    async disconnect() {\n      const provider = await this.getProvider()\n\n      if (accountsChanged) {\n        provider.removeListener('accountsChanged', accountsChanged)\n        accountsChanged = undefined\n      }\n      if (chainChanged) {\n        provider.removeListener('chainChanged', chainChanged)\n        chainChanged = undefined\n      }\n      if (disconnect) {\n        provider.removeListener('disconnect', disconnect)\n        disconnect = undefined\n      }\n\n      provider.disconnect()\n    },\n    async getAccounts() {\n      const provider = await this.getProvider()\n      return (\n        (await provider.request({\n          method: 'eth_accounts',\n        })) as string[]\n      ).map((x) => getAddress(x))\n    },\n    async getChainId() {\n      const provider = await this.getProvider()\n      const chainId = (await provider.request({\n        method: 'eth_chainId',\n      })) as Hex\n      return Number(chainId)\n    },\n    async getProvider() {\n      if (!walletProvider) {\n        const preference = (() => {\n          if (typeof parameters.preference === 'string')\n            return { options: parameters.preference }\n          return {\n            ...parameters.preference,\n            options: parameters.preference?.options ?? 'all',\n          }\n        })()\n\n        const { createBaseAccountSDK } = await (() => {\n          // safe webpack optional peer dependency dynamic import\n          try {\n            return import('@base-org/account')\n          } catch {\n            throw new Error('dependency \"@base-org/account\" not found')\n          }\n        })()\n        const sdk = createBaseAccountSDK({\n          ...parameters,\n          appChainIds: config.chains.map((x) => x.id),\n          preference,\n        })\n\n        walletProvider = sdk.getProvider()\n      }\n\n      return walletProvider\n    },\n    async isAuthorized() {\n      try {\n        const accounts = await this.getAccounts()\n        return !!accounts.length\n      } catch {\n        return false\n      }\n    },\n    async switchChain({ addEthereumChainParameter, chainId }) {\n      const chain = config.chains.find((chain) => chain.id === chainId)\n      if (!chain) throw new SwitchChainError(new ChainNotConfiguredError())\n\n      const provider = await this.getProvider()\n\n      try {\n        await provider.request({\n          method: 'wallet_switchEthereumChain',\n          params: [{ chainId: numberToHex(chain.id) }],\n        })\n        return chain\n      } catch (error) {\n        // Indicates chain is not added to provider\n        if ((error as ProviderRpcError).code === 4902) {\n          try {\n            let blockExplorerUrls: string[] | undefined\n            if (addEthereumChainParameter?.blockExplorerUrls)\n              blockExplorerUrls = addEthereumChainParameter.blockExplorerUrls\n            else\n              blockExplorerUrls = chain.blockExplorers?.default.url\n                ? [chain.blockExplorers?.default.url]\n                : []\n\n            let rpcUrls: readonly string[]\n            if (addEthereumChainParameter?.rpcUrls?.length)\n              rpcUrls = addEthereumChainParameter.rpcUrls\n            else rpcUrls = [chain.rpcUrls.default?.http[0] ?? '']\n\n            const addEthereumChain = {\n              blockExplorerUrls,\n              chainId: numberToHex(chainId),\n              chainName: addEthereumChainParameter?.chainName ?? chain.name,\n              iconUrls: addEthereumChainParameter?.iconUrls,\n              nativeCurrency:\n                addEthereumChainParameter?.nativeCurrency ??\n                chain.nativeCurrency,\n              rpcUrls,\n            } satisfies AddEthereumChainParameter\n\n            await provider.request({\n              method: 'wallet_addEthereumChain',\n              params: [addEthereumChain],\n            })\n\n            return chain\n          } catch (error) {\n            throw new UserRejectedRequestError(error as Error)\n          }\n        }\n\n        throw new SwitchChainError(error as Error)\n      }\n    },\n    onAccountsChanged(accounts) {\n      if (accounts.length === 0) this.onDisconnect()\n      else\n        config.emitter.emit('change', {\n          accounts: accounts.map((x) => getAddress(x)),\n        })\n    },\n    onChainChanged(chain) {\n      const chainId = Number(chain)\n      config.emitter.emit('change', { chainId })\n    },\n    async onDisconnect(_error) {\n      config.emitter.emit('disconnect')\n\n      const provider = await this.getProvider()\n      if (accountsChanged) {\n        provider.removeListener('accountsChanged', accountsChanged)\n        accountsChanged = undefined\n      }\n      if (chainChanged) {\n        provider.removeListener('chainChanged', chainChanged)\n        chainChanged = undefined\n      }\n      if (disconnect) {\n        provider.removeListener('disconnect', disconnect)\n        disconnect = undefined\n      }\n    },\n  }))\n}\n"
  },
  {
    "path": "packages/connectors/src/coinbaseWallet.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, expectTypeOf, test } from 'vitest'\n\nimport { coinbaseWallet } from './coinbaseWallet.js'\n\ntest('setup', () => {\n  const connectorFn = coinbaseWallet({ appName: 'wagmi' })\n  const connector = config._internal.connectors.setup(connectorFn)\n  expect(connector.name).toEqual('Coinbase Wallet')\n\n  type ConnectFnParameters = NonNullable<\n    Parameters<(typeof connector)['connect']>[0]\n  >\n  expectTypeOf<ConnectFnParameters['instantOnboarding']>().toMatchTypeOf<\n    boolean | undefined\n  >()\n})\n"
  },
  {
    "path": "packages/connectors/src/coinbaseWallet.ts",
    "content": "import type {\n  createCoinbaseWalletSDK,\n  ProviderInterface,\n} from '@coinbase/wallet-sdk'\nimport {\n  ChainNotConfiguredError,\n  type Connector,\n  createConnector,\n} from '@wagmi/core'\nimport type { Mutable, Omit } from '@wagmi/core/internal'\nimport {\n  type AddEthereumChainParameter,\n  type Address,\n  getAddress,\n  type Hex,\n  numberToHex,\n  type ProviderRpcError,\n  SwitchChainError,\n  UserRejectedRequestError,\n} from 'viem'\n\nexport type CoinbaseWalletParameters<\n  /** @deprecated remove */\n  _ = unknown,\n> = Mutable<\n  Omit<\n    Parameters<typeof createCoinbaseWalletSDK>[0],\n    'appChainIds' // set via wagmi config\n  >\n>\n\ncoinbaseWallet.type = 'coinbaseWallet' as const\nexport function coinbaseWallet(\n  parameters: CoinbaseWalletParameters = {} as any,\n) {\n  type Provider = ProviderInterface & {\n    // for backwards compatibility\n    close?(): void\n  }\n  type Properties = {\n    // TODO(v3): Make `withCapabilities: true` default behavior\n    connect<withCapabilities extends boolean = false>(parameters?: {\n      chainId?: number | undefined\n      instantOnboarding?: boolean | undefined\n      isReconnecting?: boolean | undefined\n      withCapabilities?: withCapabilities | boolean | undefined\n    }): Promise<{\n      accounts: withCapabilities extends true\n        ? readonly { address: Address }[]\n        : readonly Address[]\n      chainId: number\n    }>\n  }\n\n  let walletProvider: Provider | undefined\n\n  let accountsChanged: Connector['onAccountsChanged'] | undefined\n  let chainChanged: Connector['onChainChanged'] | undefined\n  let disconnect: Connector['onDisconnect'] | undefined\n\n  return createConnector<Provider, Properties>((config) => ({\n    id: 'coinbaseWalletSDK',\n    name: 'Coinbase Wallet',\n    rdns: 'com.coinbase.wallet',\n    type: coinbaseWallet.type,\n    async connect({ chainId, withCapabilities, ...rest } = {}) {\n      try {\n        const provider = await this.getProvider()\n        const accounts = (\n          (await provider.request({\n            method: 'eth_requestAccounts',\n            params:\n              'instantOnboarding' in rest && rest.instantOnboarding\n                ? [{ onboarding: 'instant' }]\n                : [],\n          })) as string[]\n        ).map((x) => getAddress(x))\n\n        if (!accountsChanged) {\n          accountsChanged = this.onAccountsChanged.bind(this)\n          provider.on('accountsChanged', accountsChanged)\n        }\n        if (!chainChanged) {\n          chainChanged = this.onChainChanged.bind(this)\n          provider.on('chainChanged', chainChanged)\n        }\n        if (!disconnect) {\n          disconnect = this.onDisconnect.bind(this)\n          provider.on('disconnect', disconnect)\n        }\n\n        // Switch to chain if provided\n        let currentChainId = await this.getChainId()\n        if (chainId && currentChainId !== chainId) {\n          const chain = await this.switchChain!({ chainId }).catch((error) => {\n            if (error.code === UserRejectedRequestError.code) throw error\n            return { id: currentChainId }\n          })\n          currentChainId = chain?.id ?? currentChainId\n        }\n\n        return {\n          accounts: (withCapabilities\n            ? accounts.map((address) => ({ address, capabilities: {} }))\n            : accounts) as never,\n          chainId: currentChainId,\n        }\n      } catch (error) {\n        if (\n          /(user closed modal|accounts received is empty|user denied account|request rejected)/i.test(\n            (error as Error).message,\n          )\n        )\n          throw new UserRejectedRequestError(error as Error)\n        throw error\n      }\n    },\n    async disconnect() {\n      const provider = await this.getProvider()\n\n      if (accountsChanged) {\n        provider.removeListener('accountsChanged', accountsChanged)\n        accountsChanged = undefined\n      }\n      if (chainChanged) {\n        provider.removeListener('chainChanged', chainChanged)\n        chainChanged = undefined\n      }\n      if (disconnect) {\n        provider.removeListener('disconnect', disconnect)\n        disconnect = undefined\n      }\n\n      provider.disconnect()\n      provider.close?.()\n    },\n    async getAccounts() {\n      const provider = await this.getProvider()\n      return (\n        (await provider.request({\n          method: 'eth_accounts',\n        })) as string[]\n      ).map((x) => getAddress(x))\n    },\n    async getChainId() {\n      const provider = await this.getProvider()\n      const chainId = (await provider.request({\n        method: 'eth_chainId',\n      })) as Hex\n      return Number(chainId)\n    },\n    async getProvider() {\n      if (!walletProvider) {\n        const { createCoinbaseWalletSDK } = await (() => {\n          // safe webpack optional peer dependency dynamic import\n          try {\n            return import('@coinbase/wallet-sdk')\n          } catch {\n            throw new Error('dependency \"@coinbase/wallet-sdk\" not found')\n          }\n        })()\n        const sdk = createCoinbaseWalletSDK({\n          ...parameters,\n          appChainIds: config.chains.map((x) => x.id),\n          preference: {\n            options: 'all',\n            ...(parameters.preference ?? {}),\n          },\n        })\n\n        walletProvider = sdk.getProvider()\n      }\n\n      return walletProvider\n    },\n    async isAuthorized() {\n      try {\n        const accounts = await this.getAccounts()\n        return !!accounts.length\n      } catch {\n        return false\n      }\n    },\n    async switchChain({ addEthereumChainParameter, chainId }) {\n      const chain = config.chains.find((chain) => chain.id === chainId)\n      if (!chain) throw new SwitchChainError(new ChainNotConfiguredError())\n\n      const provider = await this.getProvider()\n\n      try {\n        await provider.request({\n          method: 'wallet_switchEthereumChain',\n          params: [{ chainId: numberToHex(chain.id) }],\n        })\n        return chain\n      } catch (error) {\n        // Indicates chain is not added to provider\n        if ((error as ProviderRpcError).code === 4902) {\n          try {\n            let blockExplorerUrls: string[] | undefined\n            if (addEthereumChainParameter?.blockExplorerUrls)\n              blockExplorerUrls = addEthereumChainParameter.blockExplorerUrls\n            else\n              blockExplorerUrls = chain.blockExplorers?.default.url\n                ? [chain.blockExplorers?.default.url]\n                : []\n\n            let rpcUrls: readonly string[]\n            if (addEthereumChainParameter?.rpcUrls?.length)\n              rpcUrls = addEthereumChainParameter.rpcUrls\n            else rpcUrls = [chain.rpcUrls.default?.http[0] ?? '']\n\n            const addEthereumChain = {\n              blockExplorerUrls,\n              chainId: numberToHex(chainId),\n              chainName: addEthereumChainParameter?.chainName ?? chain.name,\n              iconUrls: addEthereumChainParameter?.iconUrls,\n              nativeCurrency:\n                addEthereumChainParameter?.nativeCurrency ??\n                chain.nativeCurrency,\n              rpcUrls,\n            } satisfies AddEthereumChainParameter\n\n            await provider.request({\n              method: 'wallet_addEthereumChain',\n              params: [addEthereumChain],\n            })\n\n            return chain\n          } catch (error) {\n            throw new UserRejectedRequestError(error as Error)\n          }\n        }\n\n        throw new SwitchChainError(error as Error)\n      }\n    },\n    onAccountsChanged(accounts) {\n      if (accounts.length === 0) this.onDisconnect()\n      else\n        config.emitter.emit('change', {\n          accounts: accounts.map((x) => getAddress(x)),\n        })\n    },\n    onChainChanged(chain) {\n      const chainId = Number(chain)\n      config.emitter.emit('change', { chainId })\n    },\n    async onDisconnect(_error) {\n      config.emitter.emit('disconnect')\n\n      const provider = await this.getProvider()\n      if (accountsChanged) {\n        provider.removeListener('accountsChanged', accountsChanged)\n        accountsChanged = undefined\n      }\n      if (chainChanged) {\n        provider.removeListener('chainChanged', chainChanged)\n        chainChanged = undefined\n      }\n      if (disconnect) {\n        provider.removeListener('disconnect', disconnect)\n        disconnect = undefined\n      }\n    },\n  }))\n}\n"
  },
  {
    "path": "packages/connectors/src/exports/index.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport * as connectors from './index.js'\n\ntest('exports', () => {\n  expect(Object.keys(connectors)).toMatchInlineSnapshot(`\n    [\n      \"injected\",\n      \"mock\",\n      \"baseAccount\",\n      \"coinbaseWallet\",\n      \"metaMask\",\n      \"porto\",\n      \"safe\",\n      \"version\",\n      \"walletConnect\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/connectors/src/exports/index.ts",
    "content": "// biome-ignore lint/performance/noBarrelFile: entrypoint module\nexport {\n  type InjectedParameters,\n  injected,\n  type MockParameters,\n  mock,\n} from '@wagmi/core'\nexport { type BaseAccountParameters, baseAccount } from '../baseAccount.js'\nexport {\n  type CoinbaseWalletParameters,\n  coinbaseWallet,\n} from '../coinbaseWallet.js'\nexport { type MetaMaskParameters, metaMask } from '../metaMask.js'\nexport { type PortoParameters, porto } from '../porto.js'\nexport { type SafeParameters, safe } from '../safe.js'\nexport { version } from '../version.js'\nexport {\n  type WalletConnectParameters,\n  walletConnect,\n} from '../walletConnect.js'\n"
  },
  {
    "path": "packages/connectors/src/metaMask.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { metaMask } from './metaMask.js'\n\ntest('setup', () => {\n  const connectorFn = metaMask()\n  const connector = config._internal.connectors.setup(connectorFn)\n  expect(connector.name).toEqual('MetaMask')\n})\n"
  },
  {
    "path": "packages/connectors/src/metaMask.ts",
    "content": "import type {\n  createEVMClient,\n  EIP1193Provider,\n  MetamaskConnectEVM,\n} from '@metamask/connect-evm'\nimport { ChainNotConfiguredError, createConnector } from '@wagmi/core'\nimport type { ExactPartial, OneOf, UnionCompute } from '@wagmi/core/internal'\nimport {\n  type Address,\n  getAddress,\n  numberToHex,\n  type ProviderConnectInfo,\n  ResourceUnavailableRpcError,\n  type RpcError,\n  SwitchChainError,\n  UserRejectedRequestError,\n  withRetry,\n  withTimeout,\n} from 'viem'\n\nexport type MetaMaskParameters = UnionCompute<\n  ExactPartial<Omit<CreateEVMClientParameters, 'api' | 'eventHandlers'>> & {\n    /**\n     * @deprecated Use `dapp` instead.\n     *\n     * Metadata is used to fill details for the UX on confirmation screens in MetaMask.\n     */\n    dappMetadata?: { name?: string; url?: string; iconUrl?: string } | undefined\n    /**\n     * @deprecated Use `debug` instead.\n     */\n    logging?: { sdk?: boolean } | undefined\n    /**\n     * @deprecated Use `ui.headless` instead.\n     */\n    headless?: boolean | undefined\n  } & OneOf<\n      | {\n          /* Shortcut to connect and sign a message */\n          connectAndSign?: string | undefined\n        }\n      | {\n          // TODO: Strongly type `method` and `params`\n          /* Allow `connectWith` any rpc method */\n          connectWith?: { method: string; params: unknown[] } | undefined\n        }\n    >\n>\n\ntype CreateEVMClientParameters = Parameters<typeof createEVMClient>[0]\n\nmetaMask.type = 'metaMask' as const\nexport function metaMask(parameters: MetaMaskParameters = {}) {\n  type Provider = EIP1193Provider\n  type Properties = {\n    onConnect(connectInfo: ProviderConnectInfo): void\n    onDisplayUri(uri: string): void\n    getInstance(): Promise<MetamaskConnectEVM>\n  }\n\n  let metamask: MetamaskConnectEVM | undefined\n  let metamaskPromise: Promise<MetamaskConnectEVM> | undefined\n\n  return createConnector<Provider, Properties>((config) => ({\n    id: 'metaMaskSDK',\n    name: 'MetaMask',\n    rdns: ['io.metamask', 'io.metamask.mobile'],\n    type: metaMask.type,\n    async connect({ chainId, isReconnecting, withCapabilities } = {}) {\n      const instance = await this.getInstance()\n      const provider = instance.getProvider()\n\n      let accounts: readonly Address[] = []\n      if (isReconnecting) accounts = await this.getAccounts().catch(() => [])\n\n      try {\n        let signResponse: string | undefined\n        let connectWithResponse: unknown | undefined\n        if (!accounts?.length) {\n          const chainIds = config.chains.map((chain) => numberToHex(chain.id))\n          if (parameters.connectAndSign || parameters.connectWith) {\n            if (parameters.connectAndSign)\n              signResponse = await instance.connectAndSign({\n                chainIds,\n                message: parameters.connectAndSign,\n              })\n            else if (parameters.connectWith)\n              connectWithResponse = await instance.connectWith({\n                chainIds,\n                method: parameters.connectWith.method,\n                params: parameters.connectWith.params,\n              })\n\n            accounts = await this.getAccounts()\n          } else {\n            const result = await instance.connect({ chainIds })\n            accounts = result.accounts.map((x) => getAddress(x))\n          }\n        }\n        // Switch to chain if provided\n        let currentChainId = await this.getChainId()\n        if (chainId && currentChainId !== chainId) {\n          const chain = await this.switchChain!({ chainId }).catch((error) => {\n            if (error.code === UserRejectedRequestError.code) throw error\n            return { id: currentChainId }\n          })\n          currentChainId = chain?.id ?? currentChainId\n        }\n\n        if (signResponse)\n          provider.emit('connectAndSign', {\n            accounts,\n            chainId: numberToHex(currentChainId),\n            signResponse,\n          })\n        else if (connectWithResponse)\n          provider.emit('connectWith', {\n            accounts,\n            chainId: numberToHex(currentChainId),\n            connectWithResponse,\n          })\n\n        return {\n          // TODO(v3): Make `withCapabilities: true` default behavior\n          accounts: (withCapabilities\n            ? accounts.map((address) => ({ address, capabilities: {} }))\n            : accounts) as never,\n          chainId: currentChainId,\n        }\n      } catch (err) {\n        const error = err as RpcError\n        if (error.code === UserRejectedRequestError.code)\n          throw new UserRejectedRequestError(error)\n        if (error.code === ResourceUnavailableRpcError.code)\n          throw new ResourceUnavailableRpcError(error)\n        throw error\n      }\n    },\n    async disconnect() {\n      const instance = await this.getInstance()\n      return instance.disconnect()\n    },\n    async getAccounts() {\n      const instance = await this.getInstance()\n      if (instance.accounts.length)\n        return instance.accounts.map((x) => getAddress(x))\n      // Fallback to provider if SDK doesn't return accounts\n      const provider = instance.getProvider()\n      const accounts = (await provider.request({\n        method: 'eth_accounts',\n      })) as string[]\n      return accounts.map((x) => getAddress(x))\n    },\n    async getChainId() {\n      const instance = await this.getInstance()\n      if (instance.getChainId()) return Number(instance.getChainId())\n      // Fallback to provider if SDK doesn't return chainId\n      const provider = instance.getProvider()\n      const chainId = await provider.request({ method: 'eth_chainId' })\n      return Number(chainId)\n    },\n    async getProvider() {\n      const instance = await this.getInstance()\n      return instance.getProvider()\n    },\n    async isAuthorized() {\n      try {\n        // MetaMask mobile provider sometimes fails to immediately resolve\n        // JSON-RPC requests on page load\n        const timeout = 10\n        const accounts = await withRetry(\n          async () =>\n            withTimeout(\n              async () => {\n                const accounts = await this.getAccounts()\n                if (!accounts.length) throw new Error('try again')\n                return accounts\n              },\n              { timeout },\n            ),\n          { delay: timeout + 1, retryCount: 3 },\n        )\n        return Boolean(accounts.length)\n      } catch {\n        return false\n      }\n    },\n    async switchChain({ addEthereumChainParameter, chainId }) {\n      const chain = config.chains.find(({ id }) => id === Number(chainId))\n      if (!chain) throw new SwitchChainError(new ChainNotConfiguredError())\n\n      const hexChainId = numberToHex(chainId)\n\n      try {\n        const instance = await this.getInstance()\n        await instance.switchChain({\n          chainId: hexChainId,\n          chainConfiguration: {\n            blockExplorerUrls: addEthereumChainParameter?.blockExplorerUrls\n              ? [...addEthereumChainParameter.blockExplorerUrls]\n              : chain.blockExplorers?.default.url\n                ? [chain.blockExplorers.default.url]\n                : undefined,\n            chainId: hexChainId,\n            chainName: addEthereumChainParameter?.chainName ?? chain.name,\n            iconUrls: addEthereumChainParameter?.iconUrls,\n            nativeCurrency:\n              addEthereumChainParameter?.nativeCurrency ?? chain.nativeCurrency,\n            rpcUrls: addEthereumChainParameter?.rpcUrls\n              ? [...addEthereumChainParameter.rpcUrls]\n              : chain.rpcUrls.default?.http\n                ? [...chain.rpcUrls.default.http]\n                : undefined,\n          },\n        })\n        return chain\n      } catch (err) {\n        const error = err as RpcError\n\n        if (error.code === UserRejectedRequestError.code)\n          throw new UserRejectedRequestError(error)\n\n        throw new SwitchChainError(error)\n      }\n    },\n    async onAccountsChanged(accounts) {\n      config.emitter.emit('change', {\n        accounts: accounts.map((x) => getAddress(x)),\n      })\n    },\n    onChainChanged(chain) {\n      const chainId = Number(chain)\n      config.emitter.emit('change', { chainId })\n    },\n    async onConnect(connectInfo) {\n      const accounts = await this.getAccounts()\n      if (accounts.length === 0) return\n\n      const chainId = Number(connectInfo.chainId)\n      config.emitter.emit('connect', { accounts, chainId })\n    },\n    async onDisconnect(error) {\n      // If MetaMask emits a `code: 1013` error, wait for reconnection before disconnecting\n      // https://github.com/MetaMask/providers/pull/120\n      if (error && (error as RpcError<1013>).code === 1013) {\n        const provider = await this.getProvider()\n        if (provider && Boolean((await this.getAccounts()).length)) return\n      }\n\n      config.emitter.emit('disconnect')\n    },\n    onDisplayUri(uri) {\n      config.emitter.emit('message', { type: 'display_uri', data: uri })\n    },\n    async getInstance() {\n      if (!metamask) {\n        if (!metamaskPromise) {\n          const { createEVMClient } = await (async () => {\n            try {\n              return import('@metamask/connect-evm')\n            } catch {\n              throw new Error('dependency \"@metamask/connect-evm\" not found')\n            }\n          })()\n          const defaultDappParams =\n            typeof window === 'undefined'\n              ? { name: 'wagmi' }\n              : { name: window.location.hostname, url: window.location.href }\n\n          metamaskPromise = createEVMClient({\n            ...parameters,\n            api: {\n              supportedNetworks: Object.fromEntries(\n                config.chains.map((chain) => [\n                  numberToHex(chain.id),\n                  chain.rpcUrls.default?.http[0] ?? '',\n                ]),\n              ),\n            },\n            dapp: parameters.dapp ?? {\n              ...defaultDappParams,\n              ...parameters.dappMetadata,\n            },\n            debug: parameters.debug ?? parameters.logging?.sdk,\n            eventHandlers: {\n              accountsChanged: this.onAccountsChanged.bind(this),\n              chainChanged: this.onChainChanged.bind(this),\n              connect: this.onConnect.bind(this),\n              disconnect: this.onDisconnect.bind(this),\n              displayUri: this.onDisplayUri.bind(this),\n            },\n            analytics: {\n              integrationType: 'wagmi',\n            },\n            ui: {\n              ...parameters.ui,\n              ...(parameters.headless != null && {\n                headless: parameters.headless,\n              }),\n            },\n            ...(parameters.mobile && { mobile: parameters.mobile }),\n          })\n        }\n        metamask = await metamaskPromise\n      }\n      return metamask\n    },\n  }))\n}\n"
  },
  {
    "path": "packages/connectors/src/porto.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { porto } from './porto.js'\n\ntest('setup', () => {\n  const connectorFn = porto()\n  const connector = config._internal.connectors.setup(connectorFn)\n  expect(connector.name).toEqual('Porto')\n})\n"
  },
  {
    "path": "packages/connectors/src/porto.ts",
    "content": "import {\n  ChainNotConfiguredError,\n  type Connector,\n  createConnector,\n} from '@wagmi/core'\nimport type { ExactPartial } from '@wagmi/core/internal'\nimport type { Porto, RpcSchema } from 'porto'\nimport {\n  type Address,\n  getAddress,\n  numberToHex,\n  type ProviderConnectInfo,\n  type RpcError,\n  SwitchChainError,\n  UserRejectedRequestError,\n  withRetry,\n} from 'viem'\n\nexport type PortoParameters = ExactPartial<Porto.Config>\n\nexport function porto(parameters: PortoParameters = {}) {\n  type Provider = ReturnType<typeof Porto.create>['provider']\n  type Properties = {\n    connect<withCapabilities extends boolean = false>(parameters?: {\n      chainId?: number | undefined\n      capabilities?:\n        | (RpcSchema.wallet_connect.Capabilities & {\n            force?: boolean | undefined\n          })\n        | undefined\n      isReconnecting?: boolean | undefined\n      withCapabilities?: withCapabilities | boolean | undefined\n    }): Promise<{\n      accounts: withCapabilities extends true\n        ? readonly {\n            address: Address\n            capabilities: RpcSchema.wallet_connect.ResponseCapabilities\n          }[]\n        : readonly Address[]\n      chainId: number\n    }>\n    getPortoInstance(): Promise<Porto.Porto>\n    onConnect(connectInfo: ProviderConnectInfo): void\n  }\n\n  return createConnector<Provider, Properties>((wagmiConfig) => {\n    const chains = wagmiConfig.chains ?? parameters.chains ?? []\n\n    const transports = (() => {\n      if (wagmiConfig.transports) return wagmiConfig.transports\n      return parameters.transports\n    })()\n\n    let porto_promise: Promise<any> | undefined\n\n    let accountsChanged: Connector['onAccountsChanged'] | undefined\n    let chainChanged: Connector['onChainChanged'] | undefined\n    let connect: Connector['onConnect'] | undefined\n    let disconnect: Connector['onDisconnect'] | undefined\n\n    return {\n      async connect({ chainId = chains[0].id, ...rest } = {}) {\n        const isReconnecting =\n          ('isReconnecting' in rest && rest.isReconnecting) || false\n        const withCapabilities =\n          ('withCapabilities' in rest && rest.withCapabilities) || false\n\n        let accounts: readonly (Address | { address: Address })[] = []\n        let currentChainId: number | undefined\n\n        if (isReconnecting) {\n          ;[accounts, currentChainId] = await Promise.all([\n            this.getAccounts().catch(() => []),\n            this.getChainId().catch(() => undefined),\n          ])\n          if (chainId && currentChainId !== chainId) {\n            const chain = await this.switchChain!({ chainId }).catch(\n              (error) => {\n                if (error.code === UserRejectedRequestError.code) throw error\n                return { id: currentChainId }\n              },\n            )\n            currentChainId = chain?.id ?? currentChainId\n          }\n        }\n\n        const provider = (await this.getProvider()) as Provider\n\n        try {\n          if (!accounts?.length && !isReconnecting) {\n            const { RpcSchema } = await (() => {\n              // safe webpack optional peer dependency dynamic import\n              try {\n                return import('porto')\n              } catch {\n                throw new Error('dependency \"porto\" not found')\n              }\n            })()\n            const { z } = await (() => {\n              // safe webpack optional peer dependency dynamic import\n              try {\n                return import('porto/internal')\n              } catch {\n                throw new Error('dependency \"porto/internal\" not found')\n              }\n            })()\n            const res = await provider.request({\n              method: 'wallet_connect',\n              params: [\n                {\n                  ...('capabilities' in rest\n                    ? {\n                        capabilities: z.encode(\n                          RpcSchema.wallet_connect.Capabilities,\n                          rest.capabilities ?? {},\n                        ),\n                      }\n                    : {}),\n                  chainIds: [\n                    numberToHex(chainId),\n                    ...chains\n                      .filter((x) => x.id !== chainId)\n                      .map((x) => numberToHex(x.id)),\n                  ],\n                },\n              ],\n            })\n            accounts = res.accounts\n            currentChainId = Number(res.chainIds[0])\n          }\n\n          if (!currentChainId) throw new ChainNotConfiguredError()\n\n          // Manage EIP-1193 event listeners\n          // https://eips.ethereum.org/EIPS/eip-1193#events\n          if (connect) {\n            provider.removeListener('connect', connect)\n            connect = undefined\n          }\n          if (!accountsChanged) {\n            accountsChanged = this.onAccountsChanged.bind(this)\n            // Porto Provider uses Ox, which uses `readonly Address.Address[]` for `accountsChanged`,\n            // while Connector `accountsChanged` is `string[]`\n            provider.on('accountsChanged', accountsChanged as never)\n          }\n          if (!chainChanged) {\n            chainChanged = this.onChainChanged.bind(this)\n            provider.on('chainChanged', chainChanged)\n          }\n          if (!disconnect) {\n            disconnect = this.onDisconnect.bind(this)\n            provider.on('disconnect', disconnect)\n          }\n\n          return {\n            accounts: accounts.map((account) => {\n              if (typeof account === 'object')\n                return withCapabilities ? account : account.address\n              return withCapabilities\n                ? { address: account, capabilities: {} }\n                : account\n            }) as never,\n            chainId: currentChainId,\n          }\n        } catch (err) {\n          const error = err as RpcError\n          if (error.code === UserRejectedRequestError.code)\n            throw new UserRejectedRequestError(error)\n          throw error\n        }\n      },\n      async disconnect() {\n        const provider = await this.getProvider()\n\n        if (chainChanged) {\n          provider.removeListener('chainChanged', chainChanged)\n          chainChanged = undefined\n        }\n        if (disconnect) {\n          provider.removeListener('disconnect', disconnect)\n          disconnect = undefined\n        }\n        if (!connect) {\n          connect = this.onConnect.bind(this)\n          provider.on('connect', connect)\n        }\n\n        await provider.request({ method: 'wallet_disconnect' })\n      },\n      async getAccounts() {\n        const provider = await this.getProvider()\n        const accounts = await provider.request({\n          method: 'eth_accounts',\n        })\n        return accounts.map((x) => getAddress(x))\n      },\n      async getChainId() {\n        const provider = await this.getProvider()\n        const hexChainId = await provider.request({\n          method: 'eth_chainId',\n        })\n        return Number(hexChainId)\n      },\n      async getPortoInstance() {\n        porto_promise ??= (async () => {\n          const { Porto } = await (() => {\n            // safe webpack optional peer dependency dynamic import\n            try {\n              return import('porto')\n            } catch {\n              throw new Error('dependency \"porto\" not found')\n            }\n          })()\n          // @ts-ignore\n          return Porto.create({\n            ...parameters,\n            announceProvider: false,\n            // @ts-ignore\n            chains,\n            // @ts-ignore\n            transports,\n          })\n        })()\n        return await porto_promise\n      },\n      async getProvider() {\n        return (await this.getPortoInstance()).provider\n      },\n      icon: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDIyIiBoZWlnaHQ9IjQyMiIgdmlld0JveD0iMCAwIDQyMiA0MjIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSI0MjIiIGhlaWdodD0iNDIyIiBmaWxsPSJibGFjayIvPgo8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfMV8xNSkiPgo8cGF0aCBkPSJNODEgMjg2LjM2NkM4MSAyODAuODkzIDg1LjQ1MDUgMjc2LjQ1NSA5MC45NDA0IDI3Ni40NTVIMzI5LjUxMUMzMzUuMDAxIDI3Ni40NTUgMzM5LjQ1MiAyODAuODkzIDMzOS40NTIgMjg2LjM2NlYzMDYuMTg4QzMzOS40NTIgMzExLjY2MiAzMzUuMDAxIDMxNi4wOTkgMzI5LjUxMSAzMTYuMDk5SDkwLjk0MDRDODUuNDUwNSAzMTYuMDk5IDgxIDMxMS42NjIgODEgMzA2LjE4OFYyODYuMzY2WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOTAuOTQwNCAyMzQuODI4Qzg1LjQ1MDUgMjM0LjgyOCA4MSAyMzkuMjY2IDgxIDI0NC43MzlWMjcxLjUzMUM4My44NDMyIDI2OS42MzMgODcuMjYyMiAyNjguNTI2IDkwLjk0MDQgMjY4LjUyNkgzMjkuNTExQzMzMy4xODggMjY4LjUyNiAzMzYuNjA4IDI2OS42MzMgMzM5LjQ1MiAyNzEuNTMxVjI0NC43MzlDMzM5LjQ1MiAyMzkuMjY2IDMzNS4wMDEgMjM0LjgyOCAzMjkuNTExIDIzNC44MjhIOTAuOTQwNFpNMzM5LjQ1MiAyODYuMzY2QzMzOS40NTIgMjgwLjg5MyAzMzUuMDAxIDI3Ni40NTUgMzI5LjUxMSAyNzYuNDU1SDkwLjk0MDRDODUuNDUwNSAyNzYuNDU1IDgxIDI4MC44OTMgODEgMjg2LjM2NlYzMDYuMTlDODEgMzExLjY2NCA4NS40NTA1IDMxNi4xMDEgOTAuOTQwNCAzMTYuMTAxSDMyOS41MTFDMzM1LjAwMSAzMTYuMTAxIDMzOS40NTIgMzExLjY2NCAzMzkuNDUyIDMwNi4xOVYyODYuMzY2WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOTAuOTQwNCAxOTMuMjAxQzg1LjQ1MDUgMTkzLjIwMSA4MSAxOTcuNjM4IDgxIDIwMy4xMTJWMjI5LjkwM0M4My44NDMyIDIyOC4wMDYgODcuMjYyMiAyMjYuODk5IDkwLjk0MDQgMjI2Ljg5OUgzMjkuNTExQzMzMy4xODggMjI2Ljg5OSAzMzYuNjA4IDIyOC4wMDYgMzM5LjQ1MiAyMjkuOTAzVjIwMy4xMTJDMzM5LjQ1MiAxOTcuNjM4IDMzNS4wMDEgMTkzLjIwMSAzMjkuNTExIDE5My4yMDFIOTAuOTQwNFpNMzM5LjQ1MiAyNDQuNzM5QzMzOS40NTIgMjM5LjI2NSAzMzUuMDAxIDIzNC44MjggMzI5LjUxMSAyMzQuODI4SDkwLjk0MDRDODUuNDUwNSAyMzQuODI4IDgxIDIzOS4yNjUgODEgMjQ0LjczOVYyNzEuNTNDODEuMjE3NSAyNzEuMzg1IDgxLjQzODMgMjcxLjI0NSA4MS42NjI0IDI3MS4xMDlDODMuODMyNSAyNjkuNzk0IDg2LjMwNTQgMjY4LjkyNyA4OC45NTIzIDI2OC42MzVDODkuNjA1MSAyNjguNTYzIDkwLjI2ODQgMjY4LjUyNiA5MC45NDA0IDI2OC41MjZIMzI5LjUxMUMzMzAuMTgzIDI2OC41MjYgMzMwLjg0NiAyNjguNTYzIDMzMS40OTggMjY4LjYzNUMzMzQuNDE5IDI2OC45NTcgMzM3LjEyOCAyNjkuOTggMzM5LjQ1MiAyNzEuNTNWMjQ0LjczOVpNMzM5LjQ1MiAyODYuMzY2QzMzOS40NTIgMjgxLjAyMSAzMzUuMjA2IDI3Ni42NjMgMzI5Ljg5MyAyNzYuNDYyQzMyOS43NjcgMjc2LjQ1NyAzMjkuNjQgMjc2LjQ1NSAzMjkuNTExIDI3Ni40NTVIOTAuOTQwNEM4NS40NTA1IDI3Ni40NTUgODEgMjgwLjg5MyA4MSAyODYuMzY2VjMwNi4xODhDODEgMzExLjY2MiA4NS40NTA1IDMxNi4xMDEgOTAuOTQwNCAzMTYuMTAxSDMyOS41MTFDMzM1LjAwMSAzMTYuMTAxIDMzOS40NTIgMzExLjY2MiAzMzkuNDUyIDMwNi4xODhWMjg2LjM2NloiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8cGF0aCBvcGFjaXR5PSIwLjMiIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOTguMDE0NiAxMDRDODguNjE3NyAxMDQgODEgMTExLjU5NSA4MSAxMjAuOTY1VjE4OC4yNzZDODMuODQzMiAxODYuMzc5IDg3LjI2MjIgMTg1LjI3MiA5MC45NDA0IDE4NS4yNzJIMzI5LjUxMUMzMzMuMTg4IDE4NS4yNzIgMzM2LjYwOCAxODYuMzc5IDMzOS40NTIgMTg4LjI3NlYxMjAuOTY1QzMzOS40NTIgMTExLjU5NSAzMzEuODMzIDEwNCAzMjIuNDM3IDEwNEg5OC4wMTQ2Wk0zMzkuNDUyIDIwMy4xMTJDMzM5LjQ1MiAxOTcuNjM4IDMzNS4wMDEgMTkzLjIwMSAzMjkuNTExIDE5My4yMDFIOTAuOTQwNEM4NS40NTA1IDE5My4yMDEgODEgMTk3LjYzOCA4MSAyMDMuMTEyVjIyOS45MDNDODEuMjE3NSAyMjkuNzU4IDgxLjQzODMgMjI5LjYxOCA4MS42NjI0IDIyOS40ODJDODMuODMyNSAyMjguMTY3IDg2LjMwNTQgMjI3LjMgODguOTUyMyAyMjcuMDA4Qzg5LjYwNTEgMjI2LjkzNiA5MC4yNjg0IDIyNi44OTkgOTAuOTQwNCAyMjYuODk5SDMyOS41MTFDMzMwLjE4MyAyMjYuODk5IDMzMC44NDYgMjI2LjkzNiAzMzEuNDk4IDIyNy4wMDhDMzM0LjQxOSAyMjcuMzMgMzM3LjEyOCAyMjguMzUyIDMzOS40NTIgMjI5LjkwM1YyMDMuMTEyWk0zMzkuNDUyIDI0NC43MzlDMzM5LjQ1MiAyMzkuMzkzIDMzNS4yMDYgMjM1LjAzNiAzMjkuODkzIDIzNC44MzVDMzI5Ljc2NyAyMzQuODMgMzI5LjY0IDIzNC44MjggMzI5LjUxMSAyMzQuODI4SDkwLjk0MDRDODUuNDUwNSAyMzQuODI4IDgxIDIzOS4yNjUgODEgMjQ0LjczOVYyNzEuNTNMODEuMDcwNyAyNzEuNDgzQzgxLjI2NTMgMjcxLjM1NSA4MS40NjI1IDI3MS4yMyA4MS42NjI0IDI3MS4xMDlDODEuOTA4MyAyNzAuOTYgODIuMTU4MSAyNzAuODE3IDgyLjQxMTcgMjcwLjY3OUM4NC4zOTUzIDI2OS42MDUgODYuNjA1NCAyNjguODk0IDg4Ljk1MjMgMjY4LjYzNUM4OS4wMDUyIDI2OC42MjkgODkuMDU4IDI2OC42MjQgODkuMTExIDI2OC42MThDODkuNzEyNSAyNjguNTU3IDkwLjMyMjggMjY4LjUyNiA5MC45NDA0IDI2OC41MjZIMzI5LjUxMUMzMjkuNzM4IDI2OC41MjYgMzI5Ljk2NSAyNjguNTMgMzMwLjE5MiAyNjguNTM5QzMzMC42MzEgMjY4LjU1NSAzMzEuMDY3IDI2OC41ODcgMzMxLjQ5OCAyNjguNjM1QzMzNC40MTkgMjY4Ljk1NyAzMzcuMTI4IDI2OS45OCAzMzkuNDUyIDI3MS41M1YyNDQuNzM5Wk0zMzkuNDUyIDI4Ni4zNjZDMzM5LjQ1MiAyODEuMDIxIDMzNS4yMDYgMjc2LjY2MyAzMjkuODkzIDI3Ni40NjJMMzI5Ljg2NSAyNzYuNDYxQzMyOS43NDggMjc2LjQ1NyAzMjkuNjI5IDI3Ni40NTUgMzI5LjUxMSAyNzYuNDU1SDkwLjk0MDRDODUuNDUwNSAyNzYuNDU1IDgxIDI4MC44OTMgODEgMjg2LjM2NlYzMDYuMTg4QzgxIDMxMS42NjIgODUuNDUwNSAzMTYuMTAxIDkwLjk0MDQgMzE2LjEwMUgzMjkuNTExQzMzNS4wMDEgMzE2LjEwMSAzMzkuNDUyIDMxMS42NjIgMzM5LjQ1MiAzMDYuMTg4VjI4Ni4zNjZaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMjY5Ljg2OCAxMzEuNzUyQzI2OS44NjggMTI2LjI3OCAyNzQuMzE4IDEyMS44NCAyNzkuODA4IDEyMS44NEgzMTEuNjE4QzMxNy4xMDggMTIxLjg0IDMyMS41NTggMTI2LjI3OCAzMjEuNTU4IDEzMS43NTJWMTYxLjQ4NUMzMjEuNTU4IDE2Ni45NTkgMzE3LjEwOCAxNzEuMzk2IDMxMS42MTggMTcxLjM5NkgyNzkuODA4QzI3NC4zMTggMTcxLjM5NiAyNjkuODY4IDE2Ni45NTkgMjY5Ljg2OCAxNjEuNDg1VjEzMS43NTJaIiBmaWxsPSJ3aGl0ZSIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzFfMTUiPgo8cmVjdCB3aWR0aD0iMjU5IiBoZWlnaHQ9IjIxMyIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDgxIDEwNCkiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K',\n      id: 'xyz.ithaca.porto',\n      async isAuthorized() {\n        try {\n          // Use retry strategy as some injected wallets (e.g. MetaMask) fail to\n          // immediately resolve JSON-RPC requests on page load.\n          const accounts = await withRetry(() => this.getAccounts())\n          return !!accounts.length\n        } catch {\n          return false\n        }\n      },\n      name: 'Porto',\n      async onAccountsChanged(accounts) {\n        wagmiConfig.emitter.emit('change', {\n          accounts: accounts.map((x) => getAddress(x)),\n        })\n      },\n      onChainChanged(chain) {\n        const chainId = Number(chain)\n        wagmiConfig.emitter.emit('change', { chainId })\n      },\n      async onConnect(connectInfo) {\n        const accounts = await this.getAccounts()\n        if (accounts.length === 0) return\n\n        const chainId = Number(connectInfo.chainId)\n        wagmiConfig.emitter.emit('connect', { accounts, chainId })\n\n        // Manage EIP-1193 event listeners\n        const provider = await this.getProvider()\n        if (provider) {\n          if (connect) {\n            provider.removeListener('connect', connect)\n            connect = undefined\n          }\n          if (!accountsChanged) {\n            accountsChanged = this.onAccountsChanged.bind(this)\n            // Porto Provider uses Ox, which uses `readonly Address.Address[]` for `accountsChanged`,\n            // while Connector `accountsChanged` is `string[]`\n            provider.on('accountsChanged', accountsChanged as never)\n          }\n          if (!chainChanged) {\n            chainChanged = this.onChainChanged.bind(this)\n            provider.on('chainChanged', chainChanged)\n          }\n          if (!disconnect) {\n            disconnect = this.onDisconnect.bind(this)\n            provider.on('disconnect', disconnect)\n          }\n        }\n      },\n      async onDisconnect(_error) {\n        const provider = await this.getProvider()\n\n        wagmiConfig.emitter.emit('disconnect')\n\n        // Manage EIP-1193 event listeners\n        if (provider) {\n          if (chainChanged) {\n            provider.removeListener('chainChanged', chainChanged)\n            chainChanged = undefined\n          }\n          if (disconnect) {\n            provider.removeListener('disconnect', disconnect)\n            disconnect = undefined\n          }\n          if (!connect) {\n            connect = this.onConnect.bind(this)\n            provider.on('connect', connect)\n          }\n        }\n      },\n      async setup() {\n        if (!connect) {\n          const provider = await this.getProvider()\n          connect = this.onConnect.bind(this)\n          provider.on('connect', connect)\n        }\n      },\n      async switchChain({ chainId }) {\n        const chain = chains.find((x) => x.id === chainId)\n        if (!chain) throw new SwitchChainError(new ChainNotConfiguredError())\n\n        const provider = await this.getProvider()\n        await provider.request({\n          method: 'wallet_switchEthereumChain',\n          params: [{ chainId: numberToHex(chainId) }],\n        })\n\n        return chain\n      },\n      type: 'injected',\n    }\n  })\n}\n"
  },
  {
    "path": "packages/connectors/src/safe.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { safe } from './safe.js'\n\n/*\n * To manually test the Safe connector:\n *\n * 1. Run the wagmi playground app (`pnpm dev`)\n * 2. Add a custom Safe App with App URL set to `http://localhost:5173` (make sure there is a `manifest.json` file served by the playground)\n * 3. Open the playground app at `https://app.safe.global/eth:0x4557B18E779944BFE9d78A672452331C186a9f48/apps?appUrl=http%3A%2F%2Flocalhost%3A5173`\n *\n * See https://docs.gnosis-safe.io/learn/safe-tools/sdks/safe-apps/releasing-your-safe-app for more info.\n */\n\ntest('setup', () => {\n  const connectorFn = safe({\n    allowedDomains: [/gnosis-safe.io$/, /app.safe.global$/],\n    debug: false,\n  })\n  const connector = config._internal.connectors.setup(connectorFn)\n  expect(connector.name).toEqual('Safe')\n})\n"
  },
  {
    "path": "packages/connectors/src/safe.ts",
    "content": "import type { SafeAppProvider } from '@safe-global/safe-apps-provider'\nimport type { Opts } from '@safe-global/safe-apps-sdk'\nimport {\n  type Connector,\n  createConnector,\n  ProviderNotFoundError,\n} from '@wagmi/core'\nimport type { Compute } from '@wagmi/core/internal'\nimport { getAddress, withTimeout } from 'viem'\n\nexport type SafeParameters = Compute<\n  Opts & {\n    /**\n     * Connector automatically connects when used as Safe App.\n     *\n     * This flag simulates the disconnect behavior by keeping track of connection status in storage\n     * and only autoconnecting when previously connected by user action (e.g. explicitly choosing to connect).\n     *\n     * @default false\n     */\n    shimDisconnect?: boolean | undefined\n    /**\n     * Timeout in milliseconds for `getInfo` (from the Safe SDK) to resolve.\n     *\n     * `getInfo` does not resolve when not used in Safe App iFrame. This allows the connector to force a timeout.\n     * @default 10\n     */\n    unstable_getInfoTimeout?: number | undefined\n  }\n>\n\nsafe.type = 'safe' as const\nexport function safe(parameters: SafeParameters = {}) {\n  const { shimDisconnect = false } = parameters\n\n  type Provider = SafeAppProvider | undefined\n  type Properties = Record<string, unknown>\n  type StorageItem = { 'safe.disconnected': true }\n\n  let provider_: Provider | undefined\n\n  let disconnect: Connector['onDisconnect'] | undefined\n\n  return createConnector<Provider, Properties, StorageItem>((config) => ({\n    id: 'safe',\n    name: 'Safe',\n    type: safe.type,\n    async connect({ withCapabilities } = {}) {\n      const provider = await this.getProvider()\n      if (!provider) throw new ProviderNotFoundError()\n\n      const accounts = await this.getAccounts()\n      const chainId = await this.getChainId()\n\n      if (!disconnect) {\n        disconnect = this.onDisconnect.bind(this)\n        provider.on('disconnect', disconnect)\n      }\n\n      // Remove disconnected shim if it exists\n      if (shimDisconnect) await config.storage?.removeItem('safe.disconnected')\n\n      return {\n        // TODO(v3): Make `withCapabilities: true` default behavior\n        accounts: (withCapabilities\n          ? accounts.map((address) => ({ address, capabilities: {} }))\n          : accounts) as never,\n        chainId,\n      }\n    },\n    async disconnect() {\n      const provider = await this.getProvider()\n      if (!provider) throw new ProviderNotFoundError()\n\n      if (disconnect) {\n        provider.removeListener('disconnect', disconnect)\n        disconnect = undefined\n      }\n\n      // Add shim signalling connector is disconnected\n      if (shimDisconnect)\n        await config.storage?.setItem('safe.disconnected', true)\n    },\n    async getAccounts() {\n      const provider = await this.getProvider()\n      if (!provider) throw new ProviderNotFoundError()\n      return (await provider.request({ method: 'eth_accounts' })).map(\n        getAddress,\n      )\n    },\n    async getProvider() {\n      // Only allowed in iframe context\n      const isIframe =\n        typeof window !== 'undefined' && window?.parent !== window\n      if (!isIframe) return\n\n      if (!provider_) {\n        const { default: SDK } = await (() => {\n          // safe webpack optional peer dependency dynamic import\n          try {\n            return import('@safe-global/safe-apps-sdk')\n          } catch {\n            throw new Error('dependency \"@safe-global/safe-apps-sdk\" not found')\n          }\n        })()\n        const sdk = new SDK(parameters)\n\n        // `getInfo` hangs when not used in Safe App iFrame\n        // https://github.com/safe-global/safe-apps-sdk/issues/263#issuecomment-1029835840\n        const safe = await withTimeout(() => sdk.safe.getInfo(), {\n          timeout: parameters.unstable_getInfoTimeout ?? 10,\n        })\n        if (!safe) throw new Error('Could not load Safe information')\n        // Unwrapping import for Vite compatibility.\n        // See: https://github.com/vitejs/vite/issues/9703\n        const SafeAppProvider = await (async () => {\n          const Provider = await (() => {\n            // safe webpack optional peer dependency dynamic import\n            try {\n              return import('@safe-global/safe-apps-provider')\n            } catch {\n              throw new Error(\n                'dependency \"@safe-global/safe-apps-provider\" not found',\n              )\n            }\n          })()\n          if (\n            typeof Provider.SafeAppProvider !== 'function' &&\n            typeof Provider.default.SafeAppProvider === 'function'\n          )\n            return Provider.default.SafeAppProvider\n          return Provider.SafeAppProvider\n        })()\n        provider_ = new SafeAppProvider(safe, sdk)\n      }\n      return provider_\n    },\n    async getChainId() {\n      const provider = await this.getProvider()\n      if (!provider) throw new ProviderNotFoundError()\n      return Number(provider.chainId)\n    },\n    async isAuthorized() {\n      try {\n        const isDisconnected =\n          shimDisconnect &&\n          // If shim exists in storage, connector is disconnected\n          (await config.storage?.getItem('safe.disconnected'))\n        if (isDisconnected) return false\n\n        const accounts = await this.getAccounts()\n        return !!accounts.length\n      } catch {\n        return false\n      }\n    },\n    onAccountsChanged() {\n      // Not relevant for Safe because changing account requires app reload.\n    },\n    onChainChanged() {\n      // Not relevant for Safe because Safe smart contract wallets only exist on single chain.\n    },\n    onDisconnect() {\n      config.emitter.emit('disconnect')\n    },\n  }))\n}\n"
  },
  {
    "path": "packages/connectors/src/version.ts",
    "content": "export const version = '7.2.1'\n"
  },
  {
    "path": "packages/connectors/src/walletConnect.test.ts",
    "content": "import { config, walletConnectProjectId } from '@wagmi/test'\nimport { HttpResponse, http } from 'msw'\nimport { setupServer } from 'msw/node'\nimport {\n  afterAll,\n  afterEach,\n  beforeAll,\n  expect,\n  expectTypeOf,\n  test,\n  vi,\n} from 'vitest'\n\nimport { walletConnect } from './walletConnect.js'\n\nconst handlers = [\n  http.get('https://relay.walletconnect.com', async () =>\n    HttpResponse.json(\n      {\n        topic: '222781e3-3fad-4184-acde-077796bf0d3d',\n        type: 'sub',\n        payload: '',\n        silent: true,\n      },\n      { status: 200 },\n    ),\n  ),\n]\n\nconst server = setupServer(...handlers)\n\nbeforeAll(() => {\n  server.listen({\n    onUnhandledRequest: 'warn',\n  })\n\n  const matchMedia = vi.fn().mockImplementation((query) => {\n    return {\n      matches: false,\n      media: query,\n      onchange: null,\n      addListener: vi.fn(), // deprecated\n      removeListener: vi.fn(), // deprecated\n      addEventListener: vi.fn(),\n      removeEventListener: vi.fn(),\n      dispatchEvent: vi.fn(),\n    }\n  })\n  vi.stubGlobal('matchMedia', matchMedia)\n})\n\nafterEach(() => server.resetHandlers())\n\nafterAll(() => server.close())\n\ntest('setup', () => {\n  const connectorFn = walletConnect({ projectId: walletConnectProjectId })\n  const connector = config._internal.connectors.setup(connectorFn)\n  expect(connector.name).toEqual('WalletConnect')\n\n  type ConnectFnParameters = NonNullable<\n    Parameters<(typeof connector)['connect']>[0]\n  >\n  expectTypeOf<ConnectFnParameters['pairingTopic']>().toMatchTypeOf<\n    string | undefined\n  >()\n})\n"
  },
  {
    "path": "packages/connectors/src/walletConnect.ts",
    "content": "import {\n  ChainNotConfiguredError,\n  type Connector,\n  createConnector,\n  extractRpcUrls,\n  ProviderNotFoundError,\n} from '@wagmi/core'\nimport type { Compute, ExactPartial, Omit } from '@wagmi/core/internal'\nimport type { EthereumProvider } from '@walletconnect/ethereum-provider'\nimport {\n  type AddEthereumChainParameter,\n  type Address,\n  getAddress,\n  numberToHex,\n  type ProviderConnectInfo,\n  type ProviderRpcError,\n  type RpcError,\n  SwitchChainError,\n  UserRejectedRequestError,\n} from 'viem'\n\ntype WalletConnectConnector = Connector & {\n  onDisplayUri(uri: string): void\n  onSessionDelete(data: { topic: string }): void\n}\n\ntype EthereumProviderOptions = Parameters<(typeof EthereumProvider)['init']>[0]\n\nexport type WalletConnectParameters = Compute<\n  {\n    /**\n     * If a new chain is added to a previously existing configured connector `chains`, this flag\n     * will determine if that chain should be considered as stale. A stale chain is a chain that\n     * WalletConnect has yet to establish a relationship with (e.g. the user has not approved or\n     * rejected the chain).\n     *\n     * This flag mainly affects the behavior when a wallet does not support dynamic chain authorization\n     * with WalletConnect v2.\n     *\n     * If `true` (default), the new chain will be treated as a stale chain. If the user\n     * has yet to establish a relationship (approved/rejected) with this chain in their WalletConnect\n     * session, the connector will disconnect upon the dapp auto-connecting, and the user will have to\n     * reconnect to the dapp (revalidate the chain) in order to approve the newly added chain.\n     * This is the default behavior to avoid an unexpected error upon switching chains which may\n     * be a confusing user experience (e.g. the user will not know they have to reconnect\n     * unless the dapp handles these types of errors).\n     *\n     * If `false`, the new chain will be treated as a potentially valid chain. This means that if the user\n     * has yet to establish a relationship with the chain in their WalletConnect session, wagmi will successfully\n     * auto-connect the user. This comes with the trade-off that the connector will throw an error\n     * when attempting to switch to the unapproved chain if the wallet does not support dynamic session updates.\n     * This may be useful in cases where a dapp constantly\n     * modifies their configured chains, and they do not want to disconnect the user upon\n     * auto-connecting. If the user decides to switch to the unapproved chain, it is important that the\n     * dapp handles this error and prompts the user to reconnect to the dapp in order to approve\n     * the newly added chain.\n     *\n     * @default true\n     */\n    isNewChainsStale?: boolean\n  } & Omit<\n    EthereumProviderOptions,\n    | 'chains'\n    | 'events'\n    | 'optionalChains'\n    | 'optionalEvents'\n    | 'optionalMethods'\n    | 'methods'\n    | 'rpcMap'\n    | 'showQrModal'\n  > &\n    ExactPartial<Pick<EthereumProviderOptions, 'showQrModal'>>\n>\n\nwalletConnect.type = 'walletConnect' as const\nexport function walletConnect(parameters: WalletConnectParameters) {\n  const isNewChainsStale = parameters.isNewChainsStale ?? true\n\n  type Provider = Awaited<ReturnType<(typeof EthereumProvider)['init']>>\n  type Properties = {\n    // TODO(v3): Make `withCapabilities: true` default behavior\n    connect<withCapabilities extends boolean = false>(parameters?: {\n      chainId?: number | undefined\n      isReconnecting?: boolean | undefined\n      pairingTopic?: string | undefined\n      withCapabilities?: withCapabilities | boolean | undefined\n    }): Promise<{\n      accounts: withCapabilities extends true\n        ? readonly { address: Address }[]\n        : readonly Address[]\n      chainId: number\n    }>\n    getNamespaceChainsIds(): number[]\n    getRequestedChainsIds(): Promise<number[]>\n    isChainsStale(): Promise<boolean>\n    onConnect(connectInfo: ProviderConnectInfo): void\n    onDisplayUri(uri: string): void\n    onSessionDelete(data: { topic: string }): void\n    setRequestedChainsIds(chains: number[]): void\n    requestedChainsStorageKey: `${string}.requestedChains`\n  }\n  type StorageItem = {\n    [_ in Properties['requestedChainsStorageKey']]: number[]\n  }\n\n  let provider_: Provider | undefined\n  let providerPromise: Promise<typeof provider_>\n  const NAMESPACE = 'eip155'\n\n  let accountsChanged: WalletConnectConnector['onAccountsChanged'] | undefined\n  let chainChanged: WalletConnectConnector['onChainChanged'] | undefined\n  let connect: WalletConnectConnector['onConnect'] | undefined\n  let displayUri: WalletConnectConnector['onDisplayUri'] | undefined\n  let sessionDelete: WalletConnectConnector['onSessionDelete'] | undefined\n  let disconnect: WalletConnectConnector['onDisconnect'] | undefined\n\n  return createConnector<Provider, Properties, StorageItem>((config) => ({\n    id: 'walletConnect',\n    name: 'WalletConnect',\n    type: walletConnect.type,\n    async setup() {\n      const provider = await this.getProvider().catch(() => null)\n      if (!provider) return\n      if (!connect) {\n        connect = this.onConnect.bind(this)\n        provider.on('connect', connect)\n      }\n      if (!sessionDelete) {\n        sessionDelete = this.onSessionDelete.bind(this)\n        provider.on('session_delete', sessionDelete)\n      }\n    },\n    async connect({ chainId, withCapabilities, ...rest } = {}) {\n      try {\n        const provider = await this.getProvider()\n        if (!provider) throw new ProviderNotFoundError()\n        if (!displayUri) {\n          displayUri = this.onDisplayUri\n          provider.on('display_uri', displayUri)\n        }\n\n        let targetChainId = chainId\n        if (!targetChainId) {\n          const state = (await config.storage?.getItem('state')) ?? {}\n          const isChainSupported = config.chains.some(\n            (x) => x.id === state.chainId,\n          )\n          if (isChainSupported) targetChainId = state.chainId\n          else targetChainId = config.chains[0]?.id\n        }\n        if (!targetChainId) throw new Error('No chains found on connector.')\n\n        const isChainsStale = await this.isChainsStale()\n        // If there is an active session with stale chains, disconnect current session.\n        if (provider.session && isChainsStale) await provider.disconnect()\n\n        // If there isn't an active session or chains are stale, connect.\n        if (!provider.session || isChainsStale) {\n          const optionalChains = config.chains\n            .filter((chain) => chain.id !== targetChainId)\n            .map((optionalChain) => optionalChain.id)\n          await provider.connect({\n            optionalChains: [targetChainId, ...optionalChains],\n            ...('pairingTopic' in rest\n              ? { pairingTopic: rest.pairingTopic }\n              : {}),\n          })\n\n          this.setRequestedChainsIds(config.chains.map((x) => x.id))\n        }\n\n        // If session exists and chains are authorized, enable provider for required chain\n        const accounts = (await provider.enable()).map((x) => getAddress(x))\n\n        // Switch to chain if provided\n        let currentChainId = await this.getChainId()\n        if (chainId && currentChainId !== chainId) {\n          const chain = await this.switchChain!({ chainId }).catch(\n            (error: RpcError) => {\n              if (\n                error.code === UserRejectedRequestError.code &&\n                (error.cause as RpcError | undefined)?.message !==\n                  'Missing or invalid. request() method: wallet_addEthereumChain'\n              )\n                throw error\n              return { id: currentChainId }\n            },\n          )\n          currentChainId = chain?.id ?? currentChainId\n        }\n\n        if (displayUri) {\n          provider.removeListener('display_uri', displayUri)\n          displayUri = undefined\n        }\n        if (connect) {\n          provider.removeListener('connect', connect)\n          connect = undefined\n        }\n        if (!accountsChanged) {\n          accountsChanged = this.onAccountsChanged.bind(this)\n          provider.on('accountsChanged', accountsChanged)\n        }\n        if (!chainChanged) {\n          chainChanged = this.onChainChanged.bind(this)\n          provider.on('chainChanged', chainChanged)\n        }\n        if (!disconnect) {\n          disconnect = this.onDisconnect.bind(this)\n          provider.on('disconnect', disconnect)\n        }\n        if (!sessionDelete) {\n          sessionDelete = this.onSessionDelete.bind(this)\n          provider.on('session_delete', sessionDelete)\n        }\n\n        return {\n          accounts: (withCapabilities\n            ? accounts.map((address) => ({ address, capabilities: {} }))\n            : accounts) as never,\n          chainId: currentChainId,\n        }\n      } catch (error) {\n        if (\n          /(user rejected|connection request reset)/i.test(\n            (error as ProviderRpcError)?.message,\n          )\n        ) {\n          throw new UserRejectedRequestError(error as Error)\n        }\n        throw error\n      }\n    },\n    async disconnect() {\n      const provider = await this.getProvider()\n      try {\n        await provider?.disconnect()\n      } catch (error) {\n        if (!/No matching key/i.test((error as Error).message)) throw error\n      } finally {\n        if (chainChanged) {\n          provider?.removeListener('chainChanged', chainChanged)\n          chainChanged = undefined\n        }\n        if (disconnect) {\n          provider?.removeListener('disconnect', disconnect)\n          disconnect = undefined\n        }\n        if (!connect) {\n          connect = this.onConnect.bind(this)\n          provider?.on('connect', connect)\n        }\n        if (accountsChanged) {\n          provider?.removeListener('accountsChanged', accountsChanged)\n          accountsChanged = undefined\n        }\n        if (sessionDelete) {\n          provider?.removeListener('session_delete', sessionDelete)\n          sessionDelete = undefined\n        }\n\n        this.setRequestedChainsIds([])\n      }\n    },\n    async getAccounts() {\n      const provider = await this.getProvider()\n      return provider.accounts.map((x) => getAddress(x))\n    },\n    async getProvider({ chainId } = {}) {\n      async function initProvider() {\n        const optionalChains = config.chains.map((x) => x.id) as [number]\n        if (!optionalChains.length) return\n        const { EthereumProvider } = await (() => {\n          // safe webpack optional peer dependency dynamic import\n          try {\n            return import('@walletconnect/ethereum-provider')\n          } catch {\n            throw new Error(\n              'dependency \"@walletconnect/ethereum-provider\" not found',\n            )\n          }\n        })()\n        return await EthereumProvider.init({\n          ...parameters,\n          disableProviderPing: true,\n          optionalChains,\n          projectId: parameters.projectId,\n          rpcMap: Object.fromEntries(\n            config.chains.map((chain) => {\n              const [url] = extractRpcUrls({\n                chain,\n                transports: config.transports,\n              })\n              return [chain.id, url]\n            }),\n          ),\n          showQrModal: parameters.showQrModal ?? true,\n        })\n      }\n\n      if (!provider_) {\n        if (!providerPromise) providerPromise = initProvider()\n        provider_ = await providerPromise\n        provider_?.events.setMaxListeners(Number.POSITIVE_INFINITY)\n      }\n      if (chainId) await this.switchChain?.({ chainId })\n      return provider_!\n    },\n    async getChainId() {\n      const provider = await this.getProvider()\n      return provider.chainId\n    },\n    async isAuthorized() {\n      try {\n        const [accounts, provider] = await Promise.all([\n          this.getAccounts(),\n          this.getProvider(),\n        ])\n\n        // If an account does not exist on the session, then the connector is unauthorized.\n        if (!accounts.length) return false\n\n        // If the chains are stale on the session, then the connector is unauthorized.\n        const isChainsStale = await this.isChainsStale()\n        if (isChainsStale && provider.session) {\n          await provider.disconnect().catch(() => {})\n          return false\n        }\n        return true\n      } catch {\n        return false\n      }\n    },\n    async switchChain({ addEthereumChainParameter, chainId }) {\n      const provider = await this.getProvider()\n      if (!provider) throw new ProviderNotFoundError()\n\n      const chain = config.chains.find((x) => x.id === chainId)\n      if (!chain) throw new SwitchChainError(new ChainNotConfiguredError())\n\n      try {\n        await Promise.all([\n          new Promise<void>((resolve) => {\n            const listener = ({\n              chainId: currentChainId,\n            }: {\n              chainId?: number | undefined\n            }) => {\n              if (currentChainId === chainId) {\n                config.emitter.off('change', listener)\n                resolve()\n              }\n            }\n            config.emitter.on('change', listener)\n          }),\n          provider.request({\n            method: 'wallet_switchEthereumChain',\n            params: [{ chainId: numberToHex(chainId) }],\n          }),\n        ])\n\n        const requestedChains = await this.getRequestedChainsIds()\n        this.setRequestedChainsIds([...requestedChains, chainId])\n\n        return chain\n      } catch (err) {\n        const error = err as RpcError\n\n        if (/(user rejected)/i.test(error.message))\n          throw new UserRejectedRequestError(error)\n\n        // Indicates chain is not added to provider\n        try {\n          let blockExplorerUrls: string[] | undefined\n          if (addEthereumChainParameter?.blockExplorerUrls)\n            blockExplorerUrls = addEthereumChainParameter.blockExplorerUrls\n          else\n            blockExplorerUrls = chain.blockExplorers?.default.url\n              ? [chain.blockExplorers?.default.url]\n              : []\n\n          let rpcUrls: readonly string[]\n          if (addEthereumChainParameter?.rpcUrls?.length)\n            rpcUrls = addEthereumChainParameter.rpcUrls\n          else rpcUrls = [...chain.rpcUrls.default.http]\n\n          const addEthereumChain = {\n            blockExplorerUrls,\n            chainId: numberToHex(chainId),\n            chainName: addEthereumChainParameter?.chainName ?? chain.name,\n            iconUrls: addEthereumChainParameter?.iconUrls,\n            nativeCurrency:\n              addEthereumChainParameter?.nativeCurrency ?? chain.nativeCurrency,\n            rpcUrls,\n          } satisfies AddEthereumChainParameter\n\n          await provider.request({\n            method: 'wallet_addEthereumChain',\n            params: [addEthereumChain],\n          })\n\n          const requestedChains = await this.getRequestedChainsIds()\n          this.setRequestedChainsIds([...requestedChains, chainId])\n          return chain\n        } catch (error) {\n          throw new UserRejectedRequestError(error as Error)\n        }\n      }\n    },\n    onAccountsChanged(accounts) {\n      if (accounts.length === 0) this.onDisconnect()\n      else\n        config.emitter.emit('change', {\n          accounts: accounts.map((x) => getAddress(x)),\n        })\n    },\n    onChainChanged(chain) {\n      const chainId = Number(chain)\n      config.emitter.emit('change', { chainId })\n    },\n    async onConnect(connectInfo) {\n      const chainId = Number(connectInfo.chainId)\n      const accounts = await this.getAccounts()\n      config.emitter.emit('connect', { accounts, chainId })\n    },\n    async onDisconnect(_error) {\n      this.setRequestedChainsIds([])\n      config.emitter.emit('disconnect')\n\n      const provider = await this.getProvider()\n      if (accountsChanged) {\n        provider.removeListener('accountsChanged', accountsChanged)\n        accountsChanged = undefined\n      }\n      if (chainChanged) {\n        provider.removeListener('chainChanged', chainChanged)\n        chainChanged = undefined\n      }\n      if (disconnect) {\n        provider.removeListener('disconnect', disconnect)\n        disconnect = undefined\n      }\n      if (sessionDelete) {\n        provider.removeListener('session_delete', sessionDelete)\n        sessionDelete = undefined\n      }\n      if (!connect) {\n        connect = this.onConnect.bind(this)\n        provider.on('connect', connect)\n      }\n    },\n    onDisplayUri(uri) {\n      config.emitter.emit('message', { type: 'display_uri', data: uri })\n    },\n    onSessionDelete() {\n      this.onDisconnect()\n    },\n    getNamespaceChainsIds() {\n      if (!provider_) return []\n      const chainIds = provider_.session?.namespaces[NAMESPACE]?.accounts?.map(\n        (account) => Number.parseInt(account.split(':')[1] || '', 10),\n      )\n      return chainIds ?? []\n    },\n    async getRequestedChainsIds() {\n      return (\n        (await config.storage?.getItem(this.requestedChainsStorageKey)) ?? []\n      )\n    },\n    /**\n     * Checks if the target chains match the chains that were\n     * initially requested by the connector for the WalletConnect session.\n     * If there is a mismatch, this means that the chains on the connector\n     * are considered stale, and need to be revalidated at a later point (via\n     * connection).\n     *\n     * There may be a scenario where a dapp adds a chain to the\n     * connector later on, however, this chain will not have been approved or rejected\n     * by the wallet. In this case, the chain is considered stale.\n     */\n    async isChainsStale() {\n      if (!isNewChainsStale) return false\n\n      const connectorChains = config.chains.map((x) => x.id)\n      const namespaceChains = this.getNamespaceChainsIds()\n      if (\n        namespaceChains.length &&\n        !namespaceChains.some((id) => connectorChains.includes(id))\n      )\n        return false\n\n      const requestedChains = await this.getRequestedChainsIds()\n      return !connectorChains.every((id) => requestedChains.includes(id))\n    },\n    async setRequestedChainsIds(chains) {\n      await config.storage?.setItem(this.requestedChainsStorageKey, chains)\n    },\n    get requestedChainsStorageKey() {\n      return `${this.id}.requestedChains` as Properties['requestedChainsStorageKey']\n    },\n  }))\n}\n"
  },
  {
    "path": "packages/connectors/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"include\": [\"src/**/*.ts\"],\n  \"exclude\": [\"src/**/*.test.ts\", \"src/**/*.test-d.ts\"],\n  \"compilerOptions\": {\n    \"sourceMap\": true\n  }\n}\n"
  },
  {
    "path": "packages/connectors/tsconfig.json",
    "content": "{\n  \"extends\": \"./tsconfig.build.json\",\n  \"include\": [\"src/**/*.ts\"],\n  \"exclude\": []\n}\n"
  },
  {
    "path": "packages/core/CHANGELOG.md",
    "content": "# @wagmi/core\n\n## 3.4.0\n\n### Minor Changes\n\n- Added `signTransaction` action ([#4995](https://github.com/wevm/wagmi/pull/4995))\n\n## 3.3.4\n\n### Patch Changes\n\n- Added credential fast path to `webAuthn` connector — pass `capabilities.credential` directly to skip the WebAuthn ceremony when the credential is already known. ([#5005](https://github.com/wevm/wagmi/pull/5005))\n\n## 3.3.3\n\n### Patch Changes\n\n- Added ability to sign arbitrary `hash` on `webAuthn#connect`. ([#4994](https://github.com/wevm/wagmi/pull/4994))\n\n## 3.3.2\n\n### Patch Changes\n\n- Updated internal exports ([`68e17db`](https://github.com/wevm/wagmi/commit/68e17db7ff84982db8f52f54e6f047c5efab62ab))\n\n## 3.3.1\n\n### Patch Changes\n\n- Fixed \"illegal invocation\" error when signing up with passkeys while using password manager browser extensions ([#4968](https://github.com/wevm/wagmi/pull/4968))\n\n## 3.3.0\n\n### Minor Changes\n\n- Added `getBlobBaseFee` and `writeContractSync` actions. ([`dfe7904`](https://github.com/wevm/wagmi/commit/dfe790426d5ac24d55eacdf8d0193292de801911))\n\n- Added `getContractEvents` action. ([#4905](https://github.com/wevm/wagmi/pull/4905))\n\n### Patch Changes\n\n- Fixed `eth_accounts` to return `mock#accounts` parameter when provided. ([#4920](https://github.com/wevm/wagmi/pull/4920))\n\n- Added explicit return type to mutation options. ([#4964](https://github.com/wevm/wagmi/pull/4964))\n\n- Fixed `readContractsQueryKey` using passed `chainId` when all contracts specifiy `chainId` ([`5978cc5`](https://github.com/wevm/wagmi/commit/5978cc508ac837be88ed84c15ea5aa805f59005a))\n\n- **`wagmi/tempo`:** Propagated `rpId` to `Account.fromWebAuthnP256` in webAuthn connector. ([#4963](https://github.com/wevm/wagmi/pull/4963))\n\n## 3.2.3\n\n### Patch Changes\n\n- **wagmi/tempo:** Fixed access key lookup to use `account` address instead of `accessKey` address in `webAuthn` connector. ([#4953](https://github.com/wevm/wagmi/pull/4953))\n\n- Propagated `chain` to Viem's `sendTransactiion` to preserve chain-specific configuration. ([#4953](https://github.com/wevm/wagmi/pull/4953))\n\n- Fixed serialization of credentials in `KeyManager.http`. ([#4951](https://github.com/wevm/wagmi/pull/4951))\n\n## 3.2.2\n\n### Patch Changes\n\n- Updated query internals. ([`4fefa57`](https://github.com/wevm/wagmi/commit/4fefa576014820b454344b579282ddecde5c7994))\n\n## 3.2.1\n\n### Patch Changes\n\n- `wagmi/tempo`: Fixed issue where `webAuthn` connector was not adhering to chain-specific `prepareTransactionRequest` phases. ([#4939](https://github.com/wevm/wagmi/pull/4939))\n\n## 3.2.0\n\n### Minor Changes\n\n- Updated to `viem@2.44.0` with Tempo Moderato support. ([#4940](https://github.com/wevm/wagmi/pull/4940))\n\n  **Breaking Changes (Tempo)**\n\n  - Renamed `reward.start` → `reward.distribute` (no longer supports streaming)\n  - Renamed `reward.startSync` → `reward.distributeSync`\n  - Renamed `reward.getTotalPerSecond` → `reward.getGlobalRewardPerToken`\n  - Renamed `reward.watchRewardScheduled` → `reward.watchRewardDistributed`\n  - Removed `nonce.getNonceKeyCount`\n  - Removed `nonce.watchActiveKeyCountChanged`\n  - Removed `amm.watchFeeSwap` (FeeSwap event no longer emitted by protocol)\n\n  **New Features (Tempo)**\n\n  - Added `dex.cancelStale` action to cancel stale orders from restricted makers\n  - Added `dex.cancelStaleSync` action\n  - Added `salt` parameter to `token.create`\n\n## 3.1.0\n\n### Minor Changes\n\n- Added first-class support and extension for [Tempo](https://docs.tempo.xyz) via `/tempo` entrypoint. ([#4922](https://github.com/wevm/wagmi/pull/4922))\n\n## 3.0.2\n\n### Patch Changes\n\n- Fixed `config.connectors` type inference ([#4923](https://github.com/wevm/wagmi/pull/4923))\n\n## 3.0.1\n\n### Patch Changes\n\n- Fixed `readContract` return type inference for ABI function overloads. ([`058c8c1`](https://github.com/wevm/wagmi/commit/058c8c18459a69a4aa2141e34640273a06a819f4))\n\n## 3.0.0\n\n### Major Changes\n\n- 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))\n\n  #### baseAccount\n\n  [`baseAccount`](https://wagmi.sh/core/api/connectors/baseAccount) requires `@base-org/account`\n\n  ```\n  pnpm add @base-org/account@~2.4.0\n  ```\n\n  #### coinbaseWallet\n\n  [`coinbaseWallet`](https://wagmi.sh/core/api/connectors/coinbaseWallet) requires `@coinbase/wallet-sdk`\n\n  ```\n  pnpm add @coinbase/wallet-sdk@~4.3.6\n  ```\n\n  #### gemini\n\n  [`gemini`](https://wagmi.sh/core/api/connectors/gemini) requires `@gemini-wallet/core`\n\n  ```\n  pnpm add @gemini-wallet/core@~0.3.1\n  ```\n\n  #### metaMask\n\n  [`metaMask`](https://wagmi.sh/core/api/connectors/metaMask) requires `@metamask/sdk`\n\n  ```\n  pnpm add @metamask/sdk@~0.33.1\n  ```\n\n  #### porto\n\n  [`porto`](https://wagmi.sh/core/api/connectors/porto) requires `porto`\n\n  ```\n  pnpm add porto@~0.2.35\n  ```\n\n  #### safe\n\n  [`safe`](https://wagmi.sh/core/api/connectors/safe) requires `@safe-global/safe-apps-provider` and `@safe-global/safe-apps-sdk`\n\n  ```\n  pnpm add @safe-global/safe-apps-provider@~0.18.6 @safe-global/safe-apps-sdk@~9.1.0\n  ```\n\n  #### walletConnect\n\n  [`walletConnect`](https://wagmi.sh/core/api/connectors/walletConnect) requires `walletconnect/ethereum-provider`\n\n  ```\n  pnpm add @walletconnect/ethereum-provider@~2.21.1\n  ```\n\n## 2.22.1\n\n### Patch Changes\n\n- Fixed passing `account` in `waitForTransactionReceipt` for reverted transaction. ([#4832](https://github.com/wevm/wagmi/pull/4832))\n\n## 2.22.0\n\n### Minor Changes\n\n- Added `sendTransactionSync` and `sendCallsSync` Actions. ([#4823](https://github.com/wevm/wagmi/pull/4823))\n\n## 2.21.2\n\n### Patch Changes\n\n- Added `assertChainId` parameter to `getConnectorClient`. ([`866aeb0`](https://github.com/wevm/wagmi/commit/866aeb0e6361ef9114246e50149c1077bc05bf10))\n\n## 2.21.1\n\n### Patch Changes\n\n- Fixed `getConnectors` comparison ([#4792](https://github.com/wevm/wagmi/pull/4792))\n\n## 2.21.0\n\n### Minor Changes\n\n- [#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.\n\n## 2.20.3\n\n### Patch Changes\n\n- [#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\n\n## 2.20.2\n\n### Patch Changes\n\n- [#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.\n\n## 2.20.1\n\n### Patch Changes\n\n- [#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.\n\n## 2.20.0\n\n### Minor Changes\n\n- [#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.\n\n## 2.19.0\n\n### Minor Changes\n\n- [#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`\n\n## 2.18.1\n\n### Patch Changes\n\n- [#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\n\n## 2.18.0\n\n### Minor Changes\n\n- [#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.\n\n## 2.17.3\n\n### Patch Changes\n\n- [#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\n\n## 2.17.2\n\n### Patch Changes\n\n- [`29297a48af72b537173d948ccd2fe37d39914c66`](https://github.com/wevm/wagmi/commit/29297a48af72b537173d948ccd2fe37d39914c66) Thanks [@jxom](https://github.com/jxom)! - Fixed `sendCalls` generics.\n\n- [`07370106d5fb6b8fe300992d93abf25b3d0eaf57`](https://github.com/wevm/wagmi/commit/07370106d5fb6b8fe300992d93abf25b3d0eaf57) Thanks [@jxom](https://github.com/jxom)! - Fixed propagation of `waitForCallsStatus` parameters.\n\n## 2.17.1\n\n### Patch Changes\n\n- [#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`.\n\n## 2.17.0\n\n### Minor Changes\n\n- [#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.\n\n## 2.16.7\n\n### Patch Changes\n\n- [`a4bd0623eed28e3761a27295831a60ad835f0ee0`](https://github.com/wevm/wagmi/commit/a4bd0623eed28e3761a27295831a60ad835f0ee0) Thanks [@jxom](https://github.com/jxom)! - **Experimental (EIP-5792):** Updated `id` parameter to be optional on `useWaitForCallsStatus`.\n\n## 2.16.6\n\n### Patch Changes\n\n- [#4586](https://github.com/wevm/wagmi/pull/4586) [`edf47477b2f6385a1c3ae01d36a8498c47f30a0b`](https://github.com/wevm/wagmi/commit/edf47477b2f6385a1c3ae01d36a8498c47f30a0b) Thanks [@jxom](https://github.com/jxom)! - **Experimental (EIP-5792):** Added `waitForCallsStatus` + `useWaitForCallsStatus`.\n\n## 2.16.5\n\n### Patch Changes\n\n- [`d0c9a86921a4e939373cc6e763284e53f2a2e93c`](https://github.com/wevm/wagmi/commit/d0c9a86921a4e939373cc6e763284e53f2a2e93c) Thanks [@jxom](https://github.com/jxom)! - **Experimental (ERC-5792)**: Added support for `account: null` in `sendCalls` to cater for sending calls without a connected account (account will be filled by the wallet).\n\n## 2.16.4\n\n### Patch Changes\n\n- [`507f864d91238bfd423d0e36d3619eb9f6e52eec`](https://github.com/wevm/wagmi/commit/507f864d91238bfd423d0e36d3619eb9f6e52eec) Thanks [@jxom](https://github.com/jxom)! - Updated `@coinbase/wallet-sdk`.\n\n## 2.16.3\n\n### Patch Changes\n\n- [#4480](https://github.com/wevm/wagmi/pull/4480) [`384a1d91597622eb59e1c05dc13ce25017c5b6d8`](https://github.com/wevm/wagmi/commit/384a1d91597622eb59e1c05dc13ce25017c5b6d8) Thanks [@RodeRickIsWatching](https://github.com/RodeRickIsWatching)! - Fixed invocation of default storage.\n\n## 2.16.2\n\n### Patch Changes\n\n- [`012907032b532a438fce48f407470250cbc8f0c6`](https://github.com/wevm/wagmi/commit/012907032b532a438fce48f407470250cbc8f0c6) Thanks [@jxom](https://github.com/jxom)! - Fixed assignment in `getDefaultStorage`.\n\n## 2.16.1\n\n### Patch Changes\n\n- [#4472](https://github.com/wevm/wagmi/pull/4472) [`3892ebd21c06beef4b28ece4e70d2a38807bce6f`](https://github.com/wevm/wagmi/commit/3892ebd21c06beef4b28ece4e70d2a38807bce6f) Thanks [@tmm](https://github.com/tmm)! - Added handling to default storage for `setItem` errors, like `QuotaExceededError`, `SecurityError`, etc.\n\n## 2.16.0\n\n### Minor Changes\n\n- [#4453](https://github.com/wevm/wagmi/pull/4453) [`070e48480194c8d7f45bda1d7dd1346e6f5d7227`](https://github.com/wevm/wagmi/commit/070e48480194c8d7f45bda1d7dd1346e6f5d7227) Thanks [@tmm](https://github.com/tmm)! - Added narrowing to `config.connectors`.\n\n### Patch Changes\n\n- [`afea6b67822a7a2b96901ec851441d27ee0f7a52`](https://github.com/wevm/wagmi/commit/afea6b67822a7a2b96901ec851441d27ee0f7a52) Thanks [@tmm](https://github.com/tmm)! - Passed through parameters to `connector.connect` in `connect` action.\n\n## 2.15.2\n\n### Patch Changes\n\n- [#4433](https://github.com/wevm/wagmi/pull/4433) [`06e186cd679b27fe195309110e766fcf46d4efbc`](https://github.com/wevm/wagmi/commit/06e186cd679b27fe195309110e766fcf46d4efbc) Thanks [@Aerilym](https://github.com/Aerilym)! - Bumped Metamask SDK version to `0.31.1`.\n\n## 2.15.1\n\n### Patch Changes\n\n- [`b8bbb409f4934538e3dd6cac5aaf7346292d0693`](https://github.com/wevm/wagmi/commit/b8bbb409f4934538e3dd6cac5aaf7346292d0693) Thanks [@jxom](https://github.com/jxom)! - Fixed issue where `null` gas would accidentally pass through.\n\n## 2.15.0\n\n### Minor Changes\n\n- [#4417](https://github.com/wevm/wagmi/pull/4417) [`42e65ea4fea99c639817088bba915e0933d17141`](https://github.com/wevm/wagmi/commit/42e65ea4fea99c639817088bba915e0933d17141) Thanks [@jxom](https://github.com/jxom)! - Removed simulation in `writeContract` & `sendTransaction`.\n\n## 2.14.6\n\n### Patch Changes\n\n- [#4406](https://github.com/wevm/wagmi/pull/4406) [`a13aa8d7c38eb3cc8171a02d6302e6d12cf6bcb3`](https://github.com/wevm/wagmi/commit/a13aa8d7c38eb3cc8171a02d6302e6d12cf6bcb3) Thanks [@tmm](https://github.com/tmm)! - Added support for multiple connector `rdns` entries.\n\n## 2.14.5\n\n### Patch Changes\n\n- [#4400](https://github.com/wevm/wagmi/pull/4400) [`6b9bbacdc7bffd44fc2165362a5e65fd434e7646`](https://github.com/wevm/wagmi/commit/6b9bbacdc7bffd44fc2165362a5e65fd434e7646) Thanks [@AzzouQ](https://github.com/AzzouQ)! - Fixed `createWatchContractEvent` internal wiring, where `eventName` was incorrectly `functionName`.\n\n## 2.14.4\n\n### Patch Changes\n\n- [#4311](https://github.com/wevm/wagmi/pull/4311) [`e08681c81fbdf475213e2d0f4c5517d0abf4e743`](https://github.com/wevm/wagmi/commit/e08681c81fbdf475213e2d0f4c5517d0abf4e743) Thanks [@chybisov](https://github.com/chybisov)! - Fixed `injected` connector race condition after calling `'wallet_addEthereumChain'` in `switchChain`.\n\n## 2.14.3\n\n### Patch Changes\n\n- [`cb7dd2ebb871d0be8f1a11a8cd8ce592cd74b7c7`](https://github.com/wevm/wagmi/commit/cb7dd2ebb871d0be8f1a11a8cd8ce592cd74b7c7) Thanks [@tmm](https://github.com/tmm)! - Removed unnecessary internal deep equal check in `structuralSharing`.\n\n## 2.14.2\n\n### Patch Changes\n\n- [#4339](https://github.com/wevm/wagmi/pull/4339) [`d0d0963bb5904a15cf0355862d62dd141ce0c31c`](https://github.com/wevm/wagmi/commit/d0d0963bb5904a15cf0355862d62dd141ce0c31c) Thanks [@AndriyAntonenko](https://github.com/AndriyAntonenko)! - Fixed bug in `waitForTransactionReceipt`, where transaction data wasn't passed to `'eth_call'` method as part of getting the revert reason.\n\n- [`ecac0ba36243d94c9199d0bd21937104c835d9a0`](https://github.com/wevm/wagmi/commit/ecac0ba36243d94c9199d0bd21937104c835d9a0) Thanks [@tmm](https://github.com/tmm)! - Fixed `getBalance` symbol error handling.\n\n## 2.14.1\n\n### Patch Changes\n\n- [`052e72e1f8c1c14fcbdce04a9f8fa7ec28d83702`](https://github.com/wevm/wagmi/commit/052e72e1f8c1c14fcbdce04a9f8fa7ec28d83702) Thanks [@tmm](https://github.com/tmm)! - Added `defaultConnected` feature to `mock` connector.\n\n- [#4349](https://github.com/wevm/wagmi/pull/4349) [`b250fc21ee577b2a75c5a34ff684f62fb4ad771a`](https://github.com/wevm/wagmi/commit/b250fc21ee577b2a75c5a34ff684f62fb4ad771a) Thanks [@tmm](https://github.com/tmm)! - Bumped internal deps.\n\n## 2.14.0\n\n### Minor Changes\n\n- [#4343](https://github.com/wevm/wagmi/pull/4343) [`f43e074f473820b208a6295d7c97f847332f1a1d`](https://github.com/wevm/wagmi/commit/f43e074f473820b208a6295d7c97f847332f1a1d) Thanks [@tmm](https://github.com/tmm)! - Added `rdns` property to connector interface. This is used to filter out duplicate [EIP-6963](https://eips.ethereum.org/EIPS/eip-6963) injected providers when [`createConfig#multiInjectedProviderDiscovery`](https://wagmi.sh/core/api/createConfig#multiinjectedproviderdiscovery) is enabled and `createConfig#connectors` already matches EIP-6963 providers' `rdns` property.\n\n## 2.13.9\n\n### Patch Changes\n\n- [#4336](https://github.com/wevm/wagmi/pull/4336) [`c05caabc20c3ced9682cfc7ba1f3f7dcfece0703`](https://github.com/wevm/wagmi/commit/c05caabc20c3ced9682cfc7ba1f3f7dcfece0703) Thanks [@EdouardBougon](https://github.com/EdouardBougon)! - Added deprecation notice to `injected` target flags.\n\n## 2.13.8\n\n### Patch Changes\n\n- [#4207](https://github.com/wevm/wagmi/pull/4207) [`56f2482508f2ba71bd6b0295c70c6abca7101e57`](https://github.com/wevm/wagmi/commit/56f2482508f2ba71bd6b0295c70c6abca7101e57) Thanks [@Smert](https://github.com/Smert)! - Updated chain switch listener for `injected` and `metaMask` to be more robust.\n\n## 2.13.7\n\n### Patch Changes\n\n- [`be75c2d4ef636d7362420ab0a106bfdf63f5d1e6`](https://github.com/wevm/wagmi/commit/be75c2d4ef636d7362420ab0a106bfdf63f5d1e6) Thanks [@tmm](https://github.com/tmm)! - Added guard for missing `provider.on` for `injected` connector.\n\n## 2.13.6\n\n### Patch Changes\n\n- [#4286](https://github.com/wevm/wagmi/pull/4286) [`edcbf5d6fbe92f639bead800502edda9e0aa39f1`](https://github.com/wevm/wagmi/commit/edcbf5d6fbe92f639bead800502edda9e0aa39f1) Thanks [@holic](https://github.com/holic)! - Removed duplicate code.\n\n## 2.13.5\n\n### Patch Changes\n\n- [#4259](https://github.com/wevm/wagmi/pull/4259) [`f47ce8f6d263e49fdff90b8edb3190142d2657bb`](https://github.com/wevm/wagmi/commit/f47ce8f6d263e49fdff90b8edb3190142d2657bb) Thanks [@tmm](https://github.com/tmm)! - Added guard to `getConnectorClient` when reconnecting to check if connector is fully restored.\n\n## 2.13.4\n\n### Patch Changes\n\n- [`b4c8971788c70b09479946ecfa998cff2f1b3953`](https://github.com/wevm/wagmi/commit/b4c8971788c70b09479946ecfa998cff2f1b3953) Thanks [@tmm](https://github.com/tmm)! - Made `serialize` and `deserialize` types more permissive.\n\n## 2.13.3\n\n### Patch Changes\n\n- [`871dbdbfe59ac8ad01d1ec6150ea7b091b7b7de4`](https://github.com/wevm/wagmi/commit/871dbdbfe59ac8ad01d1ec6150ea7b091b7b7de4) Thanks [@tmm](https://github.com/tmm)! - Added validation to internal state for persisted `chainId`.\n\n## 2.13.2\n\n### Patch Changes\n\n- [`1b9b523fa9b9dfe839aecdf4b40caa9547d7e594`](https://github.com/wevm/wagmi/commit/1b9b523fa9b9dfe839aecdf4b40caa9547d7e594) Thanks [@tmm](https://github.com/tmm)! - Fixed built-in cookie storage `removeItem` working for all paths.\n\n## 2.13.1\n\n### Patch Changes\n\n- [`07c1227f306d0efb9421d4bb77a774f92f5fcf45`](https://github.com/wevm/wagmi/commit/07c1227f306d0efb9421d4bb77a774f92f5fcf45) Thanks [@tmm](https://github.com/tmm)! - Fixed internal `extractRpcUrls` usage with `unstable_connector`.\n\n## 2.13.0\n\n### Minor Changes\n\n- [#4162](https://github.com/wevm/wagmi/pull/4162) [`a73a7737b756886b388f120ae423e72cca53e8a0`](https://github.com/wevm/wagmi/commit/a73a7737b756886b388f120ae423e72cca53e8a0) Thanks [@jxom](https://github.com/jxom)! - Added functionality for consumer-defined RPC URLs (`config.transports`) to be propagated to the WalletConnect & MetaMask Connectors.\n\n## 2.12.2\n\n### Patch Changes\n\n- [`5bc8c8877810b2eec24a829df87dce40a51e6f20`](https://github.com/wevm/wagmi/commit/5bc8c8877810b2eec24a829df87dce40a51e6f20) Thanks [@tmm](https://github.com/tmm)! - Fixed reconnection when `status` is defined.\n\n## 2.12.1\n\n### Patch Changes\n\n- [#4146](https://github.com/wevm/wagmi/pull/4146) [`cc996e08e930c9e88cf753a1e874652059e81a3b`](https://github.com/wevm/wagmi/commit/cc996e08e930c9e88cf753a1e874652059e81a3b) Thanks [@jxom](https://github.com/jxom)! - Updated `@safe-global/safe-apps-sdk` + `@safe-global/safe-apps-provider` dependencies.\n\n## 2.12.0\n\n### Minor Changes\n\n- [#4128](https://github.com/wevm/wagmi/pull/4128) [`5581a810ef70308e99c6f8b630cd4bca59f64afc`](https://github.com/wevm/wagmi/commit/5581a810ef70308e99c6f8b630cd4bca59f64afc) Thanks [@dalechyn](https://github.com/dalechyn)! - Added `watchAsset` action.\n\n## 2.11.8\n\n### Patch Changes\n\n- [`b08013eaa9ce97c02f8a7128ea400e3da7ef74bb`](https://github.com/wevm/wagmi/commit/b08013eaa9ce97c02f8a7128ea400e3da7ef74bb) Thanks [@tmm](https://github.com/tmm)! - Fixed injected accounts ordering for `'wallet_requestPermissions'`.\n\n- [`d3814ab4b88f9f0e052b53bc3d458df87b43f01d`](https://github.com/wevm/wagmi/commit/d3814ab4b88f9f0e052b53bc3d458df87b43f01d) Thanks [@jxom](https://github.com/jxom)! - Updated `mipd` dependency.\n\n## 2.11.7\n\n### Patch Changes\n\n- [`0bb8b562ae04ecfeb2d6b2f1b980ebae31dc127e`](https://github.com/wevm/wagmi/commit/0bb8b562ae04ecfeb2d6b2f1b980ebae31dc127e) Thanks [@tmm](https://github.com/tmm)! - Improved TypeScript `'exactOptionalPropertyTypes'` support.\n\n## 2.11.6\n\n### Patch Changes\n\n- [#4060](https://github.com/wevm/wagmi/pull/4060) [`95965c1f19d480b97f2b297a077a9e607dee32ad`](https://github.com/wevm/wagmi/commit/95965c1f19d480b97f2b297a077a9e607dee32ad) Thanks [@dalechyn](https://github.com/dalechyn)! - Bumped Tanstack Query dependencies to fix typing issues between exported Wagmi query options and TanStack Query suspense query methods (due to [`direction` property in `QueryFunctionContext` being deprecated](https://github.com/TanStack/query/pull/7410)).\n\n## 2.11.5\n\n### Patch Changes\n\n- [#4079](https://github.com/wevm/wagmi/pull/4079) [`04f2b846b113f3d300d82c9fa75212f1805817c5`](https://github.com/wevm/wagmi/commit/04f2b846b113f3d300d82c9fa75212f1805817c5) Thanks [@tmm](https://github.com/tmm)! - Added revalidation for config chain ID in SSR and migration.\n\n## 2.11.4\n\n### Patch Changes\n\n- [`9e8345cd56186b997b5e56deaa2cfc69b30d15f6`](https://github.com/wevm/wagmi/commit/9e8345cd56186b997b5e56deaa2cfc69b30d15f6) Thanks [@tmm](https://github.com/tmm)! - Switched `Register` to `interface` to fix declaration merging.\n\n## 2.11.3\n\n### Patch Changes\n\n- [#4065](https://github.com/wevm/wagmi/pull/4065) [`8974e6269bb5d7bfaa90db0246bc7d13e8bff798`](https://github.com/wevm/wagmi/commit/8974e6269bb5d7bfaa90db0246bc7d13e8bff798) Thanks [@alx-khramov](https://github.com/alx-khramov)! - Added timeout to internal call of `'wallet_revokePermissions'` request during `injected#disconnect` as some wallets that do not support this method hang.\n\n## 2.11.2\n\n### Patch Changes\n\n- [#4042](https://github.com/wevm/wagmi/pull/4042) [`b4d9ef79deb554ee20fed6666a474be5e7cdd522`](https://github.com/wevm/wagmi/commit/b4d9ef79deb554ee20fed6666a474be5e7cdd522) Thanks [@tmm](https://github.com/tmm)! - Removed `injected` connector `isAuthorized` timeout.\n\n## 2.11.1\n\n### Patch Changes\n\n- [`9c862d8d63e3d692a22cef2a90782b74a9103f17`](https://github.com/wevm/wagmi/commit/9c862d8d63e3d692a22cef2a90782b74a9103f17) Thanks [@tmm](https://github.com/tmm)! - Reverted internal module loading utility.\n\n## 2.11.0\n\n### Minor Changes\n\n- [#3816](https://github.com/wevm/wagmi/pull/3816) [`06bb598a7f04c7b167f5b7ff6d46bd15886a6a14`](https://github.com/wevm/wagmi/commit/06bb598a7f04c7b167f5b7ff6d46bd15886a6a14) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Added `deployContract` action.\n\n### Patch Changes\n\n- [`24a45b269bd0214a29d6f82a84ac66ef8c3f3822`](https://github.com/wevm/wagmi/commit/24a45b269bd0214a29d6f82a84ac66ef8c3f3822) Thanks [@tmm](https://github.com/tmm)! - Added `SameSite` default to `cookieStorage`\n\n## 2.10.6\n\n### Patch Changes\n\n- [#4009](https://github.com/wevm/wagmi/pull/4009) [`f2a7cefab96691ebed8b8e45ffde071c47b58dbe`](https://github.com/wevm/wagmi/commit/f2a7cefab96691ebed8b8e45ffde071c47b58dbe) Thanks [@roninjin10](https://github.com/roninjin10)! - Marked `to` as optional for `sendTransaction`.\n\n- [#4023](https://github.com/wevm/wagmi/pull/4023) [`f0ea0b2a7fe193dadfeb49a4c8031ee451c638b5`](https://github.com/wevm/wagmi/commit/f0ea0b2a7fe193dadfeb49a4c8031ee451c638b5) Thanks [@jxom](https://github.com/jxom)! - Added chain check to `getConnectorClient` since it's possible for connection state chain ID to get out of sync with the connector (e.g. [wallet bug](https://github.com/MetaMask/metamask-extension/issues/25097)).\n\n## 2.10.5\n\n### Patch Changes\n\n- [#3970](https://github.com/wevm/wagmi/pull/3970) [`030c7c2cb380dfd67a2182f62e2aa7a6e1601898`](https://github.com/wevm/wagmi/commit/030c7c2cb380dfd67a2182f62e2aa7a6e1601898) Thanks [@nanxiaobei](https://github.com/nanxiaobei)! - Fixed `cookieStorage` not working across paths.\n\n## 2.10.4\n\n### Patch Changes\n\n- [#3984](https://github.com/wevm/wagmi/pull/3984) [`51fde8a0433b4fff357c1a8d7e08b41b4c86c968`](https://github.com/wevm/wagmi/commit/51fde8a0433b4fff357c1a8d7e08b41b4c86c968) Thanks [@tmm](https://github.com/tmm)! - Fixed `writeContract` query types for `value` property.\n\n## 2.10.3\n\n### Patch Changes\n\n- [#3962](https://github.com/wevm/wagmi/pull/3962) [`2804a8a583b1874271154898b4bae38756ef581c`](https://github.com/wevm/wagmi/commit/2804a8a583b1874271154898b4bae38756ef581c) Thanks [@tmm](https://github.com/tmm)! - Added catch to `reconnect`.\n\n## 2.10.2\n\n### Patch Changes\n\n- [#3940](https://github.com/wevm/wagmi/pull/3940) [`a5071f581dfdfb961718873643a2fc629101c72a`](https://github.com/wevm/wagmi/commit/a5071f581dfdfb961718873643a2fc629101c72a) Thanks [@jxom](https://github.com/jxom)! - Fixed usage of `metaMask` connector in Vite environments.\n\n## 2.10.1\n\n### Patch Changes\n\n- Bumped versions.\n\n## 2.10.0\n\n### Minor Changes\n\n- [#3928](https://github.com/wevm/wagmi/pull/3928) [`3117e71825f9c58a0d718f3d1686f1a191fa9cb1`](https://github.com/wevm/wagmi/commit/3117e71825f9c58a0d718f3d1686f1a191fa9cb1) Thanks [@tmm](https://github.com/tmm)! - Updated the default Coinbase SDK in `coinbaseWallet` Connector to v4.x.\n\n## 2.9.8\n\n### Patch Changes\n\n- [#3906](https://github.com/wevm/wagmi/pull/3906) [`32fcb4a31dde6b0206961d8ffe9c651f8a459c67`](https://github.com/wevm/wagmi/commit/32fcb4a31dde6b0206961d8ffe9c651f8a459c67) Thanks [@tmm](https://github.com/tmm)! - Added support for Vue.\n\n## 2.9.7\n\n### Patch Changes\n\n- [#3924](https://github.com/wevm/wagmi/pull/3924) [`1f58734f88458e0f6adb05c99f0c90f36ab286b8`](https://github.com/wevm/wagmi/commit/1f58734f88458e0f6adb05c99f0c90f36ab286b8) Thanks [@jxom](https://github.com/jxom)! - Refactored `isChainsStale` logic in `walletConnect` connector.\n\n## 2.9.6\n\n### Patch Changes\n\n- [#3917](https://github.com/wevm/wagmi/pull/3917) [`05948fdad5bb4a56b08916d45b3dec2cb1e5f55b`](https://github.com/wevm/wagmi/commit/05948fdad5bb4a56b08916d45b3dec2cb1e5f55b) Thanks [@jxom](https://github.com/jxom)! - Updated `@metamask/sdk`.\n\n## 2.9.5\n\n### Patch Changes\n\n- [`4fecbbb66d0aacd03b8c62a6455d11a33cde8f85`](https://github.com/wevm/wagmi/commit/4fecbbb66d0aacd03b8c62a6455d11a33cde8f85) Thanks [@jxom](https://github.com/jxom)! - Fixed address comparison in `getConnectorClient`.\n\n## 2.9.4\n\n### Patch Changes\n\n- [#3910](https://github.com/wevm/wagmi/pull/3910) [`e6139a97c4b8804d734b1547b5e3921ce01fbe24`](https://github.com/wevm/wagmi/commit/e6139a97c4b8804d734b1547b5e3921ce01fbe24) Thanks [@tmm](https://github.com/tmm)! - Added experimental `wallet_revokePermissions` support to `injected`.\n\n## 2.9.3\n\n### Patch Changes\n\n- [#3904](https://github.com/wevm/wagmi/pull/3904) [`addca28ebc20f1a4367c35fe9ef786decff9c87e`](https://github.com/wevm/wagmi/commit/addca28ebc20f1a4367c35fe9ef786decff9c87e) Thanks [@jxom](https://github.com/jxom)! - Updated `@walletconnect/ethereum-provider`.\n\n## 2.9.2\n\n### Patch Changes\n\n- [#3902](https://github.com/wevm/wagmi/pull/3902) [`204b7b624612405500ec098fb9e35facd3f74ca4`](https://github.com/wevm/wagmi/commit/204b7b624612405500ec098fb9e35facd3f74ca4) Thanks [@jxom](https://github.com/jxom)! - Made third-party SDK imports type-only.\n\n## 2.9.1\n\n### Patch Changes\n\n- [`cda6a5d5`](https://github.com/wevm/wagmi/commit/cda6a5d56328330fbde050b4ef40b01c58d2519a) Thanks [@jxom](https://github.com/jxom)! - Updated packages.\n\n## 2.9.0\n\n### Minor Changes\n\n- [#3878](https://github.com/wevm/wagmi/pull/3878) [`017828fc`](https://github.com/wevm/wagmi/commit/017828fc027c7a84b54ea9d627e9389f4d60d6c2) Thanks [@jxom](https://github.com/jxom)! - Added experimental EIP-5792 Actions & Hooks.\n\n## 2.8.1\n\n### Patch Changes\n\n- [#3869](https://github.com/wevm/wagmi/pull/3869) [`d4a78eb0`](https://github.com/wevm/wagmi/commit/d4a78eb07119d2e5617e52481ac7d6c6d1583ddc) Thanks [@jxom](https://github.com/jxom)! - Fixed issue where `prepareTransactionRequest` would internally call unsupported wallet RPC methods.\n\n## 2.8.0\n\n### Minor Changes\n\n- [#3868](https://github.com/wevm/wagmi/pull/3868) [`c2af20b8`](https://github.com/wevm/wagmi/commit/c2af20b88cf16970d087faaec10b463357a5836e) Thanks [@jxom](https://github.com/jxom)! - Added `supportsSimulation` property to connectors that indicates if the connector's wallet supports contract simulation.\n\n### Patch Changes\n\n- [#3858](https://github.com/wevm/wagmi/pull/3858) [`0d141f17`](https://github.com/wevm/wagmi/commit/0d141f171d6ec44bcbfc9c876565b5e2fb8af6de) Thanks [@yulafezmesi](https://github.com/yulafezmesi)! - Fixed accessing reverted reason property inside `waitForTransactionReceipt`.\n\n## 2.7.0\n\n### Minor Changes\n\n- [#3857](https://github.com/wevm/wagmi/pull/3857) [`d4274c03`](https://github.com/wevm/wagmi/commit/d4274c03a6af5f2d26d31432016ebc14950a330e) Thanks [@tmm](https://github.com/tmm)! - Added `addEthereumChainParameter` to `switchChain`-related methods.\n\n### Patch Changes\n\n- [#3849](https://github.com/wevm/wagmi/pull/3849) [`4781a405`](https://github.com/wevm/wagmi/commit/4781a4056d4ffc2c74f96a75429e9b2cd2417ad8) Thanks [@tmm](https://github.com/tmm)! - Fixed `shimDisconnect: false` behavior.\n\n- [#3859](https://github.com/wevm/wagmi/pull/3859) [`400c960b`](https://github.com/wevm/wagmi/commit/400c960b30d701c134850c695ae903a382c29b5b) Thanks [@holic](https://github.com/holic)! - Added workaround to injected connector for MetaMask bug, where chain switching does not work if target chain RPC `'net_version'` request fails.\n\n## 2.6.19\n\n### Patch Changes\n\n- [`e3c832a1`](https://github.com/wevm/wagmi/commit/e3c832a12c301f9b0ee129d877b3101d220ba8b2) Thanks [@jxom](https://github.com/jxom)! - Fixed undefined `navigator` issue in MetaMask connector.\n\n## 2.6.18\n\n### Patch Changes\n\n- [#3848](https://github.com/wevm/wagmi/pull/3848) [`dd40a41c`](https://github.com/wevm/wagmi/commit/dd40a41c526ab60a288aff2250ed8dba92a27b16) Thanks [@jxom](https://github.com/jxom)! - Updated MetaMask SDK.\n\n## 2.6.17\n\n### Patch Changes\n\n- [#3822](https://github.com/wevm/wagmi/pull/3822) [`a97bfbae`](https://github.com/wevm/wagmi/commit/a97bfbaeb615cfef04665e5e7348d85d17f960f0) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where Wagmi would not correctly rehydrate the active chain when a persisted store was being used.\n\n## 2.6.16\n\n### Patch Changes\n\n- [#3788](https://github.com/wevm/wagmi/pull/3788) [`42ad380d`](https://github.com/wevm/wagmi/commit/42ad380d9a5d8bc0f61d73612142dea9d098de5e) Thanks [@tmm](https://github.com/tmm)! - Refactored connectors to remove unnecessarily event listeners.\n\n## 2.6.15\n\n### Patch Changes\n\n- [#3782](https://github.com/wevm/wagmi/pull/3782) [`b907d5ac`](https://github.com/wevm/wagmi/commit/b907d5ac3a746bcbccc06d1fe78c5bd8f9a7d685) Thanks [@jxom](https://github.com/jxom)! - Refactored injected connector connection logic.\n\n## 2.6.14\n\n### Patch Changes\n\n- [#3777](https://github.com/wevm/wagmi/pull/3777) [`b3b54ef1`](https://github.com/wevm/wagmi/commit/b3b54ef179c5fa0d1694d38d4b808549a0550409) Thanks [@desfero](https://github.com/desfero)! - Fixed `writeContract` to forward `chainIn` when simulating contract call\n\n- [#3779](https://github.com/wevm/wagmi/pull/3779) [`3da20bb8`](https://github.com/wevm/wagmi/commit/3da20bb80e7c3efeef8227ced66ad615370fc242) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where `eth_requestAccounts` would be called upon reconnect instead of `eth_accounts`.\n\n- [`a3d1858f`](https://github.com/wevm/wagmi/commit/a3d1858fce448d2b70e36ee692ef1589b74e9d3f) Thanks [@jxom](https://github.com/jxom)! - Fixed hydration conditional in `createConfig`.\n\n## 2.6.13\n\n### Patch Changes\n\n- [`b80236dc`](https://github.com/wevm/wagmi/commit/b80236dc623095fe8f1e1d10957d7776fb6ab48b) Thanks [@jxom](https://github.com/jxom)! - Removed unneeded `uniqueBy` check on connectors state.\n\n## 2.6.12\n\n### Patch Changes\n\n- [#3763](https://github.com/wevm/wagmi/pull/3763) [`a59069e9`](https://github.com/wevm/wagmi/commit/a59069e9fab45dd606bb89a7f829fe94c51a5494) Thanks [@tmm](https://github.com/tmm)! - Fixed `getConnectorClient` internal address comparison.\n\n- [#3608](https://github.com/wevm/wagmi/pull/3608) [`0acd3132`](https://github.com/wevm/wagmi/commit/0acd31320f534993af566be5490c2978b6184f66) Thanks [@mqklin](https://github.com/mqklin)! - Disabled `wallet_requestPermissions` prompt when `shimDisconnect` is `false`.\n\n## 2.6.11\n\n### Patch Changes\n\n- [`e1ca4e63`](https://github.com/wevm/wagmi/commit/e1ca4e637ae6cec7f5902b0a2c0e0efc3b751a1d) Thanks [@tmm](https://github.com/tmm)! - Deprecated `normalizeChainId`. Use `Number` instead.\n\n## 2.6.10\n\n### Patch Changes\n\n- [`dbdca8fd`](https://github.com/wevm/wagmi/commit/dbdca8fd14b90c166222a66a373c1b33c06ce019) Thanks [@jxom](https://github.com/jxom)! - Fixed issue where duplicate connectors could be instantiated if injected after page mount.\n\n## 2.6.9\n\n### Patch Changes\n\n- [#3715](https://github.com/wevm/wagmi/pull/3715) [`d56edf4f`](https://github.com/wevm/wagmi/commit/d56edf4f27c52acc7a0f57114454b0d3e22cacd6) Thanks [@jxom](https://github.com/jxom)! - Fixed SSR hydration issues.\n\n## 2.6.8\n\n### Patch Changes\n\n- [#3643](https://github.com/wevm/wagmi/pull/3643) [`e46bcd47`](https://github.com/wevm/wagmi/commit/e46bcd4738a18da15b53f6612b614379c1985374) Thanks [@TateB](https://github.com/TateB)! - Fixed race condition arising from `reconnect`.\n\n## 2.6.7\n\n### Patch Changes\n\n- [#3642](https://github.com/wevm/wagmi/pull/3642) [`b479b5e8`](https://github.com/wevm/wagmi/commit/b479b5e8a5866cba792862f22e6352c4fb566137) Thanks [@johanneskares](https://github.com/johanneskares)! - Fixed a bug where minification caused the wrong functions to be called on the client.\n\n- [`f5648dd2`](https://github.com/wevm/wagmi/commit/f5648dd28b3576b628f57732b89287f55acbb1c1) Thanks [@jxom](https://github.com/jxom)! - Updated `prepareTransactionRequest` types for `viem@2.8.0`.\n\n- [`1c1fee6a`](https://github.com/wevm/wagmi/commit/1c1fee6ab8f01f7734ac6ce05093fa8e388beb3e) Thanks [@jxom](https://github.com/jxom)! - Updated `@walletconnect/ethereum-provider`.\n\n- [#3653](https://github.com/wevm/wagmi/pull/3653) [`88a2d744`](https://github.com/wevm/wagmi/commit/88a2d744a1315908c9e54156026df3ad2435ad44) Thanks [@tash-2s](https://github.com/tash-2s)! - Fixed error occurring when adding chains without explorers to MetaMask.\n\n## 2.6.6\n\n### Patch Changes\n\n- [#3644](https://github.com/wevm/wagmi/pull/3644) [`a91c0b64`](https://github.com/wevm/wagmi/commit/a91c0b64ba8b3e6537a560e69724eb601f26af27) Thanks [@nishuzumi](https://github.com/nishuzumi)! - Exported types\n\n## 2.6.5\n\n### Patch Changes\n\n- [#3580](https://github.com/wevm/wagmi/pull/3580) [`c677dcd2`](https://github.com/wevm/wagmi/commit/c677dcd245dccdf69289a3d66dded237b09570a2) Thanks [@tmm](https://github.com/tmm)! - Updated internals.\n\n## 2.6.4\n\n### Patch Changes\n\n- [#3571](https://github.com/wevm/wagmi/pull/3571) [`7c6618e6`](https://github.com/wevm/wagmi/commit/7c6618e6a0eb1ff39cf8f66b34d3ddc14be538fe) Thanks [@tmm](https://github.com/tmm)! - Fixed `getClient` passthrough properties from `createConfig`.\n\n- [#3558](https://github.com/wevm/wagmi/pull/3558) [`895f28e8`](https://github.com/wevm/wagmi/commit/895f28e873af7c8eda5ca85734ff67c8979fd950) Thanks [@tmm](https://github.com/tmm)! - Fixed connector warnings.\n\n## 2.6.3\n\n### Patch Changes\n\n- [#3533](https://github.com/wevm/wagmi/pull/3533) [`9c3b85dd`](https://github.com/wevm/wagmi/commit/9c3b85dd0a9a4a593e1d7e029345275735330e32) Thanks [@tmm](https://github.com/tmm)! - Fixed `account` property passthrough for actions.\n\n- [`2a72214a`](https://github.com/wevm/wagmi/commit/2a72214a2901d6b6ddd39f80238aa0bd4db670a7) Thanks [@tmm](https://github.com/tmm)! - Shimmed EIP-1193 `removeListener` for injected since some wallets do not follow spec.\n\n## 2.6.2\n\n### Patch Changes\n\n- [#3519](https://github.com/wevm/wagmi/pull/3519) [`414eb048`](https://github.com/wevm/wagmi/commit/414eb048af492caac70c0e874dfc87c30702804a) Thanks [@tmm](https://github.com/tmm)! - Fixed multicall passing through all properties to Viem method.\n\n- [#3518](https://github.com/wevm/wagmi/pull/3518) [`338e857d`](https://github.com/wevm/wagmi/commit/338e857d8cb2fe85e13d9207bef14cada1c1962d) Thanks [@tmm](https://github.com/tmm)! - Fixed internal store migration between versions.\n\n## 2.6.1\n\n### Patch Changes\n\n- [#3510](https://github.com/wevm/wagmi/pull/3510) [`660ff80d`](https://github.com/wevm/wagmi/commit/660ff80d5b046967a446eba43ee54b8359a37d0d) Thanks [@tmm](https://github.com/tmm)! - Fixed issue where connectors returning multiple addresses didn't checksum correctly.\n\n- [#3433](https://github.com/wevm/wagmi/pull/3433) [`101a7dd1`](https://github.com/wevm/wagmi/commit/101a7dd131b0cae2dc25579ecab9044290efd37b) Thanks [@tmm](https://github.com/tmm)! - Fixed `getClient` and `getPublicClient` throwing when used with unconfigured `chainId`.\n\n## 2.6.0\n\n### Minor Changes\n\n- [#3496](https://github.com/wevm/wagmi/pull/3496) [`ba7f8a75`](https://github.com/wevm/wagmi/commit/ba7f8a758efb07664c6e401b5e7e325e7c62341b) Thanks [@tmm](https://github.com/tmm)! - Updated action internals to resolve Viem Client actions.\n\n## 2.5.0\n\n### Minor Changes\n\n- [#3461](https://github.com/wevm/wagmi/pull/3461) [`ca98041d`](https://github.com/wevm/wagmi/commit/ca98041d1b39893d90246929485f4db0d1c6f9f7) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Added `getTransactionConfirmations` action.\n\n## 2.4.0\n\n### Minor Changes\n\n- [#3427](https://github.com/wevm/wagmi/pull/3427) [`370f1b4a`](https://github.com/wevm/wagmi/commit/370f1b4a3f154d181acf381c31c2e7862e22c0e4) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Added `prepareTransactionRequest` action.\n\n## 2.3.1\n\n### Patch Changes\n\n- [#3476](https://github.com/wevm/wagmi/pull/3476) [`3be5bb7b`](https://github.com/wevm/wagmi/commit/3be5bb7b0b38646e12e6da5c762ef74dff66bcc2) Thanks [@jxom](https://github.com/jxom)! - Modified persist strategy to only store \"critical\" properties that are needed before hydration.\n\n## 2.3.0\n\n### Minor Changes\n\n- [#3459](https://github.com/wevm/wagmi/pull/3459) [`d950b666`](https://github.com/wevm/wagmi/commit/d950b666b56700ca039ce16cdfdf34564991e7f5) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Added `getEnsText` action.\n\n### Patch Changes\n\n- [#3467](https://github.com/wevm/wagmi/pull/3467) [`90ef39bb`](https://github.com/wevm/wagmi/commit/90ef39bb0f4ecb3c914d317875348e35ba0f4524) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where connectors that share the same provider instance could reconnect when they have never been connected before.\n\n- [`1cfb6e5a`](https://github.com/wevm/wagmi/commit/1cfb6e5a875e707abcee00dd5739e87da05e8c90) Thanks [@jxom](https://github.com/jxom)! - Bumped listener limit on WalletConnect connector.\n\n## 2.2.1\n\n### Patch Changes\n\n- [#3447](https://github.com/wevm/wagmi/pull/3447) [`a02a26ad`](https://github.com/wevm/wagmi/commit/a02a26ad030d3afb78f744377d61b5c60b65d97a) Thanks [@tmm](https://github.com/tmm)! - Fixed account typing.\n\n- [#3443](https://github.com/wevm/wagmi/pull/3443) [`007024a6`](https://github.com/wevm/wagmi/commit/007024a684ddbecf924cdc06dd6a8854fc3d5eeb) Thanks [@jmrossy](https://github.com/jmrossy)! - Fixed invalid `chainId` parameter passed through actions to Viem.\n\n## 2.2.0\n\n### Minor Changes\n\n- [#3434](https://github.com/wevm/wagmi/pull/3434) [`00bf10a4`](https://github.com/wevm/wagmi/commit/00bf10a428b0d1c5dac35ebf25b19571e033ac26) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Added `getBytecode` and `getStorageAt` actions.\n\n- [#3416](https://github.com/wevm/wagmi/pull/3416) [`64c073f6`](https://github.com/wevm/wagmi/commit/64c073f6c2720961e2d6aff986670b73dbfab9c3) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Added `getTransactionReceipt` action.\n\n- [#3408](https://github.com/wevm/wagmi/pull/3408) [`fb6c4148`](https://github.com/wevm/wagmi/commit/fb6c4148d9e9e2fccfbe74c8f343b444dc68dec5) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Added `getProof` action.\n\n## 2.1.2\n\n### Patch Changes\n\n- [#3407](https://github.com/wevm/wagmi/pull/3407) [`e00b8205`](https://github.com/wevm/wagmi/commit/e00b82058685751637edfa9a6b2d196a12549fe7) Thanks [@jxom](https://github.com/jxom)! - Added a prelude gas estimate check to `sendTransaction`/`useSendTransaction`.\n\n## 2.1.1\n\n### Patch Changes\n\n- [#3402](https://github.com/wevm/wagmi/pull/3402) [`64b82282`](https://github.com/wevm/wagmi/commit/64b82282c1e57e77c25aa0814673780e4d11edd4) Thanks [@Songkeys](https://github.com/Songkeys)! - Fixed SSR cookie support for cookies that have special characters, e.g. `=`.\n\n- [`ec0d8b41`](https://github.com/wevm/wagmi/commit/ec0d8b4112181fefb11025e436a94a6114761d37) Thanks [@tmm](https://github.com/tmm)! - Added note to `metaMask` connector.\n\n## 2.1.0\n\n### Minor Changes\n\n- [#3387](https://github.com/wevm/wagmi/pull/3387) [`c9cd302e`](https://github.com/wevm/wagmi/commit/c9cd302e1c65c980deaee2e12567c2a8ec08b399) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Added `call` action.\n\n## 2.0.2\n\n### Patch Changes\n\n- [#3384](https://github.com/wevm/wagmi/pull/3384) [`ee868c33`](https://github.com/wevm/wagmi/commit/ee868c3385dae511230b6ddcb5627c1293cc1844) Thanks [@tmm](https://github.com/tmm)! - Fixed connectors not bubbling error when connecting with `chainId` and subsequent user rejection.\n\n## 2.0.1\n\n### Major Changes\n\n- [#3333](https://github.com/wevm/wagmi/pull/3333) [`b3a0baaa`](https://github.com/wevm/wagmi/commit/b3a0baaaee7decf750d376aab2502cd33ca4825a) Thanks [@tmm](https://github.com/tmm)! - Wagmi Core 2.0 featuring:\n\n  - Full TanStack Query support + queryKeys\n  - Connect multiple connectors\n  - Switch chains while disconnected\n  - EIP-6963 enabled\n  - Strongly typed chainId and chain properties\n  - Smaller bundle size\n  - Miscellaneous improvements and bug fixes\n\n  [Breaking Changes & Migration Guide](https://wagmi.sh/core/guides/migrate-from-v1-to-v2)\n\n## 1.4.13\n\n### Patch Changes\n\n- Updated dependencies [[`bbbbf587`](https://github.com/wevm/wagmi/commit/bbbbf587e41bae12b072b7a7c897d580fc07cd2b)]:\n  - @wagmi/connectors@3.1.11\n\n## 1.4.12\n\n### Patch Changes\n\n- [`53ca1f7e`](https://github.com/wevm/wagmi/commit/53ca1f7eb411d912e11fcce7e03bd61ed067959c) Thanks [@tmm](https://github.com/tmm)! - Removed LedgerConnector due to security vulnerability\n\n- Updated dependencies [[`53ca1f7e`](https://github.com/wevm/wagmi/commit/53ca1f7eb411d912e11fcce7e03bd61ed067959c)]:\n  - @wagmi/connectors@3.1.10\n\n## 1.4.11\n\n### Patch Changes\n\n- [#3299](https://github.com/wevm/wagmi/pull/3299) [`b02020b3`](https://github.com/wevm/wagmi/commit/b02020b3724e0228198f35817611bb063295906e) Thanks [@dasanra](https://github.com/dasanra)! - Fixed issue with [Safe SDK](https://github.com/wevm/viem/issues/579) by bumping `@safe-global/safe-apps-provider@0.18.1`\n\n- Updated dependencies [[`51eca0fb`](https://github.com/wevm/wagmi/commit/51eca0fbaea6932f31a5b8b4213f0252280053e2), [`b02020b3`](https://github.com/wevm/wagmi/commit/b02020b3724e0228198f35817611bb063295906e)]:\n  - @wagmi/connectors@3.1.9\n\n## 1.4.10\n\n### Patch Changes\n\n- Updated dependencies [[`e8f7bcbc`](https://github.com/wevm/wagmi/commit/e8f7bcbcd9c038a901c29e71769682c088efe2ac)]:\n  - @wagmi/connectors@3.1.8\n\n## 1.4.9\n\n### Patch Changes\n\n- [#3276](https://github.com/wevm/wagmi/pull/3276) [`83223a06`](https://github.com/wevm/wagmi/commit/83223a0659e2f675d897a1d3374c7af752c16abf) Thanks [@glitch-txs](https://github.com/glitch-txs)! - Removed required namespaces from WalletConnect connector\n\n- Updated dependencies [[`83223a06`](https://github.com/wevm/wagmi/commit/83223a0659e2f675d897a1d3374c7af752c16abf)]:\n  - @wagmi/connectors@3.1.7\n\n## 1.4.8\n\n### Patch Changes\n\n- Updated dependencies [[`cc7e18f2`](https://github.com/wevm/wagmi/commit/cc7e18f2e7f6b8b989f60f0b05aee70e996a9975), [`cc7e18f2`](https://github.com/wevm/wagmi/commit/cc7e18f2e7f6b8b989f60f0b05aee70e996a9975)]:\n  - @wagmi/connectors@3.1.6\n\n## 1.4.7\n\n### Patch Changes\n\n- Updated dependencies [[`a1950449`](https://github.com/wagmi-dev/wagmi/commit/a1950449127ddf72fff8ecd1fc34c3690befbb05)]:\n  - @wagmi/connectors@3.1.5\n\n## 1.4.6\n\n### Patch Changes\n\n- Updated dependencies [[`4e6ec415`](https://github.com/wagmi-dev/wagmi/commit/4e6ec4151baece94e940e227e0e3711c7f8534d9)]:\n  - @wagmi/connectors@3.1.4\n\n## 1.4.5\n\n### Patch Changes\n\n- Updated dependencies [[`e78aa337`](https://github.com/wagmi-dev/wagmi/commit/e78aa337c454f04b41a3cbd381d25270dd4a0afd)]:\n  - @wagmi/connectors@3.1.3\n\n## 1.4.4\n\n### Patch Changes\n\n- [#3125](https://github.com/wagmi-dev/wagmi/pull/3125) [`725e73fe`](https://github.com/wagmi-dev/wagmi/commit/725e73feb9143dbaa6d540bb76d2009cef29da0b) Thanks [@lukasrosario](https://github.com/lukasrosario)! - Fixed an issue where `dataSuffix` was not being passed down into viem's `simulateContract`, causing the data to be omitted from requests.\n\n## 1.4.3\n\n### Patch Changes\n\n- [#3076](https://github.com/wagmi-dev/wagmi/pull/3076) [`4c36831b`](https://github.com/wagmi-dev/wagmi/commit/4c36831b7aa44d03b5c0decf64dcd20faae28a67) Thanks [@jxom](https://github.com/jxom)! - Pass `chain` to viem `sendTransaction`/`writeContract`.\n\n- [#3006](https://github.com/wagmi-dev/wagmi/pull/3006) [`f2ddce23`](https://github.com/wagmi-dev/wagmi/commit/f2ddce23324aff0a91e066100918dac552dc3b4a) Thanks [@jxom](https://github.com/jxom)! - Changed `normalize` to a dynamic import.\n\n## 1.4.2\n\n### Patch Changes\n\n- Updated dependencies [[`3aaba328`](https://github.com/wagmi-dev/wagmi/commit/3aaba32808ddb4035ec885f96992c91078056715)]:\n  - @wagmi/connectors@3.1.2\n\n## 1.4.1\n\n### Patch Changes\n\n- Updated dependencies [[`bf831bb3`](https://github.com/wagmi-dev/wagmi/commit/bf831bb30df8037cc4312342d0fe3c045408c2fe)]:\n  - @wagmi/connectors@3.1.1\n\n## 1.4.0\n\n### Minor Changes\n\n- [#2956](https://github.com/wagmi-dev/wagmi/pull/2956) [`2abeb285`](https://github.com/wagmi-dev/wagmi/commit/2abeb285674af3e539cc2550b1f5027b1eb0c895) Thanks [@tmm](https://github.com/tmm)! - Replaced `@wagmi/chains` with `viem/chains`.\n\n### Patch Changes\n\n- Updated dependencies [[`2abeb285`](https://github.com/wagmi-dev/wagmi/commit/2abeb285674af3e539cc2550b1f5027b1eb0c895)]:\n  - @wagmi/connectors@3.1.0\n\n## 1.3.10\n\n### Patch Changes\n\n- [`557e6400`](https://github.com/wagmi-dev/wagmi/commit/557e6400b9cef3b2c5131739143956c37d7c934a) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n## 1.3.9\n\n### Patch Changes\n\n- [`247c5d11`](https://github.com/wagmi-dev/wagmi/commit/247c5d113e83acf3a6894264c00d4b125d455107) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n## 1.3.8\n\n### Patch Changes\n\n- [#2741](https://github.com/wagmi-dev/wagmi/pull/2741) [`5b1453d9`](https://github.com/wagmi-dev/wagmi/commit/5b1453d95973ed51f1c235a919fffb707eab9b70) Thanks [@jxom](https://github.com/jxom)! - Updated references\n\n## 1.3.7\n\n### Patch Changes\n\n- [#2700](https://github.com/wagmi-dev/wagmi/pull/2700) [`30118e97`](https://github.com/wagmi-dev/wagmi/commit/30118e979b1b00302e035f31f58c15d1aed911d5) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n## 1.3.6\n\n### Patch Changes\n\n- [`7ad2fdb8`](https://github.com/wagmi-dev/wagmi/commit/7ad2fdb81c7734d0c8107670800c68390e3bad99) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n## 1.3.5\n\n### Patch Changes\n\n- [`aab63fc1`](https://github.com/wagmi-dev/wagmi/commit/aab63fc1f8949004573978ecd8574fada3360758) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n## 1.3.4\n\n### Patch Changes\n\n- [`22246d98`](https://github.com/wagmi-dev/wagmi/commit/22246d9884277d28ccad6ca2d9529b96b67d47fc) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n## 1.3.3\n\n### Patch Changes\n\n- [`1946aa43`](https://github.com/wagmi-dev/wagmi/commit/1946aa43a65b684ef41b7b4c43c67bf29c13e854) Thanks [@jxom](https://github.com/jxom)! - Updated references\n\n## 1.3.2\n\n### Patch Changes\n\n- [`e86d0940`](https://github.com/wagmi-dev/wagmi/commit/e86d09409bb20b64d24e1263abcf0291314f03c7) Thanks [@jxom](https://github.com/jxom)! - Updated references\n\n## 1.3.1\n\n### Patch Changes\n\n- [`964042fa`](https://github.com/wagmi-dev/wagmi/commit/964042fa94d682977923c595820c58283fb9244a) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n## 1.3.0\n\n### Minor Changes\n\n- [#2619](https://github.com/wagmi-dev/wagmi/pull/2619) [`0d79748c`](https://github.com/wagmi-dev/wagmi/commit/0d79748cec2b6ac2410ad2c9816cc662f2b70962) Thanks [@jxom](https://github.com/jxom)! - Updated references:\n  - Updated `@safe-global/safe-apps-sdk` to `^8.0.0` (the one with `viem` support)\n\n## 1.2.2\n\n### Patch Changes\n\n- [#2611](https://github.com/wagmi-dev/wagmi/pull/2611) [`6d1ed7a1`](https://github.com/wagmi-dev/wagmi/commit/6d1ed7a156729b4df5d66fef3ae9a8b5762a2d34) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n## 1.2.1\n\n### Patch Changes\n\n- [#2589](https://github.com/wagmi-dev/wagmi/pull/2589) [`9680c347`](https://github.com/wagmi-dev/wagmi/commit/9680c347476500d28ceca20d23eeaed7931cb6e0) Thanks [@jxom](https://github.com/jxom)! - Fixed `writeContract` parameters to be compatible with `prepareWriteContract`.\n\n- [#2587](https://github.com/wagmi-dev/wagmi/pull/2587) [`cfff9994`](https://github.com/wagmi-dev/wagmi/commit/cfff999459384ac644ff7e62f53a7b787cf37507) Thanks [@jxom](https://github.com/jxom)! - Updated references\n\n## 1.2.0\n\n### Minor Changes\n\n- [#2536](https://github.com/wagmi-dev/wagmi/pull/2536) [`85e9760a`](https://github.com/wagmi-dev/wagmi/commit/85e9760a140cb169ac6236d9466b96e2105dd193) Thanks [@tmm](https://github.com/tmm)! - Changed `Address` type import from ABIType to viem.\n\n### Patch Changes\n\n- [#2539](https://github.com/wagmi-dev/wagmi/pull/2539) [`96319c64`](https://github.com/wagmi-dev/wagmi/commit/96319c640b9d07b375821c08a5c213355d8c290b) Thanks [@jxom](https://github.com/jxom)! - Updated references\n\n## 1.1.1\n\n### Patch Changes\n\n- [`02b98a9f`](https://github.com/wagmi-dev/wagmi/commit/02b98a9f9b2c503a47af4a8967e0202b5db21787) Thanks [@jxom](https://github.com/jxom)! - Updated `viem` peer dependency.\n\n- [`02b98a9f`](https://github.com/wagmi-dev/wagmi/commit/02b98a9f9b2c503a47af4a8967e0202b5db21787) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n## 1.1.0\n\n### Minor Changes\n\n- [#2482](https://github.com/wagmi-dev/wagmi/pull/2482) [`8764b54a`](https://github.com/wagmi-dev/wagmi/commit/8764b54aab68020063946112e8fe52aff650c99c) Thanks [@tmm](https://github.com/tmm)! - Bumped minimum TypeScript version to v5.0.4.\n\n### Patch Changes\n\n- [#2484](https://github.com/wagmi-dev/wagmi/pull/2484) [`3adf1f4f`](https://github.com/wagmi-dev/wagmi/commit/3adf1f4feab863cb7b5d52c81ad46f7e4eb56f09) Thanks [@jxom](https://github.com/jxom)! - Updated `abitype` to 0.8.7\n\n- [#2484](https://github.com/wagmi-dev/wagmi/pull/2484) [`3adf1f4f`](https://github.com/wagmi-dev/wagmi/commit/3adf1f4feab863cb7b5d52c81ad46f7e4eb56f09) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n## 1.0.8\n\n### Patch Changes\n\n- [#2441](https://github.com/wagmi-dev/wagmi/pull/2441) [`326edee4`](https://github.com/wagmi-dev/wagmi/commit/326edee4bc85db84a7a4e3768e33785849ab8d8e) Thanks [@tmm](https://github.com/tmm)! - Fixed internal type issue\n\n## 1.0.7\n\n### Patch Changes\n\n- [#2433](https://github.com/wagmi-dev/wagmi/pull/2433) [`54fcff5f`](https://github.com/wagmi-dev/wagmi/commit/54fcff5f02f6933bbbe045ee0c83c5a78b6bba49) Thanks [@jxom](https://github.com/jxom)! - Added ability to pass an `account` to `writeContract`/`prepareWriteContract`.\n\n## 1.0.6\n\n### Patch Changes\n\n- [`ca2e1e96`](https://github.com/wagmi-dev/wagmi/commit/ca2e1e96149b87a7dc42c9db07e1f1ad2bb02c4a) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n- [#2401](https://github.com/wagmi-dev/wagmi/pull/2401) [`0f9dc875`](https://github.com/wagmi-dev/wagmi/commit/0f9dc875e90cfdd7a2028e04b7204caf9ea313b2) Thanks [@jxom](https://github.com/jxom)! - Exposed `account` on `readContract`/`useContractRead`.\n\n## 1.0.5\n\n### Patch Changes\n\n- [`90e2b3b3`](https://github.com/wagmi-dev/wagmi/commit/90e2b3b39efe0585fe28645ac2264109be17362a) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n## 1.0.4\n\n### Patch Changes\n\n- [#2344](https://github.com/wagmi-dev/wagmi/pull/2344) [`8a725458`](https://github.com/wagmi-dev/wagmi/commit/8a72545853ae1024acd9efd18c06142e8c6c5750) Thanks [@jxom](https://github.com/jxom)! - Added gas estimation back into `prepareSendTransaction`.\n\n## 1.0.3\n\n### Patch Changes\n\n- [#2338](https://github.com/wagmi-dev/wagmi/pull/2338) [`92bfdc2c`](https://github.com/wagmi-dev/wagmi/commit/92bfdc2c744539558ba93c95f140b46ad331cee4) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where synchronous switch chain behavior (WalletConnect v2) would encounter chain id race conditions in `watchWalletClient`.\n\n## 1.0.2\n\n### Patch Changes\n\n- [#2304](https://github.com/wevm/wagmi/pull/2304) [`09a4fd38`](https://github.com/wevm/wagmi/commit/09a4fd38f44eb176797925fd85314be17b610cd4) Thanks [@jxom](https://github.com/jxom)! - Removed assert chain workaround.\n\n## 1.0.1\n\n### Patch Changes\n\n- [`ea651cd7`](https://github.com/wevm/wagmi/commit/ea651cd7fc75b7866272605467db11fd6e1d81af) Thanks [@jxom](https://github.com/jxom)! - Downgraded abitype.\n\n- Updated dependencies [[`ea651cd7`](https://github.com/wevm/wagmi/commit/ea651cd7fc75b7866272605467db11fd6e1d81af)]:\n  - @wagmi/connectors@1.0.1\n\n## 1.0.0\n\n### Major Changes\n\n- [#2235](https://github.com/wevm/wagmi/pull/2235) [`5be0655c`](https://github.com/wevm/wagmi/commit/5be0655c8e48b25d38009022461fbf611af54349) Thanks [@jxom](https://github.com/jxom)! - Released v1. Read [Migration Guide](https://next.wagmi.sh/react/migration-guide#1xx-breaking-changes).\n\n## 1.0.0-next.7\n\n### Major Changes\n\n- [#2235](https://github.com/wevm/wagmi/pull/2235) [`708b2ce2`](https://github.com/wevm/wagmi/commit/708b2ce26efa8d3d910806a97cea5171dabc65de) Thanks [@jxom](https://github.com/jxom)! - Added `config.setPublicClient` & `config.setWebSocketPublicClient`\n\n- Updated references.\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/connectors@1.0.0-next.5\n\n## 1.0.0-next.6\n\n### Major Changes\n\n- [#2235](https://github.com/wevm/wagmi/pull/2235) [`708b2ce2`](https://github.com/wevm/wagmi/commit/708b2ce26efa8d3d910806a97cea5171dabc65de) Thanks [@jxom](https://github.com/jxom)! - Added `config.setPublicClient` & `config.setWebSocketPublicClient`\n\n- Added `config.setConnectors`\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/connectors@1.0.0-next.6\n\n## 1.0.0-next.5\n\n### Major Changes\n\n- [#2235](https://github.com/wevm/wagmi/pull/2235) [`708b2ce2`](https://github.com/wevm/wagmi/commit/708b2ce26efa8d3d910806a97cea5171dabc65de) Thanks [@jxom](https://github.com/jxom)! - Added `config.setPublicClient` & `config.setWebSocketPublicClient`\n\n## 1.0.0-next.4\n\n### Major Changes\n\n- Updated viem.\n  Removed `goerli` export from main entrypoint.\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/connectors@1.0.0-next.5\n\n## 1.0.0-next.3\n\n### Major Changes\n\n- Updated references.\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/connectors@1.0.0-next.4\n\n## 1.0.0-next.2\n\n### Major Changes\n\n- **Breaking:** Renamed `createClient` to `createConfig`\n- **Breaking:** Renamed `getClient` to `getConfig`\n- **Breaking:** Removed `request` as an argument to `prepareSendTransaction` & `sendTransaction`. Arguments now belong on the root level of the Action.\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/chains@1.0.0-next.0\n  - @wagmi/connectors@1.0.0-next.3\n\n## 1.0.0-next.1\n\n### Major Changes\n\n- updated viem\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/connectors@1.0.0-next.2\n\n## 1.0.0-next.0\n\n### Major Changes\n\n- [`a7dda00c`](https://github.com/wevm/wagmi/commit/a7dda00c5b546f8b2c42b527e4d9ac1b9e9ab1fb) Thanks [@jxom](https://github.com/jxom)! - Released v1.\n\n### Patch Changes\n\n- Updated dependencies [[`a7dda00c`](https://github.com/wevm/wagmi/commit/a7dda00c5b546f8b2c42b527e4d9ac1b9e9ab1fb)]:\n  - @wagmi/connectors@1.0.0-next.1\n\n## 0.10.11\n\n### Patch Changes\n\n- [#2270](https://github.com/wevm/wagmi/pull/2270) [`6d1fa9df`](https://github.com/wevm/wagmi/commit/6d1fa9df790287729c3b33d4f01fd23c2f8153f1) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n- Updated dependencies []:\n  - @wagmi/connectors@0.3.19\n\n## 0.10.10\n\n### Patch Changes\n\n- [#2208](https://github.com/wevm/wagmi/pull/2208) [`cfc696d8`](https://github.com/wevm/wagmi/commit/cfc696d83c6f768a2e1a29c5197efeed7f1d40a1) Thanks [@bangtoven](https://github.com/bangtoven)! - Bumped references to apply coinbase wallet sdk updates\n\n- Updated dependencies []:\n  - @wagmi/connectors@0.3.16\n\n## 0.10.9\n\n### Patch Changes\n\n- [#2143](https://github.com/wevm/wagmi/pull/2143) [`26dc5326`](https://github.com/wevm/wagmi/commit/26dc53260fde1d3278018c0b20a6d48a093d9427) Thanks [@tmm](https://github.com/tmm)! - Exported Sepolia Chain.\n\n- [#2146](https://github.com/wevm/wagmi/pull/2146) [`21b6842e`](https://github.com/wevm/wagmi/commit/21b6842e8c296a0bbe71ebe0780d898abc4cf4a8) Thanks [@tmm](https://github.com/tmm)! - Bumped references\n\n- Updated dependencies []:\n  - @wagmi/connectors@0.3.12\n\n## 0.10.8\n\n### Patch Changes\n\n- [#2099](https://github.com/wevm/wagmi/pull/2099) [`f1fee5b3`](https://github.com/wevm/wagmi/commit/f1fee5b30a1bd13b5e66118bf9cdc44b0dc003a1) Thanks [@jxom](https://github.com/jxom)! - Added chains:\n\n  - `nexi`\n  - `polygonZkEvm`\n  - `xdc`\n  - `xdcTestnet`\n\n- [#2085](https://github.com/wevm/wagmi/pull/2085) [`7d64e3f5`](https://github.com/wevm/wagmi/commit/7d64e3f538a6149777bfa84ea9435769b2a7db58) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where multicall would not throw if the target chain was not configured on the wagmi client.\n\n- Updated dependencies []:\n  - @wagmi/connectors@0.3.10\n\n## 0.10.7\n\n### Patch Changes\n\n- [#2082](https://github.com/wevm/wagmi/pull/2082) [`2ccc8a25`](https://github.com/wevm/wagmi/commit/2ccc8a255e93f0a2bb7b22101656b3905ec59abd) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n- Updated dependencies []:\n  - @wagmi/connectors@0.3.10\n\n## 0.10.6\n\n### Patch Changes\n\n- [#2056](https://github.com/wevm/wagmi/pull/2056) [`944f6513`](https://github.com/wevm/wagmi/commit/944f6513adf09a6f0b3bd34f591d3bbd1f1ffd2e) Thanks [@tmm](https://github.com/tmm)! - Bumped references.\n\n- Updated dependencies []:\n  - @wagmi/connectors@0.3.8\n\n## 0.10.5\n\n### Patch Changes\n\n- [#2053](https://github.com/wevm/wagmi/pull/2053) [`665df1bf`](https://github.com/wevm/wagmi/commit/665df1bf2afccb533102069def395e19fb7194dd) Thanks [@tmm](https://github.com/tmm)! - Fixed issue where you add a new chain to MetaMask, but the switch after is rejected.\n\n- Updated dependencies []:\n  - @wagmi/connectors@0.3.7\n\n## 0.10.4\n\n### Patch Changes\n\n- [#2046](https://github.com/wevm/wagmi/pull/2046) [`90d8e9b8`](https://github.com/wevm/wagmi/commit/90d8e9b87962b72c54311649537e91a953660f9b) Thanks [@tmm](https://github.com/tmm)! - Exported internal type.\n\n- Updated dependencies []:\n  - @wagmi/connectors@0.3.6\n\n## 0.10.3\n\n### Patch Changes\n\n- [#2039](https://github.com/wevm/wagmi/pull/2039) [`bac893ab`](https://github.com/wevm/wagmi/commit/bac893ab26012d4d8741c4f80e8b8813aee26f0c) Thanks [@tmm](https://github.com/tmm)! - Updated references.\n\n- [#2043](https://github.com/wevm/wagmi/pull/2043) [`49a58320`](https://github.com/wevm/wagmi/commit/49a58320ab5f1f13bc4de25abcc028c8335e98f0) Thanks [@tmm](https://github.com/tmm)! - Removed `InjectedConnector` `shimChainChangedDisconnect` shim (no longer necessary).\n\n- Updated dependencies []:\n  - @wagmi/connectors@0.3.6\n\n## 0.10.2\n\n### Patch Changes\n\n- [#2016](https://github.com/wevm/wagmi/pull/2016) [`06bf61de`](https://github.com/wevm/wagmi/commit/06bf61dee6d2920777bd9392491e6b7aedebe7ab) Thanks [@jxom](https://github.com/jxom)! - Added chains:\n\n  - `boba`\n  - `chronos`\n  - `crossbell`\n  - `dfk`\n  - `dogechain`\n  - `flare`\n  - `flareTestnet`\n  - `klaytn`\n  - `scrollTestnet`\n  - `shardeumSphinx`\n  - `skaleCalypso`\n  - `skaleCalypsoTestnet`\n  - `skaleChaosTestnet`\n  - `skaleCryptoBlades`\n  - `skaleCryptoColosseum`\n  - `skaleEuropa`\n  - `skaleEuropaTestnet`\n  - `skaleExorde`\n  - `skaleHumanProtocol`\n  - `skaleNebula`\n  - `skaleNebulaTestnet`\n  - `skaleRazor`\n  - `skaleTitan`\n  - `skaleTitanTestnet`\n  - `songbird`\n  - `songbirdTestnet`\n  - `titan`\n  - `titanTestnet`\n  - `wanchain`\n  - `wanchainTestnet`\n\n- [#2016](https://github.com/wevm/wagmi/pull/2016) [`06bf61de`](https://github.com/wevm/wagmi/commit/06bf61dee6d2920777bd9392491e6b7aedebe7ab) Thanks [@jxom](https://github.com/jxom)! - Updated references/ submodule.\n\n- Updated dependencies []:\n  - @wagmi/connectors@0.3.4\n\n## 0.10.0\n\n### Minor Changes\n\n- [#1902](https://github.com/wevm/wagmi/pull/1902) [`0994e896`](https://github.com/wevm/wagmi/commit/0994e8966349b8811db0a5886db3831dafc99245) Thanks [@jxom](https://github.com/jxom)! - **Breaking:** Removed the `version` config option for `WalletConnectConnector`.\n\n  `WalletConnectConnector` now uses WalletConnect v2 by default. WalletConnect v1 is now `WalletConnectLegacyConnector`.\n\n  ### WalletConnect v2\n\n  ```diff\n  import { WalletConnectConnector } from 'wagmi/connectors/walletConnect'\n\n  const connector = new WalletConnectConnector({\n    options: {\n  -   version: '2',\n      projectId: 'abc',\n    },\n  })\n  ```\n\n  ### WalletConnect v1\n\n  ```diff\n  -import { WalletConnectConnector } from 'wagmi/connectors/walletConnect'\n  +import { WalletConnectConnector } from 'wagmi/connectors/walletConnectLegacy'\n\n  -const connector = new WalletConnectConnector({\n  +const connector = new WalletConnectLegacyConnector({\n    options: {\n      qrcode: true,\n    },\n  })\n  ```\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/connectors@0.3.2\n\n## 0.9.7\n\n### Patch Changes\n\n- [#1907](https://github.com/wevm/wagmi/pull/1907) [`cc4e74ee`](https://github.com/wevm/wagmi/commit/cc4e74ee19665eccb3767052dab6ab956ff4e676) Thanks [@jxom](https://github.com/jxom)! - Added the following chains to the `wagmi/chains` entrypoint:\n\n  - `baseGoerli`\n  - `harmonyOne`\n  - `polygonZkEvmTestnet`\n\n- Updated dependencies []:\n  - @wagmi/connectors@0.2.7\n\n## 0.9.6\n\n### Patch Changes\n\n- [#1882](https://github.com/wevm/wagmi/pull/1882) [`282cc1b0`](https://github.com/wevm/wagmi/commit/282cc1b02003684d582cea411b11792a59c26fd0) Thanks [@tmm](https://github.com/tmm)! - Updated references.\n\n- Updated dependencies []:\n  - @wagmi/connectors@0.2.6\n\n## 0.9.5\n\n### Patch Changes\n\n- [#1812](https://github.com/wevm/wagmi/pull/1812) [`c7fd7fbd`](https://github.com/wevm/wagmi/commit/c7fd7fbde6f6c69a3a9a4f89d948c4dfb1d22679) Thanks [@jxom](https://github.com/jxom)! - Added the following chains to the `wagmi/chains` entrypoint:\n\n  - `filecoinCalibration`\n  - `moonbaseAlpha`\n  - `moonbeam`\n  - `moonriver`\n\n- Updated dependencies []:\n  - @wagmi/connectors@0.2.5\n\n## 0.9.4\n\n### Patch Changes\n\n- [#1786](https://github.com/wevm/wagmi/pull/1786) [`b173a431`](https://github.com/wevm/wagmi/commit/b173a43165c7925a4e56ce1e0327a31917e7edc5) Thanks [@tmm](https://github.com/tmm)! - Locked ethers peer dependency version to >=5.5.1 <6\n\n- [#1787](https://github.com/wevm/wagmi/pull/1787) [`f023fd8f`](https://github.com/wevm/wagmi/commit/f023fd8f66befb78b9a4df5ca971ceaa64e37ab4) Thanks [@tmm](https://github.com/tmm)! - Added `SafeConnector`\n\n- Updated dependencies []:\n  - @wagmi/connectors@0.2.4\n\n## 0.9.3\n\n### Patch Changes\n\n- [#1773](https://github.com/wevm/wagmi/pull/1773) [`9aaf1955`](https://github.com/wevm/wagmi/commit/9aaf195514d3b5f4d085c797fc5021d42a9efb6c) Thanks [@jxom](https://github.com/jxom)! - Updated `@walletconnect/universal-provider` on `WalletConnectConnector` v2.\n  Added more signable methods to `WalletConnectConnector` v2.\n\n- [#1773](https://github.com/wevm/wagmi/pull/1773) [`9aaf1955`](https://github.com/wevm/wagmi/commit/9aaf195514d3b5f4d085c797fc5021d42a9efb6c) Thanks [@jxom](https://github.com/jxom)! - Added Telos to the `wagmi/chains` entrypoint. Thanks @donnyquixotic!\n\n- Updated dependencies []:\n  - @wagmi/connectors@0.2.3\n\n## 0.9.2\n\n### Patch Changes\n\n- [#1756](https://github.com/wevm/wagmi/pull/1756) [`31d06b8c`](https://github.com/wevm/wagmi/commit/31d06b8ce1e7af5e9d1a7ba57f1743b2dff7a53d) Thanks [@jxom](https://github.com/jxom)! - Added OKC Chain. Thanks @clark-cui!\n\n- [#1756](https://github.com/wevm/wagmi/pull/1756) [`31d06b8c`](https://github.com/wevm/wagmi/commit/31d06b8ce1e7af5e9d1a7ba57f1743b2dff7a53d) Thanks [@jxom](https://github.com/jxom)! - Fixed race condition between `switchNetwork` and mutation Actions that use `chainId` (e.g. `sendTransaction`). Thanks @DanInTheD4rk!\n\n- Updated dependencies []:\n  - @wagmi/connectors@0.2.2\n\n## 0.9.1\n\n### Patch Changes\n\n- [#1752](https://github.com/wevm/wagmi/pull/1752) [`144a0e76`](https://github.com/wevm/wagmi/commit/144a0e76ef4bb9ba0650b5ffb9c63f95329819a4) Thanks [@jxom](https://github.com/jxom)! - Improved `WalletConnectConnector` (v2) initialization & updated dependencies.\n\n- [#1752](https://github.com/wevm/wagmi/pull/1752) [`144a0e76`](https://github.com/wevm/wagmi/commit/144a0e76ef4bb9ba0650b5ffb9c63f95329819a4) Thanks [@jxom](https://github.com/jxom)! - Added the following chains to the `wagmi/chains` entrypoint:\n\n  - Aurora – thanks @salil-naik\n  - Bronos – thanks @chedetinaveen\n  - Canto – thanks @tster\n  - Celo – thanks @aaronmgdr\n\n- Updated dependencies []:\n  - @wagmi/connectors@0.2.1\n\n## 0.9.0\n\n### Minor Changes\n\n- [#1732](https://github.com/wevm/wagmi/pull/1732) [`01e21897`](https://github.com/wevm/wagmi/commit/01e2189747a5c22dc758c6d719b4145adc2a643c) Thanks [@tmm](https://github.com/tmm)! - Bumped minimum TypeScript version to typescript@>=4.9.4. TypeScript 5.0 is coming soon and has some great features we are excited to bring into wagmi. To prepare for this, update your TypeScript version to 4.9.4 or higher. There are likely no [breaking changes](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-9.html#correctness-fixes-and-breaking-changes) if you are coming from typescript@4.7.x || typescript@4.8.x.\n\n## 0.8.19\n\n### Patch Changes\n\n- [#1718](https://github.com/wevm/wagmi/pull/1718) [`e62b5ef8`](https://github.com/wevm/wagmi/commit/e62b5ef8aaa8063abb5264790768899ea35bbd31) Thanks [@tmm](https://github.com/tmm)! - Updated references\n\n## 0.8.18\n\n### Patch Changes\n\n- [#1708](https://github.com/wevm/wagmi/pull/1708) [`07fc3801`](https://github.com/wevm/wagmi/commit/07fc3801fa13c2cb5f7cf9b86ba8320b05a6a135) Thanks [@jxom](https://github.com/jxom)! - Updated `references/` submodule.\n\n## 0.8.17\n\n### Patch Changes\n\n- [#1705](https://github.com/wevm/wagmi/pull/1705) [`9ff797dc`](https://github.com/wevm/wagmi/commit/9ff797dcb979dc86b798a432b74c98598165430d) Thanks [@jxom](https://github.com/jxom)! - Added the following chains to the `@wagmi/core/chains` entrypoint:\n\n  - `crossbell` (thanks @Songkeys)\n  - `filecoin` & `filecoinHyperspace` (thanks @neil0x46dc)\n  - `gnosisChiado` (thanks @theNvN)\n  - `metis` & `metisGoerli` (thanks @CookedCookee)\n\n## 0.8.16\n\n### Patch Changes\n\n- [#1699](https://github.com/wevm/wagmi/pull/1699) [`2f1e7950`](https://github.com/wevm/wagmi/commit/2f1e7950e55550d9b50ef5ccb97cb609f4af39b1) Thanks [@tmm](https://github.com/tmm)! - Added public RPC URL property to Chain\n\n## 0.8.15\n\n### Patch Changes\n\n- [#1685](https://github.com/wevm/wagmi/pull/1685) [`917f5bc1`](https://github.com/wevm/wagmi/commit/917f5bc1fad578e35a8c6ee787e339bfdc156bab) Thanks [@jxom](https://github.com/jxom)! - Replaced qrcodemodal with web3modal for the WalletConnect v2 Connector.\n\n## 0.8.14\n\n### Patch Changes\n\n- [#1646](https://github.com/wevm/wagmi/pull/1646) [`fcdbe353`](https://github.com/wevm/wagmi/commit/fcdbe3531e6d05cda4a4a511bae1ad4c9e426d88) Thanks [@jxom](https://github.com/jxom)! - Upgraded `zustand` to v4.3.1.\n\n## 0.8.13\n\n### Patch Changes\n\n- [#1639](https://github.com/wevm/wagmi/pull/1639) [`c6869f06`](https://github.com/wevm/wagmi/commit/c6869f0604fffb197752a08256f31db77f52e746) Thanks [@jxom](https://github.com/jxom)! - Added `isRainbow` flag to `InjectedConnector`.\n\n## 0.8.12\n\n### Patch Changes\n\n- [#1636](https://github.com/wevm/wagmi/pull/1636) [`025f6771`](https://github.com/wevm/wagmi/commit/025f6771b32ff7eed22f527be81c5141ddaf9c3d) Thanks [@DanielSinclair](https://github.com/DanielSinclair)! - Added `isRainbow` flag to injected `window.ethereum` types.\n\n## 0.8.11\n\n### Patch Changes\n\n- [#1621](https://github.com/wevm/wagmi/pull/1621) [`5812b590`](https://github.com/wevm/wagmi/commit/5812b5909277bf2862cb57a31d52465b47291410) Thanks [@tmm](https://github.com/tmm)! - Bumped @wagmi/connectors\n\n## 0.8.10\n\n### Patch Changes\n\n- [#1598](https://github.com/wevm/wagmi/pull/1598) [`fc10ebe6`](https://github.com/wevm/wagmi/commit/fc10ebe659dd5f3b7a8e00581f094652280a779b) Thanks [@jxom](https://github.com/jxom)! - Fixed CJS dependency version range\n\n## 0.8.9\n\n### Patch Changes\n\n- [#1593](https://github.com/wevm/wagmi/pull/1593) [`216d555c`](https://github.com/wevm/wagmi/commit/216d555c62bd95c3c7c8f8e20f7269f6c8504610) Thanks [@jxom](https://github.com/jxom)! - Added CJS escape hatch bundle under the \"cjs\" tag.\n\n## 0.8.8\n\n### Patch Changes\n\n- [#1573](https://github.com/wevm/wagmi/pull/1573) [`ef380d9c`](https://github.com/wevm/wagmi/commit/ef380d9c6d51ae0495b9c35925d2843c75d97fd4) Thanks [@tmm](https://github.com/tmm)! - Updated internal types.\n\n## 0.8.7\n\n### Patch Changes\n\n- [#1570](https://github.com/wevm/wagmi/pull/1570) [`216f585b`](https://github.com/wevm/wagmi/commit/216f585be8a9e3a56e3243f49ccd54d655b5a6dd) Thanks [@wslyvh](https://github.com/wslyvh)! - Added `watchPendingTransactions`\n\n- [#1470](https://github.com/wevm/wagmi/pull/1470) [`3a1a6c9f`](https://github.com/wevm/wagmi/commit/3a1a6c9fe5db5c360adfd116f9a03a1238b5720c) Thanks [@jxom](https://github.com/jxom)! - The `WalletConnectConnector` now supports WalletConnect v2.\n\n  It can be enabled by setting `version` to `'2'` and supplying a [WalletConnect Cloud `projectId`](https://cloud.walletconnect.com/sign-in).\n\n## 0.8.6\n\n### Patch Changes\n\n- [#1539](https://github.com/wevm/wagmi/pull/1539) [`732da004`](https://github.com/wevm/wagmi/commit/732da0042c7e28091b2e36a484ea8239971306f5) Thanks [@0xFlicker](https://github.com/0xFlicker)! - All Providers (ie. Alchemy, Infura, Public) now use the ENS Registry address on the wagmi `Chain` object (`chain.contracts.ensRegistry`).\n\n- [#1574](https://github.com/wevm/wagmi/pull/1574) [`ecde3d10`](https://github.com/wevm/wagmi/commit/ecde3d1029ccdf90e2853ba0e9ae4f5f4ebb9c4c) Thanks [@jxom](https://github.com/jxom)! - Added the following chains:\n\n  - `iotex`\n  - `iotexTestnet`\n  - `zkSync`\n  - `zkSyncTestnet`\n\n## 0.8.5\n\n### Patch Changes\n\n- [#1542](https://github.com/wevm/wagmi/pull/1542) [`731b3b73`](https://github.com/wevm/wagmi/commit/731b3b733c6a093d1693d49de601705b7c730549) Thanks [@jxom](https://github.com/jxom)! - Added the following chains:\n\n  - `evmos`\n  - `evmosTestnet`\n  - `gnosis`\n\n- [#1542](https://github.com/wevm/wagmi/pull/1542) [`731b3b73`](https://github.com/wevm/wagmi/commit/731b3b733c6a093d1693d49de601705b7c730549) Thanks [@jxom](https://github.com/jxom)! - Updated Goerli symbol to `\"ETH\"`.\n\n- [#1542](https://github.com/wevm/wagmi/pull/1542) [`731b3b73`](https://github.com/wevm/wagmi/commit/731b3b733c6a093d1693d49de601705b7c730549) Thanks [@jxom](https://github.com/jxom)! - Updated Arbitrum Goerli RPC and Block Explorer.\n\n- [#1542](https://github.com/wevm/wagmi/pull/1542) [`731b3b73`](https://github.com/wevm/wagmi/commit/731b3b733c6a093d1693d49de601705b7c730549) Thanks [@jxom](https://github.com/jxom)! - Fixed issue where connecting to MetaMask may return with a stale address.\n\n- [#1542](https://github.com/wevm/wagmi/pull/1542) [`731b3b73`](https://github.com/wevm/wagmi/commit/731b3b733c6a093d1693d49de601705b7c730549) Thanks [@jxom](https://github.com/jxom)! - Removed ENS registry for Sepolia.\n\n## 0.8.4\n\n### Patch Changes\n\n- [#1508](https://github.com/wevm/wagmi/pull/1508) [`0b50b62f`](https://github.com/wevm/wagmi/commit/0b50b62f7389619e429509a3e337e451e823b059) Thanks [@jxom](https://github.com/jxom)! - Updated `@wagmi/chains` to `0.1.3`.\n\n- [#1504](https://github.com/wevm/wagmi/pull/1504) [`11b8b794`](https://github.com/wevm/wagmi/commit/11b8b794fbfd4a2b40f39962e2758e9fbf48cb54) Thanks [@tmm](https://github.com/tmm)! - Converted ethers custom \"ACTION_REJECTED\" error to standard RPC Error.\n\n## 0.8.3\n\n### Patch Changes\n\n- [#1431](https://github.com/wevm/wagmi/pull/1431) [`af28f8f9`](https://github.com/wevm/wagmi/commit/af28f8f9cfc227e7c391927fdb934183edb5c2dc) Thanks [@jxom](https://github.com/jxom)! - Re-export connectors from `@wagmi/connectors`\n\n- [#1431](https://github.com/wevm/wagmi/pull/1431) [`af28f8f9`](https://github.com/wevm/wagmi/commit/af28f8f9cfc227e7c391927fdb934183edb5c2dc) Thanks [@jxom](https://github.com/jxom)! - Added `LedgerConnector` connector\n\n## 0.8.2\n\n### Patch Changes\n\n- [#1442](https://github.com/wevm/wagmi/pull/1442) [`cde15289`](https://github.com/wevm/wagmi/commit/cde152899c758dea10787412b0aef669ed7202b2) Thanks [@0xproflupin](https://github.com/0xproflupin)! - Added Phantom wallet support to `InjectedConnector`\n\n- [#1448](https://github.com/wevm/wagmi/pull/1448) [`c6075f3a`](https://github.com/wevm/wagmi/commit/c6075f3a16885d850ad2656272351f9517c9f67b) Thanks [@tmm](https://github.com/tmm)! - Updated [ABIType](https://github.com/wevm/abitype) version.\n\n- [#1444](https://github.com/wevm/wagmi/pull/1444) [`310a8bc4`](https://github.com/wevm/wagmi/commit/310a8bc428ce4e7f68377f581b45dcdd64381cce) Thanks [@jxom](https://github.com/jxom)! - Assert that a `connector` exists before invoking the callback in `watchSigner`.\n\n- [#1434](https://github.com/wevm/wagmi/pull/1434) [`100e2a3b`](https://github.com/wevm/wagmi/commit/100e2a3b22f4602716554487b1d98738e053be76) Thanks [@tmm](https://github.com/tmm)! - Updated `MockConnector` `chainId` behavior to default to first chain from `chains` if not provided in `options`.\n\n## 0.8.1\n\n### Patch Changes\n\n- [#1437](https://github.com/wevm/wagmi/pull/1437) [`c34a3dc6`](https://github.com/wevm/wagmi/commit/c34a3dc6396e6473d9f0505fad88ec910f8f5275) Thanks [@jxom](https://github.com/jxom)! - Omitted `\"EIP712Domain\"` type from `signTypedData` `types` arg since ethers throws an [internal error](https://github.com/ethers-io/ethers.js/blob/c80fcddf50a9023486e9f9acb1848aba4c19f7b6/packages/hash/src.ts/typed-data.ts#L466) if you include it.\n\n- [#1445](https://github.com/wevm/wagmi/pull/1445) [`51dd53cb`](https://github.com/wevm/wagmi/commit/51dd53cba3fe0f79fa1393270b738194577ddf54) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where the wagmi client wouldn't rehydrate the store in local storage when `autoConnect` is truthy.\n\n## 0.8.0\n\n### Minor Changes\n\n- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: the shape of the `Chain` type has been modified.\n\n  #### RPC URLs\n\n  The `rpcUrls` shape has changed to include an array of URLs, and also the transport method (`http` or `webSocket`):\n\n  ```diff\n  type Chain = {\n    ...\n    rpcUrls: {\n  -   [key: string]: string\n  +   [key: string]: {\n  +     http: string[]\n  +     webSocket: string[]\n  +   }\n    }\n    ...\n  }\n  ```\n\n  Note that you will also need to ensure that usage is migrated:\n\n  ```diff\n  - const rpcUrl = mainnet.rpcUrls.alchemy\n  + const rpcUrl = mainnet.rpcUrls.alchemy.http[0]\n  ```\n\n  #### Contracts\n\n  The `multicall` and `ens` attributes have been moved into the `contracts` object:\n\n  ```diff\n  type Contract = {\n    address: Address\n    blockCreated?: number\n  }\n\n  type Chain = {\n    ...\n  - multicall: Contract\n  - ens: Contract\n  + contracts: {\n  +   multicall3: Contract\n  +   ensRegistry: Contract\n  + }\n    ...\n  }\n  ```\n\n  Note that you will also need to ensure that usage is migrated:\n\n  ```diff\n  - const multicallContract = mainnet.multicall\n  + const multicallContract = mainnet.contracts.multicall3\n  ```\n\n- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: Upgraded `@coinbase/wallet-sdk` peer dependency to `3.6.0`.\n\n  **Migration steps**: Update `@coinbase/wallet-sdk` to `^3.6.0`.\n\n- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: Removed the `wait` argument on `waitForTransaction`. Use the transaction `hash` instead.\n\n  ```diff\n  const data = await waitForTransaction({\n  - wait: transaction.wait\n  + hash: transaction.hash\n  })\n  ```\n\n- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: With the introduction of the [`@wagmi/core/chains` entrypoint](/core/chains), `@wagmi/core` no longer exports the following:\n\n  - `chain`\n  - `allChains`\n  - `defaultChains`\n  - `defaultL2Chains`\n  - `chainId`\n  - `etherscanBlockExplorers`\n  - `alchemyRpcUrls`, `infuraRpcUrls`, `publicRpcUrls`\n\n  Read below for migration steps.\n\n  #### Removed `chain`\n\n  The `chain` export has been removed. `@wagmi/core` now only exports the `mainnet` & `goerli` chains. If you need to use an alternative chain (`polygon`, `optimism`, etc), you will need to import it from the [`@wagmi/core/chains` entrypoint](/core/chains).\n\n  ```diff\n  import {\n  - chain\n    configureChains\n  } from '@wagmi/core'\n  + import { mainnet, polygon, optimism } from '@wagmi/core/chains'\n\n  const { ... } = configureChains(\n  - [chain.mainnet, chain.polygon, chain.optimism],\n  + [mainnet, polygon, optimism],\n    {\n      ...\n    }\n  )\n  ```\n\n  #### Removed `allChains`\n\n  The `allChains` export has been removed. If you need a list of all chains, you can utilize [`@wagmi/core/chains` entrypoint](/core/chains).\n\n  ```diff\n  - import { allChains } from '@wagmi/core'\n  + import * as allChains from '@wagmi/core/chains'\n\n  const { ... } = configureChains(allChains, ...)\n  ```\n\n  #### Removed `defaultChains` & `defaultL2Chains`\n\n  The `defaultChains` & `defaultL2Chains` exports have been removed. If you still need the `defaultChains` or `defaultL2Chains` exports, you can build them yourself:\n\n  ```diff\n  - import { defaultChains } from '@wagmi/core'\n  + import { mainnet, goerli } from '@wagmi/core/chains'\n\n  + const defaultChains = [mainnet, goerli]\n  ```\n\n  > The `defaultChains` export was previously populated with `mainnet` & `goerli`.\n\n  ```diff\n  - import { defaultL2Chains } from '@wagmi/core'\n  + import {\n  +   arbitrum,\n  +   arbitrumGoerli,\n  +   polygon,\n  +   polygonMumbai,\n  +   optimism,\n  +   optimismGoerli\n  + } from '@wagmi/core/chains'\n\n  + const defaultL2Chains = [\n  +  arbitrum,\n  +  arbitrumGoerli,\n  +  polygon,\n  +  polygonMumbai,\n  +  optimism\n  +  optimismGoerli\n  + ]\n  ```\n\n  > The `defaultL2Chains` export was previously populated with `arbitrum` & `optimism`.\n\n  #### Removed `chainId`\n\n  The `chainId` export has been removed. You can extract a chain ID from the chain itself.\n\n  ```diff\n  - import { chainId } from '@wagmi/core'\n  + import { mainnet, polygon, optimism } from '@wagmi/core/chains'\n\n  -const mainnetChainId = chainId.mainnet\n  -const polygonChainId = chainId.polygon\n  -const optimismChainId = chainId.optimism\n  +const mainnetChainId = mainnet.chainId\n  +const polygonChainId = polygon.chainId\n  +const optimismChainId = optimism.chainId\n  ```\n\n  #### Removed `etherscanBlockExplorers`\n\n  The `etherscanBlockExplorers` export has been removed. You can extract a block explorer from the chain itself.\n\n  ```diff\n  - import { etherscanBlockExplorers } from '@wagmi/core'\n  + import { mainnet, polygon, optimism } from '@wagmi/core/chains'\n\n  -const mainnetEtherscanBlockExplorer = etherscanBlockExplorers.mainnet\n  -const polygonEtherscanBlockExplorer = etherscanBlockExplorers.polygon\n  -const optimismEtherscanBlockExplorer = etherscanBlockExplorers.optimism\n  +const mainnetEtherscanBlockExplorer = mainnet.blockExplorer\n  +const polygonEtherscanBlockExplorer = polygon.blockExplorer\n  +const optimismEtherscanBlockExplorer = optimism.blockExplorer\n  ```\n\n  #### Removed `alchemyRpcUrls`, `infuraRpcUrls` & `publicRpcUrls`\n\n  The `alchemyRpcUrls`, `infuraRpcUrls` & `publicRpcUrls` exports have been removed. You can extract a RPC URL from the chain itself.\n\n  ```diff\n  - import { alchemyRpcUrls, infuraRpcUrls, publicRpcUrls } from '@wagmi/core'\n  + import { mainnet } from '@wagmi/core/chains'\n\n  -const mainnetAlchemyRpcUrl = alchemyRpcUrls.mainnet\n  -const mainnetInfuraRpcUrl = infuraRpcUrls.mainnet\n  -const mainnetOptimismRpcUrl = publicRpcUrls.mainnet\n  +const mainnetAlchemyRpcUrl = mainnet.rpcUrls.alchemy\n  +const mainnetInfuraRpcUrl = mainnet.rpcUrls.infura\n  +const mainnetOptimismRpcUrl = mainnet.rpcUrls.optimism\n  ```\n\n- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: Changed `waitForTransaction` behavior to throw an error if the transaction reverted.\n\n- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - Updated errors to use `cause` instead of `internal`\n\n### Patch Changes\n\n- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - `waitForTransaction` now respects repriced (sped up) transactions.\n\n- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - Export `getClient`\n\n- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - `waitForTransaction` now throws an error for cancelled or replaced transactions.\n\n## 0.7.9\n\n### Patch Changes\n\n- [#1411](https://github.com/wevm/wagmi/pull/1411) [`659be184`](https://github.com/wevm/wagmi/commit/659be1840c613ce9f7aca9ac96694c4f60da4a66) Thanks [@tmm](https://github.com/tmm)! - Fixed issue where block invalidation was not properly disabled when setting `enabled: false`.\n\n## 0.7.8\n\n### Patch Changes\n\n- [#1406](https://github.com/wevm/wagmi/pull/1406) [`4f18c450`](https://github.com/wevm/wagmi/commit/4f18c450a4d7952bfcfa6c533348ffbe55893d3c) Thanks [@tmm](https://github.com/tmm)! - Function for selecting the [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193) Ethereum Provider to target. Defaults to `() => typeof window !== 'undefined' ? window.ethereum : undefined`.\n\n  ```ts\n  import { InjectedConnector } from \"@wagmi/core/connectors/injected\";\n\n  const connector = new InjectedConnector({\n    options: {\n      name: \"My Injected Wallet\",\n      getProvider: () =>\n        typeof window !== \"undefined\" ? window.myInjectedWallet : undefined,\n    },\n  });\n  ```\n\n## 0.7.7\n\n### Patch Changes\n\n- [#1386](https://github.com/wevm/wagmi/pull/1386) [`206a2adb`](https://github.com/wevm/wagmi/commit/206a2adbb4ee5149a364543b34612050ccf78c21) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where `persister` would still use `window.localStorage` instead of the wagmi `storage`.\n\n- [#1376](https://github.com/wevm/wagmi/pull/1376) [`a70a9528`](https://github.com/wevm/wagmi/commit/a70a9528f93f4d7fea28b7652751dfef2dcacf9b) Thanks [@jxom](https://github.com/jxom)! - Fixed issue where `switchChain` on `WalletConnectConnector` would not resolve.\n\n- [#1386](https://github.com/wevm/wagmi/pull/1386) [`206a2adb`](https://github.com/wevm/wagmi/commit/206a2adbb4ee5149a364543b34612050ccf78c21) Thanks [@jxom](https://github.com/jxom)! - Added `serialize`/`deserialize` as config options to `createStorage`.\n\n- [#1392](https://github.com/wevm/wagmi/pull/1392) [`88afc849`](https://github.com/wevm/wagmi/commit/88afc84978afe9689ab7364633e4422ecd7699ea) Thanks [@tmm](https://github.com/tmm)! - Added check for active connector when connecting\n\n## 0.7.6\n\n### Patch Changes\n\n- [#1384](https://github.com/wevm/wagmi/pull/1384) [`027e88d6`](https://github.com/wevm/wagmi/commit/027e88d6e5f8d028d46ee78aec8500701e0173d9) Thanks [@tmm](https://github.com/tmm)! - Fixed issue reconnecting after disconnect with `MetaMaskConnector` in MetaMask mobile browser.\n\n## 0.7.5\n\n### Patch Changes\n\n- [`1169914a`](https://github.com/wevm/wagmi/commit/1169914a0f0ad2810ca1c536b1f1bc6c20f2c1be) Thanks [@jxom](https://github.com/jxom)! - Use `get_accounts` for `getSigner` in InjectedConnector\n\n## 0.7.4\n\n### Patch Changes\n\n- [#1309](https://github.com/wevm/wagmi/pull/1309) [`1f4a4261`](https://github.com/wevm/wagmi/commit/1f4a4261247b1d3a90e3123157bc851a35d49b9c) Thanks [@tmm](https://github.com/tmm)! - Fixed internal type\n\n## 0.7.3\n\n### Patch Changes\n\n- [#1294](https://github.com/wevm/wagmi/pull/1294) [`b2f88949`](https://github.com/wevm/wagmi/commit/b2f88949f32aabaf13f318472648cd51a8b7f2e7) Thanks [@tmm](https://github.com/tmm)! - Set `abi` return type value for `prepareContractWrite` as more permissive when not inferrable as `Abi`.\n\n## 0.7.2\n\n### Patch Changes\n\n- [`e9f806b6`](https://github.com/wevm/wagmi/commit/e9f806b652ba62effb3ddac464815e447fc287f6) Thanks [@tmm](https://github.com/tmm)! - Bumped abitype and zustand versions.\n\n## 0.7.1\n\n### Patch Changes\n\n- [#1272](https://github.com/wevm/wagmi/pull/1272) [`1f7fc41`](https://github.com/wevm/wagmi/commit/1f7fc419f7960bbdc51dfa85c2f33b89f1ecc1bf) Thanks [@tmm](https://github.com/tmm)! - Fixed ethers import path\n\n## 0.7.0\n\n### Minor Changes\n\n- [#1202](https://github.com/wevm/wagmi/pull/1202) [`9bf56af`](https://github.com/wevm/wagmi/commit/9bf56af3c30bdb80abb1e785c002e00986fadfb2) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: Removed the following deprecated chains:\n\n  - `ropsten`\n  - `rinkeby`\n  - `kovan`\n  - `optimismKovan`\n  - `arbitrumRinkeby`\n\n  If you feel you still need to include one of these testnets in your application, you will have to define it manually:\n\n  ```diff\n  -import { rinkeby } from 'wagmi'\n  +import { Chain } from 'wagmi'\n\n  +export const rinkeby: Chain = {\n  + id: 4,\n  + name: 'Rinkeby',\n  + network: 'rinkeby',\n  + nativeCurrency: { name: 'Rinkeby Ether', symbol: 'ETH', decimals: 18 },\n  + rpcUrls: {\n  +   alchemy: 'https://eth-rinkeby.alchemyapi.io/v2',\n  +   default: 'https://rpc.ankr.com/eth_rinkeby',\n  +   infura: 'https://rinkeby.infura.io/v3',\n  +   public: 'https://rpc.ankr.com/eth_rinkeby',\n  +  },\n  + blockExplorers: {\n  +   etherscan: 'https://rinkeby.etherscan.io',\n  +   default: 'https://rinkeby.etherscan.io',\n  + },\n  + ens: {\n  +   address: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n  + },\n  + multicall: {\n  +   address: '0xca11bde05977b3631167028862be2a173976ca11',\n  +   blockCreated: 10299530,\n  + },\n  + testnet: true,\n  }\n  ```\n\n  You can reference these removed chains [here](https://github.com/wevm/wagmi/blob/389765f7d9af063ab0df07389a2bbfbc10a41060/packages/core/src/constants/chains.ts).\n\n- [#1202](https://github.com/wevm/wagmi/pull/1202) [`9bf56af`](https://github.com/wevm/wagmi/commit/9bf56af3c30bdb80abb1e785c002e00986fadfb2) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: `addressOrName` renamed to `address` for `fetchBalance` and `fetchEnsAvatar`.\n\n  ```diff\n  const result = await fetchBalance({\n  - addressOrName: '0x…',\n  + address: '0x…',\n  })\n  ```\n\n  If you were using an ENS name instead of an address, you can resolve the name to an address before passing it to the action.\n\n  ```diff\n  + const { data: address } = await fetchEnsAddress({ name: 'example.eth' })\n  const result = await fetchBalance({\n  - addressOrName: 'example.eth',\n  + address,\n  })\n  ```\n\n- [#1202](https://github.com/wevm/wagmi/pull/1202) [`9bf56af`](https://github.com/wevm/wagmi/commit/9bf56af3c30bdb80abb1e785c002e00986fadfb2) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: Made `apiKey` required on `infuraProvider` and `alchemyProvider`.\n\n  ```diff\n  import { configureChains } from 'wagmi'\n\n  const config = configureChains(defaultChains, [\n  - alchemyProvider(),\n  + alchemyProvider({ apiKey: process.env.ALCHEMY_API_KEY })\n  ])\n  ```\n\n  You can find your Alchemy API key from the [Alchemy Dashboard](https://dashboard.alchemyapi.io/), or your Infura API key from the [Infura Dashboard](https://infura.io/login).\n\n- [#1202](https://github.com/wevm/wagmi/pull/1202) [`9bf56af`](https://github.com/wevm/wagmi/commit/9bf56af3c30bdb80abb1e785c002e00986fadfb2) Thanks [@tmm](https://github.com/tmm)! - Removed CommonJS support\n\n## 0.6.12\n\n### Patch Changes\n\n- [#1250](https://github.com/wevm/wagmi/pull/1250) [`ce2e0f4`](https://github.com/wevm/wagmi/commit/ce2e0f4a46b8fd1c509ead552012ef4c072a525b) Thanks [@tmm](https://github.com/tmm)! - Added support for Trust Wallet browser extension.\n\n## 0.6.11\n\n### Patch Changes\n\n- [#1234](https://github.com/wevm/wagmi/pull/1234) [`3ff9303`](https://github.com/wevm/wagmi/commit/3ff930349250f62137cca4ca3b382522882abf8a) Thanks [@tmm](https://github.com/tmm)! - Fixed issue with adding chain to wallet without block explorer URL.\n\n## 0.6.10\n\n### Patch Changes\n\n- [#1232](https://github.com/wevm/wagmi/pull/1232) [`c0ca509`](https://github.com/wevm/wagmi/commit/c0ca509506dcf6d98b058df549dc761c9a5f3d1c) Thanks [@tmm](https://github.com/tmm)! - Added validation to check that chain is configured for connector when accessing `Signer`.\n\n## 0.6.9\n\n### Patch Changes\n\n- [#1207](https://github.com/wevm/wagmi/pull/1207) [`c73d463`](https://github.com/wevm/wagmi/commit/c73d463d65c9dbfcfe709187e47323a769589741) Thanks [@lvshaoping007](https://github.com/lvshaoping007)! - Added Kucoin wallet support to `InjectedConnector`\n\n## 0.6.8\n\n### Patch Changes\n\n- [#1132](https://github.com/wevm/wagmi/pull/1132) [`d41c0d6`](https://github.com/wevm/wagmi/commit/d41c0d650f8c0e54145758685b7604b8909d7ae0) Thanks [@toniocodo](https://github.com/toniocodo)! - Added ERC-4626 ABI\n\n- [#1201](https://github.com/wevm/wagmi/pull/1201) [`9a07efa`](https://github.com/wevm/wagmi/commit/9a07efaa397d3ba03f2edbe527c359f21e22139a) Thanks [@jxom](https://github.com/jxom)! - Fixed issue where non-checksum addresses did not resolve with an ENS name\n\n## 0.6.7\n\n### Patch Changes\n\n- [#1174](https://github.com/wevm/wagmi/pull/1174) [`196a458`](https://github.com/wevm/wagmi/commit/196a458f64141e8a9f39c1b1e1af5937f692cb39) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where `client.chains` (active connector chains) would be populated when there is no active connector (disconnected user).\n\n- [#1176](https://github.com/wevm/wagmi/pull/1176) [`389765f`](https://github.com/wevm/wagmi/commit/389765f7d9af063ab0df07389a2bbfbc10a41060) Thanks [@jxom](https://github.com/jxom)! - Migrate away from Alchemy RPC URLs in the public RPC URL list\n\n## 0.6.6\n\n### Patch Changes\n\n- [`81ce9e6`](https://github.com/wevm/wagmi/commit/81ce9e64d85f7d01370324c1a529988a0919894f) Thanks [@jxom](https://github.com/jxom)! - Add `isPortal` to injected MetaMask flags.\n\n- [`c2c0109`](https://github.com/wevm/wagmi/commit/c2c01096ef4cd0ffadbb49062969c208604c6194) Thanks [@jxom](https://github.com/jxom)! - Add etherscan block explorer to Optimism Goerli\n\n## 0.6.5\n\n### Patch Changes\n\n- [#1162](https://github.com/wevm/wagmi/pull/1162) [`30335b3`](https://github.com/wevm/wagmi/commit/30335b3199fb425e398e9c492b50c68d5e2ade7e) Thanks [@tmm](https://github.com/tmm)! - Fixed issue where non-indexed event parameter types were set to `null`.\n\n- [#1162](https://github.com/wevm/wagmi/pull/1162) [`30335b3`](https://github.com/wevm/wagmi/commit/30335b3199fb425e398e9c492b50c68d5e2ade7e) Thanks [@tmm](https://github.com/tmm)! - Fixed issue where `useContractReads` and `useContractInfiniteReads` types were slowing down TypeScript compiler.\n\n## 0.6.4\n\n### Patch Changes\n\n- [#1103](https://github.com/wevm/wagmi/pull/1103) [`651eda0`](https://github.com/wevm/wagmi/commit/651eda06384bd0955268427f898e9337b2dc5a31) Thanks [@tmm](https://github.com/tmm)! - Bumped `abitype` dependency.\n\n## 0.6.3\n\n### Patch Changes\n\n- [#1086](https://github.com/wevm/wagmi/pull/1086) [`4e28d2a`](https://github.com/wevm/wagmi/commit/4e28d2ad4c2e6b3479b728563040b9529463cbcf) Thanks [@tmm](https://github.com/tmm)! - Exposed module types.\n\n## 0.6.2\n\n### Patch Changes\n\n- [#1080](https://github.com/wevm/wagmi/pull/1080) [`3be5e8b`](https://github.com/wevm/wagmi/commit/3be5e8b01e58ed40cc9dab7ef9533c0197cb74d0) Thanks [@tmm](https://github.com/tmm)! - Added `abitype` to `dependencies` so types ship correctly.\n\n## 0.6.1\n\n### Patch Changes\n\n- [#1074](https://github.com/wevm/wagmi/pull/1074) [`8db807f`](https://github.com/wevm/wagmi/commit/8db807f16149aa278c2a7db9ee5245431db12173) Thanks [@IljaDaderko](https://github.com/IljaDaderko)! - Exported `EventListener` type\n\n## 0.6.0\n\n### Minor Changes\n\n- [#940](https://github.com/wevm/wagmi/pull/940) [`b6cb8f4`](https://github.com/wevm/wagmi/commit/b6cb8f4cd15eb13073bc7e9ecb4bfa2c261c0663) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: `watchSigner` now requires an arguments object (that accepts an optional `chainId`) as it's first parameter.\n\n  ```diff\n  import { watchSigner } from `@wagmi/core`\n\n  -watchSigner(signer => {\n  +watchSigner({}, signer => {\n    console.log('new signer!', signer)\n  })\n  ```\n\n- [#940](https://github.com/wevm/wagmi/pull/940) [`b6cb8f4`](https://github.com/wevm/wagmi/commit/b6cb8f4cd15eb13073bc7e9ecb4bfa2c261c0663) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: `prepareSendTransaction` now throws when a `chainId` is specified and the end-user is on a different chain id (the wrong network).\n\n- [#941](https://github.com/wevm/wagmi/pull/941) [`0c96009`](https://github.com/wevm/wagmi/commit/0c96009398647a515a57f72ef25c32724f7c978c) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: `addressOrName` and `contractInterface` renamed to `address` and `abi` respectively for contract actions: `getContract`, `multicall`, `prepareWriteContract`, `readContract`, `readContracts`, `watchContractEvent`, `watchMulticall`, `watchReadContract`, `watchReadContracts`, `writeContract`.\n\n  ```diff\n  import { readContract } from '@wagmi/core'\n\n  const result = await readContract({\n  - addressOrName: '0x…',\n  + address: '0x…',\n  - contractInterface: […] as const,\n  + abi: […] as const,\n    functionName: 'balanceOf',\n    args: ['0x…'],\n  })\n  ```\n\n  If you were using an ENS name instead of an address, you can resolve the name to an address before passing it to the action.\n\n  ```diff\n  - import { readContract } from '@wagmi/core'\n  + import { fetchEnsAddress, readContract } from '@wagmi/core'\n\n  + const address = await fetchEnsAddress('example.eth')\n  const result = await readContract({\n  - addressOrName: 'example.eth',\n  + address,\n    abi: […] as const,\n    functionName: 'balanceOf',\n    args: ['0x…'],\n  })\n  ```\n\n- [#940](https://github.com/wevm/wagmi/pull/940) [`b6cb8f4`](https://github.com/wevm/wagmi/commit/b6cb8f4cd15eb13073bc7e9ecb4bfa2c261c0663) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: `prepareWriteContract` now throws when a `chainId` is specified and the end-user is on a different chain id (the wrong network).\n\n- [#940](https://github.com/wevm/wagmi/pull/940) [`b6cb8f4`](https://github.com/wevm/wagmi/commit/b6cb8f4cd15eb13073bc7e9ecb4bfa2c261c0663) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: `prepareSendTransaction` now only accepts a `signer` instead of `signerOrProvider`.\n\n  This is to reach parity with `prepareWriteContract`.\n\n  If no `signer` is provided, wagmi will use the signer that is currently connected. If no user is connected, then `prepareWriteContract` will throw an error.\n\n- [#941](https://github.com/wevm/wagmi/pull/941) [`0c96009`](https://github.com/wevm/wagmi/commit/0c96009398647a515a57f72ef25c32724f7c978c) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: `args` config option must now be an array for the following actions: `readContract`, `writeContract`, `prepareWriteContract`, `multicall`, `readContracts`, `watchMulticall`, and `watchReadContracts`.\n\n  ```diff\n  import { readContract } from '@wagmi/core'\n\n  const result = await readContract({\n    address: '0x…',\n    abi: […],\n    functionName: 'balanceOf',\n  - args: '0x…',\n  + args: ['0x…'],\n  })\n  ```\n\n- [#941](https://github.com/wevm/wagmi/pull/941) [`0c96009`](https://github.com/wevm/wagmi/commit/0c96009398647a515a57f72ef25c32724f7c978c) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: `watchContractEvent` now accepts a configuration object and callback instead of positional arguments.\n\n  ```diff\n  import { watchContractEvent } from '@wagmi/core'\n\n  - const unsubscribe = watchContractEvent(\n  -   {\n  -     address: '0x…',\n  -     abi: […],\n  -   },\n  -   'Transfer',\n  -   (from, to, tokenId) => {\n  -     // ...\n  -   },\n  -   { once: true },\n  - )\n  + const unsubscribe = watchContractEvent(\n  +   {\n  +     address: '0x…',\n  +     abi: […],\n  +     eventName: 'Transfer',\n  +     once: true,\n  +   },\n  +   (from, to, tokenId) => {\n  +     // ...\n  +   },\n  + )\n  ```\n\n- [#941](https://github.com/wevm/wagmi/pull/941) [`0c96009`](https://github.com/wevm/wagmi/commit/0c96009398647a515a57f72ef25c32724f7c978c) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: Updated TypeScript version to `typescript@>=4.7.4`.\n\n  `@wagmi/core` can now infer types based on [ABI](https://docs.soliditylang.org/en/v0.8.15/abi-spec.html#json) and [EIP-712](https://eips.ethereum.org/EIPS/eip-712) Typed Data definitions, giving you full end-to-end type-safety from your contracts to your frontend and incredible developer experience (e.g. autocomplete contract function names and catch misspellings, type contract function arguments, etc.).\n\n  For this to work, you must upgrade to `typescript@>=4.7.4`. Why is TypeScript v4.7.4 or greater necessary? TypeScript 4.7.4 introduced the ability to [extend constraints on inferred type variables](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/#extends-constraints-on-infer-type-variables), which is used extensively to help narrow types for ABIs. Good news! When upgrading TypeScript from 4.6 to 4.7 there are likely no [breaking changes](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-7.html#breaking-changes) for your set up.\n\n- [#941](https://github.com/wevm/wagmi/pull/941) [`0c96009`](https://github.com/wevm/wagmi/commit/0c96009398647a515a57f72ef25c32724f7c978c) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: Updated TypeScript generics for contract interaction and typed data actions.\n\n  Adding a [const assertion](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions) to `abi` allows TypeScript to infer `functionName`, `args`, `overrides`, and return types for functions, and `eventName` and `listener` types for events.\n\n  ```diff\n  import { readContract } from '@wagmi/core'\n\n  const result = await readContract({\n    address: '0x…',\n  - abi: […],\n  + abi: […] as const,\n    functionName: 'balanceOf', // will autocomplete and catch typos\n    args: ['0x…'], // inferred based on `functionName`\n  })\n  result // inferred based on `functionName`\n  ```\n\n  This works for the following actions: `readContract`, `writeContract`, `prepareWriteContract`, `multicall`, `readContracts`, `watchMulticall`, `watchReadContracts`, and `watchContractEvent`.\n\n  Adding a [const assertion](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions) to `signTypedData`'s config option, `types`, allows TypeScript to infer `value`.\n\n  ```diff\n  import { signTypedData } from '@wagmi/core'\n\n  const result = await signTypedData({\n    domain: {\n      name: 'Ether Mail',\n      version: '1',\n      chainId: 1,\n      verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n    },\n    types: {\n      Person: [\n        { name: 'name', type: 'string' },\n        { name: 'wallet', type: 'address' },\n      ],\n      Mail: [\n        { name: 'from', type: 'Person' },\n        { name: 'to', type: 'Person' },\n        { name: 'contents', type: 'string' },\n      ],\n  - },\n  + } as const,\n    value: { // `value` is inferred based on `types`\n      from: {\n        name: 'Cow',\n        wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n      },\n      to: {\n        name: 'Bob',\n        wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n      },\n      contents: 'Hello, Bob!',\n    },\n  })\n  ```\n\n### Patch Changes\n\n- [#1061](https://github.com/wevm/wagmi/pull/1061) [`a4ffe8b`](https://github.com/wevm/wagmi/commit/a4ffe8b25516d5504685ae94579da4cd8c409329) Thanks [@alecananian](https://github.com/alecananian)! - Added Arbitrum Goerli Arbiscan block explorer\n\n- [#940](https://github.com/wevm/wagmi/pull/940) [`b6cb8f4`](https://github.com/wevm/wagmi/commit/b6cb8f4cd15eb13073bc7e9ecb4bfa2c261c0663) Thanks [@jxom](https://github.com/jxom)! - The `fetchSigner` action now accepts an optional `chainId` to use for signer initialization as an argument.\n\n  ```tsx\n  import { fetchSigner } from \"@wagmi/core\";\n  import { optimism } from \"@wagmi/core/chains\";\n\n  // ...\n\n  fetchSigner({ chainId: optimism.id });\n  ```\n\n- [#1048](https://github.com/wevm/wagmi/pull/1048) [`ed13074`](https://github.com/wevm/wagmi/commit/ed130747c0f28c1d9980a1328883e4000a60455e) Thanks [@Max-3-7](https://github.com/Max-3-7)! - Added support for Avalanche core wallet\n\n- [#1046](https://github.com/wevm/wagmi/pull/1046) [`ab9ecaa`](https://github.com/wevm/wagmi/commit/ab9ecaa74dfa4324279e167dd7e348319ef7d35d) Thanks [@jxom](https://github.com/jxom)! - make ethers block format validator compatible with Celo\n\n- [#1050](https://github.com/wevm/wagmi/pull/1050) [`73d4d47`](https://github.com/wevm/wagmi/commit/73d4d47bc679f4f9a1cf46010fe2bf858c9d0b5c) Thanks [@jxom](https://github.com/jxom)! - update dependencies\n\n  - `zustand@4.1.1`\n\n## 0.5.8\n\n### Patch Changes\n\n- [`8cb07462`](https://github.com/wevm/wagmi/commit/8cb07462acc3c5637398d11d2451f8b8e330d553) Thanks [@jxom](https://github.com/jxom)! - Added `chainId` as an argument to `watchBlockNumber`.\n\n* [`53c1a474`](https://github.com/wevm/wagmi/commit/53c1a4747d03b685e8cfbf55361fc2a56777fb06) Thanks [@tmm](https://github.com/tmm)! - Added missing `decimals` option to `Connector` `watchAsset`\n\n- [`4d74dd4f`](https://github.com/wevm/wagmi/commit/4d74dd4ff827ba5c43c3546a218f38cee45ea76a) Thanks [@jxom](https://github.com/jxom)! - Support ERC20 contracts that represent strings as bytes32\n\n## 0.5.7\n\n### Patch Changes\n\n- [`aa51bc4d`](https://github.com/wevm/wagmi/commit/aa51bc4dc5683bf0178597d2fdb8f2e9d82e7970) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue in `CoinbaseWalletConnector` where the browser extension would unintendedly reset the network when the browser is refreshed.\n\n* [#955](https://github.com/wevm/wagmi/pull/955) [`e326cd80`](https://github.com/wevm/wagmi/commit/e326cd80fe65267db623eb6c80ccdd75572914cf) Thanks [@0xFlicker](https://github.com/0xFlicker)! - Added Infura RPC URL for Sepolia\n\n- [`cec14089`](https://github.com/wevm/wagmi/commit/cec14089500c86687226ab272b4c3fcb85ae3d69) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where `useProvider` & `getProvider` were not returning referentially equal providers.\n\n* [`cec14089`](https://github.com/wevm/wagmi/commit/cec14089500c86687226ab272b4c3fcb85ae3d69) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where the `watch` option was not respecting the neighboring `chainId` option in `useBlockNumber`.\n\n- [`cec14089`](https://github.com/wevm/wagmi/commit/cec14089500c86687226ab272b4c3fcb85ae3d69) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where block listeners (via `watch`) were firing excessively on L2 chains.\n\n## 0.5.6\n\n### Patch Changes\n\n- [#936](https://github.com/wevm/wagmi/pull/936) [`3329d1f`](https://github.com/wevm/wagmi/commit/3329d1f5880431566e14ac1640f48d0975aec4c2) Thanks [@jxom](https://github.com/jxom)! - Added the ability to provide a custom logger to override how logs are broadcasted to the consumer in wagmi.\n\n  A custom logger can be provided to the wagmi client via `logger`.\n\n  ### API\n\n  ```tsx\n  logger?: {\n    warn: typeof console.warn | null\n  }\n  ```\n\n  ### Examples\n\n  **Passing in a custom logger**\n\n  You can pass in a function to define your own custom logger.\n\n  ```diff\n  + import { logWarn } from './logger';\n\n  const client = createClient({\n    ...\n  + logger: {\n  +   warn: message => logWarn(message)\n  + }\n    ...\n  })\n  ```\n\n  **Disabling a logger**\n\n  You can disable a logger by passing `null` as the value.\n\n  ```diff\n  const client = createClient({\n    ...\n  + logger: {\n  +   warn: null\n  + }\n    ...\n  })\n  ```\n\n* [#889](https://github.com/wevm/wagmi/pull/889) [`27788ed`](https://github.com/wevm/wagmi/commit/27788ed989b5dc26849c7945fb91a92e56766018) Thanks [@jxom](https://github.com/jxom)! - Make multicall & readContracts more error robust\n\n## 0.5.5\n\n### Patch Changes\n\n- [#912](https://github.com/wevm/wagmi/pull/912) [`e529e12`](https://github.com/wevm/wagmi/commit/e529e125c713ed3ef24a59c6bf226fe4deee7ac9) Thanks [@zouhangwithsweet](https://github.com/zouhangwithsweet)! - Added BitKeep to injected flags\n\n- [#912](https://github.com/wevm/wagmi/pull/910) Thanks [@mytangying](https://github.com/zouhangwithsweet)! - Added MathWallet to injected flags\n\n- [#904](https://github.com/wevm/wagmi/pull/904) [`c231058`](https://github.com/wevm/wagmi/commit/c23105850f335f8798031e14c7098b7dee8c2975) Thanks [@jxom](https://github.com/jxom)! - Minimized contract interface returned from `prepareWriteContract`.\n\n## 0.5.4\n\n### Patch Changes\n\n- [#852](https://github.com/wevm/wagmi/pull/852) [`c3192d0`](https://github.com/wevm/wagmi/commit/c3192d0663aa332ae9edfd9dd49b333454013ab7) Thanks [@skeithc](https://github.com/skeithc)! - Added support for the Sepolia testnet\n\n## 0.5.3\n\n### Patch Changes\n\n- [#835](https://github.com/wevm/wagmi/pull/835) [`1b85e54`](https://github.com/wevm/wagmi/commit/1b85e54ae654e2564cf5bc2dae6411fe0a25875c) Thanks [@jxom](https://github.com/jxom)! - Update `@coinbase/wallet-sdk` to `3.4.1`\n\n* [#834](https://github.com/wevm/wagmi/pull/834) [`9655879`](https://github.com/wevm/wagmi/commit/96558793b0319df47aefafa6b7b9c959068d491b) Thanks [@jxom](https://github.com/jxom)! - Update zustand to `4.0.0`\n\n## 0.5.2\n\n### Patch Changes\n\n- [#823](https://github.com/wevm/wagmi/pull/823) [`10b8b78`](https://github.com/wevm/wagmi/commit/10b8b78605b7246b2c55b8d69f96663906e5cd20) Thanks [@tmm](https://github.com/tmm)! - Add Optimism Goerli to `chain` lookup.\n\n## 0.5.1\n\n### Patch Changes\n\n- [#767](https://github.com/wevm/wagmi/pull/767) [`e9392f3`](https://github.com/wevm/wagmi/commit/e9392f396e48e928bd9d2522e3ad671c589f08cb) Thanks [@klyap](https://github.com/klyap)! - Add Optimism Goerli chain ahead of [Kovan deprecation](https://dev.optimism.io/kovan-to-goerli).\n\n* [#817](https://github.com/wevm/wagmi/pull/817) [`7e5cac7`](https://github.com/wevm/wagmi/commit/7e5cac75815dcd8aa563462342a4853fc5207735) Thanks [@alecananian](https://github.com/alecananian)! - Added custom name mapping for 1inch Wallet injected provider\n\n- [#806](https://github.com/wevm/wagmi/pull/806) [`0b34e56`](https://github.com/wevm/wagmi/commit/0b34e56db97e6dcdb71088e0149b2d55ebc604a5) Thanks [@vmichalik](https://github.com/vmichalik)! - Fix canonical testnet native asset symbols by changing them to ETH\n\n* [#778](https://github.com/wevm/wagmi/pull/778) [`0892908`](https://github.com/wevm/wagmi/commit/08929084eeeba1a3a55aa098fa9d92a243685ad5) Thanks [@0xcadams](https://github.com/0xcadams)! - Add Arbitrum Goerli chain.\n\n## 0.5.0\n\n### Minor Changes\n\n- [#658](https://github.com/wevm/wagmi/pull/658) [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: The configuration passed to the `sendTransaction` action now needs to be:\n\n  - prepared with the `prepareSendTransaction` action **(new functionality)**, or\n  - recklessly unprepared **(previous functionality)**\n\n  > Why? [Read here](https://wagmi.sh/docs/prepare-hooks)\n\n  ### Prepared usage\n\n  ```diff\n  import { prepareSendTransaction, sendTransaction } from '@wagmi/core'\n\n  +const config = await prepareSendTransaction({\n  +  request: {\n  +    to: 'moxey.eth',\n  +    value: parseEther('1'),\n  +  }\n  +})\n\n  const result = await sendTransaction({\n  - request: {\n  -   to: 'moxey.eth',\n  -   value: parseEther('1')\n  - }\n  + ...config\n  })\n  ```\n\n  ### Recklessly unprepared usage\n\n  It is possible to use `sendTransaction` without preparing the configuration first by passing `mode: 'recklesslyUnprepared'`.\n\n  ```diff\n  import { sendTransaction } from '@wagmi/core'\n\n  const result = await sendTransaction({\n  + mode: 'recklesslyUnprepared',\n    request: {\n      to: 'moxey.eth',\n      value: parseEther('1'),\n    }\n  })\n  ```\n\n* [#760](https://github.com/wevm/wagmi/pull/760) [`d8af6bf`](https://github.com/wevm/wagmi/commit/d8af6bf50885aec110ae4d64716642453aa27896) Thanks [@tmm](https://github.com/tmm)! - **Breaking:** `alchemyProvider` and `infuraProvider` now use a generic `apiKey` configuration option instead of `alchemyId` and `infuraId`.\n\n  ```diff\n  import { alchemyProvider } from '@wagmi/core/providers/alchemy'\n  import { infuraProvider } from '@wagmi/core/providers/infura'\n\n  alchemyProvider({\n  -  alchemyId: 'yourAlchemyApiKey',\n  +  apiKey: 'yourAlchemyApiKey',\n  })\n\n  infuraProvider({\n  -  infuraId: 'yourInfuraApiKey',\n  +  apiKey: 'yourInfuraApiKey',\n  })\n  ```\n\n- [#727](https://github.com/wevm/wagmi/pull/727) [`ac3b9b8`](https://github.com/wevm/wagmi/commit/ac3b9b87f80cb45b65d003f09d916d7d1427a62e) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: Moved the `pollingInterval` config option from the chain provider config to `configureChains` config.\n\n  ```diff\n  const { chains, provider } = configureChains(\n    [chain.mainnet, chain.polygon],\n    [\n  -   alchemyProvider({ apiKey, pollingInterval: 5000 }),\n  -   publicProvider({ pollingInterval: 5000 })\n  +   alchemyProvider({ apiKey }),\n  +   publicProvider()\n    ],\n  + { pollingInterval: 5000 }\n  )\n  ```\n\n* [#658](https://github.com/wevm/wagmi/pull/658) [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432) Thanks [@jxom](https://github.com/jxom)! - **Breaking:** The `sendTransaction` action now returns an object only consisting of `hash` & `wait`, and not the full [`TransactionResponse`](https://docs.ethers.io/v5/api/providers/types/#providers-TransactionResponse).\n\n  If you require the full `TransactionResponse`, you can use `fetchTransaction`:\n\n  ```diff\n  import { sendTransaction, fetchTransaction } from '@wagmi/core'\n\n  const {\n    hash,\n    wait,\n  - ...transaction\n  } = sendTransaction(...)\n\n  +const transaction = fetchTransaction({ hash })\n  ```\n\n  > Why? The old implementation of `sendTransaction` created a long-running async task, causing [UX pitfalls](https://wagmi.sh/docs/prepare-hooks#ux-pitfalls-without-prepare-hooks) when invoked in a click handler.\n\n- [#658](https://github.com/wevm/wagmi/pull/658) [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: If a `chainId` is passed to `writeContract` or `sendTransaction`, it will no longer attempt to switch chain before sending the transaction. Instead, it will throw an error if the user is on the wrong chain.\n\n  > Why?\n  >\n  > - Eagerly prompting to switch chain in these actions created a long-running async task that that makes [iOS App Links](https://wagmi.sh/docs/prepare-hooks#ios-app-link-constraints) vulnerable.\n  > - Not all wallets support programmatic chain switching.\n\n### Patch Changes\n\n- [#658](https://github.com/wevm/wagmi/pull/658) [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: The configuration passed to the `writeContract` action now needs to be:\n\n  - prepared with the `prepareWriteContract` action **(new functionality)**, or\n  - recklessly unprepared **(previous functionality)**\n\n  > Why? [Read here](https://wagmi.sh/docs/prepare-hooks)\n\n  ### Prepared usage\n\n  ```diff\n  import { prepareWriteContract, writeContract } from '@wagmi/core'\n\n  const tokenId = 69\n\n  +const config = await prepareWriteContract({\n  + addressOrName: '0x...',\n  + contractInterface: wagmiAbi,\n  + functionName: 'mint',\n  + args: [tokenId]\n  +})\n\n  const result = await writeContract({\n  - addressOrName: '0x...',\n  - contractInterface: wagmiAbi,\n  - functionName: 'mint',\n  - args: [tokenId],\n  + ...config\n  })\n  ```\n\n  ### Recklessly unprepared usage\n\n  It is possible to use `writeContract` without preparing the configuration first by passing `mode: 'recklesslyUnprepared'`.\n\n  ```diff\n  import { writeContract } from '@wagmi/core'\n\n  const tokenId = 69\n\n  const result = await writeContract({\n  + mode: 'recklesslyUnprepared',\n    addressOrName: '0x...',\n    contractInterface: wagmiAbi,\n    functionName: 'mint',\n    args: [tokenId],\n  })\n  ```\n\n* [#658](https://github.com/wevm/wagmi/pull/658) [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432) Thanks [@jxom](https://github.com/jxom)! - Added the `prepareSendTransaction` hook that prepares the parameters required for sending a transaction.\n\n  It returns config to be passed through to `sendTransaction`.\n\n  ```ts\n  import { prepareSendTransaction, sendTransaction } from \"@wagmi/core\";\n\n  const config = await prepareSendTransaction({\n    request: {\n      to: \"moxey.eth\",\n      value: parseEther(\"1\"),\n    },\n  });\n  const result = await sendTransaction(config);\n  ```\n\n- [#658](https://github.com/wevm/wagmi/pull/658) [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432) Thanks [@jxom](https://github.com/jxom)! - Added the `prepareWriteContract` hook that prepares the parameters required for a contract write transaction.\n\n  It returns config to be passed through to `writeContract`.\n\n  Example:\n\n  ```tsx\n  import { prepareWriteContract, writeContract } from \"@wagmi/core\";\n\n  const config = await prepareWriteContract({\n    addressOrName: \"0x...\",\n    contractInterface: wagmiAbi,\n    functionName: \"mint\",\n  });\n  const result = await writeContract(config);\n  ```\n\n* [#739](https://github.com/wevm/wagmi/pull/739) [`c2295a5`](https://github.com/wevm/wagmi/commit/c2295a56cc86d02cc6602e2b4557b8ab9a091a3f) Thanks [@tmm](https://github.com/tmm)! - Fix balance formatting for tokens that do not have 18 decimals.\n\n- [#759](https://github.com/wevm/wagmi/pull/759) [`959953d`](https://github.com/wevm/wagmi/commit/959953d1f5b3e8189bac56de245c62333470d18e) Thanks [@tmm](https://github.com/tmm)! - Added `fetchTransaction` action:\n\n  ```ts\n  import { fetchTransaction } from \"@wagmi/core\";\n\n  const transaction = await fetchTransaction({\n    hash: \"0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060\",\n  });\n  ```\n\n## 0.4.9\n\n### Patch Changes\n\n- [#721](https://github.com/tmm/wagmi/pull/721) [`abea25f`](https://github.com/tmm/wagmi/commit/abea25fd15d81d1ecaec9d3fbd687042ab29b1e6) Thanks [@tmm](https://github.com/tmm)! - Stay connected to existing `client.connector` when `connect` action fails to connect to new connector.\n\n* [#721](https://github.com/tmm/wagmi/pull/721) [`abea25f`](https://github.com/tmm/wagmi/commit/abea25fd15d81d1ecaec9d3fbd687042ab29b1e6) Thanks [@tmm](https://github.com/tmm)! - Switch `fetchToken` action to multicall and add `name` output property.\n\n## 0.4.8\n\n### Patch Changes\n\n- [#693](https://github.com/tmm/wagmi/pull/693) [`56e468c`](https://github.com/tmm/wagmi/commit/56e468c3617ec222527bb3c02eadec3ebeff923a) Thanks [@markdalgleish](https://github.com/markdalgleish)! - Fix import errors with Coinbase Wallet SDK in Vite\n\n## 0.4.7\n\n### Patch Changes\n\n- [#677](https://github.com/tmm/wagmi/pull/677) [`35e4219`](https://github.com/tmm/wagmi/commit/35e42199af9dd346549c1718e144728f55b8d7dd) Thanks [@jxom](https://github.com/jxom)! - Move `parseContractResult` to `@wagmi/core`\n\n## 0.4.6\n\n### Patch Changes\n\n- [#670](https://github.com/tmm/wagmi/pull/670) [`29a0d21`](https://github.com/tmm/wagmi/commit/29a0d21ee83995559f63542778dfa805f15e7441) Thanks [@tmm](https://github.com/tmm)! - Added ethers-compatible `deepEqual` function.\n\n## 0.4.5\n\n### Patch Changes\n\n- [#654](https://github.com/tmm/wagmi/pull/654) [`e66530b`](https://github.com/tmm/wagmi/commit/e66530bf4881b3533c528f8c5a5f41be0eab0a64) Thanks [@jxom](https://github.com/jxom)! - fix `multicall` returning nullish data for all calls unexpectedly\n\n## 0.4.4\n\n### Patch Changes\n\n- [#616](https://github.com/tmm/wagmi/pull/616) [`7a7a17a`](https://github.com/tmm/wagmi/commit/7a7a17a46d4c9e6465cc46a111b5fe8a56109f1b) Thanks [@tmm](https://github.com/tmm)! - Adds `UNSTABLE_shimOnConnectSelectAccount` flag. With this flag and \"disconnected\" with `shimDisconnect` enabled, the user is prompted to select a different MetaMask account (than the currently connected account) when trying to connect (e.g. `useConnect`/`connect` action).\n\n## 0.4.3\n\n### Patch Changes\n\n- [#631](https://github.com/tmm/wagmi/pull/631) [`a780e32`](https://github.com/tmm/wagmi/commit/a780e32e91a0072c795fa0b5a6111302768e2a01) Thanks [@tmm](https://github.com/tmm)! - Fix WalletConnect stale session\n\n## 0.4.2\n\n### Patch Changes\n\n- [#624](https://github.com/tmm/wagmi/pull/624) [`416fa7e`](https://github.com/tmm/wagmi/commit/416fa7ee1f8019ab86e33fb93783ffddecc02c49) Thanks [@jxom](https://github.com/jxom)! - Fix broken `WebSocketProvider` type defs\n\n## 0.4.1\n\n### Patch Changes\n\n- [#622](https://github.com/tmm/wagmi/pull/622) [`d171581`](https://github.com/tmm/wagmi/commit/d171581464891dd870d97b6232205da0cb152d9b) Thanks [@tmm](https://github.com/tmm)! - Use `domain.chainId` to validate and switch chain before signing in `signTypedData`.\n\n* [#618](https://github.com/tmm/wagmi/pull/618) [`a5138e8`](https://github.com/tmm/wagmi/commit/a5138e82a00e4d9469ad78c97b2d34200d7f1fbe) Thanks [@tmm](https://github.com/tmm)! - Fix adding chains when using MetaMask mobile app, add `publicRpcUrls` constant, and default to public endpoint when adding chain.\n\n## 0.4.0\n\n### Minor Changes\n\n- [`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: The `provider` config option is now required on `createClient`. It is recommended to pass the [`provider` given from `configureChains`](https://wagmi.sh/docs/providers/configuring-chains).\n\n  ```diff\n  import {\n    createClient,\n  + defaultChains,\n  + configureChains\n  } from 'wagmi'\n  +import { publicProvider } from 'wagmi/providers/publicProvider'\n\n  +const { provider } = configureChains(defaultChains, [\n  + publicProvider\n  +])\n\n  const client = createClient({\n  + provider\n  })\n  ```\n\n  If you previously used an ethers.js Provider, you now need to provide your `chains` on the Provider instance:\n\n  ```diff\n  import {\n    createClient,\n  + defaultChains\n  } from 'wagmi'\n  import ethers from 'ethers'\n\n  const client = createClient({\n  - provider: getDefaultProvider()\n  + provider: Object.assign(getDefaultProvider(), { chains: defaultChains })\n  })\n  ```\n\n* [`4f8f3c0`](https://github.com/tmm/wagmi/commit/4f8f3c0d65383bd8bbdfc3f1033adfdb11d80ebb) Thanks [@nachoiacovino](https://github.com/nachoiacovino)! - Use ethereum-lists chains symbols\n\n- [`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4) Thanks [@jxom](https://github.com/jxom)! - **Breaking:** Removed the `chainId` parameter from `connectors` function on `createClient`.\n\n  ```diff\n  const client = createClient({\n  - connectors({ chainId }) {\n  + connectors() {\n      ...\n    }\n  })\n  ```\n\n  If you previously derived RPC URLs from the `chainId` on `connectors`, you can now remove that logic as `wagmi` now handles RPC URLs internally when used with `configureChains`.\n\n  ```diff\n  import {\n    chain,\n  +  configureChains,\n    createClient\n  } from 'wagmi';\n\n  +import { publicProvider } from 'wagmi/providers/public'\n\n  import { CoinbaseWalletConnector } from 'wagmi/connectors/coinbaseWallet'\n  import { InjectedConnector } from 'wagmi/connectors/injected'\n  import { MetaMaskConnector } from 'wagmi/connectors/metaMask'\n  import { WalletConnectConnector } from 'wagmi/connectors/walletConnect'\n\n  +const { chains } = configureChains(\n  +  [chain.mainnet],\n  +  [publicProvider()]\n  +);\n\n  const client = createClient({\n  -  connectors({ chainId }) {\n  -    const chain = chains.find((x) => x.id === chainId) ?? defaultChain\n  -    const rpcUrl = chain.rpcUrls.alchemy\n  -      ? `${chain.rpcUrls.alchemy}/${alchemyId}`\n  -      : chain.rpcUrls.default\n  -    return [\n  +  connectors: [\n      new MetaMaskConnector({ chains }),\n      new CoinbaseWalletConnector({\n        chains,\n        options: {\n          appName: 'wagmi',\n  -       chainId: chain.id,\n  -       jsonRpcUrl: rpcUrl,\n        },\n      }),\n      new WalletConnectConnector({\n        chains,\n        options: {\n          qrcode: true,\n  -       rpc: { [chain.id]: rpcUrl },\n        },\n      }),\n      new InjectedConnector({\n        chains,\n        options: { name: 'Injected' },\n      }),\n    ]\n  -  },\n  })\n  ```\n\n* [#611](https://github.com/tmm/wagmi/pull/611) [`3089c34`](https://github.com/tmm/wagmi/commit/3089c34196d4034acabac031e0a2f7ee63ae30cc) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: `Connector`s `getProvider` method no longer supports the `create` config parameter. Use the `chainId` config option instead.\n\n- [#596](https://github.com/tmm/wagmi/pull/596) [`a770af7`](https://github.com/tmm/wagmi/commit/a770af7d2cb214b6620d5341115f1e938e1e77ff) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: `TypedDataDomain` and `TypedDataField` types were removed and incorporated into `SignTypedDataArgs`.\n\n* [`4f8f3c0`](https://github.com/tmm/wagmi/commit/4f8f3c0d65383bd8bbdfc3f1033adfdb11d80ebb) Thanks [@nachoiacovino](https://github.com/nachoiacovino)! - Update symbols to match ethereum-lists/chains\n\n- [`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: The `writeContract` function parameters have been consolidated into a singular config parameter.\n\n  Before:\n\n  ```tsx\n  writeContract(\n    {\n      addressOrName: \"0xecb504d39723b0be0e3a9aa33d646642d1051ee1\",\n      contractInterface: wagmigotchiABI,\n    },\n    \"feed\",\n  );\n  ```\n\n  After:\n\n  ```tsx\n  readContract({\n    addressOrName: \"0xecb504d39723b0be0e3a9aa33d646642d1051ee1\",\n    contractInterface: wagmigotchiABI,\n    functionName: \"feed\",\n  });\n  ```\n\n### Patch Changes\n\n- [`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: The `readContract` & `watchReadContract` function parameters have been consolidated into a singular config parameter.\n\n  Before:\n\n  ```tsx\n  readContract(\n    {\n      addressOrName: \"0xecb504d39723b0be0e3a9aa33d646642d1051ee1\",\n      contractInterface: wagmigotchiABI,\n    },\n    \"getHunger\",\n    { args: [0] },\n  );\n\n  watchReadContract(\n    {\n      addressOrName: \"0xecb504d39723b0be0e3a9aa33d646642d1051ee1\",\n      contractInterface: wagmigotchiABI,\n    },\n    \"getHunger\",\n    { args: [0] },\n    (result) => {},\n  );\n  ```\n\n  After:\n\n  ```tsx\n  readContract({\n    addressOrName: \"0xecb504d39723b0be0e3a9aa33d646642d1051ee1\",\n    contractInterface: wagmigotchiABI,\n    functionName: \"getHunger\",\n    args: [0],\n  });\n\n  watchReadContract(\n    {\n      addressOrName: \"0xecb504d39723b0be0e3a9aa33d646642d1051ee1\",\n      contractInterface: wagmigotchiABI,\n      functionName: \"getHunger\",\n      args: [0],\n    },\n    (result) => {},\n  );\n  ```\n\n* [#598](https://github.com/tmm/wagmi/pull/598) [`fef26bf`](https://github.com/tmm/wagmi/commit/fef26bf8aef76fc9621e3cd54d4e0ca8f69abb38) Thanks [@markdalgleish](https://github.com/markdalgleish)! - Update `@coinbase/wallet-sdk` peer dependency to `>=3.3.0` to fix errors when connecting with older versions of the Coinbase Wallet extension and mobile app.\n\n- [#611](https://github.com/tmm/wagmi/pull/611) [`3089c34`](https://github.com/tmm/wagmi/commit/3089c34196d4034acabac031e0a2f7ee63ae30cc) Thanks [@tmm](https://github.com/tmm)! - Added `chainId` config parameter for `writeContract` and `sendTransaction`.\n\n  If `chainId` is provided, the connector will validate that `chainId` is the active chain before sending a transaction (and switch to `chainId` if necessary).\n\n* [#582](https://github.com/tmm/wagmi/pull/582) [`b03830a`](https://github.com/tmm/wagmi/commit/b03830a54465215c2526f9509543fe2c978bfe70) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where the wagmi client's `status` would not update from `\"disconnected\"` to `\"connecting\" -> \"connected\"` when the `connect` action is invoked.\n\n- [`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4) Thanks [@jxom](https://github.com/jxom)! - Added a `multicall` & `watchMulticall` action that provides multicall support.\n\n  Internally uses the [`multicall3` contract](https://github.com/mds1/multicall).\n\n  [See example usage](https://github.com/tmm/wagmi/blob/194866032985fdd3f49bc46bf1b14181d7cb61d1/packages/core/src/actions/contracts/multicall.test.ts)\n\n* [`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4) Thanks [@jxom](https://github.com/jxom)! - Added a `readContracts` & `watchReadContracts` action that provides the ability to batch up multiple ethers Contract read-only methods.\n\n## 0.3.8\n\n### Patch Changes\n\n- [#570](https://github.com/tmm/wagmi/pull/570) [`0e3fe15`](https://github.com/tmm/wagmi/commit/0e3fe15445377f35d6f4142b49bf1c96bfeb62cd) Thanks [@tmm](https://github.com/tmm)! - adds chain for [Foundry](https://github.com/foundry-rs)\n\n## 0.3.7\n\n### Patch Changes\n\n- [#550](https://github.com/tmm/wagmi/pull/550) [`2a5313e`](https://github.com/tmm/wagmi/commit/2a5313e8cbc9ba6335e8e4b85e43862c9b711bd3) Thanks [@tmm](https://github.com/tmm)! - fix `CoinbaseWalletConnector` possible type error\n\n* [#548](https://github.com/tmm/wagmi/pull/548) [`0c48719`](https://github.com/tmm/wagmi/commit/0c487199f2421f042abc1f1d139468ccbbc5646a) Thanks [@dohaki](https://github.com/dohaki)! - add ensAddress to Chain type\n\n- [#549](https://github.com/tmm/wagmi/pull/549) [`89b3a74`](https://github.com/tmm/wagmi/commit/89b3a74ead4234daacd0dcf8506659887ebf0553) Thanks [@tmm](https://github.com/tmm)! - Turns on [`noUncheckedIndexedAccess`](https://www.typescriptlang.org/tsconfig#noUncheckedIndexedAccess=) and [`strictNullChecks`](https://www.typescriptlang.org/tsconfig#strictNullChecks=) for better runtime safety.\n\n## 0.3.6\n\n### Patch Changes\n\n- [#526](https://github.com/tmm/wagmi/pull/526) [`e95c5f9`](https://github.com/tmm/wagmi/commit/e95c5f91859e57d079b962a72d06b93dce004d2f) Thanks [@jxom](https://github.com/jxom)! - Added `shimChainChangedDisconnect` option to `InjectedConnector`. Defaults to `true` for `MetaMaskConnector`.\n\n* [#526](https://github.com/tmm/wagmi/pull/526) [`e95c5f9`](https://github.com/tmm/wagmi/commit/e95c5f91859e57d079b962a72d06b93dce004d2f) Thanks [@jxom](https://github.com/jxom)! - Added `lastUsedChainId` property to the wagmi `Client`.\n\n- [#526](https://github.com/tmm/wagmi/pull/526) [`e95c5f9`](https://github.com/tmm/wagmi/commit/e95c5f91859e57d079b962a72d06b93dce004d2f) Thanks [@jxom](https://github.com/jxom)! - Added `chainId` config option to the `connect` action.\n\n  Example:\n\n  ```tsx\n  import { connect } from \"@wagmi/core\";\n\n  await connect({ chainId: 69 });\n  ```\n\n## 0.3.5\n\n### Patch Changes\n\n- [#543](https://github.com/tmm/wagmi/pull/543) [`4d489fd`](https://github.com/tmm/wagmi/commit/4d489fd630dd8c00440bdaf4d646de662c41ff52) Thanks [@tmm](https://github.com/tmm)! - fix fee data formatting for null values\n\n## 0.3.4\n\n### Patch Changes\n\n- [`c4deb66`](https://github.com/tmm/wagmi/commit/c4deb6655a52e4cc4e5b3fd82202db11d6106848) Thanks [@jxom](https://github.com/jxom)! - infer `options.chainId` config from `chains` on WalletConnectConnector\n\n## 0.3.3\n\n### Patch Changes\n\n- [#486](https://github.com/tmm/wagmi/pull/486) [`dbfe3dd`](https://github.com/tmm/wagmi/commit/dbfe3dd320d178d6854a8096101200c1508786bb) Thanks [@tmm](https://github.com/tmm)! - add chains entrypoint\n\n## 0.3.2\n\n### Patch Changes\n\n- [`17212da`](https://github.com/tmm/wagmi/commit/17212da601640110d2835300e6433d1433db212e) Thanks [@jxom](https://github.com/jxom)! - Made the `defaultChains` type generic in `configureChains`.\n\n## 0.3.1\n\n### Patch Changes\n\n- [#484](https://github.com/tmm/wagmi/pull/484) [`1b9a503`](https://github.com/tmm/wagmi/commit/1b9a5033d51c6655b4f6570c490da6e0e9a29da9) Thanks [@tmm](https://github.com/tmm)! - export React Context\n\n## 0.3.0\n\n### Minor Changes\n\n- [#408](https://github.com/tmm/wagmi/pull/408) [`bfcc3a5`](https://github.com/tmm/wagmi/commit/bfcc3a51bbb1551753e3ccde6af134e9fd4fec9a) Thanks [@jxom](https://github.com/jxom)! - **Breaking:** The `connectors` option on `createClient` no longer reacts to chain switching.\n\n  **Passing a function to `connectors` has been deprecated.**\n\n  If you previously derived an RPC URL from the `chainId` in `connectors`, you will need to migrate to use the [`configureChains` API](https://wagmi.sh/docs/providers/configuring-chains).\n\n  ### Before\n\n  ```tsx\n  import { providers } from \"ethers\";\n  import { chain, createClient, defaultChains } from \"wagmi\";\n  import { CoinbaseWalletConnector } from \"wagmi/connectors/coinbaseWallet\";\n  import { InjectedConnector } from \"wagmi/connectors/injected\";\n  import { MetaMaskConnector } from \"wagmi/connectors/metaMask\";\n  import { WalletConnectConnector } from \"wagmi/connectors/walletConnect\";\n\n  const alchemyId = process.env.ALCHEMY_ID;\n\n  const chains = defaultChains;\n  const defaultChain = chain.mainnet;\n\n  const client = createClient({\n    autoConnect: true,\n    connectors({ chainId }) {\n      const chain = chains.find((x) => x.id === chainId) ?? defaultChain;\n      const rpcUrl = chain.rpcUrls.alchemy\n        ? `${chain.rpcUrls.alchemy}/${alchemyId}`\n        : chain.rpcUrls.default;\n      return [\n        new MetaMaskConnector({ chains }),\n        new CoinbaseWalletConnector({\n          chains,\n          options: {\n            appName: \"wagmi\",\n            chainId: chain.id,\n            jsonRpcUrl: rpcUrl,\n          },\n        }),\n        new WalletConnectConnector({\n          chains,\n          options: {\n            qrcode: true,\n            rpc: { [chain.id]: rpcUrl },\n          },\n        }),\n        new InjectedConnector({\n          chains,\n          options: {\n            name: \"Injected\",\n            shimDisconnect: true,\n          },\n        }),\n      ];\n    },\n  });\n  ```\n\n  ### After\n\n  ```tsx\n  import { chain, createClient, defaultChains } from \"wagmi\";\n\n  import { alchemyProvider } from \"wagmi/providers/alchemy\";\n  import { publicProvider } from \"wagmi/providers/public\";\n\n  import { CoinbaseWalletConnector } from \"wagmi/connectors/coinbaseWallet\";\n  import { InjectedConnector } from \"wagmi/connectors/injected\";\n  import { MetaMaskConnector } from \"wagmi/connectors/metaMask\";\n  import { WalletConnectConnector } from \"wagmi/connectors/walletConnect\";\n\n  const alchemyId = process.env.ALCHEMY_ID;\n\n  const { chains } = configureChains(defaultChains, [\n    alchemyProvider({ alchemyId }),\n    publicProvider(),\n  ]);\n\n  const client = createClient({\n    autoConnect: true,\n    connectors: [\n      new MetaMaskConnector({ chains }),\n      new CoinbaseWalletConnector({\n        chains,\n        options: {\n          appName: \"wagmi\",\n        },\n      }),\n      new WalletConnectConnector({\n        chains,\n        options: {\n          qrcode: true,\n        },\n      }),\n      new InjectedConnector({\n        chains,\n        options: {\n          name: \"Injected\",\n          shimDisconnect: true,\n        },\n      }),\n    ],\n  });\n  ```\n\n* [#468](https://github.com/tmm/wagmi/pull/468) [`44a884b`](https://github.com/tmm/wagmi/commit/44a884b84171c418f57701e80ef8de972948ef0b) Thanks [@tmm](https://github.com/tmm)! - **Breaking:** Duplicate exports with different names and the same functionality were removed to simplify the public API. In addition, confusing exports were renamed to be more descriptive.\n\n  - `createWagmiClient` alias was removed. Use `createClient` instead.\n  - `useWagmiClient` alias was removed. Use `useClient` instead.\n  - `WagmiClient` alias was removed. Use `Client` instead.\n  - `createWagmiStorage` alias was removed. Use `createStorage` instead.\n  - `Provider` was renamed and `WagmiProvider` alias was removed. Use `WagmiConfig` instead.\n\n- [#408](https://github.com/tmm/wagmi/pull/408) [`bfcc3a5`](https://github.com/tmm/wagmi/commit/bfcc3a51bbb1551753e3ccde6af134e9fd4fec9a) Thanks [@jxom](https://github.com/jxom)! - Add `configureChains` API.\n\n  The `configureChains` function allows you to configure your chains with a selected provider (Alchemy, Infura, JSON RPC, Public RPC URLs). This means you don't have to worry about deriving your own RPC URLs for each chain, or instantiating a Ethereum Provider.\n\n  `configureChains` accepts 3 parameters: an array of chains, and an array of providers, and a config object.\n\n  [Learn more about configuring chains & providers.](https://wagmi.sh/docs/providers/configuring-chains)\n\n  ### Before\n\n  ```tsx\n  import { providers } from \"ethers\";\n  import { chain, createClient, defaultChains } from \"wagmi\";\n  import { CoinbaseWalletConnector } from \"wagmi/connectors/coinbaseWallet\";\n  import { InjectedConnector } from \"wagmi/connectors/injected\";\n  import { MetaMaskConnector } from \"wagmi/connectors/metaMask\";\n  import { WalletConnectConnector } from \"wagmi/connectors/walletConnect\";\n\n  const alchemyId = process.env.ALCHEMY_ID;\n\n  const chains = defaultChains;\n  const defaultChain = chain.mainnet;\n\n  const client = createClient({\n    autoConnect: true,\n    connectors({ chainId }) {\n      const chain = chains.find((x) => x.id === chainId) ?? defaultChain;\n      const rpcUrl = chain.rpcUrls.alchemy\n        ? `${chain.rpcUrls.alchemy}/${alchemyId}`\n        : chain.rpcUrls.default;\n      return [\n        new MetaMaskConnector({ chains }),\n        new CoinbaseWalletConnector({\n          chains,\n          options: {\n            appName: \"wagmi\",\n            chainId: chain.id,\n            jsonRpcUrl: rpcUrl,\n          },\n        }),\n        new WalletConnectConnector({\n          chains,\n          options: {\n            qrcode: true,\n            rpc: { [chain.id]: rpcUrl },\n          },\n        }),\n        new InjectedConnector({\n          chains,\n          options: {\n            name: \"Injected\",\n            shimDisconnect: true,\n          },\n        }),\n      ];\n    },\n    provider: ({ chainId }) =>\n      new providers.AlchemyProvider(chainId, alchemyId),\n  });\n  ```\n\n  ### After\n\n  ```tsx\n  import { chain, createClient, defaultChains } from \"wagmi\";\n\n  import { alchemyProvider } from \"wagmi/providers/alchemy\";\n  import { publicProvider } from \"wagmi/providers/public\";\n\n  import { CoinbaseWalletConnector } from \"wagmi/connectors/coinbaseWallet\";\n  import { InjectedConnector } from \"wagmi/connectors/injected\";\n  import { MetaMaskConnector } from \"wagmi/connectors/metaMask\";\n  import { WalletConnectConnector } from \"wagmi/connectors/walletConnect\";\n\n  const alchemyId = process.env.ALCHEMY_ID;\n\n  const { chains, provider, webSocketProvider } = configureChains(\n    defaultChains,\n    [alchemyProvider({ alchemyId }), publicProvider()],\n  );\n\n  const client = createClient({\n    autoConnect: true,\n    connectors: [\n      new MetaMaskConnector({ chains }),\n      new CoinbaseWalletConnector({\n        chains,\n        options: {\n          appName: \"wagmi\",\n        },\n      }),\n      new WalletConnectConnector({\n        chains,\n        options: {\n          qrcode: true,\n        },\n      }),\n      new InjectedConnector({\n        chains,\n        options: {\n          name: \"Injected\",\n          shimDisconnect: true,\n        },\n      }),\n    ],\n    provider,\n    webSocketProvider,\n  });\n  ```\n\n### Patch Changes\n\n- [#404](https://github.com/tmm/wagmi/pull/404) [`f81c156`](https://github.com/tmm/wagmi/commit/f81c15665e2e71534f84ada3fa705f2d78627472) Thanks [@holic](https://github.com/holic)! - Add `ProviderRpcError` and `RpcError` error classes.\n\n  Certain wagmi-standardized errors may wrap `ProviderRpcError` or `RpcError`. For these cases, you can access the original provider rpc or rpc error value using the `internal` property.\n\n* [#459](https://github.com/tmm/wagmi/pull/459) [`72dcf7c`](https://github.com/tmm/wagmi/commit/72dcf7c09e814261b2e43a8fa364c57675c472de) Thanks [@tmm](https://github.com/tmm)! - update dependencies\n\n- [#473](https://github.com/tmm/wagmi/pull/473) [`a54f3e2`](https://github.com/tmm/wagmi/commit/a54f3e23ea385ed8aa4ad188128d7089ba20f83e) Thanks [@cesargdm](https://github.com/cesargdm)! - Add workaround for CoinbaseWalletSDK import on esbuild\n\n* [#447](https://github.com/tmm/wagmi/pull/447) [`b9ebf78`](https://github.com/tmm/wagmi/commit/b9ebf782e0900725bcb76483686b30f09d357ebd) Thanks [@tmm](https://github.com/tmm)! - Fix case where connector disconnected while app was closed and stale data was returned when autoconnecting. For example, [MetaMask was locked](https://github.com/tmm/wagmi/issues/444) when page was closed.\n\n## 0.2.5\n\n### Patch Changes\n\n- [`4e03666`](https://github.com/tmm/wagmi/commit/4e03666428d42fc9186c617001b5eb356229677e) Thanks [@tmm](https://github.com/tmm)! - bump dependencies #429\n  add imToken support for WC switch chains #432\n  fix MetaMask and Brave Wallet collision #436\n\n## 0.2.4\n\n### Patch Changes\n\n- [#421](https://github.com/tmm/wagmi/pull/421) [`a232b3f`](https://github.com/tmm/wagmi/commit/a232b3ff5cc41e882c4d2a34c599a8cb670edd2b) Thanks [@tmm](https://github.com/tmm)! - fix erc721 abi\n\n## 0.2.3\n\n### Patch Changes\n\n- [#412](https://github.com/tmm/wagmi/pull/412) [`80bef4f`](https://github.com/tmm/wagmi/commit/80bef4ff3f714b0b8f896f1b4b658acc7266299b) Thanks [@markdalgleish](https://github.com/markdalgleish)! - Import providers from `ethers` peer dependency rather than `@ethersproject/providers` to avoid multiple conflicting versions being installed\n\n## 0.2.2\n\n### Patch Changes\n\n- [`018c2a1`](https://github.com/tmm/wagmi/commit/018c2a11b22ee513571cc7f83fd63f7eb169ee70) Thanks [@tmm](https://github.com/tmm)! - - warn and fallback to default client #380\n\n  - remove signerOrProvider option from read contract #390\n\n  - MetaMaskConnector #391\n\n## 0.2.1\n\n### Patch Changes\n\n- [`afc4607`](https://github.com/tmm/wagmi/commit/afc46071e91601ab8a2b465524da796cd60b6ad4) Thanks [@tmm](https://github.com/tmm)! - - Fix time scaling e9593df\n  - Use fully-specified path for use-sync-external-store import 7b235c1\n  - Update serialize 236fc17\n\n## 0.2.0\n\n### Minor Changes\n\n- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - don't persist account data when `autoConnect` is falsy\n\n* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - - fix(@wagmi/core): persist connector chains to local storage\n\n- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - - Favour `message` event over `connecting` event to conform to EIP-1193\n  - Export `useWaitForTransaction`\n\n* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - Initial 0.3.0 release\n\n- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - Add `cacheOnBlock` config for `useContractRead`\n  Update `react-query` to v4\n  Fix `watchBlockNumber` listener leak\n\n* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - add `connecting` event to connectors\n\n- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - Fix issue where `getProvider` was not being awaited in `getSigner`\n\n* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - - remove storage persistence of `connector`\n  - add `chains` to client state\n\n### Patch Changes\n\n- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - add chainId to actions and hooks\n\n* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - showtime\n\n- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - improve type support for ethers providers\n\n* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - update zustand\n\n- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - update babel target\n\n* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - update block explorers and rpc urls structure\n\n- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - keep previous data when watching\n\n* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - republish\n\n- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - fix stale connectors when switching chains\n\n* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - last beta\n\n## 0.2.0-next.18\n\n### Patch Changes\n\n- showtime\n\n## 0.2.0-next.17\n\n### Patch Changes\n\n- update block explorers and rpc urls structure\n\n## 0.2.0-next.16\n\n### Patch Changes\n\n- last beta\n\n## 0.2.0-next.15\n\n### Patch Changes\n\n- update zustand\n\n## 0.2.0-next.14\n\n### Minor Changes\n\n- Add `cacheOnBlock` config for `useContractRead`\n- Update `react-query` to v4\n- Fix `watchBlockNumber` listener leak\n\n## 0.2.0-next.13\n\n### Patch Changes\n\n- keep previous data when watching\n\n## 0.2.0-next.12\n\n### Patch Changes\n\n- add chainId to actions and hooks\n\n## 0.2.0-next.11\n\n### Patch Changes\n\n- fix stale connectors when switching chains\n\n## 0.2.0-next.10\n\n### Patch Changes\n\n- republish\n\n## 0.2.0-next.9\n\n### Patch Changes\n\n- improve type support for ethers providers\n\n## 0.2.0-next.8\n\n### Patch Changes\n\n- update babel target\n\n## 0.2.0-next.7\n\n### Minor Changes\n\n- - Favour `message` event over `connecting` event to conform to EIP-1193\n  - Export `useWaitForTransaction`\n\n## 0.2.0-next.6\n\n### Minor Changes\n\n- add `connecting` event to connectors\n\n## 0.2.0-next.5\n\n### Minor Changes\n\n- don't persist account data when `autoConnect` is falsy\n\n## 0.2.0-next.4\n\n### Minor Changes\n\n- remove storage persistence of `connector`\n- add `chains` to client state\n\n## 0.2.0-next.3\n\n### Minor Changes\n\n- Fix issue where `getProvider` was not being awaited in `getSigner`\n\n## 0.2.0-next.2\n\n### Minor Changes\n\n- fix: persist connector chains to local storage\n\n## 0.2.0-next.1\n\n### Minor Changes\n\n- Initial 0.3.0 release\n\n## 0.1.22\n\n### Patch Changes\n\n- [`747d895`](https://github.com/tmm/wagmi/commit/747d895a54b562958afde34b1d34e81ab5039e2c) Thanks [@tmm](https://github.com/tmm)! - add warning to WalletLinkConnector\n\n## 0.1.21\n\n### Patch Changes\n\n- [`c858c51`](https://github.com/tmm/wagmi/commit/c858c51b44d9039f1d0db5bcf016639f47d1931f) Thanks [@tmm](https://github.com/tmm)! - update coinbase connector\n\n## 0.1.20\n\n### Patch Changes\n\n- [#326](https://github.com/tmm/wagmi/pull/326) [`36e6989`](https://github.com/tmm/wagmi/commit/36e69894f4c27aaad7fb6d678476c8bb870244bb) Thanks [@0xGabi](https://github.com/0xGabi)! - Add Gnosis Chain\n\n## 0.1.19\n\n### Patch Changes\n\n- [`d467df6`](https://github.com/tmm/wagmi/commit/d467df6374210dbc4b016788b4beb4fded54cb4d) Thanks [@tmm](https://github.com/tmm)! - fix global type leaking\n\n## 0.1.18\n\n### Patch Changes\n\n- [#294](https://github.com/tmm/wagmi/pull/294) [`1d253f3`](https://github.com/tmm/wagmi/commit/1d253f3a59b61d24c88d25c99decd84a6c734e5d) Thanks [@tmm](https://github.com/tmm)! - change babel target\n\n## 0.1.17\n\n### Patch Changes\n\n- [#292](https://github.com/tmm/wagmi/pull/292) [`53c9be1`](https://github.com/tmm/wagmi/commit/53c9be17ee0c2ae6b8f34f2351b8858257b3f5f2) Thanks [@tmm](https://github.com/tmm)! - fix private fields\n\n## 0.1.16\n\n### Patch Changes\n\n- [`79a2499`](https://github.com/tmm/wagmi/commit/79a249989029f818c32c0e84c0dd2c75e8aa990a) Thanks [@tmm](https://github.com/tmm)! - update build target to es2021\n\n## 0.1.15\n\n### Patch Changes\n\n- [`f9790b5`](https://github.com/tmm/wagmi/commit/f9790b55600df09c77bb8ca349c5a3457df1b07c) Thanks [@tmm](https://github.com/tmm)! - fix WalletConnect issue\n\n## 0.1.14\n\n### Patch Changes\n\n- [#236](https://github.com/tmm/wagmi/pull/236) [`53bad61`](https://github.com/tmm/wagmi/commit/53bad615788764e31121678083c382c1bd042fe8) Thanks [@markdalgleish](https://github.com/markdalgleish)! - Updated `@walletconnect/ethereum-provider` to [v1.7.4](https://github.com/WalletConnect/walletconnect-monorepo/releases/tag/1.7.4)\n\n## 0.1.13\n\n### Patch Changes\n\n- [`8e9412a`](https://github.com/tmm/wagmi/commit/8e9412af71958301ae2f9748febb936e79900aa0) Thanks [@tmm](https://github.com/tmm)! - bump walletlink\n\n## 0.1.12\n\n### Patch Changes\n\n- [#210](https://github.com/tmm/wagmi/pull/210) [`684468a`](https://github.com/tmm/wagmi/commit/684468aee3e42a1ce2b4b599f3f17d1819213de8) Thanks [@tmm](https://github.com/tmm)! - update chains to match chainslist.org\n\n## 0.1.11\n\n### Patch Changes\n\n- [#195](https://github.com/tmm/wagmi/pull/195) [`25b6083`](https://github.com/tmm/wagmi/commit/25b6083a662a0236794d1765343467691421c14b) Thanks [@tmm](https://github.com/tmm)! - rename wagmi-private to wagmi-core\n\n## 0.1.10\n\n### Patch Changes\n\n- [#192](https://github.com/tmm/wagmi/pull/192) [`428cedb`](https://github.com/tmm/wagmi/commit/428cedb3dec4e3e4b9f4559c8e65932e05f94e05) Thanks [@tmm](https://github.com/tmm)! - rename core and testing packages\n\n## 0.1.9\n\n### Patch Changes\n\n- [#190](https://github.com/tmm/wagmi/pull/190) [`7034bb8`](https://github.com/tmm/wagmi/commit/7034bb868412b9f481b206371280e84c2d52706d) Thanks [@tmm](https://github.com/tmm)! - add shim for metamask chain changed to prevent disconnect\n\n## 0.1.8\n\n### Patch Changes\n\n- [#137](https://github.com/tmm/wagmi/pull/137) [`dceeb43`](https://github.com/tmm/wagmi/commit/dceeb430d9021fbf98366859cb1cd0149e80c55c) Thanks [@tmm](https://github.com/tmm)! - add siwe guide\n\n## 0.1.7\n\n### Patch Changes\n\n- [#127](https://github.com/tmm/wagmi/pull/127) [`f05b031`](https://github.com/tmm/wagmi/commit/f05b0310f7f7e6447e9b6c81cedbb27dcf2f3649) Thanks [@tmm](https://github.com/tmm)! - update switch chain return type\n\n## 0.1.6\n\n### Patch Changes\n\n- [`1412eed`](https://github.com/tmm/wagmi/commit/1412eed0d1494bb4f8c6845a0e890f79e4e68e03) Thanks [@tmm](https://github.com/tmm)! - add frame to injected\n\n## 0.1.5\n\n### Patch Changes\n\n- [`e338c3b`](https://github.com/tmm/wagmi/commit/e338c3b6cc255742be6a67593aa5da6c17e90fbd) Thanks [@tmm](https://github.com/tmm)! - checksum connector address on change events\n\n  add shim to injected connector for simulating disconnect\n\n## 0.1.4\n\n### Patch Changes\n\n- [`0176c4e`](https://github.com/tmm/wagmi/commit/0176c4e83fb0c5f159c3c802a1da3d6deb2184ae) Thanks [@tmm](https://github.com/tmm)! - added switchChain to WalletConnect and WalletLink connectors\n\n## 0.1.3\n\n### Patch Changes\n\n- [`071d7fb`](https://github.com/tmm/wagmi/commit/071d7fbca35ec4832700b5343661ceb2dae20598) Thanks [@tmm](https://github.com/tmm)! - add hardhat chain\n\n## 0.1.2\n\n### Patch Changes\n\n- [`78bade9`](https://github.com/tmm/wagmi/commit/78bade9d0da97ab38a7e6594c34e3841ec1c8fe6) Thanks [@tmm](https://github.com/tmm)! - add type definitions\n\n## 0.1.1\n\n### Patch Changes\n\n- [#56](https://github.com/tmm/wagmi/pull/56) [`2ebfd8e`](https://github.com/tmm/wagmi/commit/2ebfd8e85b560f25cd46cff04619c84643cab297) Thanks [@tmm](https://github.com/tmm)! - add chain support status\n\n## 0.1.0\n\n### Minor Changes\n\n- [#52](https://github.com/tmm/wagmi/pull/52) [`da7a3a6`](https://github.com/tmm/wagmi/commit/da7a3a615def2443f65c041999100ce35e9774cc) Thanks [@tmm](https://github.com/tmm)! - Moves connectors to their own entrypoints to reduce bundle size.\n\n  ```ts\n  // old - WalletLinkConnector unused, but still in final bundle\n  import { InjectedConnector, WalletConnectConnector } from \"wagmi\";\n\n  // new - WalletLinkConnector not in final bundle\n  import { InjectedConnector } from \"wagmi/connectors/injected\";\n  import { WalletConnectConnector } from \"wagmi/connectors/walletConnect\";\n  ```\n\n## 0.0.17\n\n### Patch Changes\n\n- [#25](https://github.com/tmm/wagmi/pull/25) [`9a7dab7`](https://github.com/tmm/wagmi/commit/9a7dab78b3518658bc7d85dc397990f0d28da175) Thanks [@tmm](https://github.com/tmm)! - update response types\n\n## 0.0.16\n\n### Patch Changes\n\n- [`d1574cf`](https://github.com/tmm/wagmi/commit/d1574cf5f7a578ccd480889c2e375134145a4aba) Thanks [@tmm](https://github.com/tmm)! - add better type information for contract results\n\n## 0.0.15\n\n### Patch Changes\n\n- [`3909624`](https://github.com/tmm/wagmi/commit/39096249c1fa9516beabb11735beb67c94032879) Thanks [@tmm](https://github.com/tmm)! - make contract read and write execute overrides param optional\n\n## 0.0.14\n\n### Patch Changes\n\n- [`63312e2`](https://github.com/tmm/wagmi/commit/63312e2b06b8d835abc2908cba399d941ca79408) Thanks [@tmm](https://github.com/tmm)! - add once to contract event\n\n## 0.0.13\n\n### Patch Changes\n\n- [`6f890b0`](https://github.com/tmm/wagmi/commit/6f890b0dabbdbea913ec91cb8bfc970c05ed0a93) Thanks [@tmm](https://github.com/tmm)! - update readme\n\n## 0.0.12\n\n### Patch Changes\n\n- [#19](https://github.com/tmm/wagmi/pull/19) [`7bc1c47`](https://github.com/tmm/wagmi/commit/7bc1c47875e9ef24e9c79cfafc6b23e7a838b5bc) Thanks [@tmm](https://github.com/tmm)! - remove console log from walletlink connector\n\n## 0.0.11\n\n### Patch Changes\n\n- [#17](https://github.com/tmm/wagmi/pull/17) [`571648b`](https://github.com/tmm/wagmi/commit/571648b754f7f538536bafc9387bd3104657ea49) Thanks [@tmm](https://github.com/tmm)! - standardize connector provider\n\n## 0.0.10\n\n### Patch Changes\n\n- [#15](https://github.com/tmm/wagmi/pull/15) [`5f7675c`](https://github.com/tmm/wagmi/commit/5f7675c3ffd848522d4117c07c1f62b17dfc6616) Thanks [@tmm](https://github.com/tmm)! - read and write contract functions\n\n## 0.0.9\n\n### Patch Changes\n\n- [#13](https://github.com/tmm/wagmi/pull/13) [`e5545f5`](https://github.com/tmm/wagmi/commit/e5545f5565cf0bbf5e62ec7ccab3051705b1d313) Thanks [@tmm](https://github.com/tmm)! - add testing package\n\n## 0.0.8\n\n### Patch Changes\n\n- [`5332500`](https://github.com/tmm/wagmi/commit/5332500918ac240d29ffe4d2aed8566a8ac001e4) Thanks [@tmm](https://github.com/tmm)! - update signing\n\n## 0.0.7\n\n### Patch Changes\n\n- [`0bff89a`](https://github.com/tmm/wagmi/commit/0bff89ab2ad28b2cb9b346d1ac870e859d9278bc) Thanks [@tmm](https://github.com/tmm)! - update injected connector\n\n## 0.0.6\n\n### Patch Changes\n\n- [`37d39d1`](https://github.com/tmm/wagmi/commit/37d39d174ddfa122462bbe2d02141cd61eb9db4a) Thanks [@tmm](https://github.com/tmm)! - add message signing\n\n## 0.0.5\n\n### Patch Changes\n\n- [`d7d94f0`](https://github.com/tmm/wagmi/commit/d7d94f06f7d30468e5e39d64db63124c6315cf82) Thanks [@tmm](https://github.com/tmm)! - fix injected connector name\n\n## 0.0.4\n\n### Patch Changes\n\n- [`29fbe29`](https://github.com/tmm/wagmi/commit/29fbe2920046b9e87a34faa04500ccf3c4f83748) Thanks [@tmm](https://github.com/tmm)! - fix external deps\n\n## 0.0.3\n\n### Patch Changes\n\n- [#6](https://github.com/tmm/wagmi/pull/6) [`8dc3a5d`](https://github.com/tmm/wagmi/commit/8dc3a5d5f418813b09663534fe585d9bcf94dbeb) Thanks [@tmm](https://github.com/tmm)! - clean up deps\n\n## 0.0.2\n\n### Patch Changes\n\n- [#4](https://github.com/tmm/wagmi/pull/4) [`2fbd821`](https://github.com/tmm/wagmi/commit/2fbd8216379bd03c9cc5c06b10b75637e75cb7d8) Thanks [@tmm](https://github.com/tmm)! - init changesets\n"
  },
  {
    "path": "packages/core/README.md",
    "content": "# @wagmi/core\n\nVanillaJS library for Ethereum\n\n## Installation\n\n```bash\npnpm add @wagmi/core viem\n```\n\n## Documentation\n\nFor documentation and guides, visit [wagmi.sh](https://wagmi.sh).\n"
  },
  {
    "path": "packages/core/package.json",
    "content": "{\n  \"name\": \"@wagmi/core\",\n  \"description\": \"VanillaJS library for Ethereum\",\n  \"version\": \"3.4.0\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/wevm/wagmi.git\",\n    \"directory\": \"packages/core\"\n  },\n  \"scripts\": {\n    \"build\": \"pnpm run build:esm+types\",\n    \"build:esm+types\": \"tsc --project tsconfig.build.json --outDir ./dist/esm --declaration --declarationMap --declarationDir ./dist/types\",\n    \"check:types\": \"tsc --noEmit\",\n    \"clean\": \"rm -rf dist tsconfig.tsbuildinfo actions chains codegen internal query tempo\",\n    \"test:build\": \"publint --strict && attw --pack --ignore-rules cjs-resolves-to-esm\"\n  },\n  \"files\": [\n    \"dist/**\",\n    \"!dist/**/*.tsbuildinfo\",\n    \"src/**/*.ts\",\n    \"!src/**/*.test.ts\",\n    \"!src/**/*.test-d.ts\",\n    \"/actions\",\n    \"/chains\",\n    \"/internal\",\n    \"/query\",\n    \"/tempo\"\n  ],\n  \"sideEffects\": false,\n  \"type\": \"module\",\n  \"main\": \"./dist/esm/exports/index.js\",\n  \"types\": \"./dist/types/exports/index.d.ts\",\n  \"typings\": \"./dist/types/exports/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/types/exports/index.d.ts\",\n      \"default\": \"./dist/esm/exports/index.js\"\n    },\n    \"./actions\": {\n      \"types\": \"./dist/types/exports/actions.d.ts\",\n      \"default\": \"./dist/esm/exports/actions.js\"\n    },\n    \"./chains\": {\n      \"types\": \"./dist/types/exports/chains.d.ts\",\n      \"default\": \"./dist/esm/exports/chains.js\"\n    },\n    \"./codegen\": {\n      \"types\": \"./dist/types/exports/codegen.d.ts\",\n      \"default\": \"./dist/esm/exports/codegen.js\"\n    },\n    \"./internal\": {\n      \"types\": \"./dist/types/exports/internal.d.ts\",\n      \"default\": \"./dist/esm/exports/internal.js\"\n    },\n    \"./query\": {\n      \"types\": \"./dist/types/exports/query.d.ts\",\n      \"default\": \"./dist/esm/exports/query.js\"\n    },\n    \"./tempo\": {\n      \"types\": \"./dist/types/exports/tempo.d.ts\",\n      \"default\": \"./dist/esm/exports/tempo.js\"\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"typesVersions\": {\n    \"*\": {\n      \"actions\": [\n        \"./dist/types/exports/actions.d.ts\"\n      ],\n      \"chains\": [\n        \"./dist/types/exports/chains.d.ts\"\n      ],\n      \"codegen\": [\n        \"./dist/types/exports/codegen.d.ts\"\n      ],\n      \"internal\": [\n        \"./dist/types/exports/internal.d.ts\"\n      ],\n      \"query\": [\n        \"./dist/types/exports/query.d.ts\"\n      ],\n      \"tempo\": [\n        \"./dist/types/exports/tempo.d.ts\"\n      ]\n    }\n  },\n  \"peerDependencies\": {\n    \"@tanstack/query-core\": \">=5.0.0\",\n    \"ox\": \">=0.11.1\",\n    \"typescript\": \">=5.7.3\",\n    \"viem\": \"2.x\"\n  },\n  \"peerDependenciesMeta\": {\n    \"@tanstack/query-core\": {\n      \"optional\": true\n    },\n    \"ox\": {\n      \"optional\": true\n    },\n    \"typescript\": {\n      \"optional\": true\n    }\n  },\n  \"dependencies\": {\n    \"eventemitter3\": \"5.0.1\",\n    \"mipd\": \"0.0.7\",\n    \"zustand\": \"5.0.0\"\n  },\n  \"devDependencies\": {\n    \"@tanstack/query-core\": \"catalog:\",\n    \"ox\": \"catalog:\"\n  },\n  \"contributors\": [\n    \"awkweb.eth <t@wevm.dev>\",\n    \"jxom.eth <j@wevm.dev>\"\n  ],\n  \"funding\": \"https://github.com/sponsors/wevm\",\n  \"keywords\": [\n    \"wagmi\",\n    \"eth\",\n    \"ethereum\",\n    \"dapps\",\n    \"wallet\",\n    \"web3\"\n  ]\n}\n"
  },
  {
    "path": "packages/core/src/actions/call.test.ts",
    "content": "import { accounts, address, config } from '@wagmi/test'\nimport { parseEther, parseGwei } from 'viem'\nimport { expect, test } from 'vitest'\n\nimport { call } from './call.js'\n\nconst name4bytes = '0x06fdde03'\nconst mint4bytes = '0x1249c58b'\nconst mintWithParams4bytes = '0xa0712d68'\nconst fourTwenty =\n  '00000000000000000000000000000000000000000000000000000000000001a4'\n\nconst account = accounts[0]\n\ntest('default', async () => {\n  await expect(\n    call(config, {\n      account,\n      data: name4bytes,\n      to: address.wagmiMintExample,\n    }),\n  ).resolves.toMatchInlineSnapshot(`\n  {\n    \"data\": \"0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000057761676d69000000000000000000000000000000000000000000000000000000\",\n  }\n  `)\n})\n\ntest('zero data', async () => {\n  await expect(\n    call(config, {\n      account,\n      data: mint4bytes,\n      to: address.wagmiMintExample,\n    }),\n  ).resolves.toMatchInlineSnapshot(`\n  {\n    \"data\": undefined,\n  }\n  `)\n})\n\n// TODO: Re-enable\ntest.skip('parameters: blockNumber', async () => {\n  await expect(\n    call(config, {\n      account,\n      data: name4bytes,\n      to: address.wagmiMintExample,\n      blockNumber: 16280770n,\n    }),\n  ).resolves.toMatchInlineSnapshot(`\n  {\n    \"data\": \"0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000057761676d69000000000000000000000000000000000000000000000000000000\",\n  }\n  `)\n})\n\ntest('insufficient funds', async () => {\n  await expect(\n    call(config, {\n      account,\n      to: accounts[1],\n      value: parseEther('100000'),\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [CallExecutionError: The total cost (gas * gas fee + value) of executing this transaction exceeds the balance of the account.\n\n    This error could arise when the account does not have enough funds to:\n     - pay for the total gas fee,\n     - pay for the value to send.\n     \n    The cost of the transaction is calculated as \\`gas * gas fee + value\\`, where:\n     - \\`gas\\` is the amount of gas needed for transaction to execute,\n     - \\`gas fee\\` is the gas fee,\n     - \\`value\\` is the amount of ether to send to the recipient.\n     \n    Raw Call Arguments:\n      from:   0x95132632579b073D12a6673e18Ab05777a6B86f8\n      to:     0x1D5D7e139A994CeE7f360be398Ef032fE5D74fce\n      value:  100000 ETH\n\n    Details: Insufficient funds for gas * price + value\n    Version: viem@2.47.5]\n  `)\n})\n\ntest('maxFeePerGas less than maxPriorityFeePerGas', async () => {\n  await expect(\n    call(config, {\n      account,\n      data: name4bytes,\n      to: address.wagmiMintExample,\n      maxFeePerGas: parseGwei('20'),\n      maxPriorityFeePerGas: parseGwei('22'),\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [CallExecutionError: The provided tip (\\`maxPriorityFeePerGas\\` = 22 gwei) cannot be higher than the fee cap (\\`maxFeePerGas\\` = 20 gwei).\n\n    Raw Call Arguments:\n      from:                  0x95132632579b073D12a6673e18Ab05777a6B86f8\n      to:                    0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\n      data:                  0x06fdde03\n      maxFeePerGas:          20 gwei\n      maxPriorityFeePerGas:  22 gwei\n\n    Version: viem@2.47.5]\n  `)\n})\n\ntest('contract revert (contract error)', async () => {\n  await expect(\n    call(config, {\n      account,\n      data: `${mintWithParams4bytes}${fourTwenty}`,\n      to: address.wagmiMintExample,\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [CallExecutionError: Execution reverted with reason: Token ID is taken.\n\n    Raw Call Arguments:\n      from:  0x95132632579b073D12a6673e18Ab05777a6B86f8\n      to:    0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\n      data:  0xa0712d6800000000000000000000000000000000000000000000000000000000000001a4\n\n    Details: execution reverted: Token ID is taken\n    Version: viem@2.47.5]\n  `)\n})\n\ntest('contract revert (insufficient params)', async () => {\n  await expect(\n    call(config, {\n      account,\n      data: mintWithParams4bytes,\n      to: address.wagmiMintExample,\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [CallExecutionError: Execution reverted for an unknown reason.\n\n    Raw Call Arguments:\n      from:  0x95132632579b073D12a6673e18Ab05777a6B86f8\n      to:    0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\n      data:  0xa0712d68\n\n    Details: execution reverted\n    Version: viem@2.47.5]\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/actions/call.ts",
    "content": "import type {\n  CallErrorType as viem_CallErrorType,\n  CallParameters as viem_CallParameters,\n  CallReturnType as viem_CallReturnType,\n} from 'viem'\nimport { call as viem_call } from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type CallParameters<config extends Config = Config> =\n  viem_CallParameters & ChainIdParameter<config>\n\nexport type CallReturnType = viem_CallReturnType\n\nexport type CallErrorType = viem_CallErrorType\n\nexport async function call<config extends Config>(\n  config: config,\n  parameters: CallParameters<config>,\n): Promise<CallReturnType> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  const action = getAction(client, viem_call, 'call')\n  return action(rest)\n}\n"
  },
  {
    "path": "packages/core/src/actions/codegen/createReadContract.test-d.ts",
    "content": "import { abi, config, mainnet, optimism } from '@wagmi/test'\nimport { assertType, expectTypeOf, test } from 'vitest'\n\nimport { createReadContract } from './createReadContract.js'\n\ntest('default', async () => {\n  const readErc20 = createReadContract({\n    abi: abi.erc20,\n    address: '0x',\n  })\n\n  const result = await readErc20(config, {\n    functionName: 'balanceOf',\n    args: ['0x'],\n    chainId: 1,\n  })\n  expectTypeOf(result).toEqualTypeOf<bigint>()\n})\n\ntest('multichain address', async () => {\n  const readErc20 = createReadContract({\n    abi: abi.erc20,\n    address: {\n      [mainnet.id]: '0x',\n      [optimism.id]: '0x',\n    },\n  })\n\n  const result = await readErc20(config, {\n    functionName: 'balanceOf',\n    args: ['0x'],\n    chainId: mainnet.id,\n    // ^?\n  })\n  assertType<bigint>(result)\n\n  readErc20(config, {\n    functionName: 'balanceOf',\n    args: ['0x'],\n    // @ts-expect-error chain id must match address keys\n    chainId: 420,\n  })\n\n  readErc20(config, {\n    functionName: 'balanceOf',\n    args: ['0x'],\n    // @ts-expect-error address not allowed\n    address: '0x',\n  })\n})\n\ntest('overloads', async () => {\n  const readViewOverloads = createReadContract({\n    abi: abi.viewOverloads,\n    address: '0x',\n  })\n\n  const result1 = await readViewOverloads(config, {\n    functionName: 'foo',\n  })\n  assertType<number>(result1)\n\n  const result2 = await readViewOverloads(config, {\n    functionName: 'foo',\n    args: [],\n  })\n  assertType<number>(result2)\n\n  const result3 = await readViewOverloads(config, {\n    functionName: 'foo',\n    args: ['0x'],\n  })\n  // @ts-ignore – TODO: Fix https://github.com/wevm/viem/issues/1916\n  assertType<string>(result3)\n\n  const result4 = await readViewOverloads(config, {\n    functionName: 'foo',\n    args: ['0x', '0x'],\n  })\n  assertType<{\n    foo: `0x${string}`\n    bar: `0x${string}`\n    // @ts-ignore – TODO: Fix https://github.com/wevm/viem/issues/1916\n  }>(result4)\n})\n\ntest('functionName', async () => {\n  const readErc20BalanceOf = createReadContract({\n    abi: abi.erc20,\n    address: '0x',\n    functionName: 'balanceOf',\n  })\n\n  const result = await readErc20BalanceOf(config, {\n    args: ['0x'],\n    chainId: 1,\n  })\n  expectTypeOf(result).toEqualTypeOf<bigint>()\n})\n\ntest('functionName with overloads', async () => {\n  const readViewOverloads = createReadContract({\n    abi: abi.viewOverloads,\n    address: '0x',\n    functionName: 'foo',\n  })\n\n  const result1 = await readViewOverloads(config, {})\n  assertType<number>(result1)\n\n  const result2 = await readViewOverloads(config, {\n    args: [],\n  })\n  assertType<number>(result2)\n\n  const result3 = await readViewOverloads(config, {\n    args: ['0x'],\n  })\n  // @ts-ignore – TODO: Fix https://github.com/wevm/viem/issues/1916\n  assertType<string>(result3)\n\n  const result4 = await readViewOverloads(config, {\n    args: ['0x', '0x'],\n  })\n  assertType<{\n    foo: `0x${string}`\n    bar: `0x${string}`\n    // @ts-ignore – TODO: Fix https://github.com/wevm/viem/issues/1916\n  }>(result4)\n})\n"
  },
  {
    "path": "packages/core/src/actions/codegen/createReadContract.test.ts",
    "content": "import { abi, address, chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { createReadContract } from './createReadContract.js'\n\ntest('default', async () => {\n  const readWagmiMintExample = createReadContract({\n    address: address.wagmiMintExample,\n    abi: abi.wagmiMintExample,\n  })\n\n  await expect(\n    readWagmiMintExample(config, {\n      functionName: 'balanceOf',\n      args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n    }),\n  ).resolves.toMatchInlineSnapshot('10n')\n})\n\ntest('multichain', async () => {\n  const readWagmiMintExample = createReadContract({\n    address: {\n      [chain.mainnet.id]: address.wagmiMintExample,\n      [chain.mainnet2.id]: address.wagmiMintExample,\n    },\n    abi: abi.wagmiMintExample,\n  })\n\n  await expect(\n    readWagmiMintExample(config, {\n      functionName: 'balanceOf',\n      args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n      chainId: chain.mainnet2.id,\n    }),\n  ).resolves.toMatchInlineSnapshot('10n')\n})\n\ntest('functionName', async () => {\n  const readWagmiMintExampleBalanceOf = createReadContract({\n    address: address.wagmiMintExample,\n    abi: abi.wagmiMintExample,\n    functionName: 'balanceOf',\n  })\n\n  await expect(\n    readWagmiMintExampleBalanceOf(config, {\n      args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n    }),\n  ).resolves.toMatchInlineSnapshot('10n')\n})\n"
  },
  {
    "path": "packages/core/src/actions/codegen/createReadContract.ts",
    "content": "import type {\n  Abi,\n  Address,\n  ContractFunctionArgs,\n  ContractFunctionName,\n} from 'viem'\n\nimport type { Config } from '../../createConfig.js'\nimport type { UnionCompute, UnionStrictOmit } from '../../types/utils.js'\nimport { getChainId } from '../getChainId.js'\nimport {\n  type ReadContractParameters,\n  type ReadContractReturnType,\n  readContract,\n} from '../readContract.js'\n\ntype stateMutability = 'pure' | 'view'\n\nexport type CreateReadContractParameters<\n  abi extends Abi | readonly unknown[],\n  address extends Address | Record<number, Address> | undefined = undefined,\n  functionName extends\n    | ContractFunctionName<abi, stateMutability>\n    | undefined = undefined,\n> = {\n  abi: abi | Abi | readonly unknown[]\n  address?: address | Address | Record<number, Address> | undefined\n  functionName?:\n    | functionName\n    | ContractFunctionName<abi, stateMutability>\n    | undefined\n}\n\nexport type CreateReadContractReturnType<\n  abi extends Abi | readonly unknown[],\n  address extends Address | Record<number, Address> | undefined,\n  functionName extends ContractFunctionName<abi, stateMutability> | undefined,\n  ///\n  omittedProperties extends 'abi' | 'address' | 'chainId' | 'functionName' =\n    | 'abi'\n    | (address extends undefined ? never : 'address')\n    | (address extends Record<number, Address> ? 'chainId' : never)\n    | (functionName extends undefined ? never : 'functionName'),\n> = <\n  config extends Config,\n  name extends functionName extends ContractFunctionName<abi, stateMutability>\n    ? functionName\n    : ContractFunctionName<abi, stateMutability>,\n  args extends ContractFunctionArgs<abi, stateMutability, name>,\n>(\n  config: config,\n  parameters: UnionCompute<\n    UnionStrictOmit<\n      ReadContractParameters<abi, name, args, config>,\n      omittedProperties\n    >\n  > &\n    (address extends Record<number, Address>\n      ? { chainId?: keyof address | undefined }\n      : unknown),\n) => Promise<ReadContractReturnType<abi, name, args>>\n\nexport function createReadContract<\n  const abi extends Abi | readonly unknown[],\n  const address extends\n    | Address\n    | Record<number, Address>\n    | undefined = undefined,\n  functionName extends\n    | ContractFunctionName<abi, stateMutability>\n    | undefined = undefined,\n>(\n  c: CreateReadContractParameters<abi, address, functionName>,\n): CreateReadContractReturnType<abi, address, functionName> {\n  if (c.address !== undefined && typeof c.address === 'object')\n    return (config, parameters) => {\n      const configChainId = getChainId(config)\n      const chainId =\n        (parameters as { chainId?: number })?.chainId ?? configChainId\n      return readContract(config, {\n        ...(parameters as any),\n        ...(c.functionName ? { functionName: c.functionName } : {}),\n        address: c.address?.[chainId],\n        abi: c.abi,\n      })\n    }\n\n  return (config, parameters) => {\n    return readContract(config, {\n      ...(parameters as any),\n      ...(c.address ? { address: c.address } : {}),\n      ...(c.functionName ? { functionName: c.functionName } : {}),\n      abi: c.abi,\n    })\n  }\n}\n"
  },
  {
    "path": "packages/core/src/actions/codegen/createSimulateContract.test-d.ts",
    "content": "import { abi, config, mainnet, optimism } from '@wagmi/test'\nimport { type Address, http } from 'viem'\nimport { celo } from 'viem/chains'\nimport { assertType, expectTypeOf, test } from 'vitest'\n\nimport { createConfig } from '../../createConfig.js'\nimport { createSimulateContract } from './createSimulateContract.js'\n\ntest('default', async () => {\n  const simulateErc20 = createSimulateContract({\n    abi: abi.erc20,\n    address: '0x',\n  })\n\n  const result = await simulateErc20(config, {\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    chainId: 1,\n  })\n\n  expectTypeOf(result).toMatchTypeOf<{\n    result: boolean\n    request: {\n      chainId: 1\n      abi: readonly [\n        {\n          readonly name: 'transferFrom'\n          readonly type: 'function'\n          readonly stateMutability: 'nonpayable'\n          readonly inputs: readonly [\n            { readonly type: 'address'; readonly name: 'sender' },\n            { readonly type: 'address'; readonly name: 'recipient' },\n            { readonly type: 'uint256'; readonly name: 'amount' },\n          ]\n          readonly outputs: readonly [{ type: 'bool' }]\n        },\n      ]\n      functionName: 'transferFrom'\n      args: readonly [Address, Address, bigint]\n    }\n  }>()\n})\n\ntest('multichain address', async () => {\n  const simulateErc20 = createSimulateContract({\n    abi: abi.erc20,\n    address: {\n      [mainnet.id]: '0x',\n      [optimism.id]: '0x',\n    },\n  })\n\n  const result = await simulateErc20(config, {\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    chainId: optimism.id,\n  })\n  expectTypeOf(result.result).toEqualTypeOf<boolean>()\n\n  simulateErc20(config, {\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    // @ts-expect-error chain id must match address keys\n    chainId: 420,\n  })\n\n  simulateErc20(config, {\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    // @ts-expect-error address not allowed\n    address: '0x',\n  })\n})\n\ntest('overloads', async () => {\n  const simulateWriteOverloads = createSimulateContract({\n    abi: abi.writeOverloads,\n    address: '0x',\n  })\n\n  const result1 = await simulateWriteOverloads(config, {\n    functionName: 'foo',\n  })\n  assertType<number | undefined>(result1.result)\n\n  const result2 = await simulateWriteOverloads(config, {\n    functionName: 'foo',\n    args: [],\n  })\n  assertType<number | undefined>(result2.result)\n\n  const result3 = await simulateWriteOverloads(config, {\n    functionName: 'foo',\n    args: ['0x'],\n  })\n  // @ts-ignore – TODO: Fix https://github.com/wevm/viem/issues/1916\n  assertType<string | undefined>(result3.result)\n\n  const result4 = await simulateWriteOverloads(config, {\n    functionName: 'foo',\n    args: ['0x', '0x'],\n  })\n  assertType<\n    | {\n        foo: `0x${string}`\n        bar: `0x${string}`\n      }\n    | undefined\n    // @ts-ignore – TODO: Fix https://github.com/wevm/viem/issues/1916\n  >(result4.result)\n})\n\ntest('functionName', async () => {\n  const simulateErc20 = createSimulateContract({\n    abi: abi.erc20,\n    address: '0x',\n    functionName: 'transferFrom',\n  })\n\n  const result = await simulateErc20(config, {\n    args: ['0x', '0x', 123n],\n    chainId: 1,\n  })\n\n  expectTypeOf(result).toMatchTypeOf<{\n    result: boolean\n    request: {\n      chainId: 1\n      abi: readonly [\n        {\n          readonly name: 'transferFrom'\n          readonly type: 'function'\n          readonly stateMutability: 'nonpayable'\n          readonly inputs: readonly [\n            { readonly type: 'address'; readonly name: 'sender' },\n            { readonly type: 'address'; readonly name: 'recipient' },\n            { readonly type: 'uint256'; readonly name: 'amount' },\n          ]\n          readonly outputs: readonly [{ type: 'bool' }]\n        },\n      ]\n      functionName: 'transferFrom'\n      args: readonly [Address, Address, bigint]\n    }\n  }>()\n})\n\ntest('functionName with overloads', async () => {\n  const simulateWriteOverloads = createSimulateContract({\n    abi: abi.writeOverloads,\n    address: '0x',\n    functionName: 'foo',\n  })\n\n  const result1 = await simulateWriteOverloads(config, {})\n  assertType<number | undefined>(result1.result)\n\n  const result2 = await simulateWriteOverloads(config, {\n    args: [],\n  })\n  assertType<number | undefined>(result2.result)\n\n  const result3 = await simulateWriteOverloads(config, {\n    args: ['0x'],\n  })\n  // @ts-ignore – TODO: Fix https://github.com/wevm/viem/issues/1916\n  assertType<string | undefined>(result3.result)\n\n  const result4 = await simulateWriteOverloads(config, {\n    args: ['0x', '0x'],\n  })\n  assertType<\n    | {\n        foo: `0x${string}`\n        bar: `0x${string}`\n      }\n    | undefined\n    // @ts-ignore – TODO: Fix https://github.com/wevm/viem/issues/1916\n  >(result4.result)\n})\n\ntest('chain formatters', async () => {\n  const simulateErc20 = createSimulateContract({\n    abi: abi.erc20,\n    address: '0x',\n  })\n\n  const config = createConfig({\n    chains: [celo, mainnet],\n    transports: { [celo.id]: http(), [mainnet.id]: http() },\n  })\n\n  const response = await simulateErc20(config, {\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n  })\n  if (response.chainId === celo.id) {\n    expectTypeOf(response.request.feeCurrency).toEqualTypeOf<\n      `0x${string}` | undefined\n    >()\n  }\n\n  const response2 = await simulateErc20(config, {\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    chainId: celo.id,\n  })\n  expectTypeOf(response2.request.feeCurrency).toEqualTypeOf<\n    `0x${string}` | undefined\n  >()\n})\n"
  },
  {
    "path": "packages/core/src/actions/codegen/createSimulateContract.test.ts",
    "content": "import { abi, address, chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { connect } from '../connect.js'\nimport { disconnect } from '../disconnect.js'\nimport { switchChain } from '../switchChain.js'\nimport { createSimulateContract } from './createSimulateContract.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const simulateWagmiMintExample = createSimulateContract({\n    address: address.wagmiMintExample,\n    abi: abi.wagmiMintExample,\n  })\n\n  await expect(\n    simulateWagmiMintExample(config, {\n      functionName: 'mint',\n    }),\n  ).resolves.toMatchInlineSnapshot(`\n    {\n      \"chainId\": 1,\n      \"request\": {\n        \"abi\": [\n          {\n            \"inputs\": [],\n            \"name\": \"mint\",\n            \"outputs\": [],\n            \"stateMutability\": \"nonpayable\",\n            \"type\": \"function\",\n          },\n        ],\n        \"account\": {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"type\": \"json-rpc\",\n        },\n        \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        \"args\": undefined,\n        \"chainId\": undefined,\n        \"dataSuffix\": undefined,\n        \"functionName\": \"mint\",\n      },\n      \"result\": undefined,\n    }\n  `)\n\n  await disconnect(config, { connector })\n})\n\ntest('multichain', async () => {\n  await connect(config, { connector })\n\n  const simulateWagmiMintExample = createSimulateContract({\n    address: {\n      [chain.mainnet.id]: address.wagmiMintExample,\n      [chain.mainnet2.id]: address.wagmiMintExample,\n    },\n    abi: abi.wagmiMintExample,\n  })\n\n  await expect(\n    simulateWagmiMintExample(config, {\n      functionName: 'mint',\n    }),\n  ).resolves.toMatchObject({\n    chainId: 1,\n  })\n\n  await switchChain(config, { chainId: chain.mainnet2.id })\n  await expect(\n    simulateWagmiMintExample(config, {\n      functionName: 'mint',\n      chainId: chain.mainnet2.id,\n    }),\n  ).resolves.toMatchInlineSnapshot(`\n    {\n      \"chainId\": 456,\n      \"request\": {\n        \"abi\": [\n          {\n            \"inputs\": [],\n            \"name\": \"mint\",\n            \"outputs\": [],\n            \"stateMutability\": \"nonpayable\",\n            \"type\": \"function\",\n          },\n        ],\n        \"account\": {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"type\": \"json-rpc\",\n        },\n        \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        \"args\": undefined,\n        \"chainId\": 456,\n        \"dataSuffix\": undefined,\n        \"functionName\": \"mint\",\n      },\n      \"result\": undefined,\n    }\n  `)\n\n  await switchChain(config, { chainId: chain.mainnet.id })\n  await disconnect(config, { connector })\n})\n\ntest('functionName', async () => {\n  await connect(config, { connector })\n\n  const simulateWagmiMintExample = createSimulateContract({\n    address: address.wagmiMintExample,\n    abi: abi.wagmiMintExample,\n    functionName: 'mint',\n  })\n\n  await expect(\n    simulateWagmiMintExample(config, {}),\n  ).resolves.toMatchInlineSnapshot(`\n    {\n      \"chainId\": 1,\n      \"request\": {\n        \"abi\": [\n          {\n            \"inputs\": [],\n            \"name\": \"mint\",\n            \"outputs\": [],\n            \"stateMutability\": \"nonpayable\",\n            \"type\": \"function\",\n          },\n        ],\n        \"account\": {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"type\": \"json-rpc\",\n        },\n        \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        \"args\": undefined,\n        \"chainId\": undefined,\n        \"dataSuffix\": undefined,\n        \"functionName\": \"mint\",\n      },\n      \"result\": undefined,\n    }\n  `)\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/core/src/actions/codegen/createSimulateContract.ts",
    "content": "import type {\n  Abi,\n  Account,\n  Address,\n  Chain,\n  ContractFunctionArgs,\n  ContractFunctionName,\n  SimulateContractParameters as viem_SimulateContractParameters,\n} from 'viem'\n\nimport type { Config } from '../../createConfig.js'\nimport type { SelectChains } from '../../types/chain.js'\nimport type {\n  ChainIdParameter,\n  ConnectorParameter,\n} from '../../types/properties.js'\nimport type { UnionCompute, UnionStrictOmit } from '../../types/utils.js'\nimport { getChainId } from '../getChainId.js'\nimport {\n  type SimulateContractReturnType,\n  simulateContract,\n} from '../simulateContract.js'\n\ntype stateMutability = 'nonpayable' | 'payable'\n\nexport type CreateSimulateContractParameters<\n  abi extends Abi | readonly unknown[],\n  address extends Address | Record<number, Address> | undefined = undefined,\n  functionName extends\n    | ContractFunctionName<abi, stateMutability>\n    | undefined = undefined,\n> = {\n  abi: abi | Abi | readonly unknown[]\n  address?: address | Address | Record<number, Address> | undefined\n  functionName?:\n    | functionName\n    | ContractFunctionName<abi, stateMutability>\n    | undefined\n}\n\nexport type CreateSimulateContractReturnType<\n  abi extends Abi | readonly unknown[],\n  address extends Address | Record<number, Address> | undefined,\n  functionName extends ContractFunctionName<abi, stateMutability> | undefined,\n> = <\n  config extends Config,\n  name extends functionName extends ContractFunctionName<abi, stateMutability>\n    ? functionName\n    : ContractFunctionName<abi, stateMutability>,\n  args extends ContractFunctionArgs<abi, stateMutability, name>,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  ///\n  chains extends readonly Chain[] = SelectChains<config, chainId>,\n>(\n  config: config,\n  parameters: {\n    [key in keyof chains]: UnionCompute<\n      UnionStrictOmit<\n        viem_SimulateContractParameters<\n          abi,\n          name,\n          args,\n          chains[key],\n          chains[key],\n          Account | Address\n        >,\n        | 'abi'\n        | 'chain'\n        | (address extends undefined ? never : 'address')\n        | (functionName extends undefined ? never : 'functionName')\n      >\n    > &\n      ChainIdParameter<config, chainId> &\n      ConnectorParameter & {\n        chainId?: address extends Record<number, Address>\n          ?\n              | keyof address\n              | (chainId extends keyof address ? chainId : never)\n              | undefined\n          : chainId | number | undefined\n      }\n  }[number],\n) => Promise<SimulateContractReturnType<abi, name, args, config, chainId>>\n\nexport function createSimulateContract<\n  const abi extends Abi | readonly unknown[],\n  const address extends\n    | Address\n    | Record<number, Address>\n    | undefined = undefined,\n  functionName extends\n    | ContractFunctionName<abi, stateMutability>\n    | undefined = undefined,\n>(\n  c: CreateSimulateContractParameters<abi, address, functionName>,\n): CreateSimulateContractReturnType<abi, address, functionName> {\n  if (c.address !== undefined && typeof c.address === 'object')\n    return (config, parameters) => {\n      const configChainId = getChainId(config)\n      const chainId =\n        (parameters as { chainId?: number })?.chainId ?? configChainId\n      return simulateContract(config, {\n        ...(parameters as any),\n        ...(c.functionName ? { functionName: c.functionName } : {}),\n        address: c.address?.[chainId],\n        abi: c.abi,\n      })\n    }\n\n  return (config, parameters) => {\n    return simulateContract(config, {\n      ...(parameters as any),\n      ...(c.address ? { address: c.address } : {}),\n      ...(c.functionName ? { functionName: c.functionName } : {}),\n      abi: c.abi,\n    })\n  }\n}\n"
  },
  {
    "path": "packages/core/src/actions/codegen/createWatchContractEvent.test-d.ts",
    "content": "import { abi, config, mainnet, optimism } from '@wagmi/test'\nimport { http, webSocket } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { createConfig } from '../../createConfig.js'\nimport { createWatchContractEvent } from './createWatchContractEvent.js'\n\ntest('default', () => {\n  const watchErc20Event = createWatchContractEvent({\n    abi: abi.erc20,\n  })\n\n  watchErc20Event(config, {\n    eventName: 'Transfer',\n    chainId: 1,\n    onLogs(logs) {\n      expectTypeOf(logs[0]!.eventName).toEqualTypeOf<'Transfer'>()\n      expectTypeOf(logs[0]!.args).toEqualTypeOf<{\n        from?: `0x${string}` | undefined\n        to?: `0x${string}` | undefined\n        value?: bigint | undefined\n      }>()\n    },\n  })\n})\n\ntest('multichain address', () => {\n  const watchErc20Event = createWatchContractEvent({\n    abi: abi.erc20,\n    address: {\n      [mainnet.id]: '0x',\n      [optimism.id]: '0x',\n    },\n  })\n\n  watchErc20Event(config, {\n    eventName: 'Transfer',\n    chainId: mainnet.id,\n    // ^?\n    onLogs() {},\n  })\n\n  watchErc20Event(config, {\n    eventName: 'Transfer',\n    // @ts-expect-error chain id must match address keys\n    chainId: 420,\n    onLogs() {},\n  })\n\n  watchErc20Event(config, {\n    eventName: 'Transfer',\n    // @ts-expect-error chain id must match address keys\n    address: '0x',\n    onLogs() {},\n  })\n})\n\ntest('differing transports', () => {\n  const watchErc20Event = createWatchContractEvent({\n    abi: abi.erc20,\n  })\n\n  const config = createConfig({\n    chains: [mainnet, optimism],\n    transports: {\n      [mainnet.id]: http(),\n      [optimism.id]: webSocket(),\n    },\n  })\n\n  watchErc20Event(config, {\n    poll: false,\n    address: '0x',\n    onLogs() {},\n  })\n\n  watchErc20Event(config, {\n    chainId: mainnet.id,\n    poll: true,\n    address: '0x',\n    onLogs() {},\n  })\n  watchErc20Event(config, {\n    config,\n    chainId: mainnet.id,\n    // @ts-expect-error poll required since http transport\n    poll: false,\n    address: '0x',\n    onLogs() {},\n  })\n\n  watchErc20Event(config, {\n    chainId: optimism.id,\n    poll: true,\n    address: '0x',\n    onLogs() {},\n  })\n  watchErc20Event(config, {\n    chainId: optimism.id,\n    poll: false,\n    address: '0x',\n    onLogs() {},\n  })\n})\n\ntest('eventName', () => {\n  const watchErc20Event = createWatchContractEvent({\n    abi: abi.erc20,\n    eventName: 'Transfer',\n  })\n\n  watchErc20Event(config, {\n    chainId: 1,\n    onLogs(logs) {\n      expectTypeOf(logs[0]!.eventName).toEqualTypeOf<'Transfer'>()\n      expectTypeOf(logs[0]!.args).toEqualTypeOf<{\n        from?: `0x${string}` | undefined\n        to?: `0x${string}` | undefined\n        value?: bigint | undefined\n      }>()\n    },\n  })\n})\n"
  },
  {
    "path": "packages/core/src/actions/codegen/createWatchContractEvent.test.ts",
    "content": "import { abi, address, chain, config, wait } from '@wagmi/test'\nimport type { WatchEventOnLogsParameter } from 'viem'\nimport { test } from 'vitest'\n\nimport { createWatchContractEvent } from './createWatchContractEvent.js'\n\ntest('default', async () => {\n  const watchErc20Event = createWatchContractEvent({\n    address: address.usdc,\n    abi: abi.wagmiMintExample,\n  })\n\n  let logs: WatchEventOnLogsParameter = []\n  const unwatch = watchErc20Event(config, {\n    eventName: 'Transfer',\n    onLogs(next) {\n      logs = logs.concat(next)\n    },\n  })\n  await wait(500)\n  unwatch()\n  await wait(500)\n})\n\ntest('multichain', async () => {\n  const watchErc20Event = createWatchContractEvent({\n    address: {\n      [chain.mainnet.id]: address.usdc,\n      [chain.mainnet2.id]: address.usdc,\n    },\n    abi: abi.wagmiMintExample,\n  })\n\n  let logs: WatchEventOnLogsParameter = []\n  const unwatch = watchErc20Event(config, {\n    eventName: 'Transfer',\n    chainId: chain.mainnet2.id,\n    onLogs(next) {\n      logs = logs.concat(next)\n    },\n  })\n  await wait(500)\n  unwatch()\n  await wait(500)\n})\n"
  },
  {
    "path": "packages/core/src/actions/codegen/createWatchContractEvent.ts",
    "content": "import type { Abi, Address, ContractEventName } from 'viem'\n\nimport type { Config } from '../../createConfig.js'\nimport type { UnionCompute, UnionStrictOmit } from '../../types/utils.js'\nimport { getChainId } from '../getChainId.js'\nimport {\n  type WatchContractEventParameters,\n  type WatchContractEventReturnType,\n  watchContractEvent,\n} from '../watchContractEvent.js'\n\nexport type CreateWatchContractEventParameters<\n  abi extends Abi | readonly unknown[],\n  address extends Address | Record<number, Address> | undefined = undefined,\n  eventName extends ContractEventName<abi> | undefined = undefined,\n> = {\n  abi: abi | Abi | readonly unknown[]\n  address?: address | Address | Record<number, Address> | undefined\n  eventName?: eventName | ContractEventName<abi> | undefined\n}\n\nexport type CreateWatchContractEventReturnType<\n  abi extends Abi | readonly unknown[],\n  address extends Address | Record<number, Address> | undefined,\n  eventName extends ContractEventName<abi> | undefined,\n  ///\n  omittedProperties extends 'abi' | 'address' | 'chainId' | 'eventName' =\n    | 'abi'\n    | (address extends undefined ? never : 'address')\n    | (address extends Record<number, Address> ? 'chainId' : never)\n    | (eventName extends undefined ? never : 'eventName'),\n> = <\n  config extends Config,\n  name extends eventName extends ContractEventName<abi>\n    ? eventName\n    : ContractEventName<abi>,\n  strict extends boolean | undefined = undefined,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n>(\n  config: config,\n  parameters: UnionCompute<\n    UnionStrictOmit<\n      WatchContractEventParameters<abi, name, strict, config, chainId>,\n      omittedProperties\n    >\n  > &\n    (address extends Record<number, Address>\n      ? { chainId?: keyof address | undefined }\n      : unknown),\n) => WatchContractEventReturnType\n\nexport function createWatchContractEvent<\n  const abi extends Abi | readonly unknown[],\n  const address extends\n    | Address\n    | Record<number, Address>\n    | undefined = undefined,\n  eventName extends ContractEventName<abi> | undefined = undefined,\n>(\n  c: CreateWatchContractEventParameters<abi, address, eventName>,\n): CreateWatchContractEventReturnType<abi, address, eventName> {\n  if (c.address !== undefined && typeof c.address === 'object')\n    return (config, parameters) => {\n      const configChainId = getChainId(config)\n      const chainId =\n        (parameters as { chainId?: number })?.chainId ?? configChainId\n      return watchContractEvent(config, {\n        ...(parameters as any),\n        ...(c.eventName ? { eventName: c.eventName } : {}),\n        address: c.address?.[chainId],\n        abi: c.abi,\n      })\n    }\n\n  return (config, parameters) => {\n    return watchContractEvent(config, {\n      ...(parameters as any),\n      ...(c.address ? { address: c.address } : {}),\n      ...(c.eventName ? { eventName: c.eventName } : {}),\n      abi: c.abi,\n    })\n  }\n}\n"
  },
  {
    "path": "packages/core/src/actions/codegen/createWriteContract.test-d.ts",
    "content": "import { abi, config, mainnet, optimism } from '@wagmi/test'\nimport { test } from 'vitest'\n\nimport { simulateContract } from '../simulateContract.js'\nimport { createWriteContract } from './createWriteContract.js'\n\ntest('default', () => {\n  const writeErc20 = createWriteContract({\n    abi: abi.erc20,\n    address: '0x',\n  })\n\n  writeErc20(config, {\n    functionName: 'transfer',\n    args: ['0x', 123n],\n  })\n})\n\ntest('multichain address', () => {\n  const writeErc20 = createWriteContract({\n    abi: abi.erc20,\n    address: {\n      [mainnet.id]: '0x',\n      [optimism.id]: '0x',\n    },\n  })\n\n  writeErc20(config, {\n    functionName: 'transfer',\n    args: ['0x', 123n],\n    chainId: mainnet.id,\n    // ^?\n  })\n\n  writeErc20(config, {\n    functionName: 'transfer',\n    args: ['0x', 123n],\n    // @ts-expect-error chain id must match address keys\n    chainId: 420,\n  })\n\n  writeErc20(config, {\n    // @ts-expect-error address not allowed\n    address: '0x',\n    functionName: 'transfer',\n    args: ['0x', 123n],\n  })\n})\n\ntest('overloads', () => {\n  const writeOverloads = createWriteContract({\n    abi: abi.writeOverloads,\n    address: {\n      [mainnet.id]: '0x',\n      [optimism.id]: '0x',\n    },\n  })\n\n  writeOverloads(config, {\n    functionName: 'foo',\n    args: [],\n  })\n\n  writeOverloads(config, {\n    functionName: 'foo',\n    args: ['0x'],\n  })\n\n  writeOverloads(config, {\n    functionName: 'foo',\n    args: ['0x', '0x'],\n  })\n})\n\ntest('useSimulateContract', async () => {\n  const writeErc20 = createWriteContract({\n    abi: abi.erc20,\n    address: {\n      [mainnet.id]: '0x',\n      [optimism.id]: '0x',\n    },\n  })\n\n  const { request } = await simulateContract(config, {\n    account: '0x',\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    chainId: 1,\n  })\n\n  writeErc20(config, request)\n})\n\ntest('functionName', () => {\n  const writeErc20 = createWriteContract({\n    abi: abi.erc20,\n    address: '0x',\n    functionName: 'transfer',\n  })\n\n  writeErc20(config, {\n    args: ['0x', 123n],\n  })\n})\n\ntest('functionName with overloads', () => {\n  const writeOverloads = createWriteContract({\n    abi: abi.writeOverloads,\n    address: {\n      [mainnet.id]: '0x',\n      [optimism.id]: '0x',\n    },\n    functionName: 'foo',\n  })\n\n  writeOverloads(config, {\n    args: [],\n  })\n\n  writeOverloads(config, {\n    args: ['0x'],\n  })\n\n  writeOverloads(config, {\n    args: ['0x', '0x'],\n  })\n})\n"
  },
  {
    "path": "packages/core/src/actions/codegen/createWriteContract.test.ts",
    "content": "import { abi } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { createWriteContract } from './createWriteContract.js'\n\ntest('default', () => {\n  const writeErc20 = createWriteContract({\n    abi: abi.erc20,\n  })\n  expect(writeErc20).toBeDefined()\n})\n"
  },
  {
    "path": "packages/core/src/actions/codegen/createWriteContract.ts",
    "content": "import type {\n  Abi,\n  Account,\n  Address,\n  Chain,\n  ContractFunctionArgs,\n  ContractFunctionName,\n  WriteContractParameters as viem_WriteContractParameters,\n} from 'viem'\n\nimport type { Config } from '../../createConfig.js'\nimport type { SelectChains } from '../../types/chain.js'\nimport type {\n  ChainIdParameter,\n  ConnectorParameter,\n} from '../../types/properties.js'\nimport type {\n  Compute,\n  UnionCompute,\n  UnionStrictOmit,\n} from '../../types/utils.js'\nimport { getChainId } from '../getChainId.js'\nimport {\n  type WriteContractReturnType,\n  writeContract,\n} from '../writeContract.js'\n\ntype stateMutability = 'nonpayable' | 'payable'\n\nexport type CreateWriteContractParameters<\n  abi extends Abi | readonly unknown[],\n  address extends Address | Record<number, Address> | undefined = undefined,\n  functionName extends\n    | ContractFunctionName<abi, stateMutability>\n    | undefined = undefined,\n> = {\n  abi: abi | Abi | readonly unknown[]\n  address?: address | Address | Record<number, Address> | undefined\n  functionName?:\n    | functionName\n    | ContractFunctionName<abi, stateMutability>\n    | undefined\n}\n\nexport type CreateWriteContractReturnType<\n  abi extends Abi | readonly unknown[],\n  address extends Address | Record<number, Address> | undefined,\n  functionName extends ContractFunctionName<abi, stateMutability> | undefined,\n> = <\n  config extends Config,\n  name extends functionName extends ContractFunctionName<abi, stateMutability>\n    ? functionName\n    : ContractFunctionName<abi, stateMutability>,\n  args extends ContractFunctionArgs<abi, stateMutability, name>,\n  chainId extends config['chains'][number]['id'],\n  ///\n  allFunctionNames = ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  chains extends readonly Chain[] = SelectChains<config, chainId>,\n  omittedProperties extends 'abi' | 'address' | 'functionName' =\n    | 'abi'\n    | (address extends undefined ? never : 'address')\n    | (functionName extends undefined ? never : 'functionName'),\n>(\n  config: config,\n  parameters: UnionCompute<\n    {\n      [key in keyof chains]: UnionStrictOmit<\n        viem_WriteContractParameters<\n          abi,\n          name,\n          args,\n          chains[key],\n          Account,\n          chains[key],\n          allFunctionNames\n        >,\n        omittedProperties | 'chain'\n      >\n    }[number] &\n      (address extends Record<number, Address>\n        ? {\n            chainId?:\n              | keyof address\n              | (chainId extends keyof address ? chainId : never)\n              | undefined\n          }\n        : Compute<ChainIdParameter<config, chainId>>) &\n      ConnectorParameter\n  >,\n) => Promise<WriteContractReturnType>\n\nexport function createWriteContract<\n  const abi extends Abi | readonly unknown[],\n  const address extends\n    | Address\n    | Record<number, Address>\n    | undefined = undefined,\n  functionName extends\n    | ContractFunctionName<abi, stateMutability>\n    | undefined = undefined,\n>(\n  c: CreateWriteContractParameters<abi, address, functionName>,\n): CreateWriteContractReturnType<abi, address, functionName> {\n  if (c.address !== undefined && typeof c.address === 'object')\n    return (config, parameters) => {\n      const chainId = (() => {\n        if (parameters.chainId) return parameters.chainId\n        return getChainId(config)\n      })()\n      return writeContract(config, {\n        ...(parameters as any),\n        ...(c.functionName ? { functionName: c.functionName } : {}),\n        address: chainId ? c.address?.[chainId] : undefined,\n        abi: c.abi,\n      })\n    }\n\n  return (config, parameters) => {\n    return writeContract(config, {\n      ...(parameters as any),\n      ...(c.address ? { address: c.address } : {}),\n      ...(c.functionName ? { functionName: c.functionName } : {}),\n      abi: c.abi,\n    })\n  }\n}\n"
  },
  {
    "path": "packages/core/src/actions/connect.test-d.ts",
    "content": "import { accounts, config as testConfig } from '@wagmi/test'\nimport { type Address, type Hex, http } from 'viem'\nimport { mainnet } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport type { CreateConnectorFn } from '../connectors/createConnector.js'\nimport { mock } from '../connectors/mock.js'\nimport { type Connector, createConfig } from '../createConfig.js'\nimport { connect } from './connect.js'\n\nconst config = createConfig({\n  chains: [mainnet],\n  transports: { [mainnet.id]: http() },\n})\n\ntest('parameters: connector (ConnectorFn)', () => {\n  const connectorFn = mock({ accounts })\n\n  connect(config, {\n    connector: connectorFn,\n    foo: 'bar',\n  })\n  expectTypeOf<\n    typeof connectorFn extends CreateConnectorFn ? true : false\n  >().toEqualTypeOf<true>()\n\n  type Result = NonNullable<\n    Parameters<typeof connect<typeof config, typeof connectorFn>>[1]\n  >\n  expectTypeOf<Result['foo']>().toEqualTypeOf<string | undefined>()\n})\n\ntest('parameters: connector (Connector)', () => {\n  const connector = config._internal.connectors.setup(mock({ accounts }))\n\n  connect(config, {\n    connector,\n    foo: 'bar',\n  })\n  expectTypeOf<\n    typeof connector extends Connector ? true : false\n  >().toEqualTypeOf<true>()\n\n  type Result = NonNullable<\n    Parameters<typeof connect<typeof config, typeof connector>>[1]\n  >\n  expectTypeOf<Result['foo']>().toEqualTypeOf<string | undefined>()\n})\n\ntest('parameters: withCapabilities', async () => {\n  const connectorFn = mock({ accounts })\n\n  const res0 = await connect(config, { connector: connectorFn })\n  expectTypeOf(res0.accounts).toEqualTypeOf<readonly [Address, ...Address[]]>()\n\n  const res1 = await connect(config, {\n    connector: connectorFn,\n    withCapabilities: false,\n  })\n  expectTypeOf(res1.accounts).toEqualTypeOf<readonly [Address, ...Address[]]>()\n\n  const res2 = await connect(config, {\n    connector: connectorFn,\n    withCapabilities: true,\n  })\n  expectTypeOf(res2.accounts).toEqualTypeOf<\n    readonly [\n      {\n        address: Address\n        capabilities: {\n          foo: { bar: Hex }\n        }\n      },\n      ...{\n        address: Address\n        capabilities: {\n          foo: { bar: Hex }\n        }\n      }[],\n    ]\n  >()\n})\n\ntest('behavior: with config', () => {\n  connect(testConfig, {\n    connector: testConfig.connectors[0]!,\n    foo: 'bar',\n  })\n  // @ts-expect-error\n  testConfig.connectors[4]\n})\n"
  },
  {
    "path": "packages/core/src/actions/connect.test.ts",
    "content": "import { accounts, chain, config } from '@wagmi/test'\nimport { beforeEach, expect, test } from 'vitest'\n\nimport { mock } from '../connectors/mock.js'\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\n\nconst connector = config._internal.connectors.setup(mock({ accounts }))\n\nbeforeEach(async () => {\n  if (config.state.current === connector.uid)\n    await disconnect(config, { connector })\n})\n\ntest('default', async () => {\n  await expect(connect(config, { connector })).resolves.toMatchObject(\n    expect.objectContaining({\n      accounts: expect.arrayContaining([expect.any(String)]),\n      chainId: expect.any(Number),\n    }),\n  )\n})\n\ntest('parameters: chainId', async () => {\n  const chainId = chain.mainnet2.id\n  await expect(connect(config, { connector, chainId })).resolves.toMatchObject(\n    expect.objectContaining({\n      accounts: expect.arrayContaining([expect.any(String)]),\n      chainId,\n    }),\n  )\n})\n\ntest('parameters: connector', async () => {\n  const connector_ = config._internal.connectors.setup(mock({ accounts }))\n  await expect(\n    connect(config, { connector: connector_ }),\n  ).resolves.toMatchObject(\n    expect.objectContaining({\n      accounts: expect.arrayContaining([expect.any(String)]),\n      chainId: expect.any(Number),\n    }),\n  )\n  await disconnect(config, { connector: connector_ })\n})\n\ntest('parameters: withCapabilities', async () => {\n  await expect(\n    connect(config, { connector, withCapabilities: true }),\n  ).resolves.toMatchObject(\n    expect.objectContaining({\n      accounts: expect.arrayContaining([\n        expect.objectContaining({\n          address: expect.any(String),\n          capabilities: expect.objectContaining({\n            foo: expect.objectContaining({ bar: expect.any(String) }),\n          }),\n        }),\n      ]),\n    }),\n  )\n})\n\ntest('behavior: user rejected request', async () => {\n  const connector_ = config._internal.connectors.setup(\n    mock({\n      accounts,\n      features: { connectError: true },\n    }),\n  )\n  await expect(\n    connect(config, { connector: connector_ }),\n  ).rejects.toMatchInlineSnapshot(`\n    [UserRejectedRequestError: User rejected the request.\n\n    Details: Failed to connect.\n    Version: viem@2.47.5]\n  `)\n})\n\ntest('behavior: already connected', async () => {\n  await connect(config, { connector })\n  await expect(connect(config, { connector })).rejects.toMatchInlineSnapshot(`\n    [ConnectorAlreadyConnectedError: Connector already connected.\n\n    Version: @wagmi/core@x.y.z]\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/actions/connect.ts",
    "content": "import type {\n  Address,\n  ResourceUnavailableRpcErrorType,\n  UserRejectedRequestErrorType,\n} from 'viem'\n\nimport type { CreateConnectorFn } from '../connectors/createConnector.js'\nimport type { Config, Connector } from '../createConfig.js'\nimport type { BaseErrorType, ErrorType } from '../errors/base.js'\nimport {\n  ConnectorAlreadyConnectedError,\n  type ConnectorAlreadyConnectedErrorType,\n} from '../errors/config.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\n\nexport type ConnectParameters<\n  config extends Config = Config,\n  connector extends Connector | CreateConnectorFn =\n    | Connector\n    | CreateConnectorFn,\n  withCapabilities extends boolean = false,\n  ///\n  parameters extends unknown | undefined =\n    | (connector extends CreateConnectorFn\n        ? Omit<\n            NonNullable<Parameters<ReturnType<connector>['connect']>[0]>,\n            'isReconnecting'\n          >\n        : never)\n    | (connector extends Connector\n        ? Omit<\n            NonNullable<Parameters<connector['connect']>[0]>,\n            'isReconnecting'\n          >\n        : never),\n> = Compute<\n  ChainIdParameter<config> & {\n    connector: connector | CreateConnectorFn\n    withCapabilities?: withCapabilities | boolean | undefined\n  }\n> &\n  parameters\n\nexport type ConnectReturnType<\n  config extends Config = Config,\n  connector extends Connector | CreateConnectorFn =\n    | Connector\n    | CreateConnectorFn,\n  withCapabilities extends boolean = false,\n  ///\n  capabilities extends unknown | undefined =\n    | (connector extends CreateConnectorFn\n        ? Awaited<\n            ReturnType<ReturnType<connector>['connect']>\n          >['accounts'] extends\n            | readonly Address[]\n            | readonly {\n                capabilities: infer capabilities\n              }[]\n          ? capabilities\n          : Record<string, unknown>\n        : never)\n    | (connector extends Connector\n        ? Awaited<ReturnType<connector['connect']>>['accounts'] extends\n            | readonly Address[]\n            | readonly {\n                capabilities: infer capabilities\n              }[]\n          ? capabilities\n          : Record<string, unknown>\n        : never),\n> = {\n  accounts: withCapabilities extends true\n    ? readonly [\n        { address: Address; capabilities: capabilities },\n        ...{ address: Address; capabilities: capabilities }[],\n      ]\n    : readonly [Address, ...Address[]]\n  chainId:\n    | config['chains'][number]['id']\n    | (number extends config['chains'][number]['id'] ? number : number & {})\n}\n\nexport type ConnectErrorType =\n  | ConnectorAlreadyConnectedErrorType\n  // connector.connect()\n  | UserRejectedRequestErrorType\n  | ResourceUnavailableRpcErrorType\n  // base\n  | BaseErrorType\n  | ErrorType\n\n/** https://wagmi.sh/core/api/actions/connect */\nexport async function connect<\n  config extends Config,\n  connector extends Connector | CreateConnectorFn,\n  withCapabilities extends boolean = false,\n>(\n  config: config,\n  parameters: ConnectParameters<config, connector, withCapabilities>,\n): Promise<ConnectReturnType<config, connector, withCapabilities>> {\n  // \"Register\" connector if not already created\n  let connector: Connector\n  if (typeof parameters.connector === 'function') {\n    connector = config._internal.connectors.setup(parameters.connector)\n  } else connector = parameters.connector\n\n  // Check if connector is already connected\n  if (connector.uid === config.state.current)\n    throw new ConnectorAlreadyConnectedError()\n\n  try {\n    config.setState((x) => ({ ...x, status: 'connecting' }))\n    connector.emitter.emit('message', { type: 'connecting' })\n\n    const { connector: _, ...rest } = parameters\n    const data = await connector.connect(rest)\n\n    connector.emitter.off('connect', config._internal.events.connect)\n    connector.emitter.on('change', config._internal.events.change)\n    connector.emitter.on('disconnect', config._internal.events.disconnect)\n\n    await config.storage?.setItem('recentConnectorId', connector.id)\n    config.setState((x) => ({\n      ...x,\n      connections: new Map(x.connections).set(connector.uid, {\n        accounts: (rest.withCapabilities\n          ? data.accounts.map((account) =>\n              typeof account === 'object' ? account.address : account,\n            )\n          : data.accounts) as readonly [Address, ...Address[]],\n        chainId: data.chainId,\n        connector: connector,\n      }),\n      current: connector.uid,\n      status: 'connected',\n    }))\n\n    return {\n      // TODO(v3): Remove `withCapabilities: true` default behavior so remove compat marshalling\n      // Workaround so downstream connectors work with `withCapabilities` without any changes required\n      accounts: (rest.withCapabilities\n        ? data.accounts.map((address) =>\n            typeof address === 'object'\n              ? address\n              : { address, capabilities: {} },\n          )\n        : data.accounts) as never,\n      chainId: data.chainId,\n    } as never\n  } catch (error) {\n    config.setState((x) => ({\n      ...x,\n      // Keep existing connector connected in case of error\n      status: x.current ? 'connected' : 'disconnected',\n    }))\n    throw error\n  }\n}\n"
  },
  {
    "path": "packages/core/src/actions/deployContract.test-d.ts",
    "content": "import { abi, bytecode, config } from '@wagmi/test'\nimport { http } from 'viem'\nimport { celo, mainnet } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { createConfig } from '../createConfig.js'\nimport {\n  type DeployContractParameters,\n  deployContract,\n} from './deployContract.js'\n\ntest('default', async () => {\n  await deployContract(config, {\n    abi: abi.bayc,\n    bytecode: bytecode.bayc,\n    args: ['Bored Ape Wagmi Club', 'BAYC', 69420n, 0n],\n    chainId: mainnet.id,\n  })\n})\n\ntest('chain formatters', () => {\n  const config = createConfig({\n    chains: [mainnet, celo],\n    transports: { [celo.id]: http(), [mainnet.id]: http() },\n  })\n\n  type Result = DeployContractParameters<typeof abi.bayc, typeof config>\n  expectTypeOf<Result>().toMatchTypeOf<{\n    chainId?: typeof celo.id | typeof mainnet.id | undefined\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  deployContract(config, {\n    abi: abi.bayc,\n    bytecode: bytecode.bayc,\n    args: ['Bored Ape Wagmi Club', 'BAYC', 69420n, 0n],\n    feeCurrency: '0x',\n  })\n\n  type Result2 = DeployContractParameters<\n    typeof abi.bayc,\n    typeof config,\n    typeof celo.id\n  >\n  expectTypeOf<Result2>().toMatchTypeOf<{\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  deployContract(config, {\n    chainId: celo.id,\n    abi: abi.bayc,\n    bytecode: bytecode.bayc,\n    args: ['Bored Ape Wagmi Club', 'BAYC', 69420n, 0n],\n    feeCurrency: '0x',\n  })\n\n  type Result3 = DeployContractParameters<\n    typeof abi.bayc,\n    typeof config,\n    typeof mainnet.id\n  >\n  expectTypeOf<Result3>().not.toMatchTypeOf<{\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  deployContract(config, {\n    chainId: mainnet.id,\n    abi: abi.bayc,\n    bytecode: bytecode.bayc,\n    args: ['Bored Ape Wagmi Club', 'BAYC', 69420n, 0n],\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n})\n"
  },
  {
    "path": "packages/core/src/actions/deployContract.test.ts",
    "content": "import {\n  abi,\n  bytecode,\n  config,\n  testClient,\n  transactionHashRegex,\n} from '@wagmi/test'\nimport { parseEther } from 'viem'\nimport { expect, test } from 'vitest'\n\nimport { connect } from './connect.js'\nimport { deployContract } from './deployContract.js'\nimport { disconnect } from './disconnect.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n  await expect(\n    deployContract(config, {\n      abi: abi.bayc,\n      bytecode: bytecode.bayc,\n      args: ['Bored Ape Wagmi Club', 'BAYC', 69420n, 0n],\n    }),\n  ).resolves.toMatch(transactionHashRegex)\n  await disconnect(config, { connector })\n})\n\ntest('behavior: no funds', async () => {\n  const data = await connect(config, { connector })\n  const connectedAddress = data.accounts[0]\n\n  await testClient.mainnet.setBalance({\n    address: connectedAddress,\n    value: parseEther('0'),\n  })\n\n  await expect(\n    deployContract(config, {\n      chainId: testClient.mainnet.chain.id,\n      abi: abi.bayc,\n      bytecode: bytecode.bayc,\n      args: ['Bored Ape Wagmi Club', 'BAYC', 69420n, 0n],\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [TransactionExecutionError: The total cost (gas * gas fee + value) of executing this transaction exceeds the balance of the account.\n\n    This error could arise when the account does not have enough funds to:\n     - pay for the total gas fee,\n     - pay for the value to send.\n     \n    The cost of the transaction is calculated as \\`gas * gas fee + value\\`, where:\n     - \\`gas\\` is the amount of gas needed for transaction to execute,\n     - \\`gas fee\\` is the gas fee,\n     - \\`value\\` is the amount of ether to send to the recipient.\n     \n    Request Arguments:\n      chain:  Ethereum (id: 1)\n      from:   0x95132632579b073D12a6673e18Ab05777a6B86f8\n      data:   0x608060405260405180602001604052806000815250600b90805190602001906200002b92919062000484565b506000600f60006101000a81548160ff0219169083151502179055503480156200005457600080fd5b50604051620046d0380380620046d0833981810160405260808110156200007a57600080fd5b81019080805160405193929190846401000000008211156200009b57600080fd5b83820191506020820185811115620000b257600080fd5b8251866001820283011164010000000082111715620000d057600080fd5b8083526020830192505050908051906020019080838360005b8381101562000106578082015181840152602081019050620000e9565b50505050905090810190601f168015620001345780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200015857600080fd5b838201915060208201858111156200016f57600080fd5b82518660018202830111640100000000821117156200018d57600080fd5b8083526020830192505050908051906020019080838360005b83811015620001c3578082015181840152602081019050620001a6565b50505050905090810190601f168015620001f15780820380516001836020036101000a031916815260200191505b5060405260200180519060200190929190805190602001909291905050508383620002296301ffc9a760e01b6200037360201b60201c565b81600690805190602001906200024192919062000484565b5080600790805190602001906200025a92919062000484565b50620002736380ac58cd60e01b6200037360201b60201c565b6200028b635b5e139f60e01b6200037360201b60201c565b620002a363780e9d6360e01b6200037360201b60201c565b50506000620002b76200047c60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35081600e81905550620bdd808101601081905550505050506200052a565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433136353a20696e76616c696420696e746572666163652069640000000081525060200191505060405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620004c757805160ff1916838001178555620004f8565b82800160010185558215620004f8579182015b82811115620004f7578251825591602001919060010190620004da565b5b5090506200050791906200050b565b5090565b5b80821115620005265760008160009055506001016200050c565b5090565b614196806200053a6000396000f3fe60806040526004361061021a5760003560e01c80636c0360eb11610123578063b0f67427116100ab578063e36d64981161006f578063e36d649814610ddf578063e985e9c514610e0a578063e986655014610e91578063eb8d244414610ea8578063f2fde38b14610ed55761021a565b8063b0f6742714610bac578063b88d4fde14610bc3578063bb8a16bd14610cd5578063c87b56dd14610d00578063cb774d4714610db45761021a565b80637d17fcbe116100f25780637d17fcbe14610a395780638da5cb5b14610a5057806395d89b4114610a91578063a22cb46514610b21578063a723533e14610b7e5761021a565b80636c0360eb1461090257806370a0823114610992578063715018a6146109f75780637a3f451e14610a0e5761021a565b80632f745c59116101a65780634f6ccce7116101755780634f6ccce7146106cb57806355f804b31461071a578063571dff3b146107e2578063607e20e31461080d5780636352211e1461089d5761021a565b80632f745c59146105b357806334918dfd146106225780633ccfd60b1461063957806342842e0e146106505761021a565b8063095ea7b3116101ed578063095ea7b3146103bf578063109695231461041a57806318160ddd146104e257806318e20a381461050d57806323b872dd146105385761021a565b8063018a2c371461021f57806301ffc9a71461025a57806306fdde03146102ca578063081812fc1461035a575b600080fd5b34801561022b57600080fd5b506102586004803603602081101561024257600080fd5b8101908080359060200190929190505050610f26565b005b34801561026657600080fd5b506102b26004803603602081101561027d57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610fdf565b60405180821515815260200191505060405180910390f35b3480156102d657600080fd5b506102df611046565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561031f578082015181840152602081019050610304565b50505050905090810190601f16801561034c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561036657600080fd5b506103936004803603602081101561037d57600080fd5b81019080803590602001909291905050506110e8565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103cb57600080fd5b50610418600480360360408110156103e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611183565b005b34801561042657600080fd5b506104e06004803603602081101561043d57600080fd5b810190808035906020019064010000000081111561045a57600080fd5b82018360208201111561046c57600080fd5b8035906020019184600183028401116401000000008311171561048e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506112c7565b005b3480156104ee57600080fd5b506104f7611390565b6040518082815260200191505060405180910390f35b34801561051957600080fd5b506105226113a1565b6040518082815260200191505060405180910390f35b34801561054457600080fd5b506105b16004803603606081101561055b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113a7565b005b3480156105bf57600080fd5b5061060c600480360360408110156105d657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061141d565b6040518082815260200191505060405180910390f35b34801561062e57600080fd5b50610637611478565b005b34801561064557600080fd5b5061064e611553565b005b34801561065c57600080fd5b506106c96004803603606081101561067357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611651565b005b3480156106d757600080fd5b50610704600480360360208110156106ee57600080fd5b8101908080359060200190929190505050611671565b6040518082815260200191505060405180910390f35b34801561072657600080fd5b506107e06004803603602081101561073d57600080fd5b810190808035906020019064010000000081111561075a57600080fd5b82018360208201111561076c57600080fd5b8035906020019184600183028401116401000000008311171561078e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611694565b005b3480156107ee57600080fd5b506107f761174f565b6040518082815260200191505060405180910390f35b34801561081957600080fd5b50610822611754565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610862578082015181840152602081019050610847565b50505050905090810190601f16801561088f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108a957600080fd5b506108d6600480360360208110156108c057600080fd5b81019080803590602001909291905050506117f2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561090e57600080fd5b50610917611829565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561095757808201518184015260208101905061093c565b50505050905090810190601f1680156109845780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561099e57600080fd5b506109e1600480360360208110156109b557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118cb565b6040518082815260200191505060405180910390f35b348015610a0357600080fd5b50610a0c6119a0565b005b348015610a1a57600080fd5b50610a23611b10565b6040518082815260200191505060405180910390f35b348015610a4557600080fd5b50610a4e611b1c565b005b348015610a5c57600080fd5b50610a65611c4c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a9d57600080fd5b50610aa6611c76565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610ae6578082015181840152602081019050610acb565b50505050905090810190601f168015610b135780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610b2d57600080fd5b50610b7c60048036036040811015610b4457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611d18565b005b610baa60048036036020811015610b9457600080fd5b8101908080359060200190929190505050611ece565b005b348015610bb857600080fd5b50610bc1612127565b005b348015610bcf57600080fd5b50610cd360048036036080811015610be657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610c4d57600080fd5b820183602082011115610c5f57600080fd5b80359060200191846001830284011164010000000083111715610c8157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061220b565b005b348015610ce157600080fd5b50610cea612283565b6040518082815260200191505060405180910390f35b348015610d0c57600080fd5b50610d3960048036036020811015610d2357600080fd5b8101908080359060200190929190505050612289565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d79578082015181840152602081019050610d5e565b50505050905090810190601f168015610da65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610dc057600080fd5b50610dc961255a565b6040518082815260200191505060405180910390f35b348015610deb57600080fd5b50610df4612560565b6040518082815260200191505060405180910390f35b348015610e1657600080fd5b50610e7960048036036040811015610e2d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612566565b60405180821515815260200191505060405180910390f35b348015610e9d57600080fd5b50610ea66125fa565b005b348015610eb457600080fd5b50610ebd612764565b60405180821515815260200191505060405180910390f35b348015610ee157600080fd5b50610f2460048036036020811015610ef857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612777565b005b610f2e61296c565b73ffffffffffffffffffffffffffffffffffffffff16610f4c611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614610fd5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8060108190555050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110de5780601f106110b3576101008083540402835291602001916110de565b820191906000526020600020905b8154815290600101906020018083116110c157829003601f168201915b5050505050905090565b60006110f382612974565b611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061408b602c913960400191505060405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061118e826117f2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061410f6021913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661123461296c565b73ffffffffffffffffffffffffffffffffffffffff16148061126357506112628161125d61296c565b612566565b5b6112b8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180613f956038913960400191505060405180910390fd5b6112c28383612991565b505050565b6112cf61296c565b73ffffffffffffffffffffffffffffffffffffffff166112ed611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611376576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b908051906020019061138c929190613de6565b5050565b600061139c6002612a4a565b905090565b60105481565b6113b86113b261296c565b82612a5f565b61140d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806141306031913960400191505060405180910390fd5b611418838383612b53565b505050565b600061147082600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612d9690919063ffffffff16565b905092915050565b61148061296c565b73ffffffffffffffffffffffffffffffffffffffff1661149e611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611527576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b61155b61296c565b73ffffffffffffffffffffffffffffffffffffffff16611579611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561164d573d6000803e3d6000fd5b5050565b61166c8383836040518060200160405280600081525061220b565b505050565b600080611688836002612db090919063ffffffff16565b50905080915050919050565b61169c61296c565b73ffffffffffffffffffffffffffffffffffffffff166116ba611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611743576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61174c81612ddc565b50565b601481565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117ea5780601f106117bf576101008083540402835291602001916117ea565b820191906000526020600020905b8154815290600101906020018083116117cd57829003601f168201915b505050505081565b600061182282604051806060016040528060298152602001613ff7602991396002612df69092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118c15780601f10611896576101008083540402835291602001916118c1565b820191906000526020600020905b8154815290600101906020018083116118a457829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613fcd602a913960400191505060405180910390fd5b611999600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e15565b9050919050565b6119a861296c565b73ffffffffffffffffffffffffffffffffffffffff166119c6611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611a4f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b67011c37937e08000081565b611b2461296c565b73ffffffffffffffffffffffffffffffffffffffff16611b42611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611bcb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600d5414611c43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5374617274696e6720696e64657820697320616c72656164792073657400000081525060200191505060405180910390fd5b43600c81905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d0e5780601f10611ce357610100808354040283529160200191611d0e565b820191906000526020600020905b815481529060010190602001808311611cf157829003601f168201915b5050505050905090565b611d2061296c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611dc1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4552433732313a20617070726f766520746f2063616c6c65720000000000000081525060200191505060405180910390fd5b8060056000611dce61296c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e7b61296c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b600f60009054906101000a900460ff16611f50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f53616c65206d7573742062652061637469766520746f206d696e74204170650081525060200191505060405180910390fd5b6014811115611faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613f746021913960400191505060405180910390fd5b600e54611fc782611fb9611390565b612e2a90919063ffffffff16565b111561201e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806140426028913960400191505060405180910390fd5b3461203a8267011c37937e080000612eb290919063ffffffff16565b11156120ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45746865722076616c75652073656e74206973206e6f7420636f72726563740081525060200191505060405180910390fd5b60005b818110156120ef5760006120c3611390565b9050600e546120d0611390565b10156120e1576120e03382612f38565b5b5080806001019150506120b1565b506000600c541480156121175750600e54612108611390565b148061211657506010544210155b5b156121245743600c819055505b50565b61212f61296c565b73ffffffffffffffffffffffffffffffffffffffff1661214d611c4c565b73ffffffffffffffffffffffffffffffffffffffff16146121d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60006121e0611390565b905060005b601e811015612207576121fa33828401612f38565b80806001019150506121e5565b5050565b61221c61221661296c565b83612a5f565b612271576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806141306031913960400191505060405180910390fd5b61227d84848484612f56565b50505050565b600e5481565b606061229482612974565b6122e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806140e0602f913960400191505060405180910390fd5b6060600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123925780601f1061236757610100808354040283529160200191612392565b820191906000526020600020905b81548152906001019060200180831161237557829003601f168201915b5050505050905060606123a3611829565b90506000815114156123b9578192505050612555565b60008251111561248a5780826040516020018083805190602001908083835b602083106123fb57805182526020820191506020810190506020830392506123d8565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b6020831061244c5780518252602082019150602081019050602083039250612429565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050612555565b8061249485612fc8565b6040516020018083805190602001908083835b602083106124ca57805182526020820191506020810190506020830392506124a7565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b6020831061251b57805182526020820191506020810190506020830392506124f8565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052925050505b919050565b600d5481565b600c5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600d5414612672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5374617274696e6720696e64657820697320616c72656164792073657400000081525060200191505060405180910390fd5b6000600c5414156126eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5374617274696e6720696e64657820626c6f636b206d7573742062652073657481525060200191505060405180910390fd5b600e54600c544060001c816126fc57fe5b06600d8190555060ff61271a600c544361310f90919063ffffffff16565b111561273a57600e54600143034060001c8161273257fe5b06600d819055505b6000600d5414156127625761275b6001600d54612e2a90919063ffffffff16565b600d819055505b565b600f60009054906101000a900460ff1681565b61277f61296c565b73ffffffffffffffffffffffffffffffffffffffff1661279d611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614612826576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128ac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613ed86026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600061298a82600261319290919063ffffffff16565b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a04836117f2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612a58826000016131ac565b9050919050565b6000612a6a82612974565b612abf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613f48602c913960400191505060405180910390fd5b6000612aca836117f2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b3957508373ffffffffffffffffffffffffffffffffffffffff16612b21846110e8565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b4a5750612b498185612566565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612b73826117f2565b73ffffffffffffffffffffffffffffffffffffffff1614612bdf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806140b76029913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613efe6024913960400191505060405180910390fd5b612c708383836131bd565b612c7b600082612991565b612ccc81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206131c290919063ffffffff16565b50612d1e81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206131dc90919063ffffffff16565b50612d35818360026131f69092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612da5836000018361322b565b60001c905092915050565b600080600080612dc386600001866132ae565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190612df2929190613de6565b5050565b6000612e09846000018460001b84613347565b60001c90509392505050565b6000612e238260000161343d565b9050919050565b600080828401905083811015612ea8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080831415612ec55760009050612f32565b6000828402905082848281612ed657fe5b0414612f2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061406a6021913960400191505060405180910390fd5b809150505b92915050565b612f5282826040518060200160405280600081525061344e565b5050565b612f61848484612b53565b612f6d848484846134bf565b612fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180613ea66032913960400191505060405180910390fd5b50505050565b60606000821415613010576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061310a565b600082905060005b6000821461303a578080600101915050600a828161303257fe5b049150613018565b60608167ffffffffffffffff8111801561305357600080fd5b506040519080825280601f01601f1916602001820160405280156130865781602001600182028036833780820191505090505b50905060006001830390508593505b6000841461310257600a84816130a757fe5b0660300160f81b828280600190039350815181106130c157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84816130fa57fe5b049350613095565b819450505050505b919050565b600082821115613187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b60006131a4836000018360001b6136d8565b905092915050565b600081600001805490509050919050565b505050565b60006131d4836000018360001b6136fb565b905092915050565b60006131ee836000018360001b6137e3565b905092915050565b6000613222846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613853565b90509392505050565b60008183600001805490501161328c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613e846022913960400191505060405180910390fd5b82600001828154811061329b57fe5b9060005260206000200154905092915050565b60008082846000018054905011613310576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140206022913960400191505060405180910390fd5b600084600001848154811061332157fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000808460010160008581526020019081526020016000205490506000811415839061340e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156133d35780820151818401526020810190506133b8565b50505050905090810190601f1680156134005780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5084600001600182038154811061342157fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b613458838361392f565b61346560008484846134bf565b6134ba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180613ea66032913960400191505060405180910390fd5b505050565b60006134e08473ffffffffffffffffffffffffffffffffffffffff16613b23565b6134ed57600190506136d0565b606061365763150b7a0260e01b61350261296c565b888787604051602401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561358657808201518184015260208101905061356b565b50505050905090810190601f1680156135b35780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001613ea6603291398773ffffffffffffffffffffffffffffffffffffffff16613b369092919063ffffffff16565b9050600081806020019051602081101561367057600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146137d7576000600182039050600060018660000180549050039050600086600001828154811061374657fe5b906000526020600020015490508087600001848154811061376357fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061379b57fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506137dd565b60009150505b92915050565b60006137ef8383613b4e565b61384857826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061384d565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156138fa57846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613928565b8285600001600183038154811061390d57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552433732313a206d696e7420746f20746865207a65726f206164647265737381525060200191505060405180910390fd5b6139db81612974565b15613a4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000081525060200191505060405180910390fd5b613a5a600083836131bd565b613aab81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206131dc90919063ffffffff16565b50613ac2818360026131f69092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6060613b458484600085613b71565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b606082471015613bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613f226026913960400191505060405180910390fd5b613bd585613b23565b613c47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310613c975780518252602082019150602081019050602083039250613c74565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613cf9576040519150601f19603f3d011682016040523d82523d6000602084013e613cfe565b606091505b5091509150613d0e828286613d1a565b92505050949350505050565b60608315613d2a57829050613ddf565b600083511115613d3d5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613da4578082015181840152602081019050613d89565b50505050905090810190601f168015613dd15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613e2757805160ff1916838001178555613e55565b82800160010185558215613e55579182015b82811115613e54578251825591602001919060010190613e39565b5b509050613e629190613e66565b5090565b5b80821115613e7f576000816000905550600101613e67565b509056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433732313a207472616e7366657220746f20746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d654552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e6473507572636861736520776f756c6420657863656564206d617820737570706c79206f662041706573536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564a2646970667358221220b0e64d1fa6c4dbeb9c6f54607d7e1996943fe27624a80652f57b53fda084621b64736f6c63430007000033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000006080e6d70000000000000000000000000000000000000000000000000000000000000011426f7265644170655961636874436c756200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044241594300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000010f2c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014426f72656420417065205761676d6920436c756200000000000000000000000000000000000000000000000000000000000000000000000000000000000000044241594300000000000000000000000000000000000000000000000000000000\n\n    Details: Insufficient funds for gas * price + value\n    Version: viem@2.47.5]\n  `)\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/core/src/actions/deployContract.ts",
    "content": "import type { Abi, Account, Chain, Client, ContractConstructorArgs } from 'viem'\nimport {\n  type DeployContractErrorType as viem_DeployContractErrorType,\n  type DeployContractParameters as viem_DeployContractParameters,\n  type DeployContractReturnType as viem_DeployContractReturnType,\n  deployContract as viem_deployContract,\n} from 'viem/actions'\nimport type { Config } from '../createConfig.js'\nimport type { BaseErrorType, ErrorType } from '../errors/base.js'\nimport type { SelectChains } from '../types/chain.js'\nimport type {\n  ChainIdParameter,\n  ConnectorParameter,\n} from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\nimport {\n  type GetConnectorClientErrorType,\n  getConnectorClient,\n} from './getConnectorClient.js'\n\nexport type DeployContractParameters<\n  abi extends Abi | readonly unknown[] = Abi,\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  ///\n  allArgs = ContractConstructorArgs<abi>,\n  chains extends readonly Chain[] = SelectChains<config, chainId>,\n> = {\n  [key in keyof chains]: Compute<\n    Omit<\n      viem_DeployContractParameters<\n        abi,\n        chains[key],\n        Account,\n        chains[key],\n        allArgs\n      >,\n      'chain'\n    > &\n      ChainIdParameter<config, chainId> &\n      ConnectorParameter\n  >\n}[number]\n\nexport type DeployContractReturnType = viem_DeployContractReturnType\n\nexport type DeployContractErrorType =\n  // getConnectorClient()\n  | GetConnectorClientErrorType\n  // base\n  | BaseErrorType\n  | ErrorType\n  // viem\n  | viem_DeployContractErrorType\n\n/** https://wagmi.sh/core/api/actions/deployContract */\nexport async function deployContract<\n  config extends Config,\n  const abi extends Abi | readonly unknown[],\n  chainId extends config['chains'][number]['id'],\n>(\n  config: config,\n  parameters: DeployContractParameters<abi, config, chainId>,\n): Promise<DeployContractReturnType> {\n  const { account, chainId, connector, ...rest } = parameters\n\n  let client: Client\n  if (typeof account === 'object' && account?.type === 'local')\n    client = config.getClient({ chainId })\n  else\n    client = await getConnectorClient(config, {\n      account: account ?? undefined,\n      assertChainId: false,\n      chainId,\n      connector,\n    })\n\n  const chain = (() => {\n    if (!chainId || client.chain?.id === chainId) return client.chain\n    return { id: chainId }\n  })()\n\n  const action = getAction(client, viem_deployContract, 'deployContract')\n  const hash = await action({\n    ...(rest as any),\n    ...(account ? { account } : {}),\n    assertChainId: !!chainId,\n    chain,\n  })\n\n  return hash\n}\n"
  },
  {
    "path": "packages/core/src/actions/disconnect.test.ts",
    "content": "import { accounts, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { mock } from '../connectors/mock.js'\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\n\nconst connector = config._internal.connectors.setup(mock({ accounts }))\n\ntest('default', async () => {\n  await connect(config, { connector })\n  expect(config.state.status).toEqual('connected')\n  await disconnect(config)\n  expect(config.state.status).toEqual('disconnected')\n})\n\ntest('parameters: connector', async () => {\n  await connect(config, { connector })\n  expect(config.state.status).toEqual('connected')\n  await disconnect(config, { connector })\n  expect(config.state.status).toEqual('disconnected')\n})\n\ntest('behavior: uses next connector on disconnect', async () => {\n  const connector_ = config._internal.connectors.setup(mock({ accounts }))\n  await connect(config, { connector: connector_ })\n  await connect(config, { connector })\n\n  expect(config.state.status).toEqual('connected')\n  await disconnect(config, { connector })\n  expect(config.state.status).toEqual('connected')\n  await disconnect(config, { connector: connector_ })\n})\n"
  },
  {
    "path": "packages/core/src/actions/disconnect.ts",
    "content": "import type { Config, Connection, Connector } from '../createConfig.js'\nimport type { BaseErrorType, ErrorType } from '../errors/base.js'\nimport type {\n  ConnectorNotConnectedErrorType,\n  ConnectorNotFoundErrorType,\n} from '../errors/config.js'\nimport type { ConnectorParameter } from '../types/properties.js'\n\nexport type DisconnectParameters = ConnectorParameter\n\nexport type DisconnectReturnType = void\n\nexport type DisconnectErrorType =\n  | ConnectorNotFoundErrorType\n  | ConnectorNotConnectedErrorType\n  // base\n  | BaseErrorType\n  | ErrorType\n\n/** https://wagmi.sh/core/api/actions/disconnect */\nexport async function disconnect(\n  config: Config,\n  parameters: DisconnectParameters = {},\n): Promise<DisconnectReturnType> {\n  let connector: Connector | undefined\n  if (parameters.connector) connector = parameters.connector\n  else {\n    const { connections, current } = config.state\n    const connection = connections.get(current!)\n    connector = connection?.connector\n  }\n\n  const connections = config.state.connections\n\n  if (connector) {\n    await connector.disconnect()\n    connector.emitter.off('change', config._internal.events.change)\n    connector.emitter.off('disconnect', config._internal.events.disconnect)\n    connector.emitter.on('connect', config._internal.events.connect)\n\n    connections.delete(connector.uid)\n  }\n\n  config.setState((x) => {\n    // if no connections exist, move to disconnected state\n    if (connections.size === 0)\n      return {\n        ...x,\n        connections: new Map(),\n        current: null,\n        status: 'disconnected',\n      }\n\n    // switch over to another connection\n    const nextConnection = connections.values().next().value as Connection\n    return {\n      ...x,\n      connections: new Map(connections),\n      current: nextConnection.connector.uid,\n    }\n  })\n\n  // Set recent connector if exists\n  {\n    const current = config.state.current\n    if (!current) return\n    const connector = config.state.connections.get(current)?.connector\n    if (!connector) return\n    await config.storage?.setItem('recentConnectorId', connector.id)\n  }\n}\n"
  },
  {
    "path": "packages/core/src/actions/estimateFeesPerGas.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\nimport { estimateFeesPerGas } from './estimateFeesPerGas.js'\n\ntest('types', async () => {\n  // default\n  {\n    const result = await estimateFeesPerGas(config, {})\n    expectTypeOf(result).toEqualTypeOf<{\n      gasPrice?: undefined\n      maxFeePerBlobGas?: undefined\n      maxFeePerGas: bigint\n      maxPriorityFeePerGas: bigint\n    }>()\n  }\n\n  // legacy\n  {\n    const result = await estimateFeesPerGas(config, { type: 'legacy' })\n    expectTypeOf(result).toEqualTypeOf<{\n      gasPrice: bigint\n      maxFeePerBlobGas?: undefined\n      maxFeePerGas?: undefined\n      maxPriorityFeePerGas?: undefined\n    }>()\n  }\n\n  // eip1559\n  {\n    const result = await estimateFeesPerGas(config, { type: 'eip1559' })\n    expectTypeOf(result).toEqualTypeOf<{\n      gasPrice?: undefined\n      maxFeePerBlobGas?: undefined\n      maxFeePerGas: bigint\n      maxPriorityFeePerGas: bigint\n    }>()\n  }\n})\n"
  },
  {
    "path": "packages/core/src/actions/estimateFeesPerGas.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { estimateFeesPerGas } from './estimateFeesPerGas.js'\n\ntest('default', async () => {\n  const result = await estimateFeesPerGas(config)\n  expect(Object.keys(result)).toMatchInlineSnapshot(`\n    [\n      \"gasPrice\",\n      \"maxFeePerGas\",\n      \"maxPriorityFeePerGas\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/actions/estimateFeesPerGas.ts",
    "content": "import type { Chain, FeeValuesType } from 'viem'\nimport {\n  type EstimateFeesPerGasErrorType as viem_EstimateFeesPerGasErrorType,\n  type EstimateFeesPerGasParameters as viem_EstimateFeesPerGasParameters,\n  type EstimateFeesPerGasReturnType as viem_EstimateFeesPerGasReturnType,\n  estimateFeesPerGas as viem_estimateFeesPerGas,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute, UnionCompute, UnionLooseOmit } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type EstimateFeesPerGasParameters<\n  type extends FeeValuesType = FeeValuesType,\n  config extends Config = Config,\n> = UnionCompute<\n  UnionLooseOmit<\n    viem_EstimateFeesPerGasParameters<Chain, Chain, type>,\n    'chain'\n  > &\n    ChainIdParameter<config>\n>\n\nexport type EstimateFeesPerGasReturnType<\n  type extends FeeValuesType = FeeValuesType,\n> = Compute<viem_EstimateFeesPerGasReturnType<type>>\n\nexport type EstimateFeesPerGasErrorType = viem_EstimateFeesPerGasErrorType\n\nexport async function estimateFeesPerGas<\n  config extends Config,\n  type extends FeeValuesType = 'eip1559',\n>(\n  config: config,\n  parameters: EstimateFeesPerGasParameters<type, config> = {},\n): Promise<EstimateFeesPerGasReturnType<type>> {\n  const { chainId, ...rest } = parameters\n\n  const client = config.getClient({ chainId })\n  const action = getAction(\n    client,\n    viem_estimateFeesPerGas,\n    'estimateFeesPerGas',\n  )\n\n  const { gasPrice, maxFeePerGas, maxPriorityFeePerGas } = await action({\n    ...rest,\n    chain: client.chain,\n  })\n\n  return {\n    gasPrice,\n    maxFeePerGas,\n    maxPriorityFeePerGas,\n  } as EstimateFeesPerGasReturnType<type>\n}\n"
  },
  {
    "path": "packages/core/src/actions/estimateGas.test-d.ts",
    "content": "import { http, parseEther } from 'viem'\nimport { celo, mainnet } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { createConfig } from '../createConfig.js'\nimport { type EstimateGasParameters, estimateGas } from './estimateGas.js'\n\ntest('chain formatters', () => {\n  const config = createConfig({\n    chains: [mainnet, celo],\n    transports: { [celo.id]: http(), [mainnet.id]: http() },\n  })\n\n  type Result = EstimateGasParameters<typeof config>\n  expectTypeOf<Result>().toMatchTypeOf<{\n    chainId?: typeof celo.id | typeof mainnet.id | undefined\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  estimateGas(config, {\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n    feeCurrency: '0x',\n  })\n\n  type Result2 = EstimateGasParameters<typeof config, typeof celo.id>\n  expectTypeOf<Result2>().toMatchTypeOf<{\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  estimateGas(config, {\n    chainId: celo.id,\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n    feeCurrency: '0x',\n  })\n\n  type Result3 = EstimateGasParameters<typeof config, typeof mainnet.id>\n  expectTypeOf<Result3>().not.toMatchTypeOf<{\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  estimateGas(config, {\n    chainId: mainnet.id,\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n})\n"
  },
  {
    "path": "packages/core/src/actions/estimateGas.test.ts",
    "content": "import { accounts, config } from '@wagmi/test'\nimport { parseEther } from 'viem'\nimport { expect, test } from 'vitest'\n\nimport { mock } from '../connectors/mock.js'\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { estimateGas } from './estimateGas.js'\n\nconst connector = config._internal.connectors.setup(mock({ accounts }))\n\ntest('parameters: account', async () => {\n  await expect(\n    estimateGas(config, {\n      account: accounts[0],\n      to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      value: parseEther('0.01'),\n    }),\n  ).resolves.toMatchInlineSnapshot('21000n')\n})\n\ntest('parameters: connector', async () => {\n  await connect(config, { connector })\n\n  await expect(\n    estimateGas(config, {\n      connector,\n      to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      value: parseEther('0.01'),\n    }),\n  ).resolves.toMatchInlineSnapshot('21000n')\n\n  await disconnect(config, { connector })\n})\n\ntest('behavior: no account and not connected', async () => {\n  await expect(\n    estimateGas(config, {\n      to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      value: parseEther('0.01'),\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [ConnectorNotConnectedError: Connector not connected.\n\n    Version: @wagmi/core@x.y.z]\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/actions/estimateGas.ts",
    "content": "import type { Account, Address, Chain } from 'viem'\nimport {\n  type EstimateGasErrorType as viem_EstimateGasErrorType,\n  type EstimateGasParameters as viem_EstimateGasParameters,\n  type EstimateGasReturnType as viem_EstimateGasReturnType,\n  estimateGas as viem_estimateGas,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { BaseErrorType, ErrorType } from '../errors/base.js'\nimport type { SelectChains } from '../types/chain.js'\nimport type {\n  ChainIdParameter,\n  ConnectorParameter,\n} from '../types/properties.js'\nimport type { UnionCompute, UnionLooseOmit } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\nimport {\n  type GetConnectorClientErrorType,\n  getConnectorClient,\n} from './getConnectorClient.js'\n\nexport type EstimateGasParameters<\n  config extends Config = Config,\n  chainId extends\n    | config['chains'][number]['id']\n    | undefined = config['chains'][number]['id'],\n  ///\n  chains extends readonly Chain[] = SelectChains<config, chainId>,\n> = {\n  [key in keyof chains]: UnionCompute<\n    UnionLooseOmit<viem_EstimateGasParameters<chains[key]>, 'chain'> &\n      ChainIdParameter<config, chainId> &\n      ConnectorParameter\n  >\n}[number]\n\nexport type EstimateGasReturnType = viem_EstimateGasReturnType\n\nexport type EstimateGasErrorType =\n  // getConnectorClient()\n  | GetConnectorClientErrorType\n  // base\n  | BaseErrorType\n  | ErrorType\n  // viem\n  | viem_EstimateGasErrorType\n\n/** https://wagmi.sh/core/api/actions/estimateGas */\nexport async function estimateGas<\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n>(\n  config: config,\n  parameters: EstimateGasParameters<config, chainId>,\n): Promise<EstimateGasReturnType> {\n  const { chainId, connector, ...rest } = parameters\n\n  let account: Address | Account\n  if (parameters.account) account = parameters.account\n  else {\n    const connectorClient = await getConnectorClient(config, {\n      account: parameters.account,\n      assertChainId: false,\n      chainId,\n      connector,\n    })\n    account = connectorClient.account\n  }\n\n  const client = config.getClient({ chainId })\n  const action = getAction(client, viem_estimateGas, 'estimateGas')\n  return action({ ...(rest as viem_EstimateGasParameters), account })\n}\n"
  },
  {
    "path": "packages/core/src/actions/estimateMaxPriorityFeePerGas.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { estimateMaxPriorityFeePerGas } from './estimateMaxPriorityFeePerGas.js'\n\ntest('default', async () => {\n  await expect(estimateMaxPriorityFeePerGas(config)).resolves.toBeDefined()\n})\n\ntest('parameters: chainId', async () => {\n  await expect(\n    estimateMaxPriorityFeePerGas(config, {\n      chainId: chain.mainnet2.id,\n    }),\n  ).resolves.toBeDefined()\n})\n"
  },
  {
    "path": "packages/core/src/actions/estimateMaxPriorityFeePerGas.ts",
    "content": "import type { Chain } from 'viem'\nimport {\n  type EstimateMaxPriorityFeePerGasErrorType as viem_EstimateMaxPriorityFeePerGasErrorType,\n  type EstimateMaxPriorityFeePerGasParameters as viem_EstimateMaxPriorityFeePerGasParameters,\n  type EstimateMaxPriorityFeePerGasReturnType as viem_EstimateMaxPriorityFeePerGasReturnType,\n  estimateMaxPriorityFeePerGas as viem_estimateMaxPriorityFeePerGas,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute, UnionLooseOmit } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type EstimateMaxPriorityFeePerGasParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n> = Compute<\n  UnionLooseOmit<\n    viem_EstimateMaxPriorityFeePerGasParameters<Chain, Chain> &\n      ChainIdParameter<config, chainId>,\n    'chain'\n  >\n>\n\nexport type EstimateMaxPriorityFeePerGasReturnType =\n  viem_EstimateMaxPriorityFeePerGasReturnType\n\nexport type EstimateMaxPriorityFeePerGasErrorType =\n  viem_EstimateMaxPriorityFeePerGasErrorType\n\n/** https://wagmi.sh/core/api/actions/estimateMaxPriorityFeePerGas */\nexport async function estimateMaxPriorityFeePerGas<\n  config extends Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n>(\n  config: config,\n  parameters: EstimateMaxPriorityFeePerGasParameters<config, chainId> = {},\n): Promise<EstimateMaxPriorityFeePerGasReturnType> {\n  const { chainId } = parameters\n  const client = config.getClient({ chainId })\n  const action = getAction(\n    client,\n    viem_estimateMaxPriorityFeePerGas,\n    'estimateMaxPriorityFeePerGas',\n  )\n  return action({ chain: client.chain })\n}\n"
  },
  {
    "path": "packages/core/src/actions/getBalance.test.ts",
    "content": "import { accounts, chain, config, testClient } from '@wagmi/test'\nimport { parseEther } from 'viem'\nimport { beforeEach, expect, test } from 'vitest'\n\nimport { getBalance } from './getBalance.js'\n\nconst address = accounts[0]\n\nbeforeEach(async () => {\n  await testClient.mainnet.setBalance({\n    address,\n    value: parseEther('10000'),\n  })\n  await testClient.mainnet.mine({ blocks: 1 })\n  await testClient.mainnet2.setBalance({\n    address,\n    value: parseEther('420'),\n  })\n  await testClient.mainnet2.mine({ blocks: 1 })\n})\n\ntest('default', async () => {\n  await expect(getBalance(config, { address })).resolves.toMatchInlineSnapshot(`\n    {\n      \"decimals\": 18,\n      \"symbol\": \"ETH\",\n      \"value\": 10000000000000000000000n,\n    }\n  `)\n\n  await testClient.mainnet.setBalance({\n    address,\n    value: parseEther('6969.12222215666'),\n  })\n  await expect(getBalance(config, { address })).resolves.toMatchInlineSnapshot(`\n    {\n      \"decimals\": 18,\n      \"symbol\": \"ETH\",\n      \"value\": 6969122222156660000000n,\n    }\n  `)\n})\n\ntest('parameters: chainId', async () => {\n  await expect(\n    getBalance(config, { address, chainId: chain.mainnet2.id }),\n  ).resolves.toMatchInlineSnapshot(`\n    {\n      \"decimals\": 18,\n      \"symbol\": \"WAG\",\n      \"value\": 420000000000000000000n,\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/actions/getBalance.ts",
    "content": "import {\n  type GetBalanceErrorType as viem_GetBalanceErrorType,\n  type GetBalanceParameters as viem_GetBalanceParameters,\n  getBalance as viem_getBalance,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type GetBalanceParameters<config extends Config = Config> = Compute<\n  ChainIdParameter<config> & viem_GetBalanceParameters\n>\n\nexport type GetBalanceReturnType = {\n  decimals: number\n  symbol: string\n  value: bigint\n}\n\nexport type GetBalanceErrorType = viem_GetBalanceErrorType\n\n/** https://wagmi.sh/core/api/actions/getBalance */\nexport async function getBalance<config extends Config>(\n  config: config,\n  parameters: GetBalanceParameters<config>,\n): Promise<GetBalanceReturnType> {\n  const { address, blockNumber, blockTag, chainId } = parameters\n\n  const client = config.getClient({ chainId })\n  const action = getAction(client, viem_getBalance, 'getBalance')\n  const value = await action(\n    blockNumber ? { address, blockNumber } : { address, blockTag },\n  )\n  const chain = config.chains.find((x) => x.id === chainId) ?? client.chain!\n  return {\n    decimals: chain.nativeCurrency.decimals,\n    symbol: chain.nativeCurrency.symbol,\n    value,\n  }\n}\n"
  },
  {
    "path": "packages/core/src/actions/getBlobBaseFee.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getBlobBaseFee } from './getBlobBaseFee.js'\n\ntest('default', async () => {\n  await expect(getBlobBaseFee(config)).resolves.toBeTypeOf('bigint')\n})\n\ntest('parameters: chainId', async () => {\n  await expect(\n    getBlobBaseFee(config, { chainId: config.chains[0].id }),\n  ).resolves.toBeTypeOf('bigint')\n})\n"
  },
  {
    "path": "packages/core/src/actions/getBlobBaseFee.ts",
    "content": "import {\n  type GetBlobBaseFeeErrorType as viem_GetBlobBaseFeeErrorType,\n  type GetBlobBaseFeeReturnType as viem_GetBlobBaseFeeReturnType,\n  getBlobBaseFee as viem_getBlobBaseFee,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type GetBlobBaseFeeParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n> = Compute<ChainIdParameter<config, chainId>>\n\nexport type GetBlobBaseFeeReturnType = viem_GetBlobBaseFeeReturnType\n\nexport type GetBlobBaseFeeErrorType = viem_GetBlobBaseFeeErrorType\n\n/** https://wagmi.sh/core/api/actions/getBlobBaseFee */\nexport function getBlobBaseFee<\n  config extends Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n>(\n  config: config,\n  parameters: GetBlobBaseFeeParameters<config, chainId> = {},\n): Promise<GetBlobBaseFeeReturnType> {\n  const { chainId } = parameters\n  const client = config.getClient({ chainId })\n  const action = getAction(client, viem_getBlobBaseFee, 'getBlobBaseFee')\n  return action({})\n}\n"
  },
  {
    "path": "packages/core/src/actions/getBlock.test-d.ts",
    "content": "import { type Hex, http } from 'viem'\nimport { celo, mainnet } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { createConfig } from '../createConfig.js'\nimport { getBlock } from './getBlock.js'\n\ntest('chain formatters', async () => {\n  const config = createConfig({\n    chains: [celo, mainnet],\n    transports: { [celo.id]: http(), [mainnet.id]: http() },\n  })\n  const result = await getBlock(config)\n  if (result.chainId === celo.id) {\n    expectTypeOf(result.difficulty).toEqualTypeOf<bigint>()\n    expectTypeOf(result.gasLimit).toEqualTypeOf<bigint>()\n    expectTypeOf(result.mixHash).toEqualTypeOf<Hex>()\n    expectTypeOf(result.nonce).toEqualTypeOf<`0x${string}`>()\n    expectTypeOf(result.uncles).toEqualTypeOf<Hex[]>()\n  }\n})\n\ntest('chainId', async () => {\n  const config = createConfig({\n    chains: [celo, mainnet],\n    transports: { [celo.id]: http(), [mainnet.id]: http() },\n  })\n  const result = await getBlock(config, {\n    chainId: celo.id,\n  })\n  expectTypeOf(result.difficulty).toEqualTypeOf<bigint>()\n  expectTypeOf(result.gasLimit).toEqualTypeOf<bigint>()\n  expectTypeOf(result.mixHash).toEqualTypeOf<Hex>()\n  expectTypeOf(result.nonce).toEqualTypeOf<`0x${string}`>()\n})\n"
  },
  {
    "path": "packages/core/src/actions/getBlock.test.ts",
    "content": "import { config, mainnet } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getBlock } from './getBlock.js'\n\ntest('default', async () => {\n  await expect(getBlock(config)).resolves.toBeDefined()\n})\n\ntest('args: blockNumber', async () => {\n  const { transactions, ...block } = await getBlock(config, {\n    blockNumber: mainnet.fork.blockNumber,\n  })\n  expect(transactions).toMatchObject(\n    expect.arrayContaining([expect.any(String)]),\n  )\n  expect(block).toMatchInlineSnapshot(`\n    {\n      \"baseFeePerGas\": 194923488n,\n      \"blobGasUsed\": 786432n,\n      \"chainId\": 1,\n      \"difficulty\": 0n,\n      \"excessBlobGas\": 0n,\n      \"extraData\": \"0x546974616e2028746974616e6275696c6465722e78797a29\",\n      \"gasLimit\": 45000000n,\n      \"gasUsed\": 30531630n,\n      \"hash\": \"0xe38d4bb2060a54519508612f40ef737a09c5b20488c12b0bec2d4f5ea7073c15\",\n      \"logsBloom\": \"0x3effc77fb16497fa74fffeb6ef65dfbd7b97f8dd7f198ff37abfcf5fdeb329e7bdbc9d8caffdf765f7b75df9e737eff773fbf639ff9ffb376fb726a7ff2f68dffea0de7fafd3f7fbff8d5fdff57becf3e76f3f73fefc1ff9bbf9df7fb3fffff13f577b7fdffeb7f7ffb8cd71ff93fff3bfffd7e3bfbe576daefdfff6fb5afedf8ffbbd7d7baf977f46fbffceebfbe86fc6ffb6f1eff3fbbfbeb9eefbf954ffe3fbff9d73b8f9ecfdcfdf7df3fdd9ff3bbfdfe9efe8ffee6ff7fe4a3ff7a5fefbfffffcffcd7f2bc04bdf7c52d3fdfeff3f7dfe7b4fefa9f46edb53c2de9ffb7f3ffdff6fefa67f64f6e7f7bff5af1dffffeff9b99ff86fef589e3bbfffdfffb7\",\n      \"miner\": \"0x4838b106fce9647bdf1e7877bf73ce8b0bad5f97\",\n      \"mixHash\": \"0x15350a0cad9bc5cb1298b3710db038850f1df5d8ac00c4ca3b03fb64c7e8ab78\",\n      \"nonce\": \"0x0000000000000000\",\n      \"number\": 23535880n,\n      \"parentBeaconBlockRoot\": \"0x2bd55d2f0e1a3d3e181659ebc21bb167527e517de88b39b0d7ebbeeb3e28eebc\",\n      \"parentHash\": \"0x1fab238a9630a2e95c8b735ebc63bc2751bc6492f409ee16a7b5a532985196eb\",\n      \"receiptsRoot\": \"0x01d0a60dd8fd8de710a191aba91f82e2a437ac21a6e77b21b2f745809e7feadf\",\n      \"requestsHash\": \"0x965c860907968cab126093a785436ad747495ae45b21dac1b6a92ae0f4866ce0\",\n      \"sha3Uncles\": \"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347\",\n      \"size\": 155442n,\n      \"stateRoot\": \"0xd3c86549e5d57f14bd0b28630b70cb68038ac3334251bd194c93a18d96492f39\",\n      \"timestamp\": 1759960991n,\n      \"totalDifficulty\": null,\n      \"transactionsRoot\": \"0x9da0226f723a9da4b8df8782930c0e83bd73c4a393069ee7861465188eed989b\",\n      \"uncles\": [],\n      \"withdrawals\": [\n        {\n          \"address\": \"0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f\",\n          \"amount\": \"0x11a6bd6\",\n          \"index\": \"0x633236b\",\n          \"validatorIndex\": \"0xb8688\",\n        },\n        {\n          \"address\": \"0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f\",\n          \"amount\": \"0x119ebba\",\n          \"index\": \"0x633236c\",\n          \"validatorIndex\": \"0xb8689\",\n        },\n        {\n          \"address\": \"0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f\",\n          \"amount\": \"0x11a167c\",\n          \"index\": \"0x633236d\",\n          \"validatorIndex\": \"0xb868a\",\n        },\n        {\n          \"address\": \"0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f\",\n          \"amount\": \"0x11a2017\",\n          \"index\": \"0x633236e\",\n          \"validatorIndex\": \"0xb868b\",\n        },\n        {\n          \"address\": \"0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f\",\n          \"amount\": \"0x11a5b81\",\n          \"index\": \"0x633236f\",\n          \"validatorIndex\": \"0xb868c\",\n        },\n        {\n          \"address\": \"0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f\",\n          \"amount\": \"0x11a4908\",\n          \"index\": \"0x6332370\",\n          \"validatorIndex\": \"0xb868d\",\n        },\n        {\n          \"address\": \"0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f\",\n          \"amount\": \"0x11a74ca\",\n          \"index\": \"0x6332371\",\n          \"validatorIndex\": \"0xb868e\",\n        },\n        {\n          \"address\": \"0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f\",\n          \"amount\": \"0x11a5a90\",\n          \"index\": \"0x6332372\",\n          \"validatorIndex\": \"0xb868f\",\n        },\n        {\n          \"address\": \"0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f\",\n          \"amount\": \"0x11a512b\",\n          \"index\": \"0x6332373\",\n          \"validatorIndex\": \"0xb8690\",\n        },\n        {\n          \"address\": \"0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f\",\n          \"amount\": \"0x11a0ba7\",\n          \"index\": \"0x6332374\",\n          \"validatorIndex\": \"0xb8691\",\n        },\n        {\n          \"address\": \"0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f\",\n          \"amount\": \"0x11a313b\",\n          \"index\": \"0x6332375\",\n          \"validatorIndex\": \"0xb8692\",\n        },\n        {\n          \"address\": \"0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f\",\n          \"amount\": \"0x3e72765\",\n          \"index\": \"0x6332376\",\n          \"validatorIndex\": \"0xb8693\",\n        },\n        {\n          \"address\": \"0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f\",\n          \"amount\": \"0x119c821\",\n          \"index\": \"0x6332377\",\n          \"validatorIndex\": \"0xb8694\",\n        },\n        {\n          \"address\": \"0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f\",\n          \"amount\": \"0x119e921\",\n          \"index\": \"0x6332378\",\n          \"validatorIndex\": \"0xb8695\",\n        },\n        {\n          \"address\": \"0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f\",\n          \"amount\": \"0x119f302\",\n          \"index\": \"0x6332379\",\n          \"validatorIndex\": \"0xb8696\",\n        },\n        {\n          \"address\": \"0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f\",\n          \"amount\": \"0x11a38a8\",\n          \"index\": \"0x633237a\",\n          \"validatorIndex\": \"0xb8697\",\n        },\n      ],\n      \"withdrawalsRoot\": \"0x0740ba007069960b2d60f77b0ce2648cffa3573accd055d4803eb771e32903e7\",\n    }\n  `)\n})\n\ntest('args: includeTransactions', async () => {\n  const { transactions } = await getBlock(config, {\n    includeTransactions: true,\n    blockNumber: mainnet.fork.blockNumber,\n  })\n  expect(transactions).toMatchObject(\n    expect.arrayContaining([expect.any(Object)]),\n  )\n})\n"
  },
  {
    "path": "packages/core/src/actions/getBlock.ts",
    "content": "import type { BlockTag, Chain } from 'viem'\nimport {\n  type GetBlockErrorType as viem_GetBlockErrorType,\n  type GetBlockParameters as viem_GetBlockParameters,\n  type GetBlockReturnType as viem_GetBlockReturnType,\n  getBlock as viem_getBlock,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { SelectChains } from '../types/chain.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute, IsNarrowable } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type GetBlockParameters<\n  includeTransactions extends boolean = false,\n  blockTag extends BlockTag = 'latest',\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n> = Compute<\n  viem_GetBlockParameters<includeTransactions, blockTag> &\n    ChainIdParameter<config, chainId>\n>\n\nexport type GetBlockReturnType<\n  includeTransactions extends boolean = false,\n  blockTag extends BlockTag = 'latest',\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  ///\n  chains extends readonly Chain[] = SelectChains<config, chainId>,\n> = Compute<\n  {\n    [key in keyof chains]: viem_GetBlockReturnType<\n      IsNarrowable<chains[key], Chain> extends true ? chains[key] : undefined,\n      includeTransactions,\n      blockTag\n    > & { chainId: chains[key]['id'] }\n  }[number]\n>\n\nexport type GetBlockErrorType = viem_GetBlockErrorType\n\n/** https://wagmi.sh/core/actions/getBlock */\nexport async function getBlock<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  includeTransactions extends boolean = false,\n  blockTag extends BlockTag = 'latest',\n>(\n  config: config,\n  parameters: GetBlockParameters<\n    includeTransactions,\n    blockTag,\n    config,\n    chainId\n  > = {},\n): Promise<GetBlockReturnType<includeTransactions, blockTag, config, chainId>> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  const action = getAction(client, viem_getBlock, 'getBlock')\n  const block = await action(rest)\n  return {\n    ...(block as unknown as GetBlockReturnType<\n      includeTransactions,\n      blockTag,\n      config,\n      chainId\n    >),\n    chainId: client.chain.id,\n  }\n}\n"
  },
  {
    "path": "packages/core/src/actions/getBlockNumber.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getBlockNumber } from './getBlockNumber.js'\n\ntest('default', async () => {\n  await expect(getBlockNumber(config)).resolves.toBeDefined()\n})\n"
  },
  {
    "path": "packages/core/src/actions/getBlockNumber.ts",
    "content": "import {\n  type GetBlockNumberErrorType as viem_GetBlockNumberErrorType,\n  type GetBlockNumberParameters as viem_GetBlockNumberParameters,\n  type GetBlockNumberReturnType as viem_GetBlockNumberReturnType,\n  getBlockNumber as viem_getBlockNumber,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type GetBlockNumberParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n> = Compute<viem_GetBlockNumberParameters & ChainIdParameter<config, chainId>>\n\nexport type GetBlockNumberReturnType = viem_GetBlockNumberReturnType\n\nexport type GetBlockNumberErrorType = viem_GetBlockNumberErrorType\n\n/** https://wagmi.sh/core/api/actions/getBlockNumber */\nexport function getBlockNumber<\n  config extends Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n>(\n  config: config,\n  parameters: GetBlockNumberParameters<config, chainId> = {},\n): Promise<GetBlockNumberReturnType> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  const action = getAction(client, viem_getBlockNumber, 'getBlockNumber')\n  return action(rest)\n}\n"
  },
  {
    "path": "packages/core/src/actions/getBlockTransactionCount.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getBlockTransactionCount } from './getBlockTransactionCount.js'\n\ntest('default', async () => {\n  await expect(getBlockTransactionCount(config)).resolves.toBeTypeOf('number')\n})\n\ntest('parameters: chainId', async () => {\n  await expect(\n    getBlockTransactionCount(config, { chainId: chain.mainnet2.id }),\n  ).resolves.toBeTypeOf('number')\n})\n\ntest('parameters: blockNumber', async () => {\n  await expect(\n    getBlockTransactionCount(config, { blockNumber: 13677382n }),\n  ).resolves.toBeTypeOf('number')\n})\n\ntest('parameters: blockHash', async () => {\n  await expect(\n    getBlockTransactionCount(config, {\n      blockHash:\n        '0x6201f37a245850d1f11e4be3ac45bc51bd9d43ee4a127192cad550f351cfa575',\n    }),\n  ).resolves.toBeTypeOf('number')\n})\n\ntest('parameters: blockTag', async () => {\n  await expect(\n    getBlockTransactionCount(config, {\n      blockTag: 'earliest',\n    }),\n  ).resolves.toBeTypeOf('number')\n\n  await expect(\n    getBlockTransactionCount(config, {\n      blockTag: 'finalized',\n    }),\n  ).resolves.toBeTypeOf('number')\n\n  await expect(\n    getBlockTransactionCount(config, {\n      blockTag: 'latest',\n    }),\n  ).resolves.toBeTypeOf('number')\n\n  await expect(\n    getBlockTransactionCount(config, {\n      blockTag: 'pending',\n    }),\n  ).resolves.toBeTypeOf('number')\n\n  await expect(\n    getBlockTransactionCount(config, {\n      blockTag: 'safe',\n    }),\n  ).resolves.toBeTypeOf('number')\n})\n"
  },
  {
    "path": "packages/core/src/actions/getBlockTransactionCount.ts",
    "content": "import {\n  type GetBlockTransactionCountErrorType as viem_GetBlockTransactionCountErrorType,\n  type GetBlockTransactionCountParameters as viem_GetBlockTransactionCountParameters,\n  type GetBlockTransactionCountReturnType as viem_GetBlockTransactionCountReturnType,\n  getBlockTransactionCount as viem_getBlockTransactionCount,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { UnionCompute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type GetBlockTransactionCountParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n> = UnionCompute<\n  viem_GetBlockTransactionCountParameters & ChainIdParameter<config, chainId>\n>\n\nexport type GetBlockTransactionCountReturnType =\n  viem_GetBlockTransactionCountReturnType\n\nexport type GetBlockTransactionCountErrorType =\n  viem_GetBlockTransactionCountErrorType\n\n/** https://wagmi.sh/core/api/actions/getBlockTransactionCount */\nexport function getBlockTransactionCount<\n  config extends Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n>(\n  config: config,\n  parameters: GetBlockTransactionCountParameters<config, chainId> = {},\n): Promise<GetBlockTransactionCountReturnType> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  const action = getAction(\n    client,\n    viem_getBlockTransactionCount,\n    'getBlockTransactionCount',\n  )\n  return action(rest)\n}\n"
  },
  {
    "path": "packages/core/src/actions/getBytecode.test.ts",
    "content": "import { address, chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getBytecode } from './getBytecode.js'\n\ntest('default', async () => {\n  await expect(\n    getBytecode(config, {\n      address: '0x0000000000000000000000000000000000000000',\n    }),\n  ).resolves.toBe(undefined)\n\n  await expect(\n    getBytecode(config, {\n      address: address.wagmiMintExample,\n    }),\n  ).resolves.toMatch(/^0x.*/)\n})\n\ntest('parameters: blockNumber', async () => {\n  await expect(\n    getBytecode(config, {\n      address: address.wagmiMintExample,\n      blockNumber: 15564163n,\n    }),\n  ).resolves.toBe(undefined)\n})\n\ntest('parameters: blockTag', async () => {\n  await expect(\n    getBytecode(config, {\n      address: address.wagmiMintExample,\n      blockTag: 'earliest',\n    }),\n  ).resolves.toBe(undefined)\n})\n\ntest('parameters: chainId', async () => {\n  await expect(\n    getBytecode(config, {\n      address: address.wagmiMintExample,\n      chainId: chain.optimism.id,\n    }),\n  ).resolves.toBe(undefined)\n})\n"
  },
  {
    "path": "packages/core/src/actions/getBytecode.ts",
    "content": "import {\n  type GetBytecodeErrorType as viem_GetBytecodeErrorType,\n  type GetBytecodeParameters as viem_GetBytecodeParameters,\n  type GetBytecodeReturnType as viem_GetBytecodeReturnType,\n  getBytecode as viem_getBytecode,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type GetBytecodeParameters<config extends Config = Config> = Compute<\n  viem_GetBytecodeParameters & ChainIdParameter<config>\n>\n\nexport type GetBytecodeReturnType = viem_GetBytecodeReturnType\n\nexport type GetBytecodeErrorType = viem_GetBytecodeErrorType\n\n/** https://wagmi.sh/core/api/actions/getBytecode */\nexport async function getBytecode<config extends Config>(\n  config: config,\n  parameters: GetBytecodeParameters<config>,\n): Promise<GetBytecodeReturnType> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  const action = getAction(client, viem_getBytecode, 'getBytecode')\n  return action(rest)\n}\n"
  },
  {
    "path": "packages/core/src/actions/getCallsStatus.test.ts",
    "content": "import { accounts, config, testClient } from '@wagmi/test'\nimport { parseEther } from 'viem'\nimport { expect, test } from 'vitest'\n\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { getCallsStatus } from './getCallsStatus.js'\nimport { sendCalls } from './sendCalls.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n  const { id } = await sendCalls(config, {\n    calls: [\n      {\n        data: '0xdeadbeef',\n        to: accounts[1],\n        value: parseEther('1'),\n      },\n      {\n        to: accounts[2],\n        value: parseEther('2'),\n      },\n      {\n        to: accounts[3],\n        value: parseEther('3'),\n      },\n    ],\n  })\n  await testClient.mainnet.mine({ blocks: 1 })\n  const { receipts, status } = await getCallsStatus(config, {\n    id,\n  })\n\n  expect(status).toBe('success')\n  expect(\n    receipts?.map((x) => ({\n      ...x,\n      blockHash: undefined,\n      transactionHash: undefined,\n    })),\n  ).toMatchInlineSnapshot(\n    `\n    [\n      {\n        \"blockHash\": undefined,\n        \"blockNumber\": 23535881n,\n        \"gasUsed\": 21160n,\n        \"logs\": [],\n        \"status\": \"success\",\n        \"transactionHash\": undefined,\n      },\n      {\n        \"blockHash\": undefined,\n        \"blockNumber\": 23535881n,\n        \"gasUsed\": 21000n,\n        \"logs\": [],\n        \"status\": \"success\",\n        \"transactionHash\": undefined,\n      },\n      {\n        \"blockHash\": undefined,\n        \"blockNumber\": 23535881n,\n        \"gasUsed\": 21000n,\n        \"logs\": [],\n        \"status\": \"success\",\n        \"transactionHash\": undefined,\n      },\n    ]\n  `,\n  )\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/core/src/actions/getCallsStatus.ts",
    "content": "import {\n  type GetCallsStatusErrorType as viem_GetCallsStatusErrorType,\n  type GetCallsStatusParameters as viem_GetCallsStatusParameters,\n  type GetCallsStatusReturnType as viem_GetCallsStatusReturnType,\n  getCallsStatus as viem_getCallsStatus,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ConnectorParameter } from '../types/properties.js'\nimport { getAction } from '../utils/getAction.js'\nimport { getConnectorClient } from './getConnectorClient.js'\n\nexport type GetCallsStatusParameters = viem_GetCallsStatusParameters &\n  ConnectorParameter\n\nexport type GetCallsStatusReturnType = viem_GetCallsStatusReturnType\n\nexport type GetCallsStatusErrorType = viem_GetCallsStatusErrorType\n\n/** https://wagmi.sh/core/api/actions/getCallsStatus */\nexport async function getCallsStatus<config extends Config>(\n  config: config,\n  parameters: GetCallsStatusParameters,\n): Promise<GetCallsStatusReturnType> {\n  const { connector, id } = parameters\n  const client = await getConnectorClient(config, { connector })\n  const action = getAction(client, viem_getCallsStatus, 'getCallsStatus')\n  return action({ id })\n}\n"
  },
  {
    "path": "packages/core/src/actions/getCapabilities.test.ts",
    "content": "import { accounts, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { getCapabilities } from './getCapabilities.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n  const capabilities = await getCapabilities(config)\n  expect(capabilities).toMatchInlineSnapshot(`\n    {\n      \"8453\": {\n        \"paymasterService\": {\n          \"supported\": true,\n        },\n        \"sessionKeys\": {\n          \"supported\": true,\n        },\n      },\n      \"84532\": {\n        \"paymasterService\": {\n          \"supported\": true,\n        },\n      },\n    }\n  `)\n  await disconnect(config, { connector })\n})\n\ntest('args: account', async () => {\n  await connect(config, { connector })\n  const capabilities = await getCapabilities(config, {\n    account: accounts[1],\n  })\n  expect(capabilities).toMatchInlineSnapshot(`\n    {\n      \"8453\": {\n        \"paymasterService\": {\n          \"supported\": false,\n        },\n        \"sessionKeys\": {\n          \"supported\": true,\n        },\n      },\n      \"84532\": {\n        \"paymasterService\": {\n          \"supported\": false,\n        },\n      },\n    }\n  `)\n  await disconnect(config, { connector })\n})\n\ntest('behavior: not connected', async () => {\n  await expect(getCapabilities(config)).rejects.toMatchInlineSnapshot(`\n    [ConnectorNotConnectedError: Connector not connected.\n\n    Version: @wagmi/core@x.y.z]\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/actions/getCapabilities.ts",
    "content": "import type { Account } from 'viem'\nimport {\n  type GetCapabilitiesErrorType as viem_GetCapabilitiesErrorType,\n  type GetCapabilitiesParameters as viem_GetCapabilitiesParameters,\n  type GetCapabilitiesReturnType as viem_GetCapabilitiesReturnType,\n  getCapabilities as viem_getCapabilities,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ConnectorParameter } from '../types/properties.js'\nimport { getConnectorClient } from './getConnectorClient.js'\n\nexport type GetCapabilitiesParameters<\n  config extends Config = Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n> = viem_GetCapabilitiesParameters<chainId> & ConnectorParameter\n\nexport type GetCapabilitiesReturnType<\n  config extends Config = Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n> = viem_GetCapabilitiesReturnType<chainId>\n\nexport type GetCapabilitiesErrorType = viem_GetCapabilitiesErrorType\n\n/** https://wagmi.sh/core/api/actions/getCapabilities */\nexport async function getCapabilities<\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n>(\n  config: config,\n  parameters: GetCapabilitiesParameters<config, chainId> = {},\n): Promise<GetCapabilitiesReturnType<config, chainId>> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, { account, connector })\n  return viem_getCapabilities(client as any, {\n    account: account as Account,\n    chainId,\n  })\n}\n"
  },
  {
    "path": "packages/core/src/actions/getChainId.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getChainId } from './getChainId.js'\n\ntest('default', async () => {\n  expect(getChainId(config)).toEqual(chain.mainnet.id)\n  config.setState((x) => ({ ...x, chainId: chain.mainnet2.id }))\n  expect(getChainId(config)).toEqual(chain.mainnet2.id)\n})\n"
  },
  {
    "path": "packages/core/src/actions/getChainId.ts",
    "content": "import type { Config } from '../createConfig.js'\n\nexport type GetChainIdReturnType<config extends Config = Config> =\n  config['chains'][number]['id']\n\n/** https://wagmi.sh/core/api/actions/getChainId */\nexport function getChainId<config extends Config>(\n  config: config,\n): GetChainIdReturnType<config> {\n  return config.state.chainId\n}\n"
  },
  {
    "path": "packages/core/src/actions/getChains.test-d.ts",
    "content": "import { type chain, config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { getChains } from './getChains.js'\n\ntest('default', async () => {\n  const chains = getChains(config)\n  expectTypeOf(chains[0]).toEqualTypeOf<typeof chain.mainnet>()\n  expectTypeOf(chains[2]).toEqualTypeOf<typeof chain.optimism>()\n})\n"
  },
  {
    "path": "packages/core/src/actions/getChains.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getChains } from './getChains.js'\n\ntest('default', async () => {\n  expect(getChains(config)).toEqual([\n    chain.mainnet,\n    chain.mainnet2,\n    chain.optimism,\n  ])\n  config._internal.chains.setState([chain.mainnet, chain.mainnet2])\n  expect(getChains(config)).toEqual([chain.mainnet, chain.mainnet2])\n})\n"
  },
  {
    "path": "packages/core/src/actions/getChains.ts",
    "content": "import type { Chain } from 'viem'\nimport type { Config } from '../createConfig.js'\nimport { deepEqual } from '../utils/deepEqual.js'\n\nexport type GetChainsReturnType<config extends Config = Config> =\n  config['chains']\n\nlet previousChains: readonly Chain[] = []\n\n/** https://wagmi.sh/core/api/actions/getChains */\nexport function getChains<config extends Config>(\n  config: config,\n): GetChainsReturnType<config> {\n  const chains = config.chains\n  if (deepEqual(previousChains, chains))\n    return previousChains as GetChainsReturnType<config>\n  previousChains = chains\n  return chains as unknown as GetChainsReturnType<config>\n}\n"
  },
  {
    "path": "packages/core/src/actions/getClient.test-d.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { getClient } from './getClient.js'\n\ntest('default', () => {\n  const client = getClient(config)\n  expectTypeOf(client.chain).toEqualTypeOf<(typeof config)['chains'][number]>()\n  expectTypeOf(client.transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('parameters: chainId', () => {\n  const client = getClient(config, {\n    chainId: chain.mainnet.id,\n  })\n  expectTypeOf(client.chain).toEqualTypeOf<typeof chain.mainnet>()\n  expectTypeOf(client.chain).not.toEqualTypeOf<typeof chain.mainnet2>()\n  expectTypeOf(client.transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('behavior: unconfigured chain', () => {\n  const client = getClient(config, {\n    // @ts-expect-error\n    chainId: 123456,\n  })\n  expectTypeOf(client).toEqualTypeOf<undefined>()\n})\n"
  },
  {
    "path": "packages/core/src/actions/getClient.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getClient } from './getClient.js'\n\ntest('default', () => {\n  expect(getClient(config)).toBeDefined()\n})\n\ntest('behavior: unconfigured chain', () => {\n  expect(\n    getClient(config, {\n      // @ts-expect-error\n      chainId: 123456,\n    }),\n  ).toBeUndefined()\n})\n"
  },
  {
    "path": "packages/core/src/actions/getClient.ts",
    "content": "import type { Client } from 'viem'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute, IsNarrowable } from '../types/utils.js'\n\nexport type GetClientParameters<\n  config extends Config = Config,\n  chainId extends\n    | config['chains'][number]['id']\n    | number\n    | undefined = config['chains'][number]['id'],\n> = ChainIdParameter<config, chainId>\n\nexport type GetClientReturnType<\n  config extends Config = Config,\n  chainId extends\n    | config['chains'][number]['id']\n    | undefined = config['chains'][number]['id'],\n  ///\n  resolvedChainId extends\n    | config['chains'][number]['id']\n    | undefined = IsNarrowable<\n    config['chains'][number]['id'],\n    number\n  > extends true\n    ? IsNarrowable<chainId, number> extends true\n      ? chainId\n      : config['chains'][number]['id']\n    : config['chains'][number]['id'] | undefined,\n> = resolvedChainId extends config['chains'][number]['id']\n  ? Compute<\n      Client<\n        config['_internal']['transports'][resolvedChainId],\n        Extract<config['chains'][number], { id: resolvedChainId }>\n      >\n    >\n  : undefined\n\nexport function getClient<\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | number | undefined,\n>(\n  config: config,\n  parameters: GetClientParameters<config, chainId> = {},\n): GetClientReturnType<config, chainId> {\n  try {\n    return config.getClient(parameters) as GetClientReturnType<config, chainId>\n  } catch {\n    return undefined as never\n  }\n}\n"
  },
  {
    "path": "packages/core/src/actions/getConnection.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport type { Address } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\n\nimport type { Connector } from '../createConfig.js'\nimport { getConnection } from './getConnection.js'\n\ntest('states', () => {\n  const result = getConnection(config)\n\n  switch (result.status) {\n    case 'reconnecting': {\n      expectTypeOf(result).toMatchTypeOf<{\n        address: Address | undefined\n        chain: (typeof config)['chains'][number] | undefined\n        chainId: number | undefined\n        connector: Connector | undefined\n        isConnected: boolean\n        isConnecting: false\n        isDisconnected: false\n        isReconnecting: true\n        status: 'reconnecting'\n      }>()\n      break\n    }\n    case 'connecting': {\n      expectTypeOf(result).toMatchTypeOf<{\n        address: Address | undefined\n        chain: (typeof config)['chains'][number] | undefined\n        chainId: number | undefined\n        connector: Connector | undefined\n        isConnected: false\n        isReconnecting: false\n        isConnecting: true\n        isDisconnected: false\n        status: 'connecting'\n      }>()\n      break\n    }\n    case 'connected': {\n      expectTypeOf(result).toMatchTypeOf<{\n        address: Address\n        chain: (typeof config)['chains'][number] | undefined\n        chainId: number\n        connector: Connector\n        isConnected: true\n        isConnecting: false\n        isDisconnected: false\n        isReconnecting: false\n        status: 'connected'\n      }>()\n      break\n    }\n    case 'disconnected': {\n      expectTypeOf(result).toMatchTypeOf<{\n        address: undefined\n        chain: undefined\n        chainId: undefined\n        connector: undefined\n        isConnected: false\n        isReconnecting: false\n        isConnecting: false\n        isDisconnected: true\n        status: 'disconnected'\n      }>()\n      break\n    }\n  }\n})\n"
  },
  {
    "path": "packages/core/src/actions/getConnection.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { getConnection } from './getConnection.js'\n\ntest('default', () => {\n  expect(getConnection(config)).toMatchInlineSnapshot(`\n    {\n      \"address\": undefined,\n      \"addresses\": undefined,\n      \"chain\": undefined,\n      \"chainId\": undefined,\n      \"connector\": undefined,\n      \"isConnected\": false,\n      \"isConnecting\": false,\n      \"isDisconnected\": true,\n      \"isReconnecting\": false,\n      \"status\": \"disconnected\",\n    }\n  `)\n})\n\ntest('behavior: connected', async () => {\n  let result = getConnection(config)\n  expect(result.status).toEqual('disconnected')\n\n  await connect(config, { connector: config.connectors[0]! })\n  result = getConnection(config)\n  expect(result.address).toBeDefined()\n  expect(result.status).toEqual('connected')\n\n  await disconnect(config)\n  result = getConnection(config)\n  expect(result.status).toEqual('disconnected')\n})\n"
  },
  {
    "path": "packages/core/src/actions/getConnection.ts",
    "content": "import type { Address, Chain } from 'viem'\n\nimport type { Config, Connector } from '../createConfig.js'\n\nexport type GetConnectionReturnType<\n  config extends Config = Config,\n  ///\n  chain = Config extends config ? Chain : config['chains'][number],\n> =\n  | {\n      address: Address\n      addresses: readonly [Address, ...Address[]]\n      chain: chain | undefined\n      chainId: number\n      connector: Connector\n      isConnected: true\n      isConnecting: false\n      isDisconnected: false\n      isReconnecting: false\n      status: 'connected'\n    }\n  | {\n      address: Address | undefined\n      addresses: readonly Address[] | undefined\n      chain: chain | undefined\n      chainId: number | undefined\n      connector: Connector | undefined\n      isConnected: boolean\n      isConnecting: false\n      isDisconnected: false\n      isReconnecting: true\n      status: 'reconnecting'\n    }\n  | {\n      address: Address | undefined\n      addresses: readonly Address[] | undefined\n      chain: chain | undefined\n      chainId: number | undefined\n      connector: Connector | undefined\n      isConnected: false\n      isReconnecting: false\n      isConnecting: true\n      isDisconnected: false\n      status: 'connecting'\n    }\n  | {\n      address: undefined\n      addresses: undefined\n      chain: undefined\n      chainId: undefined\n      connector: undefined\n      isConnected: false\n      isReconnecting: false\n      isConnecting: false\n      isDisconnected: true\n      status: 'disconnected'\n    }\n\n/** https://wagmi.sh/core/api/actions/getConnection */\nexport function getConnection<config extends Config>(\n  config: config,\n): GetConnectionReturnType<config> {\n  const uid = config.state.current!\n  const connection = config.state.connections.get(uid)\n  const addresses = connection?.accounts\n  const address = addresses?.[0]\n  const chain = config.chains.find(\n    (chain) => chain.id === connection?.chainId,\n  ) as GetConnectionReturnType<config>['chain']\n  const status = config.state.status\n\n  switch (status) {\n    case 'connected':\n      return {\n        address: address!,\n        addresses: addresses!,\n        chain,\n        chainId: connection?.chainId!,\n        connector: connection?.connector!,\n        isConnected: true,\n        isConnecting: false,\n        isDisconnected: false,\n        isReconnecting: false,\n        status,\n      }\n    case 'reconnecting':\n      return {\n        address,\n        addresses,\n        chain,\n        chainId: connection?.chainId,\n        connector: connection?.connector,\n        isConnected: !!address,\n        isConnecting: false,\n        isDisconnected: false,\n        isReconnecting: true,\n        status,\n      }\n    case 'connecting':\n      return {\n        address,\n        addresses,\n        chain,\n        chainId: connection?.chainId,\n        connector: connection?.connector,\n        isConnected: false,\n        isConnecting: true,\n        isDisconnected: false,\n        isReconnecting: false,\n        status,\n      }\n    case 'disconnected':\n      return {\n        address: undefined,\n        addresses: undefined,\n        chain: undefined,\n        chainId: undefined,\n        connector: undefined,\n        isConnected: false,\n        isConnecting: false,\n        isDisconnected: true,\n        isReconnecting: false,\n        status,\n      }\n  }\n}\n"
  },
  {
    "path": "packages/core/src/actions/getConnections.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { getConnections } from './getConnections.js'\n\ntest('default', async () => {\n  const connector = config.connectors[0]!\n  expect(getConnections(config)).toEqual([])\n  await connect(config, { connector })\n  expect(getConnections(config).length).toEqual(1)\n  await disconnect(config, { connector })\n  expect(getConnections(config)).toEqual([])\n})\n"
  },
  {
    "path": "packages/core/src/actions/getConnections.ts",
    "content": "import type { Config, Connection } from '../createConfig.js'\nimport type { Compute } from '../types/utils.js'\nimport { deepEqual } from '../utils/deepEqual.js'\n\nexport type GetConnectionsReturnType = Compute<Connection>[]\n\nlet previousConnections: Connection[] = []\n\n/** https://wagmi.sh/core/api/actions/getConnections */\nexport function getConnections(config: Config): GetConnectionsReturnType {\n  const connections = [...config.state.connections.values()]\n  if (config.state.status === 'reconnecting') return previousConnections\n  if (deepEqual(previousConnections, connections)) return previousConnections\n  previousConnections = connections\n  return connections\n}\n"
  },
  {
    "path": "packages/core/src/actions/getConnectorClient.test-d.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { getConnectorClient } from './getConnectorClient.js'\n\ntest('default', async () => {\n  const client = await getConnectorClient(config)\n  expectTypeOf(client.chain).toEqualTypeOf<(typeof config)['chains'][number]>()\n  expectTypeOf(client.transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('parameters: chainId', async () => {\n  const client = await getConnectorClient(config, {\n    chainId: chain.mainnet.id,\n  })\n  expectTypeOf(client.chain).toEqualTypeOf<typeof chain.mainnet>()\n  expectTypeOf(client.chain).not.toEqualTypeOf<typeof chain.mainnet2>()\n  expectTypeOf(client.transport.type).toEqualTypeOf<'http'>()\n})\n"
  },
  {
    "path": "packages/core/src/actions/getConnectorClient.test.ts",
    "content": "import { address, config } from '@wagmi/test'\nimport type { Address } from 'viem'\nimport { expect, test } from 'vitest'\nimport type { Connector } from '../createConfig.js'\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { getConnectorClient } from './getConnectorClient.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n  await expect(getConnectorClient(config)).resolves.toBeDefined()\n  await disconnect(config, { connector })\n})\n\ntest('parameters: connector', async () => {\n  const connector2 = config.connectors[1]!\n  await connect(config, { connector })\n  await connect(config, { connector: connector2 })\n  await expect(getConnectorClient(config, { connector })).resolves.toBeDefined()\n  await disconnect(config, { connector })\n  await disconnect(config, { connector: connector2 })\n})\n\ntest.todo('custom connector client')\n\ntest('behavior: account address is checksummed', async () => {\n  await connect(config, { connector })\n  const account =\n    '0x95132632579b073D12a6673e18Ab05777a6B86f8'.toLowerCase() as Address\n  const client = await getConnectorClient(config, { account })\n  expect(client.account.address).toMatchInlineSnapshot(\n    '\"0x95132632579b073D12a6673e18Ab05777a6B86f8\"',\n  )\n  expect(client.account.address).not.toBe(account)\n  await disconnect(config, { connector })\n})\n\ntest('behavior: not connected', async () => {\n  await expect(\n    getConnectorClient(config),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [ConnectorNotConnectedError: Connector not connected.\n\n    Version: @wagmi/core@x.y.z]\n  `)\n})\n\ntest('behavior: connector is on different chain', async () => {\n  await connect(config, { chainId: 1, connector })\n  config.setState((state) => {\n    const uid = state.current!\n    const connection = state.connections.get(uid)!\n    return {\n      ...state,\n      connections: new Map(state.connections).set(uid, {\n        ...connection,\n        chainId: 456,\n      }),\n    }\n  })\n  await expect(\n    getConnectorClient(config, { account: address.usdcHolder }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [ConnectorChainMismatchError: The current chain of the connector (id: 1) does not match the connection's chain (id: 456).\n\n    Current Chain ID:  1\n    Expected Chain ID: 456\n\n    Version: @wagmi/core@x.y.z]\n  `)\n  await disconnect(config, { connector })\n})\n\ntest('behavior: account does not exist on connector', async () => {\n  await connect(config, { connector })\n  await expect(\n    getConnectorClient(config, { account: address.usdcHolder }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [ConnectorAccountNotFoundError: Account \"0x5414d89a8bF7E99d732BC52f3e6A3Ef461c0C078\" not found for connector \"Mock Connector\".\n\n    Version: @wagmi/core@x.y.z]\n  `)\n  await disconnect(config, { connector })\n})\n\ntest('behavior: reconnecting', async () => {\n  config.setState((state) => ({ ...state, status: 'reconnecting' }))\n  const { id, name, type, uid } = connector\n  await expect(\n    getConnectorClient(config, {\n      connector: {\n        id,\n        name,\n        type,\n        uid,\n      } as unknown as Connector,\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [ConnectorUnavailableReconnectingError: Connector \"Mock Connector\" unavailable while reconnecting.\n\n    Details: During the reconnection step, the only connector methods guaranteed to be available are: \\`id\\`, \\`name\\`, \\`type\\`, \\`uid\\`. All other methods are not guaranteed to be available until reconnection completes and connectors are fully restored. This error commonly occurs for connectors that asynchronously inject after reconnection has already started.\n    Version: @wagmi/core@x.y.z]\n  `)\n  config.setState((state) => ({ ...state, status: 'disconnected' }))\n})\n"
  },
  {
    "path": "packages/core/src/actions/getConnectorClient.ts",
    "content": "import {\n  type Account,\n  type Address,\n  type BaseErrorType,\n  type Client,\n  createClient,\n  custom,\n} from 'viem'\nimport { getAddress, parseAccount } from 'viem/utils'\n\nimport type { Config, Connection } from '../createConfig.js'\nimport type { ErrorType } from '../errors/base.js'\nimport {\n  ConnectorAccountNotFoundError,\n  type ConnectorAccountNotFoundErrorType,\n  ConnectorChainMismatchError,\n  type ConnectorChainMismatchErrorType,\n  ConnectorNotConnectedError,\n  type ConnectorNotConnectedErrorType,\n  ConnectorUnavailableReconnectingError,\n  type ConnectorUnavailableReconnectingErrorType,\n} from '../errors/config.js'\nimport type {\n  ChainIdParameter,\n  ConnectorParameter,\n} from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\n\nexport type GetConnectorClientParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n> = Compute<\n  ChainIdParameter<config, chainId> &\n    ConnectorParameter & {\n      /**\n       * Account to use for the client.\n       *\n       * - `Account | Address`: An Account MUST exist on the connector.\n       * - `null`: Account MAY NOT exist on the connector. This is useful for\n       *   actions that can infer the account from the connector (e.g. sending a\n       *   call without a connected account – the user will be prompted to select\n       *   an account within the wallet).\n       */\n      account?: Address | Account | null | undefined\n      /**\n       * Assert that the current chain ID matches the connector's chain ID.\n       */\n      assertChainId?: boolean | undefined\n    }\n>\n\nexport type GetConnectorClientReturnType<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n> = Compute<\n  Client<\n    config['_internal']['transports'][chainId],\n    Extract<config['chains'][number], { id: chainId }>,\n    Account\n  >\n>\n\nexport type GetConnectorClientErrorType =\n  | ConnectorAccountNotFoundErrorType\n  | ConnectorChainMismatchErrorType\n  | ConnectorNotConnectedErrorType\n  | ConnectorUnavailableReconnectingErrorType\n  // base\n  | BaseErrorType\n  | ErrorType\n\n/** https://wagmi.sh/core/api/actions/getConnectorClient */\nexport async function getConnectorClient<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n>(\n  config: config,\n  parameters: GetConnectorClientParameters<config, chainId> = {},\n): Promise<GetConnectorClientReturnType<config, chainId>> {\n  const { assertChainId = true } = parameters\n\n  // Get connection\n  let connection: Connection | undefined\n  if (parameters.connector) {\n    const { connector } = parameters\n    if (\n      config.state.status === 'reconnecting' &&\n      !connector.getAccounts &&\n      !connector.getChainId\n    )\n      throw new ConnectorUnavailableReconnectingError({ connector })\n\n    const [accounts, chainId] = await Promise.all([\n      connector.getAccounts().catch((e) => {\n        if (parameters.account === null) return []\n        throw e\n      }),\n      connector.getChainId(),\n    ])\n    connection = {\n      accounts: accounts as readonly [Address, ...Address[]],\n      chainId,\n      connector,\n    }\n  } else connection = config.state.connections.get(config.state.current!)\n  if (!connection) throw new ConnectorNotConnectedError()\n\n  const chainId = parameters.chainId ?? connection.chainId\n\n  // Check connector using same chainId as connection\n  const connectorChainId = await connection.connector.getChainId()\n  if (assertChainId && connectorChainId !== chainId)\n    throw new ConnectorChainMismatchError({\n      connectionChainId: chainId,\n      connectorChainId,\n    })\n\n  // If connector has custom `getClient` implementation\n  type Return = GetConnectorClientReturnType<config, chainId>\n  const connector = connection.connector\n  if (connector.getClient)\n    return connector.getClient({ chainId }) as unknown as Return\n\n  // Default using `custom` transport\n  const account = parseAccount(parameters.account ?? connection.accounts[0]!)\n  if (account) account.address = getAddress(account.address) // TODO: Checksum address as part of `parseAccount`?\n\n  // If account was provided, check that it exists on the connector\n  if (\n    parameters.account &&\n    !connection.accounts.some(\n      (x) => x.toLowerCase() === account.address.toLowerCase(),\n    )\n  )\n    throw new ConnectorAccountNotFoundError({\n      address: account.address,\n      connector,\n    })\n\n  const chain = config.chains.find((chain) => chain.id === chainId)\n  const provider = (await connection.connector.getProvider({ chainId })) as {\n    request(...args: any): Promise<any>\n  }\n\n  return createClient({\n    account,\n    chain,\n    name: 'Connector Client',\n    transport: (opts) => custom(provider)({ ...opts, retryCount: 0 }),\n  }) as Return\n}\n"
  },
  {
    "path": "packages/core/src/actions/getConnectors.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getConnectors } from './getConnectors.js'\n\ntest('default', () => {\n  expect(getConnectors(config)).toEqual(config.connectors)\n  expect(getConnectors(config)).toEqual(config.connectors)\n})\n"
  },
  {
    "path": "packages/core/src/actions/getConnectors.ts",
    "content": "import type { Config, Connector } from '../createConfig.js'\n\nexport type GetConnectorsReturnType<config extends Config = Config> =\n  config['connectors']\n\nlet previousConnectors: readonly Connector[] = []\n\n/** https://wagmi.sh/core/api/actions/getConnectors */\nexport function getConnectors<config extends Config>(\n  config: config,\n): GetConnectorsReturnType<config> {\n  const connectors = config.connectors\n  if (\n    previousConnectors.length === connectors.length &&\n    previousConnectors.every(\n      (connector, index) => connector === connectors[index],\n    )\n  )\n    return previousConnectors\n  previousConnectors = connectors\n  return connectors\n}\n"
  },
  {
    "path": "packages/core/src/actions/getContractEvents.test-d.ts",
    "content": "import { abi, config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport {\n  type GetContractEventsParameters,\n  getContractEvents,\n} from './getContractEvents.js'\n\ntest('default', async () => {\n  const logs = await getContractEvents(config, {\n    address: '0x',\n    abi: abi.erc20,\n    eventName: 'Transfer',\n    args: {\n      from: '0x',\n      to: '0x',\n    },\n  })\n\n  expectTypeOf(logs[0]!.eventName).toEqualTypeOf<'Transfer'>()\n  expectTypeOf(logs[0]!.args).toEqualTypeOf<{\n    from?: `0x${string}` | undefined\n    to?: `0x${string}` | undefined\n    value?: bigint | undefined\n  }>()\n\n  getContractEvents(config, {\n    address: '0x',\n    abi: abi.erc20,\n    eventName: 'Transfer',\n    args: {\n      // @ts-expect-error\n      foo: '0x',\n      to: '0x',\n    },\n  })\n  getContractEvents(config, {\n    address: '0x',\n    abi: abi.erc20,\n    // @ts-expect-error\n    eventName: 'Foo',\n    args: {\n      from: '0x',\n      to: '0x',\n    },\n  })\n})\n\ntest('behavior: strict', async () => {\n  const logs = await getContractEvents(config, {\n    address: '0x',\n    abi: abi.erc20,\n    strict: true,\n    eventName: 'Transfer',\n    args: {\n      from: '0x',\n      to: '0x',\n    },\n  })\n\n  expectTypeOf(logs[0]!.eventName).toEqualTypeOf<'Transfer'>()\n  expectTypeOf(logs[0]!.args).toEqualTypeOf<{\n    from: `0x${string}`\n    to: `0x${string}`\n    value: bigint\n  }>()\n  expectTypeOf(logs[0]!.args).not.toEqualTypeOf<{\n    from?: `0x${string}` | undefined\n    to?: `0x${string}` | undefined\n    value?: bigint | undefined\n  }>()\n})\n\ntest('behavior: no eventName', async () => {\n  type Result = GetContractEventsParameters<\n    typeof abi.erc20,\n    undefined,\n    true,\n    undefined,\n    undefined,\n    typeof config\n  >\n  expectTypeOf<Result['args']>().toEqualTypeOf<\n    | {\n        from?: `0x${string}` | `0x${string}`[] | null | undefined\n        to?: `0x${string}` | `0x${string}`[] | null | undefined\n      }\n    | {\n        owner?: `0x${string}` | `0x${string}`[] | null | undefined\n        spender?: `0x${string}` | `0x${string}`[] | null | undefined\n      }\n    | undefined\n  >()\n\n  const logs = await getContractEvents(config, {\n    address: '0x',\n    abi: abi.erc20,\n    args: {\n      from: '0x',\n      to: '0x',\n    },\n  })\n\n  expectTypeOf(logs[0]!.eventName).toEqualTypeOf<'Transfer' | 'Approval'>()\n  expectTypeOf(logs[0]!.args).toEqualTypeOf<\n    | {\n        from?: `0x${string}` | undefined\n        to?: `0x${string}` | undefined\n        value?: bigint | undefined\n      }\n    | {\n        owner?: `0x${string}` | undefined\n        spender?: `0x${string}` | undefined\n        value?: bigint | undefined\n      }\n  >()\n})\n"
  },
  {
    "path": "packages/core/src/actions/getContractEvents.test.ts",
    "content": "import { abi, address, config, testClient } from '@wagmi/test'\nimport {\n  createWalletClient,\n  erc20Abi,\n  getAddress,\n  http,\n  parseEther,\n} from 'viem'\nimport { beforeEach, expect, test } from 'vitest'\n\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { getContractEvents } from './getContractEvents.js'\nimport { readContract } from './readContract.js'\n\nconst connector = config.connectors[0]!\n\nbeforeEach(async () => {\n  if (config.state.current === connector.uid) {\n    await disconnect(config, { connector })\n  }\n})\n\ntest('default', async () => {\n  const data = await connect(config, { connector })\n  const connectedAddress = data.accounts[0]\n\n  // impersonate usdc holder account and transfer usdc to connected account\n  await testClient.mainnet.impersonateAccount({ address: address.usdcHolder })\n  await testClient.mainnet.setBalance({\n    address: address.usdcHolder,\n    value: 10000000000000000000000n,\n  })\n\n  const walletClient = createWalletClient({\n    account: address.usdcHolder,\n    chain: testClient.mainnet.chain,\n    transport: http(),\n  })\n\n  await walletClient.writeContract({\n    address: address.usdc,\n    abi: abi.erc20,\n    functionName: 'transfer',\n    args: [connectedAddress, parseEther('100', 'gwei')],\n  })\n  await walletClient.writeContract({\n    address: address.usdc,\n    abi: abi.erc20,\n    functionName: 'approve',\n    args: [connectedAddress, parseEther('10', 'gwei')],\n  })\n  await testClient.mainnet.mine({ blocks: 1 })\n\n  await testClient.mainnet.stopImpersonatingAccount({\n    address: address.usdcHolder,\n  })\n\n  const balance = await readContract(config, {\n    address: address.usdc,\n    abi: erc20Abi,\n    functionName: 'balanceOf',\n    args: [connectedAddress],\n  })\n  expect(balance).toBeGreaterThan(0n)\n\n  const [logs, approvalLogs, transferLogs] = await Promise.all([\n    getContractEvents(config, {\n      address: address.usdc,\n      abi: abi.erc20,\n    }),\n    getContractEvents(config, {\n      address: address.usdc,\n      abi: abi.erc20,\n      eventName: 'Approval',\n    }),\n    getContractEvents(config, {\n      address: address.usdc,\n      abi: abi.erc20,\n      eventName: 'Transfer',\n    }),\n  ])\n  expect(logs.length).toBe(2)\n  expect(approvalLogs.length).toBe(1)\n  expect(transferLogs.length).toBe(1)\n\n  expect(logs[0]!.eventName).toEqual('Transfer')\n  expect(logs[0]!.args).toEqual({\n    from: getAddress(address.usdcHolder),\n    to: getAddress(connectedAddress),\n    value: parseEther('100', 'gwei'),\n  })\n  expect(logs[1]!.eventName).toEqual('Approval')\n  expect(logs[1]!.args).toEqual({\n    owner: getAddress(address.usdcHolder),\n    spender: getAddress(connectedAddress),\n    value: parseEther('10', 'gwei'),\n  })\n})\n"
  },
  {
    "path": "packages/core/src/actions/getContractEvents.ts",
    "content": "import type { Abi, BlockNumber, BlockTag, ContractEventName } from 'viem'\nimport {\n  type GetContractEventsErrorType as viem_GetContractEventsErrorType,\n  type GetContractEventsParameters as viem_GetContractEventsParameters,\n  type GetContractEventsReturnType as viem_GetContractEventsReturnType,\n  getContractEvents as viem_getContractEvents,\n} from 'viem/actions'\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type GetContractEventsParameters<\n  abi extends Abi | readonly unknown[] = Abi,\n  eventName extends ContractEventName<abi> | undefined =\n    | ContractEventName<abi>\n    | undefined,\n  strict extends boolean | undefined = undefined,\n  fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n  toBlock extends BlockNumber | BlockTag | undefined = undefined,\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n> = Compute<\n  viem_GetContractEventsParameters<abi, eventName, strict, fromBlock, toBlock> &\n    ChainIdParameter<config, chainId>\n>\n\nexport type GetContractEventsReturnType<\n  abi extends Abi | readonly unknown[] = Abi,\n  eventName extends ContractEventName<abi> | undefined =\n    | ContractEventName<abi>\n    | undefined,\n  strict extends boolean | undefined = undefined,\n  fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n  toBlock extends BlockNumber | BlockTag | undefined = undefined,\n> = viem_GetContractEventsReturnType<abi, eventName, strict, fromBlock, toBlock>\n\nexport type GetContractEventsErrorType = viem_GetContractEventsErrorType\n\n/** https://wagmi.sh/core/actions/getContractEvents */\nexport async function getContractEvents<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  const abi extends Abi | readonly unknown[],\n  eventName extends ContractEventName<abi> | undefined,\n  strict extends boolean | undefined = undefined,\n  fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n  toBlock extends BlockNumber | BlockTag | undefined = undefined,\n>(\n  config: config,\n  parameters: GetContractEventsParameters<\n    abi,\n    eventName,\n    strict,\n    fromBlock,\n    toBlock,\n    config,\n    chainId\n  >,\n): Promise<\n  GetContractEventsReturnType<abi, eventName, strict, fromBlock, toBlock>\n> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  const action = getAction(client, viem_getContractEvents, 'getContractEvents')\n  return action(rest)\n}\n"
  },
  {
    "path": "packages/core/src/actions/getEnsAddress.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getEnsAddress } from './getEnsAddress.js'\n\ntest('default', async () => {\n  await expect(\n    getEnsAddress(config, { name: 'wevm.eth' }),\n  ).resolves.toMatchInlineSnapshot(\n    '\"0xd2135CfB216b74109775236E36d4b433F1DF507B\"',\n  )\n})\n"
  },
  {
    "path": "packages/core/src/actions/getEnsAddress.ts",
    "content": "import {\n  type GetEnsAddressErrorType as viem_GetEnsAddressErrorType,\n  type GetEnsAddressParameters as viem_GetEnsAddressParameters,\n  type GetEnsAddressReturnType as viem_GetEnsAddressReturnType,\n  getEnsAddress as viem_getEnsAddress,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type GetEnsAddressParameters<config extends Config = Config> = Compute<\n  viem_GetEnsAddressParameters & ChainIdParameter<config>\n>\n\nexport type GetEnsAddressReturnType = viem_GetEnsAddressReturnType\n\nexport type GetEnsAddressErrorType = viem_GetEnsAddressErrorType\n\n/** https://wagmi.sh/core/api/actions/getEnsAddress */\nexport function getEnsAddress<config extends Config>(\n  config: config,\n  parameters: GetEnsAddressParameters<config>,\n): Promise<GetEnsAddressReturnType> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  const action = getAction(client, viem_getEnsAddress, 'getEnsAddress')\n  return action(rest)\n}\n"
  },
  {
    "path": "packages/core/src/actions/getEnsAvatar.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getEnsAvatar } from './getEnsAvatar.js'\n\ntest.skip('default', async () => {\n  await expect(\n    getEnsAvatar(config, {\n      name: 'wevm.eth',\n    }),\n  ).resolves.toMatchInlineSnapshot('\"https://euc.li/wevm.eth\"')\n})\n"
  },
  {
    "path": "packages/core/src/actions/getEnsAvatar.ts",
    "content": "import {\n  type GetEnsAvatarErrorType as viem_GetEnsAvatarErrorType,\n  type GetEnsAvatarParameters as viem_GetEnsAvatarParameters,\n  type GetEnsAvatarReturnType as viem_GetEnsAvatarReturnType,\n  getEnsAvatar as viem_getEnsAvatar,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type GetEnsAvatarParameters<config extends Config = Config> = Compute<\n  viem_GetEnsAvatarParameters & ChainIdParameter<config>\n>\n\nexport type GetEnsAvatarReturnType = viem_GetEnsAvatarReturnType\n\nexport type GetEnsAvatarErrorType = viem_GetEnsAvatarErrorType\n\n/** https://wagmi.sh/core/api/actions/getEnsAvatar */\nexport function getEnsAvatar<config extends Config>(\n  config: config,\n  parameters: GetEnsAvatarParameters<config>,\n): Promise<GetEnsAvatarReturnType> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  const action = getAction(client, viem_getEnsAvatar, 'getEnsAvatar')\n  return action(rest)\n}\n"
  },
  {
    "path": "packages/core/src/actions/getEnsName.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getEnsName } from './getEnsName.js'\n\ntest('default', async () => {\n  await expect(\n    getEnsName(config, {\n      address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    }),\n  ).resolves.toMatchInlineSnapshot('\"wevm.eth\"')\n})\n"
  },
  {
    "path": "packages/core/src/actions/getEnsName.ts",
    "content": "import {\n  type GetEnsNameErrorType as viem_GetEnsNameErrorType,\n  type GetEnsNameParameters as viem_GetEnsNameParameters,\n  type GetEnsNameReturnType as viem_GetEnsNameReturnType,\n  getEnsName as viem_getEnsName,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type GetEnsNameParameters<config extends Config = Config> = Compute<\n  viem_GetEnsNameParameters & ChainIdParameter<config>\n>\n\nexport type GetEnsNameReturnType = viem_GetEnsNameReturnType\n\nexport type GetEnsNameErrorType = viem_GetEnsNameErrorType\n\n/** https://wagmi.sh/core/api/actions/getEnsName */\nexport function getEnsName<config extends Config>(\n  config: config,\n  parameters: GetEnsNameParameters<config>,\n): Promise<GetEnsNameReturnType> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  const action = getAction(client, viem_getEnsName, 'getEnsName')\n  return action(rest)\n}\n"
  },
  {
    "path": "packages/core/src/actions/getEnsResolver.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getEnsResolver } from './getEnsResolver.js'\n\ntest('default', async () => {\n  await expect(\n    getEnsResolver(config, {\n      name: 'wevm.eth',\n    }),\n  ).resolves.toMatchInlineSnapshot(\n    '\"0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41\"',\n  )\n})\n"
  },
  {
    "path": "packages/core/src/actions/getEnsResolver.ts",
    "content": "import {\n  type GetEnsResolverErrorType as viem_GetEnsResolverErrorType,\n  type GetEnsResolverParameters as viem_GetEnsResolverParameters,\n  type GetEnsResolverReturnType as viem_GetEnsResolverReturnType,\n  getEnsResolver as viem_getEnsResolver,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type GetEnsResolverParameters<config extends Config = Config> = Compute<\n  viem_GetEnsResolverParameters & ChainIdParameter<config>\n>\n\nexport type GetEnsResolverReturnType = viem_GetEnsResolverReturnType\n\nexport type GetEnsResolverErrorType = viem_GetEnsResolverErrorType\n\n/** https://wagmi.sh/core/api/actions/getEnsResolver */\nexport function getEnsResolver<config extends Config>(\n  config: config,\n  parameters: GetEnsResolverParameters<config>,\n): Promise<GetEnsResolverReturnType> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  const action = getAction(client, viem_getEnsResolver, 'getEnsResolver')\n  return action(rest)\n}\n"
  },
  {
    "path": "packages/core/src/actions/getEnsText.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getEnsText } from './getEnsText.js'\n\ntest('default', async () => {\n  await expect(\n    getEnsText(config, {\n      name: 'wevm.eth',\n      key: 'com.twitter',\n    }),\n  ).resolves.toMatchInlineSnapshot('\"wevm_dev\"')\n})\n"
  },
  {
    "path": "packages/core/src/actions/getEnsText.ts",
    "content": "import {\n  type GetEnsTextErrorType as viem_GetEnsTextErrorType,\n  type GetEnsTextParameters as viem_GetEnsTextParameters,\n  type GetEnsTextReturnType as viem_GetEnsTextReturnType,\n  getEnsText as viem_getEnsText,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type GetEnsTextParameters<config extends Config = Config> = Compute<\n  viem_GetEnsTextParameters & ChainIdParameter<config>\n>\n\nexport type GetEnsTextReturnType = viem_GetEnsTextReturnType\n\nexport type GetEnsTextErrorType = viem_GetEnsTextErrorType\n\n/** https://wagmi.sh/core/api/actions/getEnsText */\nexport function getEnsText<config extends Config>(\n  config: config,\n  parameters: GetEnsTextParameters<config>,\n): Promise<GetEnsTextReturnType> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  const action = getAction(client, viem_getEnsText, 'getEnsText')\n  return action(rest)\n}\n"
  },
  {
    "path": "packages/core/src/actions/getFeeHistory.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getFeeHistory } from './getFeeHistory.js'\n\ntest('default', async () => {\n  await expect(\n    getFeeHistory(config, {\n      blockCount: 4,\n      rewardPercentiles: [25, 75],\n    }),\n  ).resolves.toMatchObject({\n    baseFeePerGas: expect.arrayContaining([expect.any(BigInt)]),\n    gasUsedRatio: expect.arrayContaining([expect.any(Number)]),\n    oldestBlock: expect.any(BigInt),\n    reward: expect.any(Array),\n  })\n})\n\ntest('parameters: chainId', async () => {\n  await expect(\n    getFeeHistory(config, {\n      blockCount: 4,\n      rewardPercentiles: [25, 75],\n      chainId: chain.mainnet2.id,\n    }),\n  ).resolves.toMatchObject({\n    baseFeePerGas: expect.arrayContaining([expect.any(BigInt)]),\n    gasUsedRatio: expect.arrayContaining([expect.any(Number)]),\n    oldestBlock: expect.any(BigInt),\n    reward: expect.any(Array),\n  })\n})\n\ntest('parameters: blockNumber', async () => {\n  await expect(\n    getFeeHistory(config, {\n      blockCount: 4,\n      rewardPercentiles: [25, 75],\n      blockNumber: 18677379n,\n    }),\n  ).resolves.toMatchObject({\n    baseFeePerGas: expect.arrayContaining([expect.any(BigInt)]),\n    gasUsedRatio: expect.arrayContaining([expect.any(Number)]),\n    oldestBlock: expect.any(BigInt),\n    reward: expect.any(Array),\n  })\n})\n\ntest('parameters: blockTag', async () => {\n  await expect(\n    getFeeHistory(config, {\n      blockCount: 4,\n      rewardPercentiles: [25, 75],\n      blockTag: 'safe',\n    }),\n  ).resolves.toMatchObject({\n    baseFeePerGas: expect.arrayContaining([expect.any(BigInt)]),\n    gasUsedRatio: expect.arrayContaining([expect.any(Number)]),\n    oldestBlock: expect.any(BigInt),\n    reward: expect.any(Array),\n  })\n})\n"
  },
  {
    "path": "packages/core/src/actions/getFeeHistory.ts",
    "content": "import {\n  type GetFeeHistoryErrorType as viem_GetFeeHistoryErrorType,\n  type GetFeeHistoryParameters as viem_GetFeeHistoryParameters,\n  type GetFeeHistoryReturnType as viem_GetFeeHistoryReturnType,\n  getFeeHistory as viem_getFeeHistory,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type GetFeeHistoryParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n> = Compute<viem_GetFeeHistoryParameters & ChainIdParameter<config, chainId>>\n\nexport type GetFeeHistoryReturnType = viem_GetFeeHistoryReturnType\n\nexport type GetFeeHistoryErrorType = viem_GetFeeHistoryErrorType\n\n/** https://wagmi.sh/core/api/actions/getFeeHistory */\nexport function getFeeHistory<\n  config extends Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n>(\n  config: config,\n  parameters: GetFeeHistoryParameters<config, chainId>,\n): Promise<GetFeeHistoryReturnType> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  const action = getAction(client, viem_getFeeHistory, 'getFeeHistory')\n  return action(rest)\n}\n"
  },
  {
    "path": "packages/core/src/actions/getGasPrice.test.ts",
    "content": "import { chain, config, testClient } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getGasPrice } from './getGasPrice.js'\n\ntest('default', async () => {\n  await testClient.mainnet.setNextBlockBaseFeePerGas({\n    baseFeePerGas: 2_000_000_000n,\n  })\n  await expect(getGasPrice(config)).resolves.toBe(3000000000n)\n})\n\ntest('parameters: chainId', async () => {\n  await testClient.mainnet2.setNextBlockBaseFeePerGas({\n    baseFeePerGas: 1_000_000_000n,\n  })\n  await testClient.mainnet2.mine({ blocks: 1 })\n  await expect(\n    getGasPrice(config, { chainId: chain.mainnet2.id }),\n  ).resolves.toBe(1875000000n)\n})\n"
  },
  {
    "path": "packages/core/src/actions/getGasPrice.ts",
    "content": "import {\n  type GetGasPriceErrorType as viem_GetGasPriceErrorType,\n  type GetGasPriceReturnType as viem_GetGasPriceReturnType,\n  getGasPrice as viem_getGasPrice,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type GetGasPriceParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n> = Compute<ChainIdParameter<config, chainId>>\n\nexport type GetGasPriceReturnType = viem_GetGasPriceReturnType\n\nexport type GetGasPriceErrorType = viem_GetGasPriceErrorType\n\n/** https://wagmi.sh/core/api/actions/getGasPrice */\nexport function getGasPrice<\n  config extends Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n>(\n  config: config,\n  parameters: GetGasPriceParameters<config, chainId> = {},\n): Promise<GetGasPriceReturnType> {\n  const { chainId } = parameters\n  const client = config.getClient({ chainId })\n  const action = getAction(client, viem_getGasPrice, 'getGasPrice')\n  return action({})\n}\n"
  },
  {
    "path": "packages/core/src/actions/getProof.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getProof } from './getProof.js'\n\ntest.skip('default', async () => {\n  await expect(\n    getProof(config, {\n      chainId: chain.optimism.id,\n      address: '0x4200000000000000000000000000000000000016',\n      storageKeys: [\n        '0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99',\n      ],\n    }),\n  ).resolves.toBeDefined()\n})\n"
  },
  {
    "path": "packages/core/src/actions/getProof.ts",
    "content": "import {\n  type GetProofErrorType as viem_GetProofErrorType,\n  type GetProofParameters as viem_GetProofParameters,\n  type GetProofReturnType as viem_GetProofReturnType,\n  getProof as viem_getProof,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type GetProofParameters<config extends Config = Config> = Compute<\n  viem_GetProofParameters & ChainIdParameter<config>\n>\n\nexport type GetProofReturnType = viem_GetProofReturnType\n\nexport type GetProofErrorType = viem_GetProofErrorType\n\n/** https://wagmi.sh/core/api/actions/getProof */\nexport async function getProof<config extends Config>(\n  config: config,\n  parameters: GetProofParameters<config>,\n): Promise<GetProofReturnType> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  const action = getAction(client, viem_getProof, 'getProof')\n  return action(rest)\n}\n"
  },
  {
    "path": "packages/core/src/actions/getPublicClient.test-d.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { getPublicClient } from './getPublicClient.js'\n\ntest('default', () => {\n  const client = getPublicClient(config)\n  expectTypeOf(client.chain).toEqualTypeOf<(typeof config)['chains'][number]>()\n  expectTypeOf(client.transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('parameters: chainId', () => {\n  const client = getPublicClient(config, {\n    chainId: chain.mainnet.id,\n  })\n  expectTypeOf(client.chain).toEqualTypeOf<typeof chain.mainnet>()\n  expectTypeOf(client.chain).not.toEqualTypeOf<typeof chain.mainnet2>()\n  expectTypeOf(client.transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('behavior: unconfigured chain', () => {\n  const client = getPublicClient(config, {\n    // @ts-expect-error\n    chainId: 123456,\n  })\n  expectTypeOf(client).toEqualTypeOf<undefined>()\n})\n"
  },
  {
    "path": "packages/core/src/actions/getPublicClient.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getPublicClient } from './getPublicClient.js'\n\ntest('default', () => {\n  expect(getPublicClient(config)).toBeDefined()\n})\n\ntest('behavior: unconfigured chain', () => {\n  expect(\n    getPublicClient(config, {\n      // @ts-expect-error\n      chainId: 123456,\n    }),\n  ).toBeUndefined()\n})\n"
  },
  {
    "path": "packages/core/src/actions/getPublicClient.ts",
    "content": "import { type Client, type PublicClient, publicActions } from 'viem'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute, IsNarrowable } from '../types/utils.js'\nimport { getClient } from './getClient.js'\n\nexport type GetPublicClientParameters<\n  config extends Config = Config,\n  chainId extends\n    | config['chains'][number]['id']\n    | undefined = config['chains'][number]['id'],\n> = ChainIdParameter<config, chainId>\n\nexport type GetPublicClientReturnType<\n  config extends Config = Config,\n  chainId extends\n    | config['chains'][number]['id']\n    | undefined = config['chains'][number]['id'],\n  ///\n  resolvedChainId extends\n    | config['chains'][number]['id']\n    | undefined = IsNarrowable<\n    config['chains'][number]['id'],\n    number\n  > extends true\n    ? IsNarrowable<chainId, number> extends true\n      ? chainId\n      : config['chains'][number]['id']\n    : config['chains'][number]['id'] | undefined,\n> = resolvedChainId extends config['chains'][number]['id']\n  ? Compute<\n      PublicClient<\n        config['_internal']['transports'][resolvedChainId],\n        Extract<config['chains'][number], { id: resolvedChainId }>\n      >\n    >\n  : undefined\n\nexport function getPublicClient<\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | number | undefined,\n>(\n  config: config,\n  parameters: GetPublicClientParameters<config, chainId> = {},\n): GetPublicClientReturnType<config, chainId> {\n  const client = getClient(config, parameters)\n  return (client as Client)?.extend(publicActions) as GetPublicClientReturnType<\n    config,\n    chainId\n  >\n}\n"
  },
  {
    "path": "packages/core/src/actions/getStorageAt.test.ts",
    "content": "import { address, chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getStorageAt } from './getStorageAt.js'\n\ntest('default', async () => {\n  await expect(\n    getStorageAt(config, {\n      address: address.wagmiMintExample,\n      slot: '0x0',\n    }),\n  ).resolves.toBe(\n    '0x7761676d6900000000000000000000000000000000000000000000000000000a',\n  )\n  await expect(\n    getStorageAt(config, {\n      address: address.wagmiMintExample,\n      slot: '0x1',\n    }),\n  ).resolves.toBe(\n    '0x5741474d4900000000000000000000000000000000000000000000000000000a',\n  )\n})\n\ntest('parameters: blockNumber', async () => {\n  await expect(\n    getStorageAt(config, {\n      address: address.wagmiMintExample,\n      blockNumber: 16280770n,\n      slot: '0x0',\n    }),\n  ).resolves.toBe(\n    '0x7761676d6900000000000000000000000000000000000000000000000000000a',\n  )\n})\n\ntest('parameters: blockTag', async () => {\n  await expect(\n    getStorageAt(config, {\n      address: address.wagmiMintExample,\n      blockTag: 'safe',\n      slot: '0x0',\n    }),\n  ).resolves.toBe(\n    '0x7761676d6900000000000000000000000000000000000000000000000000000a',\n  )\n})\n\ntest('parameters: chainId', async () => {\n  await expect(\n    getStorageAt(config, {\n      address: address.wagmiMintExample,\n      chainId: chain.optimism.id,\n      slot: '0x0',\n    }),\n  ).resolves.toBe(\n    '0x0000000000000000000000000000000000000000000000000000000000000000',\n  )\n})\n"
  },
  {
    "path": "packages/core/src/actions/getStorageAt.ts",
    "content": "import {\n  type GetStorageAtErrorType as viem_GetStorageAtErrorType,\n  type GetStorageAtParameters as viem_GetStorageAtParameters,\n  type GetStorageAtReturnType as viem_GetStorageAtReturnType,\n  getStorageAt as viem_getStorageAt,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type GetStorageAtParameters<config extends Config = Config> = Compute<\n  viem_GetStorageAtParameters & ChainIdParameter<config>\n>\n\nexport type GetStorageAtReturnType = viem_GetStorageAtReturnType\n\nexport type GetStorageAtErrorType = viem_GetStorageAtErrorType\n\n/** https://wagmi.sh/core/api/actions/getStorageAt */\nexport async function getStorageAt<config extends Config>(\n  config: config,\n  parameters: GetStorageAtParameters<config>,\n): Promise<GetStorageAtReturnType> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  const action = getAction(client, viem_getStorageAt, 'getStorageAt')\n  return action(rest)\n}\n"
  },
  {
    "path": "packages/core/src/actions/getTransaction.test-d.ts",
    "content": "import { http } from 'viem'\nimport { celo, mainnet } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { createConfig } from '../createConfig.js'\nimport { getTransaction } from './getTransaction.js'\n\ntest('chain formatters', async () => {\n  const config = createConfig({\n    chains: [celo, mainnet],\n    transports: { [celo.id]: http(), [mainnet.id]: http() },\n  })\n  const result = await getTransaction(config, { hash: '0x123' })\n  // @ts-expect-error\n  result.feeCurrency\n  if (result.chainId === celo.id) {\n    expectTypeOf(result.feeCurrency).toEqualTypeOf<`0x${string}` | null>()\n  }\n})\n\ntest('chainId', async () => {\n  const config = createConfig({\n    chains: [celo, mainnet],\n    transports: { [celo.id]: http(), [mainnet.id]: http() },\n  })\n  const result = await getTransaction(config, {\n    hash: '0x123',\n    chainId: celo.id,\n  })\n  expectTypeOf(result.feeCurrency).toEqualTypeOf<`0x${string}` | null>()\n})\n"
  },
  {
    "path": "packages/core/src/actions/getTransaction.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getTransaction } from './getTransaction.js'\n\ntest('default', async () => {\n  await expect(\n    getTransaction(config, {\n      hash: '0xa559259bd2d0e8372421e222ff3545f705b5da60005bd787a23c2e68d6d7fefd',\n    }),\n  ).resolves.toMatchInlineSnapshot(`\n    {\n      \"accessList\": [],\n      \"blockHash\": \"0x61c4e868008b465addd7c0a5da03db28bb9911597c58e239a85dd14dd43fd56a\",\n      \"blockNumber\": 17488642n,\n      \"chainId\": 1,\n      \"from\": \"0xd2135cfb216b74109775236e36d4b433f1df507b\",\n      \"gas\": 53671n,\n      \"gasPrice\": 15806335296n,\n      \"hash\": \"0xa559259bd2d0e8372421e222ff3545f705b5da60005bd787a23c2e68d6d7fefd\",\n      \"input\": \"0xa9059cbb0000000000000000000000006acbe090725d8b1cd59fe5f3e0c9c3685ebb77af00000000000000000000000000000000000000000000000000000002540be400\",\n      \"maxFeePerGas\": 19000000000n,\n      \"maxPriorityFeePerGas\": 1000000000n,\n      \"nonce\": 29,\n      \"r\": \"0x60a19c4a708571d2a7c661dc5494542fa2c6ddd8e7dc218e4c4795b6ba7969f5\",\n      \"s\": \"0x7ef2778cc21f5c12861208d0c030e77193a234273e32a1dd5066d7d677aa1ef2\",\n      \"to\": \"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\",\n      \"transactionIndex\": 58,\n      \"type\": \"eip1559\",\n      \"typeHex\": \"0x2\",\n      \"v\": 1n,\n      \"value\": 0n,\n      \"yParity\": 1,\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/actions/getTransaction.ts",
    "content": "import type { Chain } from 'viem'\nimport {\n  type GetTransactionErrorType as viem_GetTransactionErrorType,\n  type GetTransactionParameters as viem_GetTransactionParameters,\n  type GetTransactionReturnType as viem_GetTransactionReturnType,\n  getTransaction as viem_getTransaction,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { SelectChains } from '../types/chain.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute, IsNarrowable } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type GetTransactionParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n> = Compute<viem_GetTransactionParameters & ChainIdParameter<config, chainId>>\n\nexport type GetTransactionReturnType<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  ///\n  chains extends readonly Chain[] = SelectChains<config, chainId>,\n> = Compute<\n  {\n    [key in keyof chains]: viem_GetTransactionReturnType<\n      IsNarrowable<chains[key], Chain> extends true ? chains[key] : undefined\n    > & { chainId: chains[key]['id'] }\n  }[number]\n>\n\nexport type GetTransactionErrorType = viem_GetTransactionErrorType\n\n/** https://wagmi.sh/core/api/actions/getTransaction */\nexport function getTransaction<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n>(\n  config: config,\n  parameters: GetTransactionParameters<config, chainId>,\n): Promise<GetTransactionReturnType<config, chainId>> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  const action = getAction(client, viem_getTransaction, 'getTransaction')\n  return action(rest) as unknown as Promise<\n    GetTransactionReturnType<config, chainId>\n  >\n}\n"
  },
  {
    "path": "packages/core/src/actions/getTransactionConfirmations.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport { http } from 'viem'\nimport { mainnet, zkSync } from 'viem/chains'\nimport { test } from 'vitest'\nimport { createConfig } from '../createConfig.js'\nimport { getTransactionConfirmations } from './getTransactionConfirmations.js'\n\ntest('default', async () => {\n  getTransactionConfirmations(config, {\n    transactionReceipt: {\n      blockHash: '0x',\n      blockNumber: 1n,\n      contractAddress: '0x',\n      cumulativeGasUsed: 1n,\n      effectiveGasPrice: 1n,\n      from: '0x',\n      gasUsed: 1n,\n      l1Fee: 1n,\n      logs: [],\n      logsBloom: '0x',\n      status: 'success',\n      to: '0x',\n      transactionHash: '0x',\n      transactionIndex: 1,\n      type: 'eip1559',\n    },\n  })\n})\n\ntest('chain formatters', async () => {\n  const config = createConfig({\n    chains: [mainnet, zkSync],\n    transports: { [mainnet.id]: http(), [zkSync.id]: http() },\n  })\n\n  const transactionReceipt = {\n    blockHash: '0x',\n    blockNumber: 1n,\n    contractAddress: '0x',\n    cumulativeGasUsed: 1n,\n    effectiveGasPrice: 1n,\n    from: '0x',\n    gasUsed: 1n,\n    logsBloom: '0x',\n    status: 'success',\n    to: '0x',\n    transactionHash: '0x',\n    transactionIndex: 1,\n    type: 'eip1559',\n  } as const\n\n  getTransactionConfirmations(config, {\n    transactionReceipt: {\n      ...transactionReceipt,\n      l1BatchNumber: 1n,\n      l1BatchTxIndex: 1n,\n      logs: [],\n      l2ToL1Logs: [],\n    },\n  })\n\n  getTransactionConfirmations(config, {\n    chainId: zkSync.id,\n    transactionReceipt: {\n      ...transactionReceipt,\n      l1BatchNumber: 1n,\n      l1BatchTxIndex: 1n,\n      logs: [],\n      l2ToL1Logs: [],\n    },\n  })\n\n  getTransactionConfirmations(config, {\n    chainId: mainnet.id,\n    transactionReceipt: {\n      ...transactionReceipt,\n      // @ts-expect-error\n      l1BatchNumber: 1n,\n      l1BatchTxIndex: 1n,\n      logs: [],\n      l2ToL1Logs: [],\n    },\n  })\n})\n"
  },
  {
    "path": "packages/core/src/actions/getTransactionConfirmations.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getTransactionConfirmations } from './getTransactionConfirmations.js'\nimport { getTransactionReceipt } from './getTransactionReceipt.js'\n\ntest('default', async () => {\n  await expect(\n    getTransactionConfirmations(config, {\n      hash: '0xa559259bd2d0e8372421e222ff3545f705b5da60005bd787a23c2e68d6d7fefd',\n    }),\n  ).resolves.toBeTypeOf('bigint')\n})\n\ntest('parameters: transactionReceipt', async () => {\n  const transactionReceipt = await getTransactionReceipt(config, {\n    hash: '0xa559259bd2d0e8372421e222ff3545f705b5da60005bd787a23c2e68d6d7fefd',\n  })\n\n  await expect(\n    getTransactionConfirmations(config, {\n      transactionReceipt,\n    }),\n  ).resolves.toBeTypeOf('bigint')\n})\n"
  },
  {
    "path": "packages/core/src/actions/getTransactionConfirmations.ts",
    "content": "import type { Chain } from 'viem'\nimport {\n  type GetTransactionConfirmationsErrorType as viem_GetTransactionConfirmationsErrorType,\n  type GetTransactionConfirmationsParameters as viem_GetTransactionConfirmationsParameters,\n  type GetTransactionConfirmationsReturnType as viem_GetTransactionConfirmationsReturnType,\n  getTransactionConfirmations as viem_getTransactionConfirmations,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { SelectChains } from '../types/chain.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type GetTransactionConfirmationsParameters<\n  config extends Config = Config,\n  chainId extends\n    | config['chains'][number]['id']\n    | undefined = config['chains'][number]['id'],\n  ///\n  chains extends readonly Chain[] = SelectChains<config, chainId>,\n> = {\n  [key in keyof chains]: viem_GetTransactionConfirmationsParameters<\n    chains[key]\n  > &\n    ChainIdParameter<config, chainId>\n}[number]\n\nexport type GetTransactionConfirmationsReturnType =\n  viem_GetTransactionConfirmationsReturnType\n\nexport type GetTransactionConfirmationsErrorType =\n  viem_GetTransactionConfirmationsErrorType\n\n/** https://wagmi.sh/core/api/actions/getTransactionConfirmations */\nexport function getTransactionConfirmations<\n  config extends Config,\n  chainId extends\n    | config['chains'][number]['id']\n    | undefined = config['chains'][number]['id'],\n>(\n  config: config,\n  parameters: GetTransactionConfirmationsParameters<config, chainId>,\n): Promise<GetTransactionConfirmationsReturnType> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  const action = getAction(\n    client,\n    viem_getTransactionConfirmations,\n    'getTransactionConfirmations',\n  )\n  return action(rest as viem_GetTransactionConfirmationsParameters)\n}\n"
  },
  {
    "path": "packages/core/src/actions/getTransactionCount.test.ts",
    "content": "import { accounts, chain, config, testClient } from '@wagmi/test'\nimport type { BlockTag } from 'viem'\nimport { expect, test } from 'vitest'\nimport { getTransactionCount } from './getTransactionCount.js'\n\nconst address = accounts[0]\n\ntest('default', async () => {\n  await expect(getTransactionCount(config, { address })).resolves.toBeTypeOf(\n    'number',\n  )\n})\n\ntest('parameters: chainId', async () => {\n  await testClient.mainnet2.setNonce({\n    address,\n    nonce: 6969,\n  })\n  await testClient.mainnet2.mine({ blocks: 1 })\n  await expect(\n    getTransactionCount(config, { address, chainId: chain.mainnet2.id }),\n  ).resolves.toBeTypeOf('number')\n})\n\ntest('parameters: blockNumber', async () => {\n  await expect(\n    getTransactionCount(config, { address, blockNumber: 13677382n }),\n  ).resolves.toBeTypeOf('number')\n})\n\ntest.each([\n  { blockTag: 'earliest' },\n  { blockTag: 'finalized' },\n  { blockTag: 'latest' },\n  { blockTag: 'pending' },\n  { blockTag: 'safe' },\n] as { blockTag: BlockTag; expected: number }[])(\n  'parameters: blockTag $blockTag',\n  async ({ blockTag }) => {\n    await testClient.mainnet.restart()\n\n    await expect(\n      getTransactionCount(config, {\n        address,\n        blockTag,\n      }),\n    ).resolves.toBeTypeOf('number')\n  },\n)\n"
  },
  {
    "path": "packages/core/src/actions/getTransactionCount.ts",
    "content": "import {\n  type GetTransactionCountErrorType as viem_GetTransactionCountErrorType,\n  type GetTransactionCountParameters as viem_GetTransactionCountParameters,\n  type GetTransactionCountReturnType as viem_GetTransactionCountReturnType,\n  getTransactionCount as viem_getTransactionCount,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type GetTransactionCountParameters<config extends Config = Config> =\n  Compute<ChainIdParameter<config> & viem_GetTransactionCountParameters>\n\nexport type GetTransactionCountReturnType = viem_GetTransactionCountReturnType\n\nexport type GetTransactionCountErrorType = viem_GetTransactionCountErrorType\n\n/** https://wagmi.sh/core/api/actions/getTransactionCount */\nexport async function getTransactionCount<config extends Config>(\n  config: config,\n  parameters: GetTransactionCountParameters<config>,\n): Promise<GetTransactionCountReturnType> {\n  const { address, blockNumber, blockTag, chainId } = parameters\n\n  const client = config.getClient({ chainId })\n  const action = getAction(\n    client,\n    viem_getTransactionCount,\n    'getTransactionCount',\n  )\n  return action(blockNumber ? { address, blockNumber } : { address, blockTag })\n}\n"
  },
  {
    "path": "packages/core/src/actions/getTransactionReceipt.test-d.ts",
    "content": "import { http } from 'viem'\nimport { mainnet, zkSync } from 'viem/chains'\nimport type { ZkSyncL2ToL1Log, ZkSyncLog } from 'viem/zksync'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { createConfig } from '../createConfig.js'\nimport { getTransactionReceipt } from './getTransactionReceipt.js'\n\ntest('chain formatters', async () => {\n  const config = createConfig({\n    chains: [mainnet, zkSync],\n    transports: { [mainnet.id]: http(), [zkSync.id]: http() },\n  })\n  const result = await getTransactionReceipt(config, { hash: '0x123' })\n  if (result.chainId === zkSync.id) {\n    expectTypeOf(result.l1BatchNumber).toEqualTypeOf<bigint | null>()\n    expectTypeOf(result.l1BatchTxIndex).toEqualTypeOf<bigint | null>()\n    expectTypeOf(result.logs).toEqualTypeOf<ZkSyncLog[]>()\n    expectTypeOf(result.l2ToL1Logs).toEqualTypeOf<ZkSyncL2ToL1Log[]>()\n  }\n})\n\ntest('chainId', async () => {\n  const config = createConfig({\n    chains: [zkSync],\n    transports: { [zkSync.id]: http() },\n  })\n  const result = await getTransactionReceipt(config, {\n    hash: '0x123',\n    chainId: zkSync.id,\n  })\n  expectTypeOf(result.l1BatchNumber).toEqualTypeOf<bigint | null>()\n  expectTypeOf(result.l1BatchTxIndex).toEqualTypeOf<bigint | null>()\n  expectTypeOf(result.logs).toEqualTypeOf<ZkSyncLog[]>()\n  expectTypeOf(result.l2ToL1Logs).toEqualTypeOf<ZkSyncL2ToL1Log[]>()\n})\n"
  },
  {
    "path": "packages/core/src/actions/getTransactionReceipt.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getTransaction } from './getTransaction.js'\nimport { getTransactionReceipt } from './getTransactionReceipt.js'\n\ntest('default', async () => {\n  const transaction = await getTransaction(config, {\n    blockNumber: 16280769n,\n    index: 0,\n  })\n\n  await expect(\n    getTransactionReceipt(config, {\n      hash: transaction.hash,\n    }),\n  ).resolves.toMatchInlineSnapshot(`\n    {\n      \"blockHash\": \"0xb932f77cf770d1d1c8f861153eec1e990f5d56b6ffdb4ac06aef3cca51ef37d4\",\n      \"blockNumber\": 16280769n,\n      \"contractAddress\": null,\n      \"cumulativeGasUsed\": 21000n,\n      \"effectiveGasPrice\": 33427926161n,\n      \"from\": \"0x043022ef9fca1066024d19d681e2ccf44ff90de3\",\n      \"gasUsed\": 21000n,\n      \"logs\": [],\n      \"logsBloom\": \"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\n      \"status\": \"success\",\n      \"to\": \"0x318a5fb4f1604fc46375a1db9a9018b6e423b345\",\n      \"transactionHash\": \"0xbf7d27700d053765c9638d3b9d39eb3c56bfc48377583e8be483d61f9f18a871\",\n      \"transactionIndex\": 0,\n      \"type\": \"legacy\",\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/actions/getTransactionReceipt.ts",
    "content": "import type { Chain } from 'viem'\nimport {\n  type GetTransactionReceiptErrorType as viem_GetTransactionReceiptErrorType,\n  type GetTransactionReceiptParameters as viem_GetTransactionReceiptParameters,\n  type GetTransactionReceiptReturnType as viem_GetTransactionReceiptReturnType,\n  getTransactionReceipt as viem_getTransactionReceipt,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { SelectChains } from '../types/chain.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute, IsNarrowable } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type GetTransactionReceiptParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n> = Compute<\n  viem_GetTransactionReceiptParameters & ChainIdParameter<config, chainId>\n>\n\nexport type GetTransactionReceiptReturnType<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  ///\n  chains extends readonly Chain[] = SelectChains<config, chainId>,\n> = Compute<\n  {\n    [key in keyof chains]: viem_GetTransactionReceiptReturnType<\n      IsNarrowable<chains[key], Chain> extends true ? chains[key] : undefined\n    > & { chainId: chains[key]['id'] }\n  }[number]\n>\n\nexport type GetTransactionReceiptErrorType = viem_GetTransactionReceiptErrorType\n\n/** https://wagmi.sh/core/api/actions/getTransactionReceipt */\nexport async function getTransactionReceipt<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n>(\n  config: config,\n  parameters: GetTransactionReceiptParameters<config>,\n): Promise<GetTransactionReceiptReturnType<config, chainId>> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  const action = getAction(\n    client,\n    viem_getTransactionReceipt,\n    'getTransactionReceipt',\n  )\n  return action(rest) as unknown as Promise<\n    GetTransactionReceiptReturnType<config, chainId>\n  >\n}\n"
  },
  {
    "path": "packages/core/src/actions/getWalletClient.test-d.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport type { Account } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport { getWalletClient } from './getWalletClient.js'\n\ntest('default', async () => {\n  const client = await getWalletClient(config)\n  expectTypeOf(client.chain).toEqualTypeOf<(typeof config)['chains'][number]>()\n  expectTypeOf(client.transport.type).toEqualTypeOf<'http'>()\n  expectTypeOf(client.account).toEqualTypeOf<Account>()\n})\n\ntest('parameters: chainId', async () => {\n  const client = await getWalletClient(config, {\n    chainId: chain.mainnet.id,\n  })\n  expectTypeOf(client.chain).toEqualTypeOf<typeof chain.mainnet>()\n  expectTypeOf(client.chain).not.toEqualTypeOf<typeof chain.mainnet2>()\n  expectTypeOf(client.transport.type).toEqualTypeOf<'http'>()\n  expectTypeOf(client.account).toEqualTypeOf<Account>()\n})\n"
  },
  {
    "path": "packages/core/src/actions/getWalletClient.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { getWalletClient } from './getWalletClient.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n  await expect(getWalletClient(config)).resolves.toBeDefined()\n  await disconnect(config, { connector })\n})\n\ntest('behavior: not connected', async () => {\n  await expect(\n    getWalletClient(config),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [ConnectorNotConnectedError: Connector not connected.\n\n    Version: @wagmi/core@x.y.z]\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/actions/getWalletClient.ts",
    "content": "import { type Account, type WalletClient, walletActions } from 'viem'\n\nimport type { Config } from '../createConfig.js'\nimport type { BaseErrorType, ErrorType } from '../errors/base.js'\nimport type { Compute } from '../types/utils.js'\nimport {\n  type GetConnectorClientErrorType,\n  type GetConnectorClientParameters,\n  getConnectorClient,\n} from './getConnectorClient.js'\n\nexport type GetWalletClientParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n> = GetConnectorClientParameters<Config, chainId>\n\nexport type GetWalletClientReturnType<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n> = Compute<\n  WalletClient<\n    config['_internal']['transports'][chainId],\n    Extract<config['chains'][number], { id: chainId }>,\n    Account\n  >\n>\n\nexport type GetWalletClientErrorType =\n  // getConnectorClient()\n  | GetConnectorClientErrorType\n  // base\n  | BaseErrorType\n  | ErrorType\n\nexport async function getWalletClient<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n>(\n  config: config,\n  parameters: GetWalletClientParameters<config, chainId> = {},\n): Promise<GetWalletClientReturnType<config, chainId>> {\n  const client = await getConnectorClient(config, parameters)\n  // @ts-ignore\n  return client.extend(walletActions) as unknown as GetWalletClientReturnType<\n    config,\n    chainId\n  >\n}\n"
  },
  {
    "path": "packages/core/src/actions/multicall.bench-d.ts",
    "content": "import { attest } from '@ark/attest'\nimport { abi, config } from '@wagmi/test'\nimport { test } from 'vitest'\nimport { multicall } from './multicall.js'\n\ntest('default', () => {\n  multicall(config, {\n    chainId: 1,\n    contracts: [\n      {\n        address: '0x',\n        abi: abi.erc20,\n        functionName: 'balanceOf',\n        args: ['0x'],\n      },\n      {\n        address: '0x',\n        abi: abi.wagmiMintExample,\n        functionName: 'tokenURI',\n        args: [123n],\n      },\n      {\n        address: '0x',\n        abi: abi.viewOverloads,\n        functionName: 'foo',\n      },\n      {\n        address: '0x',\n        abi: abi.viewOverloads,\n        functionName: 'foo',\n        args: ['0x'],\n      },\n      {\n        address: '0x',\n        abi: abi.viewOverloads,\n        functionName: 'foo',\n        args: ['0x', '0x'],\n      },\n      {\n        abi: abi.wagmigotchi,\n        address: '0x',\n        functionName: 'love',\n        args: ['0x'],\n      },\n      {\n        abi: abi.wagmigotchi,\n        address: '0x',\n        functionName: 'love',\n        args: ['0x'],\n      },\n      {\n        abi: abi.wagmigotchi,\n        address: '0x',\n        functionName: 'getAlive',\n      },\n      {\n        abi: abi.mloot,\n        address: '0x',\n        functionName: 'tokenOfOwnerByIndex',\n        args: ['0x', 0n],\n      },\n      {\n        abi: abi.erc20,\n        address: '0x',\n        functionName: 'symbol',\n      },\n      {\n        abi: abi.erc20,\n        address: '0x',\n        functionName: 'balanceOf',\n        args: ['0x'],\n      },\n    ],\n  })\n  attest.instantiations([523679, 'instantiations'])\n})\n"
  },
  {
    "path": "packages/core/src/actions/multicall.test-d.ts",
    "content": "import { abi, config } from '@wagmi/test'\nimport type { Address } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { multicall } from './multicall.js'\n\ntest('default', async () => {\n  const result = await multicall(config, {\n    chainId: 1,\n    contracts: [\n      {\n        address: '0x',\n        abi: abi.erc20,\n        functionName: 'balanceOf',\n        args: ['0x'],\n      },\n      {\n        address: '0x',\n        abi: abi.wagmiMintExample,\n        functionName: 'tokenURI',\n        args: [123n],\n      },\n    ],\n  })\n  expectTypeOf(result).toEqualTypeOf<\n    [\n      (\n        | { error: Error; result?: undefined; status: 'failure' }\n        | { error?: undefined; result: bigint; status: 'success' }\n      ),\n      (\n        | { error: Error; result?: undefined; status: 'failure' }\n        | { error?: undefined; result: string; status: 'success' }\n      ),\n    ]\n  >()\n})\n\ntest('allowFailure', async () => {\n  const result = await multicall(config, {\n    allowFailure: false,\n    contracts: [\n      {\n        address: '0x',\n        abi: abi.erc20,\n        functionName: 'balanceOf',\n        args: ['0x'],\n      },\n      {\n        address: '0x',\n        abi: abi.wagmiMintExample,\n        functionName: 'tokenURI',\n        args: [123n],\n      },\n    ],\n  })\n  expectTypeOf(result).toEqualTypeOf<[bigint, string]>()\n})\n\ntest('MulticallParameters', async () => {\n  type Result = Parameters<\n    typeof multicall<\n      typeof config,\n      [\n        {\n          address: '0x'\n          abi: typeof abi.viewOverloads\n          functionName: 'foo'\n        },\n      ]\n    >\n  >[1]['contracts'][0]\n  expectTypeOf<Result['functionName']>().toEqualTypeOf<'foo' | 'bar'>()\n  expectTypeOf<Result['args']>().toEqualTypeOf<\n    readonly [] | readonly [Address] | readonly [Address, Address] | undefined\n  >()\n})\n\ntest('overloads', async () => {\n  const res = await multicall(config, {\n    allowFailure: false,\n    contracts: [\n      {\n        address: '0x',\n        abi: abi.viewOverloads,\n        functionName: 'foo',\n      },\n      {\n        address: '0x',\n        abi: abi.viewOverloads,\n        functionName: 'foo',\n        args: ['0x'],\n      },\n      {\n        address: '0x',\n        abi: abi.viewOverloads,\n        functionName: 'foo',\n        args: ['0x', '0x'],\n      },\n    ],\n  })\n\n  expectTypeOf(res).toEqualTypeOf<\n    [number, string, { foo: Address; bar: Address }]\n  >()\n})\n"
  },
  {
    "path": "packages/core/src/actions/multicall.test.ts",
    "content": "import { abi, address, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { multicall } from './multicall.js'\n\ntest('default', async () => {\n  await expect(\n    multicall(config, {\n      contracts: [\n        {\n          address: address.wagmiMintExample,\n          abi: abi.wagmiMintExample,\n          functionName: 'balanceOf',\n          args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n        },\n      ],\n    }),\n  ).resolves.toMatchInlineSnapshot(`\n    [\n      {\n        \"result\": 10n,\n        \"status\": \"success\",\n      },\n    ]\n  `)\n})\n\ntest('allowFailure', async () => {\n  await expect(\n    multicall(config, {\n      allowFailure: false,\n      contracts: [\n        {\n          address: address.wagmiMintExample,\n          abi: abi.wagmiMintExample,\n          functionName: 'balanceOf',\n          args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n        },\n      ],\n    }),\n  ).resolves.toMatchInlineSnapshot(`\n    [\n      10n,\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/actions/multicall.ts",
    "content": "import type {\n  ContractFunctionParameters,\n  MulticallErrorType as viem_MulticallErrorType,\n  MulticallParameters as viem_MulticallParameters,\n  MulticallReturnType as viem_MulticallReturnType,\n} from 'viem'\nimport { multicall as viem_multicall } from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type MulticallParameters<\n  contracts extends readonly unknown[] = readonly ContractFunctionParameters[],\n  allowFailure extends boolean = true,\n  config extends Config = Config,\n> = viem_MulticallParameters<contracts, allowFailure> & ChainIdParameter<config>\n\nexport type MulticallReturnType<\n  contracts extends readonly unknown[] = readonly ContractFunctionParameters[],\n  allowFailure extends boolean = true,\n> = viem_MulticallReturnType<contracts, allowFailure>\n\nexport type MulticallErrorType = viem_MulticallErrorType\n\nexport async function multicall<\n  config extends Config,\n  const contracts extends readonly ContractFunctionParameters[],\n  allowFailure extends boolean = true,\n>(\n  config: config,\n  parameters: MulticallParameters<contracts, allowFailure, config>,\n): Promise<MulticallReturnType<contracts, allowFailure>> {\n  const { allowFailure = true, chainId, contracts, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  const action = getAction(client, viem_multicall, 'multicall')\n  return action({\n    allowFailure,\n    contracts,\n    ...rest,\n  }) as Promise<MulticallReturnType<contracts, allowFailure>>\n}\n"
  },
  {
    "path": "packages/core/src/actions/prepareTransactionRequest.test-d.ts",
    "content": "import { accounts, config } from '@wagmi/test'\nimport { http, parseEther } from 'viem'\nimport { celo, mainnet } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { createConfig } from '../createConfig.js'\nimport {\n  type PrepareTransactionRequestParameters,\n  prepareTransactionRequest,\n} from './prepareTransactionRequest.js'\n\nconst targetAccount = accounts[1]\n\ntest('default', async () => {\n  const response = await prepareTransactionRequest(config, {\n    chainId: 1,\n    to: '0x',\n    value: parseEther('1'),\n  })\n  const { nonce: _nonce, ...request } = response\n  request.to\n  request.chainId\n\n  expectTypeOf(response).toMatchTypeOf<{\n    chainId: 1\n  }>()\n})\n\ntest('chain formatters', async () => {\n  const config = createConfig({\n    chains: [celo, mainnet],\n    transports: { [celo.id]: http(), [mainnet.id]: http() },\n  })\n\n  type Result = PrepareTransactionRequestParameters<typeof config>\n  expectTypeOf<Result>().toMatchTypeOf<{\n    chainId?: typeof celo.id | typeof mainnet.id | undefined\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  const request = await prepareTransactionRequest(config, {\n    to: targetAccount,\n    value: parseEther('0.01'),\n    feeCurrency: '0x',\n  })\n  if (request.chainId === celo.id) {\n    expectTypeOf(request.chainId).toEqualTypeOf(celo.id)\n    expectTypeOf(request.feeCurrency).toEqualTypeOf<`0x${string}` | undefined>()\n  }\n\n  type Result2 = PrepareTransactionRequestParameters<\n    typeof config,\n    typeof celo.id\n  >\n  expectTypeOf<Result2>().toMatchTypeOf<{\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  const request2 = await prepareTransactionRequest(config, {\n    chainId: celo.id,\n    to: targetAccount,\n    value: parseEther('0.01'),\n    feeCurrency: '0x',\n  })\n  expectTypeOf(request2.chainId).toEqualTypeOf(celo.id)\n  expectTypeOf(request2.feeCurrency).toEqualTypeOf<`0x${string}` | undefined>()\n\n  type Result3 = PrepareTransactionRequestParameters<\n    typeof config,\n    typeof mainnet.id\n  >\n  expectTypeOf<Result3>().not.toMatchTypeOf<{\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  prepareTransactionRequest(config, {\n    chainId: mainnet.id,\n    to: targetAccount,\n    value: parseEther('0.01'),\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n})\n"
  },
  {
    "path": "packages/core/src/actions/prepareTransactionRequest.test.ts",
    "content": "import { accounts, config, privateKey } from '@wagmi/test'\nimport { parseEther } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { expect, test } from 'vitest'\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { prepareTransactionRequest } from './prepareTransactionRequest.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const request = await prepareTransactionRequest(config, {\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n    value: parseEther('1'),\n  })\n\n  const {\n    gas: _gas,\n    gasPrice: _gasPrice,\n    maxFeePerGas: _mfpg,\n    maxPriorityFeePerGas: _mpfpg,\n    nonce: _nonce,\n    ...rest\n  } = request\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n      \"chainId\": 1,\n      \"from\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n      \"to\": \"0x70997970c51812dc3a010c7d01b50e0d17dc79c8\",\n      \"type\": \"eip1559\",\n      \"value\": 1000000000000000000n,\n    }\n  `)\n\n  await disconnect(config, { connector })\n})\n\ntest('parameters: account', async () => {\n  await connect(config, { connector })\n\n  const request = await prepareTransactionRequest(config, {\n    account: accounts[0],\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n    value: parseEther('1'),\n  })\n\n  const {\n    gas: _gas,\n    gasPrice: _gasPrice,\n    maxFeePerGas: _mfpg,\n    maxPriorityFeePerGas: _mpfpg,\n    nonce: _nonce,\n    ...rest\n  } = request\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n      \"chainId\": 1,\n      \"from\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n      \"to\": \"0x70997970c51812dc3a010c7d01b50e0d17dc79c8\",\n      \"type\": \"eip1559\",\n      \"value\": 1000000000000000000n,\n    }\n  `)\n\n  await disconnect(config, { connector })\n})\n\ntest('behavior: local account', async () => {\n  const account = privateKeyToAccount(privateKey)\n\n  const request = await prepareTransactionRequest(config, {\n    account,\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n    value: parseEther('1'),\n  })\n\n  const {\n    gas: _gas,\n    gasPrice: _gasPrice,\n    maxFeePerGas: _mfpg,\n    maxPriorityFeePerGas: _mpfpg,\n    nonce: _nonce,\n    ...rest\n  } = request\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"account\": {\n        \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n        \"nonceManager\": undefined,\n        \"publicKey\": \"0x04e997cee8adb07b5269f375399109f53c94ddb7ac9cdb9252b74ba33fd471392fc563102ff7b38c85ee9d0a88c8819e6c97ea8b0db791d59c89086f62f5516863\",\n        \"sign\": [Function],\n        \"signAuthorization\": [Function],\n        \"signMessage\": [Function],\n        \"signTransaction\": [Function],\n        \"signTypedData\": [Function],\n        \"source\": \"privateKey\",\n        \"type\": \"local\",\n      },\n      \"chainId\": 1,\n      \"from\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n      \"to\": \"0x70997970c51812dc3a010c7d01b50e0d17dc79c8\",\n      \"type\": \"eip1559\",\n      \"value\": 1000000000000000000n,\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/actions/prepareTransactionRequest.ts",
    "content": "import type {\n  Account,\n  Address,\n  Chain,\n  PrepareTransactionRequestErrorType as viem_PrepareTransactionRequestErrorType,\n  PrepareTransactionRequestParameters as viem_PrepareTransactionRequestParameters,\n  PrepareTransactionRequestRequest as viem_PrepareTransactionRequestRequest,\n  PrepareTransactionRequestReturnType as viem_PrepareTransactionRequestReturnType,\n} from 'viem'\nimport { prepareTransactionRequest as viem_prepareTransactionRequest } from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { SelectChains } from '../types/chain.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type {\n  IsNarrowable,\n  UnionCompute,\n  UnionStrictOmit,\n} from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\nimport { getConnection } from './getConnection.js'\n\nexport type PrepareTransactionRequestParameters<\n  config extends Config = Config,\n  chainId extends\n    | config['chains'][number]['id']\n    | undefined = config['chains'][number]['id'],\n  request extends viem_PrepareTransactionRequestRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  > = viem_PrepareTransactionRequestRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  >,\n  ///\n  chains extends readonly Chain[] = SelectChains<config, chainId>,\n> = {\n  [key in keyof chains]: UnionCompute<\n    UnionStrictOmit<\n      viem_PrepareTransactionRequestParameters<\n        chains[key],\n        Account,\n        chains[key],\n        Account | Address,\n        request extends viem_PrepareTransactionRequestRequest<\n          chains[key],\n          chains[key]\n        >\n          ? request\n          : never\n      >,\n      'chain'\n    > &\n      ChainIdParameter<config, chainId> & {\n        to: Address\n      }\n  >\n}[number]\n\nexport type PrepareTransactionRequestReturnType<\n  config extends Config = Config,\n  chainId extends\n    | config['chains'][number]['id']\n    | undefined = config['chains'][number]['id'],\n  request extends viem_PrepareTransactionRequestRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  > = viem_PrepareTransactionRequestRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  >,\n  ///\n  chains extends readonly Chain[] = SelectChains<config, chainId>,\n> = {\n  [key in keyof chains]: viem_PrepareTransactionRequestReturnType<\n    IsNarrowable<chains[key], Chain> extends true ? chains[key] : undefined,\n    Account,\n    chains[key],\n    Account,\n    request extends viem_PrepareTransactionRequestRequest<\n      IsNarrowable<chains[key], Chain> extends true ? chains[key] : undefined,\n      chains[key]\n    >\n      ? request\n      : never\n  > & {\n    chainId: chains[key]['id']\n  }\n}[number]\n\nexport type PrepareTransactionRequestErrorType =\n  viem_PrepareTransactionRequestErrorType\n\n/** https://wagmi.sh/core/api/actions/prepareTransactionRequest */\nexport async function prepareTransactionRequest<\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined,\n  const request extends viem_PrepareTransactionRequestRequest<\n    SelectChains<config, chainId>['0'],\n    SelectChains<config, chainId>['0']\n  >,\n>(\n  config: config,\n  parameters: PrepareTransactionRequestParameters<config, chainId, request>,\n): Promise<PrepareTransactionRequestReturnType<config, chainId, request>> {\n  const { account: account_, chainId, ...rest } = parameters\n\n  const account = account_ ?? getConnection(config).address\n  const client = config.getClient({ chainId })\n\n  const action = getAction(\n    client,\n    viem_prepareTransactionRequest,\n    'prepareTransactionRequest',\n  )\n  return action({\n    ...rest,\n    ...(account ? { account } : {}),\n  } as unknown as viem_PrepareTransactionRequestParameters) as unknown as Promise<\n    PrepareTransactionRequestReturnType<config, chainId, request>\n  >\n}\n"
  },
  {
    "path": "packages/core/src/actions/readContract.bench-d.ts",
    "content": "import { attest } from '@ark/attest'\nimport type { abi } from '@wagmi/test'\nimport { parseAbi } from 'viem'\nimport viemPackageJson from 'viem/package.json' with { type: 'json' }\nimport { test } from 'vitest'\nimport type { ReadContractParameters } from './readContract.js'\n\ntest('default', () => {\n  type Result = ReadContractParameters<(typeof abi)['erc20'], 'balanceOf'>\n  const res = {} as Result\n  attest.instantiations([132033, 'instantiations'])\n  attest<readonly [account: `0x${string}`]>(res.args)\n  if (viemPackageJson.version.startsWith('2.43'))\n    attest(res.args).type.toString.snap(\n      // biome-ignore lint/style/noUnusedTemplateLiteral: stable\n      `readonly [account: \\`0x\\${string}\\`]`,\n    )\n})\n\nconst abiOverload = parseAbi([\n  'function foo() view returns (int8)',\n  'function foo(address account) view returns (string)',\n  'function foo(address sender, address account) view returns ((address foo, address bar))',\n  'function bar() view returns (int8)',\n])\ntest('overloads', () => {\n  type Result = ReadContractParameters<typeof abiOverload, 'foo'>\n  const res = {} as Result\n  attest.instantiations([12984, 'instantiations'])\n  attest<\n    | readonly []\n    | readonly [account: `0x${string}`]\n    | readonly [sender: `0x${string}`, account: `0x${string}`]\n    | undefined\n  >(res.args)\n  if (viemPackageJson.version.startsWith('2.43'))\n    attest(res.args).type.toString.snap(`  | readonly []\n  | readonly [account: \\`0x\\${string}\\`]\n  | readonly [sender: \\`0x\\${string}\\`, account: \\`0x\\${string}\\`]\n  | undefined`)\n})\n"
  },
  {
    "path": "packages/core/src/actions/readContract.test-d.ts",
    "content": "import { abi, config } from '@wagmi/test'\nimport { assertType, expectTypeOf, test } from 'vitest'\n\nimport { readContract } from './readContract.js'\n\ntest('default', async () => {\n  const result = await readContract(config, {\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'balanceOf',\n    args: ['0x'],\n  })\n  expectTypeOf(result).toEqualTypeOf<bigint>()\n})\n\ntest('overloads', async () => {\n  const result1 = await readContract(config, {\n    address: '0x',\n    abi: abi.viewOverloads,\n    functionName: 'foo',\n  })\n  assertType<number>(result1)\n\n  const result2 = await readContract(config, {\n    address: '0x',\n    abi: abi.viewOverloads,\n    functionName: 'foo',\n    args: [],\n  })\n  assertType<number>(result2)\n\n  const result3 = await readContract(config, {\n    address: '0x',\n    abi: abi.viewOverloads,\n    functionName: 'foo',\n    args: ['0x'],\n  })\n  assertType<string>(result3)\n\n  const result4 = await readContract(config, {\n    address: '0x',\n    abi: abi.viewOverloads,\n    functionName: 'foo',\n    args: ['0x', '0x'],\n  })\n  assertType<{\n    foo: `0x${string}`\n    bar: `0x${string}`\n  }>(result4)\n})\n\ntest('deployless read (bytecode)', async () => {\n  const result = await readContract(config, {\n    code: '0x',\n    abi: abi.erc20,\n    functionName: 'balanceOf',\n    args: ['0x'],\n  })\n  expectTypeOf(result).toEqualTypeOf<bigint>()\n})\n\ntest('deployless read (factory)', async () => {\n  const result = await readContract(config, {\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'balanceOf',\n    args: ['0x'],\n    factory: '0x',\n    factoryData: '0x',\n  })\n  expectTypeOf(result).toEqualTypeOf<bigint>()\n})\n"
  },
  {
    "path": "packages/core/src/actions/readContract.test.ts",
    "content": "import { abi, address, bytecode, chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { readContract } from './readContract.js'\n\ntest('default', async () => {\n  await expect(\n    readContract(config, {\n      address: address.wagmiMintExample,\n      abi: abi.wagmiMintExample,\n      functionName: 'balanceOf',\n      args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n    }),\n  ).resolves.toMatchInlineSnapshot('10n')\n})\n\ntest('parameters: chainId', async () => {\n  await expect(\n    readContract(config, {\n      address: address.wagmiMintExample,\n      abi: abi.wagmiMintExample,\n      functionName: 'balanceOf',\n      args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n      chainId: chain.mainnet2.id,\n    }),\n  ).resolves.toMatchInlineSnapshot('10n')\n})\n\ntest('parameters: deployless read (bytecode)', async () => {\n  await expect(\n    readContract(config, {\n      abi: abi.wagmiMintExample,\n      functionName: 'name',\n      code: bytecode.wagmiMintExample,\n    }),\n  ).resolves.toMatchInlineSnapshot(`\"wagmi\"`)\n})\n"
  },
  {
    "path": "packages/core/src/actions/readContract.ts",
    "content": "import type { Abi, ContractFunctionArgs, ContractFunctionName } from 'viem'\nimport {\n  type ReadContractErrorType as viem_ReadContractErrorType,\n  type ReadContractParameters as viem_ReadContractParameters,\n  type ReadContractReturnType as viem_ReadContractReturnType,\n  readContract as viem_readContract,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type ReadContractParameters<\n  abi extends Abi | readonly unknown[] = Abi,\n  functionName extends ContractFunctionName<\n    abi,\n    'pure' | 'view'\n  > = ContractFunctionName<abi, 'pure' | 'view'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'pure' | 'view',\n    functionName\n  > = ContractFunctionArgs<abi, 'pure' | 'view', functionName>,\n  config extends Config = Config,\n> = viem_ReadContractParameters<abi, functionName, args> &\n  ChainIdParameter<config>\n\nexport type ReadContractReturnType<\n  abi extends Abi | readonly unknown[] = Abi,\n  functionName extends ContractFunctionName<\n    abi,\n    'pure' | 'view'\n  > = ContractFunctionName<abi, 'pure' | 'view'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'pure' | 'view',\n    functionName\n  > = ContractFunctionArgs<abi, 'pure' | 'view', functionName>,\n> = viem_ReadContractReturnType<abi, functionName, args>\n\nexport type ReadContractErrorType = viem_ReadContractErrorType\n\n/** https://wagmi.sh/core/api/actions/readContract */\nexport function readContract<\n  config extends Config,\n  const abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'pure' | 'view'>,\n  const args extends ContractFunctionArgs<abi, 'pure' | 'view', functionName>,\n>(\n  config: config,\n  parameters: ReadContractParameters<abi, functionName, args, config>,\n): Promise<ReadContractReturnType<abi, functionName, args>> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  const action = getAction(client, viem_readContract, 'readContract')\n  return action(rest as any)\n}\n"
  },
  {
    "path": "packages/core/src/actions/readContracts.test-d.ts",
    "content": "import { abi, config } from '@wagmi/test'\nimport { assertType, expectTypeOf, test } from 'vitest'\n\nimport { readContracts } from './readContracts.js'\n\ntest('default', async () => {\n  const result = await readContracts(config, {\n    contracts: [\n      {\n        address: '0x',\n        abi: abi.erc20,\n        functionName: 'balanceOf',\n        args: ['0x'],\n        chainId: 1,\n      },\n      {\n        address: '0x',\n        abi: abi.wagmiMintExample,\n        functionName: 'tokenURI',\n        args: [123n],\n      },\n    ],\n  })\n  expectTypeOf(result).toEqualTypeOf<\n    [\n      (\n        | { error: Error; result?: undefined; status: 'failure' }\n        | { error?: undefined; result: bigint; status: 'success' }\n      ),\n      (\n        | { error: Error; result?: undefined; status: 'failure' }\n        | { error?: undefined; result: string; status: 'success' }\n      ),\n    ]\n  >()\n})\n\ntest('allowFailure', async () => {\n  const result = await readContracts(config, {\n    allowFailure: false,\n    contracts: [\n      {\n        address: '0x',\n        abi: abi.erc20,\n        functionName: 'balanceOf',\n        args: ['0x'],\n      },\n      {\n        address: '0x',\n        abi: abi.wagmiMintExample,\n        functionName: 'tokenURI',\n        args: [123n],\n      },\n    ],\n  })\n  expectTypeOf(result).toEqualTypeOf<[bigint, string]>()\n})\n\ntest('overloads', async () => {\n  const result1 = await readContracts(config, {\n    allowFailure: false,\n    contracts: [\n      {\n        address: '0x',\n        abi: abi.viewOverloads,\n        functionName: 'foo',\n      },\n    ],\n  })\n  assertType<[number] | undefined>(result1)\n\n  const result2 = await readContracts(config, {\n    allowFailure: false,\n    contracts: [\n      {\n        address: '0x',\n        abi: abi.viewOverloads,\n        functionName: 'foo',\n        args: [],\n      },\n    ],\n  })\n  assertType<[number] | undefined>(result2)\n\n  const result3 = await readContracts(config, {\n    allowFailure: false,\n    contracts: [\n      {\n        address: '0x',\n        abi: abi.viewOverloads,\n        functionName: 'foo',\n        args: ['0x'],\n      },\n    ],\n  })\n  assertType<[string] | undefined>(result3)\n\n  const result4 = await readContracts(config, {\n    allowFailure: false,\n    contracts: [\n      {\n        address: '0x',\n        abi: abi.viewOverloads,\n        functionName: 'foo',\n        args: ['0x', '0x'],\n      },\n    ],\n  })\n  assertType<\n    | [\n        {\n          foo: `0x${string}`\n          bar: `0x${string}`\n        },\n      ]\n    | undefined\n  >(result4)\n})\n"
  },
  {
    "path": "packages/core/src/actions/readContracts.test.ts",
    "content": "import { abi, address, chain } from '@wagmi/test'\nimport { http, type MulticallResponse } from 'viem'\nimport { expect, expectTypeOf, test, vi } from 'vitest'\n\nimport { createConfig } from '../createConfig.js'\nimport * as multicall from './multicall.js'\nimport * as readContract from './readContract.js'\nimport { readContracts } from './readContracts.js'\n\nconst contracts = [\n  {\n    abi: abi.wagmigotchi,\n    address: address.wagmigotchi,\n    functionName: 'love',\n    args: ['0x27a69ffba1e939ddcfecc8c7e0f967b872bac65c'],\n  },\n  {\n    abi: abi.wagmigotchi,\n    address: address.wagmigotchi,\n    functionName: 'love',\n    args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n  },\n  {\n    abi: abi.wagmigotchi,\n    address: address.wagmigotchi,\n    functionName: 'getAlive',\n  },\n  {\n    abi: abi.mloot,\n    address: address.mloot,\n    functionName: 'tokenOfOwnerByIndex',\n    args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', 0n],\n  },\n]\n\nconst { mainnet, mainnet2, optimism } = chain\n\nconst config = createConfig({\n  chains: [\n    { ...mainnet, contracts: { multicall3: undefined } },\n    { ...mainnet2, contracts: { multicall3: undefined } },\n  ],\n  transports: {\n    [mainnet.id]: http(),\n    [mainnet2.id]: http(),\n  },\n})\n\ntest('default', async () => {\n  const spy = vi.spyOn(multicall, 'multicall')\n  const config = createConfig({\n    chains: [mainnet, mainnet2],\n    transports: {\n      [mainnet.id]: http(),\n      [mainnet2.id]: http(),\n    },\n  })\n  const results = await readContracts(config, { contracts })\n\n  expect(spy).toHaveBeenCalledWith(config, {\n    allowFailure: true,\n    contracts,\n    chainId: mainnet.id,\n  })\n  expect(results).toMatchInlineSnapshot(`\n    [\n      {\n        \"result\": 2n,\n        \"status\": \"success\",\n      },\n      {\n        \"result\": 1n,\n        \"status\": \"success\",\n      },\n      {\n        \"result\": false,\n        \"status\": \"success\",\n      },\n      {\n        \"result\": 370395n,\n        \"status\": \"success\",\n      },\n    ]\n  `)\n})\n\ntest('falls back to readContract if multicall is not available', async () => {\n  const spy = vi.spyOn(readContract, 'readContract')\n  const config = createConfig({\n    chains: [mainnet, { ...mainnet2, contracts: { multicall3: undefined } }],\n    transports: {\n      [mainnet.id]: http(),\n      [mainnet2.id]: http(),\n    },\n  })\n  const chainId = mainnet2.id\n  const contracts = [\n    {\n      abi: abi.wagmigotchi,\n      address: address.wagmigotchi,\n      chainId: mainnet2.id,\n      functionName: 'love',\n      args: ['0x27a69ffba1e939ddcfecc8c7e0f967b872bac65c'],\n    },\n    {\n      abi: abi.wagmigotchi,\n      address: address.wagmigotchi,\n      chainId: mainnet2.id,\n      functionName: 'love',\n      args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n    },\n    {\n      abi: abi.wagmigotchi,\n      address: address.wagmigotchi,\n      chainId: mainnet2.id,\n      functionName: 'getAlive',\n    },\n    {\n      abi: abi.mloot,\n      address: address.mloot,\n      chainId: mainnet2.id,\n      functionName: 'tokenOfOwnerByIndex',\n      args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', 0n],\n    },\n  ] as const\n  const results = await readContracts(config, { contracts })\n  expectTypeOf(results).toEqualTypeOf<\n    [\n      MulticallResponse<bigint>,\n      MulticallResponse<bigint>,\n      MulticallResponse<boolean>,\n      MulticallResponse<bigint>,\n    ]\n  >()\n\n  for (const contract of contracts) {\n    expect(spy).toBeCalledWith(config, { ...contract, chainId })\n  }\n  expect(results).toMatchInlineSnapshot(`\n    [\n      {\n        \"result\": 2n,\n        \"status\": \"success\",\n      },\n      {\n        \"result\": 1n,\n        \"status\": \"success\",\n      },\n      {\n        \"result\": false,\n        \"status\": \"success\",\n      },\n      {\n        \"result\": 370395n,\n        \"status\": \"success\",\n      },\n    ]\n  `)\n})\n\ntest('multichain', async () => {\n  const config = createConfig({\n    chains: [mainnet, mainnet2, optimism],\n    transports: {\n      [mainnet.id]: http(),\n      [mainnet2.id]: http(),\n      [optimism.id]: http(),\n    },\n  })\n\n  const spy = vi.spyOn(multicall, 'multicall')\n  const mainnetContracts = [\n    {\n      abi: abi.wagmigotchi,\n      address: address.wagmigotchi,\n      chainId: mainnet.id,\n      functionName: 'love',\n      args: ['0x27a69ffba1e939ddcfecc8c7e0f967b872bac65c'],\n    },\n    {\n      abi: abi.wagmigotchi,\n      address: address.wagmigotchi,\n      chainId: mainnet.id,\n      functionName: 'love',\n      args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n    },\n    {\n      abi: abi.wagmigotchi,\n      address: address.wagmigotchi,\n      chainId: mainnet.id,\n      functionName: 'love',\n      args: ['0xd2135CfB216b74109775236E36d4b433F1DF507B'],\n    },\n  ] as const\n  const mainnet2Contracts = [\n    {\n      abi: abi.wagmigotchi,\n      address: address.wagmigotchi,\n      chainId: mainnet2.id,\n      functionName: 'getAlive',\n    },\n    {\n      abi: abi.mloot,\n      address: address.mloot,\n      chainId: mainnet2.id,\n      functionName: 'tokenOfOwnerByIndex',\n      args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', 0n],\n    },\n  ] as const\n  // const optimismContracts = [\n  //   {\n  //     abi: abi.erc20,\n  //     address: address.optimism.usdc,\n  //     chainId: optimism.id,\n  //     functionName: 'symbol',\n  //   },\n  //   {\n  //     abi: abi.erc20,\n  //     address: address.optimism.usdc,\n  //     chainId: optimism.id,\n  //     functionName: 'balanceOf',\n  //     args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n  //   },\n  // ] as const\n  const results = await readContracts(config, {\n    contracts: [\n      mainnetContracts[0]!,\n      // optimismContracts[0]!,\n      mainnetContracts[1]!,\n      mainnet2Contracts[0]!,\n      // optimismContracts[1]!,\n      mainnet2Contracts[1]!,\n      mainnetContracts[2]!,\n    ],\n  })\n  expectTypeOf(results).toEqualTypeOf<\n    [\n      MulticallResponse<bigint>,\n      // MulticallResponse<string>,\n      MulticallResponse<bigint>,\n      MulticallResponse<boolean>,\n      // MulticallResponse<bigint>,\n      MulticallResponse<bigint>,\n      MulticallResponse<bigint>,\n    ]\n  >()\n\n  expect(spy).toHaveBeenCalledWith(config, {\n    allowFailure: true,\n    contracts: mainnetContracts,\n    chainId: mainnet.id,\n    overrides: undefined,\n  })\n  expect(spy).toHaveBeenCalledWith(config, {\n    allowFailure: true,\n    contracts: mainnet2Contracts,\n    chainId: mainnet2.id,\n    overrides: undefined,\n  })\n  expect(results).toMatchInlineSnapshot(`\n    [\n      {\n        \"result\": 2n,\n        \"status\": \"success\",\n      },\n      {\n        \"result\": 1n,\n        \"status\": \"success\",\n      },\n      {\n        \"result\": false,\n        \"status\": \"success\",\n      },\n      {\n        \"result\": 370395n,\n        \"status\": \"success\",\n      },\n      {\n        \"result\": 0n,\n        \"status\": \"success\",\n      },\n    ]\n  `)\n}, 60_000)\n\ntest('multichain: falls back to readContract if multicall is not available', async () => {\n  const config = createConfig({\n    chains: [{ ...mainnet, contracts: { multicall3: undefined } }, optimism],\n    transports: {\n      [mainnet.id]: http(),\n      [optimism.id]: http(),\n    },\n  })\n\n  const spy = vi.spyOn(readContract, 'readContract')\n  const mainnetContracts = [\n    {\n      abi: abi.wagmigotchi,\n      address: address.wagmigotchi,\n      chainId: mainnet.id,\n      functionName: 'love',\n      args: ['0x27a69ffba1e939ddcfecc8c7e0f967b872bac65c'],\n    },\n    {\n      abi: abi.wagmigotchi,\n      address: address.wagmigotchi,\n      chainId: mainnet.id,\n      functionName: 'love',\n      args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n    },\n  ] as const\n  // const optimismContracts = [\n  //   {\n  //     abi: abi.erc20,\n  //     address: address.optimism.usdc,\n  //     chainId: optimism.id,\n  //     functionName: 'symbol',\n  //   },\n  //   {\n  //     abi: abi.erc20,\n  //     address: address.optimism.usdc,\n  //     chainId: optimism.id,\n  //     functionName: 'balanceOf',\n  //     args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n  //   },\n  // ] as const\n  const results = await readContracts(config, {\n    contracts: [...mainnetContracts /** ...optimismContracts */],\n  })\n  expectTypeOf(results).toEqualTypeOf<\n    [\n      MulticallResponse<bigint>,\n      MulticallResponse<bigint>,\n      // MulticallResponse<string>,\n      // MulticallResponse<bigint>,\n    ]\n  >()\n\n  for (const contract of mainnetContracts) {\n    expect(spy).toBeCalledWith(config, { ...contract, chainId: mainnet.id })\n  }\n  // for (const contract of optimismContracts) {\n  //   expect(spy).toBeCalledWith(config, { ...contract, chainId: optimism.id })\n  // }\n  expect(results).toMatchInlineSnapshot(`\n    [\n      {\n        \"result\": 2n,\n        \"status\": \"success\",\n      },\n      {\n        \"result\": 1n,\n        \"status\": \"success\",\n      },\n    ]\n  `)\n}, 15_000)\n\ntest('throws if allowFailure=false & a contract method fails', async () => {\n  await expect(\n    readContracts(config, {\n      allowFailure: false,\n      contracts: [\n        ...contracts,\n        {\n          abi: abi.mloot,\n          address: address.mloot,\n          functionName: 'tokenOfOwnerByIndex',\n          args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', 69420n],\n        },\n      ],\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(\n    `\n    [ContractFunctionExecutionError: The contract function \"tokenOfOwnerByIndex\" reverted with the following reason:\n    ERC721Enumerable: owner index out of bounds\n\n    Contract Call:\n      address:   0x1dfe7ca09e99d10835bf73044a23b73fc20623df\n      function:  tokenOfOwnerByIndex(address owner, uint256 index)\n      args:                         (0xA0Cf798816D4b9b9866b5330EEa46a18382f251e, 69420)\n\n    Docs: https://viem.sh/docs/contract/readContract\n    Details: execution reverted: ERC721Enumerable: owner index out of bounds\n    Version: viem@2.47.5]\n  `,\n  )\n})\n\ntest('allowFailure=true & a contract method fails', async () => {\n  expect(\n    await readContracts(config, {\n      allowFailure: true,\n      contracts: [\n        ...contracts,\n        {\n          abi: abi.mloot,\n          address: address.mloot,\n          functionName: 'tokenOfOwnerByIndex',\n          args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', 69420n],\n        },\n        {\n          abi: abi.mloot,\n          address: address.mloot,\n          functionName: 'tokenOfOwnerByIndex',\n          args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', 69421n],\n        },\n      ],\n    }),\n  ).toMatchInlineSnapshot(`\n    [\n      {\n        \"result\": 2n,\n        \"status\": \"success\",\n      },\n      {\n        \"result\": 1n,\n        \"status\": \"success\",\n      },\n      {\n        \"result\": false,\n        \"status\": \"success\",\n      },\n      {\n        \"result\": 370395n,\n        \"status\": \"success\",\n      },\n      {\n        \"error\": [ContractFunctionExecutionError: The contract function \"tokenOfOwnerByIndex\" reverted with the following reason:\n    ERC721Enumerable: owner index out of bounds\n\n    Contract Call:\n      address:   0x1dfe7ca09e99d10835bf73044a23b73fc20623df\n      function:  tokenOfOwnerByIndex(address owner, uint256 index)\n      args:                         (0xA0Cf798816D4b9b9866b5330EEa46a18382f251e, 69420)\n\n    Docs: https://viem.sh/docs/contract/readContract\n    Details: execution reverted: ERC721Enumerable: owner index out of bounds\n    Version: viem@2.47.5],\n        \"result\": undefined,\n        \"status\": \"failure\",\n      },\n      {\n        \"error\": [ContractFunctionExecutionError: The contract function \"tokenOfOwnerByIndex\" reverted with the following reason:\n    ERC721Enumerable: owner index out of bounds\n\n    Contract Call:\n      address:   0x1dfe7ca09e99d10835bf73044a23b73fc20623df\n      function:  tokenOfOwnerByIndex(address owner, uint256 index)\n      args:                         (0xA0Cf798816D4b9b9866b5330EEa46a18382f251e, 69421)\n\n    Docs: https://viem.sh/docs/contract/readContract\n    Details: execution reverted: ERC721Enumerable: owner index out of bounds\n    Version: viem@2.47.5],\n        \"result\": undefined,\n        \"status\": \"failure\",\n      },\n    ]\n  `)\n})\n\ntest('throws if allowFailure=false & encoding contract function data fails', async () => {\n  await expect(\n    readContracts(config, {\n      allowFailure: false,\n      contracts: [\n        ...contracts,\n        {\n          abi: abi.mloot,\n          functionName: 'ownerOf',\n          // address is not the mloot contract\n          address: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n          args: [10e30],\n        },\n      ],\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(\n    `\n    [ContractFunctionExecutionError: The contract function \"ownerOf\" returned no data (\"0x\").\n\n    This could be due to any of the following:\n      - The contract does not have the function \"ownerOf\",\n      - The parameters passed to the contract function may be invalid, or\n      - The address is not a contract.\n     \n    Contract Call:\n      address:   0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC\n      function:  ownerOf(uint256 tokenId)\n      args:             (1e+31)\n\n    Docs: https://viem.sh/docs/contract/readContract\n    Version: viem@2.47.5]\n  `,\n  )\n})\n\ntest('allowFailure=true & encoding contract function data fails', async () => {\n  expect(\n    await readContracts(config, {\n      allowFailure: true,\n      contracts: [\n        ...contracts,\n        {\n          abi: abi.mloot,\n          functionName: 'ownerOf',\n          // address is not the mloot contract\n          address: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n          args: [10e30],\n        },\n        {\n          abi: abi.mloot,\n          functionName: 'ownerOf',\n          // address is not the mloot contract\n          address: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n          args: [10e30],\n        },\n      ],\n    }),\n  ).toMatchInlineSnapshot(`\n    [\n      {\n        \"result\": 2n,\n        \"status\": \"success\",\n      },\n      {\n        \"result\": 1n,\n        \"status\": \"success\",\n      },\n      {\n        \"result\": false,\n        \"status\": \"success\",\n      },\n      {\n        \"result\": 370395n,\n        \"status\": \"success\",\n      },\n      {\n        \"error\": [ContractFunctionExecutionError: The contract function \"ownerOf\" returned no data (\"0x\").\n\n    This could be due to any of the following:\n      - The contract does not have the function \"ownerOf\",\n      - The parameters passed to the contract function may be invalid, or\n      - The address is not a contract.\n     \n    Contract Call:\n      address:   0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC\n      function:  ownerOf(uint256 tokenId)\n      args:             (1e+31)\n\n    Docs: https://viem.sh/docs/contract/readContract\n    Version: viem@2.47.5],\n        \"result\": undefined,\n        \"status\": \"failure\",\n      },\n      {\n        \"error\": [ContractFunctionExecutionError: The contract function \"ownerOf\" returned no data (\"0x\").\n\n    This could be due to any of the following:\n      - The contract does not have the function \"ownerOf\",\n      - The parameters passed to the contract function may be invalid, or\n      - The address is not a contract.\n     \n    Contract Call:\n      address:   0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC\n      function:  ownerOf(uint256 tokenId)\n      args:             (1e+31)\n\n    Docs: https://viem.sh/docs/contract/readContract\n    Version: viem@2.47.5],\n        \"result\": undefined,\n        \"status\": \"failure\",\n      },\n    ]\n  `)\n})\n\ntest('should throw if allowFailure=false & a contract has no response', async () => {\n  await expect(\n    readContracts(config, {\n      allowFailure: false,\n      contracts: [\n        ...contracts,\n        {\n          abi: abi.wagmigotchi,\n          functionName: 'love',\n          // address is not the wagmigotchi contract\n          address: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n          args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n        },\n      ],\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(\n    `\n    [ContractFunctionExecutionError: The contract function \"love\" returned no data (\"0x\").\n\n    This could be due to any of the following:\n      - The contract does not have the function \"love\",\n      - The parameters passed to the contract function may be invalid, or\n      - The address is not a contract.\n     \n    Contract Call:\n      address:   0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC\n      function:  love(address)\n      args:          (0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC)\n\n    Docs: https://viem.sh/docs/contract/readContract\n    Version: viem@2.47.5]\n  `,\n  )\n})\n\ntest('allowFailure=true & a contract has no response', async () => {\n  expect(\n    await readContracts(config, {\n      allowFailure: true,\n      contracts: [\n        ...contracts,\n        {\n          abi: abi.wagmigotchi,\n          functionName: 'love',\n          // address is not the wagmigotchi contract\n          address: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n          args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n        },\n      ],\n    }),\n  ).toMatchInlineSnapshot(`\n    [\n      {\n        \"result\": 2n,\n        \"status\": \"success\",\n      },\n      {\n        \"result\": 1n,\n        \"status\": \"success\",\n      },\n      {\n        \"result\": false,\n        \"status\": \"success\",\n      },\n      {\n        \"result\": 370395n,\n        \"status\": \"success\",\n      },\n      {\n        \"error\": [ContractFunctionExecutionError: The contract function \"love\" returned no data (\"0x\").\n\n    This could be due to any of the following:\n      - The contract does not have the function \"love\",\n      - The parameters passed to the contract function may be invalid, or\n      - The address is not a contract.\n     \n    Contract Call:\n      address:   0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC\n      function:  love(address)\n      args:          (0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC)\n\n    Docs: https://viem.sh/docs/contract/readContract\n    Version: viem@2.47.5],\n        \"result\": undefined,\n        \"status\": \"failure\",\n      },\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/actions/readContracts.ts",
    "content": "import type {\n  ContractFunctionParameters,\n  MulticallParameters as viem_MulticallParameters,\n  MulticallReturnType as viem_MulticallReturnType,\n} from 'viem'\nimport { ContractFunctionExecutionError } from 'viem'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport { type MulticallErrorType, multicall } from './multicall.js'\nimport { type ReadContractErrorType, readContract } from './readContract.js'\n\nexport type ReadContractsParameters<\n  contracts extends readonly unknown[] = readonly ContractFunctionParameters[],\n  allowFailure extends boolean = true,\n  config extends Config = Config,\n> = viem_MulticallParameters<\n  contracts,\n  allowFailure,\n  { properties: ChainIdParameter<config> }\n>\n\nexport type ReadContractsReturnType<\n  contracts extends readonly unknown[] = readonly ContractFunctionParameters[],\n  allowFailure extends boolean = true,\n> = viem_MulticallReturnType<contracts, allowFailure>\n\nexport type ReadContractsErrorType = MulticallErrorType | ReadContractErrorType\n\nexport async function readContracts<\n  config extends Config,\n  const contracts extends readonly ContractFunctionParameters[],\n  allowFailure extends boolean = true,\n>(\n  config: config,\n  parameters: ReadContractsParameters<contracts, allowFailure, config>,\n): Promise<ReadContractsReturnType<contracts, allowFailure>> {\n  const { allowFailure = true, blockNumber, blockTag, ...rest } = parameters\n  const contracts = parameters.contracts as (ContractFunctionParameters & {\n    chainId?: number | undefined\n  })[]\n\n  try {\n    const contractsByChainId: {\n      [chainId: number]: {\n        contract: ContractFunctionParameters\n        index: number\n      }[]\n    } = {}\n    for (const [index, contract] of contracts.entries()) {\n      const chainId = contract.chainId ?? config.state.chainId\n      if (!contractsByChainId[chainId]) contractsByChainId[chainId] = []\n      contractsByChainId[chainId]?.push({ contract, index })\n    }\n    const promises = () =>\n      Object.entries(contractsByChainId).map(([chainId, contracts]) =>\n        multicall(config, {\n          ...rest,\n          allowFailure,\n          blockNumber,\n          blockTag,\n          chainId: Number.parseInt(chainId, 10),\n          contracts: contracts.map(({ contract }) => contract),\n        }),\n      )\n\n    const multicallResults = (await Promise.all(promises())).flat()\n    // Reorder the contract results back to the order they were\n    // provided in.\n    const resultIndexes = Object.values(contractsByChainId).flatMap(\n      (contracts) => contracts.map(({ index }) => index),\n    )\n    return multicallResults.reduce((results, result, index) => {\n      if (results) (results as unknown[])[resultIndexes[index]!] = result\n      return results\n    }, [] as unknown[]) as ReadContractsReturnType<contracts, allowFailure>\n  } catch (error) {\n    if (error instanceof ContractFunctionExecutionError) throw error\n\n    const promises = () =>\n      contracts.map((contract) =>\n        readContract(config, { ...contract, blockNumber, blockTag }),\n      )\n    if (allowFailure)\n      return (await Promise.allSettled(promises())).map((result) => {\n        if (result.status === 'fulfilled')\n          return { result: result.value, status: 'success' }\n        return { error: result.reason, result: undefined, status: 'failure' }\n      }) as ReadContractsReturnType<contracts, allowFailure>\n\n    return (await Promise.all(promises())) as ReadContractsReturnType<\n      contracts,\n      allowFailure\n    >\n  }\n}\n"
  },
  {
    "path": "packages/core/src/actions/reconnect.test.ts",
    "content": "import { accounts, config, mainnet } from '@wagmi/test'\nimport { http } from 'viem'\nimport { afterEach, expect, test, vi } from 'vitest'\n\nimport { mock } from '../connectors/mock.js'\nimport { createConfig } from '../createConfig.js'\nimport { createStorage } from '../createStorage.js'\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { reconnect } from './reconnect.js'\n\nconst connector = config._internal.connectors.setup(\n  mock({\n    accounts,\n    features: { reconnect: true },\n  }),\n)\n\nafterEach(async () => {\n  if (config.state.current === connector.uid)\n    await disconnect(config, { connector })\n  else if (config.state.current) await disconnect(config)\n})\n\ntest('default', async () => {\n  await expect(\n    reconnect(config, { connectors: [connector] }),\n  ).resolves.toStrictEqual([])\n  expect(config.state.status).toEqual('disconnected')\n})\n\ntest('parameters: connectors (Connector)', async () => {\n  await connect(config, { connector })\n  await expect(\n    reconnect(config, { connectors: [connector] }),\n  ).resolves.toMatchObject(\n    expect.arrayContaining([\n      expect.objectContaining({\n        accounts: expect.any(Array),\n        chainId: expect.any(Number),\n      }),\n    ]),\n  )\n  expect(config.state.status).toEqual('connected')\n})\n\ntest('parameters: connectors (CreateConnectorFn)', async () => {\n  const connector = mock({\n    accounts,\n    features: { reconnect: true },\n  })\n  await connect(config, { connector })\n  await expect(\n    reconnect(config, { connectors: [connector] }),\n  ).resolves.toMatchObject(\n    expect.arrayContaining([\n      expect.objectContaining({\n        accounts: expect.any(Array),\n        chainId: expect.any(Number),\n      }),\n    ]),\n  )\n  expect(config.state.status).toEqual('connected')\n})\n\ntest(\"behavior: doesn't reconnect if already reconnecting\", async () => {\n  const previousStatus = config.state.status\n  config.setState((x) => ({ ...x, status: 'reconnecting' }))\n  await expect(\n    reconnect(config, { connectors: [connector] }),\n  ).resolves.toStrictEqual([])\n  config.setState((x) => ({ ...x, status: previousStatus }))\n})\n\ntest('behavior: recovers from invalid state', async () => {\n  const state = {\n    'wagmi.store': JSON.stringify({\n      state: {\n        status: 'connected', // <-- invalid - `status` should not be kept in storage\n        chainId: 1,\n        current: '983b8aca245',\n      },\n      version: Number.NaN, // mocked version is `'x.y.z'`, which will get interpreted as `NaN`\n    }),\n  } as Record<string, string>\n  Object.defineProperty(window, 'localStorage', {\n    value: {\n      getItem: vi.fn((key) => state[key] ?? null),\n      removeItem: vi.fn((key) => state.delete?.[key]),\n      setItem: vi.fn((key, value) => {\n        state[key] = value\n      }),\n    },\n    writable: true,\n  })\n\n  const storage = createStorage<{ store: object }>({\n    storage: window.localStorage,\n  })\n\n  const config = createConfig({\n    chains: [mainnet],\n    storage,\n    transports: {\n      [mainnet.id]: http(),\n    },\n  })\n\n  await reconnect(config, { connectors: [connector] })\n\n  expect(config.state).toMatchInlineSnapshot(`\n    {\n      \"chainId\": 1,\n      \"connections\": Map {},\n      \"current\": null,\n      \"status\": \"disconnected\",\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/actions/reconnect.ts",
    "content": "import type { Address } from 'viem'\n\nimport type { CreateConnectorFn } from '../connectors/createConnector.js'\nimport type { Config, Connection, Connector } from '../createConfig.js'\nimport type { ErrorType } from '../errors/base.js'\nimport type { Compute } from '../types/utils.js'\n\nexport type ReconnectParameters = {\n  /** Connectors to attempt reconnect with */\n  connectors?: readonly (CreateConnectorFn | Connector)[] | undefined\n}\n\nexport type ReconnectReturnType = Compute<Connection>[]\n\nexport type ReconnectErrorType = ErrorType\n\nlet isReconnecting = false\n\n/** https://wagmi.sh/core/api/actions/reconnect */\nexport async function reconnect(\n  config: Config,\n  parameters: ReconnectParameters = {},\n): Promise<ReconnectReturnType> {\n  // If already reconnecting, do nothing\n  if (isReconnecting) return []\n  isReconnecting = true\n\n  config.setState((x) => ({\n    ...x,\n    status: x.current ? 'reconnecting' : 'connecting',\n  }))\n\n  const connectors: Connector[] = []\n  if (parameters.connectors?.length) {\n    for (const connector_ of parameters.connectors) {\n      let connector: Connector\n      // \"Register\" connector if not already created\n      if (typeof connector_ === 'function')\n        connector = config._internal.connectors.setup(connector_)\n      else connector = connector_\n      connectors.push(connector)\n    }\n  } else connectors.push(...config.connectors)\n\n  // Try recently-used connectors first\n  let recentConnectorId: string | null | undefined\n  try {\n    recentConnectorId = await config.storage?.getItem('recentConnectorId')\n  } catch {}\n  const scores: Record<string, number> = {}\n  for (const [, connection] of config.state.connections) {\n    scores[connection.connector.id] = 1\n  }\n  if (recentConnectorId) scores[recentConnectorId] = 0\n  const sorted =\n    Object.keys(scores).length > 0\n      ? // .toSorted()\n        [...connectors].sort(\n          (a, b) => (scores[a.id] ?? 10) - (scores[b.id] ?? 10),\n        )\n      : connectors\n\n  // Iterate through each connector and try to connect\n  let connected = false\n  const connections: Connection[] = []\n  const providers: unknown[] = []\n  for (const connector of sorted) {\n    const provider = await connector.getProvider().catch(() => undefined)\n    if (!provider) continue\n\n    // If we already have an instance of this connector's provider,\n    // then we have already checked it (ie. injected connectors can\n    // share the same `window.ethereum` instance, so we don't want to\n    // connect to it again).\n    if (providers.some((x) => x === provider)) continue\n\n    const isAuthorized = await connector.isAuthorized()\n    if (!isAuthorized) continue\n\n    const data = await connector\n      .connect({ isReconnecting: true })\n      .catch(() => null)\n    if (!data) continue\n\n    connector.emitter.off('connect', config._internal.events.connect)\n    connector.emitter.on('change', config._internal.events.change)\n    connector.emitter.on('disconnect', config._internal.events.disconnect)\n\n    config.setState((x) => {\n      const connections = new Map(connected ? x.connections : new Map()).set(\n        connector.uid,\n        { accounts: data.accounts, chainId: data.chainId, connector },\n      )\n      return {\n        ...x,\n        current: connected ? x.current : connector.uid,\n        connections,\n      }\n    })\n    connections.push({\n      accounts: data.accounts as readonly [Address, ...Address[]],\n      chainId: data.chainId,\n      connector,\n    })\n    providers.push(provider)\n    connected = true\n  }\n\n  // Prevent overwriting connected status from race condition\n  if (\n    config.state.status === 'reconnecting' ||\n    config.state.status === 'connecting'\n  ) {\n    // If connecting didn't succeed, set to disconnected\n    if (!connected)\n      config.setState((x) => ({\n        ...x,\n        connections: new Map(),\n        current: null,\n        status: 'disconnected',\n      }))\n    else config.setState((x) => ({ ...x, status: 'connected' }))\n  }\n\n  isReconnecting = false\n  return connections\n}\n"
  },
  {
    "path": "packages/core/src/actions/sendCalls.test.ts",
    "content": "import { accounts, config } from '@wagmi/test'\nimport { parseEther } from 'viem'\nimport { expect, test } from 'vitest'\n\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { sendCalls } from './sendCalls.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n  await expect(\n    sendCalls(config, {\n      calls: [\n        {\n          data: '0xdeadbeef',\n          to: accounts[1],\n          value: parseEther('1'),\n        },\n        {\n          to: accounts[2],\n          value: parseEther('2'),\n        },\n        {\n          to: accounts[3],\n          value: parseEther('3'),\n        },\n      ],\n    }),\n  ).resolves.toMatchInlineSnapshot(\n    `\n    {\n      \"id\": \"0xb24b52a86aa2b0bae6f1e44868c3a13d2572e766a1f6364afd93d1757839b8a1\",\n    }\n  `,\n  )\n  await disconnect(config, { connector })\n})\n\ntest('behavior: not connected', async () => {\n  await expect(\n    sendCalls(config, {\n      calls: [\n        {\n          to: accounts[1],\n          value: parseEther('1'),\n        },\n        {\n          to: accounts[2],\n          value: parseEther('2'),\n        },\n        {\n          to: accounts[3],\n          value: parseEther('3'),\n        },\n      ],\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [ConnectorNotConnectedError: Connector not connected.\n\n    Version: @wagmi/core@x.y.z]\n  `)\n})\n\ntest('behavior: nullish account (account filled by wallet)', async () => {\n  await expect(\n    sendCalls(config, {\n      account: null,\n      connector,\n      calls: [\n        {\n          to: accounts[1],\n          value: parseEther('1'),\n        },\n        {\n          to: accounts[2],\n          value: parseEther('2'),\n        },\n        {\n          to: accounts[3],\n          value: parseEther('3'),\n        },\n      ],\n    }),\n  ).resolves.toMatchInlineSnapshot(\n    `\n    {\n      \"id\": \"0x0a8b20024fae14dd9e854accfc8496b9d18c291206647c842a96a954133401f3\",\n    }\n  `,\n  )\n})\n\ntest('behavior: account does not exist on connector', async () => {\n  await connect(config, { connector })\n  await expect(\n    sendCalls(config, {\n      account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      calls: [\n        {\n          to: accounts[1],\n          value: parseEther('1'),\n        },\n        {\n          to: accounts[2],\n          value: parseEther('2'),\n        },\n        {\n          to: accounts[3],\n          value: parseEther('3'),\n        },\n      ],\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [ConnectorAccountNotFoundError: Account \"0xA0Cf798816D4b9b9866b5330EEa46a18382f251e\" not found for connector \"Mock Connector\".\n\n    Version: @wagmi/core@x.y.z]\n  `)\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/core/src/actions/sendCalls.ts",
    "content": "import type { Account, Chain } from 'viem'\nimport {\n  type SendCallsErrorType as viem_SendCallsErrorType,\n  type SendCallsParameters as viem_SendCallsParameters,\n  type SendCallsReturnType as viem_SendCallsReturnType,\n  sendCalls as viem_sendCalls,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { BaseErrorType, ErrorType } from '../errors/base.js'\nimport type { SelectChains } from '../types/chain.js'\nimport type {\n  ChainIdParameter,\n  ConnectorParameter,\n} from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\nimport {\n  type GetConnectorClientErrorType,\n  getConnectorClient,\n} from './getConnectorClient.js'\n\nexport type SendCallsParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  calls extends readonly unknown[] = readonly unknown[],\n  ///\n  chains extends readonly Chain[] = SelectChains<config, chainId>,\n> = {\n  [key in keyof chains]: Compute<\n    Omit<\n      viem_SendCallsParameters<chains[key], Account, chains[key], calls>,\n      'chain'\n    > &\n      ChainIdParameter<config, chainId> &\n      ConnectorParameter\n  >\n}[number]\n\nexport type SendCallsReturnType = viem_SendCallsReturnType\n\nexport type SendCallsErrorType =\n  // getConnectorClient()\n  | GetConnectorClientErrorType\n  // base\n  | BaseErrorType\n  | ErrorType\n  // viem\n  | viem_SendCallsErrorType\n\n/** https://wagmi.sh/core/api/actions/sendCalls */\nexport async function sendCalls<\n  const calls extends readonly unknown[],\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n>(\n  config: config,\n  parameters: SendCallsParameters<config, chainId, calls>,\n): Promise<SendCallsReturnType> {\n  const { account, chainId, connector, calls, ...rest } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  const action = getAction(client, viem_sendCalls, 'sendCalls')\n  return action({\n    ...(rest as any),\n    ...(typeof account !== 'undefined' ? { account } : {}),\n    calls,\n    chain: chainId ? { id: chainId } : undefined,\n  })\n}\n"
  },
  {
    "path": "packages/core/src/actions/sendCallsSync.test.ts",
    "content": "import { accounts, config, testClient, wait } from '@wagmi/test'\nimport { parseEther } from 'viem'\nimport { beforeEach, expect, test } from 'vitest'\n\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { sendCallsSync } from './sendCallsSync.js'\n\nconst connector = config.connectors[0]!\n\nbeforeEach(async () => {\n  await disconnect(config).catch(() => {})\n})\n\ntest('default', async () => {\n  await connect(config, { connector })\n  const [status] = await Promise.all([\n    sendCallsSync(config, {\n      calls: [\n        {\n          data: '0xdeadbeef',\n          to: accounts[1],\n          value: parseEther('1'),\n        },\n        {\n          to: accounts[2],\n          value: parseEther('2'),\n        },\n        {\n          to: accounts[3],\n          value: parseEther('3'),\n        },\n      ],\n    }),\n    (async () => {\n      await wait(3000)\n      await testClient.mainnet.mine({ blocks: 1 })\n    })(),\n  ])\n  expect(status).toBeDefined()\n  await disconnect(config, { connector })\n})\n\ntest('behavior: not connected', async () => {\n  await expect(\n    sendCallsSync(config, {\n      calls: [\n        {\n          to: accounts[1],\n          value: parseEther('1'),\n        },\n        {\n          to: accounts[2],\n          value: parseEther('2'),\n        },\n        {\n          to: accounts[3],\n          value: parseEther('3'),\n        },\n      ],\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [ConnectorNotConnectedError: Connector not connected.\n\n    Version: @wagmi/core@x.y.z]\n  `)\n})\n\ntest('behavior: account does not exist on connector', async () => {\n  await connect(config, { connector })\n  await expect(\n    sendCallsSync(config, {\n      account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      calls: [\n        {\n          to: accounts[1],\n          value: parseEther('1'),\n        },\n        {\n          to: accounts[2],\n          value: parseEther('2'),\n        },\n        {\n          to: accounts[3],\n          value: parseEther('3'),\n        },\n      ],\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [ConnectorAccountNotFoundError: Account \"0xA0Cf798816D4b9b9866b5330EEa46a18382f251e\" not found for connector \"Mock Connector\".\n\n    Version: @wagmi/core@x.y.z]\n  `)\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/core/src/actions/sendCallsSync.ts",
    "content": "import type { Account, Chain } from 'viem'\nimport {\n  type SendCallsSyncErrorType as viem_SendCallsSyncErrorType,\n  type SendCallsSyncParameters as viem_SendCallsSyncParameters,\n  type SendCallsSyncReturnType as viem_SendCallsSyncReturnType,\n  sendCallsSync as viem_sendCallsSync,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { BaseErrorType, ErrorType } from '../errors/base.js'\nimport type { SelectChains } from '../types/chain.js'\nimport type {\n  ChainIdParameter,\n  ConnectorParameter,\n} from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\nimport {\n  type GetConnectorClientErrorType,\n  getConnectorClient,\n} from './getConnectorClient.js'\n\nexport type SendCallsSyncParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  calls extends readonly unknown[] = readonly unknown[],\n  ///\n  chains extends readonly Chain[] = SelectChains<config, chainId>,\n> = {\n  [key in keyof chains]: Compute<\n    Omit<\n      viem_SendCallsSyncParameters<chains[key], Account, chains[key], calls>,\n      'chain'\n    > &\n      ChainIdParameter<config, chainId> &\n      ConnectorParameter\n  >\n}[number]\n\nexport type SendCallsSyncReturnType = viem_SendCallsSyncReturnType\n\nexport type SendCallsSyncErrorType =\n  // getConnectorClient()\n  | GetConnectorClientErrorType\n  // base\n  | BaseErrorType\n  | ErrorType\n  // viem\n  | viem_SendCallsSyncErrorType\n\n/** https://wagmi.sh/core/api/actions/sendCallsSync */\nexport async function sendCallsSync<\n  const calls extends readonly unknown[],\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n>(\n  config: config,\n  parameters: SendCallsSyncParameters<config, chainId, calls>,\n): Promise<SendCallsSyncReturnType> {\n  const { account, chainId, connector, calls, ...rest } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  const action = getAction(client, viem_sendCallsSync, 'sendCallsSync')\n  return action({\n    ...(rest as any),\n    ...(typeof account !== 'undefined' ? { account } : {}),\n    calls,\n    chain: chainId ? { id: chainId } : undefined,\n  })\n}\n"
  },
  {
    "path": "packages/core/src/actions/sendTransaction.test-d.ts",
    "content": "import { http, parseEther } from 'viem'\nimport { celo, mainnet } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { createConfig } from '../createConfig.js'\nimport {\n  type SendTransactionParameters,\n  sendTransaction,\n} from './sendTransaction.js'\n\ntest('chain formatters', () => {\n  const config = createConfig({\n    chains: [mainnet, celo],\n    transports: { [celo.id]: http(), [mainnet.id]: http() },\n  })\n\n  type Result = SendTransactionParameters<typeof config>\n  expectTypeOf<Result>().toMatchTypeOf<{\n    chainId?: typeof celo.id | typeof mainnet.id | undefined\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  sendTransaction(config, {\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n    feeCurrency: '0x',\n  })\n\n  type Result2 = SendTransactionParameters<typeof config, typeof celo.id>\n  expectTypeOf<Result2>().toMatchTypeOf<{\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  sendTransaction(config, {\n    chainId: celo.id,\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n    feeCurrency: '0x',\n  })\n\n  type Result3 = SendTransactionParameters<typeof config, typeof mainnet.id>\n  expectTypeOf<Result3>().not.toMatchTypeOf<{\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  sendTransaction(config, {\n    chainId: mainnet.id,\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n})\n"
  },
  {
    "path": "packages/core/src/actions/sendTransaction.test.ts",
    "content": "import { config, privateKey, transactionHashRegex } from '@wagmi/test'\nimport { parseEther } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { beforeEach, expect, test } from 'vitest'\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { sendTransaction } from './sendTransaction.js'\n\nconst connector = config.connectors[0]!\n\nbeforeEach(async () => {\n  if (config.state.current === connector.uid)\n    await disconnect(config, { connector })\n})\n\ntest('default', async () => {\n  const result = await connect(config, { connector })\n  config.state.connections.set(connector.uid, {\n    ...result,\n    // Switch up the current account because the default one is running out of funds somewhere\n    accounts: result.accounts.slice(1) as unknown as typeof result.accounts,\n    connector,\n  })\n  await expect(\n    sendTransaction(config, {\n      to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      value: parseEther('0.0001'),\n    }),\n  ).resolves.toMatch(transactionHashRegex)\n  await disconnect(config, { connector })\n})\n\ntest('behavior: connector not connected', async () => {\n  await connect(config, { connector })\n  await expect(\n    sendTransaction(config, {\n      connector: config.connectors[1],\n      to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      value: parseEther('0.0001'),\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [ConnectorNotConnectedError: Connector not connected.\n\n    Version: @wagmi/core@x.y.z]\n  `)\n  await disconnect(config, { connector })\n})\n\ntest('behavior: account does not exist on connector', async () => {\n  await connect(config, { connector })\n  await expect(\n    sendTransaction(config, {\n      account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      value: parseEther('0.0001'),\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [ConnectorAccountNotFoundError: Account \"0xA0Cf798816D4b9b9866b5330EEa46a18382f251e\" not found for connector \"Mock Connector\".\n\n    Version: @wagmi/core@x.y.z]\n  `)\n  await disconnect(config, { connector })\n})\n\ntest('behavior: value exceeds balance', async () => {\n  await connect(config, { connector })\n  await expect(\n    sendTransaction(config, {\n      to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      value: parseEther('99999'),\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [TransactionExecutionError: The total cost (gas * gas fee + value) of executing this transaction exceeds the balance of the account.\n\n    This error could arise when the account does not have enough funds to:\n     - pay for the total gas fee,\n     - pay for the value to send.\n     \n    The cost of the transaction is calculated as \\`gas * gas fee + value\\`, where:\n     - \\`gas\\` is the amount of gas needed for transaction to execute,\n     - \\`gas fee\\` is the gas fee,\n     - \\`value\\` is the amount of ether to send to the recipient.\n     \n    Request Arguments:\n      chain:  Ethereum (id: 1)\n      from:   0x95132632579b073D12a6673e18Ab05777a6B86f8\n      to:     0xd2135CfB216b74109775236E36d4b433F1DF507B\n      value:  99999 ETH\n\n    Details: Insufficient funds for gas * price + value\n    Version: viem@2.47.5]\n  `)\n  await disconnect(config, { connector })\n})\n\ntest('behavior: local account', async () => {\n  const account = privateKeyToAccount(privateKey)\n  await expect(\n    sendTransaction(config, {\n      account,\n      to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      value: parseEther('0.000001'),\n    }),\n  ).resolves.toMatch(transactionHashRegex)\n})\n"
  },
  {
    "path": "packages/core/src/actions/sendTransaction.ts",
    "content": "import type {\n  Account,\n  Chain,\n  Client,\n  TransactionRequest,\n  SendTransactionErrorType as viem_SendTransactionErrorType,\n  SendTransactionParameters as viem_SendTransactionParameters,\n  SendTransactionReturnType as viem_SendTransactionReturnType,\n} from 'viem'\nimport { sendTransaction as viem_sendTransaction } from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { BaseErrorType, ErrorType } from '../errors/base.js'\nimport type { SelectChains } from '../types/chain.js'\nimport type {\n  ChainIdParameter,\n  ConnectorParameter,\n} from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\nimport {\n  type GetConnectorClientErrorType,\n  getConnectorClient,\n} from './getConnectorClient.js'\n\nexport type SendTransactionParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  ///\n  chains extends readonly Chain[] = SelectChains<config, chainId>,\n> = {\n  [key in keyof chains]: Compute<\n    Omit<\n      viem_SendTransactionParameters<chains[key], Account, chains[key]>,\n      'chain' | 'gas'\n    > &\n      ChainIdParameter<config, chainId> &\n      ConnectorParameter\n  >\n}[number] & {\n  /** Gas provided for transaction execution. */\n  gas?: TransactionRequest['gas'] | null\n}\n\nexport type SendTransactionReturnType = viem_SendTransactionReturnType\n\nexport type SendTransactionErrorType =\n  // getConnectorClient()\n  | GetConnectorClientErrorType\n  // base\n  | BaseErrorType\n  | ErrorType\n  // viem\n  | viem_SendTransactionErrorType\n\n/** https://wagmi.sh/core/api/actions/sendTransaction */\nexport async function sendTransaction<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n>(\n  config: config,\n  parameters: SendTransactionParameters<config, chainId>,\n): Promise<SendTransactionReturnType> {\n  const { account, chainId, connector, ...rest } = parameters\n\n  let client: Client\n  if (typeof account === 'object' && account?.type === 'local')\n    client = config.getClient({ chainId })\n  else\n    client = await getConnectorClient(config, {\n      account: account ?? undefined,\n      assertChainId: false,\n      chainId,\n      connector,\n    })\n\n  const chain = (() => {\n    if (!chainId || client.chain?.id === chainId) return client.chain\n    return { id: chainId }\n  })()\n\n  const action = getAction(client, viem_sendTransaction, 'sendTransaction')\n  const hash = await action({\n    ...(rest as any),\n    ...(account ? { account } : {}),\n    assertChainId: !!chainId,\n    chain,\n    gas: rest.gas ?? undefined,\n  })\n\n  return hash\n}\n"
  },
  {
    "path": "packages/core/src/actions/sendTransactionSync.test.ts",
    "content": "import { config, testClient, wait } from '@wagmi/test'\nimport { parseEther } from 'viem'\nimport { beforeEach, expect, test } from 'vitest'\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { sendTransactionSync } from './sendTransactionSync.js'\n\nconst connector = config.connectors[0]!\n\nbeforeEach(async () => {\n  if (config.state.current === connector.uid)\n    await disconnect(config, { connector })\n})\n\ntest('default', async () => {\n  const result = await connect(config, { connector })\n  config.state.connections.set(connector.uid, {\n    ...result,\n    // Switch up the current account because the default one is running out of funds somewhere\n    accounts: result.accounts.slice(1) as unknown as typeof result.accounts,\n    connector,\n  })\n  const [receipt] = await Promise.all([\n    sendTransactionSync(config, {\n      to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      value: parseEther('0.0001'),\n    }),\n    (async () => {\n      await wait(3000)\n      await testClient.mainnet.mine({ blocks: 1 })\n    })(),\n  ])\n  expect(receipt).toBeDefined()\n  await disconnect(config, { connector })\n})\n\ntest('behavior: connector not connected', async () => {\n  await connect(config, { connector })\n  await expect(\n    sendTransactionSync(config, {\n      connector: config.connectors[1],\n      to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      value: parseEther('0.0001'),\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [ConnectorNotConnectedError: Connector not connected.\n\n    Version: @wagmi/core@x.y.z]\n  `)\n  await disconnect(config, { connector })\n})\n\ntest('behavior: account does not exist on connector', async () => {\n  await connect(config, { connector })\n  await expect(\n    sendTransactionSync(config, {\n      account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      value: parseEther('0.0001'),\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [ConnectorAccountNotFoundError: Account \"0xA0Cf798816D4b9b9866b5330EEa46a18382f251e\" not found for connector \"Mock Connector\".\n\n    Version: @wagmi/core@x.y.z]\n  `)\n  await disconnect(config, { connector })\n})\n\ntest('behavior: value exceeds balance', async () => {\n  await connect(config, { connector })\n  await expect(\n    sendTransactionSync(config, {\n      to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      value: parseEther('99999'),\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [TransactionExecutionError: The total cost (gas * gas fee + value) of executing this transaction exceeds the balance of the account.\n\n    This error could arise when the account does not have enough funds to:\n     - pay for the total gas fee,\n     - pay for the value to send.\n     \n    The cost of the transaction is calculated as \\`gas * gas fee + value\\`, where:\n     - \\`gas\\` is the amount of gas needed for transaction to execute,\n     - \\`gas fee\\` is the gas fee,\n     - \\`value\\` is the amount of ether to send to the recipient.\n     \n    Request Arguments:\n      chain:  Ethereum (id: 1)\n      from:   0x95132632579b073D12a6673e18Ab05777a6B86f8\n      to:     0xd2135CfB216b74109775236E36d4b433F1DF507B\n      value:  99999 ETH\n\n    Details: Insufficient funds for gas * price + value\n    Version: viem@2.47.5]\n  `)\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/core/src/actions/sendTransactionSync.ts",
    "content": "import type {\n  Account,\n  Chain,\n  Client,\n  TransactionRequest,\n  SendTransactionSyncErrorType as viem_SendTransactionSyncErrorType,\n  SendTransactionSyncParameters as viem_SendTransactionSyncParameters,\n  SendTransactionSyncReturnType as viem_SendTransactionSyncReturnType,\n} from 'viem'\nimport { sendTransactionSync as viem_sendTransactionSync } from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { BaseErrorType, ErrorType } from '../errors/base.js'\nimport type { SelectChains } from '../types/chain.js'\nimport type {\n  ChainIdParameter,\n  ConnectorParameter,\n} from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\nimport {\n  type GetConnectorClientErrorType,\n  getConnectorClient,\n} from './getConnectorClient.js'\n\nexport type SendTransactionSyncParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  ///\n  chains extends readonly Chain[] = SelectChains<config, chainId>,\n> = {\n  [key in keyof chains]: Compute<\n    Omit<\n      viem_SendTransactionSyncParameters<chains[key], Account, chains[key]>,\n      'chain' | 'gas'\n    > &\n      ChainIdParameter<config, chainId> &\n      ConnectorParameter\n  >\n}[number] & {\n  /** Gas provided for transaction execution. */\n  gas?: TransactionRequest['gas'] | null\n}\n\nexport type SendTransactionSyncReturnType = viem_SendTransactionSyncReturnType\n\nexport type SendTransactionSyncErrorType =\n  // getConnectorClient()\n  | GetConnectorClientErrorType\n  // base\n  | BaseErrorType\n  | ErrorType\n  // viem\n  | viem_SendTransactionSyncErrorType\n\n/** https://wagmi.sh/core/api/actions/sendTransactionSync */\nexport async function sendTransactionSync<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n>(\n  config: config,\n  parameters: SendTransactionSyncParameters<config, chainId>,\n): Promise<SendTransactionSyncReturnType> {\n  const { account, chainId, connector, ...rest } = parameters\n\n  let client: Client\n  if (typeof account === 'object' && account?.type === 'local')\n    client = config.getClient({ chainId })\n  else\n    client = await getConnectorClient(config, {\n      account: account ?? undefined,\n      assertChainId: false,\n      chainId,\n      connector,\n    })\n\n  const chain = (() => {\n    if (!chainId || client.chain?.id === chainId) return client.chain\n    return { id: chainId }\n  })()\n\n  const action = getAction(\n    client,\n    viem_sendTransactionSync,\n    'sendTransactionSync',\n  )\n  const hash = await action({\n    ...(rest as any),\n    ...(account ? { account } : {}),\n    assertChainId: !!chainId,\n    chain,\n    gas: rest.gas ?? undefined,\n  })\n\n  return hash\n}\n"
  },
  {
    "path": "packages/core/src/actions/showCallsStatus.test.ts",
    "content": "import { accounts, config, testClient } from '@wagmi/test'\nimport { parseEther } from 'viem'\nimport { test } from 'vitest'\n\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { sendCalls } from './sendCalls.js'\nimport { showCallsStatus } from './showCallsStatus.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n  const { id } = await sendCalls(config, {\n    calls: [\n      {\n        data: '0xdeadbeef',\n        to: accounts[1],\n        value: parseEther('1'),\n      },\n      {\n        to: accounts[2],\n        value: parseEther('2'),\n      },\n      {\n        to: accounts[3],\n        value: parseEther('3'),\n      },\n    ],\n  })\n  await testClient.mainnet.mine({ blocks: 1 })\n  await showCallsStatus(config, {\n    id,\n  })\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/core/src/actions/showCallsStatus.ts",
    "content": "import {\n  type ShowCallsStatusErrorType as viem_ShowCallsStatusErrorType,\n  type ShowCallsStatusParameters as viem_ShowCallsStatusParameters,\n  type ShowCallsStatusReturnType as viem_ShowCallsStatusReturnType,\n  showCallsStatus as viem_showCallsStatus,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ConnectorParameter } from '../types/properties.js'\nimport { getConnectorClient } from './getConnectorClient.js'\n\nexport type ShowCallsStatusParameters = viem_ShowCallsStatusParameters &\n  ConnectorParameter\n\nexport type ShowCallsStatusReturnType = viem_ShowCallsStatusReturnType\n\nexport type ShowCallsStatusErrorType = viem_ShowCallsStatusErrorType\n\n/** https://wagmi.sh/core/api/actions/showCallsStatus */\nexport async function showCallsStatus<config extends Config>(\n  config: config,\n  parameters: ShowCallsStatusParameters,\n): Promise<ShowCallsStatusReturnType> {\n  const { connector, id } = parameters\n  const client = await getConnectorClient(config, { connector })\n  return viem_showCallsStatus(client, { id })\n}\n"
  },
  {
    "path": "packages/core/src/actions/signMessage.test.ts",
    "content": "import { accounts, config, privateKey } from '@wagmi/test'\nimport { recoverMessageAddress } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { expect, test } from 'vitest'\n\nimport { mock } from '../connectors/mock.js'\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { getConnection } from './getConnection.js'\nimport { signMessage } from './signMessage.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n  const signature = await signMessage(config, { message: 'foo bar baz' })\n  await expect(\n    recoverMessageAddress({\n      message: 'foo bar baz',\n      signature,\n    }),\n  ).resolves.toEqual(getConnection(config).address)\n  await disconnect(config, { connector })\n})\n\ntest('behavior: local account', async () => {\n  const account = privateKeyToAccount(privateKey)\n  const signature = await signMessage(config, {\n    account,\n    message: 'foo bar baz',\n  })\n  await expect(\n    recoverMessageAddress({\n      message: 'foo bar baz',\n      signature,\n    }),\n  ).resolves.toEqual(account.address)\n})\n\ntest('behavior: user rejected request', async () => {\n  const connector_ = config._internal.connectors.setup(\n    mock({\n      accounts,\n      features: { signMessageError: true },\n    }),\n  )\n  await connect(config, { connector: connector_ })\n  await expect(\n    signMessage(config, { message: 'foo bar baz' }),\n  ).rejects.toMatchInlineSnapshot(`\n    [UserRejectedRequestError: User rejected the request.\n\n    Details: Failed to sign message.\n    Version: viem@2.47.5]\n  `)\n  await disconnect(config, { connector: connector_ })\n})\n\ntest('behavior: not connected', async () => {\n  await expect(\n    signMessage(config, { message: 'foo bar baz' }),\n  ).rejects.toMatchInlineSnapshot(`\n    [ConnectorNotConnectedError: Connector not connected.\n\n    Version: @wagmi/core@x.y.z]\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/actions/signMessage.ts",
    "content": "import type { Account, Client } from 'viem'\nimport {\n  type SignMessageErrorType as viem_SignMessageErrorType,\n  type SignMessageParameters as viem_SignMessageParameters,\n  type SignMessageReturnType as viem_SignMessageReturnType,\n  signMessage as viem_signMessage,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { BaseErrorType, ErrorType } from '../errors/base.js'\nimport type { ConnectorParameter } from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\nimport {\n  type GetConnectorClientErrorType,\n  getConnectorClient,\n} from './getConnectorClient.js'\n\nexport type SignMessageParameters = Compute<\n  viem_SignMessageParameters<Account> & ConnectorParameter\n>\n\nexport type SignMessageReturnType = viem_SignMessageReturnType\n\nexport type SignMessageErrorType =\n  // getConnectorClient()\n  | GetConnectorClientErrorType\n  // base\n  | BaseErrorType\n  | ErrorType\n  // viem\n  | viem_SignMessageErrorType\n\n/** https://wagmi.sh/core/api/actions/signMessage */\nexport async function signMessage(\n  config: Config,\n  parameters: SignMessageParameters,\n): Promise<SignMessageReturnType> {\n  const { account, connector, ...rest } = parameters\n\n  let client: Client\n  if (typeof account === 'object' && account.type === 'local')\n    client = config.getClient()\n  else client = await getConnectorClient(config, { account, connector })\n\n  const action = getAction(client, viem_signMessage, 'signMessage')\n  return action({\n    ...rest,\n    ...(account ? { account } : {}),\n  } as viem_SignMessageParameters<Account>)\n}\n"
  },
  {
    "path": "packages/core/src/actions/signTransaction.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport {\n  http,\n  parseEther,\n  type TransactionSerializedEIP1559,\n  type TransactionSerializedEIP2930,\n  type TransactionSerializedEIP4844,\n  type TransactionSerializedEIP7702,\n  type TransactionSerializedLegacy,\n} from 'viem'\nimport { celo, mainnet } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\nimport { createConfig } from '../createConfig.js'\nimport {\n  type SignTransactionParameters,\n  signTransaction,\n} from './signTransaction.js'\n\ntest('chain formatters', () => {\n  const config = createConfig({\n    chains: [mainnet, celo],\n    transports: { [celo.id]: http(), [mainnet.id]: http() },\n  })\n\n  type Result = SignTransactionParameters<typeof config>\n  expectTypeOf<Result>().toMatchTypeOf<{\n    chainId?: typeof celo.id | typeof mainnet.id | undefined\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  signTransaction(config, {\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n  })\n\n  type Result2 = SignTransactionParameters<typeof config, typeof celo.id>\n  expectTypeOf<Result2>().toMatchTypeOf<{\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  signTransaction(config, {\n    chainId: celo.id,\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n    feeCurrency: '0x',\n  })\n\n  type Result3 = SignTransactionParameters<typeof config, typeof mainnet.id>\n  expectTypeOf<Result3>().not.toMatchTypeOf<{\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  signTransaction(config, {\n    chainId: mainnet.id,\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n  })\n})\n\ntest('legacy', () => {\n  const signature1 = signTransaction(config, { gasPrice: 0n })\n  const signature2 = signTransaction(config, { type: 'legacy' })\n\n  expectTypeOf(signature1).toEqualTypeOf<Promise<TransactionSerializedLegacy>>()\n  expectTypeOf(signature2).toEqualTypeOf<Promise<TransactionSerializedLegacy>>()\n\n  // @ts-expect-error\n  signTransaction(config, {\n    gasPrice: 0n,\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n  })\n\n  // @ts-expect-error\n  signTransaction(config, {\n    gasPrice: 0n,\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n    type: 'legacy',\n  })\n  // @ts-expect-error\n  signTransaction(config, {\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n    type: 'legacy',\n  })\n})\n\ntest('eip7702', () => {\n  const signature1 = signTransaction(config, {\n    authorizationList: [],\n  })\n  const signature2 = signTransaction(config, {\n    authorizationList: [],\n    type: 'eip7702',\n  })\n\n  expectTypeOf(signature1).toEqualTypeOf<\n    Promise<TransactionSerializedEIP7702>\n  >()\n  expectTypeOf(signature2).toEqualTypeOf<\n    Promise<TransactionSerializedEIP7702>\n  >()\n})\n\ntest('eip4844', () => {\n  const signature1 = signTransaction(config, {\n    blobVersionedHashes: [],\n    maxFeePerBlobGas: 0n,\n    to: '0x0000000000000000000000000000000000000000',\n  })\n  const signature2 = signTransaction(config, {\n    blobVersionedHashes: [],\n    maxFeePerBlobGas: 0n,\n    to: '0x0000000000000000000000000000000000000000',\n    type: 'eip4844',\n  })\n\n  expectTypeOf(signature1).toEqualTypeOf<\n    Promise<TransactionSerializedEIP4844>\n  >()\n  expectTypeOf(signature2).toEqualTypeOf<\n    Promise<TransactionSerializedEIP4844>\n  >()\n})\n\ntest('eip1559', () => {\n  const signature1 = signTransaction(config, {\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n  })\n  const signature2 = signTransaction(config, {\n    type: 'eip1559',\n  })\n\n  expectTypeOf(signature1).toEqualTypeOf<\n    Promise<TransactionSerializedEIP1559>\n  >()\n  expectTypeOf(signature2).toEqualTypeOf<\n    Promise<TransactionSerializedEIP1559>\n  >()\n\n  // @ts-expect-error\n  signTransaction(config, {\n    gasPrice: 0n,\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n  })\n\n  // @ts-expect-error\n  signTransaction(config, {\n    gasPrice: 0n,\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n    type: 'eip1559',\n  })\n  // @ts-expect-error\n  signTransaction(config, {\n    gasPrice: 0n,\n    type: 'eip1559',\n  })\n})\n\ntest('eip2930', () => {\n  const signature1 = signTransaction(config, {\n    accessList: [],\n    gasPrice: 0n,\n  })\n\n  const signature2 = signTransaction(config, {\n    type: 'eip2930',\n  })\n\n  expectTypeOf(signature1).toEqualTypeOf<\n    Promise<TransactionSerializedEIP2930>\n  >()\n  expectTypeOf(signature2).toEqualTypeOf<\n    Promise<TransactionSerializedEIP2930>\n  >()\n\n  // @ts-expect-error\n  signTransaction(config, {\n    accessList: [],\n    gasPrice: 0n,\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n  })\n\n  // @ts-expect-error\n  signTransaction(config, {\n    accessList: [],\n    gasPrice: 0n,\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n    type: 'eip2930',\n  })\n  // @ts-expect-error\n  signTransaction(config, {\n    accessList: [],\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n    type: 'eip2930',\n  })\n})\n"
  },
  {
    "path": "packages/core/src/actions/signTransaction.test.ts",
    "content": "import { config, privateKey, signedTransactionRegex } from '@wagmi/test'\nimport { parseEther } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { beforeEach, expect, test } from 'vitest'\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { signTransaction } from './signTransaction.js'\n\nconst connector = config.connectors[0]!\n\nbeforeEach(async () => {\n  if (config.state.current === connector.uid)\n    await disconnect(config, { connector })\n})\n\ntest('default', async () => {\n  const result = await connect(config, { connector })\n  config.state.connections.set(connector.uid, {\n    ...result,\n    // Switch up the current account because the default one is running out of funds somewhere\n    accounts: result.accounts.slice(1) as unknown as typeof result.accounts,\n    connector,\n  })\n  await expect(\n    signTransaction(config, {\n      to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      value: parseEther('0.0001'),\n    }),\n  ).resolves.toMatch(signedTransactionRegex)\n  await disconnect(config, { connector })\n})\n\ntest('behavior: connector not connected', async () => {\n  await connect(config, { connector })\n  await expect(\n    signTransaction(config, {\n      connector: config.connectors[1],\n      to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      value: parseEther('0.0001'),\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [ConnectorNotConnectedError: Connector not connected.\n\n    Version: @wagmi/core@x.y.z]\n  `)\n  await disconnect(config, { connector })\n})\n\ntest('behavior: account does not exist on connector', async () => {\n  await connect(config, { connector })\n  await expect(\n    signTransaction(config, {\n      account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      value: parseEther('0.0001'),\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [ConnectorAccountNotFoundError: Account \"0xA0Cf798816D4b9b9866b5330EEa46a18382f251e\" not found for connector \"Mock Connector\".\n\n    Version: @wagmi/core@x.y.z]\n  `)\n  await disconnect(config, { connector })\n})\n\ntest('behavior: local account', async () => {\n  const account = privateKeyToAccount(privateKey)\n  await expect(\n    signTransaction(config, {\n      account,\n      to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      type: 'eip1559',\n      value: parseEther('0.000001'),\n    }),\n  ).resolves.toMatch(signedTransactionRegex)\n})\n"
  },
  {
    "path": "packages/core/src/actions/signTransaction.ts",
    "content": "import type {\n  Account,\n  Chain,\n  Client,\n  TransactionRequest,\n  SignTransactionErrorType as viem_SignTransactionErrorType,\n  SignTransactionParameters as viem_SignTransactionParameters,\n  SignTransactionRequest as viem_SignTransactionRequest,\n  SignTransactionReturnType as viem_SignTransactionReturnType,\n} from 'viem'\nimport { signTransaction as viem_signTransaction } from 'viem/actions'\nimport type { Config } from '../createConfig.js'\nimport type { BaseErrorType, ErrorType } from '../errors/base.js'\nimport type { SelectChains } from '../types/chain.js'\nimport type {\n  ChainIdParameter,\n  ConnectorParameter,\n} from '../types/properties.js'\nimport type { UnionCompute, UnionLooseOmit } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\nimport {\n  type GetConnectorClientErrorType,\n  getConnectorClient,\n} from './getConnectorClient.js'\n\nexport type SignTransactionParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  request extends viem_SignTransactionRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  > = viem_SignTransactionRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  >,\n  //\n  chains extends readonly Chain[] = SelectChains<config, chainId>,\n> = {\n  [key in keyof chains]: UnionCompute<\n    UnionLooseOmit<\n      viem_SignTransactionParameters<\n        chains[key],\n        Account,\n        chains[key],\n        request extends viem_SignTransactionRequest<chains[key], chains[key]>\n          ? request\n          : never\n      >,\n      'chain' | 'gas'\n    > &\n      ChainIdParameter<config, chainId> &\n      ConnectorParameter & {\n        /** Gas provided for transaction execution. */\n        gas?: TransactionRequest['gas'] | null\n      }\n  >\n}[number]\n\nexport type SignTransactionReturnType<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  request extends viem_SignTransactionRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  > = viem_SignTransactionRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  >,\n> = viem_SignTransactionReturnType<request>\n\nexport type SignTransactionErrorType =\n  // getConnectorClient()\n  | GetConnectorClientErrorType\n  // base\n  | BaseErrorType\n  | ErrorType\n  // viem\n  | viem_SignTransactionErrorType\n\n/** https://wagmi.sh/core/api/actions/signTransaction */\nexport async function signTransaction<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  const request extends viem_SignTransactionRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  >,\n>(\n  config: config,\n  parameters: SignTransactionParameters<config, chainId, request> & request,\n): Promise<SignTransactionReturnType<config, chainId, request>> {\n  const { account, chainId, connector, ...rest } = parameters\n\n  let client: Client\n  if (typeof account === 'object' && account?.type === 'local')\n    client = config.getClient({ chainId })\n  else\n    client = await getConnectorClient(config, {\n      account: account ?? undefined,\n      assertChainId: false,\n      chainId,\n      connector,\n    })\n\n  const chain = (() => {\n    if (!chainId || client.chain?.id === chainId) return client.chain\n    return { id: chainId }\n  })()\n\n  const action = getAction(client, viem_signTransaction, 'signTransaction')\n  const serializedTransaction = await action({\n    ...(rest as any),\n    ...(account ? { account } : {}),\n    assertChainId: !!chainId,\n    chain,\n    gas: rest.gas ?? undefined,\n  })\n\n  return serializedTransaction as any\n}\n"
  },
  {
    "path": "packages/core/src/actions/signTypedData.test-d.ts",
    "content": "import { config, typedData } from '@wagmi/test'\nimport { test } from 'vitest'\n\nimport { signTypedData } from './signTypedData.js'\n\ntest('default', async () => {\n  signTypedData(config, {\n    types: typedData.basic.types,\n    primaryType: 'Mail',\n    message: typedData.basic.message,\n  })\n})\n\ntest('domain', async () => {\n  signTypedData(config, {\n    primaryType: 'EIP712Domain',\n    domain: {},\n  })\n})\n\ntest('custom domain', async () => {\n  signTypedData(config, {\n    types: {\n      EIP712Domain: [{ type: 'uint256', name: 'chainId' }],\n    },\n    primaryType: 'EIP712Domain',\n    domain: {\n      chainId: 123n,\n    },\n  })\n})\n"
  },
  {
    "path": "packages/core/src/actions/signTypedData.test.ts",
    "content": "import { accounts, config, privateKey, typedData } from '@wagmi/test'\nimport { recoverTypedDataAddress } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { expect, test } from 'vitest'\nimport { mock } from '../connectors/mock.js'\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { getConnection } from './getConnection.js'\nimport { signTypedData } from './signTypedData.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n  const signature = await signTypedData(config, {\n    types: typedData.basic.types,\n    primaryType: 'Mail',\n    message: typedData.basic.message,\n  })\n  await expect(\n    recoverTypedDataAddress({\n      types: typedData.basic.types,\n      primaryType: 'Mail',\n      message: typedData.basic.message,\n      signature,\n    }),\n  ).resolves.toBe(getConnection(config).address)\n  await disconnect(config, { connector })\n})\n\ntest('behavior: user rejected request', async () => {\n  const connector_ = config._internal.connectors.setup(\n    mock({\n      accounts,\n      features: { signTypedDataError: true },\n    }),\n  )\n  await connect(config, { connector: connector_ })\n  await expect(\n    signTypedData(config, {\n      types: typedData.basic.types,\n      primaryType: 'Mail',\n      message: typedData.basic.message,\n    }),\n  ).rejects.toMatchInlineSnapshot(`\n    [UserRejectedRequestError: User rejected the request.\n\n    Details: Failed to sign typed data.\n    Version: viem@2.47.5]\n  `)\n  await disconnect(config, { connector: connector_ })\n})\n\ntest('behavior: not connected', async () => {\n  await expect(\n    signTypedData(config, {\n      types: typedData.basic.types,\n      primaryType: 'Mail',\n      message: typedData.basic.message,\n    }),\n  ).rejects.toMatchInlineSnapshot(`\n    [ConnectorNotConnectedError: Connector not connected.\n\n    Version: @wagmi/core@x.y.z]\n  `)\n})\n\ntest('behavior: local account', async () => {\n  const account = privateKeyToAccount(privateKey)\n  const signature = await signTypedData(config, {\n    account,\n    types: typedData.basic.types,\n    primaryType: 'Mail',\n    message: typedData.basic.message,\n  })\n  await expect(\n    recoverTypedDataAddress({\n      types: typedData.basic.types,\n      primaryType: 'Mail',\n      message: typedData.basic.message,\n      signature,\n    }),\n  ).resolves.toBe(account.address)\n})\n"
  },
  {
    "path": "packages/core/src/actions/signTypedData.ts",
    "content": "import type { Account, Client, TypedData } from 'viem'\nimport {\n  type SignMessageErrorType as viem_SignMessageErrorType,\n  type SignTypedDataParameters as viem_SignTypedDataParameters,\n  type SignTypedDataReturnType as viem_SignTypedDataReturnType,\n  signTypedData as viem_signTypedData,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { BaseErrorType, ErrorType } from '../errors/base.js'\nimport type { ConnectorParameter } from '../types/properties.js'\nimport type { UnionCompute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\nimport {\n  type GetConnectorClientErrorType,\n  getConnectorClient,\n} from './getConnectorClient.js'\n\nexport type SignTypedDataParameters<\n  typedData extends TypedData | Record<string, unknown> = TypedData,\n  primaryType extends keyof typedData | 'EIP712Domain' = keyof typedData,\n  ///\n  primaryTypes = typedData extends TypedData ? keyof typedData : string,\n> = UnionCompute<\n  viem_SignTypedDataParameters<typedData, primaryType, Account, primaryTypes> &\n    ConnectorParameter\n>\n\nexport type SignTypedDataReturnType = viem_SignTypedDataReturnType\n\nexport type SignTypedDataErrorType =\n  // getConnectorClient()\n  | GetConnectorClientErrorType\n  // base\n  | BaseErrorType\n  | ErrorType\n  // viem\n  | viem_SignMessageErrorType\n\n/** https://wagmi.sh/core/api/actions/signTypedData */\nexport async function signTypedData<\n  const typedData extends TypedData | Record<string, unknown>,\n  primaryType extends keyof typedData | 'EIP712Domain',\n>(\n  config: Config,\n  parameters: SignTypedDataParameters<typedData, primaryType>,\n): Promise<SignTypedDataReturnType> {\n  const { account, connector, ...rest } = parameters\n\n  let client: Client\n  if (typeof account === 'object' && account.type === 'local')\n    client = config.getClient()\n  else client = await getConnectorClient(config, { account, connector })\n\n  const action = getAction(client, viem_signTypedData, 'signTypedData')\n  return action({\n    ...rest,\n    ...(account ? { account } : {}),\n  } as unknown as viem_SignTypedDataParameters)\n}\n"
  },
  {
    "path": "packages/core/src/actions/simulateContract.test-d.ts",
    "content": "import { abi, config } from '@wagmi/test'\nimport { type Address, http } from 'viem'\nimport { celo, mainnet } from 'viem/chains'\nimport { assertType, expectTypeOf, test } from 'vitest'\n\nimport { createConfig } from '../createConfig.js'\nimport {\n  type SimulateContractParameters,\n  type SimulateContractReturnType,\n  simulateContract,\n} from './simulateContract.js'\n\ntest('default', async () => {\n  const response = await simulateContract(config, {\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    chainId: 1,\n  })\n\n  expectTypeOf(response).toMatchTypeOf<{\n    result: boolean\n    request: {\n      chainId: 1\n      abi: readonly [\n        {\n          readonly name: 'transferFrom'\n          readonly type: 'function'\n          readonly stateMutability: 'nonpayable'\n          readonly inputs: readonly [\n            { readonly type: 'address'; readonly name: 'sender' },\n            { readonly type: 'address'; readonly name: 'recipient' },\n            { readonly type: 'uint256'; readonly name: 'amount' },\n          ]\n          readonly outputs: readonly [{ type: 'bool' }]\n        },\n      ]\n      functionName: 'transferFrom'\n      args: readonly [Address, Address, bigint]\n    }\n  }>()\n})\n\ntest('chain formatters', async () => {\n  const config = createConfig({\n    chains: [celo, mainnet],\n    transports: { [celo.id]: http(), [mainnet.id]: http() },\n  })\n\n  type Result = SimulateContractParameters<\n    typeof abi.erc20,\n    'transferFrom',\n    [Address, Address, bigint],\n    typeof config\n  >\n  expectTypeOf<Result>().toMatchTypeOf<{\n    chainId?: typeof celo.id | typeof mainnet.id | undefined\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  const response = await simulateContract(config, {\n    account: '0x',\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    feeCurrency: '0x',\n  })\n\n  if (response.chainId === celo.id) {\n    expectTypeOf(response.chainId).toEqualTypeOf(celo.id)\n    expectTypeOf(response.request.feeCurrency).toEqualTypeOf<\n      `0x${string}` | undefined\n    >()\n  }\n\n  type Result2 = SimulateContractParameters<\n    typeof abi.erc20,\n    'transferFrom',\n    [Address, Address, bigint],\n    typeof config,\n    typeof celo.id\n  >\n  expectTypeOf<Result2>().toMatchTypeOf<{\n    functionName: 'approve' | 'transfer' | 'transferFrom'\n    args: readonly [Address, Address, bigint]\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  const response2 = await simulateContract(config, {\n    chainId: celo.id,\n    account: '0x',\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    feeCurrency: '0x',\n  })\n  expectTypeOf(response2.chainId).toEqualTypeOf(celo.id)\n  expectTypeOf(response2.request.feeCurrency).toEqualTypeOf<\n    `0x${string}` | undefined\n  >()\n\n  type Result3 = SimulateContractParameters<\n    typeof abi.erc20,\n    'transferFrom',\n    [Address, Address, bigint],\n    typeof config,\n    typeof mainnet.id\n  >\n  expectTypeOf<Result3>().toMatchTypeOf<{\n    functionName: 'approve' | 'transfer' | 'transferFrom'\n    args: readonly [Address, Address, bigint]\n  }>()\n  expectTypeOf<Result3>().not.toMatchTypeOf<{\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  simulateContract(config, {\n    chainId: mainnet.id,\n    account: '0x',\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n})\n\ntest('SimulateContractParameters', () => {\n  type Result = SimulateContractParameters<\n    typeof abi.erc20,\n    'transferFrom',\n    [Address, Address, bigint],\n    typeof config,\n    (typeof config)['chains'][number]['id']\n  >\n  expectTypeOf<Result>().toMatchTypeOf<{\n    chainId?: (typeof config)['chains'][number]['id'] | undefined\n    functionName: 'approve' | 'transfer' | 'transferFrom'\n    args: readonly [Address, Address, bigint]\n  }>()\n})\n\ntest('SimulateContractReturnType', () => {\n  type Result = SimulateContractReturnType<\n    typeof abi.erc20,\n    'transferFrom',\n    [Address, Address, bigint],\n    typeof config,\n    (typeof config)['chains'][number]['id']\n  >\n  expectTypeOf<Result>().toMatchTypeOf<{\n    result: boolean\n    request: {\n      functionName: 'transferFrom'\n      args: readonly [Address, Address, bigint]\n      chainId: (typeof config)['chains'][number]['id']\n    }\n  }>()\n})\n\ntest('overloads', async () => {\n  const result1 = await simulateContract(config, {\n    address: '0x',\n    abi: abi.writeOverloads,\n    functionName: 'foo',\n  })\n  assertType<number>(result1.result)\n\n  const result2 = await simulateContract(config, {\n    address: '0x',\n    abi: abi.writeOverloads,\n    functionName: 'foo',\n    args: [],\n  })\n  assertType<number>(result2.result)\n\n  const result3 = await simulateContract(config, {\n    address: '0x',\n    abi: abi.writeOverloads,\n    functionName: 'foo',\n    args: ['0x'],\n  })\n  assertType<string>(result3.result)\n\n  const result4 = await simulateContract(config, {\n    address: '0x',\n    abi: abi.writeOverloads,\n    functionName: 'foo',\n    args: ['0x', '0x'],\n  })\n  assertType<{\n    foo: `0x${string}`\n    bar: `0x${string}`\n  }>(result4.result)\n})\n"
  },
  {
    "path": "packages/core/src/actions/simulateContract.test.ts",
    "content": "import { abi, accounts, address, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { simulateContract } from './simulateContract.js'\n\nconst connector = config.connectors[0]!\n\ntest('parameters: account', async () => {\n  await expect(\n    simulateContract(config, {\n      account: accounts[0],\n      address: address.wagmiMintExample,\n      abi: abi.wagmiMintExample,\n      functionName: 'mint',\n    }),\n  ).resolves.toMatchInlineSnapshot(`\n    {\n      \"chainId\": 1,\n      \"request\": {\n        \"abi\": [\n          {\n            \"inputs\": [],\n            \"name\": \"mint\",\n            \"outputs\": [],\n            \"stateMutability\": \"nonpayable\",\n            \"type\": \"function\",\n          },\n        ],\n        \"account\": {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"type\": \"json-rpc\",\n        },\n        \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        \"args\": undefined,\n        \"chainId\": undefined,\n        \"dataSuffix\": undefined,\n        \"functionName\": \"mint\",\n      },\n      \"result\": undefined,\n    }\n  `)\n})\n\ntest('parameters: connector', async () => {\n  await connect(config, { connector })\n\n  await expect(\n    simulateContract(config, {\n      address: address.wagmiMintExample,\n      abi: abi.wagmiMintExample,\n      functionName: 'mint',\n      connector,\n    }),\n  ).resolves.toMatchInlineSnapshot(`\n    {\n      \"chainId\": 1,\n      \"request\": {\n        \"abi\": [\n          {\n            \"inputs\": [],\n            \"name\": \"mint\",\n            \"outputs\": [],\n            \"stateMutability\": \"nonpayable\",\n            \"type\": \"function\",\n          },\n        ],\n        \"account\": {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"type\": \"json-rpc\",\n        },\n        \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        \"args\": undefined,\n        \"chainId\": undefined,\n        \"dataSuffix\": undefined,\n        \"functionName\": \"mint\",\n      },\n      \"result\": undefined,\n    }\n  `)\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/core/src/actions/simulateContract.ts",
    "content": "import type {\n  Abi,\n  Account,\n  Address,\n  Chain,\n  ContractFunctionArgs,\n  ContractFunctionName,\n} from 'viem'\nimport {\n  type SimulateContractErrorType as viem_SimulateContractErrorType,\n  type SimulateContractParameters as viem_SimulateContractParameters,\n  type SimulateContractReturnType as viem_SimulateContractReturnType,\n  simulateContract as viem_simulateContract,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { BaseErrorType, ErrorType } from '../errors/base.js'\nimport type { SelectChains } from '../types/chain.js'\nimport type {\n  ChainIdParameter,\n  ConnectorParameter,\n} from '../types/properties.js'\nimport type { Compute, PartialBy, UnionCompute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\nimport {\n  type GetConnectorClientErrorType,\n  getConnectorClient,\n} from './getConnectorClient.js'\n\nexport type SimulateContractParameters<\n  abi extends Abi | readonly unknown[] = Abi,\n  functionName extends ContractFunctionName<\n    abi,\n    'nonpayable' | 'payable'\n  > = ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  > = ContractFunctionArgs<abi, 'nonpayable' | 'payable', functionName>,\n  config extends Config = Config,\n  chainId extends\n    | config['chains'][number]['id']\n    | undefined = config['chains'][number]['id'],\n  ///\n  chains extends readonly Chain[] = SelectChains<config, chainId>,\n> = {\n  [key in keyof chains]: UnionCompute<\n    // TODO: Should use `UnionStrictOmit<..., 'chain'>` on `viem_SimulateContractParameters` result instead, but it knocks out inference for overloads\n    viem_SimulateContractParameters<\n      abi,\n      functionName,\n      args,\n      chains[key],\n      chains[key],\n      Account | Address\n    >\n  > & { chain?: never } & ChainIdParameter<config, chainId> &\n    ConnectorParameter\n}[number]\n\nexport type SimulateContractReturnType<\n  abi extends Abi | readonly unknown[] = Abi,\n  functionName extends ContractFunctionName<\n    abi,\n    'nonpayable' | 'payable'\n  > = ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  > = ContractFunctionArgs<abi, 'nonpayable' | 'payable', functionName>,\n  config extends Config = Config,\n  chainId extends\n    | config['chains'][number]['id']\n    | undefined = config['chains'][number]['id'],\n  ///\n  chains extends readonly Chain[] = SelectChains<config, chainId>,\n> = {\n  [key in keyof chains]: viem_SimulateContractReturnType<\n    abi,\n    functionName,\n    args,\n    chains[key],\n    Account,\n    chains[key]\n  > & {\n    chainId: chains[key]['id']\n    request: Compute<\n      PartialBy<\n        { chainId: chainId; chain: chains[key] },\n        chainId extends config['chains'][number]['id'] ? never : 'chainId'\n      >\n    >\n  }\n}[number]\n\nexport type SimulateContractErrorType =\n  // getConnectorClient()\n  | GetConnectorClientErrorType\n  // base\n  | BaseErrorType\n  | ErrorType\n  // viem\n  | viem_SimulateContractErrorType\n\n/** https://wagmi.sh/core/api/actions/simulateContract */\nexport async function simulateContract<\n  config extends Config,\n  const abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  const args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  >,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n>(\n  config: config,\n  parameters: SimulateContractParameters<\n    abi,\n    functionName,\n    args,\n    config,\n    chainId\n  >,\n): Promise<\n  SimulateContractReturnType<abi, functionName, args, config, chainId>\n> {\n  const { abi, chainId, connector, ...rest } =\n    parameters as SimulateContractParameters\n\n  let account: Address | Account\n  if (parameters.account) account = parameters.account\n  else {\n    const connectorClient = await getConnectorClient(config, {\n      assertChainId: false,\n      chainId,\n      connector,\n    })\n    account = connectorClient.account\n  }\n\n  const client = config.getClient({ chainId })\n  const action = getAction(client, viem_simulateContract, 'simulateContract')\n  const { result, request } = await action({ ...rest, abi, account })\n\n  return {\n    chainId: client.chain.id,\n    result,\n    request: { ...request, chainId },\n  } as unknown as SimulateContractReturnType<\n    abi,\n    functionName,\n    args,\n    config,\n    chainId\n  >\n}\n"
  },
  {
    "path": "packages/core/src/actions/switchChain.test.ts",
    "content": "import { accounts, chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { mock } from '../connectors/mock.js'\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { getConnection } from './getConnection.js'\nimport { switchChain } from './switchChain.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const chainId1 = getConnection(config).chainId\n\n  await switchChain(config, { chainId: chain.mainnet2.id })\n\n  const chainId2 = getConnection(config).chainId\n  expect(chainId2).toBeDefined()\n  expect(chainId1).not.toBe(chainId2)\n\n  await switchChain(config, { chainId: chain.mainnet.id })\n\n  const chainId3 = getConnection(config).chainId\n  expect(chainId3).toBeDefined()\n  expect(chainId1).toBe(chainId3)\n\n  await disconnect(config, { connector })\n})\n\ntest('behavior: user rejected request', async () => {\n  const connector_ = config._internal.connectors.setup(\n    mock({\n      accounts,\n      features: { switchChainError: true },\n    }),\n  )\n  await connect(config, { connector: connector_ })\n  await expect(\n    switchChain(config, { chainId: chain.mainnet.id }),\n  ).rejects.toMatchInlineSnapshot(`\n    [UserRejectedRequestError: User rejected the request.\n\n    Details: Failed to switch chain.\n    Version: viem@2.47.5]\n  `)\n  await disconnect(config, { connector: connector_ })\n})\n\ntest('behavior: not supported', async () => {\n  const { switchChain: _, ...connector_ } = config._internal.connectors.setup(\n    mock({ accounts }),\n  )\n  await connect(config, { connector: connector_ })\n  await expect(\n    switchChain(config, { chainId: chain.mainnet.id }),\n  ).rejects.toMatchInlineSnapshot(`\n    [SwitchChainNotSupportedError: \"Mock Connector\" does not support programmatic chain switching.\n\n    Version: @wagmi/core@x.y.z]\n  `)\n  await disconnect(config, { connector: connector_ })\n})\n\ntest('behavior: not connected', async () => {\n  const chainId = config.state.chainId\n  expect(config.state.chainId).toMatchInlineSnapshot('1')\n  await switchChain(config, { chainId: chain.mainnet2.id })\n  expect(config.state.chainId).toMatchInlineSnapshot('456')\n  await switchChain(config, { chainId })\n  expect(config.state.chainId).toMatchInlineSnapshot('1')\n})\n"
  },
  {
    "path": "packages/core/src/actions/switchChain.ts",
    "content": "import type {\n  AddEthereumChainParameter,\n  UserRejectedRequestErrorType,\n  SwitchChainErrorType as viem_SwitchChainErrorType,\n} from 'viem'\n\nimport type { Config } from '../createConfig.js'\nimport type { BaseErrorType, ErrorType } from '../errors/base.js'\nimport {\n  ChainNotConfiguredError,\n  type ChainNotConfiguredErrorType,\n} from '../errors/config.js'\nimport {\n  type ProviderNotFoundErrorType,\n  SwitchChainNotSupportedError,\n  type SwitchChainNotSupportedErrorType,\n} from '../errors/connector.js'\nimport type { ConnectorParameter } from '../types/properties.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\n\nexport type SwitchChainParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n> = Compute<\n  ConnectorParameter & {\n    chainId: chainId | config['chains'][number]['id']\n    addEthereumChainParameter?:\n      | Compute<ExactPartial<Omit<AddEthereumChainParameter, 'chainId'>>>\n      | undefined\n  }\n>\n\nexport type SwitchChainReturnType<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n> = Extract<\n  config['chains'][number],\n  { id: Config extends config ? number : chainId }\n>\n\nexport type SwitchChainErrorType =\n  | SwitchChainNotSupportedErrorType\n  | ChainNotConfiguredErrorType\n  // connector.switchChain()\n  | ProviderNotFoundErrorType\n  | UserRejectedRequestErrorType\n  // base\n  | BaseErrorType\n  | ErrorType\n  // viem\n  | viem_SwitchChainErrorType\n\n/** https://wagmi.sh/core/api/actions/switchChain */\nexport async function switchChain<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n>(\n  config: config,\n  parameters: SwitchChainParameters<config, chainId>,\n): Promise<SwitchChainReturnType<config, chainId>> {\n  const { addEthereumChainParameter, chainId } = parameters\n\n  const connection = config.state.connections.get(\n    parameters.connector?.uid ?? config.state.current!,\n  )\n  if (connection) {\n    const connector = connection.connector\n    if (!connector.switchChain)\n      throw new SwitchChainNotSupportedError({ connector })\n    const chain = await connector.switchChain({\n      addEthereumChainParameter,\n      chainId,\n    })\n    return chain as SwitchChainReturnType<config, chainId>\n  }\n\n  const chain = config.chains.find((x) => x.id === chainId)\n  if (!chain) throw new ChainNotConfiguredError()\n  config.setState((x) => ({ ...x, chainId }))\n  return chain as SwitchChainReturnType<config, chainId>\n}\n"
  },
  {
    "path": "packages/core/src/actions/switchConnection.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { getConnection } from './getConnection.js'\nimport { switchConnection } from './switchConnection.js'\n\nconst connector1 = config.connectors[0]!\nconst connector2 = config.connectors[1]!\n\ntest('default', async () => {\n  await connect(config, { connector: connector2 })\n  await connect(config, { connector: connector1 })\n\n  const address1 = getConnection(config).address\n\n  await switchConnection(config, { connector: connector2 })\n\n  const address2 = getConnection(config).address\n  expect(address2).toBeDefined()\n  expect(address1).not.toBe(address2)\n\n  await switchConnection(config, { connector: connector1 })\n\n  const address3 = getConnection(config).address\n  expect(address3).toBeDefined()\n  expect(address1).toBe(address3)\n\n  await disconnect(config, { connector: connector1 })\n  await disconnect(config, { connector: connector2 })\n})\n"
  },
  {
    "path": "packages/core/src/actions/switchConnection.ts",
    "content": "import type { Address } from 'viem'\n\nimport type { Config, Connector } from '../createConfig.js'\nimport type { BaseError, ErrorType } from '../errors/base.js'\nimport {\n  ConnectorNotConnectedError,\n  type ConnectorNotConnectedErrorType,\n} from '../errors/config.js'\n\nexport type SwitchConnectionParameters = {\n  connector: Connector\n}\n\nexport type SwitchConnectionReturnType<config extends Config = Config> = {\n  accounts: readonly [Address, ...Address[]]\n  chainId:\n    | config['chains'][number]['id']\n    | (number extends config['chains'][number]['id'] ? number : number & {})\n}\n\nexport type SwitchConnectionErrorType =\n  | ConnectorNotConnectedErrorType\n  | BaseError\n  | ErrorType\n\n/** https://wagmi.sh/core/api/actions/switchConnection */\nexport async function switchConnection<config extends Config>(\n  config: config,\n  parameters: SwitchConnectionParameters,\n): Promise<SwitchConnectionReturnType<config>> {\n  const { connector } = parameters\n\n  const connection = config.state.connections.get(connector.uid)\n  if (!connection) throw new ConnectorNotConnectedError()\n\n  await config.storage?.setItem('recentConnectorId', connector.id)\n  config.setState((x) => ({\n    ...x,\n    current: connector.uid,\n  }))\n  return {\n    accounts: connection.accounts,\n    chainId: connection.chainId,\n  }\n}\n"
  },
  {
    "path": "packages/core/src/actions/verifyMessage.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { verifyMessage } from './verifyMessage.js'\n\nconst eoaAddress = '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266'\nconst smartAccountAddress = '0x3FCf42e10CC70Fe75A62EB3aDD6D305Aa840d145'\n\ntest('smart account: valid signature', async () => {\n  expect(\n    await verifyMessage(config, {\n      address: smartAccountAddress,\n      message: 'This is a test message for viem!',\n      signature:\n        '0xefd5fb29a274ea6682673d8b3caa9263e936d48d486e5df68893003e0a76496439594d12245008c6fba1c8e3ef28241cffe1bef27ff6bca487b167f261f329251c',\n    }),\n  ).toBe(true)\n})\n\ntest('smart account: invalid signature', async () => {\n  expect(\n    await verifyMessage(config, {\n      address: smartAccountAddress,\n      message: 'This is a test message for viem!',\n      signature: '0xdead',\n    }),\n  ).toBe(false)\n})\n\ntest('smart account: account not deployed', async () => {\n  expect(\n    await verifyMessage(config, {\n      blockNumber: 1234567890n,\n      address: smartAccountAddress,\n      message: 'This is a test message for viem!',\n      signature:\n        '0xefd5fb29a274ea6682673d8b3caa9263e936d48d486e5df68893003e0a76496439594d12245008c6fba1c8e3ef28241cffe1bef27ff6bca487b167f261f329251c',\n    }),\n  ).toBe(false)\n})\n\ntest('eoa: valid signature', async () => {\n  expect(\n    await verifyMessage(config, {\n      address: eoaAddress,\n      message: 'This is a test message for viem!',\n      signature:\n        '0xc4c7f2820177020d66d5fd00d084cdd3f575a868c059c29a2d7f23398d04819709a14f83d98b446dda539ca5dcb87d75aa3340eb15e66d67606850622a3420f61b',\n    }),\n  ).toBe(true)\n})\n\ntest('eoa: invalid signature', async () => {\n  expect(\n    await verifyMessage(config, {\n      address: eoaAddress,\n      message: 'This is a test message for viem!',\n      signature: '0xdead',\n    }),\n  ).toBe(false)\n})\n\ntest('eoa: raw message', async () => {\n  expect(\n    await verifyMessage(config, {\n      address: eoaAddress,\n      message: { raw: '0x68656c6c6f20776f726c64' },\n      signature:\n        '0xa461f509887bd19e312c0c58467ce8ff8e300d3c1a90b608a760c5b80318eaf15fe57c96f9175d6cd4daad4663763baa7e78836e067d0163e9a2ccf2ff753f5b1b',\n    }),\n  ).toBe(true)\n})\n"
  },
  {
    "path": "packages/core/src/actions/verifyMessage.ts",
    "content": "import {\n  type VerifyMessageErrorType as viem_VerifyMessageErrorType,\n  type VerifyMessageParameters as viem_VerifyMessageParameters,\n  type VerifyMessageReturnType as viem_VerifyMessageReturnType,\n  verifyMessage as viem_verifyMessage,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type VerifyMessageParameters<config extends Config = Config> = Compute<\n  viem_VerifyMessageParameters & ChainIdParameter<config>\n>\n\nexport type VerifyMessageReturnType = viem_VerifyMessageReturnType\n\nexport type VerifyMessageErrorType = viem_VerifyMessageErrorType\n\n/** https://wagmi.sh/core/api/actions/verifyMessage */\nexport async function verifyMessage<config extends Config>(\n  config: config,\n  parameters: VerifyMessageParameters<config>,\n): Promise<VerifyMessageReturnType> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  const action = getAction(client, viem_verifyMessage, 'verifyMessage')\n  return action(rest)\n}\n"
  },
  {
    "path": "packages/core/src/actions/verifyTypedData.test-d.ts",
    "content": "import { config, typedData } from '@wagmi/test'\nimport { test } from 'vitest'\n\nimport { verifyTypedData } from './verifyTypedData.js'\n\ntest('default', async () => {\n  verifyTypedData(config, {\n    ...typedData.basic,\n    primaryType: 'Mail',\n    address: '0x',\n    signature: '0x',\n  })\n  verifyTypedData(config, {\n    ...typedData.basic,\n    // @ts-expect-error\n    primaryType: 'foobarbaz',\n    address: '0x',\n    signature: '0x',\n  })\n})\n"
  },
  {
    "path": "packages/core/src/actions/verifyTypedData.test.ts",
    "content": "import { config, typedData } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { verifyTypedData } from './verifyTypedData.js'\n\nconst smartAccountAddress = '0x3FCf42e10CC70Fe75A62EB3aDD6D305Aa840d145'\nconst notDeployedAddress = '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef'\n\ntest('valid signature', async () => {\n  expect(\n    await verifyTypedData(config, {\n      ...typedData.basic,\n      primaryType: 'Mail',\n      address: smartAccountAddress,\n      signature:\n        '0x79d756d805073dc97b7bc885b0d56ddf319a2599530fe1e178c2a7de5be88980068d24f20a79b318ea0a84d33ae06f93db77e4235e5d9eeb8b1d7a63922ada3e1c',\n    }),\n  ).toBe(true)\n})\n\ntest('invalid signature', async () => {\n  expect(\n    await verifyTypedData(config, {\n      ...typedData.basic,\n      primaryType: 'Mail',\n      address: smartAccountAddress,\n      signature: '0xdead',\n    }),\n  ).toBe(false)\n})\n\ntest('account not deployed', async () => {\n  expect(\n    await verifyTypedData(config, {\n      ...typedData.basic,\n      primaryType: 'Mail',\n      address: notDeployedAddress,\n      signature:\n        '0x79d756d805073dc97b7bc885b0d56ddf319a2599530fe1e178c2a7de5be88980068d24f20a79b318ea0a84d33ae06f93db77e4235e5d9eeb8b1d7a63922ada3e1c',\n    }),\n  ).toBe(false)\n})\n"
  },
  {
    "path": "packages/core/src/actions/verifyTypedData.ts",
    "content": "import type { TypedData } from 'viem'\nimport {\n  type VerifyTypedDataErrorType as viem_VerifyTypedDataErrorType,\n  type VerifyTypedDataParameters as viem_VerifyTypedDataParameters,\n  type VerifyTypedDataReturnType as viem_VerifyTypedDataReturnType,\n  verifyTypedData as viem_verifyTypedData,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { UnionCompute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type VerifyTypedDataParameters<\n  typedData extends TypedData | Record<string, unknown> = TypedData,\n  primaryType extends keyof typedData | 'EIP712Domain' = keyof typedData,\n  config extends Config = Config,\n> = UnionCompute<\n  viem_VerifyTypedDataParameters<typedData, primaryType> &\n    ChainIdParameter<config>\n>\n\nexport type VerifyTypedDataReturnType = viem_VerifyTypedDataReturnType\n\nexport type VerifyTypedDataErrorType = viem_VerifyTypedDataErrorType\n\n/** https://wagmi.sh/core/api/actions/verifyTypedData */\nexport async function verifyTypedData<\n  config extends Config,\n  const typedData extends TypedData | Record<string, unknown>,\n  primaryType extends keyof typedData | 'EIP712Domain',\n>(\n  config: config,\n  parameters: VerifyTypedDataParameters<typedData, primaryType, config>,\n): Promise<VerifyTypedDataReturnType> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  const action = getAction(client, viem_verifyTypedData, 'verifyTypedData')\n  return action(rest as viem_VerifyTypedDataParameters)\n}\n"
  },
  {
    "path": "packages/core/src/actions/waitForCallsStatus.test.ts",
    "content": "import { accounts, config, testClient, wait } from '@wagmi/test'\nimport { parseEther } from 'viem'\nimport { expect, test } from 'vitest'\n\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { sendCalls } from './sendCalls.js'\nimport { waitForCallsStatus } from './waitForCallsStatus.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const { id } = await sendCalls(config, {\n    calls: [\n      {\n        data: '0xdeadbeef',\n        to: accounts[1],\n        value: parseEther('1'),\n      },\n      {\n        to: accounts[2],\n        value: parseEther('2'),\n      },\n      {\n        to: accounts[3],\n        value: parseEther('3'),\n      },\n    ],\n  })\n\n  const [{ receipts, status }] = await Promise.all([\n    waitForCallsStatus(config, {\n      id,\n    }),\n    (async () => {\n      await wait(100)\n      await testClient.mainnet.mine({ blocks: 1 })\n    })(),\n  ])\n\n  expect(status).toBe('success')\n  expect(\n    receipts?.map((x) => ({\n      ...x,\n      blockHash: undefined,\n      transactionHash: undefined,\n    })),\n  ).toMatchInlineSnapshot(\n    `\n    [\n      {\n        \"blockHash\": undefined,\n        \"blockNumber\": 23535881n,\n        \"gasUsed\": 21160n,\n        \"logs\": [],\n        \"status\": \"success\",\n        \"transactionHash\": undefined,\n      },\n      {\n        \"blockHash\": undefined,\n        \"blockNumber\": 23535881n,\n        \"gasUsed\": 21000n,\n        \"logs\": [],\n        \"status\": \"success\",\n        \"transactionHash\": undefined,\n      },\n      {\n        \"blockHash\": undefined,\n        \"blockNumber\": 23535881n,\n        \"gasUsed\": 21000n,\n        \"logs\": [],\n        \"status\": \"success\",\n        \"transactionHash\": undefined,\n      },\n    ]\n  `,\n  )\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/core/src/actions/waitForCallsStatus.ts",
    "content": "import {\n  type WaitForCallsStatusErrorType as viem_WaitForCallsStatusErrorType,\n  type WaitForCallsStatusParameters as viem_WaitForCallsStatusParameters,\n  type WaitForCallsStatusReturnType as viem_WaitForCallsStatusReturnType,\n  waitForCallsStatus as viem_waitForCallsStatus,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { ConnectorParameter } from '../types/properties.js'\nimport { getConnectorClient } from './getConnectorClient.js'\n\nexport type WaitForCallsStatusParameters = viem_WaitForCallsStatusParameters &\n  ConnectorParameter\n\nexport type WaitForCallsStatusReturnType = viem_WaitForCallsStatusReturnType\n\nexport type WaitForCallsStatusErrorType = viem_WaitForCallsStatusErrorType\n\n/** https://wagmi.sh/core/api/actions/waitForCallsStatus */\nexport async function waitForCallsStatus<config extends Config>(\n  config: config,\n  parameters: WaitForCallsStatusParameters,\n): Promise<WaitForCallsStatusReturnType> {\n  const { connector } = parameters\n  const client = await getConnectorClient(config, { connector })\n  return viem_waitForCallsStatus(client, parameters)\n}\n"
  },
  {
    "path": "packages/core/src/actions/waitForTransactionReceipt.test-d.ts",
    "content": "import { http } from 'viem'\nimport { mainnet, zkSync } from 'viem/chains'\nimport type { ZkSyncL2ToL1Log, ZkSyncLog } from 'viem/zksync'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { createConfig } from '../createConfig.js'\nimport { waitForTransactionReceipt } from './waitForTransactionReceipt.js'\n\ntest('chain formatters', async () => {\n  const config = createConfig({\n    chains: [mainnet, zkSync],\n    transports: { [mainnet.id]: http(), [zkSync.id]: http() },\n  })\n  const result = await waitForTransactionReceipt(config, { hash: '0x123' })\n  if (result.chainId === zkSync.id) {\n    expectTypeOf(result.l1BatchNumber).toEqualTypeOf<bigint | null>()\n    expectTypeOf(result.l1BatchTxIndex).toEqualTypeOf<bigint | null>()\n    expectTypeOf(result.logs).toEqualTypeOf<ZkSyncLog[]>()\n    expectTypeOf(result.l2ToL1Logs).toEqualTypeOf<ZkSyncL2ToL1Log[]>()\n  }\n})\n\ntest('chainId', async () => {\n  const config = createConfig({\n    chains: [zkSync],\n    transports: { [zkSync.id]: http() },\n  })\n  const result = await waitForTransactionReceipt(config, {\n    hash: '0x123',\n    chainId: zkSync.id,\n  })\n  expectTypeOf(result.l1BatchNumber).toEqualTypeOf<bigint | null>()\n  expectTypeOf(result.l1BatchTxIndex).toEqualTypeOf<bigint | null>()\n  expectTypeOf(result.logs).toEqualTypeOf<ZkSyncLog[]>()\n  expectTypeOf(result.l2ToL1Logs).toEqualTypeOf<ZkSyncL2ToL1Log[]>()\n})\n"
  },
  {
    "path": "packages/core/src/actions/waitForTransactionReceipt.test.ts",
    "content": "import { config, testClient, wait } from '@wagmi/test'\nimport { parseEther } from 'viem'\nimport { beforeEach, expect, test } from 'vitest'\n\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { sendTransaction } from './sendTransaction.js'\nimport { waitForTransactionReceipt } from './waitForTransactionReceipt.js'\n\nconst connector = config.connectors[0]!\n\nbeforeEach(async () => {\n  if (config.state.current === connector.uid)\n    await disconnect(config, { connector })\n})\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const hash = await sendTransaction(config, {\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n  })\n\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(100)\n\n  await expect(\n    waitForTransactionReceipt(config, { hash }),\n  ).resolves.toMatchObject({\n    chainId: 1,\n    transactionHash: hash,\n  })\n\n  await disconnect(config, { connector })\n})\n\ntest('behavior: transaction reverted', async () => {\n  await expect(\n    waitForTransactionReceipt(config, {\n      hash: '0x745367f76807d411b7fa4c3a552a62e3e45303ef40145fff04d84b867c2575d3',\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [CallExecutionError: Execution reverted with reason: PartyBid::claim: contribution already claimed.\n\n    Raw Call Arguments:\n      from:                  0xa0cf798816d4b9b9866b5330eea46a18382f251e\n      to:                    0xf1332f21487e74612ed3a0fb36da729b73f1ae19\n      value:                 0 ETH\n      data:                  0x1e83409a000000000000000000000000a0cf798816d4b9b9866b5330eea46a18382f251e\n      gas:                   128730\n      maxFeePerGas:          43.307900987 gwei\n      maxPriorityFeePerGas:  1.5 gwei\n      nonce:                 43\n\n    Details: execution reverted: PartyBid::claim: contribution already claimed\n    Version: viem@2.47.5]\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/actions/waitForTransactionReceipt.ts",
    "content": "import type { Chain } from 'viem'\nimport { hexToString } from 'viem'\nimport {\n  call,\n  getTransaction,\n  type WaitForTransactionReceiptErrorType as viem_WaitForTransactionReceiptErrorType,\n  type WaitForTransactionReceiptParameters as viem_WaitForTransactionReceiptParameters,\n  type WaitForTransactionReceiptReturnType as viem_WaitForTransactionReceiptReturnType,\n  waitForTransactionReceipt as viem_waitForTransactionReceipt,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { SelectChains } from '../types/chain.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute, IsNarrowable } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type WaitForTransactionReceiptParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n> = Compute<\n  viem_WaitForTransactionReceiptParameters & ChainIdParameter<config, chainId>\n>\n\nexport type WaitForTransactionReceiptReturnType<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  ///\n  chains extends readonly Chain[] = SelectChains<config, chainId>,\n> = Compute<\n  {\n    [key in keyof chains]: viem_WaitForTransactionReceiptReturnType<\n      IsNarrowable<chains[key], Chain> extends true ? chains[key] : undefined\n    > & { chainId: chains[key]['id'] }\n  }[number]\n>\n\nexport type WaitForTransactionReceiptErrorType =\n  viem_WaitForTransactionReceiptErrorType\n\nexport async function waitForTransactionReceipt<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n>(\n  config: config,\n  parameters: WaitForTransactionReceiptParameters<config, chainId>,\n): Promise<WaitForTransactionReceiptReturnType<config, chainId>> {\n  const { chainId, timeout = 0, ...rest } = parameters\n\n  const client = config.getClient({ chainId })\n  const action = getAction(\n    client,\n    viem_waitForTransactionReceipt,\n    'waitForTransactionReceipt',\n  )\n  const receipt = await action({ ...rest, timeout })\n\n  if (receipt.status === 'reverted') {\n    const action_getTransaction = getAction(\n      client,\n      getTransaction,\n      'getTransaction',\n    )\n    const { from: account, ...txn } = await action_getTransaction({\n      hash: receipt.transactionHash,\n    })\n    const action_call = getAction(client, call, 'call')\n    const code = await action_call({\n      ...(txn as any),\n      account,\n      data: txn.input,\n      gasPrice: txn.type !== 'eip1559' ? txn.gasPrice : undefined,\n      maxFeePerGas: txn.type === 'eip1559' ? txn.maxFeePerGas : undefined,\n      maxPriorityFeePerGas:\n        txn.type === 'eip1559' ? txn.maxPriorityFeePerGas : undefined,\n    })\n    const reason = code?.data\n      ? hexToString(`0x${code.data.substring(138)}`)\n      : 'unknown reason'\n    throw new Error(reason)\n  }\n\n  return {\n    ...receipt,\n    chainId: client.chain.id,\n  } as WaitForTransactionReceiptReturnType<config, chainId>\n}\n"
  },
  {
    "path": "packages/core/src/actions/watchAsset.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { watchAsset } from './watchAsset.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n  await expect(\n    watchAsset(config, {\n      type: 'ERC20',\n      options: {\n        address: '0x0000000000000000000000000000000000000000',\n        symbol: 'NULL',\n        decimals: 18,\n      },\n    }),\n  ).resolves.toMatchInlineSnapshot('true')\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/core/src/actions/watchAsset.ts",
    "content": "import {\n  type WatchAssetErrorType as viem_WatchAssetErrorType,\n  type WatchAssetParameters as viem_WatchAssetParameters,\n  type WatchAssetReturnType as viem_WatchAssetReturnType,\n  watchAsset as viem_watchAsset,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { BaseErrorType, ErrorType } from '../errors/base.js'\nimport type { ConnectorParameter } from '../types/properties.js'\nimport type { Compute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\nimport {\n  type GetConnectorClientErrorType,\n  getConnectorClient,\n} from './getConnectorClient.js'\n\nexport type WatchAssetParameters = Compute<\n  viem_WatchAssetParameters & ConnectorParameter\n>\n\nexport type WatchAssetReturnType = viem_WatchAssetReturnType\n\nexport type WatchAssetErrorType =\n  // getConnectorClient()\n  | GetConnectorClientErrorType\n  // base\n  | BaseErrorType\n  | ErrorType\n  // viem\n  | viem_WatchAssetErrorType\n\n/** https://wagmi.sh/core/api/actions/watchAsset */\nexport async function watchAsset(\n  config: Config,\n  parameters: WatchAssetParameters,\n): Promise<WatchAssetReturnType> {\n  const { connector, ...rest } = parameters\n\n  const client = await getConnectorClient(config, { connector })\n\n  const action = getAction(client, viem_watchAsset, 'watchAsset')\n  return action(rest as viem_WatchAssetParameters)\n}\n"
  },
  {
    "path": "packages/core/src/actions/watchBlockNumber.test-d.ts",
    "content": "import { http, webSocket } from 'viem'\nimport { mainnet, optimism } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { createConfig } from '../createConfig.js'\nimport {\n  type WatchBlockNumberParameters,\n  watchBlockNumber,\n} from './watchBlockNumber.js'\n\ntest('differing transports', () => {\n  const config = createConfig({\n    chains: [mainnet, optimism],\n    transports: {\n      [mainnet.id]: http(),\n      [optimism.id]: webSocket(),\n    },\n  })\n\n  type Result = WatchBlockNumberParameters<\n    typeof config,\n    typeof mainnet.id | typeof optimism.id\n  >\n  expectTypeOf<Result['poll']>().toEqualTypeOf<boolean | undefined>()\n  watchBlockNumber(config, {\n    poll: false,\n    onBlockNumber() {},\n  })\n\n  type Result2 = WatchBlockNumberParameters<typeof config, typeof mainnet.id>\n  expectTypeOf<Result2['poll']>().toEqualTypeOf<true | undefined>()\n  watchBlockNumber(config, {\n    chainId: mainnet.id,\n    poll: true,\n    onBlockNumber() {},\n  })\n  watchBlockNumber(config, {\n    chainId: mainnet.id,\n    // @ts-expect-error\n    poll: false,\n    onBlockNumber() {},\n  })\n\n  type Result3 = WatchBlockNumberParameters<typeof config, typeof optimism.id>\n  expectTypeOf<Result3['poll']>().toEqualTypeOf<boolean | undefined>()\n  watchBlockNumber(config, {\n    chainId: optimism.id,\n    poll: true,\n    onBlockNumber() {},\n  })\n  watchBlockNumber(config, {\n    chainId: optimism.id,\n    poll: false,\n    onBlockNumber() {},\n  })\n})\n"
  },
  {
    "path": "packages/core/src/actions/watchBlockNumber.test.ts",
    "content": "import { config, testClient, wait } from '@wagmi/test'\nimport { expect, test, vi } from 'vitest'\n\nimport { watchBlockNumber } from './watchBlockNumber.js'\n\ntest('default', async () => {\n  const blockNumbers: bigint[] = []\n  const unwatch = watchBlockNumber(config, {\n    onBlockNumber(blockNumber) {\n      blockNumbers.push(blockNumber)\n    },\n  })\n\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(100)\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(100)\n  await testClient.mainnet.mine({ blocks: 1 })\n\n  await vi.waitUntil(() => blockNumbers.length === 3, { timeout: 10_000 })\n  expect(blockNumbers.length).toBe(3)\n\n  unwatch()\n  await wait(100)\n})\n"
  },
  {
    "path": "packages/core/src/actions/watchBlockNumber.ts",
    "content": "import type { Chain, Transport, WebSocketTransport } from 'viem'\nimport {\n  type WatchBlockNumberParameters as viem_WatchBlockNumberParameters,\n  type WatchBlockNumberReturnType as viem_WatchBlockNumberReturnType,\n  watchBlockNumber as viem_watchBlockNumber,\n} from 'viem/actions'\nimport type { Config } from '../createConfig.js'\nimport type { SelectChains } from '../types/chain.js'\nimport type {\n  ChainIdParameter,\n  SyncConnectedChainParameter,\n} from '../types/properties.js'\nimport type { UnionCompute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type WatchBlockNumberParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  ///\n  chains extends readonly Chain[] = SelectChains<config, chainId>,\n> = {\n  [key in keyof chains]: UnionCompute<\n    viem_WatchBlockNumberParameters<\n      config['_internal']['transports'][chains[key]['id']] extends infer transport extends\n        Transport\n        ? Transport extends transport\n          ? WebSocketTransport\n          : transport\n        : WebSocketTransport\n    > &\n      ChainIdParameter<config, chainId> &\n      SyncConnectedChainParameter\n  >\n}[number]\n\nexport type WatchBlockNumberReturnType = viem_WatchBlockNumberReturnType\n\n// TODO: wrap in viem's `observe` to avoid duplicate invocations.\n/** https://wagmi.sh/core/api/actions/watchBlockNumber */\nexport function watchBlockNumber<\n  config extends Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n>(\n  config: config,\n  parameters: WatchBlockNumberParameters<config, chainId>,\n): WatchBlockNumberReturnType {\n  const { syncConnectedChain = config._internal.syncConnectedChain, ...rest } =\n    parameters as WatchBlockNumberParameters\n\n  let unwatch: WatchBlockNumberReturnType | undefined\n  const listener = (chainId: number | undefined) => {\n    if (unwatch) unwatch()\n\n    const client = config.getClient({ chainId })\n    const action = getAction(client, viem_watchBlockNumber, 'watchBlockNumber')\n    unwatch = action(rest as viem_WatchBlockNumberParameters)\n    return unwatch\n  }\n\n  // set up listener for block number changes\n  const unlisten = listener(parameters.chainId)\n\n  // set up subscriber for connected chain changes\n  let unsubscribe: (() => void) | undefined\n  if (syncConnectedChain && !parameters.chainId)\n    unsubscribe = config.subscribe(\n      ({ chainId }) => chainId,\n      async (chainId) => listener(chainId),\n    )\n\n  return () => {\n    unlisten?.()\n    unsubscribe?.()\n  }\n}\n"
  },
  {
    "path": "packages/core/src/actions/watchBlocks.test-d.ts",
    "content": "import { http, webSocket } from 'viem'\nimport { mainnet, optimism } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { createConfig } from '../createConfig.js'\nimport { type WatchBlocksParameters, watchBlocks } from './watchBlocks.js'\n\ntest('differing transports', () => {\n  const config = createConfig({\n    chains: [mainnet, optimism],\n    transports: {\n      [mainnet.id]: http(),\n      [optimism.id]: webSocket(),\n    },\n  })\n\n  type Result = WatchBlocksParameters<\n    false,\n    'latest',\n    typeof config,\n    typeof mainnet.id | typeof optimism.id\n  >\n  expectTypeOf<Result['poll']>().toEqualTypeOf<boolean | undefined>()\n  watchBlocks(config, {\n    poll: false,\n    onBlock() {},\n  })\n\n  type Result2 = WatchBlocksParameters<\n    false,\n    'latest',\n    typeof config,\n    typeof mainnet.id\n  >\n  expectTypeOf<Result2['poll']>().toEqualTypeOf<true | undefined>()\n  watchBlocks(config, {\n    chainId: mainnet.id,\n    poll: true,\n    onBlock() {},\n  })\n\n  type Result3 = WatchBlocksParameters<\n    false,\n    'latest',\n    typeof config,\n    typeof optimism.id\n  >\n  expectTypeOf<Result3['poll']>().toEqualTypeOf<boolean | undefined>()\n  watchBlocks(config, {\n    chainId: optimism.id,\n    poll: true,\n    onBlock() {},\n  })\n  watchBlocks(config, {\n    chainId: optimism.id,\n    poll: false,\n    onBlock() {},\n  })\n})\n"
  },
  {
    "path": "packages/core/src/actions/watchBlocks.test.ts",
    "content": "import { config, testClient, wait } from '@wagmi/test'\nimport type { Block } from 'viem'\nimport { expect, test, vi } from 'vitest'\nimport { watchBlocks } from './watchBlocks.js'\n\ntest('default', async () => {\n  const blocks: Block[] = []\n  const unwatch = watchBlocks(config, {\n    onBlock(block) {\n      blocks.push(block)\n    },\n  })\n\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(500)\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(500)\n  await testClient.mainnet.mine({ blocks: 1 })\n\n  await vi.waitUntil(() => blocks.length === 3, { timeout: 10_000 })\n  expect(blocks.length).toBe(3)\n\n  unwatch()\n  await wait(100)\n})\n"
  },
  {
    "path": "packages/core/src/actions/watchBlocks.ts",
    "content": "import type { BlockTag, Chain, Transport, WebSocketTransport } from 'viem'\nimport {\n  type WatchBlocksParameters as viem_WatchBlocksParameters,\n  type WatchBlocksReturnType as viem_WatchBlocksReturnType,\n  watchBlocks as viem_watchBlocks,\n} from 'viem/actions'\nimport type { Config } from '../createConfig.js'\nimport type { SelectChains } from '../types/chain.js'\nimport type {\n  ChainIdParameter,\n  SyncConnectedChainParameter,\n} from '../types/properties.js'\nimport type { IsNarrowable, UnionCompute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type WatchBlocksParameters<\n  includeTransactions extends boolean = false,\n  blockTag extends BlockTag = 'latest',\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  ///\n  chains extends readonly Chain[] = SelectChains<config, chainId>,\n> = {\n  [key in keyof chains]: UnionCompute<\n    viem_WatchBlocksParameters<\n      config['_internal']['transports'][chains[key]['id']] extends infer transport extends\n        Transport\n        ? Transport extends transport\n          ? WebSocketTransport\n          : transport\n        : WebSocketTransport,\n      IsNarrowable<chains[key], Chain> extends true ? chains[key] : undefined,\n      includeTransactions,\n      blockTag\n    > &\n      ChainIdParameter<config, chainId> &\n      SyncConnectedChainParameter\n  >\n}[number]\n\nexport type WatchBlocksReturnType = viem_WatchBlocksReturnType\n\n// TODO: wrap in viem's `observe` to avoid duplicate invocations.\n/** https://wagmi.sh/core/actions/watchBlocks */\nexport function watchBlocks<\n  config extends Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  includeTransactions extends boolean = false,\n  blockTag extends BlockTag = 'latest',\n>(\n  config: config,\n  parameters: WatchBlocksParameters<\n    includeTransactions,\n    blockTag,\n    config,\n    chainId\n  >,\n): WatchBlocksReturnType {\n  const { syncConnectedChain = config._internal.syncConnectedChain, ...rest } =\n    parameters as WatchBlocksParameters\n\n  let unwatch: WatchBlocksReturnType | undefined\n  const listener = (chainId: number | undefined) => {\n    if (unwatch) unwatch()\n\n    const client = config.getClient({ chainId })\n    const action = getAction(client, viem_watchBlocks, 'watchBlocks')\n    unwatch = action(rest as viem_WatchBlocksParameters)\n    return unwatch\n  }\n\n  // set up listener for block number changes\n  const unlisten = listener(parameters.chainId)\n\n  // set up subscriber for connected chain changes\n  let unsubscribe: (() => void) | undefined\n  if (syncConnectedChain && !parameters.chainId)\n    unsubscribe = config.subscribe(\n      ({ chainId }) => chainId,\n      async (chainId) => listener(chainId),\n    )\n\n  return () => {\n    unlisten?.()\n    unsubscribe?.()\n  }\n}\n"
  },
  {
    "path": "packages/core/src/actions/watchChainId.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { watchChainId } from './watchChainId.js'\n\ntest('default', async () => {\n  const chainIds: number[] = []\n  const unwatch = watchChainId(config, {\n    onChange(chainId) {\n      chainIds.push(chainId)\n    },\n  })\n  config.setState((x) => ({ ...x, chainId: chain.mainnet2.id }))\n  config.setState((x) => ({ ...x, chainId: chain.mainnet.id }))\n  config.setState((x) => ({ ...x, chainId: chain.mainnet2.id }))\n\n  expect(chainIds).toMatchInlineSnapshot(`\n    [\n      456,\n      1,\n      456,\n    ]\n  `)\n\n  unwatch()\n})\n"
  },
  {
    "path": "packages/core/src/actions/watchChainId.ts",
    "content": "import type { Config } from '../createConfig.js'\nimport type { GetChainIdReturnType } from './getChainId.js'\n\nexport type WatchChainIdParameters<config extends Config = Config> = {\n  onChange(\n    chainId: GetChainIdReturnType<config>,\n    prevChainId: GetChainIdReturnType<config>,\n  ): void\n}\n\nexport type WatchChainIdReturnType = () => void\n\n/** https://wagmi.sh/core/api/actions/watchChainId */\nexport function watchChainId<config extends Config>(\n  config: config,\n  parameters: WatchChainIdParameters<config>,\n): WatchChainIdReturnType {\n  const { onChange } = parameters\n  return config.subscribe((state) => state.chainId, onChange)\n}\n"
  },
  {
    "path": "packages/core/src/actions/watchChains.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport type { Chain } from 'viem'\nimport { expect, test } from 'vitest'\n\nimport { watchChains } from './watchChains.js'\n\ntest('default', async () => {\n  let chains: readonly [Chain, ...Chain[]] = config.chains\n  const unwatch = watchChains(config, {\n    onChange(nextChains) {\n      chains = nextChains\n    },\n  })\n\n  config._internal.chains.setState([chain.mainnet, chain.mainnet2])\n  expect(chains.map((x) => x.id)).toMatchInlineSnapshot(`\n    [\n      1,\n      456,\n    ]\n  `)\n\n  config._internal.chains.setState([\n    chain.mainnet,\n    chain.mainnet2,\n    chain.optimism,\n  ])\n  expect(chains.map((x) => x.id)).toMatchInlineSnapshot(`\n    [\n      1,\n      456,\n      10,\n    ]\n  `)\n\n  unwatch()\n})\n"
  },
  {
    "path": "packages/core/src/actions/watchChains.ts",
    "content": "import type { Config } from '../createConfig.js'\nimport type { GetChainsReturnType } from './getChains.js'\n\nexport type WatchChainsParameters<config extends Config = Config> = {\n  onChange(\n    chains: GetChainsReturnType<config>,\n    prevChains: GetChainsReturnType<config>,\n  ): void\n}\n\nexport type WatchChainsReturnType = () => void\n\n/**\n * @internal\n * We don't expose this because as far as consumers know, you can't chainge (lol) `config.chains` at runtime.\n * Setting `config.chains` via `config._internal.chains.setState(...)` is an extremely advanced use case that's not worth documenting or supporting in the public API at this time.\n */\nexport function watchChains<config extends Config>(\n  config: config,\n  parameters: WatchChainsParameters<config>,\n): WatchChainsReturnType {\n  const { onChange } = parameters\n  return config._internal.chains.subscribe((chains, prevChains) => {\n    onChange(\n      chains as unknown as GetChainsReturnType<config>,\n      prevChains as unknown as GetChainsReturnType<config>,\n    )\n  })\n}\n"
  },
  {
    "path": "packages/core/src/actions/watchClient.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { watchClient } from './watchClient.js'\n\ntest('default', () => {\n  watchClient(config, {\n    onChange(client) {\n      expectTypeOf(client.chain).toEqualTypeOf<\n        (typeof config)['chains'][number]\n      >()\n      expectTypeOf(client.transport.type).toEqualTypeOf<'http'>()\n    },\n  })\n})\n"
  },
  {
    "path": "packages/core/src/actions/watchClient.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport type { Client } from 'viem'\nimport { expect, test } from 'vitest'\n\nimport { switchChain } from './switchChain.js'\nimport { watchClient } from './watchClient.js'\n\ntest('default', async () => {\n  const clients: Client[] = []\n  const unwatch = watchClient(config, {\n    onChange(client) {\n      clients.push(client)\n    },\n  })\n\n  switchChain(config, { chainId: 456 })\n  switchChain(config, { chainId: 10 })\n  switchChain(config, { chainId: 1 })\n\n  expect(clients.length).toBe(3)\n\n  unwatch()\n})\n"
  },
  {
    "path": "packages/core/src/actions/watchClient.ts",
    "content": "import type { Config } from '../createConfig.js'\nimport { type GetClientReturnType, getClient } from './getClient.js'\n\nexport type WatchClientParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n> = {\n  onChange(\n    publicClient: GetClientReturnType<config, chainId>,\n    prevClient: GetClientReturnType<config, chainId>,\n  ): void\n}\n\nexport type WatchClientReturnType = () => void\n\n/** https://wagmi.sh/core/api/actions/watchClient */\nexport function watchClient<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n>(\n  config: config,\n  parameters: WatchClientParameters<config, chainId>,\n): WatchClientReturnType {\n  const { onChange } = parameters\n  return config.subscribe(\n    () => getClient(config) as GetClientReturnType<config, chainId>,\n    onChange,\n    {\n      equalityFn(a, b) {\n        return a?.uid === b?.uid\n      },\n    },\n  )\n}\n"
  },
  {
    "path": "packages/core/src/actions/watchConnection.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport type { Address } from 'viem'\nimport { expect, test } from 'vitest'\n\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { watchConnection } from './watchConnection.js'\n\ntest('default', async () => {\n  const connections: { address: Address | undefined; status: string }[] = []\n  const unwatch = watchConnection(config, {\n    onChange(data) {\n      connections.push({ address: data.address, status: data.status })\n    },\n  })\n\n  await connect(config, { connector: config.connectors[0]! })\n  await disconnect(config)\n\n  expect(connections).toMatchInlineSnapshot(`\n      [\n        {\n          \"address\": undefined,\n          \"status\": \"connecting\",\n        },\n        {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"status\": \"connected\",\n        },\n        {\n          \"address\": undefined,\n          \"status\": \"disconnected\",\n        },\n      ]\n    `)\n\n  unwatch()\n})\n"
  },
  {
    "path": "packages/core/src/actions/watchConnection.ts",
    "content": "import type { Config } from '../createConfig.js'\nimport { deepEqual } from '../utils/deepEqual.js'\nimport { type GetConnectionReturnType, getConnection } from './getConnection.js'\n\nexport type WatchConnectionParameters<config extends Config = Config> = {\n  onChange(\n    connection: GetConnectionReturnType<config>,\n    prevConnection: GetConnectionReturnType<config>,\n  ): void\n}\n\nexport type WatchConnectionReturnType = () => void\n\n/** https://wagmi.sh/core/api/actions/watchConnection */\nexport function watchConnection<config extends Config>(\n  config: config,\n  parameters: WatchConnectionParameters<config>,\n): WatchConnectionReturnType {\n  const { onChange } = parameters\n\n  return config.subscribe(() => getConnection(config), onChange, {\n    equalityFn(a, b) {\n      const { connector: aConnector, ...aRest } = a\n      const { connector: bConnector, ...bRest } = b\n      return (\n        deepEqual(aRest, bRest) &&\n        // check connector separately\n        aConnector?.id === bConnector?.id &&\n        aConnector?.uid === bConnector?.uid\n      )\n    },\n  })\n}\n"
  },
  {
    "path": "packages/core/src/actions/watchConnections.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport type { Connection } from '../createConfig.js'\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { watchConnections } from './watchConnections.js'\n\ntest('default', async () => {\n  const connections: Connection[][] = []\n  const unwatch = watchConnections(config, {\n    onChange(connection) {\n      connections.push(connection)\n    },\n  })\n\n  const connector = config.connectors[0]!\n  expect(connections).toEqual([])\n  await connect(config, { connector })\n  expect(connections[0]?.length).toEqual(1)\n  await disconnect(config, { connector })\n  expect(connections[1]).toEqual([])\n\n  unwatch()\n})\n"
  },
  {
    "path": "packages/core/src/actions/watchConnections.ts",
    "content": "import type { Config } from '../createConfig.js'\nimport { deepEqual } from '../utils/deepEqual.js'\nimport {\n  type GetConnectionsReturnType,\n  getConnections,\n} from './getConnections.js'\n\nexport type WatchConnectionsParameters = {\n  onChange(\n    connections: GetConnectionsReturnType,\n    prevConnections: GetConnectionsReturnType,\n  ): void\n}\n\nexport type WatchConnectionsReturnType = () => void\n\n/** https://wagmi.sh/core/api/actions/watchConnections */\nexport function watchConnections(\n  config: Config,\n  parameters: WatchConnectionsParameters,\n): WatchConnectionsReturnType {\n  const { onChange } = parameters\n  return config.subscribe(() => getConnections(config), onChange, {\n    equalityFn: deepEqual,\n  })\n}\n"
  },
  {
    "path": "packages/core/src/actions/watchConnectors.test.ts",
    "content": "import { accounts, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { mock } from '../connectors/mock.js'\nimport type { Connector } from '../createConfig.js'\nimport { watchConnectors } from './watchConnectors.js'\n\ntest('default', async () => {\n  const connectors: (readonly Connector[])[] = []\n  const unwatch = watchConnectors(config, {\n    onChange(connector) {\n      connectors.push(connector)\n    },\n  })\n\n  const count = config.connectors.length\n  expect(config.connectors).toEqual(config.connectors)\n\n  config._internal.connectors.setState(() => [\n    ...config.connectors,\n    config._internal.connectors.setup(mock({ accounts })),\n  ])\n\n  expect(config.connectors.length).toBe(count + 1)\n\n  unwatch()\n})\n"
  },
  {
    "path": "packages/core/src/actions/watchConnectors.ts",
    "content": "import type { Config } from '../createConfig.js'\nimport type { GetConnectorsReturnType } from './getConnectors.js'\n\nexport type WatchConnectorsParameters<config extends Config = Config> = {\n  onChange(\n    connections: GetConnectorsReturnType<config>,\n    prevConnectors: GetConnectorsReturnType<config>,\n  ): void\n}\n\nexport type WatchConnectorsReturnType = () => void\n\n/** https://wagmi.sh/core/api/actions/watchConnectors */\nexport function watchConnectors<config extends Config>(\n  config: config,\n  parameters: WatchConnectorsParameters<config>,\n): WatchConnectorsReturnType {\n  const { onChange } = parameters\n  return config._internal.connectors.subscribe((connectors, prevConnectors) => {\n    onChange(Object.values(connectors), prevConnectors)\n  })\n}\n"
  },
  {
    "path": "packages/core/src/actions/watchContractEvent.test-d.ts",
    "content": "import { abi, config } from '@wagmi/test'\nimport { http, webSocket } from 'viem'\nimport { mainnet, optimism } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { createConfig } from '../createConfig.js'\nimport {\n  type WatchContractEventParameters,\n  watchContractEvent,\n} from './watchContractEvent.js'\n\ntest('default', () => {\n  watchContractEvent(config, {\n    address: '0x',\n    abi: abi.erc20,\n    eventName: 'Transfer',\n    args: {\n      from: '0x',\n      to: '0x',\n    },\n    onLogs(logs) {\n      expectTypeOf(logs[0]!.eventName).toEqualTypeOf<'Transfer'>()\n      expectTypeOf(logs[0]!.args).toEqualTypeOf<{\n        from?: `0x${string}` | undefined\n        to?: `0x${string}` | undefined\n        value?: bigint | undefined\n      }>()\n    },\n  })\n})\n\ntest('behavior: no eventName', () => {\n  type Result = WatchContractEventParameters<\n    typeof abi.erc20,\n    undefined,\n    true,\n    typeof config\n  >\n  expectTypeOf<Result['args']>().toEqualTypeOf<\n    | {\n        from?: `0x${string}` | `0x${string}`[] | null | undefined\n        to?: `0x${string}` | `0x${string}`[] | null | undefined\n      }\n    | {\n        owner?: `0x${string}` | `0x${string}`[] | null | undefined\n        spender?: `0x${string}` | `0x${string}`[] | null | undefined\n      }\n    | undefined\n  >()\n\n  watchContractEvent(config, {\n    address: '0x',\n    abi: abi.erc20,\n    args: {\n      // TODO: Figure out why this is not working\n      // @ts-ignore\n      from: '0x',\n      to: '0x',\n    },\n    onLogs(logs) {\n      expectTypeOf(logs[0]!.eventName).toEqualTypeOf<'Transfer' | 'Approval'>()\n      expectTypeOf(logs[0]!.args).toEqualTypeOf<\n        | {\n            from?: `0x${string}` | undefined\n            to?: `0x${string}` | undefined\n            value?: bigint | undefined\n          }\n        | {\n            owner?: `0x${string}` | undefined\n            spender?: `0x${string}` | undefined\n            value?: bigint | undefined\n          }\n      >()\n    },\n  })\n})\n\ntest('differing transports', () => {\n  const config = createConfig({\n    chains: [mainnet, optimism],\n    transports: {\n      [mainnet.id]: http(),\n      [optimism.id]: webSocket(),\n    },\n  })\n\n  type Result = WatchContractEventParameters<\n    typeof abi.erc20,\n    'Transfer' | 'Approval',\n    true,\n    typeof config,\n    typeof mainnet.id | typeof optimism.id\n  >\n  expectTypeOf<Result['poll']>().toEqualTypeOf<boolean | undefined>()\n  watchContractEvent(config, {\n    poll: false,\n    address: '0x',\n    abi: abi.erc20,\n    onLogs() {},\n  })\n\n  type Result2 = WatchContractEventParameters<\n    typeof abi.erc20,\n    'Transfer' | 'Approval',\n    true,\n    typeof config,\n    typeof mainnet.id\n  >\n  expectTypeOf<Result2['poll']>().toEqualTypeOf<true | undefined>()\n  watchContractEvent(config, {\n    chainId: mainnet.id,\n    poll: true,\n    address: '0x',\n    abi: abi.erc20,\n    onLogs() {},\n  })\n\n  type Result3 = WatchContractEventParameters<\n    typeof abi.erc20,\n    'Transfer' | 'Approval',\n    true,\n    typeof config,\n    typeof optimism.id\n  >\n  expectTypeOf<Result3['poll']>().toEqualTypeOf<boolean | undefined>()\n  watchContractEvent(config, {\n    chainId: optimism.id,\n    poll: true,\n    address: '0x',\n    abi: abi.erc20,\n    onLogs() {},\n  })\n  watchContractEvent(config, {\n    chainId: optimism.id,\n    poll: false,\n    address: '0x',\n    abi: abi.erc20,\n    onLogs() {},\n  })\n})\n"
  },
  {
    "path": "packages/core/src/actions/watchContractEvent.test.ts",
    "content": "import {\n  abi,\n  accounts,\n  address,\n  config,\n  testClient,\n  transactionHashRegex,\n  wait,\n} from '@wagmi/test'\nimport { createWalletClient, erc20Abi, http, parseEther } from 'viem'\nimport type { WatchEventOnLogsParameter } from 'viem/actions'\nimport { beforeEach, expect, test } from 'vitest'\n\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { readContract } from './readContract.js'\nimport { watchContractEvent } from './watchContractEvent.js'\nimport { writeContract } from './writeContract.js'\n\nconst connector = config.connectors[0]!\n\n// TODO: Some test does not call disconnect after finishing. Remove once fixing it.\nbeforeEach(async () => {\n  if (config.state.current) {\n    const connection = config.state.connections.get(config.state.current)!\n    const connector = connection.connector\n    await disconnect(config, { connector })\n  }\n})\n\ntest('default', async () => {\n  const data = await connect(config, { connector })\n  const connectedAddress = data.accounts[0]\n\n  // impersonate usdc holder account and transfer usdc to connected account\n  await testClient.mainnet.impersonateAccount({ address: address.usdcHolder })\n  await testClient.mainnet.setBalance({\n    address: address.usdcHolder,\n    value: 10000000000000000000000n,\n  })\n  await createWalletClient({\n    account: address.usdcHolder,\n    chain: testClient.mainnet.chain,\n    transport: http(),\n  }).writeContract({\n    address: address.usdc,\n    abi: abi.erc20,\n    functionName: 'transfer',\n    args: [connectedAddress, parseEther('10', 'gwei')],\n  })\n  await testClient.mainnet.mine({ blocks: 1 })\n  await testClient.mainnet.stopImpersonatingAccount({\n    address: address.usdcHolder,\n  })\n\n  const balance = await readContract(config, {\n    address: address.usdc,\n    abi: erc20Abi,\n    functionName: 'balanceOf',\n    args: [connectedAddress],\n  })\n  expect(balance).toBeGreaterThan(0n)\n\n  // start watching transfer events\n  let logs: WatchEventOnLogsParameter = []\n  const unwatch = watchContractEvent(config, {\n    address: address.usdc,\n    abi: abi.erc20,\n    eventName: 'Transfer',\n    onLogs(next) {\n      logs = logs.concat(next)\n    },\n  })\n\n  await writeContract(config, {\n    address: address.usdc,\n    abi: abi.erc20,\n    functionName: 'transfer',\n    args: [accounts[1], parseEther('1', 'gwei')],\n  })\n\n  await writeContract(config, {\n    address: address.usdc,\n    abi: abi.erc20,\n    functionName: 'transfer',\n    args: [accounts[3], parseEther('1', 'gwei')],\n  })\n\n  await testClient.mainnet.mine({ blocks: 1 })\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(1000) // wait for events to be emitted\n\n  unwatch()\n  await wait(100)\n  expect(logs.length).toBe(2)\n  expect(logs[0]?.transactionHash).toMatch(transactionHashRegex)\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/core/src/actions/watchContractEvent.ts",
    "content": "import type {\n  Abi,\n  Chain,\n  ContractEventName,\n  Transport,\n  WebSocketTransport,\n} from 'viem'\nimport {\n  type WatchContractEventParameters as viem_WatchContractEventParameters,\n  type WatchContractEventReturnType as viem_WatchContractEventReturnType,\n  watchContractEvent as viem_watchContractEvent,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { SelectChains } from '../types/chain.js'\nimport type {\n  ChainIdParameter,\n  SyncConnectedChainParameter,\n} from '../types/properties.js'\nimport type { UnionCompute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type WatchContractEventParameters<\n  abi extends Abi | readonly unknown[] = Abi,\n  eventName extends ContractEventName<abi> | undefined = ContractEventName<abi>,\n  strict extends boolean | undefined = undefined,\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  ///\n  chains extends readonly Chain[] = SelectChains<config, chainId>,\n> = {\n  [key in keyof chains]: UnionCompute<\n    viem_WatchContractEventParameters<\n      abi,\n      eventName,\n      strict,\n      config['_internal']['transports'][chains[key]['id']] extends infer transport extends\n        Transport\n        ? Transport extends transport\n          ? WebSocketTransport\n          : transport\n        : WebSocketTransport\n    > &\n      ChainIdParameter<config, chainId> &\n      SyncConnectedChainParameter\n  >\n}[number]\n\nexport type WatchContractEventReturnType = viem_WatchContractEventReturnType\n\n// TODO: wrap in viem's `observe` to avoid duplicate invocations.\n/** https://wagmi.sh/core/api/actions/watchContractEvent */\nexport function watchContractEvent<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  const abi extends Abi | readonly unknown[],\n  eventName extends ContractEventName<abi> | undefined,\n  strict extends boolean | undefined = undefined,\n>(\n  config: config,\n  parameters: WatchContractEventParameters<\n    abi,\n    eventName,\n    strict,\n    config,\n    chainId\n  >,\n) {\n  const { syncConnectedChain = config._internal.syncConnectedChain, ...rest } =\n    parameters\n\n  let unwatch: WatchContractEventReturnType | undefined\n  const listener = (chainId: number | undefined) => {\n    if (unwatch) unwatch()\n\n    const client = config.getClient({ chainId })\n    const action = getAction(\n      client,\n      viem_watchContractEvent,\n      'watchContractEvent',\n    )\n    unwatch = action(rest as unknown as viem_WatchContractEventParameters)\n    return unwatch\n  }\n\n  // set up listener for transaction changes\n  const unlisten = listener(parameters.chainId)\n\n  // set up subscriber for connected chain changes\n  let unsubscribe: (() => void) | undefined\n  if (syncConnectedChain && !parameters.chainId)\n    unsubscribe = config.subscribe(\n      ({ chainId }) => chainId,\n      async (chainId) => listener(chainId),\n    )\n\n  return () => {\n    unlisten?.()\n    unsubscribe?.()\n  }\n}\n"
  },
  {
    "path": "packages/core/src/actions/watchPendingTransactions.test-d.ts",
    "content": "import { http, webSocket } from 'viem'\nimport { mainnet, optimism } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { createConfig } from '../createConfig.js'\nimport {\n  type WatchPendingTransactionsParameters,\n  watchPendingTransactions,\n} from './watchPendingTransactions.js'\n\ntest('differing transports', () => {\n  const config = createConfig({\n    chains: [mainnet, optimism],\n    transports: {\n      [mainnet.id]: http(),\n      [optimism.id]: webSocket(),\n    },\n  })\n\n  type Result = WatchPendingTransactionsParameters<\n    typeof config,\n    typeof mainnet.id | typeof optimism.id\n  >\n  expectTypeOf<Result['poll']>().toEqualTypeOf<boolean | undefined>()\n  watchPendingTransactions(config, {\n    poll: false,\n    onTransactions() {},\n  })\n\n  type Result2 = WatchPendingTransactionsParameters<\n    typeof config,\n    typeof mainnet.id\n  >\n  expectTypeOf<Result2['poll']>().toEqualTypeOf<true | undefined>()\n  watchPendingTransactions(config, {\n    chainId: mainnet.id,\n    poll: true,\n    onTransactions() {},\n  })\n\n  type Result3 = WatchPendingTransactionsParameters<\n    typeof config,\n    typeof optimism.id\n  >\n  expectTypeOf<Result3['poll']>().toEqualTypeOf<boolean | undefined>()\n  watchPendingTransactions(config, {\n    chainId: optimism.id,\n    poll: true,\n    onTransactions() {},\n  })\n  watchPendingTransactions(config, {\n    chainId: optimism.id,\n    poll: false,\n    onTransactions() {},\n  })\n})\n"
  },
  {
    "path": "packages/core/src/actions/watchPendingTransactions.test.ts",
    "content": "import {\n  accounts,\n  config,\n  testClient,\n  transactionHashRegex,\n  wait,\n} from '@wagmi/test'\nimport { parseEther } from 'viem'\nimport type { OnTransactionsParameter } from 'viem/actions'\nimport { expect, test } from 'vitest'\n\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { sendTransaction } from './sendTransaction.js'\nimport { watchPendingTransactions } from './watchPendingTransactions.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  let transactions: OnTransactionsParameter = []\n  const unwatch = watchPendingTransactions(config, {\n    onTransactions(next) {\n      transactions = [...transactions, ...next]\n    },\n  })\n  await wait(500)\n\n  await sendTransaction(config, {\n    to: accounts[1],\n    value: parseEther('1'),\n  })\n  await wait(100)\n\n  await sendTransaction(config, {\n    to: accounts[3],\n    value: parseEther('1'),\n  })\n  await wait(100)\n\n  await testClient.mainnet.mine({ blocks: 1 })\n\n  unwatch()\n  await wait(100)\n  expect(transactions.length).toBe(2)\n  expect(transactions[0]).toMatch(transactionHashRegex)\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/core/src/actions/watchPendingTransactions.ts",
    "content": "import type { Chain, Transport, WebSocketTransport } from 'viem'\nimport {\n  type WatchPendingTransactionsParameters as viem_WatchPendingTransactionsParameters,\n  type WatchPendingTransactionsReturnType as viem_WatchPendingTransactionsReturnType,\n  watchPendingTransactions as viem_watchPendingTransactions,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { SelectChains } from '../types/chain.js'\nimport type {\n  ChainIdParameter,\n  SyncConnectedChainParameter,\n} from '../types/properties.js'\nimport type { UnionCompute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type WatchPendingTransactionsParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  ///\n  chains extends readonly Chain[] = SelectChains<config, chainId>,\n> = {\n  [key in keyof chains]: UnionCompute<\n    viem_WatchPendingTransactionsParameters<\n      config['_internal']['transports'][chains[key]['id']] extends infer transport extends\n        Transport\n        ? Transport extends transport\n          ? WebSocketTransport\n          : transport\n        : WebSocketTransport\n    > &\n      ChainIdParameter<config, chainId> &\n      SyncConnectedChainParameter\n  >\n}[number]\n\nexport type WatchPendingTransactionsReturnType =\n  viem_WatchPendingTransactionsReturnType\n\n// TODO: wrap in viem's `observe` to avoid duplicate invocations.\n/** https://wagmi.sh/core/api/actions/watchPendingTransactions */\nexport function watchPendingTransactions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n>(\n  config: config,\n  parameters: WatchPendingTransactionsParameters<config, chainId>,\n) {\n  const { syncConnectedChain = config._internal.syncConnectedChain, ...rest } =\n    parameters\n\n  let unwatch: WatchPendingTransactionsReturnType | undefined\n  const listener = (chainId: number | undefined) => {\n    if (unwatch) unwatch()\n\n    const client = config.getClient({ chainId })\n    const action = getAction(\n      client,\n      viem_watchPendingTransactions,\n      'watchPendingTransactions',\n    )\n    unwatch = action(rest as viem_WatchPendingTransactionsParameters)\n    return unwatch\n  }\n\n  // set up listener for transaction changes\n  const unlisten = listener(parameters.chainId)\n\n  // set up subscriber for connected chain changes\n  let unsubscribe: (() => void) | undefined\n  if (syncConnectedChain && !parameters.chainId)\n    unsubscribe = config.subscribe(\n      ({ chainId }) => chainId,\n      async (chainId) => listener(chainId),\n    )\n\n  return () => {\n    unlisten?.()\n    unsubscribe?.()\n  }\n}\n"
  },
  {
    "path": "packages/core/src/actions/watchPublicClient.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { watchPublicClient } from './watchPublicClient.js'\n\ntest('default', () => {\n  watchPublicClient(config, {\n    onChange(client) {\n      expectTypeOf(client.chain).toEqualTypeOf<\n        (typeof config)['chains'][number]\n      >()\n      expectTypeOf(client.transport.type).toEqualTypeOf<'http'>()\n    },\n  })\n})\n"
  },
  {
    "path": "packages/core/src/actions/watchPublicClient.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport type { Client } from 'viem'\nimport { expect, test } from 'vitest'\n\nimport { switchChain } from './switchChain.js'\nimport { watchPublicClient } from './watchPublicClient.js'\n\ntest('default', async () => {\n  const clients: Client[] = []\n  const unwatch = watchPublicClient(config, {\n    onChange(client) {\n      clients.push(client)\n    },\n  })\n\n  switchChain(config, { chainId: 456 })\n  switchChain(config, { chainId: 10 })\n  switchChain(config, { chainId: 1 })\n\n  expect(clients.length).toBe(3)\n\n  unwatch()\n})\n"
  },
  {
    "path": "packages/core/src/actions/watchPublicClient.ts",
    "content": "import type { Config } from '../createConfig.js'\nimport {\n  type GetPublicClientReturnType,\n  getPublicClient,\n} from './getPublicClient.js'\n\nexport type WatchPublicClientParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n> = {\n  onChange(\n    publicClient: GetPublicClientReturnType<config, chainId>,\n    prevPublicClient: GetPublicClientReturnType<config, chainId>,\n  ): void\n}\n\nexport type WatchPublicClientReturnType = () => void\n\n/** https://wagmi.sh/core/api/actions/watchPublicClient */\nexport function watchPublicClient<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n>(\n  config: config,\n  parameters: WatchPublicClientParameters<config, chainId>,\n): WatchPublicClientReturnType {\n  const { onChange } = parameters\n  return config.subscribe(\n    () => getPublicClient(config) as GetPublicClientReturnType<config, chainId>,\n    onChange,\n    {\n      equalityFn(a, b) {\n        return a?.uid === b?.uid\n      },\n    },\n  )\n}\n"
  },
  {
    "path": "packages/core/src/actions/writeContract.bench-d.ts",
    "content": "import { attest } from '@ark/attest'\nimport type { abi } from '@wagmi/test'\nimport { parseAbi } from 'viem'\nimport viemPackageJson from 'viem/package.json' with { type: 'json' }\nimport { test } from 'vitest'\nimport type { WriteContractParameters } from './writeContract.js'\n\ntest('default', () => {\n  type Result = WriteContractParameters<(typeof abi)['erc20'], 'approve'>\n  const res = {} as Result\n  attest.instantiations([143162, 'instantiations'])\n  attest<readonly [spender: `0x${string}`, amount: bigint]>(res.args)\n  if (viemPackageJson.version.startsWith('2.43'))\n    attest(res.args).type.toString.snap(\n      // biome-ignore lint/style/noUnusedTemplateLiteral: stable\n      `readonly [spender: \\`0x\\${string}\\`, amount: bigint]`,\n    )\n})\n\nconst abiOverload = parseAbi([\n  'function foo() returns (int8)',\n  'function foo(address account) returns (string)',\n  'function foo(address sender, address account) returns ((address foo, address bar))',\n  'function bar() returns (int8)',\n])\ntest('overloads', () => {\n  type Result = WriteContractParameters<typeof abiOverload, 'foo'>\n  const res = {} as Result\n  attest.instantiations([21691, 'instantiations'])\n  attest<\n    | readonly []\n    | readonly [account: `0x${string}`]\n    | readonly [sender: `0x${string}`, account: `0x${string}`]\n    | undefined\n  >(res.args)\n  if (viemPackageJson.version.startsWith('2.43'))\n    attest(res.args).type.toString.snap(`  | readonly []\n  | readonly [account: \\`0x\\${string}\\`]\n  | readonly [sender: \\`0x\\${string}\\`, account: \\`0x\\${string}\\`]\n  | undefined`)\n})\n"
  },
  {
    "path": "packages/core/src/actions/writeContract.test-d.ts",
    "content": "import { abi, config } from '@wagmi/test'\nimport { type Address, http, parseAbi } from 'viem'\nimport { celo, mainnet } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { createConfig } from '../createConfig.js'\nimport { simulateContract } from './simulateContract.js'\nimport { type WriteContractParameters, writeContract } from './writeContract.js'\n\ntest('default', async () => {\n  await writeContract(config, {\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    chainId: 1,\n  })\n})\n\ntest('simulateContract', async () => {\n  const { request } = await simulateContract(config, {\n    account: '0x',\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    chainId: 1,\n  })\n  await writeContract(config, request)\n  await writeContract(config, {\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n  })\n})\n\ntest('chain formatters', () => {\n  const config = createConfig({\n    chains: [mainnet, celo],\n    transports: { [celo.id]: http(), [mainnet.id]: http() },\n  })\n\n  type Result = WriteContractParameters<\n    typeof abi.erc20,\n    'transferFrom',\n    [Address, Address, bigint],\n    typeof config\n  >\n  expectTypeOf<Result>().toMatchTypeOf<{\n    chainId?: typeof celo.id | typeof mainnet.id | undefined\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  writeContract(config, {\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    feeCurrency: '0x',\n  })\n\n  type Result2 = WriteContractParameters<\n    typeof abi.erc20,\n    'transferFrom',\n    [Address, Address, bigint],\n    typeof config,\n    typeof celo.id\n  >\n  expectTypeOf<Result2>().toMatchTypeOf<{\n    functionName: 'approve' | 'transfer' | 'transferFrom'\n    args: readonly [Address, Address, bigint]\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  writeContract(config, {\n    chainId: celo.id,\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    feeCurrency: '0x',\n  })\n\n  type Result3 = WriteContractParameters<\n    typeof abi.erc20,\n    'transferFrom',\n    [Address, Address, bigint],\n    typeof config,\n    typeof mainnet.id\n  >\n  expectTypeOf<Result3>().toMatchTypeOf<{\n    functionName: 'approve' | 'transfer' | 'transferFrom'\n    args: readonly [Address, Address, bigint]\n  }>()\n  expectTypeOf<Result3>().not.toMatchTypeOf<{\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  writeContract(config, {\n    chainId: mainnet.id,\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n})\n\ntest('overloads', async () => {\n  const abi = parseAbi([\n    'function foo() returns (int8)',\n    'function foo(address) returns (string)',\n    'function foo(address, address) returns ((address foo, address bar))',\n    'function bar(uint256) returns (int8)',\n  ])\n\n  type Result = WriteContractParameters<typeof abi, 'foo'>\n  expectTypeOf<Result['functionName']>().toEqualTypeOf<'foo' | 'bar'>()\n  expectTypeOf<Result['args']>().toEqualTypeOf<\n    | readonly []\n    | readonly [`0x${string}`]\n    | readonly [`0x${string}`, `0x${string}`]\n    | undefined\n  >()\n  writeContract(config, {\n    address: '0x',\n    abi,\n    functionName: 'foo',\n  })\n  writeContract(config, {\n    address: '0x',\n    abi,\n    functionName: 'foo',\n    args: ['0x'],\n  })\n  writeContract(config, {\n    address: '0x',\n    abi,\n    functionName: 'foo',\n    args: ['0x', '0x'],\n  })\n  writeContract(config, {\n    address: '0x',\n    abi,\n    functionName: 'foo',\n    // @ts-expect-error\n    args: ['0x', 123n],\n  })\n\n  type Result2 = WriteContractParameters<typeof abi, 'bar'>\n  expectTypeOf<Result2['functionName']>().toEqualTypeOf<'foo' | 'bar'>()\n  expectTypeOf<Result2['args']>().toEqualTypeOf<readonly [bigint]>()\n})\n"
  },
  {
    "path": "packages/core/src/actions/writeContract.ts",
    "content": "import type {\n  Abi,\n  Account,\n  Chain,\n  Client,\n  ContractFunctionArgs,\n  ContractFunctionName,\n} from 'viem'\nimport {\n  type WriteContractErrorType as viem_WriteContractErrorType,\n  type WriteContractParameters as viem_WriteContractParameters,\n  type WriteContractReturnType as viem_WriteContractReturnType,\n  writeContract as viem_writeContract,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { BaseErrorType, ErrorType } from '../errors/base.js'\nimport type { SelectChains } from '../types/chain.js'\nimport type {\n  ChainIdParameter,\n  ConnectorParameter,\n} from '../types/properties.js'\nimport type { Compute, UnionCompute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\nimport {\n  type GetConnectorClientErrorType,\n  getConnectorClient,\n} from './getConnectorClient.js'\n\nexport type WriteContractParameters<\n  abi extends Abi | readonly unknown[] = Abi,\n  functionName extends ContractFunctionName<\n    abi,\n    'nonpayable' | 'payable'\n  > = ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  > = ContractFunctionArgs<abi, 'nonpayable' | 'payable', functionName>,\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  ///\n  allFunctionNames = ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  chains extends readonly Chain[] = SelectChains<config, chainId>,\n> = UnionCompute<\n  {\n    // TODO: Should use `UnionStrictOmit<..., 'chain'>` on `viem_WriteContractParameters` result instead\n    // temp workaround that doesn't affect runtime behavior for https://github.com/wevm/wagmi/issues/3981\n    [key in keyof chains]: viem_WriteContractParameters<\n      abi,\n      functionName,\n      args,\n      chains[key],\n      Account,\n      chains[key],\n      allFunctionNames\n    >\n  }[number] &\n    Compute<ChainIdParameter<config, chainId>> &\n    ConnectorParameter\n>\n\nexport type WriteContractReturnType = viem_WriteContractReturnType\n\nexport type WriteContractErrorType =\n  // getConnectorClient()\n  | GetConnectorClientErrorType\n  // base\n  | BaseErrorType\n  | ErrorType\n  // viem\n  | viem_WriteContractErrorType\n\n/** https://wagmi.sh/core/api/actions/writeContract */\nexport async function writeContract<\n  config extends Config,\n  const abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  >,\n  chainId extends config['chains'][number]['id'],\n>(\n  config: config,\n  parameters: WriteContractParameters<abi, functionName, args, config, chainId>,\n): Promise<WriteContractReturnType> {\n  const { account, chainId, connector, ...request } = parameters\n\n  let client: Client\n  if (typeof account === 'object' && account?.type === 'local')\n    client = config.getClient({ chainId })\n  else\n    client = await getConnectorClient(config, {\n      account: account ?? undefined,\n      assertChainId: false,\n      chainId,\n      connector,\n    })\n\n  const chain = (() => {\n    if (!chainId || client.chain?.id === chainId) return client.chain\n    return { id: chainId }\n  })()\n\n  const action = getAction(client, viem_writeContract, 'writeContract')\n  const hash = await action({\n    ...(request as any),\n    ...(account ? { account } : {}),\n    assertChainId: !!chainId,\n    chain,\n  })\n\n  return hash\n}\n"
  },
  {
    "path": "packages/core/src/actions/writeContractSync.test.ts",
    "content": "import { abi, address, config, testClient, wait } from '@wagmi/test'\nimport { beforeEach, expect, test } from 'vitest'\nimport { connect } from './connect.js'\nimport { disconnect } from './disconnect.js'\nimport { writeContractSync } from './writeContractSync.js'\n\nconst connector = config.connectors[0]!\n\nbeforeEach(async () => {\n  if (config.state.current === connector.uid)\n    await disconnect(config, { connector })\n})\n\ntest('default', async () => {\n  await connect(config, { connector })\n  const [receipt] = await Promise.all([\n    writeContractSync(config, {\n      abi: abi.wagmiMintExample,\n      address: address.wagmiMintExample,\n      functionName: 'mint',\n    }),\n    (async () => {\n      await wait(3000)\n      await testClient.mainnet.mine({ blocks: 1 })\n    })(),\n  ])\n  expect(receipt).toBeDefined()\n  expect(receipt.status).toBe('success')\n  expect(receipt.blockNumber).toBeDefined()\n  await disconnect(config, { connector })\n})\n\ntest('behavior: connector not connected', async () => {\n  await connect(config, { connector })\n  await expect(\n    writeContractSync(config, {\n      connector: config.connectors[1],\n      abi: abi.wagmiMintExample,\n      address: address.wagmiMintExample,\n      functionName: 'mint',\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [ConnectorNotConnectedError: Connector not connected.\n\n    Version: @wagmi/core@x.y.z]\n  `)\n  await disconnect(config, { connector })\n})\n\ntest('behavior: account does not exist on connector', async () => {\n  await connect(config, { connector })\n  await expect(\n    writeContractSync(config, {\n      account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      abi: abi.wagmiMintExample,\n      address: address.wagmiMintExample,\n      functionName: 'mint',\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [ConnectorAccountNotFoundError: Account \"0xA0Cf798816D4b9b9866b5330EEa46a18382f251e\" not found for connector \"Mock Connector\".\n\n    Version: @wagmi/core@x.y.z]\n  `)\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/core/src/actions/writeContractSync.ts",
    "content": "import type {\n  Abi,\n  Account,\n  Chain,\n  Client,\n  ContractFunctionArgs,\n  ContractFunctionName,\n} from 'viem'\nimport {\n  type WriteContractSyncErrorType as viem_WriteContractSyncErrorType,\n  type WriteContractSyncParameters as viem_WriteContractSyncParameters,\n  type WriteContractSyncReturnType as viem_WriteContractSyncReturnType,\n  writeContractSync as viem_writeContractSync,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { BaseErrorType, ErrorType } from '../errors/base.js'\nimport type { SelectChains } from '../types/chain.js'\nimport type {\n  ChainIdParameter,\n  ConnectorParameter,\n} from '../types/properties.js'\nimport type { Compute, UnionCompute } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\nimport {\n  type GetConnectorClientErrorType,\n  getConnectorClient,\n} from './getConnectorClient.js'\n\nexport type WriteContractSyncParameters<\n  abi extends Abi | readonly unknown[] = Abi,\n  functionName extends ContractFunctionName<\n    abi,\n    'nonpayable' | 'payable'\n  > = ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  > = ContractFunctionArgs<abi, 'nonpayable' | 'payable', functionName>,\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  ///\n  chains extends readonly Chain[] = SelectChains<config, chainId>,\n> = UnionCompute<\n  {\n    [key in keyof chains]: viem_WriteContractSyncParameters<\n      abi,\n      functionName,\n      args,\n      chains[key],\n      Account,\n      chains[key]\n    >\n  }[number] &\n    Compute<ChainIdParameter<config, chainId>> &\n    ConnectorParameter\n>\n\nexport type WriteContractSyncReturnType = viem_WriteContractSyncReturnType\n\nexport type WriteContractSyncErrorType =\n  // getConnectorClient()\n  | GetConnectorClientErrorType\n  // base\n  | BaseErrorType\n  | ErrorType\n  // viem\n  | viem_WriteContractSyncErrorType\n\n/** https://wagmi.sh/core/api/actions/writeContractSync */\nexport async function writeContractSync<\n  config extends Config,\n  const abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  >,\n  chainId extends config['chains'][number]['id'],\n>(\n  config: config,\n  parameters: WriteContractSyncParameters<\n    abi,\n    functionName,\n    args,\n    config,\n    chainId\n  >,\n): Promise<WriteContractSyncReturnType> {\n  const { account, chainId, connector, ...request } = parameters\n\n  let client: Client\n  if (typeof account === 'object' && account?.type === 'local')\n    client = config.getClient({ chainId })\n  else\n    client = await getConnectorClient(config, {\n      account: account ?? undefined,\n      assertChainId: false,\n      chainId,\n      connector,\n    })\n\n  const chain = (() => {\n    if (!chainId || client.chain?.id === chainId) return client.chain\n    return { id: chainId }\n  })()\n\n  const action = getAction(client, viem_writeContractSync, 'writeContractSync')\n  const receipt = await action({\n    ...(request as any),\n    ...(account ? { account } : {}),\n    assertChainId: !!chainId,\n    chain,\n  })\n\n  return receipt\n}\n"
  },
  {
    "path": "packages/core/src/connectors/createConnector.test.ts",
    "content": "import { test } from 'vitest'\nimport { createConnector } from './createConnector.js'\n\ntest('default', () => {\n  createConnector(() => {\n    return {\n      id: 'test',\n      name: 'Test Connector',\n      type: 'test',\n      async setup() {},\n      async connect() {\n        return { accounts: [] as never, chainId: 123 }\n      },\n      async disconnect() {},\n      async getAccounts() {\n        return []\n      },\n      async getChainId() {\n        return 123\n      },\n      async isAuthorized() {\n        return true\n      },\n      onAccountsChanged() {},\n      onChainChanged() {},\n      async onDisconnect(_error) {},\n      async getProvider() {},\n    }\n  })\n})\n"
  },
  {
    "path": "packages/core/src/connectors/createConnector.ts",
    "content": "import type {\n  AddEthereumChainParameter,\n  Address,\n  Chain,\n  Client,\n  ProviderConnectInfo,\n  ProviderMessage,\n} from 'viem'\n\nimport type { Transport } from '../createConfig.js'\nimport type { Emitter } from '../createEmitter.js'\nimport type { Storage } from '../createStorage.js'\nimport type { Compute, ExactPartial, StrictOmit } from '../types/utils.js'\n\nexport type ConnectorEventMap = {\n  change: {\n    accounts?: readonly Address[] | undefined\n    chainId?: number | undefined\n  }\n  connect: { accounts: readonly Address[]; chainId: number }\n  disconnect: never\n  error: { error: Error }\n  message: { type: string; data?: unknown | undefined }\n}\n\nexport type CreateConnectorFn<\n  provider = unknown,\n  properties extends Record<string, unknown> = Record<string, unknown>,\n  storageItem extends Record<string, unknown> = Record<string, unknown>,\n> = (config: {\n  chains: readonly [Chain, ...Chain[]]\n  emitter: Emitter<ConnectorEventMap>\n  storage?: Compute<Storage<storageItem>> | null | undefined\n  transports?: Record<number, Transport> | undefined\n}) => Compute<\n  {\n    readonly icon?: string | undefined\n    readonly id: string\n    readonly name: string\n    readonly rdns?: string | readonly string[] | undefined\n    readonly type: string\n\n    setup?(): Promise<void>\n    // TODO(v3): Make `withCapabilities: true` default behavior\n    connect<withCapabilities extends boolean = false>(\n      parameters?:\n        | {\n            chainId?: number | undefined\n            isReconnecting?: boolean | undefined\n            withCapabilities?: withCapabilities | boolean | undefined\n          }\n        | undefined,\n    ): Promise<{\n      // TODO(v3): Add `capabilities` (e.g. `readonly { address: Address; capabilities: Record<string, unknown> | undefined }`)\n      accounts: withCapabilities extends true\n        ? readonly { address: Address; capabilities: Record<string, unknown> }[]\n        : readonly Address[]\n      chainId: number\n    }>\n    disconnect(): Promise<void>\n    getAccounts(): Promise<readonly Address[]>\n    getChainId(): Promise<number>\n    getProvider(\n      parameters?: { chainId?: number | undefined } | undefined,\n    ): Promise<provider>\n    getClient?(\n      parameters?: { chainId?: number | undefined } | undefined,\n    ): Promise<Client>\n    isAuthorized(): Promise<boolean>\n    switchChain?(\n      parameters: Compute<{\n        addEthereumChainParameter?:\n          | ExactPartial<StrictOmit<AddEthereumChainParameter, 'chainId'>>\n          | undefined\n        chainId: number\n      }>,\n    ): Promise<Chain>\n\n    onAccountsChanged(accounts: string[]): void\n    onChainChanged(chainId: string): void\n    onConnect?(connectInfo: ProviderConnectInfo): void\n    onDisconnect(error?: Error | undefined): void\n    onMessage?(message: ProviderMessage): void\n  } & properties\n>\n\nexport function createConnector<\n  provider,\n  properties extends Record<string, unknown> = Record<string, unknown>,\n  storageItem extends Record<string, unknown> = Record<string, unknown>,\n  ///\n  createConnectorFn extends CreateConnectorFn<\n    provider,\n    properties,\n    storageItem\n  > = CreateConnectorFn<provider, properties, storageItem>,\n>(createConnectorFn: createConnectorFn) {\n  return createConnectorFn\n}\n"
  },
  {
    "path": "packages/core/src/connectors/injected.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { injected } from './injected.js'\n\ntest('setup', () => {\n  const connectorFn = injected()\n  const connector = config._internal.connectors.setup(connectorFn)\n  expect(connector.name).toEqual('Injected')\n})\n\ntest.each([\n  { wallet: undefined, expected: 'Injected' },\n  { wallet: 'coinbaseWallet', expected: 'Coinbase Wallet' },\n  { wallet: 'metaMask', expected: 'MetaMask' },\n  { wallet: 'phantom', expected: 'Phantom' },\n  { wallet: 'rainbow', expected: 'Rainbow' },\n] as const satisfies readonly {\n  wallet: string | undefined\n  expected: string\n}[])('injected({ wallet: $wallet })', ({ wallet, expected }) => {\n  const connectorFn = injected({ target: wallet })\n  const connector = config._internal.connectors.setup(connectorFn)\n  expect(connector.name).toEqual(expected)\n})\n"
  },
  {
    "path": "packages/core/src/connectors/injected.ts",
    "content": "import {\n  type AddEthereumChainParameter,\n  type Address,\n  type EIP1193Provider,\n  getAddress,\n  numberToHex,\n  type ProviderConnectInfo,\n  type ProviderRpcError,\n  ResourceUnavailableRpcError,\n  type RpcError,\n  SwitchChainError,\n  UserRejectedRequestError,\n  withRetry,\n  withTimeout,\n} from 'viem'\n\nimport type { Connector } from '../createConfig.js'\nimport { ChainNotConfiguredError } from '../errors/config.js'\nimport { ProviderNotFoundError } from '../errors/connector.js'\nimport type { Compute } from '../types/utils.js'\nimport { createConnector } from './createConnector.js'\n\nexport type InjectedParameters = {\n  /**\n   * Some injected providers do not support programmatic disconnect.\n   * This flag simulates the disconnect behavior by keeping track of connection status in storage.\n   * @default true\n   */\n  shimDisconnect?: boolean | undefined\n  /**\n   * [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193) Ethereum Provider to target\n   */\n  target?: TargetId | Target | (() => Target | undefined) | undefined\n  unstable_shimAsyncInject?: boolean | number | undefined\n}\n\ninjected.type = 'injected' as const\nexport function injected(parameters: InjectedParameters = {}) {\n  const { shimDisconnect = true, unstable_shimAsyncInject } = parameters\n\n  function getTarget(): Compute<Target & { id: string }> {\n    const target = parameters.target\n    if (typeof target === 'function') {\n      const result = target()\n      if (result) return result\n    }\n\n    if (typeof target === 'object') return target\n\n    if (typeof target === 'string')\n      return {\n        ...(targetMap[target as keyof typeof targetMap] ?? {\n          id: target,\n          name: `${target[0]!.toUpperCase()}${target.slice(1)}`,\n          provider: `is${target[0]!.toUpperCase()}${target.slice(1)}`,\n        }),\n      }\n\n    return {\n      id: 'injected',\n      name: 'Injected',\n      provider(window) {\n        return window?.ethereum\n      },\n    }\n  }\n\n  type Provider = WalletProvider | undefined\n  type Properties = {\n    onConnect(connectInfo: ProviderConnectInfo): void\n  }\n  type StorageItem = {\n    [_ in 'injected.connected' | `${string}.disconnected`]: true\n  }\n\n  let accountsChanged: Connector['onAccountsChanged'] | undefined\n  let chainChanged: Connector['onChainChanged'] | undefined\n  let connect: Connector['onConnect'] | undefined\n  let disconnect: Connector['onDisconnect'] | undefined\n\n  return createConnector<Provider, Properties, StorageItem>((config) => ({\n    get icon() {\n      return getTarget().icon\n    },\n    get id() {\n      return getTarget().id\n    },\n    get name() {\n      return getTarget().name\n    },\n    type: injected.type,\n    async setup() {\n      const provider = await this.getProvider()\n      // Only start listening for events if `target` is set, otherwise `injected()` will also receive events\n      if (provider?.on && parameters.target) {\n        if (!connect) {\n          connect = this.onConnect.bind(this)\n          provider.on('connect', connect)\n        }\n\n        // We shouldn't need to listen for `'accountsChanged'` here since the `'connect'` event should suffice (and wallet shouldn't be connected yet).\n        // Some wallets, like MetaMask, do not implement the `'connect'` event and overload `'accountsChanged'` instead.\n        if (!accountsChanged) {\n          accountsChanged = this.onAccountsChanged.bind(this)\n          provider.on('accountsChanged', accountsChanged)\n        }\n      }\n    },\n    async connect({ chainId, isReconnecting, withCapabilities } = {}) {\n      const provider = await this.getProvider()\n      if (!provider) throw new ProviderNotFoundError()\n\n      let accounts: readonly Address[] = []\n      if (isReconnecting) accounts = await this.getAccounts().catch(() => [])\n      else if (shimDisconnect) {\n        // Attempt to show another prompt for selecting account if `shimDisconnect` flag is enabled\n        try {\n          const permissions = await provider.request({\n            method: 'wallet_requestPermissions',\n            params: [{ eth_accounts: {} }],\n          })\n          accounts = (permissions[0]?.caveats?.[0]?.value as string[])?.map(\n            (x) => getAddress(x),\n          )\n          // `'wallet_requestPermissions'` can return a different order of accounts than `'eth_accounts'`\n          // switch to `'eth_accounts'` ordering if more than one account is connected\n          // https://github.com/wevm/wagmi/issues/4140\n          if (accounts.length > 0) {\n            const sortedAccounts = await this.getAccounts()\n            accounts = sortedAccounts\n          }\n        } catch (err) {\n          const error = err as RpcError\n          // Not all injected providers support `wallet_requestPermissions` (e.g. MetaMask iOS).\n          // Only bubble up error if user rejects request\n          if (error.code === UserRejectedRequestError.code)\n            throw new UserRejectedRequestError(error)\n          // Or prompt is already open\n          if (error.code === ResourceUnavailableRpcError.code) throw error\n        }\n      }\n\n      try {\n        if (!accounts?.length && !isReconnecting) {\n          const requestedAccounts = await provider.request({\n            method: 'eth_requestAccounts',\n          })\n          accounts = requestedAccounts.map((x) => getAddress(x))\n        }\n\n        // Manage EIP-1193 event listeners\n        // https://eips.ethereum.org/EIPS/eip-1193#events\n        if (connect) {\n          provider.removeListener('connect', connect)\n          connect = undefined\n        }\n        if (!accountsChanged) {\n          accountsChanged = this.onAccountsChanged.bind(this)\n          provider.on('accountsChanged', accountsChanged)\n        }\n        if (!chainChanged) {\n          chainChanged = this.onChainChanged.bind(this)\n          provider.on('chainChanged', chainChanged)\n        }\n        if (!disconnect) {\n          disconnect = this.onDisconnect.bind(this)\n          provider.on('disconnect', disconnect)\n        }\n\n        // Switch to chain if provided\n        let currentChainId = await this.getChainId()\n        if (chainId && currentChainId !== chainId) {\n          const chain = await this.switchChain!({ chainId }).catch((error) => {\n            if (error.code === UserRejectedRequestError.code) throw error\n            return { id: currentChainId }\n          })\n          currentChainId = chain?.id ?? currentChainId\n        }\n\n        // Remove disconnected shim if it exists\n        if (shimDisconnect)\n          await config.storage?.removeItem(`${this.id}.disconnected`)\n\n        // Add connected shim if no target exists\n        if (!parameters.target)\n          await config.storage?.setItem('injected.connected', true)\n\n        return {\n          accounts: (withCapabilities\n            ? accounts.map((address) => ({ address, capabilities: {} }))\n            : accounts) as never,\n          chainId: currentChainId,\n        }\n      } catch (err) {\n        const error = err as RpcError\n        if (error.code === UserRejectedRequestError.code)\n          throw new UserRejectedRequestError(error)\n        if (error.code === ResourceUnavailableRpcError.code)\n          throw new ResourceUnavailableRpcError(error)\n        throw error\n      }\n    },\n    async disconnect() {\n      const provider = await this.getProvider()\n      if (!provider) throw new ProviderNotFoundError()\n\n      // Manage EIP-1193 event listeners\n      if (chainChanged) {\n        provider.removeListener('chainChanged', chainChanged)\n        chainChanged = undefined\n      }\n      if (disconnect) {\n        provider.removeListener('disconnect', disconnect)\n        disconnect = undefined\n      }\n      if (!connect) {\n        connect = this.onConnect.bind(this)\n        provider.on('connect', connect)\n      }\n\n      // Experimental support for MetaMask disconnect\n      // https://github.com/MetaMask/metamask-improvement-proposals/blob/main/MIPs/mip-2.md\n      try {\n        // Adding timeout as not all wallets support this method and can hang\n        // https://github.com/wevm/wagmi/issues/4064\n        await withTimeout(\n          () =>\n            // TODO: Remove explicit type for viem@3\n            provider.request<{\n              Method: 'wallet_revokePermissions'\n              Parameters: [permissions: { eth_accounts: Record<string, any> }]\n              ReturnType: null\n            }>({\n              // `'wallet_revokePermissions'` added in `viem@2.10.3`\n              method: 'wallet_revokePermissions',\n              params: [{ eth_accounts: {} }],\n            }),\n          { timeout: 100 },\n        )\n      } catch {}\n\n      // Add shim signalling connector is disconnected\n      if (shimDisconnect) {\n        await config.storage?.setItem(`${this.id}.disconnected`, true)\n      }\n\n      if (!parameters.target)\n        await config.storage?.removeItem('injected.connected')\n    },\n    async getAccounts() {\n      const provider = await this.getProvider()\n      if (!provider) throw new ProviderNotFoundError()\n      const accounts = await provider.request({ method: 'eth_accounts' })\n      return accounts.map((x) => getAddress(x))\n    },\n    async getChainId() {\n      const provider = await this.getProvider()\n      if (!provider) throw new ProviderNotFoundError()\n      const hexChainId = await provider.request({ method: 'eth_chainId' })\n      return Number(hexChainId)\n    },\n    async getProvider() {\n      if (typeof window === 'undefined') return undefined\n\n      let provider: Provider\n      const target = getTarget()\n      if (typeof target.provider === 'function')\n        provider = target.provider(window as Window | undefined)\n      else if (typeof target.provider === 'string')\n        provider = findProvider(window, target.provider)\n      else provider = target.provider\n\n      // Some wallets do not conform to EIP-1193 (e.g. Trust Wallet)\n      // https://github.com/wevm/wagmi/issues/3526#issuecomment-1912683002\n      if (provider && !provider.removeListener) {\n        // Try using `off` handler if it exists, otherwise noop\n        if ('off' in provider && typeof provider.off === 'function')\n          provider.removeListener =\n            provider.off as typeof provider.removeListener\n        else provider.removeListener = () => {}\n      }\n\n      return provider\n    },\n    async isAuthorized() {\n      try {\n        const isDisconnected =\n          shimDisconnect &&\n          // If shim exists in storage, connector is disconnected\n          (await config.storage?.getItem(`${this.id}.disconnected`))\n        if (isDisconnected) return false\n\n        // Don't allow injected connector to connect if no target is set and it hasn't already connected\n        // (e.g. flag in storage is not set). This prevents a targetless injected connector from connecting\n        // automatically whenever there is a targeted connector configured.\n        if (!parameters.target) {\n          const connected = await config.storage?.getItem('injected.connected')\n          if (!connected) return false\n        }\n\n        const provider = await this.getProvider()\n        if (!provider) {\n          if (\n            unstable_shimAsyncInject !== undefined &&\n            unstable_shimAsyncInject !== false\n          ) {\n            // If no provider is found, check for async injection\n            // https://github.com/wevm/references/issues/167\n            // https://github.com/MetaMask/detect-provider\n            const handleEthereum = async () => {\n              if (typeof window !== 'undefined')\n                window.removeEventListener(\n                  'ethereum#initialized',\n                  handleEthereum,\n                )\n              const provider = await this.getProvider()\n              return !!provider\n            }\n            const timeout =\n              typeof unstable_shimAsyncInject === 'number'\n                ? unstable_shimAsyncInject\n                : 1_000\n            const res = await Promise.race([\n              ...(typeof window !== 'undefined'\n                ? [\n                    new Promise<boolean>((resolve) =>\n                      window.addEventListener(\n                        'ethereum#initialized',\n                        () => resolve(handleEthereum()),\n                        { once: true },\n                      ),\n                    ),\n                  ]\n                : []),\n              new Promise<boolean>((resolve) =>\n                setTimeout(() => resolve(handleEthereum()), timeout),\n              ),\n            ])\n            if (res) return true\n          }\n\n          throw new ProviderNotFoundError()\n        }\n\n        // Use retry strategy as some injected wallets (e.g. MetaMask) fail to\n        // immediately resolve JSON-RPC requests on page load.\n        const accounts = await withRetry(() => this.getAccounts())\n        return !!accounts.length\n      } catch {\n        return false\n      }\n    },\n    async switchChain({ addEthereumChainParameter, chainId }) {\n      const provider = await this.getProvider()\n      if (!provider) throw new ProviderNotFoundError()\n\n      const chain = config.chains.find((x) => x.id === chainId)\n      if (!chain) throw new SwitchChainError(new ChainNotConfiguredError())\n\n      const promise = new Promise<void>((resolve) => {\n        const listener = ((data) => {\n          if ('chainId' in data && data.chainId === chainId) {\n            config.emitter.off('change', listener)\n            resolve()\n          }\n        }) satisfies Parameters<typeof config.emitter.on>[1]\n        config.emitter.on('change', listener)\n      })\n\n      try {\n        await Promise.all([\n          provider\n            .request({\n              method: 'wallet_switchEthereumChain',\n              params: [{ chainId: numberToHex(chainId) }],\n            })\n            // During `'wallet_switchEthereumChain'`, MetaMask makes a `'net_version'` RPC call to the target chain.\n            // If this request fails, MetaMask does not emit the `'chainChanged'` event, but will still switch the chain.\n            // To counter this behavior, we request and emit the current chain ID to confirm the chain switch either via\n            // this callback or an externally emitted `'chainChanged'` event.\n            // https://github.com/MetaMask/metamask-extension/issues/24247\n            .then(async () => {\n              const currentChainId = await this.getChainId()\n              if (currentChainId === chainId)\n                config.emitter.emit('change', { chainId })\n            }),\n          promise,\n        ])\n        return chain\n      } catch (err) {\n        const error = err as RpcError\n\n        // Indicates chain is not added to provider\n        if (\n          error.code === 4902 ||\n          // Unwrapping for MetaMask Mobile\n          // https://github.com/MetaMask/metamask-mobile/issues/2944#issuecomment-976988719\n          (error as ProviderRpcError<{ originalError?: { code: number } }>)\n            ?.data?.originalError?.code === 4902\n        ) {\n          try {\n            const { default: blockExplorer, ...blockExplorers } =\n              chain.blockExplorers ?? {}\n            let blockExplorerUrls: string[] | undefined\n            if (addEthereumChainParameter?.blockExplorerUrls)\n              blockExplorerUrls = addEthereumChainParameter.blockExplorerUrls\n            else if (blockExplorer)\n              blockExplorerUrls = [\n                blockExplorer.url,\n                ...Object.values(blockExplorers).map((x) => x.url),\n              ]\n\n            let rpcUrls: readonly string[]\n            if (addEthereumChainParameter?.rpcUrls?.length)\n              rpcUrls = addEthereumChainParameter.rpcUrls\n            else rpcUrls = [chain.rpcUrls.default?.http[0] ?? '']\n\n            const addEthereumChain = {\n              blockExplorerUrls,\n              chainId: numberToHex(chainId),\n              chainName: addEthereumChainParameter?.chainName ?? chain.name,\n              iconUrls: addEthereumChainParameter?.iconUrls,\n              nativeCurrency:\n                addEthereumChainParameter?.nativeCurrency ??\n                chain.nativeCurrency,\n              rpcUrls,\n            } satisfies AddEthereumChainParameter\n\n            await Promise.all([\n              provider\n                .request({\n                  method: 'wallet_addEthereumChain',\n                  params: [addEthereumChain],\n                })\n                .then(async () => {\n                  const currentChainId = await this.getChainId()\n                  if (currentChainId === chainId)\n                    config.emitter.emit('change', { chainId })\n                  else\n                    throw new UserRejectedRequestError(\n                      new Error('User rejected switch after adding network.'),\n                    )\n                }),\n              promise,\n            ])\n\n            return chain\n          } catch (error) {\n            throw new UserRejectedRequestError(error as Error)\n          }\n        }\n\n        if (error.code === UserRejectedRequestError.code)\n          throw new UserRejectedRequestError(error)\n        throw new SwitchChainError(error)\n      }\n    },\n    async onAccountsChanged(accounts) {\n      // Disconnect if there are no accounts\n      if (accounts.length === 0) this.onDisconnect()\n      // Connect if emitter is listening for connect event (e.g. is disconnected and connects through wallet interface)\n      else if (config.emitter.listenerCount('connect')) {\n        const chainId = (await this.getChainId()).toString()\n        this.onConnect({ chainId })\n        // Remove disconnected shim if it exists\n        if (shimDisconnect)\n          await config.storage?.removeItem(`${this.id}.disconnected`)\n      }\n      // Regular change event\n      else\n        config.emitter.emit('change', {\n          accounts: accounts.map((x) => getAddress(x)),\n        })\n    },\n    onChainChanged(chain) {\n      const chainId = Number(chain)\n      config.emitter.emit('change', { chainId })\n    },\n    async onConnect(connectInfo) {\n      const accounts = await this.getAccounts()\n      if (accounts.length === 0) return\n\n      const chainId = Number(connectInfo.chainId)\n      config.emitter.emit('connect', { accounts, chainId })\n\n      // Manage EIP-1193 event listeners\n      const provider = await this.getProvider()\n      if (provider) {\n        if (connect) {\n          provider.removeListener('connect', connect)\n          connect = undefined\n        }\n        if (!accountsChanged) {\n          accountsChanged = this.onAccountsChanged.bind(this)\n          provider.on('accountsChanged', accountsChanged)\n        }\n        if (!chainChanged) {\n          chainChanged = this.onChainChanged.bind(this)\n          provider.on('chainChanged', chainChanged)\n        }\n        if (!disconnect) {\n          disconnect = this.onDisconnect.bind(this)\n          provider.on('disconnect', disconnect)\n        }\n      }\n    },\n    async onDisconnect(error) {\n      const provider = await this.getProvider()\n\n      // If MetaMask emits a `code: 1013` error, wait for reconnection before disconnecting\n      // https://github.com/MetaMask/providers/pull/120\n      if (error && (error as RpcError<1013>).code === 1013) {\n        if (provider && !!(await this.getAccounts()).length) return\n      }\n\n      // No need to remove `${this.id}.disconnected` from storage because `onDisconnect` is typically\n      // only called when the wallet is disconnected through the wallet's interface, meaning the wallet\n      // actually disconnected and we don't need to simulate it.\n      config.emitter.emit('disconnect')\n\n      // Manage EIP-1193 event listeners\n      if (provider) {\n        if (chainChanged) {\n          provider.removeListener('chainChanged', chainChanged)\n          chainChanged = undefined\n        }\n        if (disconnect) {\n          provider.removeListener('disconnect', disconnect)\n          disconnect = undefined\n        }\n        if (!connect) {\n          connect = this.onConnect.bind(this)\n          provider.on('connect', connect)\n        }\n      }\n    },\n  }))\n}\n\nconst targetMap = {\n  coinbaseWallet: {\n    id: 'coinbaseWallet',\n    name: 'Coinbase Wallet',\n    provider(window) {\n      if (window?.coinbaseWalletExtension) return window.coinbaseWalletExtension\n      return findProvider(window, 'isCoinbaseWallet')\n    },\n  },\n  metaMask: {\n    id: 'metaMask',\n    name: 'MetaMask',\n    provider(window) {\n      return findProvider(window, (provider) => {\n        if (!provider.isMetaMask) return false\n        // Brave tries to make itself look like MetaMask\n        // Could also try RPC `web3_clientVersion` if following is unreliable\n        if (provider.isBraveWallet && !provider._events && !provider._state)\n          return false\n        // Other wallets that try to look like MetaMask\n        const flags = [\n          'isApexWallet',\n          'isAvalanche',\n          'isBitKeep',\n          'isBlockWallet',\n          'isKuCoinWallet',\n          'isMathWallet',\n          'isOkxWallet',\n          'isOKExWallet',\n          'isOneInchIOSWallet',\n          'isOneInchAndroidWallet',\n          'isOpera',\n          'isPhantom',\n          'isPortal',\n          'isRabby',\n          'isTokenPocket',\n          'isTokenary',\n          'isUniswapWallet',\n          'isZerion',\n        ] satisfies WalletProviderFlags[]\n        for (const flag of flags) if (provider[flag]) return false\n        return true\n      })\n    },\n  },\n  phantom: {\n    id: 'phantom',\n    name: 'Phantom',\n    provider(window) {\n      if (window?.phantom?.ethereum) return window.phantom?.ethereum\n      return findProvider(window, 'isPhantom')\n    },\n  },\n} as const satisfies TargetMap\n\ntype TargetMap = { [_ in TargetId]?: Target | undefined }\n\ntype Target = {\n  icon?: string | undefined\n  id: string\n  name: string\n  provider:\n    | WalletProviderFlags\n    | WalletProvider\n    | ((window?: Window | undefined) => WalletProvider | undefined)\n}\n\n/** @deprecated */\ntype TargetId = Compute<WalletProviderFlags> extends `is${infer name}`\n  ? name extends `${infer char}${infer rest}`\n    ? `${Lowercase<char>}${rest}`\n    : never\n  : never\n\n/**\n * @deprecated As of 2024/10/16, we are no longer accepting new provider flags as EIP-6963 should be used instead.\n */\ntype WalletProviderFlags =\n  | 'isApexWallet'\n  | 'isAvalanche'\n  | 'isBackpack'\n  | 'isBifrost'\n  | 'isBitKeep'\n  | 'isBitski'\n  | 'isBlockWallet'\n  | 'isBraveWallet'\n  | 'isCoinbaseWallet'\n  | 'isDawn'\n  | 'isEnkrypt'\n  | 'isExodus'\n  | 'isFrame'\n  | 'isFrontier'\n  | 'isGamestop'\n  | 'isHyperPay'\n  | 'isImToken'\n  | 'isKuCoinWallet'\n  | 'isMathWallet'\n  | 'isMetaMask'\n  | 'isOkxWallet'\n  | 'isOKExWallet'\n  | 'isOneInchAndroidWallet'\n  | 'isOneInchIOSWallet'\n  | 'isOpera'\n  | 'isPhantom'\n  | 'isPortal'\n  | 'isRabby'\n  | 'isRainbow'\n  | 'isStatus'\n  | 'isTally'\n  | 'isTokenPocket'\n  | 'isTokenary'\n  | 'isTrust'\n  | 'isTrustWallet'\n  | 'isUniswapWallet'\n  | 'isXDEFI'\n  | 'isZerion'\n\ntype WalletProvider = Compute<\n  EIP1193Provider & {\n    [key in WalletProviderFlags]?: true | undefined\n  } & {\n    providers?: WalletProvider[] | undefined\n    /** Only exists in MetaMask as of 2022/04/03 */\n    _events?: { connect?: (() => void) | undefined } | undefined\n    /** Only exists in MetaMask as of 2022/04/03 */\n    _state?:\n      | {\n          accounts?: string[]\n          initialized?: boolean\n          isConnected?: boolean\n          isPermanentlyDisconnected?: boolean\n          isUnlocked?: boolean\n        }\n      | undefined\n  }\n>\n\ntype Window = {\n  coinbaseWalletExtension?: WalletProvider | undefined\n  ethereum?: WalletProvider | undefined\n  phantom?: { ethereum: WalletProvider } | undefined\n}\n\nfunction findProvider(\n  window: globalThis.Window | Window | undefined,\n  select?: WalletProviderFlags | ((provider: WalletProvider) => boolean),\n) {\n  function isProvider(provider: WalletProvider) {\n    if (typeof select === 'function') return select(provider)\n    if (typeof select === 'string') return provider[select]\n    return true\n  }\n\n  const ethereum = (window as Window).ethereum\n  if (ethereum?.providers)\n    return ethereum.providers.find((provider) => isProvider(provider))\n  if (ethereum && isProvider(ethereum)) return ethereum\n  return undefined\n}\n"
  },
  {
    "path": "packages/core/src/connectors/mock.test.ts",
    "content": "import { accounts, config } from '@wagmi/test'\nimport type { Address, Hex } from 'viem'\nimport { expect, expectTypeOf, test } from 'vitest'\nimport type { Connector } from '../createConfig.js'\nimport type { CreateConnectorFn } from './createConnector.js'\nimport { mock } from './mock.js'\n\ntest('setup', () => {\n  const connectorFn = mock({ accounts })\n  const connector = config._internal.connectors.setup(connectorFn)\n  expect(connector.name).toEqual('Mock Connector')\n\n  expectTypeOf<\n    typeof connectorFn extends CreateConnectorFn ? true : false\n  >().toEqualTypeOf<true>()\n  expectTypeOf<\n    typeof connector extends Connector ? true : false\n  >().toEqualTypeOf<true>()\n\n  type ConnectFnParameters = NonNullable<\n    Parameters<(typeof connector)['connect']>[0]\n  >\n  expectTypeOf<ConnectFnParameters['foo']>().toMatchTypeOf<string | undefined>()\n\n  type ConnectFnReturnType = Awaited<ReturnType<(typeof connector)['connect']>>\n  expectTypeOf<ConnectFnReturnType['accounts']>().toMatchTypeOf<\n    | readonly `0x${string}`[]\n    | readonly {\n        address: Address\n        capabilities: {\n          foo: {\n            bar: Hex\n          }\n        }\n      }[]\n  >()\n})\n\ntest('behavior: connect#withCapabilities', async () => {\n  const connectorFn = mock({ accounts })\n  const connector = config._internal.connectors.setup(connectorFn)\n  const res = await connector.connect({ withCapabilities: true })\n  expectTypeOf(res.accounts).toEqualTypeOf<\n    readonly {\n      address: Address\n      capabilities: Record<string, unknown>\n    }[]\n  >()\n  expect(res).toMatchObject(\n    expect.objectContaining({\n      accounts: expect.arrayContaining([\n        expect.objectContaining({ address: expect.any(String) }),\n      ]),\n    }),\n  )\n})\n\ntest('behavior: features.connectError', async () => {\n  const connectorFn = mock({ accounts, features: { connectError: true } })\n  const connector = config._internal.connectors.setup(connectorFn)\n  await expect(() =>\n    connector.connect(),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [UserRejectedRequestError: User rejected the request.\n\n    Details: Failed to connect.\n    Version: viem@2.47.5]\n  `)\n})\n\ntest('behavior: connector.getProvider request errors', async () => {\n  const connectorFn = mock({\n    accounts,\n    features: {\n      signMessageError: true,\n      signTypedDataError: true,\n      switchChainError: true,\n      watchAssetError: true,\n    },\n  })\n  const connector = config._internal.connectors.setup(\n    connectorFn,\n  ) as ReturnType<typeof connectorFn>\n  const provider = await connector.getProvider()\n\n  await expect(\n    provider.request({\n      method: 'eth_signTypedData_v4',\n      params: [] as any,\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [UserRejectedRequestError: User rejected the request.\n\n    Details: Failed to sign typed data.\n    Version: viem@2.47.5]\n  `)\n\n  await expect(\n    provider.request({\n      method: 'wallet_switchEthereumChain',\n      params: [] as any,\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [UserRejectedRequestError: User rejected the request.\n\n    Details: Failed to switch chain.\n    Version: viem@2.47.5]\n  `)\n\n  await expect(\n    provider.request({\n      method: 'wallet_watchAsset',\n      params: [] as any,\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [UserRejectedRequestError: User rejected the request.\n\n    Details: Failed to switch chain.\n    Version: viem@2.47.5]\n  `)\n\n  await expect(\n    provider.request({\n      method: 'personal_sign',\n      params: [] as any,\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [UserRejectedRequestError: User rejected the request.\n\n    Details: Failed to sign message.\n    Version: viem@2.47.5]\n  `)\n})\n\ntest('behavior: reconnect', async () => {\n  const connectorFn = mock({\n    accounts,\n    features: {\n      defaultConnected: true,\n      reconnect: true,\n    },\n  })\n  const connector = config._internal.connectors.setup(connectorFn)\n\n  await expect(connector.isAuthorized()).resolves.toBeTruthy()\n})\n"
  },
  {
    "path": "packages/core/src/connectors/mock.ts",
    "content": "import {\n  type Address,\n  custom,\n  type EIP1193RequestFn,\n  fromHex,\n  getAddress,\n  type Hex,\n  keccak256,\n  numberToHex,\n  RpcRequestError,\n  SwitchChainError,\n  stringToHex,\n  type Transport,\n  UserRejectedRequestError,\n  type WalletCallReceipt,\n  type WalletGetCallsStatusReturnType,\n  type WalletRpcSchema,\n} from 'viem'\nimport { rpc } from 'viem/utils'\n\nimport {\n  ChainNotConfiguredError,\n  ConnectorNotConnectedError,\n} from '../errors/config.js'\nimport { createConnector } from './createConnector.js'\n\nexport type MockParameters = {\n  accounts: readonly [Address, ...Address[]]\n  features?:\n    | {\n        defaultConnected?: boolean | undefined\n        connectError?: boolean | Error | undefined\n        switchChainError?: boolean | Error | undefined\n        signMessageError?: boolean | Error | undefined\n        signTypedDataError?: boolean | Error | undefined\n        reconnect?: boolean | undefined\n        watchAssetError?: boolean | Error | undefined\n      }\n    | undefined\n}\n\nmock.type = 'mock' as const\nexport function mock(parameters: MockParameters) {\n  const transactionCache = new Map<Hex, Hex[]>()\n  const features =\n    parameters.features ??\n    ({ defaultConnected: false } satisfies MockParameters['features'])\n\n  type Provider = ReturnType<\n    Transport<'custom', unknown, EIP1193RequestFn<WalletRpcSchema>>\n  >\n  type Properties = {\n    // TODO(v3): Make `withCapabilities: true` default behavior\n    connect<withCapabilities extends boolean = false>(parameters?: {\n      chainId?: number | undefined\n      isReconnecting?: boolean | undefined\n      foo?: string | undefined\n      withCapabilities?: withCapabilities | boolean | undefined\n    }): Promise<{\n      accounts: withCapabilities extends true\n        ? readonly {\n            address: Address\n            capabilities: {\n              foo: {\n                bar: Hex\n              }\n            }\n          }[]\n        : readonly Address[]\n      chainId: number\n    }>\n  }\n  let connected = features.defaultConnected\n  let connectedChainId: number\n\n  return createConnector<Provider, Properties>((config) => ({\n    id: 'mock',\n    name: 'Mock Connector',\n    type: mock.type,\n    async setup() {\n      connectedChainId = config.chains[0].id\n    },\n    async connect({ chainId, withCapabilities } = {}) {\n      if (features.connectError) {\n        if (typeof features.connectError === 'boolean')\n          throw new UserRejectedRequestError(new Error('Failed to connect.'))\n        throw features.connectError\n      }\n\n      const provider = await this.getProvider()\n      const accounts = await provider.request({\n        method: 'eth_requestAccounts',\n      })\n\n      let currentChainId = await this.getChainId()\n      if (chainId && currentChainId !== chainId) {\n        const chain = await this.switchChain!({ chainId })\n        currentChainId = chain.id\n      }\n\n      connected = true\n\n      return {\n        accounts: (withCapabilities\n          ? accounts.map((x) => ({\n              address: getAddress(x),\n              capabilities: { foo: { bar: x } },\n            }))\n          : accounts.map((x) => getAddress(x))) as never,\n        chainId: currentChainId,\n      }\n    },\n    async disconnect() {\n      connected = false\n    },\n    async getAccounts() {\n      if (!connected) throw new ConnectorNotConnectedError()\n      const provider = await this.getProvider()\n      const accounts = await provider.request({ method: 'eth_accounts' })\n      return accounts.map((x) => getAddress(x))\n    },\n    async getChainId() {\n      const provider = await this.getProvider()\n      const hexChainId = await provider.request({ method: 'eth_chainId' })\n      return fromHex(hexChainId, 'number')\n    },\n    async isAuthorized() {\n      if (!features.reconnect) return false\n      if (!connected) return false\n      const accounts = await this.getAccounts()\n      return !!accounts.length\n    },\n    async switchChain({ chainId }) {\n      const provider = await this.getProvider()\n      const chain = config.chains.find((x) => x.id === chainId)\n      if (!chain) throw new SwitchChainError(new ChainNotConfiguredError())\n\n      await provider.request({\n        method: 'wallet_switchEthereumChain',\n        params: [{ chainId: numberToHex(chainId) }],\n      })\n      return chain\n    },\n    onAccountsChanged(accounts) {\n      if (accounts.length === 0) this.onDisconnect()\n      else\n        config.emitter.emit('change', {\n          accounts: accounts.map((x) => getAddress(x)),\n        })\n    },\n    onChainChanged(chain) {\n      const chainId = Number(chain)\n      config.emitter.emit('change', { chainId })\n    },\n    async onDisconnect(_error) {\n      config.emitter.emit('disconnect')\n      connected = false\n    },\n    async getProvider({ chainId } = {}) {\n      const chain =\n        config.chains.find((x) => x.id === chainId) ?? config.chains[0]\n      const url = chain.rpcUrls.default.http[0]!\n\n      const request: EIP1193RequestFn = async ({ method, params }) => {\n        // eth methods\n        if (method === 'eth_chainId') return numberToHex(connectedChainId)\n        if (method === 'eth_accounts') return parameters.accounts\n        if (method === 'eth_requestAccounts') return parameters.accounts\n        if (method === 'eth_signTypedData_v4')\n          if (features.signTypedDataError) {\n            if (typeof features.signTypedDataError === 'boolean')\n              throw new UserRejectedRequestError(\n                new Error('Failed to sign typed data.'),\n              )\n            throw features.signTypedDataError\n          }\n\n        // wallet methods\n        if (method === 'wallet_switchEthereumChain') {\n          if (features.switchChainError) {\n            if (typeof features.switchChainError === 'boolean')\n              throw new UserRejectedRequestError(\n                new Error('Failed to switch chain.'),\n              )\n            throw features.switchChainError\n          }\n          type Params = [{ chainId: Hex }]\n          connectedChainId = fromHex((params as Params)[0].chainId, 'number')\n          this.onChainChanged(connectedChainId.toString())\n          return\n        }\n\n        if (method === 'wallet_watchAsset') {\n          if (features.watchAssetError) {\n            if (typeof features.watchAssetError === 'boolean')\n              throw new UserRejectedRequestError(\n                new Error('Failed to switch chain.'),\n              )\n            throw features.watchAssetError\n          }\n          return connected\n        }\n\n        if (method === 'wallet_getCapabilities')\n          return {\n            '0x2105': {\n              paymasterService: {\n                supported:\n                  (params as [Hex])[0] ===\n                  '0x95132632579b073D12a6673e18Ab05777a6B86f8',\n              },\n              sessionKeys: {\n                supported: true,\n              },\n            },\n            '0x14A34': {\n              paymasterService: {\n                supported:\n                  (params as [Hex])[0] ===\n                  '0x95132632579b073D12a6673e18Ab05777a6B86f8',\n              },\n            },\n          }\n\n        if (method === 'wallet_sendCalls') {\n          const hashes = []\n          const calls = (params as any)[0].calls\n          const from = (params as any)[0].from\n          for (const call of calls) {\n            const { result, error } = await rpc.http(url, {\n              body: {\n                method: 'eth_sendTransaction',\n                params: [\n                  {\n                    ...call,\n                    ...(typeof from !== 'undefined' ? { from } : {}),\n                  },\n                ],\n              },\n            })\n            if (error)\n              throw new RpcRequestError({\n                body: { method, params },\n                error,\n                url,\n              })\n            hashes.push(result)\n          }\n          const id = keccak256(stringToHex(JSON.stringify(calls)))\n          transactionCache.set(id, hashes)\n          return { id }\n        }\n\n        if (method === 'wallet_getCallsStatus') {\n          const hashes = transactionCache.get((params as any)[0])\n          if (!hashes)\n            return {\n              atomic: false,\n              chainId: '0x1',\n              id: (params as any)[0],\n              status: 100,\n              receipts: [],\n              version: '2.0.0',\n            } satisfies WalletGetCallsStatusReturnType\n\n          const receipts = await Promise.all(\n            hashes.map(async (hash) => {\n              const { result, error } = await rpc.http(url, {\n                body: {\n                  method: 'eth_getTransactionReceipt',\n                  params: [hash],\n                  id: 0,\n                },\n              })\n              if (error)\n                throw new RpcRequestError({\n                  body: { method, params },\n                  error,\n                  url,\n                })\n              if (!result) return null\n              return {\n                blockHash: result.blockHash,\n                blockNumber: result.blockNumber,\n                gasUsed: result.gasUsed,\n                logs: result.logs,\n                status: result.status,\n                transactionHash: result.transactionHash,\n              } satisfies WalletCallReceipt\n            }),\n          )\n          const receipts_ = receipts.filter((x) => x !== null)\n          if (receipts_.length === 0)\n            return {\n              atomic: false,\n              chainId: '0x1',\n              id: (params as any)[0],\n              status: 100,\n              receipts: [],\n              version: '2.0.0',\n            } satisfies WalletGetCallsStatusReturnType\n          return {\n            atomic: false,\n            chainId: '0x1',\n            id: (params as any)[0],\n            status: 200,\n            receipts: receipts_,\n            version: '2.0.0',\n          } satisfies WalletGetCallsStatusReturnType\n        }\n\n        if (method === 'wallet_showCallsStatus') return\n\n        // other methods\n        if (method === 'personal_sign') {\n          if (features.signMessageError) {\n            if (typeof features.signMessageError === 'boolean')\n              throw new UserRejectedRequestError(\n                new Error('Failed to sign message.'),\n              )\n            throw features.signMessageError\n          }\n          // Change `personal_sign` to `eth_sign` and swap params\n          method = 'eth_sign'\n          type Params = [data: Hex, address: Address]\n          params = [(params as Params)[1], (params as Params)[0]]\n        }\n\n        const body = { method, params }\n        const { error, result } = await rpc.http(url, { body })\n        if (error) throw new RpcRequestError({ body, error, url })\n\n        return result\n      }\n      return custom({ request })({ retryCount: 0 })\n    },\n  }))\n}\n"
  },
  {
    "path": "packages/core/src/createConfig.test-d.ts",
    "content": "import { accounts } from '@wagmi/test'\nimport { createClient, http, webSocket } from 'viem'\nimport { mainnet, sepolia } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { mock } from './connectors/mock.js'\nimport { type CreateConfigParameters, createConfig } from './createConfig.js'\n\ntest('high-level config', () => {\n  // Create config without needing to import viem modules.\n  const config = createConfig({\n    cacheTime: 100,\n    chains: [mainnet, sepolia],\n    connectors: [mock({ accounts })],\n    batch: { multicall: true },\n    pollingInterval: { [mainnet.id]: 100 },\n    transports: {\n      [mainnet.id]: webSocket(),\n      [sepolia.id]: http(),\n    },\n  })\n  const client = config.getClient({ chainId: mainnet.id })\n  expectTypeOf(client.chain).toEqualTypeOf(mainnet)\n  expectTypeOf(client.transport.type).toEqualTypeOf<'webSocket'>()\n})\n\ntest('low-level config', () => {\n  // Create a \"multi chain\" config using viem modules.\n  const config = createConfig({\n    chains: [mainnet, sepolia],\n    connectors: [mock({ accounts })],\n    client({ chain }) {\n      return createClient({ chain, transport: http() })\n    },\n  })\n  const client = config.getClient({ chainId: mainnet.id })\n  expectTypeOf(client.chain).toEqualTypeOf(mainnet)\n})\n\ntest('behavior: `chains` must have at least one chain', () => {\n  createConfig({\n    // @ts-expect-error\n    chains: [],\n    connectors: [mock({ accounts })],\n    transports: {\n      [mainnet.id]: http(),\n    },\n  })\n  createConfig({\n    // @ts-expect-error\n    chains: [],\n    connectors: [mock({ accounts })],\n    client: ({ chain }) =>\n      createClient({\n        chain,\n        transport: http(),\n      }),\n  })\n})\n\ntest('behavior: missing transport for chain', () => {\n  createConfig({\n    chains: [mainnet, sepolia],\n    connectors: [mock({ accounts })],\n    // @ts-expect-error\n    transports: {\n      [mainnet.id]: http(),\n    },\n  })\n  createConfig({\n    chains: [mainnet, sepolia],\n    connectors: [mock({ accounts })],\n    transports: {\n      [mainnet.id]: http(),\n      // @ts-expect-error\n      123: http(),\n    },\n  })\n})\n\ntest('behavior: parameters should not include certain client config properties', () => {\n  type Result = keyof CreateConfigParameters\n  expectTypeOf<'account' extends Result ? true : false>().toEqualTypeOf<false>()\n  expectTypeOf<'chain' extends Result ? true : false>().toEqualTypeOf<false>()\n  expectTypeOf<\n    'transport' extends Result ? true : false\n  >().toEqualTypeOf<false>()\n})\n\ntest('infer connectors', () => {\n  const connectorFn = mock({ accounts })\n  const config = createConfig({\n    chains: [mainnet, sepolia],\n    connectors: [connectorFn],\n    transports: {\n      [mainnet.id]: webSocket(),\n      [sepolia.id]: http(),\n    },\n  })\n\n  const connector = config.connectors[0]!\n  expectTypeOf(connector).toEqualTypeOf(\n    config._internal.connectors.setup(connectorFn),\n  )\n\n  type ConnectFnParameters = NonNullable<\n    Parameters<(typeof connector)['connect']>[0]\n  >\n  expectTypeOf<ConnectFnParameters['foo']>().toMatchTypeOf<string | undefined>()\n})\n"
  },
  {
    "path": "packages/core/src/createConfig.test.ts",
    "content": "import { accounts, chain, wait } from '@wagmi/test'\nimport {\n  announceProvider,\n  type EIP1193Provider,\n  type EIP6963ProviderDetail,\n} from 'mipd'\nimport { http } from 'viem'\nimport { expect, test, vi } from 'vitest'\n\nimport { connect } from './actions/connect.js'\nimport { disconnect } from './actions/disconnect.js'\nimport { switchChain } from './actions/switchChain.js'\nimport { createConnector } from './connectors/createConnector.js'\nimport { mock } from './connectors/mock.js'\nimport { type Connection, createConfig } from './createConfig.js'\nimport { createStorage } from './createStorage.js'\nimport { serialize } from './utils/serialize.js'\n\nconst { mainnet, optimism } = chain\n\nvi.mock(import('mipd'), async (importOriginal) => {\n  const mod = await importOriginal()\n\n  let cache: typeof mod | undefined\n  if (!cache)\n    cache = {\n      ...mod,\n      createStore() {\n        const store = mod.createStore()\n        return {\n          ...store,\n          getProviders() {\n            return [\n              getProviderDetail({ name: 'Example', rdns: 'com.example' }),\n              getProviderDetail({ name: 'Mock', rdns: 'com.mock' }),\n            ]\n          },\n        }\n      },\n    }\n  return cache\n})\n\ntest('default', () => {\n  const config = createConfig({\n    chains: [mainnet],\n    connectors: [mock({ accounts })],\n    transports: {\n      [mainnet.id]: http(),\n    },\n  })\n  expect(config).toBeDefined()\n})\n\ntest('getClient', () => {\n  const config = createConfig({\n    chains: [mainnet, optimism],\n    connectors: [mock({ accounts })],\n    syncConnectedChain: true,\n    transports: {\n      [mainnet.id]: http(),\n      [optimism.id]: http(),\n    },\n  })\n\n  {\n    const client = config.getClient()\n    expect(client.chain.id).toBe(mainnet.id)\n  }\n\n  {\n    const client = config.getClient({ chainId: mainnet.id })\n    expect(client.chain.id).toBe(mainnet.id)\n  }\n\n  expect(() =>\n    config.getClient({\n      // @ts-expect-error\n      chainId: 123456,\n    }),\n  ).toThrowErrorMatchingInlineSnapshot(`\n    [ChainNotConfiguredError: Chain not configured.\n\n    Version: @wagmi/core@x.y.z]\n  `)\n\n  expect(() => {\n    // @ts-expect-error\n    config.state.chainId = 123456\n    config.getClient()\n  }).toThrowErrorMatchingInlineSnapshot(`\n    [ChainNotConfiguredError: Chain not configured.\n\n    Version: @wagmi/core@x.y.z]\n  `)\n})\n\ntest('behavior: syncConnectedChain', async () => {\n  const config = createConfig({\n    chains: [mainnet, optimism],\n    connectors: [mock({ accounts })],\n    syncConnectedChain: true,\n    transports: {\n      [mainnet.id]: http(),\n      [optimism.id]: http(),\n    },\n  })\n  // defaults to first chain in `createConfig({ chains })`\n  expect(config.getClient().chain.id).toBe(mainnet.id)\n\n  // switches to optimism\n  await switchChain(config, { chainId: optimism.id })\n  expect(config.getClient().chain.id).toBe(optimism.id)\n\n  // connects to mainnet\n  await connect(config, {\n    chainId: mainnet.id,\n    connector: config.connectors[0]!,\n  })\n  expect(config.getClient().chain.id).toBe(mainnet.id)\n\n  // switches to optimism\n  await switchChain(config, { chainId: optimism.id })\n  expect(config.getClient().chain.id).toBe(optimism.id)\n\n  // disconnects, still connected to optimism\n  await disconnect(config)\n  expect(config.getClient().chain.id).toBe(optimism.id)\n})\n\ntest('behavior: migrate for current version', async () => {\n  const state = {\n    'wagmi.store': JSON.stringify({\n      state: {\n        connections: {\n          __type: 'Map',\n          value: [\n            [\n              '983b8aca245',\n              {\n                accounts: [\n                  '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n                  '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n                ],\n                chainId: 1,\n                connector: {\n                  id: 'io.metamask',\n                  name: 'MetaMask',\n                  type: 'injected',\n                  uid: '983b8aca245',\n                },\n              },\n            ],\n          ],\n        },\n        chainId: 1,\n        current: '983b8aca245',\n      },\n      version: Number.NaN, // mocked version is `'x.y.z'`, which will get interpreted as `NaN`\n    }),\n  } as Record<string, string>\n  Object.defineProperty(window, 'localStorage', {\n    value: {\n      getItem: vi.fn((key) => state[key] ?? null),\n      removeItem: vi.fn((key) => state.delete?.[key]),\n      setItem: vi.fn((key, value) => {\n        state[key] = value\n      }),\n    },\n    writable: true,\n  })\n\n  const storage = createStorage<{ store: object }>({\n    storage: window.localStorage,\n  })\n\n  const config = createConfig({\n    chains: [mainnet],\n    storage,\n    transports: { [mainnet.id]: http() },\n  })\n\n  await wait(100)\n\n  expect(config.state).toMatchInlineSnapshot(`\n    {\n      \"chainId\": 1,\n      \"connections\": Map {\n        \"983b8aca245\" => {\n          \"accounts\": [\n            \"0xA0Cf798816D4b9b9866b5330EEa46a18382f251e\",\n            \"0xd2135CfB216b74109775236E36d4b433F1DF507B\",\n          ],\n          \"chainId\": 1,\n          \"connector\": {\n            \"id\": \"io.metamask\",\n            \"name\": \"MetaMask\",\n            \"type\": \"injected\",\n            \"uid\": \"983b8aca245\",\n          },\n        },\n      },\n      \"current\": \"983b8aca245\",\n      \"status\": \"disconnected\",\n    }\n  `)\n})\n\ntest('behavior: migrate chainId', async () => {\n  const state = {\n    'wagmi.store': JSON.stringify({\n      state: { chainId: 10 },\n      version: 1,\n    }),\n  } as Record<string, string>\n  Object.defineProperty(window, 'localStorage', {\n    value: {\n      getItem: vi.fn((key) => state[key] ?? null),\n      removeItem: vi.fn((key) => state.delete?.[key]),\n      setItem: vi.fn((key, value) => {\n        state[key] = value\n      }),\n    },\n    writable: true,\n  })\n\n  const storage = createStorage<{ store: object }>({\n    storage: window.localStorage,\n  })\n\n  const config = createConfig({\n    chains: [mainnet, optimism],\n    storage,\n    transports: {\n      [mainnet.id]: http(),\n      [optimism.id]: http(),\n    },\n  })\n\n  await wait(100)\n\n  expect(config.state).toMatchInlineSnapshot(`\n    {\n      \"chainId\": 10,\n      \"connections\": Map {},\n      \"current\": null,\n      \"status\": \"disconnected\",\n    }\n  `)\n})\n\ntest('behavior: properties passed through to Viem Client via getClient', () => {\n  {\n    const properties = {\n      batch: {\n        multicall: {\n          batchSize: 102_400,\n        },\n      },\n      cacheTime: 5_000,\n      pollingInterval: 1_000,\n    }\n\n    const config = createConfig({\n      chains: [mainnet, optimism],\n      transports: {\n        [mainnet.id]: http(),\n        [optimism.id]: http(),\n      },\n      ...properties,\n    })\n\n    const {\n      account: _a,\n      chain: _c,\n      extend: _e,\n      key: _k,\n      name: _n,\n      request: _r,\n      transport: _tr,\n      uid: _u,\n      type: _ty,\n      ...rest\n    } = config.getClient()\n    expect(rest).toEqual(properties)\n  }\n\n  {\n    const config = createConfig({\n      chains: [mainnet, optimism],\n      transports: {\n        [mainnet.id]: http(),\n        [optimism.id]: http(),\n      },\n      batch: {\n        [mainnet.id]: {\n          multicall: {\n            batchSize: 1024,\n          },\n        },\n      },\n    })\n\n    const client = config.getClient()\n    expect(client.batch).toMatchInlineSnapshot(`\n      {\n        \"multicall\": {\n          \"batchSize\": 1024,\n        },\n      }\n    `)\n\n    const client2 = config.getClient({ chainId: optimism.id })\n    expect(client2.batch).toMatchInlineSnapshot(`\n      {\n        \"multicall\": true,\n      }\n    `)\n  }\n})\n\ntest('behavior: restore unconfigured chainId', () => {\n  const state = {\n    'wagmi.store': JSON.stringify({\n      state: { chainId: 10 },\n      version: 1,\n    }),\n  } as Record<string, string>\n  Object.defineProperty(window, 'localStorage', {\n    value: {\n      getItem: vi.fn((key) => state[key] ?? null),\n      removeItem: vi.fn((key) => state.delete?.[key]),\n      setItem: vi.fn((key, value) => {\n        state[key] = value\n      }),\n    },\n    writable: true,\n  })\n\n  const storage = createStorage<{ store: object }>({\n    storage: window.localStorage,\n  })\n\n  const config = createConfig({\n    chains: [mainnet],\n    storage,\n    transports: {\n      [mainnet.id]: http(),\n    },\n  })\n\n  expect(config.state).toMatchInlineSnapshot(`\n    {\n      \"chainId\": 1,\n      \"connections\": Map {},\n      \"current\": null,\n      \"status\": \"disconnected\",\n    }\n  `)\n\n  const client = config.getClient()\n  expect(client.chain.id).toBe(mainnet.id)\n})\n\ntest('behavior: setup connector', async () => {\n  const config = createConfig({\n    chains: [mainnet],\n    transports: {\n      [mainnet.id]: http(),\n    },\n  })\n\n  const connectorFn = mock({ accounts })\n  const connector = config._internal.connectors.setup(connectorFn)\n  config._internal.connectors.setState((x) => [...x, connector])\n\n  await connect(config, {\n    chainId: mainnet.id,\n    connector: config.connectors.find((x) => x.uid === connector.uid)!,\n  })\n\n  expect(config.state.current).toBe(connector.uid)\n\n  await disconnect(config)\n})\n\ntest('behavior: eip 6963 providers', async () => {\n  const detail_1 = getProviderDetail({ name: 'Foo Wallet', rdns: 'com.foo' })\n  const detail_2 = getProviderDetail({ name: 'Bar Wallet', rdns: 'com.bar' })\n  const detail_3 = getProviderDetail({ name: 'Mock', rdns: 'com.mock' })\n\n  const config = createConfig({\n    chains: [mainnet],\n    connectors: [\n      createConnector((c) => {\n        return {\n          ...mock({ accounts })(c),\n          rdns: ['com.mock', 'com.baz'],\n        }\n      }),\n    ],\n    transports: {\n      [mainnet.id]: http(),\n    },\n  })\n\n  await wait(100)\n  announceProvider(detail_1)()\n  await wait(100)\n  announceProvider(detail_1)()\n  await wait(100)\n  announceProvider(detail_2)()\n  await wait(100)\n  announceProvider(detail_3)()\n  await wait(100)\n\n  expect(\n    config.connectors.flatMap((x) => x.rdns ?? x.id),\n  ).toMatchInlineSnapshot(`\n    [\n      \"com.mock\",\n      \"com.baz\",\n      \"com.example\",\n      \"com.foo\",\n      \"com.bar\",\n    ]\n  `)\n})\n\ntest('behavior: revalidate connections', async () => {\n  const state = {\n    'wagmi.store': serialize({\n      state: { chainId: 1 },\n      version: 1,\n    }),\n  } as Record<string, string>\n  Object.defineProperty(window, 'localStorage', {\n    value: {\n      getItem: vi.fn((key) => state[key] ?? null),\n      removeItem: vi.fn((key) => state.delete?.[key]),\n      setItem: vi.fn((key, value) => {\n        state[key] = value\n      }),\n    },\n    writable: true,\n  })\n\n  const config = createConfig({\n    chains: [mainnet],\n    connectors: [\n      mock({ accounts }),\n      mock({ accounts, features: { defaultConnected: true, reconnect: true } }),\n      mock({ accounts }),\n    ],\n    storage: createStorage<{ store: object }>({\n      storage: window.localStorage,\n    }),\n    transports: {\n      [mainnet.id]: http(),\n    },\n  })\n\n  const connections = new Map<string, Connection>()\n  const c1 = config.connectors.at(0)!\n  const c2 = config.connectors.at(1)!\n  const c3 = config.connectors.at(2)!\n  connections.set(c1.uid, { accounts: ['0x'], chainId: 1, connector: c1 })\n  connections.set(c2.uid, { accounts: ['0x'], chainId: 1, connector: c2 })\n  connections.set(c3.uid, { accounts: ['0x'], chainId: 1, connector: c3 })\n  connections.set('foo', {\n    accounts: ['0x'],\n    chainId: 1,\n    connector: {\n      id: 'foo',\n      name: 'foo',\n      type: 'foo',\n      uid: 'foo',\n    } as Connection['connector'],\n  })\n  config.setState((state) => ({ ...state, connections }))\n  await config._internal.revalidate()\n\n  expect([...config.state.connections.keys()]).toEqual([c2.uid])\n})\n\nfunction getProviderDetail(\n  info: Pick<EIP6963ProviderDetail['info'], 'name' | 'rdns'>,\n): EIP6963ProviderDetail {\n  return {\n    info: {\n      icon: 'data:image/svg+xml,<svg width=\"32px\" height=\"32px\" viewBox=\"0 0 32 32\"/>',\n      uuid: crypto.randomUUID(),\n      ...info,\n    },\n    provider: `<EIP1193Provider_${info.rdns}>` as unknown as EIP1193Provider,\n  }\n}\n"
  },
  {
    "path": "packages/core/src/createConfig.ts",
    "content": "import {\n  createStore as createMipd,\n  type EIP6963ProviderDetail,\n  type Store as MipdStore,\n} from 'mipd'\nimport {\n  type Address,\n  type Chain,\n  type Client,\n  createClient,\n  type EIP1193RequestFn,\n  type ClientConfig as viem_ClientConfig,\n  type Transport as viem_Transport,\n} from 'viem'\nimport { persist, subscribeWithSelector } from 'zustand/middleware'\nimport { createStore, type Mutate, type StoreApi } from 'zustand/vanilla'\n\nimport type {\n  ConnectorEventMap,\n  CreateConnectorFn,\n} from './connectors/createConnector.js'\nimport { injected } from './connectors/injected.js'\nimport { createEmitter, type Emitter, type EventData } from './createEmitter.js'\nimport {\n  createStorage,\n  getDefaultStorage,\n  type Storage,\n} from './createStorage.js'\nimport { ChainNotConfiguredError } from './errors/config.js'\nimport type {\n  Compute,\n  ExactPartial,\n  LooseOmit,\n  OneOf,\n  RemoveUndefined,\n} from './types/utils.js'\nimport { uid } from './utils/uid.js'\nimport { version } from './version.js'\n\nexport function createConfig<\n  const chains extends readonly [Chain, ...Chain[]],\n  transports extends Record<chains[number]['id'], Transport>,\n  const connectorFns extends readonly CreateConnectorFn[],\n>(\n  parameters: CreateConfigParameters<chains, transports, connectorFns>,\n): Config<chains, transports, connectorFns> {\n  const {\n    multiInjectedProviderDiscovery = true,\n    storage = createStorage({\n      storage: getDefaultStorage(),\n    }),\n    syncConnectedChain = true,\n    ssr = false,\n    ...rest\n  } = parameters\n\n  /////////////////////////////////////////////////////////////////////////////////////////////////\n  // Set up connectors, clients, etc.\n  /////////////////////////////////////////////////////////////////////////////////////////////////\n\n  const mipd =\n    typeof window !== 'undefined' && multiInjectedProviderDiscovery\n      ? createMipd()\n      : undefined\n\n  const chains = createStore(() => rest.chains)\n  const connectors = createStore(() => {\n    const collection = []\n    const rdnsSet = new Set<string>()\n    for (const connectorFns of rest.connectors ?? []) {\n      const connector = setup(connectorFns)\n      collection.push(connector)\n      if (!ssr && connector.rdns) {\n        const rdnsValues =\n          typeof connector.rdns === 'string' ? [connector.rdns] : connector.rdns\n        for (const rdns of rdnsValues) {\n          rdnsSet.add(rdns)\n        }\n      }\n    }\n    if (!ssr && mipd) {\n      const providers = mipd.getProviders()\n      for (const provider of providers) {\n        if (rdnsSet.has(provider.info.rdns)) continue\n        collection.push(setup(providerDetailToConnector(provider)))\n      }\n    }\n    return collection\n  })\n  function setup(connectorFn: CreateConnectorFn): Connector {\n    // Set up emitter with uid and add to connector so they are \"linked\" together.\n    const emitter = createEmitter<ConnectorEventMap>(uid())\n    const connector = {\n      ...connectorFn({\n        emitter,\n        chains: chains.getState(),\n        storage,\n        transports: rest.transports,\n      }),\n      emitter,\n      uid: emitter.uid,\n    }\n\n    // Start listening for `connect` events on connector setup\n    // This allows connectors to \"connect\" themselves without user interaction (e.g. MetaMask's \"Manually connect to current site\")\n    emitter.on('connect', connect)\n    connector.setup?.()\n\n    return connector\n  }\n  function providerDetailToConnector(providerDetail: EIP6963ProviderDetail) {\n    const { info } = providerDetail\n    const provider = providerDetail.provider as any\n    return injected({ target: { ...info, id: info.rdns, provider } })\n  }\n\n  const clients = new Map<number, Client<Transport, chains[number]>>()\n  function getClient<chainId extends chains[number]['id']>(\n    config: { chainId?: chainId | chains[number]['id'] | undefined } = {},\n  ): Client<Transport, Extract<chains[number], { id: chainId }>> {\n    const chainId = config.chainId ?? store.getState().chainId\n    const chain = chains.getState().find((x) => x.id === chainId)\n\n    // chainId specified and not configured\n    if (config.chainId && !chain) throw new ChainNotConfiguredError()\n\n    // If the target chain is not configured, use the client of the current chain.\n    type Return = Client<Transport, Extract<chains[number], { id: chainId }>>\n    {\n      const client = clients.get(store.getState().chainId)\n      if (client && !chain) return client as Return\n      if (!chain) throw new ChainNotConfiguredError()\n    }\n\n    // If a memoized client exists for a chain id, use that.\n    {\n      const client = clients.get(chainId)\n      if (client) return client as Return\n    }\n\n    let client: Client<Transport, chains[number]>\n    if (rest.client) client = rest.client({ chain })\n    else {\n      const chainId = chain.id as chains[number]['id']\n      const chainIds = chains.getState().map((x) => x.id)\n      // Grab all properties off `rest` and resolve for use in `createClient`\n      const properties: Partial<viem_ClientConfig> = {}\n      const entries = Object.entries(rest) as [keyof typeof rest, any][]\n\n      for (const [key, value] of entries) {\n        if (\n          key === 'chains' ||\n          key === 'client' ||\n          key === 'connectors' ||\n          key === 'transports'\n        )\n          continue\n\n        if (typeof value === 'object') {\n          // check if value is chainId-specific since some values can be objects\n          // e.g. { batch: { multicall: { batchSize: 1024 } } }\n          if (chainId in value) properties[key] = value[chainId]\n          else {\n            // check if value is chainId-specific, but does not have value for current chainId\n            const hasChainSpecificValue = chainIds.some((x) => x in value)\n            if (hasChainSpecificValue) continue\n            properties[key] = value\n          }\n        } else properties[key] = value\n      }\n\n      client = createClient({\n        ...properties,\n        chain,\n        batch: properties.batch ?? { multicall: true },\n        transport: (parameters) =>\n          rest.transports[chainId]({ ...parameters, connectors }),\n      })\n    }\n\n    clients.set(chainId, client)\n    return client as Return\n  }\n\n  /////////////////////////////////////////////////////////////////////////////////////////////////\n  // Create store\n  /////////////////////////////////////////////////////////////////////////////////////////////////\n\n  function getInitialState(): State {\n    return {\n      chainId: chains.getState()[0].id,\n      connections: new Map<string, Connection>(),\n      current: null,\n      status: 'disconnected',\n    }\n  }\n\n  let currentVersion: number\n  const prefix = '0.0.0-canary-'\n  if (version.startsWith(prefix))\n    currentVersion = Number.parseInt(version.replace(prefix, ''), 10)\n  // use package major version to version store\n  else currentVersion = Number.parseInt(version.split('.')[0] ?? '0', 10)\n\n  const store = createStore(\n    subscribeWithSelector(\n      // only use persist middleware if storage exists\n      storage\n        ? persist(getInitialState, {\n            migrate(persistedState, version) {\n              if (version === currentVersion) return persistedState as State\n\n              const initialState = getInitialState()\n              const chainId = validatePersistedChainId(\n                persistedState,\n                initialState.chainId,\n              )\n              return { ...initialState, chainId }\n            },\n            name: 'store',\n            partialize(state) {\n              // Only persist \"critical\" store properties to preserve storage size.\n              return {\n                connections: {\n                  __type: 'Map',\n                  value: Array.from(state.connections.entries()).map(\n                    ([key, connection]) => {\n                      const { id, name, type, uid } = connection.connector\n                      const connector = { id, name, type, uid }\n                      return [key, { ...connection, connector }]\n                    },\n                  ),\n                } as unknown as PartializedState['connections'],\n                chainId: state.chainId,\n                current: state.current,\n              } satisfies PartializedState\n            },\n            merge(persistedState, currentState) {\n              // `status` should not be persisted as it messes with reconnection\n              if (\n                typeof persistedState === 'object' &&\n                persistedState &&\n                'status' in persistedState\n              )\n                delete persistedState.status\n              // Make sure persisted `chainId` is valid\n              const chainId = validatePersistedChainId(\n                persistedState,\n                currentState.chainId,\n              )\n              return {\n                ...currentState,\n                ...(persistedState as object),\n                chainId,\n              }\n            },\n            skipHydration: ssr,\n            storage: storage as Storage<Record<string, unknown>>,\n            version: currentVersion,\n          })\n        : getInitialState,\n    ),\n  )\n  store.setState(getInitialState())\n\n  function validatePersistedChainId(\n    persistedState: unknown,\n    defaultChainId: number,\n  ) {\n    return persistedState &&\n      typeof persistedState === 'object' &&\n      'chainId' in persistedState &&\n      typeof persistedState.chainId === 'number' &&\n      chains.getState().some((x) => x.id === persistedState.chainId)\n      ? persistedState.chainId\n      : defaultChainId\n  }\n\n  /////////////////////////////////////////////////////////////////////////////////////////////////\n  // Subscribe to changes\n  /////////////////////////////////////////////////////////////////////////////////////////////////\n\n  // Update default chain when connector chain changes\n  if (syncConnectedChain)\n    store.subscribe(\n      ({ connections, current }) =>\n        current ? connections.get(current)?.chainId : undefined,\n      (chainId) => {\n        // If chain is not configured, then don't switch over to it.\n        const isChainConfigured = chains\n          .getState()\n          .some((x) => x.id === chainId)\n        if (!isChainConfigured) return\n\n        return store.setState((x) => ({\n          ...x,\n          chainId: chainId ?? x.chainId,\n        }))\n      },\n    )\n\n  // EIP-6963 subscribe for new wallet providers\n  mipd?.subscribe((providerDetails) => {\n    const connectorIdSet = new Set<string>()\n    const connectorRdnsSet = new Set<string>()\n    for (const connector of connectors.getState()) {\n      connectorIdSet.add(connector.id)\n      if (connector.rdns) {\n        const rdnsValues =\n          typeof connector.rdns === 'string' ? [connector.rdns] : connector.rdns\n        for (const rdns of rdnsValues) {\n          connectorRdnsSet.add(rdns)\n        }\n      }\n    }\n\n    const newConnectors: Connector[] = []\n    for (const providerDetail of providerDetails) {\n      if (connectorRdnsSet.has(providerDetail.info.rdns)) continue\n      const connector = setup(providerDetailToConnector(providerDetail))\n      if (connectorIdSet.has(connector.id)) continue\n      newConnectors.push(connector)\n    }\n\n    if (storage && !store.persist.hasHydrated()) return\n    connectors.setState((x) => [...x, ...newConnectors], true)\n  })\n\n  /////////////////////////////////////////////////////////////////////////////////////////////////\n  // Emitter listeners\n  /////////////////////////////////////////////////////////////////////////////////////////////////\n\n  function change(data: EventData<ConnectorEventMap, 'change'>) {\n    store.setState((x) => {\n      const connection = x.connections.get(data.uid)\n      if (!connection) return x\n      return {\n        ...x,\n        connections: new Map(x.connections).set(data.uid, {\n          accounts:\n            (data.accounts as readonly [Address, ...Address[]]) ??\n            connection.accounts,\n          chainId: data.chainId ?? connection.chainId,\n          connector: connection.connector,\n        }),\n      }\n    })\n  }\n  function connect(data: EventData<ConnectorEventMap, 'connect'>) {\n    // Disable handling if reconnecting/connecting\n    if (\n      store.getState().status === 'connecting' ||\n      store.getState().status === 'reconnecting'\n    )\n      return\n\n    store.setState((x) => {\n      const connector = connectors.getState().find((x) => x.uid === data.uid)\n      if (!connector) return x\n\n      if (connector.emitter.listenerCount('connect'))\n        connector.emitter.off('connect', change)\n      if (!connector.emitter.listenerCount('change'))\n        connector.emitter.on('change', change)\n      if (!connector.emitter.listenerCount('disconnect'))\n        connector.emitter.on('disconnect', disconnect)\n\n      return {\n        ...x,\n        connections: new Map(x.connections).set(data.uid, {\n          accounts: data.accounts as readonly [Address, ...Address[]],\n          chainId: data.chainId,\n          connector: connector,\n        }),\n        current: data.uid,\n        status: 'connected',\n      }\n    })\n  }\n  function disconnect(data: EventData<ConnectorEventMap, 'disconnect'>) {\n    store.setState((x) => {\n      const connection = x.connections.get(data.uid)\n      if (connection) {\n        const connector = connection.connector\n        if (connector.emitter.listenerCount('change'))\n          connection.connector.emitter.off('change', change)\n        if (connector.emitter.listenerCount('disconnect'))\n          connection.connector.emitter.off('disconnect', disconnect)\n        if (!connector.emitter.listenerCount('connect'))\n          connection.connector.emitter.on('connect', connect)\n      }\n\n      x.connections.delete(data.uid)\n\n      if (x.connections.size === 0)\n        return {\n          ...x,\n          connections: new Map(),\n          current: null,\n          status: 'disconnected',\n        }\n\n      const nextConnection = x.connections.values().next().value as Connection\n      return {\n        ...x,\n        connections: new Map(x.connections),\n        current: nextConnection.connector.uid,\n      }\n    })\n  }\n\n  return {\n    get chains() {\n      return chains.getState() as chains\n    },\n    get connectors() {\n      return connectors.getState() as Readonly<{\n        [key in keyof connectorFns]: Connector<connectorFns[key]>\n      }>\n    },\n    storage,\n\n    getClient,\n    get state() {\n      return store.getState() as unknown as State<chains>\n    },\n    setState(value) {\n      let newState: State\n      if (typeof value === 'function') newState = value(store.getState() as any)\n      else newState = value\n\n      // Reset state if it got set to something not matching the base state\n      const initialState = getInitialState()\n      if (typeof newState !== 'object') newState = initialState\n      const isCorrupt = Object.keys(initialState).some((x) => !(x in newState))\n      if (isCorrupt) newState = initialState\n\n      store.setState(newState, true)\n    },\n    subscribe(selector, listener, options) {\n      return store.subscribe(\n        selector as unknown as (state: State) => any,\n        listener,\n        options\n          ? ({\n              ...options,\n              fireImmediately: options.emitImmediately,\n              // Workaround cast since Zustand does not support `'exactOptionalPropertyTypes'`\n            } as RemoveUndefined<typeof options>)\n          : undefined,\n      )\n    },\n\n    _internal: {\n      mipd,\n      async revalidate() {\n        // Check connections to see if they are still active\n        const state = store.getState()\n        const connections = state.connections\n        let current = state.current\n        for (const [, connection] of connections) {\n          const connector = connection.connector\n          // check if `connect.isAuthorized` exists\n          // partial connectors in storage do not have it\n          const isAuthorized = connector.isAuthorized\n            ? await connector.isAuthorized()\n            : false\n          if (isAuthorized) continue\n          // Remove stale connection\n          connections.delete(connector.uid)\n          if (current === connector.uid) current = null\n        }\n        // set connections\n        store.setState((x) => ({ ...x, connections, current }))\n      },\n      store,\n      ssr: Boolean(ssr),\n      syncConnectedChain,\n      transports: rest.transports as transports,\n      chains: {\n        setState(value) {\n          const nextChains = (\n            typeof value === 'function' ? value(chains.getState()) : value\n          ) as chains\n          if (nextChains.length === 0) return\n          return chains.setState(nextChains, true)\n        },\n        subscribe(listener) {\n          return chains.subscribe(listener)\n        },\n      },\n      connectors: {\n        providerDetailToConnector,\n        setup: setup as <connectorFn extends CreateConnectorFn>(\n          connectorFn: connectorFn,\n        ) => Connector<connectorFn>,\n        setState(value) {\n          return connectors.setState(\n            typeof value === 'function' ? value(connectors.getState()) : value,\n            true,\n          )\n        },\n        subscribe(listener) {\n          return connectors.subscribe(listener)\n        },\n      },\n      events: { change, connect, disconnect },\n    },\n  }\n}\n\n/////////////////////////////////////////////////////////////////////////////////////////////////\n// Types\n/////////////////////////////////////////////////////////////////////////////////////////////////\n\nexport type CreateConfigParameters<\n  chains extends readonly [Chain, ...Chain[]] = readonly [Chain, ...Chain[]],\n  transports extends Record<chains[number]['id'], Transport> = Record<\n    chains[number]['id'],\n    Transport\n  >,\n  connectorFns extends\n    readonly CreateConnectorFn[] = readonly CreateConnectorFn[],\n> = Compute<\n  {\n    chains: chains\n    connectors?: connectorFns | undefined\n    multiInjectedProviderDiscovery?: boolean | undefined\n    storage?: Storage | null | undefined\n    ssr?: boolean | undefined\n    syncConnectedChain?: boolean | undefined\n  } & OneOf<\n    | ({ transports: transports } & {\n        [key in keyof ClientConfig]?:\n          | ClientConfig[key]\n          | { [_ in chains[number]['id']]?: ClientConfig[key] | undefined }\n          | undefined\n      })\n    | {\n        client(parameters: {\n          chain: chains[number]\n        }): Client<transports[chains[number]['id']], chains[number]>\n      }\n  >\n>\n\nexport type Config<\n  chains extends readonly [Chain, ...Chain[]] = readonly [Chain, ...Chain[]],\n  transports extends Record<chains[number]['id'], Transport> = Record<\n    chains[number]['id'],\n    Transport\n  >,\n  connectorFns extends\n    readonly CreateConnectorFn[] = readonly CreateConnectorFn[],\n> = {\n  readonly chains: chains\n  readonly connectors: Readonly<{\n    [key in keyof connectorFns]: Connector<connectorFns[key]>\n  }>\n  readonly storage: Storage | null\n\n  readonly state: State<chains>\n  setState<tchains extends readonly [Chain, ...Chain[]] = chains>(\n    value: State<tchains> | ((state: State<tchains>) => State<tchains>),\n  ): void\n  subscribe<state>(\n    selector: (state: State<chains>) => state,\n    listener: (state: state, previousState: state) => void,\n    options?:\n      | {\n          emitImmediately?: boolean | undefined\n          equalityFn?: ((a: state, b: state) => boolean) | undefined\n        }\n      | undefined,\n  ): () => void\n\n  getClient<chainId extends chains[number]['id']>(parameters?: {\n    chainId?: chainId | chains[number]['id'] | undefined\n  }): Client<transports[chainId], Extract<chains[number], { id: chainId }>>\n\n  /**\n   * Not part of versioned API, proceed with caution.\n   * @internal\n   */\n  _internal: Internal<chains, transports>\n}\n\ntype Internal<\n  chains extends readonly [Chain, ...Chain[]] = readonly [Chain, ...Chain[]],\n  transports extends Record<chains[number]['id'], Transport> = Record<\n    chains[number]['id'],\n    Transport\n  >,\n> = {\n  readonly mipd: MipdStore | undefined\n  revalidate: () => Promise<void>\n  readonly store: Mutate<StoreApi<any>, [['zustand/persist', any]]>\n  readonly ssr: boolean\n  readonly syncConnectedChain: boolean\n  readonly transports: transports\n\n  chains: {\n    setState(\n      value:\n        | readonly [Chain, ...Chain[]]\n        | ((\n            state: readonly [Chain, ...Chain[]],\n          ) => readonly [Chain, ...Chain[]]),\n    ): void\n    subscribe(\n      listener: (\n        state: readonly [Chain, ...Chain[]],\n        prevState: readonly [Chain, ...Chain[]],\n      ) => void,\n    ): () => void\n  }\n  connectors: {\n    providerDetailToConnector(\n      providerDetail: EIP6963ProviderDetail,\n    ): CreateConnectorFn\n    setup<connectorFn extends CreateConnectorFn>(\n      connectorFn: connectorFn,\n    ): Connector<connectorFn>\n    setState(value: Connector[] | ((state: Connector[]) => Connector[])): void\n    subscribe(\n      listener: (state: Connector[], prevState: Connector[]) => void,\n    ): () => void\n  }\n  events: {\n    change(data: EventData<ConnectorEventMap, 'change'>): void\n    connect(data: EventData<ConnectorEventMap, 'connect'>): void\n    disconnect(data: EventData<ConnectorEventMap, 'disconnect'>): void\n  }\n}\n\nexport type State<\n  chains extends readonly [Chain, ...Chain[]] = readonly [Chain, ...Chain[]],\n> = {\n  chainId: chains[number]['id']\n  connections: Map<string, Connection>\n  current: string | null\n  status: 'connected' | 'connecting' | 'disconnected' | 'reconnecting'\n}\n\nexport type PartializedState = Compute<\n  ExactPartial<Pick<State, 'chainId' | 'connections' | 'current' | 'status'>>\n>\n\nexport type Connection = {\n  accounts: readonly [Address, ...Address[]]\n  chainId: number\n  connector: Connector\n}\n\nexport type Connector<\n  createConnectorFn extends CreateConnectorFn = CreateConnectorFn,\n> = ReturnType<createConnectorFn> & {\n  emitter: Emitter<ConnectorEventMap>\n  uid: string\n}\n\nexport type Transport<\n  type extends string = string,\n  rpcAttributes = Record<string, any>,\n  eip1193RequestFn extends EIP1193RequestFn = EIP1193RequestFn,\n> = (\n  params: Parameters<\n    viem_Transport<type, rpcAttributes, eip1193RequestFn>\n  >[0] & {\n    connectors?: StoreApi<Connector[]> | undefined\n  },\n) => ReturnType<viem_Transport<type, rpcAttributes, eip1193RequestFn>>\n\ntype ClientConfig = LooseOmit<\n  viem_ClientConfig,\n  'account' | 'chain' | 'key' | 'name' | 'transport' | 'type'\n>\n"
  },
  {
    "path": "packages/core/src/createEmitter.test.ts",
    "content": "import { expect, test, vi } from 'vitest'\n\nimport type { ConnectorEventMap } from './connectors/createConnector.js'\nimport { createEmitter } from './createEmitter.js'\nimport { uid } from './utils/uid.js'\n\ntest('default', () => {\n  const emitter = createEmitter<ConnectorEventMap>(uid())\n\n  const onMessage = vi.fn()\n  emitter.on('message', onMessage)\n  emitter.emit('message', { type: 'bar', data: 'baz' })\n\n  expect(onMessage).toHaveBeenCalledWith({\n    type: 'bar',\n    data: 'baz',\n    uid: emitter.uid,\n  })\n})\n"
  },
  {
    "path": "packages/core/src/createEmitter.ts",
    "content": "import { EventEmitter } from 'eventemitter3'\n\ntype EventMap = Record<string, object | never>\ntype EventKey<eventMap extends EventMap> = string & keyof eventMap\ntype EventFn<parameters extends unknown[] = any[]> = (\n  ...parameters: parameters\n) => void\nexport type EventData<\n  eventMap extends EventMap,\n  eventName extends keyof eventMap,\n> = (eventMap[eventName] extends [never] ? unknown : eventMap[eventName]) & {\n  uid: string\n}\n\nexport class Emitter<eventMap extends EventMap> {\n  _emitter = new EventEmitter()\n\n  constructor(public uid: string) {}\n\n  on<key extends EventKey<eventMap>>(\n    eventName: key,\n    fn: EventFn<\n      eventMap[key] extends [never]\n        ? [{ uid: string }]\n        : [data: eventMap[key] & { uid: string }]\n    >,\n  ) {\n    this._emitter.on(eventName, fn as EventFn)\n  }\n\n  once<key extends EventKey<eventMap>>(\n    eventName: key,\n    fn: EventFn<\n      eventMap[key] extends [never]\n        ? [{ uid: string }]\n        : [data: eventMap[key] & { uid: string }]\n    >,\n  ) {\n    this._emitter.once(eventName, fn as EventFn)\n  }\n\n  off<key extends EventKey<eventMap>>(\n    eventName: key,\n    fn: EventFn<\n      eventMap[key] extends [never]\n        ? [{ uid: string }]\n        : [data: eventMap[key] & { uid: string }]\n    >,\n  ) {\n    this._emitter.off(eventName, fn as EventFn)\n  }\n\n  emit<key extends EventKey<eventMap>>(\n    eventName: key,\n    ...params: eventMap[key] extends [never] ? [] : [data: eventMap[key]]\n  ) {\n    const data = params[0]\n    this._emitter.emit(eventName, { uid: this.uid, ...data })\n  }\n\n  listenerCount<key extends EventKey<eventMap>>(eventName: key) {\n    return this._emitter.listenerCount(eventName)\n  }\n}\n\nexport function createEmitter<eventMap extends EventMap>(uid: string) {\n  return new Emitter<eventMap>(uid)\n}\n"
  },
  {
    "path": "packages/core/src/createStorage.test-d.ts",
    "content": "import { expectTypeOf, test } from 'vitest'\nimport type { Connection } from './createConfig.js'\nimport { createStorage } from './createStorage.js'\n\ntest('getItem', () => {\n  const storage = createStorage({ storage: localStorage })\n\n  expectTypeOf(storage.getItem('recentConnectorId')).toEqualTypeOf<\n    string | null | Promise<string | null>\n  >()\n  expectTypeOf(storage.getItem('recentConnectorId', 'foo')).toEqualTypeOf<\n    string | Promise<string>\n  >()\n  expectTypeOf(storage.getItem('foo')).toEqualTypeOf<unknown>()\n  // @ts-expect-error incorrect argument type\n  storage.getItem('recentConnectorId', 1n)\n\n  expectTypeOf(storage.getItem('state')).toEqualTypeOf<\n    | {\n        chainId?: number | undefined\n        connections?: Map<string, Connection> | undefined\n        current?: string | null | undefined\n        status?:\n          | 'connected'\n          | 'connecting'\n          | 'reconnecting'\n          | 'disconnected'\n          | undefined\n      }\n    | null\n    | Promise<{\n        chainId?: number | undefined\n        connections?: Map<string, Connection> | undefined\n        current?: string | null | undefined\n        status?:\n          | 'connected'\n          | 'connecting'\n          | 'reconnecting'\n          | 'disconnected'\n          | undefined\n      } | null>\n  >()\n\n  const customStorage = createStorage<{ foo: number }>({\n    storage: localStorage,\n  })\n  expectTypeOf(customStorage.getItem('foo')).toEqualTypeOf<\n    number | null | Promise<number | null>\n  >()\n  expectTypeOf(customStorage.getItem('foo', 1)).toEqualTypeOf<\n    number | Promise<number>\n  >()\n})\n\ntest('setItem', () => {\n  const storage = createStorage({ storage: localStorage })\n\n  storage.setItem('recentConnectorId', 'foo')\n  // @ts-expect-error incorrect argument type\n  storage.setItem('recentConnectorId', 1n)\n})\n\ntest('serialize/deserialize types', () => {\n  createStorage({\n    deserialize(value) {\n      return value\n    },\n    serialize(value) {\n      return value\n    },\n    storage: localStorage,\n  })\n})\n"
  },
  {
    "path": "packages/core/src/createStorage.test.ts",
    "content": "import { expect, test, vi } from 'vitest'\n\nimport { createStorage } from './createStorage.js'\n\nObject.defineProperty(window, 'localStorage', {\n  value: {\n    getItem: vi.fn(() => null),\n    removeItem: vi.fn(() => null),\n    setItem: vi.fn(() => null),\n  },\n  writable: true,\n})\n\ntest('inits', () => {\n  const storage = createStorage({ storage: window.localStorage })\n  expect(storage).toBeDefined()\n})\n\ntest('getItem', () => {\n  const storage = createStorage({ storage: window.localStorage })\n  storage.getItem('recentConnectorId')\n  expect(window.localStorage.getItem).toHaveBeenCalledTimes(1)\n  expect(window.localStorage.getItem).toHaveBeenCalledWith(\n    'wagmi.recentConnectorId',\n  )\n})\n\ntest('setItem', () => {\n  const storage = createStorage({ storage: window.localStorage })\n  storage.setItem('recentConnectorId', 'bar')\n  expect(window.localStorage.setItem).toHaveBeenCalledTimes(1)\n  expect(window.localStorage.setItem).toHaveBeenCalledWith(\n    'wagmi.recentConnectorId',\n    '\"bar\"',\n  )\n})\n\ntest('removeItem', () => {\n  const storage = createStorage({ storage: window.localStorage })\n  storage.removeItem('recentConnectorId')\n  expect(window.localStorage.removeItem).toHaveBeenCalledTimes(1)\n  expect(window.localStorage.removeItem).toHaveBeenCalledWith(\n    'wagmi.recentConnectorId',\n  )\n})\n"
  },
  {
    "path": "packages/core/src/createStorage.ts",
    "content": "import type { PartializedState } from './createConfig.js'\nimport type { Compute } from './types/utils.js'\nimport { deserialize as deserialize_ } from './utils/deserialize.js'\nimport { serialize as serialize_ } from './utils/serialize.js'\n\n// key-values for loose autocomplete and typing\nexport type StorageItemMap = {\n  recentConnectorId: string\n  state: PartializedState\n}\n\nexport type Storage<\n  itemMap extends Record<string, unknown> = Record<string, unknown>,\n  ///\n  storageItemMap extends StorageItemMap = StorageItemMap & itemMap,\n> = {\n  key: string\n  getItem<\n    key extends keyof storageItemMap,\n    value extends storageItemMap[key],\n    defaultValue extends value | null | undefined,\n  >(\n    key: key,\n    defaultValue?: defaultValue | undefined,\n  ):\n    | (defaultValue extends null ? value | null : value)\n    | Promise<defaultValue extends null ? value | null : value>\n  setItem<\n    key extends keyof storageItemMap,\n    value extends storageItemMap[key] | null,\n  >(key: key, value: value): void | Promise<void>\n  removeItem(key: keyof storageItemMap): void | Promise<void>\n}\n\nexport type BaseStorage = {\n  getItem(\n    key: string,\n  ): string | null | undefined | Promise<string | null | undefined>\n  setItem(key: string, value: string): void | Promise<void>\n  removeItem(key: string): void | Promise<void>\n}\n\nexport type CreateStorageParameters = {\n  deserialize?: (<type>(value: string) => type | unknown) | undefined\n  key?: string | undefined\n  serialize?: (<type>(value: type | any) => string) | undefined\n  storage?: Compute<BaseStorage> | undefined\n}\n\nexport function createStorage<\n  itemMap extends Record<string, unknown> = Record<string, unknown>,\n  storageItemMap extends StorageItemMap = StorageItemMap & itemMap,\n>(parameters: CreateStorageParameters): Compute<Storage<storageItemMap>> {\n  const {\n    deserialize = deserialize_,\n    key: prefix = 'wagmi',\n    serialize = serialize_,\n    storage = noopStorage,\n  } = parameters\n\n  function unwrap<type>(value: type): type | Promise<type> {\n    if (value instanceof Promise) return value.then((x) => x).catch(() => null)\n    return value\n  }\n\n  return {\n    ...storage,\n    key: prefix,\n    async getItem(key, defaultValue) {\n      const value = storage.getItem(`${prefix}.${key as string}`)\n      const unwrapped = await unwrap(value)\n      if (unwrapped) return deserialize(unwrapped) ?? null\n      return (defaultValue ?? null) as any\n    },\n    async setItem(key, value) {\n      const storageKey = `${prefix}.${key as string}`\n      if (value === null) await unwrap(storage.removeItem(storageKey))\n      else await unwrap(storage.setItem(storageKey, serialize(value)))\n    },\n    async removeItem(key) {\n      await unwrap(storage.removeItem(`${prefix}.${key as string}`))\n    },\n  }\n}\n\nexport const noopStorage = {\n  getItem: () => null,\n  setItem: () => {},\n  removeItem: () => {},\n} satisfies BaseStorage\n\nexport function getDefaultStorage() {\n  const storage = (() => {\n    // biome-ignore lint/complexity/useOptionalChain: _\n    if (typeof window !== 'undefined' && window.localStorage)\n      return window.localStorage\n    return noopStorage\n  })()\n  return {\n    getItem(key) {\n      return storage.getItem(key)\n    },\n    removeItem(key) {\n      storage.removeItem(key)\n    },\n    setItem(key, value) {\n      try {\n        storage.setItem(key, value)\n        // silence errors by default (QuotaExceededError, SecurityError, etc.)\n      } catch {}\n    },\n  } satisfies BaseStorage\n}\n"
  },
  {
    "path": "packages/core/src/errors/base.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport { BaseError } from './base.js'\n\ntest('BaseError', () => {\n  expect(new BaseError('An error occurred.')).toMatchInlineSnapshot(`\n    [WagmiCoreError: An error occurred.\n\n    Version: @wagmi/core@x.y.z]\n  `)\n\n  expect(\n    new BaseError('An error occurred.', { details: 'details' }),\n  ).toMatchInlineSnapshot(`\n    [WagmiCoreError: An error occurred.\n\n    Details: details\n    Version: @wagmi/core@x.y.z]\n  `)\n\n  expect(new BaseError('', { details: 'details' })).toMatchInlineSnapshot(`\n    [WagmiCoreError: An error occurred.\n\n    Details: details\n    Version: @wagmi/core@x.y.z]\n  `)\n})\n\ntest('BaseError (w/ docsPath)', () => {\n  expect(\n    new BaseError('An error occurred.', {\n      details: 'details',\n      docsPath: '/lol',\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiCoreError: An error occurred.\n\n    Docs: https://wagmi.sh/core/lol.html\n    Details: details\n    Version: @wagmi/core@x.y.z]\n  `)\n  expect(\n    new BaseError('An error occurred.', {\n      cause: new BaseError('error', { docsPath: '/docs' }),\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiCoreError: An error occurred.\n\n    Docs: https://wagmi.sh/core/docs.html\n    Version: @wagmi/core@x.y.z]\n  `)\n  expect(\n    new BaseError('An error occurred.', {\n      cause: new BaseError('error'),\n      docsPath: '/lol',\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiCoreError: An error occurred.\n\n    Docs: https://wagmi.sh/core/lol.html\n    Version: @wagmi/core@x.y.z]\n  `)\n  expect(\n    new BaseError('An error occurred.', {\n      details: 'details',\n      docsPath: '/lol',\n      docsSlug: 'test',\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiCoreError: An error occurred.\n\n    Docs: https://wagmi.sh/core/lol.html#test\n    Details: details\n    Version: @wagmi/core@x.y.z]\n  `)\n})\n\ntest('BaseError (w/ metaMessages)', () => {\n  expect(\n    new BaseError('An error occurred.', {\n      details: 'details',\n      metaMessages: ['Reason: idk', 'Cause: lol'],\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiCoreError: An error occurred.\n\n    Reason: idk\n    Cause: lol\n\n    Details: details\n    Version: @wagmi/core@x.y.z]\n  `)\n})\n\ntest('inherited BaseError', () => {\n  const err = new BaseError('An error occurred.', {\n    details: 'details',\n    docsPath: '/lol',\n  })\n  expect(\n    new BaseError('An internal error occurred.', {\n      cause: err,\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiCoreError: An internal error occurred.\n\n    Docs: https://wagmi.sh/core/lol.html\n    Details: details\n    Version: @wagmi/core@x.y.z]\n  `)\n})\n\ntest('inherited Error', () => {\n  const err = new Error('details')\n  expect(\n    new BaseError('An internal error occurred.', {\n      cause: err,\n      docsPath: '/lol',\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiCoreError: An internal error occurred.\n\n    Docs: https://wagmi.sh/core/lol.html\n    Details: details\n    Version: @wagmi/core@x.y.z]\n  `)\n})\n\ntest('walk: no predicate fn (walks to leaf)', () => {\n  class FooError extends BaseError {}\n  class BarError extends BaseError {}\n\n  const err = new BaseError('test1', {\n    cause: new FooError('test2', { cause: new BarError('test3') }),\n  })\n  expect(err.walk()).toMatchInlineSnapshot(`\n    [WagmiCoreError: test3\n\n    Version: @wagmi/core@x.y.z]\n  `)\n})\n\ntest('walk: predicate fn', () => {\n  class FooError extends BaseError {}\n  class BarError extends BaseError {}\n\n  const err = new BaseError('test1', {\n    cause: new FooError('test2', { cause: new BarError('test3') }),\n  })\n  expect(err.walk((err) => err instanceof FooError)).toMatchInlineSnapshot(`\n    [WagmiCoreError: test2\n\n    Version: @wagmi/core@x.y.z]\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/errors/base.ts",
    "content": "import type { Compute, OneOf } from '../types/utils.js'\nimport { getVersion } from '../utils/getVersion.js'\n\nexport type ErrorType<name extends string = 'Error'> = Error & { name: name }\n\ntype BaseErrorOptions = Compute<\n  OneOf<{ details?: string | undefined } | { cause: BaseError | Error }> & {\n    docsPath?: string | undefined\n    docsSlug?: string | undefined\n    metaMessages?: string[] | undefined\n  }\n>\n\nexport type BaseErrorType = BaseError & { name: 'WagmiCoreError' }\nexport class BaseError extends Error {\n  details: string\n  docsPath?: string | undefined\n  metaMessages?: string[] | undefined\n  shortMessage: string\n\n  override name = 'WagmiCoreError'\n  get docsBaseUrl() {\n    return 'https://wagmi.sh/core'\n  }\n  get version() {\n    return getVersion()\n  }\n\n  constructor(shortMessage: string, options: BaseErrorOptions = {}) {\n    super()\n\n    const details =\n      options.cause instanceof BaseError\n        ? options.cause.details\n        : options.cause?.message\n          ? options.cause.message\n          : options.details!\n    const docsPath =\n      options.cause instanceof BaseError\n        ? options.cause.docsPath || options.docsPath\n        : options.docsPath\n\n    this.message = [\n      shortMessage || 'An error occurred.',\n      '',\n      ...(options.metaMessages ? [...options.metaMessages, ''] : []),\n      ...(docsPath\n        ? [\n            `Docs: ${this.docsBaseUrl}${docsPath}.html${\n              options.docsSlug ? `#${options.docsSlug}` : ''\n            }`,\n          ]\n        : []),\n      ...(details ? [`Details: ${details}`] : []),\n      `Version: ${this.version}`,\n    ].join('\\n')\n\n    if (options.cause) this.cause = options.cause\n    this.details = details\n    this.docsPath = docsPath\n    this.metaMessages = options.metaMessages\n    this.shortMessage = shortMessage\n  }\n\n  walk(fn?: (err: unknown) => boolean) {\n    return this.#walk(this, fn)\n  }\n\n  #walk(err: unknown, fn?: (err: unknown) => boolean): unknown {\n    if (fn?.(err)) return err\n    if ((err as Error).cause) return this.#walk((err as Error).cause, fn)\n    return err\n  }\n}\n"
  },
  {
    "path": "packages/core/src/errors/config.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport {\n  ChainNotConfiguredError,\n  ConnectorAccountNotFoundError,\n  ConnectorAlreadyConnectedError,\n  ConnectorChainMismatchError,\n  ConnectorNotConnectedError,\n  ConnectorNotFoundError,\n  ConnectorUnavailableReconnectingError,\n} from './config.js'\n\ntest('constructors', () => {\n  expect(new ChainNotConfiguredError()).toMatchInlineSnapshot(`\n    [ChainNotConfiguredError: Chain not configured.\n\n    Version: @wagmi/core@x.y.z]\n  `)\n  expect(new ConnectorAlreadyConnectedError()).toMatchInlineSnapshot(`\n    [ConnectorAlreadyConnectedError: Connector already connected.\n\n    Version: @wagmi/core@x.y.z]\n  `)\n  expect(new ConnectorNotConnectedError()).toMatchInlineSnapshot(`\n    [ConnectorNotConnectedError: Connector not connected.\n\n    Version: @wagmi/core@x.y.z]\n  `)\n  expect(new ConnectorNotFoundError()).toMatchInlineSnapshot(`\n    [ConnectorNotFoundError: Connector not found.\n\n    Version: @wagmi/core@x.y.z]\n  `)\n  expect(\n    new ConnectorAccountNotFoundError({\n      address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      connector: config.connectors[0]!,\n    }),\n  ).toMatchInlineSnapshot(`\n    [ConnectorAccountNotFoundError: Account \"0xA0Cf798816D4b9b9866b5330EEa46a18382f251e\" not found for connector \"Mock Connector\".\n\n    Version: @wagmi/core@x.y.z]\n  `)\n  expect(\n    new ConnectorChainMismatchError({\n      connectionChainId: 1,\n      connectorChainId: 123,\n    }),\n  ).toMatchInlineSnapshot(`\n    [ConnectorChainMismatchError: The current chain of the connector (id: 123) does not match the connection's chain (id: 1).\n\n    Current Chain ID:  123\n    Expected Chain ID: 1\n\n    Version: @wagmi/core@x.y.z]\n  `)\n  expect(\n    new ConnectorUnavailableReconnectingError({\n      connector: { name: 'Rabby Wallet' },\n    }),\n  ).toMatchInlineSnapshot(`\n    [ConnectorUnavailableReconnectingError: Connector \"Rabby Wallet\" unavailable while reconnecting.\n\n    Details: During the reconnection step, the only connector methods guaranteed to be available are: \\`id\\`, \\`name\\`, \\`type\\`, \\`uid\\`. All other methods are not guaranteed to be available until reconnection completes and connectors are fully restored. This error commonly occurs for connectors that asynchronously inject after reconnection has already started.\n    Version: @wagmi/core@x.y.z]\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/errors/config.ts",
    "content": "import type { Address } from 'viem'\n\nimport type { Connector } from '../createConfig.js'\nimport { BaseError } from './base.js'\n\nexport type ChainNotConfiguredErrorType = ChainNotConfiguredError & {\n  name: 'ChainNotConfiguredError'\n}\nexport class ChainNotConfiguredError extends BaseError {\n  override name = 'ChainNotConfiguredError'\n  constructor() {\n    super('Chain not configured.')\n  }\n}\n\nexport type ConnectorAlreadyConnectedErrorType =\n  ConnectorAlreadyConnectedError & {\n    name: 'ConnectorAlreadyConnectedError'\n  }\nexport class ConnectorAlreadyConnectedError extends BaseError {\n  override name = 'ConnectorAlreadyConnectedError'\n  constructor() {\n    super('Connector already connected.')\n  }\n}\n\nexport type ConnectorNotConnectedErrorType = ConnectorNotConnectedError & {\n  name: 'ConnectorNotConnectedError'\n}\nexport class ConnectorNotConnectedError extends BaseError {\n  override name = 'ConnectorNotConnectedError'\n  constructor() {\n    super('Connector not connected.')\n  }\n}\n\nexport type ConnectorNotFoundErrorType = ConnectorNotFoundError & {\n  name: 'ConnectorNotFoundError'\n}\nexport class ConnectorNotFoundError extends BaseError {\n  override name = 'ConnectorNotFoundError'\n  constructor() {\n    super('Connector not found.')\n  }\n}\n\nexport type ConnectorAccountNotFoundErrorType =\n  ConnectorAccountNotFoundError & {\n    name: 'ConnectorAccountNotFoundError'\n  }\nexport class ConnectorAccountNotFoundError extends BaseError {\n  override name = 'ConnectorAccountNotFoundError'\n  constructor({\n    address,\n    connector,\n  }: {\n    address: Address\n    connector: Connector\n  }) {\n    super(`Account \"${address}\" not found for connector \"${connector.name}\".`)\n  }\n}\n\nexport type ConnectorChainMismatchErrorType = ConnectorAccountNotFoundError & {\n  name: 'ConnectorChainMismatchError'\n}\nexport class ConnectorChainMismatchError extends BaseError {\n  override name = 'ConnectorChainMismatchError'\n  constructor({\n    connectionChainId,\n    connectorChainId,\n  }: {\n    connectionChainId: number\n    connectorChainId: number\n  }) {\n    super(\n      `The current chain of the connector (id: ${connectorChainId}) does not match the connection's chain (id: ${connectionChainId}).`,\n      {\n        metaMessages: [\n          `Current Chain ID:  ${connectorChainId}`,\n          `Expected Chain ID: ${connectionChainId}`,\n        ],\n      },\n    )\n  }\n}\n\nexport type ConnectorUnavailableReconnectingErrorType =\n  ConnectorUnavailableReconnectingError & {\n    name: 'ConnectorUnavailableReconnectingError'\n  }\nexport class ConnectorUnavailableReconnectingError extends BaseError {\n  override name = 'ConnectorUnavailableReconnectingError'\n  constructor({ connector }: { connector: { name: string } }) {\n    super(`Connector \"${connector.name}\" unavailable while reconnecting.`, {\n      details: [\n        'During the reconnection step, the only connector methods guaranteed to be available are: `id`, `name`, `type`, `uid`.',\n        'All other methods are not guaranteed to be available until reconnection completes and connectors are fully restored.',\n        'This error commonly occurs for connectors that asynchronously inject after reconnection has already started.',\n      ].join(' '),\n    })\n  }\n}\n"
  },
  {
    "path": "packages/core/src/errors/connector.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport {\n  ProviderNotFoundError,\n  SwitchChainNotSupportedError,\n} from './connector.js'\n\ntest('constructors', () => {\n  expect(new ProviderNotFoundError()).toMatchInlineSnapshot(`\n    [ProviderNotFoundError: Provider not found.\n\n    Version: @wagmi/core@x.y.z]\n  `)\n  expect(\n    new SwitchChainNotSupportedError({\n      connector: config.connectors[0]!,\n    }),\n  ).toMatchInlineSnapshot(`\n    [SwitchChainNotSupportedError: \"Mock Connector\" does not support programmatic chain switching.\n\n    Version: @wagmi/core@x.y.z]\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/errors/connector.ts",
    "content": "import type { Connector } from '../createConfig.js'\nimport { BaseError } from './base.js'\n\nexport type ProviderNotFoundErrorType = ProviderNotFoundError & {\n  name: 'ProviderNotFoundError'\n}\nexport class ProviderNotFoundError extends BaseError {\n  override name = 'ProviderNotFoundError'\n  constructor() {\n    super('Provider not found.')\n  }\n}\n\nexport type SwitchChainNotSupportedErrorType = SwitchChainNotSupportedError & {\n  name: 'SwitchChainNotSupportedError'\n}\nexport class SwitchChainNotSupportedError extends BaseError {\n  override name = 'SwitchChainNotSupportedError'\n\n  constructor({ connector }: { connector: Connector }) {\n    super(`\"${connector.name}\" does not support programmatic chain switching.`)\n  }\n}\n"
  },
  {
    "path": "packages/core/src/exports/actions.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport * as actions from './actions.js'\n\ntest('exports', () => {\n  expect(Object.keys(actions)).toMatchInlineSnapshot(`\n    [\n      \"call\",\n      \"connect\",\n      \"deployContract\",\n      \"disconnect\",\n      \"estimateFeesPerGas\",\n      \"estimateGas\",\n      \"estimateMaxPriorityFeePerGas\",\n      \"getBalance\",\n      \"getBlobBaseFee\",\n      \"getBlock\",\n      \"getBlockNumber\",\n      \"getBlockTransactionCount\",\n      \"getBytecode\",\n      \"getCallsStatus\",\n      \"getCapabilities\",\n      \"getChainId\",\n      \"getChains\",\n      \"getClient\",\n      \"getAccount\",\n      \"getConnection\",\n      \"getConnections\",\n      \"getConnectorClient\",\n      \"getConnectors\",\n      \"getContractEvents\",\n      \"getEnsAddress\",\n      \"getEnsAvatar\",\n      \"getEnsName\",\n      \"getEnsResolver\",\n      \"getEnsText\",\n      \"getFeeHistory\",\n      \"getGasPrice\",\n      \"getProof\",\n      \"getPublicClient\",\n      \"getStorageAt\",\n      \"getTransaction\",\n      \"getTransactionConfirmations\",\n      \"getTransactionCount\",\n      \"getTransactionReceipt\",\n      \"getWalletClient\",\n      \"multicall\",\n      \"prepareTransactionRequest\",\n      \"readContract\",\n      \"readContracts\",\n      \"reconnect\",\n      \"sendCalls\",\n      \"sendTransaction\",\n      \"showCallsStatus\",\n      \"signMessage\",\n      \"signTransaction\",\n      \"signTypedData\",\n      \"simulateContract\",\n      \"switchChain\",\n      \"switchAccount\",\n      \"switchConnection\",\n      \"verifyMessage\",\n      \"verifyTypedData\",\n      \"waitForCallsStatus\",\n      \"waitForTransactionReceipt\",\n      \"watchAsset\",\n      \"watchBlockNumber\",\n      \"watchBlocks\",\n      \"watchChainId\",\n      \"watchClient\",\n      \"watchAccount\",\n      \"watchConnection\",\n      \"watchConnections\",\n      \"watchConnectors\",\n      \"watchContractEvent\",\n      \"watchPendingTransactions\",\n      \"watchPublicClient\",\n      \"writeContract\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/exports/actions.ts",
    "content": "////////////////////////////////////////////////////////////////////////////////\n// Actions\n////////////////////////////////////////////////////////////////////////////////\n\n// biome-ignore lint/performance/noBarrelFile: entrypoint module\nexport {\n  type CallErrorType,\n  type CallParameters,\n  type CallReturnType,\n  call,\n} from '../actions/call.js'\n\nexport {\n  type ConnectErrorType,\n  type ConnectParameters,\n  type ConnectReturnType,\n  connect,\n} from '../actions/connect.js'\n\nexport {\n  type DeployContractErrorType,\n  type DeployContractParameters,\n  type DeployContractReturnType,\n  deployContract,\n} from '../actions/deployContract.js'\n\nexport {\n  type DisconnectErrorType,\n  type DisconnectParameters,\n  type DisconnectReturnType,\n  disconnect,\n} from '../actions/disconnect.js'\n\nexport {\n  type EstimateFeesPerGasErrorType,\n  type EstimateFeesPerGasParameters,\n  type EstimateFeesPerGasReturnType,\n  estimateFeesPerGas,\n} from '../actions/estimateFeesPerGas.js'\n\nexport {\n  type EstimateGasErrorType,\n  type EstimateGasParameters,\n  type EstimateGasReturnType,\n  estimateGas,\n} from '../actions/estimateGas.js'\n\nexport {\n  type EstimateMaxPriorityFeePerGasErrorType,\n  type EstimateMaxPriorityFeePerGasParameters,\n  type EstimateMaxPriorityFeePerGasReturnType,\n  estimateMaxPriorityFeePerGas,\n} from '../actions/estimateMaxPriorityFeePerGas.js'\n\nexport {\n  type GetBalanceErrorType,\n  type GetBalanceParameters,\n  type GetBalanceReturnType,\n  getBalance,\n} from '../actions/getBalance.js'\n\nexport {\n  type GetBlobBaseFeeErrorType,\n  type GetBlobBaseFeeParameters,\n  type GetBlobBaseFeeReturnType,\n  getBlobBaseFee,\n} from '../actions/getBlobBaseFee.js'\n\nexport {\n  type GetBlockErrorType,\n  type GetBlockParameters,\n  type GetBlockReturnType,\n  getBlock,\n} from '../actions/getBlock.js'\n\nexport {\n  type GetBlockNumberErrorType,\n  type GetBlockNumberParameters,\n  type GetBlockNumberReturnType,\n  getBlockNumber,\n} from '../actions/getBlockNumber.js'\n\nexport {\n  type GetBlockTransactionCountErrorType,\n  type GetBlockTransactionCountParameters,\n  type GetBlockTransactionCountReturnType,\n  getBlockTransactionCount,\n} from '../actions/getBlockTransactionCount.js'\n\nexport {\n  type GetBytecodeErrorType,\n  type GetBytecodeParameters,\n  type GetBytecodeReturnType,\n  getBytecode,\n} from '../actions/getBytecode.js'\n\nexport {\n  type GetCallsStatusErrorType,\n  type GetCallsStatusParameters,\n  type GetCallsStatusReturnType,\n  getCallsStatus,\n} from '../actions/getCallsStatus.js'\n\nexport {\n  type GetCapabilitiesErrorType,\n  type GetCapabilitiesParameters,\n  type GetCapabilitiesReturnType,\n  getCapabilities,\n} from '../actions/getCapabilities.js'\n\nexport {\n  type GetChainIdReturnType,\n  getChainId,\n} from '../actions/getChainId.js'\n\nexport {\n  type GetChainsReturnType,\n  getChains,\n} from '../actions/getChains.js'\n\nexport {\n  type GetClientParameters,\n  type GetClientReturnType,\n  getClient,\n} from '../actions/getClient.js'\n\nexport {\n  /** @deprecated use `GetConnectionReturnType` instead */\n  type GetConnectionReturnType as GetAccountReturnType,\n  type GetConnectionReturnType,\n  /** @deprecated use `getConnection` instead */\n  getConnection as getAccount,\n  getConnection,\n} from '../actions/getConnection.js'\n\nexport {\n  type GetConnectionsReturnType,\n  getConnections,\n} from '../actions/getConnections.js'\nexport {\n  type GetConnectorClientErrorType,\n  type GetConnectorClientParameters,\n  type GetConnectorClientReturnType,\n  getConnectorClient,\n} from '../actions/getConnectorClient.js'\nexport {\n  type GetConnectorsReturnType,\n  getConnectors,\n} from '../actions/getConnectors.js'\n\nexport {\n  type GetContractEventsErrorType,\n  type GetContractEventsParameters,\n  type GetContractEventsReturnType,\n  getContractEvents,\n} from '../actions/getContractEvents.js'\n\nexport {\n  type GetEnsAddressErrorType,\n  type GetEnsAddressParameters,\n  type GetEnsAddressReturnType,\n  getEnsAddress,\n} from '../actions/getEnsAddress.js'\n\nexport {\n  type GetEnsAvatarErrorType,\n  type GetEnsAvatarParameters,\n  type GetEnsAvatarReturnType,\n  getEnsAvatar,\n} from '../actions/getEnsAvatar.js'\n\nexport {\n  type GetEnsNameErrorType,\n  type GetEnsNameParameters,\n  type GetEnsNameReturnType,\n  getEnsName,\n} from '../actions/getEnsName.js'\n\nexport {\n  type GetEnsResolverErrorType,\n  type GetEnsResolverParameters,\n  type GetEnsResolverReturnType,\n  getEnsResolver,\n} from '../actions/getEnsResolver.js'\n\nexport {\n  type GetEnsTextErrorType,\n  type GetEnsTextParameters,\n  type GetEnsTextReturnType,\n  getEnsText,\n} from '../actions/getEnsText.js'\n\nexport {\n  type GetFeeHistoryErrorType,\n  type GetFeeHistoryParameters,\n  type GetFeeHistoryReturnType,\n  getFeeHistory,\n} from '../actions/getFeeHistory.js'\n\nexport {\n  type GetGasPriceErrorType,\n  type GetGasPriceParameters,\n  type GetGasPriceReturnType,\n  getGasPrice,\n} from '../actions/getGasPrice.js'\n\nexport {\n  type GetProofErrorType,\n  type GetProofParameters,\n  type GetProofReturnType,\n  getProof,\n} from '../actions/getProof.js'\n\nexport {\n  type GetPublicClientParameters,\n  type GetPublicClientReturnType,\n  getPublicClient,\n} from '../actions/getPublicClient.js'\n\nexport {\n  type GetStorageAtErrorType,\n  type GetStorageAtParameters,\n  type GetStorageAtReturnType,\n  getStorageAt,\n} from '../actions/getStorageAt.js'\n\nexport {\n  type GetTransactionErrorType,\n  type GetTransactionParameters,\n  type GetTransactionReturnType,\n  getTransaction,\n} from '../actions/getTransaction.js'\n\nexport {\n  type GetTransactionConfirmationsErrorType,\n  type GetTransactionConfirmationsParameters,\n  type GetTransactionConfirmationsReturnType,\n  getTransactionConfirmations,\n} from '../actions/getTransactionConfirmations.js'\n\nexport {\n  type GetTransactionCountErrorType,\n  type GetTransactionCountParameters,\n  type GetTransactionCountReturnType,\n  getTransactionCount,\n} from '../actions/getTransactionCount.js'\n\nexport {\n  type GetTransactionReceiptErrorType,\n  type GetTransactionReceiptParameters,\n  type GetTransactionReceiptReturnType,\n  getTransactionReceipt,\n} from '../actions/getTransactionReceipt.js'\n\nexport {\n  type GetWalletClientErrorType,\n  type GetWalletClientParameters,\n  type GetWalletClientReturnType,\n  getWalletClient,\n} from '../actions/getWalletClient.js'\n\nexport {\n  type MulticallParameters,\n  type MulticallReturnType,\n  multicall,\n} from '../actions/multicall.js'\n\nexport {\n  type PrepareTransactionRequestErrorType,\n  type PrepareTransactionRequestParameters,\n  type PrepareTransactionRequestReturnType,\n  prepareTransactionRequest,\n} from '../actions/prepareTransactionRequest.js'\n\nexport {\n  type ReadContractErrorType,\n  type ReadContractParameters,\n  type ReadContractReturnType,\n  readContract,\n} from '../actions/readContract.js'\n\nexport {\n  type ReadContractsErrorType,\n  type ReadContractsParameters,\n  type ReadContractsReturnType,\n  readContracts,\n} from '../actions/readContracts.js'\n\nexport {\n  type ReconnectErrorType,\n  type ReconnectParameters,\n  type ReconnectReturnType,\n  reconnect,\n} from '../actions/reconnect.js'\n\nexport {\n  type SendCallsErrorType,\n  type SendCallsParameters,\n  type SendCallsReturnType,\n  sendCalls,\n} from '../actions/sendCalls.js'\n\nexport {\n  type SendTransactionErrorType,\n  type SendTransactionParameters,\n  type SendTransactionReturnType,\n  sendTransaction,\n} from '../actions/sendTransaction.js'\n\nexport {\n  type ShowCallsStatusErrorType,\n  type ShowCallsStatusParameters,\n  type ShowCallsStatusReturnType,\n  showCallsStatus,\n} from '../actions/showCallsStatus.js'\n\nexport {\n  type SignMessageErrorType,\n  type SignMessageParameters,\n  type SignMessageReturnType,\n  signMessage,\n} from '../actions/signMessage.js'\n\nexport {\n  type SignTransactionErrorType,\n  type SignTransactionParameters,\n  type SignTransactionReturnType,\n  signTransaction,\n} from '../actions/signTransaction.js'\n\nexport {\n  type SignTypedDataErrorType,\n  type SignTypedDataParameters,\n  type SignTypedDataReturnType,\n  signTypedData,\n} from '../actions/signTypedData.js'\n\nexport {\n  type SimulateContractErrorType,\n  type SimulateContractParameters,\n  type SimulateContractReturnType,\n  simulateContract,\n} from '../actions/simulateContract.js'\n\nexport {\n  type SwitchChainErrorType,\n  type SwitchChainParameters,\n  type SwitchChainReturnType,\n  switchChain,\n} from '../actions/switchChain.js'\n\nexport {\n  /** @deprecated use `SwitchConnectionErrorType` instead */\n  type SwitchConnectionErrorType as SwitchAccountErrorType,\n  type SwitchConnectionErrorType,\n  /** @deprecated use `SwitchConnectionParameters` instead */\n  type SwitchConnectionParameters as SwitchAccountParameters,\n  type SwitchConnectionParameters,\n  /** @deprecated use `SwitchConnectionReturnType` instead */\n  type SwitchConnectionReturnType as SwitchAccountReturnType,\n  type SwitchConnectionReturnType,\n  /** @deprecated use `switchConnection` instead */\n  switchConnection as switchAccount,\n  switchConnection,\n} from '../actions/switchConnection.js'\n\nexport {\n  type VerifyMessageParameters,\n  type VerifyMessageReturnType,\n  verifyMessage,\n} from '../actions/verifyMessage.js'\n\nexport {\n  type VerifyTypedDataParameters,\n  type VerifyTypedDataReturnType,\n  verifyTypedData,\n} from '../actions/verifyTypedData.js'\n\nexport {\n  type WaitForCallsStatusErrorType,\n  type WaitForCallsStatusParameters,\n  type WaitForCallsStatusReturnType,\n  waitForCallsStatus,\n} from '../actions/waitForCallsStatus.js'\n\nexport {\n  type WaitForTransactionReceiptErrorType,\n  type WaitForTransactionReceiptParameters,\n  type WaitForTransactionReceiptReturnType,\n  waitForTransactionReceipt,\n} from '../actions/waitForTransactionReceipt.js'\n\nexport {\n  type WatchAssetParameters,\n  type WatchAssetReturnType,\n  watchAsset,\n} from '../actions/watchAsset.js'\n\nexport {\n  type WatchBlockNumberParameters,\n  type WatchBlockNumberReturnType,\n  watchBlockNumber,\n} from '../actions/watchBlockNumber.js'\n\nexport {\n  type WatchBlocksParameters,\n  type WatchBlocksReturnType,\n  watchBlocks,\n} from '../actions/watchBlocks.js'\n\nexport {\n  type WatchChainIdParameters,\n  type WatchChainIdReturnType,\n  watchChainId,\n} from '../actions/watchChainId.js'\n\nexport {\n  type WatchClientParameters,\n  type WatchClientReturnType,\n  watchClient,\n} from '../actions/watchClient.js'\n\nexport {\n  /** @deprecated use `WatchConnectionParameters` instead */\n  type WatchConnectionParameters as WatchAccountParameters,\n  type WatchConnectionParameters,\n  /** @deprecated use `WatchConnectionReturnType` instead */\n  type WatchConnectionReturnType as WatchAccountReturnType,\n  type WatchConnectionReturnType,\n  /** @deprecated use `watchConnection` instead */\n  watchConnection as watchAccount,\n  watchConnection,\n} from '../actions/watchConnection.js'\n\nexport {\n  type WatchConnectionsParameters,\n  type WatchConnectionsReturnType,\n  watchConnections,\n} from '../actions/watchConnections.js'\n\nexport {\n  type WatchConnectorsParameters,\n  type WatchConnectorsReturnType,\n  watchConnectors,\n} from '../actions/watchConnectors.js'\n\nexport {\n  type WatchContractEventParameters,\n  type WatchContractEventReturnType,\n  watchContractEvent,\n} from '../actions/watchContractEvent.js'\n\nexport {\n  type WatchPendingTransactionsParameters,\n  type WatchPendingTransactionsReturnType,\n  watchPendingTransactions,\n} from '../actions/watchPendingTransactions.js'\n\nexport {\n  type WatchPublicClientParameters,\n  type WatchPublicClientReturnType,\n  watchPublicClient,\n} from '../actions/watchPublicClient.js'\n\nexport {\n  type WriteContractErrorType,\n  type WriteContractParameters,\n  type WriteContractReturnType,\n  writeContract,\n} from '../actions/writeContract.js'\n"
  },
  {
    "path": "packages/core/src/exports/chains.ts",
    "content": "////////////////////////////////////////////////////////////////////////////////\n// viem/chains\n////////////////////////////////////////////////////////////////////////////////\n\n// biome-ignore lint/performance/noBarrelFile: entrypoint module\n// biome-ignore lint/performance/noReExportAll: entrypoint module\nexport * from 'viem/chains'\n"
  },
  {
    "path": "packages/core/src/exports/codegen.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport * as codegen from './codegen.js'\n\ntest('exports', () => {\n  expect(Object.keys(codegen)).toMatchInlineSnapshot(`\n    [\n      \"createReadContract\",\n      \"createSimulateContract\",\n      \"createWatchContractEvent\",\n      \"createWriteContract\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/exports/codegen.ts",
    "content": "// biome-ignore lint/performance/noBarrelFile: entrypoint module\nexport {\n  type CreateReadContractParameters,\n  type CreateReadContractReturnType,\n  createReadContract,\n} from '../actions/codegen/createReadContract.js'\nexport {\n  type CreateSimulateContractParameters,\n  type CreateSimulateContractReturnType,\n  createSimulateContract,\n} from '../actions/codegen/createSimulateContract.js'\n\nexport {\n  type CreateWatchContractEventParameters,\n  type CreateWatchContractEventReturnType,\n  createWatchContractEvent,\n} from '../actions/codegen/createWatchContractEvent.js'\n\nexport {\n  type CreateWriteContractParameters,\n  type CreateWriteContractReturnType,\n  createWriteContract,\n} from '../actions/codegen/createWriteContract.js'\n"
  },
  {
    "path": "packages/core/src/exports/index.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport * as core from './index.js'\n\ntest('exports', () => {\n  expect(Object.keys(core)).toMatchInlineSnapshot(`\n    [\n      \"call\",\n      \"connect\",\n      \"deployContract\",\n      \"disconnect\",\n      \"estimateFeesPerGas\",\n      \"estimateGas\",\n      \"estimateMaxPriorityFeePerGas\",\n      \"getBalance\",\n      \"getBlobBaseFee\",\n      \"getBlock\",\n      \"getBlockNumber\",\n      \"getBlockTransactionCount\",\n      \"getBytecode\",\n      \"getCallsStatus\",\n      \"getCapabilities\",\n      \"getChainId\",\n      \"getChains\",\n      \"getClient\",\n      \"getAccount\",\n      \"getConnection\",\n      \"getConnections\",\n      \"getConnectorClient\",\n      \"getConnectors\",\n      \"getContractEvents\",\n      \"getEnsAddress\",\n      \"getEnsAvatar\",\n      \"getEnsName\",\n      \"getEnsResolver\",\n      \"getEnsText\",\n      \"getFeeHistory\",\n      \"getGasPrice\",\n      \"getProof\",\n      \"getPublicClient\",\n      \"getStorageAt\",\n      \"getTransaction\",\n      \"getTransactionConfirmations\",\n      \"getTransactionCount\",\n      \"getTransactionReceipt\",\n      \"getWalletClient\",\n      \"multicall\",\n      \"prepareTransactionRequest\",\n      \"readContract\",\n      \"readContracts\",\n      \"reconnect\",\n      \"sendCalls\",\n      \"sendCallsSync\",\n      \"sendTransaction\",\n      \"sendTransactionSync\",\n      \"showCallsStatus\",\n      \"signMessage\",\n      \"signTransaction\",\n      \"signTypedData\",\n      \"simulateContract\",\n      \"switchChain\",\n      \"switchAccount\",\n      \"switchConnection\",\n      \"verifyMessage\",\n      \"verifyTypedData\",\n      \"waitForCallsStatus\",\n      \"waitForTransactionReceipt\",\n      \"watchAsset\",\n      \"watchBlockNumber\",\n      \"watchBlocks\",\n      \"watchChainId\",\n      \"watchClient\",\n      \"watchAccount\",\n      \"watchConnection\",\n      \"watchConnections\",\n      \"watchConnectors\",\n      \"watchContractEvent\",\n      \"watchPendingTransactions\",\n      \"watchPublicClient\",\n      \"writeContract\",\n      \"writeContractSync\",\n      \"createConnector\",\n      \"injected\",\n      \"mock\",\n      \"createConfig\",\n      \"createStorage\",\n      \"noopStorage\",\n      \"hydrate\",\n      \"BaseError\",\n      \"ChainNotConfiguredError\",\n      \"ConnectorAccountNotFoundError\",\n      \"ConnectorAlreadyConnectedError\",\n      \"ConnectorChainMismatchError\",\n      \"ConnectorNotConnectedError\",\n      \"ConnectorNotFoundError\",\n      \"ConnectorUnavailableReconnectingError\",\n      \"ProviderNotFoundError\",\n      \"SwitchChainNotSupportedError\",\n      \"custom\",\n      \"http\",\n      \"webSocket\",\n      \"unstable_connector\",\n      \"fallback\",\n      \"cookieStorage\",\n      \"cookieToInitialState\",\n      \"parseCookie\",\n      \"deepEqual\",\n      \"deserialize\",\n      \"extractRpcUrls\",\n      \"serialize\",\n      \"version\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/exports/index.ts",
    "content": "////////////////////////////////////////////////////////////////////////////////\n// Actions\n////////////////////////////////////////////////////////////////////////////////\n\n// biome-ignore lint/performance/noBarrelFile: entrypoint module\nexport {\n  type CallErrorType,\n  type CallParameters,\n  type CallReturnType,\n  call,\n} from '../actions/call.js'\n\nexport {\n  type ConnectErrorType,\n  type ConnectParameters,\n  type ConnectReturnType,\n  connect,\n} from '../actions/connect.js'\n\nexport {\n  type DeployContractErrorType,\n  type DeployContractParameters,\n  type DeployContractReturnType,\n  deployContract,\n} from '../actions/deployContract.js'\n\nexport {\n  type DisconnectErrorType,\n  type DisconnectParameters,\n  type DisconnectReturnType,\n  disconnect,\n} from '../actions/disconnect.js'\n\nexport {\n  type EstimateFeesPerGasErrorType,\n  type EstimateFeesPerGasParameters,\n  type EstimateFeesPerGasReturnType,\n  estimateFeesPerGas,\n} from '../actions/estimateFeesPerGas.js'\n\nexport {\n  type EstimateGasErrorType,\n  type EstimateGasParameters,\n  type EstimateGasReturnType,\n  estimateGas,\n} from '../actions/estimateGas.js'\n\nexport {\n  type EstimateMaxPriorityFeePerGasErrorType,\n  type EstimateMaxPriorityFeePerGasParameters,\n  type EstimateMaxPriorityFeePerGasReturnType,\n  estimateMaxPriorityFeePerGas,\n} from '../actions/estimateMaxPriorityFeePerGas.js'\n\nexport {\n  type GetBalanceErrorType,\n  type GetBalanceParameters,\n  type GetBalanceReturnType,\n  getBalance,\n} from '../actions/getBalance.js'\n\nexport {\n  type GetBlobBaseFeeErrorType,\n  type GetBlobBaseFeeParameters,\n  type GetBlobBaseFeeReturnType,\n  getBlobBaseFee,\n} from '../actions/getBlobBaseFee.js'\n\nexport {\n  type GetBlockErrorType,\n  type GetBlockParameters,\n  type GetBlockReturnType,\n  getBlock,\n} from '../actions/getBlock.js'\n\nexport {\n  type GetBlockNumberErrorType,\n  type GetBlockNumberParameters,\n  type GetBlockNumberReturnType,\n  getBlockNumber,\n} from '../actions/getBlockNumber.js'\n\nexport {\n  type GetBlockTransactionCountErrorType,\n  type GetBlockTransactionCountParameters,\n  type GetBlockTransactionCountReturnType,\n  getBlockTransactionCount,\n} from '../actions/getBlockTransactionCount.js'\n\nexport {\n  type GetBytecodeErrorType,\n  type GetBytecodeParameters,\n  type GetBytecodeReturnType,\n  getBytecode,\n} from '../actions/getBytecode.js'\n\nexport {\n  type GetCallsStatusErrorType,\n  type GetCallsStatusParameters,\n  type GetCallsStatusReturnType,\n  getCallsStatus,\n} from '../actions/getCallsStatus.js'\n\nexport {\n  type GetCapabilitiesErrorType,\n  type GetCapabilitiesParameters,\n  type GetCapabilitiesReturnType,\n  getCapabilities,\n} from '../actions/getCapabilities.js'\n\nexport {\n  type GetChainIdReturnType,\n  getChainId,\n} from '../actions/getChainId.js'\n\nexport {\n  type GetChainsReturnType,\n  getChains,\n} from '../actions/getChains.js'\n\nexport {\n  type GetClientParameters,\n  type GetClientReturnType,\n  getClient,\n} from '../actions/getClient.js'\n\nexport {\n  /** @deprecated use `GetConnectionReturnType` instead */\n  type GetConnectionReturnType as GetAccountReturnType,\n  type GetConnectionReturnType,\n  /** @deprecated use `getConnection` instead */\n  getConnection as getAccount,\n  getConnection,\n} from '../actions/getConnection.js'\n\nexport {\n  type GetConnectionsReturnType,\n  getConnections,\n} from '../actions/getConnections.js'\n\nexport {\n  type GetConnectorClientErrorType,\n  type GetConnectorClientParameters,\n  type GetConnectorClientReturnType,\n  getConnectorClient,\n} from '../actions/getConnectorClient.js'\n\nexport {\n  type GetConnectorsReturnType,\n  getConnectors,\n} from '../actions/getConnectors.js'\n\nexport {\n  type GetContractEventsErrorType,\n  type GetContractEventsParameters,\n  type GetContractEventsReturnType,\n  getContractEvents,\n} from '../actions/getContractEvents.js'\n\nexport {\n  type GetEnsAddressErrorType,\n  type GetEnsAddressParameters,\n  type GetEnsAddressReturnType,\n  getEnsAddress,\n} from '../actions/getEnsAddress.js'\n\nexport {\n  type GetEnsAvatarErrorType,\n  type GetEnsAvatarParameters,\n  type GetEnsAvatarReturnType,\n  getEnsAvatar,\n} from '../actions/getEnsAvatar.js'\n\nexport {\n  type GetEnsNameErrorType,\n  type GetEnsNameParameters,\n  type GetEnsNameReturnType,\n  getEnsName,\n} from '../actions/getEnsName.js'\n\nexport {\n  type GetEnsResolverErrorType,\n  type GetEnsResolverParameters,\n  type GetEnsResolverReturnType,\n  getEnsResolver,\n} from '../actions/getEnsResolver.js'\n\nexport {\n  type GetEnsTextErrorType,\n  type GetEnsTextParameters,\n  type GetEnsTextReturnType,\n  getEnsText,\n} from '../actions/getEnsText.js'\n\nexport {\n  type GetFeeHistoryErrorType,\n  type GetFeeHistoryParameters,\n  type GetFeeHistoryReturnType,\n  getFeeHistory,\n} from '../actions/getFeeHistory.js'\n\nexport {\n  type GetGasPriceErrorType,\n  type GetGasPriceParameters,\n  type GetGasPriceReturnType,\n  getGasPrice,\n} from '../actions/getGasPrice.js'\n\nexport {\n  type GetProofErrorType,\n  type GetProofParameters,\n  type GetProofReturnType,\n  getProof,\n} from '../actions/getProof.js'\n\nexport {\n  type GetPublicClientParameters,\n  type GetPublicClientReturnType,\n  getPublicClient,\n} from '../actions/getPublicClient.js'\n\nexport {\n  type GetStorageAtErrorType,\n  type GetStorageAtParameters,\n  type GetStorageAtReturnType,\n  getStorageAt,\n} from '../actions/getStorageAt.js'\n\nexport {\n  type GetTransactionErrorType,\n  type GetTransactionParameters,\n  type GetTransactionReturnType,\n  getTransaction,\n} from '../actions/getTransaction.js'\n\nexport {\n  type GetTransactionConfirmationsErrorType,\n  type GetTransactionConfirmationsParameters,\n  type GetTransactionConfirmationsReturnType,\n  getTransactionConfirmations,\n} from '../actions/getTransactionConfirmations.js'\n\nexport {\n  type GetTransactionCountErrorType,\n  type GetTransactionCountParameters,\n  type GetTransactionCountReturnType,\n  getTransactionCount,\n} from '../actions/getTransactionCount.js'\n\nexport {\n  type GetTransactionReceiptErrorType,\n  type GetTransactionReceiptParameters,\n  type GetTransactionReceiptReturnType,\n  getTransactionReceipt,\n} from '../actions/getTransactionReceipt.js'\n\nexport {\n  type GetWalletClientErrorType,\n  type GetWalletClientParameters,\n  type GetWalletClientReturnType,\n  getWalletClient,\n} from '../actions/getWalletClient.js'\n\nexport {\n  type MulticallParameters,\n  type MulticallReturnType,\n  multicall,\n} from '../actions/multicall.js'\n\nexport {\n  type PrepareTransactionRequestErrorType,\n  type PrepareTransactionRequestParameters,\n  type PrepareTransactionRequestReturnType,\n  prepareTransactionRequest,\n} from '../actions/prepareTransactionRequest.js'\n\nexport {\n  type ReadContractErrorType,\n  type ReadContractParameters,\n  type ReadContractReturnType,\n  readContract,\n} from '../actions/readContract.js'\n\nexport {\n  type ReadContractsErrorType,\n  type ReadContractsParameters,\n  type ReadContractsReturnType,\n  readContracts,\n} from '../actions/readContracts.js'\n\nexport {\n  type ReconnectErrorType,\n  type ReconnectParameters,\n  type ReconnectReturnType,\n  reconnect,\n} from '../actions/reconnect.js'\n\nexport {\n  type SendCallsErrorType,\n  type SendCallsParameters,\n  type SendCallsReturnType,\n  sendCalls,\n} from '../actions/sendCalls.js'\n\nexport {\n  type SendCallsSyncErrorType,\n  type SendCallsSyncParameters,\n  type SendCallsSyncReturnType,\n  sendCallsSync,\n} from '../actions/sendCallsSync.js'\n\nexport {\n  type SendTransactionErrorType,\n  type SendTransactionParameters,\n  type SendTransactionReturnType,\n  sendTransaction,\n} from '../actions/sendTransaction.js'\n\nexport {\n  type SendTransactionSyncErrorType,\n  type SendTransactionSyncParameters,\n  type SendTransactionSyncReturnType,\n  sendTransactionSync,\n} from '../actions/sendTransactionSync.js'\n\nexport {\n  type ShowCallsStatusErrorType,\n  type ShowCallsStatusParameters,\n  type ShowCallsStatusReturnType,\n  showCallsStatus,\n} from '../actions/showCallsStatus.js'\n\nexport {\n  type SignMessageErrorType,\n  type SignMessageParameters,\n  type SignMessageReturnType,\n  signMessage,\n} from '../actions/signMessage.js'\n\nexport {\n  type SignTransactionErrorType,\n  type SignTransactionParameters,\n  type SignTransactionReturnType,\n  signTransaction,\n} from '../actions/signTransaction.js'\n\nexport {\n  type SignTypedDataErrorType,\n  type SignTypedDataParameters,\n  type SignTypedDataReturnType,\n  signTypedData,\n} from '../actions/signTypedData.js'\n\nexport {\n  type SimulateContractErrorType,\n  type SimulateContractParameters,\n  type SimulateContractReturnType,\n  simulateContract,\n} from '../actions/simulateContract.js'\n\nexport {\n  type SwitchChainErrorType,\n  type SwitchChainParameters,\n  type SwitchChainReturnType,\n  switchChain,\n} from '../actions/switchChain.js'\n\nexport {\n  /** @deprecated use `SwitchConnectionErrorType` instead */\n  type SwitchConnectionErrorType as SwitchAccountErrorType,\n  type SwitchConnectionErrorType,\n  /** @deprecated use `SwitchConnectionParameters` instead */\n  type SwitchConnectionParameters as SwitchAccountParameters,\n  type SwitchConnectionParameters,\n  /** @deprecated use `SwitchConnectionReturnType` instead */\n  type SwitchConnectionReturnType as SwitchAccountReturnType,\n  type SwitchConnectionReturnType,\n  /** @deprecated use `switchConnection` instead */\n  switchConnection as switchAccount,\n  switchConnection,\n} from '../actions/switchConnection.js'\n\nexport {\n  type VerifyMessageErrorType,\n  type VerifyMessageParameters,\n  type VerifyMessageReturnType,\n  verifyMessage,\n} from '../actions/verifyMessage.js'\n\nexport {\n  type VerifyTypedDataErrorType,\n  type VerifyTypedDataParameters,\n  type VerifyTypedDataReturnType,\n  verifyTypedData,\n} from '../actions/verifyTypedData.js'\n\nexport {\n  type WaitForCallsStatusErrorType,\n  type WaitForCallsStatusParameters,\n  type WaitForCallsStatusReturnType,\n  waitForCallsStatus,\n} from '../actions/waitForCallsStatus.js'\n\nexport {\n  type WaitForTransactionReceiptErrorType,\n  type WaitForTransactionReceiptParameters,\n  type WaitForTransactionReceiptReturnType,\n  waitForTransactionReceipt,\n} from '../actions/waitForTransactionReceipt.js'\n\nexport {\n  type WatchAssetErrorType,\n  type WatchAssetParameters,\n  type WatchAssetReturnType,\n  watchAsset,\n} from '../actions/watchAsset.js'\n\nexport {\n  type WatchBlockNumberParameters,\n  type WatchBlockNumberReturnType,\n  watchBlockNumber,\n} from '../actions/watchBlockNumber.js'\n\nexport {\n  type WatchBlocksParameters,\n  type WatchBlocksReturnType,\n  watchBlocks,\n} from '../actions/watchBlocks.js'\n\nexport {\n  type WatchChainIdParameters,\n  type WatchChainIdReturnType,\n  watchChainId,\n} from '../actions/watchChainId.js'\n\nexport {\n  type WatchClientParameters,\n  type WatchClientReturnType,\n  watchClient,\n} from '../actions/watchClient.js'\n\nexport {\n  /** @deprecated use `WatchConnectionParameters` instead */\n  type WatchConnectionParameters as WatchAccountParameters,\n  type WatchConnectionParameters,\n  /** @deprecated use `WatchConnectionReturnType` instead */\n  type WatchConnectionReturnType as WatchAccountReturnType,\n  type WatchConnectionReturnType,\n  /** @deprecated use `watchConnection` instead */\n  watchConnection as watchAccount,\n  watchConnection,\n} from '../actions/watchConnection.js'\n\nexport {\n  type WatchConnectionsParameters,\n  type WatchConnectionsReturnType,\n  watchConnections,\n} from '../actions/watchConnections.js'\n\nexport {\n  type WatchConnectorsParameters,\n  type WatchConnectorsReturnType,\n  watchConnectors,\n} from '../actions/watchConnectors.js'\n\nexport {\n  type WatchContractEventParameters,\n  type WatchContractEventReturnType,\n  watchContractEvent,\n} from '../actions/watchContractEvent.js'\n\nexport {\n  type WatchPendingTransactionsParameters,\n  type WatchPendingTransactionsReturnType,\n  watchPendingTransactions,\n} from '../actions/watchPendingTransactions.js'\n\nexport {\n  type WatchPublicClientParameters,\n  type WatchPublicClientReturnType,\n  watchPublicClient,\n} from '../actions/watchPublicClient.js'\n\nexport {\n  type WriteContractErrorType,\n  type WriteContractParameters,\n  type WriteContractReturnType,\n  writeContract,\n} from '../actions/writeContract.js'\n\nexport {\n  type WriteContractSyncErrorType,\n  type WriteContractSyncParameters,\n  type WriteContractSyncReturnType,\n  writeContractSync,\n} from '../actions/writeContractSync.js'\n\n////////////////////////////////////////////////////////////////////////////////\n// Connectors\n////////////////////////////////////////////////////////////////////////////////\n\nexport {\n  type ConnectorEventMap,\n  type CreateConnectorFn,\n  createConnector,\n} from '../connectors/createConnector.js'\n\nexport {\n  type InjectedParameters,\n  injected,\n} from '../connectors/injected.js'\n\nexport {\n  type MockParameters,\n  mock,\n} from '../connectors/mock.js'\n\n////////////////////////////////////////////////////////////////////////////////\n// createConfig\n////////////////////////////////////////////////////////////////////////////////\n\nexport {\n  type Config,\n  type Connection,\n  type Connector,\n  type CreateConfigParameters,\n  createConfig,\n  type PartializedState,\n  type State,\n  type Transport,\n} from '../createConfig.js'\n\n////////////////////////////////////////////////////////////////////////////////\n// createStorage\n////////////////////////////////////////////////////////////////////////////////\n\nexport {\n  type CreateStorageParameters,\n  createStorage,\n  noopStorage,\n  type Storage,\n  type StorageItemMap,\n} from '../createStorage.js'\n\n////////////////////////////////////////////////////////////////////////////////\n// Hydrate\n////////////////////////////////////////////////////////////////////////////////\n\nexport { hydrate } from '../hydrate.js'\n\n////////////////////////////////////////////////////////////////////////////////\n// Errors\n////////////////////////////////////////////////////////////////////////////////\n\nexport { BaseError } from '../errors/base.js'\n\nexport {\n  ChainNotConfiguredError,\n  type ChainNotConfiguredErrorType,\n  ConnectorAccountNotFoundError,\n  type ConnectorAccountNotFoundErrorType,\n  ConnectorAlreadyConnectedError,\n  type ConnectorAlreadyConnectedErrorType,\n  ConnectorChainMismatchError,\n  type ConnectorChainMismatchErrorType,\n  ConnectorNotConnectedError,\n  type ConnectorNotConnectedErrorType,\n  ConnectorNotFoundError,\n  type ConnectorNotFoundErrorType,\n  ConnectorUnavailableReconnectingError,\n  type ConnectorUnavailableReconnectingErrorType,\n} from '../errors/config.js'\n\nexport {\n  ProviderNotFoundError,\n  type ProviderNotFoundErrorType,\n  SwitchChainNotSupportedError,\n  type SwitchChainNotSupportedErrorType,\n} from '../errors/connector.js'\n\n////////////////////////////////////////////////////////////////////////////////\n// Transports\n////////////////////////////////////////////////////////////////////////////////\n\nexport { custom, http, webSocket } from 'viem'\n\nexport {\n  type ConnectorTransport,\n  type ConnectorTransportConfig,\n  unstable_connector,\n} from '../transports/connector.js'\n\nexport { fallback } from '../transports/fallback.js'\n\n////////////////////////////////////////////////////////////////////////////////\n// Types\n////////////////////////////////////////////////////////////////////////////////\n\nexport type { SelectChains } from '../types/chain.js'\n\nexport type { Register, ResolvedRegister } from '../types/register.js'\n\n////////////////////////////////////////////////////////////////////////////////\n// Utilities\n////////////////////////////////////////////////////////////////////////////////\n\nexport {\n  cookieStorage,\n  cookieToInitialState,\n  parseCookie,\n} from '../utils/cookie.js'\n\nexport { deepEqual } from '../utils/deepEqual.js'\n\nexport { deserialize } from '../utils/deserialize.js'\n\nexport { extractRpcUrls } from '../utils/extractRpcUrls.js'\n\nexport { serialize } from '../utils/serialize.js'\n\n////////////////////////////////////////////////////////////////////////////////\n// Version\n////////////////////////////////////////////////////////////////////////////////\n\nexport { version } from '../version.js'\n"
  },
  {
    "path": "packages/core/src/exports/internal.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport * as internal from './internal.js'\n\ntest('exports', () => {\n  expect(Object.keys(internal)).toMatchInlineSnapshot(`\n    [\n      \"watchChains\",\n      \"createEmitter\",\n      \"Emitter\",\n      \"deepEqual\",\n      \"uid\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/exports/internal.ts",
    "content": "////////////////////////////////////////////////////////////////////////////////\n// Actions\n////////////////////////////////////////////////////////////////////////////////\n\n// biome-ignore lint/performance/noBarrelFile: entrypoint module\nexport {\n  type WatchChainsParameters,\n  type WatchChainsReturnType,\n  watchChains,\n} from '../actions/watchChains.js'\n\n////////////////////////////////////////////////////////////////////////////////\n// Emitter\n////////////////////////////////////////////////////////////////////////////////\n\nexport {\n  createEmitter,\n  Emitter,\n  type EventData,\n} from '../createEmitter.js'\n\n////////////////////////////////////////////////////////////////////////////////\n// Types\n////////////////////////////////////////////////////////////////////////////////\n\nexport type { SelectChains } from '../types/chain.js'\n\nexport type {\n  ChainIdParameter,\n  ConfigParameter,\n  ConnectorParameter,\n  EnabledParameter,\n  ScopeKeyParameter,\n} from '../types/properties.js'\n\nexport type { QueryParameter } from '../types/query.js'\n\nexport type {\n  Compute,\n  ExactPartial,\n  FixedArray,\n  Mutable,\n  OneOf,\n  PartialBy,\n  RemoveUndefined,\n  RequiredBy,\n  StrictOmit as Omit,\n  UnionCompute,\n  UnionExactPartial,\n  UnionLooseOmit,\n  UnionStrictOmit,\n} from '../types/utils.js'\n\n////////////////////////////////////////////////////////////////////////////////\n// Utilities\n////////////////////////////////////////////////////////////////////////////////\n\nexport { deepEqual } from '../utils/deepEqual.js'\n\nexport { uid } from '../utils/uid.js'\n"
  },
  {
    "path": "packages/core/src/exports/query.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport * as query from './query.js'\n\ntest('exports', () => {\n  expect(Object.keys(query)).toMatchInlineSnapshot(`\n    [\n      \"callQueryKey\",\n      \"callQueryOptions\",\n      \"connectMutationOptions\",\n      \"deployContractMutationOptions\",\n      \"disconnectMutationOptions\",\n      \"estimateFeesPerGasQueryKey\",\n      \"estimateFeesPerGasQueryOptions\",\n      \"estimateGasQueryKey\",\n      \"estimateGasQueryOptions\",\n      \"estimateMaxPriorityFeePerGasQueryKey\",\n      \"estimateMaxPriorityFeePerGasQueryOptions\",\n      \"getBalanceQueryKey\",\n      \"getBalanceQueryOptions\",\n      \"getBlobBaseFeeQueryKey\",\n      \"getBlobBaseFeeQueryOptions\",\n      \"getBlockQueryKey\",\n      \"getBlockQueryOptions\",\n      \"getBlockNumberQueryKey\",\n      \"getBlockNumberQueryOptions\",\n      \"getBlockTransactionCountQueryKey\",\n      \"getBlockTransactionCountQueryOptions\",\n      \"getBytecodeQueryKey\",\n      \"getBytecodeQueryOptions\",\n      \"getCallsStatusQueryKey\",\n      \"getCallsStatusQueryOptions\",\n      \"getCapabilitiesQueryKey\",\n      \"getCapabilitiesQueryOptions\",\n      \"getConnectorClientQueryKey\",\n      \"getConnectorClientQueryOptions\",\n      \"getContractEventsQueryKey\",\n      \"getContractEventsQueryOptions\",\n      \"getEnsAddressQueryKey\",\n      \"getEnsAddressQueryOptions\",\n      \"getEnsAvatarQueryKey\",\n      \"getEnsAvatarQueryOptions\",\n      \"getEnsNameQueryKey\",\n      \"getEnsNameQueryOptions\",\n      \"getEnsResolverQueryKey\",\n      \"getEnsResolverQueryOptions\",\n      \"getEnsTextQueryKey\",\n      \"getEnsTextQueryOptions\",\n      \"getFeeHistoryQueryKey\",\n      \"getFeeHistoryQueryOptions\",\n      \"getGasPriceQueryKey\",\n      \"getGasPriceQueryOptions\",\n      \"getProofQueryKey\",\n      \"getProofQueryOptions\",\n      \"getStorageAtQueryKey\",\n      \"getStorageAtQueryOptions\",\n      \"getTransactionQueryKey\",\n      \"getTransactionQueryOptions\",\n      \"getTransactionConfirmationsQueryKey\",\n      \"getTransactionConfirmationsQueryOptions\",\n      \"getTransactionCountQueryKey\",\n      \"getTransactionCountQueryOptions\",\n      \"getTransactionReceiptQueryKey\",\n      \"getTransactionReceiptQueryOptions\",\n      \"getWalletClientQueryKey\",\n      \"getWalletClientQueryOptions\",\n      \"infiniteReadContractsQueryKey\",\n      \"infiniteReadContractsQueryOptions\",\n      \"prepareTransactionRequestQueryKey\",\n      \"prepareTransactionRequestQueryOptions\",\n      \"readContractQueryKey\",\n      \"readContractQueryOptions\",\n      \"readContractsQueryKey\",\n      \"readContractsQueryOptions\",\n      \"reconnectMutationOptions\",\n      \"sendCallsMutationOptions\",\n      \"sendCallsSyncMutationOptions\",\n      \"sendTransactionMutationOptions\",\n      \"sendTransactionSyncMutationOptions\",\n      \"showCallsStatusMutationOptions\",\n      \"signMessageMutationOptions\",\n      \"signTransactionMutationOptions\",\n      \"signTypedDataMutationOptions\",\n      \"simulateContractQueryKey\",\n      \"simulateContractQueryOptions\",\n      \"switchChainMutationOptions\",\n      \"switchAccountMutationOptions\",\n      \"switchConnectionMutationOptions\",\n      \"hashFn\",\n      \"structuralSharing\",\n      \"verifyMessageQueryKey\",\n      \"verifyMessageQueryOptions\",\n      \"verifyTypedDataQueryKey\",\n      \"verifyTypedDataQueryOptions\",\n      \"waitForCallsStatusQueryKey\",\n      \"waitForCallsStatusQueryOptions\",\n      \"waitForTransactionReceiptQueryKey\",\n      \"waitForTransactionReceiptQueryOptions\",\n      \"watchAssetMutationOptions\",\n      \"writeContractMutationOptions\",\n      \"writeContractSyncMutationOptions\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/exports/query.ts",
    "content": "////////////////////////////////////////////////////////////////////////////////\n// Tanstack Query\n////////////////////////////////////////////////////////////////////////////////\n\n// biome-ignore lint/performance/noBarrelFile: entrypoint module\nexport {\n  type CallData,\n  type CallOptions,\n  type CallQueryFnData,\n  type CallQueryKey,\n  type CallQueryOptions,\n  callQueryKey,\n  callQueryOptions,\n} from '../query/call.js'\n\nexport {\n  type ConnectData,\n  type ConnectMutate,\n  type ConnectMutateAsync,\n  type ConnectMutationOptions,\n  type ConnectOptions,\n  type ConnectVariables,\n  connectMutationOptions,\n} from '../query/connect.js'\n\nexport {\n  type DeployContractData,\n  type DeployContractMutate,\n  type DeployContractMutateAsync,\n  type DeployContractMutationOptions,\n  type DeployContractOptions,\n  type DeployContractVariables,\n  deployContractMutationOptions,\n} from '../query/deployContract.js'\n\nexport {\n  type DisconnectData,\n  type DisconnectMutate,\n  type DisconnectMutateAsync,\n  type DisconnectMutationOptions,\n  type DisconnectOptions,\n  type DisconnectVariables,\n  disconnectMutationOptions,\n} from '../query/disconnect.js'\n\nexport {\n  type EstimateFeesPerGasData,\n  type EstimateFeesPerGasOptions,\n  type EstimateFeesPerGasQueryFnData,\n  type EstimateFeesPerGasQueryKey,\n  type EstimateFeesPerGasQueryOptions,\n  estimateFeesPerGasQueryKey,\n  estimateFeesPerGasQueryOptions,\n} from '../query/estimateFeesPerGas.js'\n\nexport {\n  type EstimateGasData,\n  type EstimateGasOptions,\n  type EstimateGasQueryFnData,\n  type EstimateGasQueryKey,\n  type EstimateGasQueryOptions,\n  estimateGasQueryKey,\n  estimateGasQueryOptions,\n} from '../query/estimateGas.js'\n\nexport {\n  type EstimateMaxPriorityFeePerGasData,\n  type EstimateMaxPriorityFeePerGasOptions,\n  type EstimateMaxPriorityFeePerGasQueryFnData,\n  type EstimateMaxPriorityFeePerGasQueryKey,\n  type EstimateMaxPriorityFeePerGasQueryOptions,\n  estimateMaxPriorityFeePerGasQueryKey,\n  estimateMaxPriorityFeePerGasQueryOptions,\n} from '../query/estimateMaxPriorityFeePerGas.js'\n\nexport {\n  type GetBalanceData,\n  type GetBalanceOptions,\n  type GetBalanceQueryFnData,\n  type GetBalanceQueryKey,\n  type GetBalanceQueryOptions,\n  getBalanceQueryKey,\n  getBalanceQueryOptions,\n} from '../query/getBalance.js'\n\nexport {\n  type GetBlobBaseFeeData,\n  type GetBlobBaseFeeOptions,\n  type GetBlobBaseFeeQueryFnData,\n  type GetBlobBaseFeeQueryKey,\n  type GetBlobBaseFeeQueryOptions,\n  getBlobBaseFeeQueryKey,\n  getBlobBaseFeeQueryOptions,\n} from '../query/getBlobBaseFee.js'\n\nexport {\n  type GetBlockData,\n  type GetBlockOptions,\n  type GetBlockQueryFnData,\n  type GetBlockQueryKey,\n  type GetBlockQueryOptions,\n  getBlockQueryKey,\n  getBlockQueryOptions,\n} from '../query/getBlock.js'\n\nexport {\n  type GetBlockNumberData,\n  type GetBlockNumberOptions,\n  type GetBlockNumberQueryFnData,\n  type GetBlockNumberQueryKey,\n  type GetBlockNumberQueryOptions,\n  getBlockNumberQueryKey,\n  getBlockNumberQueryOptions,\n} from '../query/getBlockNumber.js'\n\nexport {\n  type GetBlockTransactionCountData,\n  type GetBlockTransactionCountOptions,\n  type GetBlockTransactionCountQueryFnData,\n  type GetBlockTransactionCountQueryKey,\n  type GetBlockTransactionCountQueryOptions,\n  getBlockTransactionCountQueryKey,\n  getBlockTransactionCountQueryOptions,\n} from '../query/getBlockTransactionCount.js'\n\nexport {\n  type GetBytecodeData,\n  type GetBytecodeOptions,\n  type GetBytecodeQueryFnData,\n  type GetBytecodeQueryKey,\n  type GetBytecodeQueryOptions,\n  getBytecodeQueryKey,\n  getBytecodeQueryOptions,\n} from '../query/getBytecode.js'\n\nexport {\n  type GetCallsStatusData,\n  type GetCallsStatusOptions,\n  type GetCallsStatusQueryFnData,\n  type GetCallsStatusQueryKey,\n  type GetCallsStatusQueryOptions,\n  getCallsStatusQueryKey,\n  getCallsStatusQueryOptions,\n} from '../query/getCallsStatus.js'\n\nexport {\n  type GetCapabilitiesData,\n  type GetCapabilitiesOptions,\n  type GetCapabilitiesQueryFnData,\n  type GetCapabilitiesQueryKey,\n  type GetCapabilitiesQueryOptions,\n  getCapabilitiesQueryKey,\n  getCapabilitiesQueryOptions,\n} from '../query/getCapabilities.js'\n\nexport {\n  type GetConnectorClientData,\n  type GetConnectorClientOptions,\n  type GetConnectorClientQueryFnData,\n  type GetConnectorClientQueryKey,\n  type GetConnectorClientQueryOptions,\n  getConnectorClientQueryKey,\n  getConnectorClientQueryOptions,\n} from '../query/getConnectorClient.js'\n\nexport {\n  type GetContractEventsData,\n  type GetContractEventsOptions,\n  type GetContractEventsQueryFnData,\n  type GetContractEventsQueryKey,\n  type GetContractEventsQueryOptions,\n  getContractEventsQueryKey,\n  getContractEventsQueryOptions,\n} from '../query/getContractEvents.js'\n\nexport {\n  type GetEnsAddressData,\n  type GetEnsAddressOptions,\n  type GetEnsAddressQueryFnData,\n  type GetEnsAddressQueryKey,\n  type GetEnsAddressQueryOptions,\n  getEnsAddressQueryKey,\n  getEnsAddressQueryOptions,\n} from '../query/getEnsAddress.js'\n\nexport {\n  type GetEnsAvatarData,\n  type GetEnsAvatarOptions,\n  type GetEnsAvatarQueryFnData,\n  type GetEnsAvatarQueryKey,\n  type GetEnsAvatarQueryOptions,\n  getEnsAvatarQueryKey,\n  getEnsAvatarQueryOptions,\n} from '../query/getEnsAvatar.js'\n\nexport {\n  type GetEnsNameData,\n  type GetEnsNameOptions,\n  type GetEnsNameQueryFnData,\n  type GetEnsNameQueryKey,\n  type GetEnsNameQueryOptions,\n  getEnsNameQueryKey,\n  getEnsNameQueryOptions,\n} from '../query/getEnsName.js'\n\nexport {\n  type GetEnsResolverData,\n  type GetEnsResolverOptions,\n  type GetEnsResolverQueryFnData,\n  type GetEnsResolverQueryKey,\n  type GetEnsResolverQueryOptions,\n  getEnsResolverQueryKey,\n  getEnsResolverQueryOptions,\n} from '../query/getEnsResolver.js'\n\nexport {\n  type GetEnsTextData,\n  type GetEnsTextOptions,\n  type GetEnsTextQueryFnData,\n  type GetEnsTextQueryKey,\n  type GetEnsTextQueryOptions,\n  getEnsTextQueryKey,\n  getEnsTextQueryOptions,\n} from '../query/getEnsText.js'\n\nexport {\n  type GetFeeHistoryData,\n  type GetFeeHistoryOptions,\n  type GetFeeHistoryQueryFnData,\n  type GetFeeHistoryQueryKey,\n  type GetFeeHistoryQueryOptions,\n  getFeeHistoryQueryKey,\n  getFeeHistoryQueryOptions,\n} from '../query/getFeeHistory.js'\n\nexport {\n  type GetGasPriceData,\n  type GetGasPriceOptions,\n  type GetGasPriceQueryFnData,\n  type GetGasPriceQueryKey,\n  type GetGasPriceQueryOptions,\n  getGasPriceQueryKey,\n  getGasPriceQueryOptions,\n} from '../query/getGasPrice.js'\n\nexport {\n  type GetProofData,\n  type GetProofOptions,\n  type GetProofQueryFnData,\n  type GetProofQueryKey,\n  type GetProofQueryOptions,\n  getProofQueryKey,\n  getProofQueryOptions,\n} from '../query/getProof.js'\n\nexport {\n  type GetStorageAtData,\n  type GetStorageAtOptions,\n  type GetStorageAtQueryFnData,\n  type GetStorageAtQueryKey,\n  type GetStorageAtQueryOptions,\n  getStorageAtQueryKey,\n  getStorageAtQueryOptions,\n} from '../query/getStorageAt.js'\n\nexport {\n  type GetTransactionData,\n  type GetTransactionOptions,\n  type GetTransactionQueryFnData,\n  type GetTransactionQueryKey,\n  type GetTransactionQueryOptions,\n  getTransactionQueryKey,\n  getTransactionQueryOptions,\n} from '../query/getTransaction.js'\n\nexport {\n  type GetTransactionConfirmationsData,\n  type GetTransactionConfirmationsOptions,\n  type GetTransactionConfirmationsQueryFnData,\n  type GetTransactionConfirmationsQueryKey,\n  type GetTransactionConfirmationsQueryOptions,\n  getTransactionConfirmationsQueryKey,\n  getTransactionConfirmationsQueryOptions,\n} from '../query/getTransactionConfirmations.js'\n\nexport {\n  type GetTransactionCountData,\n  type GetTransactionCountOptions,\n  type GetTransactionCountQueryFnData,\n  type GetTransactionCountQueryKey,\n  type GetTransactionCountQueryOptions,\n  getTransactionCountQueryKey,\n  getTransactionCountQueryOptions,\n} from '../query/getTransactionCount.js'\n\nexport {\n  type GetTransactionReceiptData,\n  type GetTransactionReceiptOptions,\n  type GetTransactionReceiptQueryFnData,\n  type GetTransactionReceiptQueryKey,\n  type GetTransactionReceiptQueryOptions,\n  getTransactionReceiptQueryKey,\n  getTransactionReceiptQueryOptions,\n} from '../query/getTransactionReceipt.js'\n\nexport {\n  type GetWalletClientData,\n  type GetWalletClientOptions,\n  type GetWalletClientQueryFnData,\n  type GetWalletClientQueryKey,\n  type GetWalletClientQueryOptions,\n  getWalletClientQueryKey,\n  getWalletClientQueryOptions,\n} from '../query/getWalletClient.js'\n\nexport {\n  type InfiniteReadContractsData,\n  type InfiniteReadContractsOptions,\n  type InfiniteReadContractsQueryFnData,\n  type InfiniteReadContractsQueryKey,\n  infiniteReadContractsQueryKey,\n  infiniteReadContractsQueryOptions,\n} from '../query/infiniteReadContracts.js'\n\nexport {\n  type PrepareTransactionRequestData,\n  type PrepareTransactionRequestOptions,\n  type PrepareTransactionRequestQueryFnData,\n  type PrepareTransactionRequestQueryKey,\n  type PrepareTransactionRequestQueryOptions,\n  prepareTransactionRequestQueryKey,\n  prepareTransactionRequestQueryOptions,\n} from '../query/prepareTransactionRequest.js'\n\nexport {\n  type ReadContractData,\n  type ReadContractOptions,\n  type ReadContractQueryFnData,\n  type ReadContractQueryKey,\n  type ReadContractQueryOptions,\n  readContractQueryKey,\n  readContractQueryOptions,\n} from '../query/readContract.js'\n\nexport {\n  type ReadContractsData,\n  type ReadContractsOptions,\n  type ReadContractsQueryFnData,\n  type ReadContractsQueryKey,\n  type ReadContractsQueryOptions,\n  readContractsQueryKey,\n  readContractsQueryOptions,\n} from '../query/readContracts.js'\n\nexport {\n  type ReconnectData,\n  type ReconnectMutate,\n  type ReconnectMutateAsync,\n  type ReconnectMutationOptions,\n  type ReconnectOptions,\n  type ReconnectVariables,\n  reconnectMutationOptions,\n} from '../query/reconnect.js'\n\nexport {\n  type SendCallsData,\n  type SendCallsMutate,\n  type SendCallsMutateAsync,\n  type SendCallsMutationOptions,\n  type SendCallsOptions,\n  type SendCallsVariables,\n  sendCallsMutationOptions,\n} from '../query/sendCalls.js'\n\nexport {\n  type SendCallsSyncData,\n  type SendCallsSyncMutate,\n  type SendCallsSyncMutateAsync,\n  type SendCallsSyncMutationOptions,\n  type SendCallsSyncOptions,\n  type SendCallsSyncVariables,\n  sendCallsSyncMutationOptions,\n} from '../query/sendCallsSync.js'\n\nexport {\n  type SendTransactionData,\n  type SendTransactionMutate,\n  type SendTransactionMutateAsync,\n  type SendTransactionMutationOptions,\n  type SendTransactionOptions,\n  type SendTransactionVariables,\n  sendTransactionMutationOptions,\n} from '../query/sendTransaction.js'\n\nexport {\n  type SendTransactionSyncData,\n  type SendTransactionSyncMutate,\n  type SendTransactionSyncMutateAsync,\n  type SendTransactionSyncMutationOptions,\n  type SendTransactionSyncOptions,\n  type SendTransactionSyncVariables,\n  sendTransactionSyncMutationOptions,\n} from '../query/sendTransactionSync.js'\n\nexport {\n  type ShowCallsStatusData,\n  type ShowCallsStatusMutate,\n  type ShowCallsStatusMutateAsync,\n  type ShowCallsStatusMutationOptions,\n  type ShowCallsStatusOptions,\n  type ShowCallsStatusVariables,\n  showCallsStatusMutationOptions,\n} from '../query/showCallsStatus.js'\n\nexport {\n  type SignMessageData,\n  type SignMessageMutate,\n  type SignMessageMutateAsync,\n  type SignMessageMutationOptions,\n  type SignMessageOptions,\n  type SignMessageVariables,\n  signMessageMutationOptions,\n} from '../query/signMessage.js'\n\nexport {\n  type SignTransactionData,\n  type SignTransactionMutate,\n  type SignTransactionMutateAsync,\n  type SignTransactionMutationOptions,\n  type SignTransactionOptions,\n  type SignTransactionVariables,\n  signTransactionMutationOptions,\n} from '../query/signTransaction.js'\n\nexport {\n  type SignTypedDataData,\n  type SignTypedDataMutate,\n  type SignTypedDataMutateAsync,\n  type SignTypedDataMutationOptions,\n  type SignTypedDataOptions,\n  type SignTypedDataVariables,\n  signTypedDataMutationOptions,\n} from '../query/signTypedData.js'\n\nexport {\n  type SimulateContractData,\n  type SimulateContractOptions,\n  type SimulateContractQueryFnData,\n  type SimulateContractQueryKey,\n  type SimulateContractQueryOptions,\n  simulateContractQueryKey,\n  simulateContractQueryOptions,\n} from '../query/simulateContract.js'\n\nexport {\n  type SwitchChainData,\n  type SwitchChainMutate,\n  type SwitchChainMutateAsync,\n  type SwitchChainMutationOptions,\n  type SwitchChainOptions,\n  type SwitchChainVariables,\n  switchChainMutationOptions,\n} from '../query/switchChain.js'\n\nexport {\n  /** @deprecated use `SwitchConnectionData` instead */\n  type SwitchConnectionData as SwitchAccountData,\n  type SwitchConnectionData,\n  /** @deprecated use `SwitchConnectionMutate` instead */\n  type SwitchConnectionMutate as SwitchAccountMutate,\n  type SwitchConnectionMutate,\n  /** @deprecated use `SwitchConnectionMutateAsync` instead */\n  type SwitchConnectionMutateAsync as SwitchAccountMutateAsync,\n  type SwitchConnectionMutateAsync,\n  /** @deprecated use `SwitchConnectionMutationOptions` instead */\n  type SwitchConnectionMutationOptions as SwitchAccountMutationOptions,\n  type SwitchConnectionMutationOptions,\n  /** @deprecated use `SwitchConnectionOptions` instead */\n  type SwitchConnectionOptions as SwitchAccountOptions,\n  type SwitchConnectionOptions,\n  /** @deprecated use `SwitchConnectionVariables` instead */\n  type SwitchConnectionVariables as SwitchAccountVariables,\n  type SwitchConnectionVariables,\n  /** @deprecated use `switchConnectionMutationOptions` instead */\n  switchConnectionMutationOptions as switchAccountMutationOptions,\n  switchConnectionMutationOptions,\n} from '../query/switchConnection.js'\n\nexport {\n  hashFn,\n  structuralSharing,\n} from '../query/utils.js'\n\nexport {\n  type VerifyMessageData,\n  type VerifyMessageOptions,\n  type VerifyMessageQueryFnData,\n  type VerifyMessageQueryKey,\n  type VerifyMessageQueryOptions,\n  verifyMessageQueryKey,\n  verifyMessageQueryOptions,\n} from '../query/verifyMessage.js'\n\nexport {\n  type VerifyTypedDataData,\n  type VerifyTypedDataOptions,\n  type VerifyTypedDataQueryFnData,\n  type VerifyTypedDataQueryKey,\n  type VerifyTypedDataQueryOptions,\n  verifyTypedDataQueryKey,\n  verifyTypedDataQueryOptions,\n} from '../query/verifyTypedData.js'\n\nexport {\n  type WaitForCallsStatusData,\n  type WaitForCallsStatusOptions,\n  type WaitForCallsStatusQueryFnData,\n  type WaitForCallsStatusQueryKey,\n  type WaitForCallsStatusQueryOptions,\n  waitForCallsStatusQueryKey,\n  waitForCallsStatusQueryOptions,\n} from '../query/waitForCallsStatus.js'\n\nexport {\n  type WaitForTransactionReceiptData,\n  type WaitForTransactionReceiptOptions,\n  type WaitForTransactionReceiptQueryFnData,\n  type WaitForTransactionReceiptQueryKey,\n  type WaitForTransactionReceiptQueryOptions,\n  waitForTransactionReceiptQueryKey,\n  waitForTransactionReceiptQueryOptions,\n} from '../query/waitForTransactionReceipt.js'\n\nexport {\n  type WatchAssetData,\n  type WatchAssetMutate,\n  type WatchAssetMutateAsync,\n  type WatchAssetMutationOptions,\n  type WatchAssetOptions,\n  type WatchAssetVariables,\n  watchAssetMutationOptions,\n} from '../query/watchAsset.js'\n\nexport {\n  type WriteContractData,\n  type WriteContractMutate,\n  type WriteContractMutateAsync,\n  type WriteContractMutationOptions,\n  type WriteContractOptions,\n  type WriteContractVariables,\n  writeContractMutationOptions,\n} from '../query/writeContract.js'\n\nexport {\n  type WriteContractSyncData,\n  type WriteContractSyncMutate,\n  type WriteContractSyncMutateAsync,\n  type WriteContractSyncMutationOptions,\n  type WriteContractSyncOptions,\n  type WriteContractSyncVariables,\n  writeContractSyncMutationOptions,\n} from '../query/writeContractSync.js'\n"
  },
  {
    "path": "packages/core/src/exports/tempo.ts",
    "content": "////////////////////////////////////////////////////////////////////////////////\n// Tempo\n////////////////////////////////////////////////////////////////////////////////\n\n/** biome-ignore-all lint/performance/noReExportAll: entrypoint */\n// biome-ignore lint/performance/noBarrelFile: entrypoint module\nexport * as Actions from '../tempo/actions/index.js'\nexport {\n  type Dangerous_Secp256k1Parameters,\n  dangerous_secp256k1,\n  type WebAuthnParameters,\n  webAuthn,\n} from '../tempo/Connectors.js'\nexport * as KeyManager from '../tempo/KeyManager.js'\n"
  },
  {
    "path": "packages/core/src/hydrate.test.ts",
    "content": "import { accounts, config, wait } from '@wagmi/test'\nimport type { EIP1193Provider } from 'mipd'\nimport { http } from 'viem'\nimport { mainnet } from 'viem/chains'\nimport { expect, test, vi } from 'vitest'\n\nimport { createConnector } from './connectors/createConnector.js'\nimport { mock } from './connectors/mock.js'\nimport { createConfig } from './createConfig.js'\nimport { createStorage } from './createStorage.js'\nimport { hydrate } from './hydrate.js'\nimport { cookieStorage } from './utils/cookie.js'\n\nvi.mock(import('mipd'), async (importOriginal) => {\n  const mod = await importOriginal()\n\n  let cache: typeof mod | undefined\n  if (!cache)\n    cache = {\n      ...mod,\n      createStore() {\n        const store = mod.createStore()\n        return {\n          ...store,\n          getProviders() {\n            const info = {\n              icon: 'data:image/svg+xml,<svg width=\"32px\" height=\"32px\" viewBox=\"0 0 32 32\"/>',\n              uuid: crypto.randomUUID(),\n            } as const\n            const provider = '<EIP1193Provider>' as unknown as EIP1193Provider\n            return [\n              { info: { ...info, name: 'Foo', rdns: 'com.foo' }, provider },\n              { info: { ...info, name: 'Bar', rdns: 'com.bar' }, provider },\n              { info: { ...info, name: 'Mock', rdns: 'com.mock' }, provider },\n            ]\n          },\n        }\n      },\n    }\n  return cache\n})\n\ntest('default', () => {\n  const { onMount } = hydrate(config, {\n    initialState: undefined,\n    reconnectOnMount: false,\n  })\n  onMount()\n\n  expect(onMount).toBeDefined()\n})\n\ntest('initialState', () => {\n  const config = createConfig({\n    chains: [mainnet],\n    transports: { [mainnet.id]: http() },\n    ssr: true,\n    storage: createStorage({ storage: cookieStorage }),\n  })\n\n  const { onMount } = hydrate(config, {\n    initialState: {\n      chainId: 1,\n      current: null,\n      connections: new Map(),\n      status: 'disconnected',\n    },\n    reconnectOnMount: true,\n  })\n  onMount()\n\n  expect(onMount).toBeDefined()\n})\n\ntest('ssr', async () => {\n  const config = createConfig({\n    chains: [mainnet],\n    connectors: [\n      createConnector((c) => {\n        return {\n          ...mock({ accounts })(c),\n          rdns: 'com.mock',\n        }\n      }),\n    ],\n    ssr: true,\n    storage: createStorage({ storage: cookieStorage }),\n    transports: { [mainnet.id]: http() },\n  })\n\n  const { onMount } = hydrate(config, {\n    initialState: {\n      chainId: 10,\n      current: null,\n      connections: new Map(),\n      status: 'disconnected',\n    },\n    reconnectOnMount: false,\n  })\n  onMount()\n  expect(onMount).toBeDefined()\n  expect(config.chains[0].id).toBe(1)\n\n  await wait(100)\n  expect(config.connectors.map((x) => x.rdns ?? x.id)).toMatchInlineSnapshot(\n    `\n    [\n      \"com.mock\",\n      \"com.foo\",\n      \"com.bar\",\n    ]\n  `,\n  )\n})\n"
  },
  {
    "path": "packages/core/src/hydrate.ts",
    "content": "import { reconnect } from './actions/reconnect.js'\nimport type { Config, State } from './createConfig.js'\n\ntype HydrateParameters = {\n  initialState?: State | undefined\n  reconnectOnMount?: boolean | undefined\n}\n\nexport function hydrate(config: Config, parameters: HydrateParameters) {\n  const { initialState, reconnectOnMount } = parameters\n\n  if (initialState && !config._internal.store.persist.hasHydrated())\n    config.setState({\n      ...initialState,\n      chainId: config.chains.some((x) => x.id === initialState.chainId)\n        ? initialState.chainId\n        : config.chains[0].id,\n      connections: reconnectOnMount ? initialState.connections : new Map(),\n      status: reconnectOnMount ? 'reconnecting' : 'disconnected',\n    })\n\n  return {\n    async onMount() {\n      if (config._internal.ssr) {\n        await config._internal.store.persist.rehydrate()\n        if (config._internal.mipd) {\n          config._internal.connectors.setState((connectors) => {\n            const rdnsSet = new Set<string>()\n            for (const connector of connectors ?? []) {\n              if (connector.rdns) {\n                const rdnsValues = Array.isArray(connector.rdns)\n                  ? connector.rdns\n                  : [connector.rdns]\n                for (const rdns of rdnsValues) {\n                  rdnsSet.add(rdns)\n                }\n              }\n            }\n            const mipdConnectors = []\n            const providers = config._internal.mipd?.getProviders() ?? []\n            for (const provider of providers) {\n              if (rdnsSet.has(provider.info.rdns)) continue\n              const connectorFn =\n                config._internal.connectors.providerDetailToConnector(provider)\n              const connector = config._internal.connectors.setup(connectorFn)\n              mipdConnectors.push(connector)\n            }\n            return [...connectors, ...mipdConnectors]\n          })\n        }\n      }\n\n      if (reconnectOnMount) reconnect(config)\n      else if (config.storage)\n        // Reset connections that may have been hydrated from storage.\n        config.setState((x) => ({\n          ...x,\n          connections: new Map(),\n        }))\n    },\n  }\n}\n"
  },
  {
    "path": "packages/core/src/query/AGENTS.md",
    "content": "# Agent Guidelines\n\nAgent guidance for query options\n\n> **Communication Style**: Be brief, concise. Maximize information density, minimize tokens. Incomplete sentences acceptable when clear. Remove filler words. Prioritize clarity over grammar.\n\n## Query Options Format\n\n```ts\nexport function myActionQueryOptions<\n  config extends Config,\n  selectData = MyActionData\n>(\n  config: config,\n  options: MyActionOptions<config, selectData> = {},\n): MyActionQueryOptions<config, selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(options.foo && (options.query?.enabled ?? true)),\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      if (!parameters.foo) throw new Error('foo is required')\n      const result = await myAction(config, {\n        foo: parameters.foo,\n        ...parameters,\n      })\n      return result ?? null\n    },\n    queryKey: myActionQueryKey(options),\n    structuralSharing, // include when action returns objects, nested values, or arrays\n  }\n}\n\nexport function myActionQueryKey<\n  config extends Config,\n  selectData = MyActionData\n>(\n  parameters: Compute<ExactPartial<MyActionParameters<config>> & ScopeKeyParameter> = {},\n) {\n  return ['myAction', filterQueryOptions(parameters)] as const\n}\n\nexport type MyActionOptions<\n  config extends Config,\n  selectData = MyActionData,\n> = Compute<ExactPartial<MyActionParameters<config>> & ScopeKeyParameter> &\n  QueryParameter<\n    MyActionQueryFnData,\n    MyActionErrorType,\n    selectData,\n    MyActionQueryKey<config>\n  >\n\nexport type MyActionQueryOptions<\n  config extends Config,\n  selectData = MyActionData\n> = QueryOptions<\n  MyActionQueryFnData,\n  MyActionErrorType,\n  selectData,\n  MyActionQueryKey<config>\n>\n\nexport type MyActionQueryFnData = Compute<MyActionReturnType>\n\nexport type MyActionData = MyActionQueryFnData\n\nexport type MyActionQueryKey<config extends Config> = ReturnType<\n  typeof myActionQueryKey<config>\n>\n```\n\n## Style Conventions\n\n### `queryFn` Syntax\n\n- Use arrow function property syntax: `queryFn: async (context) =>` (not method shorthand `async queryFn(context)`)\n- Use `context` parameter, not destructuring: `async (context) =>` (not `async ({ queryKey }) =>`)\n- Access `queryKey` via `context.queryKey`\n\n### Destructuring `queryKey`\n\nUse array destructuring with `parameters`, then access properties via `parameters.foo`:\n\n```ts\n// ✓ Correct\nconst [, { scopeKey: _, ...parameters }] = context.queryKey\nif (!parameters.account) throw new Error('account is required')\n\n// ✗ Avoid\nconst { account, scopeKey: _, ...parameters } = context.queryKey[1]\n```\n\n### Calling Actions\n\nWhen calling actions, spread parameters first, then pass required parameters:\n\n```ts\n// ✓ Correct - spread, then explicit required param\nreturn myAction(config, { ...parameters, foo: parameters.foo })\n\n// ✗ Avoid - just passing parameters directly\nreturn myAction(config, parameters)\n```\n\n### Accessing Skipped Properties\n\nProperties filtered from the queryKey (e.g., `connector`, `abi`) should be accessed via `options.`:\n\n```ts\nqueryFn: async (context) => {\n  const [, { scopeKey: _, ...parameters }] = context.queryKey\n  // ✓ Use rest.connector for properties not in queryKey\n  const result = await myAction(config, { ...parameters, connector: options.connector })\n  return result ?? null\n}\n```\n\n## Type Parameter Nuances\n\n### `const` Modifier\n\nUse `const` for type parameters that need literal type inference (e.g., abi, args):\n\n```ts\nexport function readContractQueryOptions<\n  const abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'pure' | 'view'>,\n  const args extends ContractFunctionArgs<abi, 'pure' | 'view', functionName>,\n  config extends Config,\n>\n```\n\n### `ExactPartial` vs `UnionExactPartial`\n\n- **`ExactPartial`**: Use for simple cases with straightforward parameter types\n- **`UnionExactPartial`**: Use for complex type inference or action parameter types with lots of unions (e.g., contract-related actions)\n\nIf unsure, check the underlying action's parameter types or ask.\n\n### Default Parameter Value\n\n- **Simple cases**: `options: MyActionOptions<config, selectData> = {}`\n- **Complex generics** (e.g., contract actions with abi/args): `options: MyActionOptions<...> = {} as any`\n\n## `structuralSharing`\n\nInclude `structuralSharing` from `./utils.js` when the action returns:\n- Objects\n- Nested values  \n- Arrays\n\nSee `packages/react/src/hooks` for more examples.\n\n## Special Query Key Handling\n\nFor `getConnectorClient`, include `connectorUid` separately in the query key:\n\n```ts\nreturn [\n  'connectorClient',\n  { ...filterQueryOptions(options), connectorUid: options.connector?.uid },\n] as const\n```\n"
  },
  {
    "path": "packages/core/src/query/call.test.ts",
    "content": "import { accounts, address, chain, config } from '@wagmi/test'\nimport { parseEther, parseGwei } from 'viem'\nimport { expect, test } from 'vitest'\nimport { callQueryOptions } from './call.js'\n\nconst name4bytes = '0x06fdde03'\nconst account = accounts[0]\n\ntest('default', () => {\n  expect(\n    callQueryOptions(config, {\n      account,\n      data: name4bytes,\n      to: address.wagmiMintExample,\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"call\",\n        {\n          \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"data\": \"0x06fdde03\",\n          \"to\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: accessList', () => {\n  expect(\n    callQueryOptions(config, {\n      account,\n      data: name4bytes,\n      to: address.wagmiMintExample,\n      accessList: [\n        {\n          address: '0x1',\n          storageKeys: ['0x1'],\n        },\n      ],\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"call\",\n        {\n          \"accessList\": [\n            {\n              \"address\": \"0x1\",\n              \"storageKeys\": [\n                \"0x1\",\n              ],\n            },\n          ],\n          \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"data\": \"0x06fdde03\",\n          \"to\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: blockNumber', () => {\n  expect(\n    callQueryOptions(config, {\n      account,\n      data: name4bytes,\n      to: address.wagmiMintExample,\n      blockNumber: 1234567890n,\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"call\",\n        {\n          \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"blockNumber\": 1234567890n,\n          \"data\": \"0x06fdde03\",\n          \"to\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: blockTag', () => {\n  expect(\n    callQueryOptions(config, {\n      account,\n      data: name4bytes,\n      to: address.wagmiMintExample,\n      blockTag: 'safe',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"call\",\n        {\n          \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"blockTag\": \"safe\",\n          \"data\": \"0x06fdde03\",\n          \"to\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    callQueryOptions(config, {\n      account,\n      data: name4bytes,\n      to: address.wagmiMintExample,\n      chainId: chain.mainnet2.id,\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"call\",\n        {\n          \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"chainId\": 456,\n          \"data\": \"0x06fdde03\",\n          \"to\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: gas', () => {\n  expect(\n    callQueryOptions(config, {\n      account,\n      data: name4bytes,\n      to: address.wagmiMintExample,\n      gas: 100000n,\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"call\",\n        {\n          \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"data\": \"0x06fdde03\",\n          \"gas\": 100000n,\n          \"to\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: gasPrice', () => {\n  expect(\n    callQueryOptions(config, {\n      account,\n      data: name4bytes,\n      to: address.wagmiMintExample,\n      gasPrice: parseGwei('20'),\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"call\",\n        {\n          \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"data\": \"0x06fdde03\",\n          \"gasPrice\": 20000000000n,\n          \"to\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: maxFeePerGas', () => {\n  expect(\n    callQueryOptions(config, {\n      account,\n      data: name4bytes,\n      to: address.wagmiMintExample,\n      maxFeePerGas: parseGwei('20'),\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"call\",\n        {\n          \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"data\": \"0x06fdde03\",\n          \"maxFeePerGas\": 20000000000n,\n          \"to\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: maxPriorityFeePerGas', () => {\n  expect(\n    callQueryOptions(config, {\n      account,\n      data: name4bytes,\n      to: address.wagmiMintExample,\n      maxPriorityFeePerGas: parseGwei('2'),\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"call\",\n        {\n          \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"data\": \"0x06fdde03\",\n          \"maxPriorityFeePerGas\": 2000000000n,\n          \"to\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: nonce', () => {\n  expect(\n    callQueryOptions(config, {\n      account,\n      data: name4bytes,\n      to: address.wagmiMintExample,\n      nonce: 123,\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"call\",\n        {\n          \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"data\": \"0x06fdde03\",\n          \"nonce\": 123,\n          \"to\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: type', () => {\n  expect(\n    callQueryOptions(config, {\n      account,\n      data: name4bytes,\n      to: address.wagmiMintExample,\n      type: 'eip1559',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"call\",\n        {\n          \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"data\": \"0x06fdde03\",\n          \"to\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"type\": \"eip1559\",\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: value', () => {\n  expect(\n    callQueryOptions(config, {\n      account,\n      data: name4bytes,\n      to: address.wagmiMintExample,\n      value: parseEther('1'),\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"call\",\n        {\n          \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"data\": \"0x06fdde03\",\n          \"to\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"value\": 1000000000000000000n,\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/call.ts",
    "content": "import {\n  type CallErrorType,\n  type CallParameters,\n  type CallReturnType,\n  call,\n} from '../actions/call.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type CallOptions<config extends Config, selectData = CallData> = Compute<\n  ExactPartial<CallParameters<config>> & ScopeKeyParameter\n> &\n  QueryParameter<\n    CallQueryFnData,\n    CallErrorType,\n    selectData,\n    CallQueryKey<config>\n  >\n\nexport function callQueryOptions<config extends Config, selectData = CallData>(\n  config: config,\n  options: CallOptions<config, selectData> = {},\n): CallQueryOptions<config, selectData> {\n  return {\n    ...options.query,\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      const data = await call(config, {\n        ...parameters,\n      } as CallParameters)\n      return data ?? null\n    },\n    queryKey: callQueryKey(options),\n  }\n}\n\nexport type CallQueryFnData = CallReturnType\n\nexport type CallData = CallQueryFnData\n\nexport function callQueryKey<config extends Config>(\n  options: Compute<\n    ExactPartial<CallParameters<config>> & ScopeKeyParameter\n  > = {},\n) {\n  return ['call', filterQueryOptions(options)] as const\n}\n\nexport type CallQueryKey<config extends Config> = ReturnType<\n  typeof callQueryKey<config>\n>\n\nexport type CallQueryOptions<\n  config extends Config,\n  selectData = CallData,\n> = QueryOptions<\n  CallQueryFnData,\n  CallErrorType,\n  selectData,\n  CallQueryKey<config>\n>\n"
  },
  {
    "path": "packages/core/src/query/connect.test-d.ts",
    "content": "import { accounts } from '@wagmi/test'\nimport { type Address, type Hex, http } from 'viem'\nimport { mainnet } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport type { CreateConnectorFn } from '../connectors/createConnector.js'\nimport { mock } from '../connectors/mock.js'\nimport { type Connector, createConfig } from '../createConfig.js'\nimport type { ConnectMutate, ConnectMutateAsync } from './connect.js'\n\nconst config = createConfig({\n  chains: [mainnet],\n  transports: { [mainnet.id]: http() },\n})\n\ntest('parameters: connector (ConnectorFn)', () => {\n  const connectorFn = mock({ accounts })\n\n  const mutate: ConnectMutate<typeof config> = () => {}\n  mutate({\n    connector: connectorFn,\n    foo: 'bar',\n  })\n  expectTypeOf<\n    typeof connectorFn extends CreateConnectorFn ? true : false\n  >().toEqualTypeOf<true>()\n\n  type Result = NonNullable<Parameters<typeof mutate<typeof connectorFn>>[0]>\n  expectTypeOf<Result['foo']>().toEqualTypeOf<string | undefined>()\n})\n\ntest('parameters: connector (Connector)', () => {\n  const connector = config._internal.connectors.setup(mock({ accounts }))\n\n  const mutate: ConnectMutate<typeof config> = () => {}\n  mutate({\n    connector,\n    foo: 'bar',\n  })\n  expectTypeOf<\n    typeof connector extends Connector ? true : false\n  >().toEqualTypeOf<true>()\n\n  type Result = NonNullable<Parameters<typeof mutate<typeof connector>>[0]>\n  expectTypeOf<Result['foo']>().toEqualTypeOf<string | undefined>()\n})\n\ntest('parameters: withCapabilities', async () => {\n  const connectorFn = mock({ accounts })\n\n  const mutateAsync: ConnectMutateAsync<typeof config> = () => ({}) as any\n  const res0 = await mutateAsync({ connector: connectorFn })\n  expectTypeOf(res0.accounts).toEqualTypeOf<readonly [Address, ...Address[]]>()\n\n  const res1 = await mutateAsync({\n    connector: connectorFn,\n    withCapabilities: false,\n  })\n  expectTypeOf(res1.accounts).toEqualTypeOf<readonly [Address, ...Address[]]>()\n\n  const res2 = await mutateAsync({\n    connector: connectorFn,\n    withCapabilities: true,\n  })\n  expectTypeOf(res2.accounts).toEqualTypeOf<\n    readonly [\n      {\n        address: Address\n        capabilities: {\n          foo: { bar: Hex }\n        }\n      },\n      ...{\n        address: Address\n        capabilities: {\n          foo: { bar: Hex }\n        }\n      }[],\n    ]\n  >()\n})\n"
  },
  {
    "path": "packages/core/src/query/connect.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { connectMutationOptions } from './connect.js'\n\ntest('default', () => {\n  expect(connectMutationOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"mutationFn\": [Function],\n      \"mutationKey\": [\n        \"connect\",\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/connect.ts",
    "content": "import type { MutateOptions, MutationOptions } from '@tanstack/query-core'\nimport {\n  type ConnectErrorType,\n  type ConnectParameters,\n  type ConnectReturnType,\n  connect,\n} from '../actions/connect.js'\nimport type { CreateConnectorFn } from '../connectors/createConnector.js'\nimport type { Config, Connector } from '../createConfig.js'\nimport type { MutationParameter } from '../types/query.js'\nimport type { Compute } from '../types/utils.js'\n\nexport type ConnectOptions<\n  config extends Config,\n  context = unknown,\n> = MutationParameter<\n  ConnectData<config, config['connectors'][number], boolean>,\n  ConnectErrorType,\n  ConnectVariables<config, config['connectors'][number], boolean>,\n  context\n>\n\nexport function connectMutationOptions<config extends Config, context>(\n  config: config,\n  options: ConnectOptions<config, context> = {},\n): ConnectMutationOptions<config> {\n  return {\n    ...(options.mutation as any),\n    mutationFn: async (variables) => {\n      return connect(config, variables)\n    },\n    mutationKey: ['connect'],\n  }\n}\n\nexport type ConnectMutationOptions<config extends Config> = MutationOptions<\n  ConnectData<config, config['connectors'][number], boolean>,\n  ConnectErrorType,\n  ConnectVariables<config, config['connectors'][number], boolean>\n>\n\nexport type ConnectData<\n  config extends Config,\n  connector extends Connector | CreateConnectorFn,\n  withCapabilities extends boolean,\n> = ConnectReturnType<config, connector, withCapabilities>\n\nexport type ConnectVariables<\n  config extends Config,\n  connector extends Connector | CreateConnectorFn,\n  withCapabilities extends boolean,\n> = ConnectParameters<config, connector, withCapabilities>\n\nexport type ConnectMutate<config extends Config, context = unknown> = <\n  connector extends\n    | config['connectors'][number]\n    | Connector\n    | CreateConnectorFn,\n  withCapabilities extends boolean = false,\n>(\n  variables: ConnectVariables<config, connector, withCapabilities>,\n  options?:\n    | Compute<\n        MutateOptions<\n          ConnectData<config, connector, withCapabilities>,\n          ConnectErrorType,\n          Compute<ConnectVariables<config, connector, withCapabilities>>,\n          context\n        >\n      >\n    | undefined,\n) => void\n\nexport type ConnectMutateAsync<config extends Config, context = unknown> = <\n  connector extends\n    | config['connectors'][number]\n    | Connector\n    | CreateConnectorFn,\n  withCapabilities extends boolean = false,\n>(\n  variables: ConnectVariables<config, connector, withCapabilities>,\n  options?:\n    | Compute<\n        MutateOptions<\n          ConnectData<config, connector, withCapabilities>,\n          ConnectErrorType,\n          Compute<ConnectVariables<config, connector, withCapabilities>>,\n          context\n        >\n      >\n    | undefined,\n) => Promise<ConnectData<config, connector, withCapabilities>>\n"
  },
  {
    "path": "packages/core/src/query/deployContract.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { deployContractMutationOptions } from './deployContract.js'\n\ntest('default', () => {\n  expect(deployContractMutationOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"mutationFn\": [Function],\n      \"mutationKey\": [\n        \"deployContract\",\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/deployContract.ts",
    "content": "import type { MutateOptions, MutationOptions } from '@tanstack/query-core'\nimport type { Abi, ContractConstructorArgs } from 'viem'\nimport {\n  type DeployContractErrorType,\n  type DeployContractParameters,\n  type DeployContractReturnType,\n  deployContract,\n} from '../actions/deployContract.js'\nimport type { Config } from '../createConfig.js'\nimport type { MutationParameter } from '../types/query.js'\nimport type { Compute } from '../types/utils.js'\n\nexport type DeployContractOptions<\n  config extends Config,\n  context = unknown,\n> = MutationParameter<\n  DeployContractData,\n  DeployContractErrorType,\n  DeployContractVariables<Abi, config, config['chains'][number]['id']>,\n  context\n>\n\nexport function deployContractMutationOptions<config extends Config, context>(\n  config: config,\n  options: DeployContractOptions<config, context> = {},\n): DeployContractMutationOptions<config> {\n  return {\n    ...(options.mutation as any),\n    mutationFn(variables) {\n      return deployContract(config, variables)\n    },\n    mutationKey: ['deployContract'],\n  }\n}\n\nexport type DeployContractMutationOptions<config extends Config> =\n  MutationOptions<\n    DeployContractData,\n    DeployContractErrorType,\n    DeployContractVariables<Abi, config, config['chains'][number]['id']>\n  >\n\nexport type DeployContractData = Compute<DeployContractReturnType>\n\nexport type DeployContractVariables<\n  abi extends Abi | readonly unknown[],\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  ///\n  allArgs = ContractConstructorArgs<abi>,\n> = DeployContractParameters<abi, config, chainId, allArgs>\n\nexport type DeployContractMutate<config extends Config, context = unknown> = <\n  abi extends Abi | readonly unknown[],\n  chainId extends config['chains'][number]['id'],\n>(\n  variables: DeployContractVariables<abi, config, chainId>,\n  options?:\n    | Compute<\n        MutateOptions<\n          DeployContractData,\n          DeployContractErrorType,\n          Compute<DeployContractVariables<abi, config, chainId>>,\n          context\n        >\n      >\n    | undefined,\n) => void\n\nexport type DeployContractMutateAsync<\n  config extends Config,\n  context = unknown,\n> = <\n  abi extends Abi | readonly unknown[],\n  chainId extends config['chains'][number]['id'],\n>(\n  variables: DeployContractVariables<abi, config, chainId>,\n  options?:\n    | Compute<\n        MutateOptions<\n          DeployContractData,\n          DeployContractErrorType,\n          Compute<DeployContractVariables<abi, config, chainId>>,\n          context\n        >\n      >\n    | undefined,\n) => Promise<DeployContractData>\n"
  },
  {
    "path": "packages/core/src/query/disconnect.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { disconnectMutationOptions } from './disconnect.js'\n\ntest('default', () => {\n  expect(disconnectMutationOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"mutationFn\": [Function],\n      \"mutationKey\": [\n        \"disconnect\",\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/disconnect.ts",
    "content": "import type { MutationOptions } from '@tanstack/query-core'\nimport {\n  type DisconnectErrorType,\n  type DisconnectParameters,\n  type DisconnectReturnType,\n  disconnect,\n} from '../actions/disconnect.js'\nimport type { Config } from '../createConfig.js'\nimport type { MutationParameter } from '../types/query.js'\nimport type { Mutate, MutateAsync } from './types.js'\n\nexport type DisconnectOptions<context = unknown> = MutationParameter<\n  DisconnectData,\n  DisconnectErrorType,\n  DisconnectVariables,\n  context\n>\n\nexport function disconnectMutationOptions<config extends Config, context>(\n  config: config,\n  options: DisconnectOptions<context> = {},\n): DisconnectMutationOptions {\n  return {\n    ...(options.mutation as any),\n    mutationFn: async (variables) => {\n      return disconnect(config, variables)\n    },\n    mutationKey: ['disconnect'],\n  }\n}\n\nexport type DisconnectMutationOptions = MutationOptions<\n  DisconnectData,\n  DisconnectErrorType,\n  DisconnectVariables\n>\n\nexport type DisconnectData = DisconnectReturnType\n\nexport type DisconnectVariables = DisconnectParameters | undefined\n\nexport type DisconnectMutate<context = unknown> = Mutate<\n  DisconnectData,\n  DisconnectErrorType,\n  DisconnectVariables,\n  context\n>\n\nexport type DisconnectMutateAsync<context = unknown> = MutateAsync<\n  DisconnectData,\n  DisconnectErrorType,\n  DisconnectVariables,\n  context\n>\n"
  },
  {
    "path": "packages/core/src/query/estimateFeesPerGas.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\nimport { estimateFeesPerGasQueryOptions } from './estimateFeesPerGas.js'\n\nconst context = {} as any\n\ntest('types', async () => {\n  // default\n  {\n    const options = estimateFeesPerGasQueryOptions(config, {})\n    const result = await options.queryFn(context)\n    expectTypeOf(result).toEqualTypeOf<{\n      gasPrice?: undefined\n      maxFeePerBlobGas?: undefined\n      maxFeePerGas: bigint\n      maxPriorityFeePerGas: bigint\n    }>()\n  }\n\n  // legacy\n  {\n    const options = estimateFeesPerGasQueryOptions(config, { type: 'legacy' })\n    const result = await options.queryFn(context)\n    expectTypeOf(result).toEqualTypeOf<{\n      gasPrice: bigint\n      maxFeePerBlobGas?: undefined\n      maxFeePerGas?: undefined\n      maxPriorityFeePerGas?: undefined\n    }>()\n  }\n\n  // eip1559\n  {\n    const options = estimateFeesPerGasQueryOptions(config, { type: 'eip1559' })\n    const result = await options.queryFn(context)\n    expectTypeOf(result).toEqualTypeOf<{\n      gasPrice?: undefined\n      maxFeePerBlobGas?: undefined\n      maxFeePerGas: bigint\n      maxPriorityFeePerGas: bigint\n    }>()\n  }\n})\n"
  },
  {
    "path": "packages/core/src/query/estimateFeesPerGas.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { estimateFeesPerGasQueryOptions } from './estimateFeesPerGas.js'\n\ntest('default', () => {\n  expect(estimateFeesPerGasQueryOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"estimateFeesPerGas\",\n        {},\n      ],\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    estimateFeesPerGasQueryOptions(config, { chainId: chain.mainnet.id }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"estimateFeesPerGas\",\n        {\n          \"chainId\": 1,\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/estimateFeesPerGas.ts",
    "content": "import type { FeeValuesType } from 'viem'\n\nimport {\n  type EstimateFeesPerGasErrorType,\n  type EstimateFeesPerGasParameters,\n  type EstimateFeesPerGasReturnType,\n  estimateFeesPerGas,\n} from '../actions/estimateFeesPerGas.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type EstimateFeesPerGasOptions<\n  type extends FeeValuesType,\n  config extends Config,\n  selectData = EstimateFeesPerGasData<type>,\n> = Compute<\n  ExactPartial<EstimateFeesPerGasParameters<type, config>> & ScopeKeyParameter\n> &\n  QueryParameter<\n    EstimateFeesPerGasQueryFnData<type>,\n    EstimateFeesPerGasErrorType,\n    selectData,\n    EstimateFeesPerGasQueryKey<config, type>\n  >\n\nexport function estimateFeesPerGasQueryOptions<\n  config extends Config,\n  type extends FeeValuesType = 'eip1559',\n  selectData = EstimateFeesPerGasData<type>,\n>(\n  config: config,\n  options: EstimateFeesPerGasOptions<type, config, selectData> = {},\n): EstimateFeesPerGasQueryOptions<type, config, selectData> {\n  return {\n    ...options.query,\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      return estimateFeesPerGas(config, parameters)\n    },\n    queryKey: estimateFeesPerGasQueryKey(options),\n  }\n}\n\nexport type EstimateFeesPerGasQueryFnData<type extends FeeValuesType> =\n  EstimateFeesPerGasReturnType<type>\n\nexport type EstimateFeesPerGasData<type extends FeeValuesType> =\n  EstimateFeesPerGasQueryFnData<type>\n\nexport function estimateFeesPerGasQueryKey<\n  config extends Config,\n  type extends FeeValuesType = 'eip1559',\n>(\n  options: Compute<\n    ExactPartial<EstimateFeesPerGasParameters<type, config>> & ScopeKeyParameter\n  > = {},\n) {\n  return ['estimateFeesPerGas', filterQueryOptions(options)] as const\n}\n\nexport type EstimateFeesPerGasQueryKey<\n  config extends Config,\n  type extends FeeValuesType,\n> = ReturnType<typeof estimateFeesPerGasQueryKey<config, type>>\n\nexport type EstimateFeesPerGasQueryOptions<\n  type extends FeeValuesType,\n  config extends Config,\n  selectData = EstimateFeesPerGasData<type>,\n> = QueryOptions<\n  EstimateFeesPerGasQueryFnData<type>,\n  EstimateFeesPerGasErrorType,\n  selectData,\n  EstimateFeesPerGasQueryKey<config, type>\n>\n"
  },
  {
    "path": "packages/core/src/query/estimateGas.test-d.ts",
    "content": "import { type Address, http, parseEther } from 'viem'\nimport { celo, mainnet } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { createConfig } from '../createConfig.js'\nimport {\n  type EstimateGasOptions,\n  estimateGasQueryOptions,\n} from './estimateGas.js'\n\ntest('chain formatters', () => {\n  const config = createConfig({\n    chains: [mainnet, celo],\n    transports: { [celo.id]: http(), [mainnet.id]: http() },\n  })\n\n  type Result = EstimateGasOptions<\n    typeof config,\n    (typeof config)['chains'][number]['id']\n  >\n  expectTypeOf<Result>().toMatchTypeOf<{\n    chainId?: typeof celo.id | typeof mainnet.id | undefined\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  estimateGasQueryOptions(config, {\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n    feeCurrency: '0x',\n  })\n\n  type Result2 = EstimateGasOptions<typeof config, typeof celo.id>\n  expectTypeOf<Result2>().toMatchTypeOf<{\n    functionName?: 'approve' | 'transfer' | 'transferFrom' | undefined\n    args?: readonly [Address, Address, bigint] | undefined\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  estimateGasQueryOptions(config, {\n    chainId: celo.id,\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n    feeCurrency: '0x',\n  })\n\n  type Result3 = EstimateGasOptions<typeof config, typeof mainnet.id>\n  expectTypeOf<Result3>().not.toMatchTypeOf<{\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  estimateGasQueryOptions(config, {\n    chainId: mainnet.id,\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n  })\n})\n"
  },
  {
    "path": "packages/core/src/query/estimateGas.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { parseEther } from 'viem'\nimport { expect, test } from 'vitest'\n\nimport { estimateGasQueryOptions } from './estimateGas.js'\n\ntest('default', () => {\n  expect(\n    estimateGasQueryOptions(config, {\n      to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      value: parseEther('0.01'),\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": false,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"estimateGas\",\n        {\n          \"to\": \"0xd2135CfB216b74109775236E36d4b433F1DF507B\",\n          \"value\": 10000000000000000n,\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/estimateGas.ts",
    "content": "import {\n  type EstimateGasErrorType,\n  type EstimateGasParameters,\n  type EstimateGasReturnType,\n  estimateGas,\n} from '../actions/estimateGas.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, UnionExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type EstimateGasOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  selectData = EstimateGasData,\n> = Compute<\n  UnionExactPartial<EstimateGasParameters<config, chainId>> & ScopeKeyParameter\n> &\n  QueryParameter<\n    EstimateGasQueryFnData,\n    EstimateGasErrorType,\n    selectData,\n    EstimateGasQueryKey<config, chainId>\n  >\n\nexport function estimateGasQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  selectData = EstimateGasData,\n>(\n  config: config,\n  options: EstimateGasOptions<config, chainId, selectData> = {} as any,\n): EstimateGasQueryOptions<config, chainId, selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(\n      (options.account || options.connector) &&\n        (options.query?.enabled ?? true),\n    ),\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      if (!parameters.account && !options.connector)\n        throw new Error('account or connector is required')\n      return estimateGas(config, {\n        ...(parameters as any),\n        account: parameters.account,\n        connector: options.connector,\n      })\n    },\n    queryKey: estimateGasQueryKey(options),\n  }\n}\n\nexport type EstimateGasQueryFnData = EstimateGasReturnType\n\nexport type EstimateGasData = EstimateGasQueryFnData\n\nexport function estimateGasQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n>(\n  options: Compute<\n    UnionExactPartial<EstimateGasParameters<config, chainId>> &\n      ScopeKeyParameter\n  > = {} as any,\n) {\n  return ['estimateGas', filterQueryOptions(options)] as const\n}\n\nexport type EstimateGasQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n> = ReturnType<typeof estimateGasQueryKey<config, chainId>>\n\nexport type EstimateGasQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  selectData = EstimateGasData,\n> = QueryOptions<\n  EstimateGasQueryFnData,\n  EstimateGasErrorType,\n  selectData,\n  EstimateGasQueryKey<config, chainId>\n>\n"
  },
  {
    "path": "packages/core/src/query/estimateMaxPriorityFeePerGas.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { estimateMaxPriorityFeePerGasQueryOptions } from './estimateMaxPriorityFeePerGas.js'\n\ntest('default', () => {\n  expect(\n    estimateMaxPriorityFeePerGasQueryOptions(config),\n  ).toMatchInlineSnapshot(`\n    {\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"estimateMaxPriorityFeePerGas\",\n        {},\n      ],\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    estimateMaxPriorityFeePerGasQueryOptions(config, {\n      chainId: chain.mainnet.id,\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"estimateMaxPriorityFeePerGas\",\n        {\n          \"chainId\": 1,\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/estimateMaxPriorityFeePerGas.ts",
    "content": "import {\n  type EstimateMaxPriorityFeePerGasErrorType,\n  type EstimateMaxPriorityFeePerGasParameters,\n  type EstimateMaxPriorityFeePerGasReturnType,\n  estimateMaxPriorityFeePerGas,\n} from '../actions/estimateMaxPriorityFeePerGas.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type EstimateMaxPriorityFeePerGasOptions<\n  config extends Config,\n  selectData = EstimateMaxPriorityFeePerGasData,\n> = Compute<\n  ExactPartial<EstimateMaxPriorityFeePerGasParameters<config>> &\n    ScopeKeyParameter\n> &\n  QueryParameter<\n    EstimateMaxPriorityFeePerGasQueryFnData,\n    EstimateMaxPriorityFeePerGasErrorType,\n    selectData,\n    EstimateMaxPriorityFeePerGasQueryKey<config>\n  >\n\nexport function estimateMaxPriorityFeePerGasQueryOptions<\n  config extends Config,\n  selectData = EstimateMaxPriorityFeePerGasData,\n>(\n  config: config,\n  options: EstimateMaxPriorityFeePerGasOptions<config, selectData> = {},\n): EstimateMaxPriorityFeePerGasQueryOptions<config, selectData> {\n  return {\n    ...options.query,\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      return estimateMaxPriorityFeePerGas(config, parameters)\n    },\n    queryKey: estimateMaxPriorityFeePerGasQueryKey(options),\n  }\n}\n\nexport type EstimateMaxPriorityFeePerGasQueryFnData =\n  EstimateMaxPriorityFeePerGasReturnType\n\nexport type EstimateMaxPriorityFeePerGasData =\n  EstimateMaxPriorityFeePerGasQueryFnData\n\nexport function estimateMaxPriorityFeePerGasQueryKey<config extends Config>(\n  options: Compute<\n    ExactPartial<EstimateMaxPriorityFeePerGasParameters<config>> &\n      ScopeKeyParameter\n  > = {},\n) {\n  return ['estimateMaxPriorityFeePerGas', filterQueryOptions(options)] as const\n}\n\nexport type EstimateMaxPriorityFeePerGasQueryKey<config extends Config> =\n  ReturnType<typeof estimateMaxPriorityFeePerGasQueryKey<config>>\n\nexport type EstimateMaxPriorityFeePerGasQueryOptions<\n  config extends Config,\n  selectData = EstimateMaxPriorityFeePerGasData,\n> = QueryOptions<\n  EstimateMaxPriorityFeePerGasQueryFnData,\n  EstimateMaxPriorityFeePerGasErrorType,\n  selectData,\n  EstimateMaxPriorityFeePerGasQueryKey<config>\n>\n"
  },
  {
    "path": "packages/core/src/query/getBalance.test.ts",
    "content": "import { accounts, chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getBalanceQueryOptions } from './getBalance.js'\n\nconst address = accounts[0]\n\ntest('default', () => {\n  expect(getBalanceQueryOptions(config, { address })).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"balance\",\n        {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    getBalanceQueryOptions(config, { address, chainId: chain.mainnet.id }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"balance\",\n        {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"chainId\": 1,\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/getBalance.ts",
    "content": "import {\n  type GetBalanceErrorType,\n  type GetBalanceParameters,\n  type GetBalanceReturnType,\n  getBalance,\n} from '../actions/getBalance.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type GetBalanceOptions<\n  config extends Config,\n  selectData = GetBalanceData,\n> = Compute<ExactPartial<GetBalanceParameters<config>> & ScopeKeyParameter> &\n  QueryParameter<\n    GetBalanceQueryFnData,\n    GetBalanceErrorType,\n    selectData,\n    GetBalanceQueryKey<config>\n  >\n\nexport function getBalanceQueryOptions<\n  config extends Config,\n  selectData = GetBalanceData,\n>(\n  config: config,\n  options: GetBalanceOptions<config, selectData> = {},\n): GetBalanceQueryOptions<config, selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(options.address && (options.query?.enabled ?? true)),\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      if (!parameters.address) throw new Error('address is required')\n      const balance = await getBalance(config, {\n        ...(parameters as GetBalanceParameters),\n        address: parameters.address,\n      })\n      return balance ?? null\n    },\n    queryKey: getBalanceQueryKey(options),\n  }\n}\n\nexport type GetBalanceQueryFnData = Compute<GetBalanceReturnType>\n\nexport type GetBalanceData = GetBalanceQueryFnData\n\nexport function getBalanceQueryKey<config extends Config>(\n  options: Compute<\n    ExactPartial<GetBalanceParameters<config>> & ScopeKeyParameter\n  > = {},\n) {\n  return ['balance', filterQueryOptions(options)] as const\n}\n\nexport type GetBalanceQueryKey<config extends Config> = ReturnType<\n  typeof getBalanceQueryKey<config>\n>\n\nexport type GetBalanceQueryOptions<\n  config extends Config,\n  selectData = GetBalanceData,\n> = QueryOptions<\n  GetBalanceQueryFnData,\n  GetBalanceErrorType,\n  selectData,\n  GetBalanceQueryKey<config>\n>\n"
  },
  {
    "path": "packages/core/src/query/getBlobBaseFee.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getBlobBaseFeeQueryOptions } from './getBlobBaseFee.js'\n\ntest('default', () => {\n  expect(getBlobBaseFeeQueryOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"blobBaseFee\",\n        {},\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/getBlobBaseFee.ts",
    "content": "import {\n  type GetBlobBaseFeeErrorType,\n  type GetBlobBaseFeeParameters,\n  type GetBlobBaseFeeReturnType,\n  getBlobBaseFee,\n} from '../actions/getBlobBaseFee.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type GetBlobBaseFeeOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetBlobBaseFeeData,\n> = Compute<\n  ExactPartial<GetBlobBaseFeeParameters<config, chainId>> & ScopeKeyParameter\n> &\n  QueryParameter<\n    GetBlobBaseFeeQueryFnData,\n    GetBlobBaseFeeErrorType,\n    selectData,\n    GetBlobBaseFeeQueryKey<config, chainId>\n  >\n\nexport function getBlobBaseFeeQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetBlobBaseFeeData,\n>(\n  config: config,\n  options: GetBlobBaseFeeOptions<config, chainId, selectData> = {},\n): GetBlobBaseFeeQueryOptions<config, chainId, selectData> {\n  return {\n    ...options.query,\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      const blobBaseFee = await getBlobBaseFee(config, parameters)\n      return blobBaseFee ?? null\n    },\n    queryKey: getBlobBaseFeeQueryKey(options),\n  }\n}\n\nexport type GetBlobBaseFeeQueryFnData = GetBlobBaseFeeReturnType\n\nexport type GetBlobBaseFeeData = GetBlobBaseFeeQueryFnData\n\nexport function getBlobBaseFeeQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n>(\n  options: Compute<\n    ExactPartial<GetBlobBaseFeeParameters<config, chainId>> & ScopeKeyParameter\n  > = {},\n) {\n  return ['blobBaseFee', filterQueryOptions(options)] as const\n}\n\nexport type GetBlobBaseFeeQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = ReturnType<typeof getBlobBaseFeeQueryKey<config, chainId>>\n\nexport type GetBlobBaseFeeQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetBlobBaseFeeData,\n> = QueryOptions<\n  GetBlobBaseFeeQueryFnData,\n  GetBlobBaseFeeErrorType,\n  selectData,\n  GetBlobBaseFeeQueryKey<config, chainId>\n>\n"
  },
  {
    "path": "packages/core/src/query/getBlock.test-d.ts",
    "content": "import { type Hex, http } from 'viem'\nimport { celo, mainnet } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { createConfig } from '../createConfig.js'\nimport { getBlockQueryOptions } from './getBlock.js'\n\nconst context = {} as any\n\ntest('chain formatters', async () => {\n  const config = createConfig({\n    chains: [celo, mainnet],\n    transports: { [celo.id]: http(), [mainnet.id]: http() },\n  })\n  const options = getBlockQueryOptions(config)\n  const result = await options.queryFn(context)\n  if (result.chainId === celo.id) {\n    expectTypeOf(result.difficulty).toEqualTypeOf<bigint>()\n    expectTypeOf(result.gasLimit).toEqualTypeOf<bigint>()\n    expectTypeOf(result.mixHash).toEqualTypeOf<Hex>()\n    expectTypeOf(result.nonce).toEqualTypeOf<`0x${string}`>()\n    expectTypeOf(result.uncles).toEqualTypeOf<Hex[]>()\n  }\n})\n\ntest('chainId', async () => {\n  const config = createConfig({\n    chains: [celo, mainnet],\n    transports: { [celo.id]: http(), [mainnet.id]: http() },\n  })\n  const options = getBlockQueryOptions(config, { chainId: celo.id })\n  const result = await options.queryFn(context)\n  expectTypeOf(result.difficulty).toEqualTypeOf<bigint>()\n  expectTypeOf(result.gasLimit).toEqualTypeOf<bigint>()\n  expectTypeOf(result.mixHash).toEqualTypeOf<Hex>()\n  expectTypeOf(result.nonce).toEqualTypeOf<`0x${string}`>()\n})\n"
  },
  {
    "path": "packages/core/src/query/getBlock.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getBlockQueryOptions } from './getBlock.js'\n\ntest('default', () => {\n  expect(getBlockQueryOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"block\",\n        {},\n      ],\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    getBlockQueryOptions(config, { chainId: chain.mainnet.id }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"block\",\n        {\n          \"chainId\": 1,\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/getBlock.ts",
    "content": "import type { BlockTag } from 'viem'\n\nimport {\n  type GetBlockErrorType,\n  type GetBlockParameters,\n  type GetBlockReturnType,\n  getBlock,\n} from '../actions/getBlock.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type GetBlockOptions<\n  includeTransactions extends boolean,\n  blockTag extends BlockTag,\n  config extends Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetBlockData<includeTransactions, blockTag, config, chainId>,\n> = Compute<\n  ExactPartial<\n    GetBlockParameters<includeTransactions, blockTag, config, chainId>\n  > &\n    ScopeKeyParameter\n> &\n  QueryParameter<\n    GetBlockQueryFnData<includeTransactions, blockTag, config, chainId>,\n    GetBlockErrorType,\n    selectData,\n    GetBlockQueryKey<includeTransactions, blockTag, config, chainId>\n  >\n\nexport function getBlockQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  includeTransactions extends boolean = false,\n  blockTag extends BlockTag = 'latest',\n  selectData = GetBlockData<includeTransactions, blockTag, config, chainId>,\n>(\n  config: config,\n  options: GetBlockOptions<\n    includeTransactions,\n    blockTag,\n    config,\n    chainId,\n    selectData\n  > = {},\n): GetBlockQueryOptions<\n  includeTransactions,\n  blockTag,\n  config,\n  chainId,\n  selectData\n> {\n  return {\n    ...options.query,\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      const block = await getBlock(config, parameters as any)\n      return (block ?? null) as any\n    },\n    queryKey: getBlockQueryKey(options),\n  }\n}\n\nexport type GetBlockQueryFnData<\n  includeTransactions extends boolean,\n  blockTag extends BlockTag,\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = GetBlockReturnType<includeTransactions, blockTag, config, chainId>\n\nexport type GetBlockData<\n  includeTransactions extends boolean,\n  blockTag extends BlockTag,\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = GetBlockQueryFnData<includeTransactions, blockTag, config, chainId>\n\nexport function getBlockQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  includeTransactions extends boolean = false,\n  blockTag extends BlockTag = 'latest',\n>(\n  options: Compute<\n    ExactPartial<\n      GetBlockParameters<includeTransactions, blockTag, config, chainId>\n    > &\n      ScopeKeyParameter\n  > = {},\n) {\n  return ['block', filterQueryOptions(options)] as const\n}\n\nexport type GetBlockQueryKey<\n  includeTransactions extends boolean,\n  blockTag extends BlockTag,\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = ReturnType<\n  typeof getBlockQueryKey<config, chainId, includeTransactions, blockTag>\n>\n\nexport type GetBlockQueryOptions<\n  includeTransactions extends boolean,\n  blockTag extends BlockTag,\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetBlockData<includeTransactions, blockTag, config, chainId>,\n> = QueryOptions<\n  GetBlockQueryFnData<includeTransactions, blockTag, config, chainId>,\n  GetBlockErrorType,\n  selectData,\n  GetBlockQueryKey<includeTransactions, blockTag, config, chainId>\n>\n"
  },
  {
    "path": "packages/core/src/query/getBlockNumber.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getBlockNumberQueryOptions } from './getBlockNumber.js'\n\ntest('default', () => {\n  expect(getBlockNumberQueryOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"gcTime\": 0,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"blockNumber\",\n        {},\n      ],\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    getBlockNumberQueryOptions(config, { chainId: chain.mainnet.id }),\n  ).toMatchInlineSnapshot(`\n      {\n        \"gcTime\": 0,\n        \"queryFn\": [Function],\n        \"queryKey\": [\n          \"blockNumber\",\n          {\n            \"chainId\": 1,\n          },\n        ],\n      }\n    `)\n})\n"
  },
  {
    "path": "packages/core/src/query/getBlockNumber.ts",
    "content": "import {\n  type GetBlockNumberErrorType,\n  type GetBlockNumberParameters,\n  type GetBlockNumberReturnType,\n  getBlockNumber,\n} from '../actions/getBlockNumber.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type GetBlockNumberOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetBlockNumberData,\n> = Compute<\n  ExactPartial<GetBlockNumberParameters<config, chainId>> & ScopeKeyParameter\n> &\n  QueryParameter<\n    GetBlockNumberQueryFnData,\n    GetBlockNumberErrorType,\n    selectData,\n    GetBlockNumberQueryKey<config, chainId>\n  >\n\nexport function getBlockNumberQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetBlockNumberData,\n>(\n  config: config,\n  options: GetBlockNumberOptions<config, chainId, selectData> = {},\n): GetBlockNumberQueryOptions<config, chainId, selectData> {\n  return {\n    ...options.query,\n    gcTime: 0,\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      const blockNumber = await getBlockNumber(config, parameters)\n      return blockNumber ?? null\n    },\n    queryKey: getBlockNumberQueryKey(options),\n  }\n}\n\nexport type GetBlockNumberQueryFnData = GetBlockNumberReturnType\n\nexport type GetBlockNumberData = GetBlockNumberQueryFnData\n\nexport function getBlockNumberQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n>(\n  options: Compute<\n    ExactPartial<GetBlockNumberParameters<config, chainId>> & ScopeKeyParameter\n  > = {},\n) {\n  return ['blockNumber', filterQueryOptions(options)] as const\n}\n\nexport type GetBlockNumberQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = ReturnType<typeof getBlockNumberQueryKey<config, chainId>>\n\nexport type GetBlockNumberQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetBlockNumberData,\n> = QueryOptions<\n  GetBlockNumberQueryFnData,\n  GetBlockNumberErrorType,\n  selectData,\n  GetBlockNumberQueryKey<config, chainId>\n>\n"
  },
  {
    "path": "packages/core/src/query/getBlockTransactionCount.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getBlockTransactionCountQueryOptions } from './getBlockTransactionCount.js'\n\ntest('default', () => {\n  expect(getBlockTransactionCountQueryOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"blockTransactionCount\",\n        {},\n      ],\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    getBlockTransactionCountQueryOptions(config, { chainId: chain.mainnet.id }),\n  ).toMatchInlineSnapshot(`\n      {\n        \"queryFn\": [Function],\n        \"queryKey\": [\n          \"blockTransactionCount\",\n          {\n            \"chainId\": 1,\n          },\n        ],\n      }\n    `)\n})\n\ntest('parameters: blockTag', () => {\n  expect(\n    getBlockTransactionCountQueryOptions(config, {\n      blockTag: 'earliest',\n    }),\n  ).toMatchInlineSnapshot(`\n      {\n        \"queryFn\": [Function],\n        \"queryKey\": [\n          \"blockTransactionCount\",\n          {\n            \"blockTag\": \"earliest\",\n          },\n        ],\n      }\n    `)\n})\n"
  },
  {
    "path": "packages/core/src/query/getBlockTransactionCount.ts",
    "content": "import {\n  type GetBlockTransactionCountErrorType,\n  type GetBlockTransactionCountParameters,\n  type GetBlockTransactionCountReturnType,\n  getBlockTransactionCount,\n} from '../actions/getBlockTransactionCount.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { ExactPartial, UnionCompute } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type GetBlockTransactionCountOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetBlockTransactionCountData,\n> = UnionCompute<\n  ExactPartial<GetBlockTransactionCountParameters<config, chainId>> &\n    ScopeKeyParameter\n> &\n  QueryParameter<\n    GetBlockTransactionCountQueryFnData,\n    GetBlockTransactionCountErrorType,\n    selectData,\n    GetBlockTransactionCountQueryKey<config, chainId>\n  >\n\nexport function getBlockTransactionCountQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetBlockTransactionCountData,\n>(\n  config: config,\n  options: GetBlockTransactionCountOptions<config, chainId, selectData> = {},\n): GetBlockTransactionCountQueryOptions<config, chainId, selectData> {\n  return {\n    ...options.query,\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      const blockTransactionCount = await getBlockTransactionCount(\n        config,\n        parameters as any,\n      )\n      return blockTransactionCount ?? null\n    },\n    queryKey: getBlockTransactionCountQueryKey(options),\n  }\n}\n\nexport type GetBlockTransactionCountQueryFnData =\n  GetBlockTransactionCountReturnType\n\nexport type GetBlockTransactionCountData = GetBlockTransactionCountQueryFnData\n\nexport function getBlockTransactionCountQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n>(\n  options: UnionCompute<\n    ExactPartial<GetBlockTransactionCountParameters<config, chainId>> &\n      ScopeKeyParameter\n  > = {},\n) {\n  return ['blockTransactionCount', filterQueryOptions(options)] as const\n}\n\nexport type GetBlockTransactionCountQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = ReturnType<typeof getBlockTransactionCountQueryKey<config, chainId>>\n\nexport type GetBlockTransactionCountQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetBlockTransactionCountData,\n> = QueryOptions<\n  GetBlockTransactionCountQueryFnData,\n  GetBlockTransactionCountErrorType,\n  selectData,\n  GetBlockTransactionCountQueryKey<config, chainId>\n>\n"
  },
  {
    "path": "packages/core/src/query/getBytecode.test.ts",
    "content": "import { address, chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getBytecodeQueryOptions } from './getBytecode.js'\n\ntest('default', () => {\n  expect(\n    getBytecodeQueryOptions(config, {\n      address: address.wagmiMintExample,\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"getBytecode\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    getBytecodeQueryOptions(config, {\n      address: address.wagmiMintExample,\n      chainId: chain.mainnet2.id,\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"getBytecode\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"chainId\": 456,\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: blockNumber', () => {\n  expect(\n    getBytecodeQueryOptions(config, {\n      address: address.wagmiMintExample,\n      blockNumber: 1234567890n,\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"getBytecode\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"blockNumber\": 1234567890n,\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: blockTag', () => {\n  expect(\n    getBytecodeQueryOptions(config, {\n      address: address.wagmiMintExample,\n      blockTag: 'safe',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"getBytecode\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"blockTag\": \"safe\",\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/getBytecode.ts",
    "content": "import {\n  type GetBytecodeErrorType,\n  type GetBytecodeParameters,\n  type GetBytecodeReturnType,\n  getBytecode,\n} from '../actions/getBytecode.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type GetBytecodeOptions<\n  config extends Config,\n  selectData = GetBytecodeData,\n> = Compute<ExactPartial<GetBytecodeParameters<config>> & ScopeKeyParameter> &\n  QueryParameter<\n    GetBytecodeQueryFnData,\n    GetBytecodeErrorType,\n    selectData,\n    GetBytecodeQueryKey<config>\n  >\n\nexport function getBytecodeQueryOptions<\n  config extends Config,\n  selectData = GetBytecodeData,\n>(\n  config: config,\n  options: GetBytecodeOptions<config, selectData> = {},\n): GetBytecodeQueryOptions<config, selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(options.address && (options.query?.enabled ?? true)),\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      if (!parameters.address) throw new Error('address is required')\n      const bytecode = await getBytecode(config, {\n        ...(parameters as any),\n        address: parameters.address,\n      })\n      return (bytecode ?? null) as any\n    },\n    queryKey: getBytecodeQueryKey(options),\n  }\n}\n\nexport type GetBytecodeQueryFnData = GetBytecodeReturnType\n\nexport type GetBytecodeData = GetBytecodeQueryFnData\n\nexport function getBytecodeQueryKey<config extends Config>(\n  options: Compute<\n    ExactPartial<GetBytecodeParameters<config>> & ScopeKeyParameter\n  > = {},\n) {\n  return ['getBytecode', filterQueryOptions(options)] as const\n}\n\nexport type GetBytecodeQueryKey<config extends Config> = ReturnType<\n  typeof getBytecodeQueryKey<config>\n>\n\nexport type GetBytecodeQueryOptions<\n  config extends Config,\n  selectData = GetBytecodeData,\n> = QueryOptions<\n  GetBytecodeQueryFnData,\n  GetBytecodeErrorType,\n  selectData,\n  GetBytecodeQueryKey<config>\n>\n"
  },
  {
    "path": "packages/core/src/query/getCallsStatus.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getCallsStatusQueryOptions } from './getCallsStatus.js'\n\ntest('default', () => {\n  expect(\n    getCallsStatusQueryOptions(config, {\n      id: '0x0000000000000000000000000000000000000000',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": false,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"callsStatus\",\n        {\n          \"id\": \"0x0000000000000000000000000000000000000000\",\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/getCallsStatus.ts",
    "content": "import {\n  type GetCallsStatusErrorType,\n  type GetCallsStatusParameters,\n  type GetCallsStatusReturnType,\n  getCallsStatus,\n} from '../actions/getCallsStatus.js'\nimport type { Config } from '../createConfig.js'\nimport { filterQueryOptions } from '../query/utils.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute } from '../types/utils.js'\n\nexport type GetCallsStatusOptions<selectData = GetCallsStatusData> = Compute<\n  GetCallsStatusParameters & ScopeKeyParameter\n> &\n  QueryParameter<\n    GetCallsStatusQueryFnData,\n    GetCallsStatusErrorType,\n    selectData,\n    GetCallsStatusQueryKey\n  >\n\nexport function getCallsStatusQueryOptions<\n  config extends Config,\n  selectData = GetCallsStatusData,\n>(\n  config: config,\n  options: GetCallsStatusOptions<selectData>,\n): GetCallsStatusQueryOptions<selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(\n      options.connector?.getProvider && (options.query?.enabled ?? true),\n    ),\n    queryFn: async (context) => {\n      if (!options.connector?.getProvider)\n        throw new Error('connector is required')\n      const [, { connectorUid: _, scopeKey: __, ...parameters }] =\n        context.queryKey\n      const status = await getCallsStatus(config, parameters)\n      return status\n    },\n    queryKey: getCallsStatusQueryKey(options),\n  }\n}\n\nexport type GetCallsStatusQueryFnData = GetCallsStatusReturnType\n\nexport type GetCallsStatusData = GetCallsStatusQueryFnData\n\nexport function getCallsStatusQueryKey(\n  options: Compute<GetCallsStatusParameters & ScopeKeyParameter>,\n) {\n  return ['callsStatus', filterQueryOptions(options)] as const\n}\n\nexport type GetCallsStatusQueryKey = ReturnType<typeof getCallsStatusQueryKey>\n\nexport type GetCallsStatusQueryOptions<selectData = GetCallsStatusData> =\n  QueryOptions<\n    GetCallsStatusQueryFnData,\n    GetCallsStatusErrorType,\n    selectData,\n    GetCallsStatusQueryKey\n  >\n"
  },
  {
    "path": "packages/core/src/query/getCapabilities.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getCapabilitiesQueryOptions } from './getCapabilities.js'\n\ntest('default', () => {\n  expect(getCapabilitiesQueryOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"enabled\": false,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"capabilities\",\n        {},\n      ],\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    getCapabilitiesQueryOptions(config, {\n      account: '0x0000000000000000000000000000000000000000',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": false,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"capabilities\",\n        {\n          \"account\": \"0x0000000000000000000000000000000000000000\",\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/getCapabilities.ts",
    "content": "import {\n  type GetCapabilitiesErrorType,\n  type GetCapabilitiesParameters,\n  type GetCapabilitiesReturnType,\n  getCapabilities,\n} from '../actions/getCapabilities.js'\nimport type { Config } from '../createConfig.js'\nimport { filterQueryOptions } from '../query/utils.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\n\nexport type GetCapabilitiesOptions<\n  config extends Config = Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  selectData = GetCapabilitiesData<config, chainId>,\n> = Compute<\n  ExactPartial<GetCapabilitiesParameters<config, chainId>> & ScopeKeyParameter\n> &\n  QueryParameter<\n    GetCapabilitiesQueryFnData<config, chainId>,\n    GetCapabilitiesErrorType,\n    selectData,\n    GetCapabilitiesQueryKey<config, chainId>\n  >\n\nexport function getCapabilitiesQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  selectData = GetCapabilitiesData<config, chainId>,\n>(\n  config: config,\n  options: GetCapabilitiesOptions<config, chainId, selectData> = {},\n): GetCapabilitiesQueryOptions<config, chainId, selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(\n      options.connector?.getProvider && (options.query?.enabled ?? true),\n    ),\n    queryFn: async (context) => {\n      if (!options.connector?.getProvider)\n        throw new Error('connector is required')\n      const [, { connectorUid: _, scopeKey: __, ...parameters }] =\n        context.queryKey\n      const capabilities = await getCapabilities(config, parameters)\n      return capabilities\n    },\n    queryKey: getCapabilitiesQueryKey(options),\n  }\n}\n\nexport type GetCapabilitiesQueryFnData<\n  config extends Config = Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n> = GetCapabilitiesReturnType<config, chainId>\n\nexport type GetCapabilitiesData<\n  config extends Config = Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n> = GetCapabilitiesQueryFnData<config, chainId>\n\nexport function getCapabilitiesQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n>(\n  options: Compute<\n    ExactPartial<GetCapabilitiesParameters<config, chainId>> & ScopeKeyParameter\n  > = {},\n) {\n  return ['capabilities', filterQueryOptions(options)] as const\n}\n\nexport type GetCapabilitiesQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n> = ReturnType<typeof getCapabilitiesQueryKey<config, chainId>>\n\nexport type GetCapabilitiesQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  selectData = GetCapabilitiesData<config, chainId>,\n> = QueryOptions<\n  GetCapabilitiesQueryFnData<config, chainId>,\n  GetCapabilitiesErrorType,\n  selectData,\n  GetCapabilitiesQueryKey<config, chainId>\n>\n"
  },
  {
    "path": "packages/core/src/query/getConnectorClient.test-d.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { getConnectorClientQueryOptions } from './getConnectorClient.js'\n\nconst context = {} as any\n\ntest('default', async () => {\n  const options = getConnectorClientQueryOptions(config)\n  const client = await options.queryFn(context)\n  expectTypeOf(client.chain).toEqualTypeOf<(typeof config)['chains'][number]>()\n  expectTypeOf(client.transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('parameters: chainId', async () => {\n  const options = getConnectorClientQueryOptions(config, {\n    chainId: chain.mainnet.id,\n  })\n  const client = await options.queryFn(context)\n  expectTypeOf(client.chain).toEqualTypeOf<typeof chain.mainnet>()\n  expectTypeOf(client.chain).not.toEqualTypeOf<typeof chain.mainnet2>()\n  expectTypeOf(client.transport.type).toEqualTypeOf<'http'>()\n})\n"
  },
  {
    "path": "packages/core/src/query/getConnectorClient.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getConnectorClientQueryOptions } from './getConnectorClient.js'\n\ntest('default', () => {\n  expect(getConnectorClientQueryOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"enabled\": false,\n      \"gcTime\": 0,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"connectorClient\",\n        {},\n      ],\n      \"staleTime\": Infinity,\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    getConnectorClientQueryOptions(config, { chainId: chain.mainnet.id }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": false,\n      \"gcTime\": 0,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"connectorClient\",\n        {\n          \"chainId\": 1,\n        },\n      ],\n      \"staleTime\": Infinity,\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/getConnectorClient.ts",
    "content": "import {\n  type GetConnectorClientErrorType,\n  type GetConnectorClientParameters,\n  type GetConnectorClientReturnType,\n  getConnectorClient,\n} from '../actions/getConnectorClient.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type GetConnectorClientOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetConnectorClientData<config, chainId>,\n> = Compute<\n  ExactPartial<GetConnectorClientParameters<config, chainId>> &\n    ScopeKeyParameter\n> &\n  Omit<\n    QueryParameter<\n      GetConnectorClientQueryFnData<config, chainId>,\n      GetConnectorClientErrorType,\n      selectData,\n      GetConnectorClientQueryKey<config, chainId>\n    >,\n    'gcTime' | 'staleTime'\n  >\n\nexport function getConnectorClientQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetConnectorClientData<config, chainId>,\n>(\n  config: config,\n  options: GetConnectorClientOptions<config, chainId, selectData> = {},\n): GetConnectorClientQueryOptions<config, chainId, selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(\n      options.connector?.getProvider && (options.query?.enabled ?? true),\n    ),\n    gcTime: 0,\n    queryFn: async (context) => {\n      const [, { connectorUid: _, scopeKey: __, ...parameters }] =\n        context.queryKey\n      return getConnectorClient(config, {\n        ...parameters,\n        connector: options.connector,\n      }) as unknown as Promise<GetConnectorClientReturnType<config, chainId>>\n    },\n    queryKey: getConnectorClientQueryKey(options),\n    staleTime: Number.POSITIVE_INFINITY,\n  }\n}\n\nexport type GetConnectorClientQueryFnData<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = GetConnectorClientReturnType<config, chainId>\n\nexport type GetConnectorClientData<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = GetConnectorClientQueryFnData<config, chainId>\n\nexport function getConnectorClientQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n>(\n  options: Compute<\n    ExactPartial<GetConnectorClientParameters<config, chainId>> &\n      ScopeKeyParameter\n  > = {},\n) {\n  return ['connectorClient', filterQueryOptions(options)] as const\n}\n\nexport type GetConnectorClientQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = ReturnType<typeof getConnectorClientQueryKey<config, chainId>>\n\nexport type GetConnectorClientQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetConnectorClientData<config, chainId>,\n> = QueryOptions<\n  GetConnectorClientQueryFnData<config, chainId>,\n  GetConnectorClientErrorType,\n  selectData,\n  GetConnectorClientQueryKey<config, chainId>\n>\n"
  },
  {
    "path": "packages/core/src/query/getContractEvents.test-d.ts",
    "content": "import { abi, config } from '@wagmi/test'\nimport { test } from 'vitest'\n\nimport { getContractEventsQueryOptions } from './getContractEvents.js'\n\ntest('default', () => {\n  getContractEventsQueryOptions(config, {\n    address: '0x',\n    abi: abi.erc20,\n    eventName: 'Transfer',\n    args: {\n      from: '0x',\n      to: '0x',\n    },\n  })\n  getContractEventsQueryOptions(config, {\n    address: '0x',\n    abi: abi.erc20,\n    // @ts-expect-error\n    eventName: 'Foo',\n  })\n  getContractEventsQueryOptions(config, {\n    address: '0x',\n    abi: abi.erc20,\n    eventName: 'Transfer',\n    args: {\n      // @ts-expect-error\n      foo: '0x',\n      to: '0x',\n    },\n  })\n})\n"
  },
  {
    "path": "packages/core/src/query/getContractEvents.test.ts",
    "content": "import { abi, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getContractEventsQueryOptions } from './getContractEvents.js'\n\ntest('default', () => {\n  expect(\n    getContractEventsQueryOptions(config, {\n      address: '0x',\n      abi: abi.erc20,\n      eventName: 'Approval',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"getContractEvents\",\n        {\n          \"address\": \"0x\",\n          \"eventName\": \"Approval\",\n        },\n      ],\n      \"structuralSharing\": [Function],\n    }\n  `)\n})\n\ntest('enabled', () => {\n  expect(\n    getContractEventsQueryOptions(config, {\n      address: '0x',\n      eventName: 'Approval',\n    }).enabled,\n  ).toBe(false)\n})\n"
  },
  {
    "path": "packages/core/src/query/getContractEvents.ts",
    "content": "import type { Abi, BlockNumber, BlockTag, ContractEventName } from 'viem'\nimport {\n  type GetContractEventsErrorType,\n  type GetContractEventsParameters,\n  type GetContractEventsReturnType,\n  getContractEvents,\n} from '../actions/getContractEvents.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { UnionExactPartial } from '../types/utils.js'\nimport { filterQueryOptions, structuralSharing } from './utils.js'\n\nexport type GetContractEventsOptions<\n  abi extends Abi | readonly unknown[],\n  eventName extends ContractEventName<abi> | undefined,\n  strict extends boolean | undefined,\n  fromBlock extends BlockNumber | BlockTag | undefined,\n  toBlock extends BlockNumber | BlockTag | undefined,\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetContractEventsData<\n    abi,\n    eventName,\n    strict,\n    fromBlock,\n    toBlock\n  >,\n> = UnionExactPartial<\n  GetContractEventsParameters<\n    abi,\n    eventName,\n    strict,\n    fromBlock,\n    toBlock,\n    config,\n    chainId\n  >\n> &\n  ScopeKeyParameter &\n  QueryParameter<\n    GetContractEventsQueryFnData<abi, eventName, strict, fromBlock, toBlock>,\n    GetContractEventsErrorType,\n    selectData,\n    GetContractEventsQueryKey<\n      config,\n      chainId,\n      abi,\n      eventName,\n      strict,\n      fromBlock,\n      toBlock\n    >\n  >\n\nexport function getContractEventsQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  const abi extends Abi | readonly unknown[],\n  eventName extends ContractEventName<abi> | undefined,\n  strict extends boolean | undefined = undefined,\n  fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n  toBlock extends BlockNumber | BlockTag | undefined = undefined,\n  selectData = GetContractEventsData<\n    abi,\n    eventName,\n    strict,\n    fromBlock,\n    toBlock\n  >,\n>(\n  config: config,\n  options: GetContractEventsOptions<\n    abi,\n    eventName,\n    strict,\n    fromBlock,\n    toBlock,\n    config,\n    chainId,\n    selectData\n  > = {} as any,\n): GetContractEventsQueryOptions<\n  abi,\n  eventName,\n  strict,\n  fromBlock,\n  toBlock,\n  config,\n  chainId,\n  selectData\n> {\n  return {\n    ...options.query,\n    enabled: Boolean(options.abi && (options.query?.enabled ?? true)),\n    queryFn: async (context) => {\n      if (!options.abi) throw new Error('abi is required')\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      const result = await getContractEvents(config, {\n        ...(parameters as any),\n        abi: options.abi,\n      })\n      return result as GetContractEventsData<\n        abi,\n        eventName,\n        strict,\n        fromBlock,\n        toBlock\n      >\n    },\n    queryKey: getContractEventsQueryKey(options as any) as any,\n    structuralSharing,\n  } as GetContractEventsQueryOptions<\n    abi,\n    eventName,\n    strict,\n    fromBlock,\n    toBlock,\n    config,\n    chainId,\n    selectData\n  >\n}\n\nexport type GetContractEventsQueryFnData<\n  abi extends Abi | readonly unknown[],\n  eventName extends ContractEventName<abi> | undefined,\n  strict extends boolean | undefined,\n  fromBlock extends BlockNumber | BlockTag | undefined,\n  toBlock extends BlockNumber | BlockTag | undefined,\n> = GetContractEventsReturnType<abi, eventName, strict, fromBlock, toBlock>\n\nexport type GetContractEventsData<\n  abi extends Abi | readonly unknown[],\n  eventName extends ContractEventName<abi> | undefined,\n  strict extends boolean | undefined,\n  fromBlock extends BlockNumber | BlockTag | undefined,\n  toBlock extends BlockNumber | BlockTag | undefined,\n> = GetContractEventsQueryFnData<abi, eventName, strict, fromBlock, toBlock>\n\nexport function getContractEventsQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  const abi extends Abi | readonly unknown[],\n  eventName extends ContractEventName<abi> | undefined,\n  strict extends boolean | undefined = undefined,\n  fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n  toBlock extends BlockNumber | BlockTag | undefined = undefined,\n>(\n  options: UnionExactPartial<\n    GetContractEventsParameters<\n      abi,\n      eventName,\n      strict,\n      fromBlock,\n      toBlock,\n      config,\n      chainId\n    >\n  > &\n    ScopeKeyParameter = {} as any,\n) {\n  return ['getContractEvents', filterQueryOptions(options)] as const\n}\n\nexport type GetContractEventsQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  abi extends Abi | readonly unknown[],\n  eventName extends ContractEventName<abi> | undefined,\n  strict extends boolean | undefined,\n  fromBlock extends BlockNumber | BlockTag | undefined,\n  toBlock extends BlockNumber | BlockTag | undefined,\n> = ReturnType<\n  typeof getContractEventsQueryKey<\n    config,\n    chainId,\n    abi,\n    eventName,\n    strict,\n    fromBlock,\n    toBlock\n  >\n>\n\nexport type GetContractEventsQueryOptions<\n  abi extends Abi | readonly unknown[],\n  eventName extends ContractEventName<abi> | undefined,\n  strict extends boolean | undefined,\n  fromBlock extends BlockNumber | BlockTag | undefined,\n  toBlock extends BlockNumber | BlockTag | undefined,\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetContractEventsData<\n    abi,\n    eventName,\n    strict,\n    fromBlock,\n    toBlock\n  >,\n> = QueryOptions<\n  GetContractEventsQueryFnData<abi, eventName, strict, fromBlock, toBlock>,\n  GetContractEventsErrorType,\n  selectData,\n  GetContractEventsQueryKey<\n    config,\n    chainId,\n    abi,\n    eventName,\n    strict,\n    fromBlock,\n    toBlock\n  >\n>\n"
  },
  {
    "path": "packages/core/src/query/getEnsAddress.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getEnsAddressQueryOptions } from './getEnsAddress.js'\n\ntest('default', () => {\n  expect(getEnsAddressQueryOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"enabled\": false,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"ensAddress\",\n        {},\n      ],\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    getEnsAddressQueryOptions(config, { chainId: chain.mainnet.id }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": false,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"ensAddress\",\n        {\n          \"chainId\": 1,\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/getEnsAddress.ts",
    "content": "import {\n  type GetEnsAddressErrorType,\n  type GetEnsAddressParameters,\n  type GetEnsAddressReturnType,\n  getEnsAddress,\n} from '../actions/getEnsAddress.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type GetEnsAddressOptions<\n  config extends Config,\n  selectData = GetEnsAddressData,\n> = Compute<ExactPartial<GetEnsAddressParameters<config>> & ScopeKeyParameter> &\n  QueryParameter<\n    GetEnsAddressQueryFnData,\n    GetEnsAddressErrorType,\n    selectData,\n    GetEnsAddressQueryKey<config>\n  >\n\nexport function getEnsAddressQueryOptions<\n  config extends Config,\n  selectData = GetEnsAddressData,\n>(\n  config: config,\n  options: GetEnsAddressOptions<config, selectData> = {},\n): GetEnsAddressQueryOptions<config, selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(options.name && (options.query?.enabled ?? true)),\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      if (!parameters.name) throw new Error('name is required')\n      return getEnsAddress(config, { ...parameters, name: parameters.name })\n    },\n    queryKey: getEnsAddressQueryKey(options),\n  }\n}\n\nexport type GetEnsAddressQueryFnData = GetEnsAddressReturnType\n\nexport type GetEnsAddressData = GetEnsAddressQueryFnData\n\nexport function getEnsAddressQueryKey<config extends Config>(\n  options: Compute<\n    ExactPartial<GetEnsAddressParameters<config>> & ScopeKeyParameter\n  > = {},\n) {\n  return ['ensAddress', filterQueryOptions(options)] as const\n}\n\nexport type GetEnsAddressQueryKey<config extends Config> = ReturnType<\n  typeof getEnsAddressQueryKey<config>\n>\n\nexport type GetEnsAddressQueryOptions<\n  config extends Config,\n  selectData = GetEnsAddressData,\n> = QueryOptions<\n  GetEnsAddressQueryFnData,\n  GetEnsAddressErrorType,\n  selectData,\n  GetEnsAddressQueryKey<config>\n>\n"
  },
  {
    "path": "packages/core/src/query/getEnsAvatar.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getEnsAvatarQueryOptions } from './getEnsAvatar.js'\n\ntest('default', () => {\n  expect(getEnsAvatarQueryOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"enabled\": false,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"ensAvatar\",\n        {},\n      ],\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    getEnsAvatarQueryOptions(config, { chainId: chain.mainnet.id }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": false,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"ensAvatar\",\n        {\n          \"chainId\": 1,\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/getEnsAvatar.ts",
    "content": "import {\n  type GetEnsAvatarErrorType,\n  type GetEnsAvatarParameters,\n  type GetEnsAvatarReturnType,\n  getEnsAvatar,\n} from '../actions/getEnsAvatar.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type GetEnsAvatarOptions<\n  config extends Config,\n  selectData = GetEnsAvatarData,\n> = Compute<ExactPartial<GetEnsAvatarParameters<config>> & ScopeKeyParameter> &\n  QueryParameter<\n    GetEnsAvatarQueryFnData,\n    GetEnsAvatarErrorType,\n    selectData,\n    GetEnsAvatarQueryKey<config>\n  >\n\nexport function getEnsAvatarQueryOptions<\n  config extends Config,\n  selectData = GetEnsAvatarData,\n>(\n  config: config,\n  options: GetEnsAvatarOptions<config, selectData> = {},\n): GetEnsAvatarQueryOptions<config, selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(options.name && (options.query?.enabled ?? true)),\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      if (!parameters.name) throw new Error('name is required')\n      return getEnsAvatar(config, { ...parameters, name: parameters.name })\n    },\n    queryKey: getEnsAvatarQueryKey(options),\n  }\n}\n\nexport type GetEnsAvatarQueryFnData = GetEnsAvatarReturnType\n\nexport type GetEnsAvatarData = GetEnsAvatarQueryFnData\n\nexport function getEnsAvatarQueryKey<config extends Config>(\n  options: Compute<\n    ExactPartial<GetEnsAvatarParameters<config>> & ScopeKeyParameter\n  > = {},\n) {\n  return ['ensAvatar', filterQueryOptions(options)] as const\n}\n\nexport type GetEnsAvatarQueryKey<config extends Config> = ReturnType<\n  typeof getEnsAvatarQueryKey<config>\n>\n\nexport type GetEnsAvatarQueryOptions<\n  config extends Config,\n  selectData = GetEnsAvatarData,\n> = QueryOptions<\n  GetEnsAvatarQueryFnData,\n  GetEnsAvatarErrorType,\n  selectData,\n  GetEnsAvatarQueryKey<config>\n>\n"
  },
  {
    "path": "packages/core/src/query/getEnsName.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getEnsNameQueryOptions } from './getEnsName.js'\n\ntest('default', () => {\n  expect(getEnsNameQueryOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"enabled\": false,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"ensName\",\n        {},\n      ],\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    getEnsNameQueryOptions(config, { chainId: chain.mainnet.id }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": false,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"ensName\",\n        {\n          \"chainId\": 1,\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/getEnsName.ts",
    "content": "import {\n  type GetEnsNameErrorType,\n  type GetEnsNameParameters,\n  type GetEnsNameReturnType,\n  getEnsName,\n} from '../actions/getEnsName.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type GetEnsNameOptions<\n  config extends Config,\n  selectData = GetEnsNameData,\n> = Compute<ExactPartial<GetEnsNameParameters<config>> & ScopeKeyParameter> &\n  QueryParameter<\n    GetEnsNameQueryFnData,\n    GetEnsNameErrorType,\n    selectData,\n    GetEnsNameQueryKey<config>\n  >\n\nexport function getEnsNameQueryOptions<\n  config extends Config,\n  selectData = GetEnsNameData,\n>(\n  config: config,\n  options: GetEnsNameOptions<config, selectData> = {},\n): GetEnsNameQueryOptions<config, selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(options.address && (options.query?.enabled ?? true)),\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      if (!parameters.address) throw new Error('address is required')\n      return getEnsName(config, { ...parameters, address: parameters.address })\n    },\n    queryKey: getEnsNameQueryKey(options),\n  }\n}\n\nexport type GetEnsNameQueryFnData = GetEnsNameReturnType\n\nexport type GetEnsNameData = GetEnsNameQueryFnData\n\nexport function getEnsNameQueryKey<config extends Config>(\n  options: Compute<\n    ExactPartial<GetEnsNameParameters<config>> & ScopeKeyParameter\n  > = {},\n) {\n  return ['ensName', filterQueryOptions(options)] as const\n}\n\nexport type GetEnsNameQueryKey<config extends Config> = ReturnType<\n  typeof getEnsNameQueryKey<config>\n>\n\nexport type GetEnsNameQueryOptions<\n  config extends Config,\n  selectData = GetEnsNameData,\n> = QueryOptions<\n  GetEnsNameQueryFnData,\n  GetEnsNameErrorType,\n  selectData,\n  GetEnsNameQueryKey<config>\n>\n"
  },
  {
    "path": "packages/core/src/query/getEnsResolver.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getEnsResolverQueryOptions } from './getEnsResolver.js'\n\ntest('default', () => {\n  expect(getEnsResolverQueryOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"enabled\": false,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"ensResolver\",\n        {},\n      ],\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    getEnsResolverQueryOptions(config, { chainId: chain.mainnet.id }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": false,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"ensResolver\",\n        {\n          \"chainId\": 1,\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/getEnsResolver.ts",
    "content": "import {\n  type GetEnsResolverErrorType,\n  type GetEnsResolverParameters,\n  type GetEnsResolverReturnType,\n  getEnsResolver,\n} from '../actions/getEnsResolver.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type GetEnsResolverOptions<\n  config extends Config,\n  selectData = GetEnsResolverData,\n> = Compute<\n  ExactPartial<GetEnsResolverParameters<config>> & ScopeKeyParameter\n> &\n  QueryParameter<\n    GetEnsResolverQueryFnData,\n    GetEnsResolverErrorType,\n    selectData,\n    GetEnsResolverQueryKey<config>\n  >\n\nexport function getEnsResolverQueryOptions<\n  config extends Config,\n  selectData = GetEnsResolverData,\n>(\n  config: config,\n  options: GetEnsResolverOptions<config, selectData> = {},\n): GetEnsResolverQueryOptions<config, selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(options.name && (options.query?.enabled ?? true)),\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      if (!parameters.name) throw new Error('name is required')\n      return getEnsResolver(config, { ...parameters, name: parameters.name })\n    },\n    queryKey: getEnsResolverQueryKey(options),\n  }\n}\n\nexport type GetEnsResolverQueryFnData = GetEnsResolverReturnType\n\nexport type GetEnsResolverData = GetEnsResolverQueryFnData\n\nexport function getEnsResolverQueryKey<config extends Config>(\n  options: Compute<\n    ExactPartial<GetEnsResolverParameters<config>> & ScopeKeyParameter\n  > = {},\n) {\n  return ['ensResolver', filterQueryOptions(options)] as const\n}\n\nexport type GetEnsResolverQueryKey<config extends Config> = ReturnType<\n  typeof getEnsResolverQueryKey<config>\n>\n\nexport type GetEnsResolverQueryOptions<\n  config extends Config,\n  selectData = GetEnsResolverData,\n> = QueryOptions<\n  GetEnsResolverQueryFnData,\n  GetEnsResolverErrorType,\n  selectData,\n  GetEnsResolverQueryKey<config>\n>\n"
  },
  {
    "path": "packages/core/src/query/getEnsText.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getEnsTextQueryOptions } from './getEnsText.js'\n\ntest('default', () => {\n  expect(\n    getEnsTextQueryOptions(config, {\n      name: 'wevm.eth',\n      key: 'com.twitter',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"ensText\",\n        {\n          \"key\": \"com.twitter\",\n          \"name\": \"wevm.eth\",\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    getEnsTextQueryOptions(config, {\n      chainId: chain.mainnet.id,\n      name: 'wevm.eth',\n      key: 'com.twitter',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"ensText\",\n        {\n          \"chainId\": 1,\n          \"key\": \"com.twitter\",\n          \"name\": \"wevm.eth\",\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/getEnsText.ts",
    "content": "import {\n  type GetEnsTextErrorType,\n  type GetEnsTextParameters,\n  type GetEnsTextReturnType,\n  getEnsText,\n} from '../actions/getEnsText.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type GetEnsTextOptions<\n  config extends Config,\n  selectData = GetEnsTextData,\n> = Compute<ExactPartial<GetEnsTextParameters<config>> & ScopeKeyParameter> &\n  QueryParameter<\n    GetEnsTextQueryFnData,\n    GetEnsTextErrorType,\n    selectData,\n    GetEnsTextQueryKey<config>\n  >\n\nexport function getEnsTextQueryOptions<\n  config extends Config,\n  selectData = GetEnsTextData,\n>(\n  config: config,\n  options: GetEnsTextOptions<config, selectData> = {},\n): GetEnsTextQueryOptions<config, selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(\n      options.key && options.name && (options.query?.enabled ?? true),\n    ),\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      if (!parameters.key || !parameters.name)\n        throw new Error('key and name are required')\n      return getEnsText(config, {\n        ...parameters,\n        key: parameters.key,\n        name: parameters.name,\n      })\n    },\n    queryKey: getEnsTextQueryKey(options),\n  }\n}\n\nexport type GetEnsTextQueryFnData = GetEnsTextReturnType\n\nexport type GetEnsTextData = GetEnsTextQueryFnData\n\nexport function getEnsTextQueryKey<config extends Config>(\n  options: Compute<\n    ExactPartial<GetEnsTextParameters<config>> & ScopeKeyParameter\n  > = {},\n) {\n  return ['ensText', filterQueryOptions(options)] as const\n}\n\nexport type GetEnsTextQueryKey<config extends Config> = ReturnType<\n  typeof getEnsTextQueryKey<config>\n>\n\nexport type GetEnsTextQueryOptions<\n  config extends Config,\n  selectData = GetEnsTextData,\n> = QueryOptions<\n  GetEnsTextQueryFnData,\n  GetEnsTextErrorType,\n  selectData,\n  GetEnsTextQueryKey<config>\n>\n"
  },
  {
    "path": "packages/core/src/query/getFeeHistory.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getFeeHistoryQueryOptions } from './getFeeHistory.js'\n\ntest('default', async () => {\n  expect(\n    getFeeHistoryQueryOptions(config, {\n      blockCount: 4,\n      rewardPercentiles: [25, 75],\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"feeHistory\",\n        {\n          \"blockCount\": 4,\n          \"rewardPercentiles\": [\n            25,\n            75,\n          ],\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: chainId', async () => {\n  expect(\n    getFeeHistoryQueryOptions(config, {\n      blockCount: 4,\n      rewardPercentiles: [25, 75],\n      chainId: chain.mainnet2.id,\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"feeHistory\",\n        {\n          \"blockCount\": 4,\n          \"chainId\": 456,\n          \"rewardPercentiles\": [\n            25,\n            75,\n          ],\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: blockNumber', async () => {\n  expect(\n    getFeeHistoryQueryOptions(config, {\n      blockCount: 4,\n      rewardPercentiles: [25, 75],\n      blockNumber: 18677379n,\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"feeHistory\",\n        {\n          \"blockCount\": 4,\n          \"blockNumber\": 18677379n,\n          \"rewardPercentiles\": [\n            25,\n            75,\n          ],\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: blockTag', async () => {\n  expect(\n    getFeeHistoryQueryOptions(config, {\n      blockCount: 4,\n      rewardPercentiles: [25, 75],\n      blockTag: 'safe',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"feeHistory\",\n        {\n          \"blockCount\": 4,\n          \"blockTag\": \"safe\",\n          \"rewardPercentiles\": [\n            25,\n            75,\n          ],\n        },\n      ],\n    }\n  `)\n})\n\ntest('behavior: blockCount is required', async () => {\n  const options = getFeeHistoryQueryOptions(config, {})\n  await expect(\n    options.queryFn({\n      queryKey: options.queryKey,\n      signal: new AbortSignal(),\n      meta: undefined,\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(\n    '[Error: blockCount is required]',\n  )\n})\n\ntest('behavior: rewardPercentiles is required', async () => {\n  const options = getFeeHistoryQueryOptions(config, { blockCount: 4 })\n  await expect(\n    options.queryFn({\n      queryKey: options.queryKey,\n      signal: new AbortSignal(),\n      meta: undefined,\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(\n    '[Error: rewardPercentiles is required]',\n  )\n})\n"
  },
  {
    "path": "packages/core/src/query/getFeeHistory.ts",
    "content": "import {\n  type GetFeeHistoryErrorType,\n  type GetFeeHistoryParameters,\n  type GetFeeHistoryReturnType,\n  getFeeHistory,\n} from '../actions/getFeeHistory.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type GetFeeHistoryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetFeeHistoryData,\n> = Compute<\n  ExactPartial<GetFeeHistoryParameters<config, chainId>> & ScopeKeyParameter\n> &\n  QueryParameter<\n    GetFeeHistoryQueryFnData,\n    GetFeeHistoryErrorType,\n    selectData,\n    GetFeeHistoryQueryKey<config, chainId>\n  >\n\nexport function getFeeHistoryQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetFeeHistoryData,\n>(\n  config: config,\n  options: GetFeeHistoryOptions<config, chainId, selectData> = {},\n): GetFeeHistoryQueryOptions<config, chainId, selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(\n      options.blockCount &&\n        options.rewardPercentiles &&\n        (options.query?.enabled ?? true),\n    ),\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      if (!parameters.blockCount) throw new Error('blockCount is required')\n      if (!parameters.rewardPercentiles)\n        throw new Error('rewardPercentiles is required')\n      const feeHistory = await getFeeHistory(config, {\n        ...(parameters as GetFeeHistoryParameters),\n        blockCount: parameters.blockCount,\n        rewardPercentiles: parameters.rewardPercentiles,\n      })\n      return feeHistory ?? null\n    },\n    queryKey: getFeeHistoryQueryKey(options),\n  }\n}\n\nexport type GetFeeHistoryQueryFnData = GetFeeHistoryReturnType\n\nexport type GetFeeHistoryData = GetFeeHistoryQueryFnData\n\nexport function getFeeHistoryQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n>(\n  options: Compute<\n    ExactPartial<GetFeeHistoryParameters<config, chainId>> & ScopeKeyParameter\n  > = {},\n) {\n  return ['feeHistory', filterQueryOptions(options)] as const\n}\n\nexport type GetFeeHistoryQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = ReturnType<typeof getFeeHistoryQueryKey<config, chainId>>\n\nexport type GetFeeHistoryQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetFeeHistoryData,\n> = QueryOptions<\n  GetFeeHistoryQueryFnData,\n  GetFeeHistoryErrorType,\n  selectData,\n  GetFeeHistoryQueryKey<config, chainId>\n>\n"
  },
  {
    "path": "packages/core/src/query/getGasPrice.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getGasPriceQueryOptions } from './getGasPrice.js'\n\ntest('default', () => {\n  expect(getGasPriceQueryOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"gasPrice\",\n        {},\n      ],\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    getGasPriceQueryOptions(config, { chainId: chain.mainnet.id }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"gasPrice\",\n        {\n          \"chainId\": 1,\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/getGasPrice.ts",
    "content": "import {\n  type GetGasPriceErrorType,\n  type GetGasPriceParameters,\n  type GetGasPriceReturnType,\n  getGasPrice,\n} from '../actions/getGasPrice.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type GetGasPriceOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetGasPriceData,\n> = Compute<\n  ExactPartial<GetGasPriceParameters<config, chainId>> & ScopeKeyParameter\n> &\n  QueryParameter<\n    GetGasPriceQueryFnData,\n    GetGasPriceErrorType,\n    selectData,\n    GetGasPriceQueryKey<config, chainId>\n  >\n\nexport function getGasPriceQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetGasPriceData,\n>(\n  config: config,\n  options: GetGasPriceOptions<config, chainId, selectData> = {},\n): GetGasPriceQueryOptions<config, chainId, selectData> {\n  return {\n    ...options.query,\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      const gasPrice = await getGasPrice(config, parameters)\n      return gasPrice ?? null\n    },\n    queryKey: getGasPriceQueryKey(options),\n  }\n}\n\nexport type GetGasPriceQueryFnData = GetGasPriceReturnType\n\nexport type GetGasPriceData = GetGasPriceQueryFnData\n\nexport function getGasPriceQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n>(\n  options: Compute<\n    ExactPartial<GetGasPriceParameters<config, chainId>> & ScopeKeyParameter\n  > = {},\n) {\n  return ['gasPrice', filterQueryOptions(options)] as const\n}\n\nexport type GetGasPriceQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = ReturnType<typeof getGasPriceQueryKey<config, chainId>>\n\nexport type GetGasPriceQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetGasPriceData,\n> = QueryOptions<\n  GetGasPriceQueryFnData,\n  GetGasPriceErrorType,\n  selectData,\n  GetGasPriceQueryKey<config, chainId>\n>\n"
  },
  {
    "path": "packages/core/src/query/getProof.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getProofQueryOptions } from './getProof.js'\n\ntest('default', () => {\n  expect(\n    getProofQueryOptions(config, {\n      address: '0x4200000000000000000000000000000000000016',\n      storageKeys: [\n        '0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99',\n      ],\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"getProof\",\n        {\n          \"address\": \"0x4200000000000000000000000000000000000016\",\n          \"storageKeys\": [\n            \"0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99\",\n          ],\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: blockNumber', () => {\n  expect(\n    getProofQueryOptions(config, {\n      address: '0x4200000000000000000000000000000000000016',\n      blockNumber: 1234567890n,\n      storageKeys: [\n        '0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99',\n      ],\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"getProof\",\n        {\n          \"address\": \"0x4200000000000000000000000000000000000016\",\n          \"blockNumber\": 1234567890n,\n          \"storageKeys\": [\n            \"0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99\",\n          ],\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: blockTag', () => {\n  expect(\n    getProofQueryOptions(config, {\n      address: '0x4200000000000000000000000000000000000016',\n      blockTag: 'safe',\n      storageKeys: [\n        '0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99',\n      ],\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"getProof\",\n        {\n          \"address\": \"0x4200000000000000000000000000000000000016\",\n          \"blockTag\": \"safe\",\n          \"storageKeys\": [\n            \"0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99\",\n          ],\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    getProofQueryOptions(config, {\n      address: '0x4200000000000000000000000000000000000016',\n      chainId: chain.mainnet2.id,\n      storageKeys: [\n        '0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99',\n      ],\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"getProof\",\n        {\n          \"address\": \"0x4200000000000000000000000000000000000016\",\n          \"chainId\": 456,\n          \"storageKeys\": [\n            \"0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99\",\n          ],\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/getProof.ts",
    "content": "import {\n  type GetProofErrorType,\n  type GetProofParameters,\n  type GetProofReturnType,\n  getProof,\n} from '../actions/getProof.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type GetProofOptions<\n  config extends Config,\n  selectData = GetProofData,\n> = Compute<ExactPartial<GetProofParameters<config>> & ScopeKeyParameter> &\n  QueryParameter<\n    GetProofQueryFnData,\n    GetProofErrorType,\n    selectData,\n    GetProofQueryKey<config>\n  >\n\nexport function getProofQueryOptions<\n  config extends Config,\n  selectData = GetProofData,\n>(\n  config: config,\n  options: GetProofOptions<config, selectData> = {},\n): GetProofQueryOptions<config, selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(\n      options.address &&\n        options.storageKeys &&\n        (options.query?.enabled ?? true),\n    ),\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      if (!parameters.address || !parameters.storageKeys)\n        throw new Error('address and storageKeys are required')\n      return getProof(config, {\n        ...(parameters as GetProofParameters),\n        address: parameters.address,\n        storageKeys: parameters.storageKeys,\n      })\n    },\n    queryKey: getProofQueryKey(options),\n  }\n}\n\nexport type GetProofQueryFnData = GetProofReturnType\n\nexport type GetProofData = GetProofQueryFnData\n\nexport function getProofQueryKey<config extends Config>(\n  options: Compute<\n    ExactPartial<GetProofParameters<config>> & ScopeKeyParameter\n  > = {},\n) {\n  return ['getProof', filterQueryOptions(options)] as const\n}\n\nexport type GetProofQueryKey<config extends Config> = ReturnType<\n  typeof getProofQueryKey<config>\n>\n\nexport type GetProofQueryOptions<\n  config extends Config,\n  selectData = GetProofData,\n> = QueryOptions<\n  GetProofQueryFnData,\n  GetProofErrorType,\n  selectData,\n  GetProofQueryKey<config>\n>\n"
  },
  {
    "path": "packages/core/src/query/getStorageAt.test.ts",
    "content": "import { address, chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getStorageAtQueryOptions } from './getStorageAt.js'\n\ntest('default', () => {\n  expect(\n    getStorageAtQueryOptions(config, {\n      address: address.wagmiMintExample,\n      slot: '0x0',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"getStorageAt\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"slot\": \"0x0\",\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: blockNumber', () => {\n  expect(\n    getStorageAtQueryOptions(config, {\n      address: address.wagmiMintExample,\n      blockNumber: 16280770n,\n      slot: '0x0',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"getStorageAt\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"blockNumber\": 16280770n,\n          \"slot\": \"0x0\",\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: blockTag', () => {\n  expect(\n    getStorageAtQueryOptions(config, {\n      address: address.wagmiMintExample,\n      blockTag: 'safe',\n      slot: '0x0',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"getStorageAt\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"blockTag\": \"safe\",\n          \"slot\": \"0x0\",\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    getStorageAtQueryOptions(config, {\n      address: address.wagmiMintExample,\n      chainId: chain.mainnet2.id,\n      slot: '0x0',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"getStorageAt\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"chainId\": 456,\n          \"slot\": \"0x0\",\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/getStorageAt.ts",
    "content": "import {\n  type GetStorageAtErrorType,\n  type GetStorageAtParameters,\n  type GetStorageAtReturnType,\n  getStorageAt,\n} from '../actions/getStorageAt.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type GetStorageAtOptions<\n  config extends Config,\n  selectData = GetStorageAtData,\n> = Compute<ExactPartial<GetStorageAtParameters<config>> & ScopeKeyParameter> &\n  QueryParameter<\n    GetStorageAtQueryFnData,\n    GetStorageAtErrorType,\n    selectData,\n    GetStorageAtQueryKey<config>\n  >\n\nexport function getStorageAtQueryOptions<\n  config extends Config,\n  selectData = GetStorageAtData,\n>(\n  config: config,\n  options: GetStorageAtOptions<config, selectData> = {},\n): GetStorageAtQueryOptions<config, selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(\n      options.address && options.slot && (options.query?.enabled ?? true),\n    ),\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      if (!parameters.address || !parameters.slot)\n        throw new Error('address and slot are required')\n      return getStorageAt(config, {\n        ...(parameters as GetStorageAtParameters),\n        address: parameters.address,\n        slot: parameters.slot,\n      })\n    },\n    queryKey: getStorageAtQueryKey(options),\n  }\n}\n\nexport type GetStorageAtQueryFnData = GetStorageAtReturnType\n\nexport type GetStorageAtData = GetStorageAtQueryFnData\n\nexport function getStorageAtQueryKey<config extends Config>(\n  options: Compute<\n    ExactPartial<GetStorageAtParameters<config>> & ScopeKeyParameter\n  > = {},\n) {\n  return ['getStorageAt', filterQueryOptions(options)] as const\n}\n\nexport type GetStorageAtQueryKey<config extends Config> = ReturnType<\n  typeof getStorageAtQueryKey<config>\n>\n\nexport type GetStorageAtQueryOptions<\n  config extends Config,\n  selectData = GetStorageAtData,\n> = QueryOptions<\n  GetStorageAtQueryFnData,\n  GetStorageAtErrorType,\n  selectData,\n  GetStorageAtQueryKey<config>\n>\n"
  },
  {
    "path": "packages/core/src/query/getTransaction.test-d.ts",
    "content": "import { http } from 'viem'\nimport { celo, mainnet } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { createConfig } from '../createConfig.js'\nimport { getTransactionQueryOptions } from './getTransaction.js'\n\nconst context = {} as any\n\ntest('chain formatters', async () => {\n  const config = createConfig({\n    chains: [celo, mainnet],\n    transports: { [celo.id]: http(), [mainnet.id]: http() },\n  })\n  const options = getTransactionQueryOptions(config, {\n    hash: '0x123',\n  })\n  const result = await options.queryFn(context)\n  if (result.chainId === celo.id) {\n    expectTypeOf(result.feeCurrency).toEqualTypeOf<`0x${string}` | null>()\n  }\n  // @ts-expect-error\n  result.feeCurrency\n})\n\ntest('chainId', async () => {\n  const config = createConfig({\n    chains: [celo, mainnet],\n    transports: { [celo.id]: http(), [mainnet.id]: http() },\n  })\n  const options = getTransactionQueryOptions(config, {\n    hash: '0x123',\n    chainId: celo.id,\n  })\n  const result = await options.queryFn(context)\n  expectTypeOf(result.feeCurrency).toEqualTypeOf<`0x${string}` | null>()\n})\n"
  },
  {
    "path": "packages/core/src/query/getTransaction.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getTransactionQueryOptions } from './getTransaction.js'\n\ntest('default', () => {\n  expect(getTransactionQueryOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"enabled\": false,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"transaction\",\n        {},\n      ],\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    getTransactionQueryOptions(config, { chainId: chain.mainnet.id }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": false,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"transaction\",\n        {\n          \"chainId\": 1,\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/getTransaction.ts",
    "content": "import {\n  type GetTransactionErrorType,\n  type GetTransactionParameters,\n  type GetTransactionReturnType,\n  getTransaction,\n} from '../actions/getTransaction.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type GetTransactionOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetTransactionData<config, chainId>,\n> = Compute<\n  ExactPartial<GetTransactionParameters<config, chainId>> & ScopeKeyParameter\n> &\n  QueryParameter<\n    GetTransactionQueryFnData<config, chainId>,\n    GetTransactionErrorType,\n    selectData,\n    GetTransactionQueryKey<config, chainId>\n  >\n\nexport function getTransactionQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetTransactionData<config, chainId>,\n>(\n  config: config,\n  options: GetTransactionOptions<config, chainId, selectData> = {},\n): GetTransactionQueryOptions<config, chainId, selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(\n      (options.hash ||\n        (options.index &&\n          (options.blockHash || options.blockNumber || options.blockTag))) &&\n        (options.query?.enabled ?? true),\n    ),\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      if (\n        !(\n          parameters.hash ||\n          (parameters.index &&\n            (parameters.blockHash ||\n              parameters.blockNumber ||\n              parameters.blockTag))\n        )\n      )\n        throw new Error(\n          'hash OR index AND blockHash, blockNumber, blockTag is required',\n        )\n      return getTransaction(\n        config,\n        parameters as GetTransactionParameters,\n      ) as unknown as Promise<GetTransactionQueryFnData<config, chainId>>\n    },\n    queryKey: getTransactionQueryKey(options),\n  }\n}\n\nexport type GetTransactionQueryFnData<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = GetTransactionReturnType<config, chainId>\n\nexport type GetTransactionData<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = GetTransactionQueryFnData<config, chainId>\n\nexport function getTransactionQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n>(\n  options: Compute<\n    ExactPartial<GetTransactionParameters<config, chainId>> & ScopeKeyParameter\n  > = {},\n) {\n  return ['transaction', filterQueryOptions(options)] as const\n}\n\nexport type GetTransactionQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = ReturnType<typeof getTransactionQueryKey<config, chainId>>\n\nexport type GetTransactionQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetTransactionData<config, chainId>,\n> = QueryOptions<\n  GetTransactionQueryFnData<config, chainId>,\n  GetTransactionErrorType,\n  selectData,\n  GetTransactionQueryKey<config, chainId>\n>\n"
  },
  {
    "path": "packages/core/src/query/getTransactionConfirmations.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport { http } from 'viem'\nimport { mainnet, zkSync } from 'viem/chains'\nimport { test } from 'vitest'\nimport { createConfig } from '../createConfig.js'\nimport { getTransactionConfirmationsQueryOptions } from './getTransactionConfirmations.js'\n\ntest('default', async () => {\n  getTransactionConfirmationsQueryOptions(config, {\n    transactionReceipt: {\n      blockHash: '0x',\n      blockNumber: 1n,\n      contractAddress: '0x',\n      cumulativeGasUsed: 1n,\n      effectiveGasPrice: 1n,\n      from: '0x',\n      gasUsed: 1n,\n      l1Fee: 1n,\n      logs: [],\n      logsBloom: '0x',\n      status: 'success',\n      to: '0x',\n      transactionHash: '0x',\n      transactionIndex: 1,\n      type: 'eip1559',\n    },\n  })\n})\n\ntest('chain formatters', async () => {\n  const config = createConfig({\n    chains: [mainnet, zkSync],\n    transports: { [mainnet.id]: http(), [zkSync.id]: http() },\n  })\n\n  const transactionReceipt = {\n    blockHash: '0x',\n    blockNumber: 1n,\n    contractAddress: '0x',\n    cumulativeGasUsed: 1n,\n    effectiveGasPrice: 1n,\n    from: '0x',\n    gasUsed: 1n,\n    logsBloom: '0x',\n    status: 'success',\n    to: '0x',\n    transactionHash: '0x',\n    transactionIndex: 1,\n    type: 'eip1559',\n  } as const\n\n  getTransactionConfirmationsQueryOptions(config, {\n    transactionReceipt: {\n      ...transactionReceipt,\n      l1BatchNumber: 1n,\n      l1BatchTxIndex: 1n,\n      logs: [],\n      l2ToL1Logs: [],\n    },\n  })\n\n  getTransactionConfirmationsQueryOptions(config, {\n    chainId: zkSync.id,\n    transactionReceipt: {\n      ...transactionReceipt,\n      l1BatchNumber: 1n,\n      l1BatchTxIndex: 1n,\n      logs: [],\n      l2ToL1Logs: [],\n    },\n  })\n\n  getTransactionConfirmationsQueryOptions(config, {\n    chainId: mainnet.id,\n    transactionReceipt: {\n      ...transactionReceipt,\n      // @ts-expect-error\n      l1BatchNumber: 1n,\n      l1BatchTxIndex: 1n,\n      logs: [],\n      l2ToL1Logs: [],\n    },\n  })\n})\n"
  },
  {
    "path": "packages/core/src/query/getTransactionConfirmations.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getTransactionConfirmationsQueryOptions } from './getTransactionConfirmations.js'\n\ntest('default', () => {\n  expect(\n    getTransactionConfirmationsQueryOptions(config, {\n      hash: '0xa559259bd2d0e8372421e222ff3545f705b5da60005bd787a23c2e68d6d7fefd',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"transactionConfirmations\",\n        {\n          \"hash\": \"0xa559259bd2d0e8372421e222ff3545f705b5da60005bd787a23c2e68d6d7fefd\",\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    getTransactionConfirmationsQueryOptions(config, {\n      chainId: chain.mainnet.id,\n      hash: '0xa559259bd2d0e8372421e222ff3545f705b5da60005bd787a23c2e68d6d7fefd',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"transactionConfirmations\",\n        {\n          \"chainId\": 1,\n          \"hash\": \"0xa559259bd2d0e8372421e222ff3545f705b5da60005bd787a23c2e68d6d7fefd\",\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/getTransactionConfirmations.ts",
    "content": "import {\n  type GetTransactionConfirmationsErrorType,\n  type GetTransactionConfirmationsParameters,\n  type GetTransactionConfirmationsReturnType,\n  getTransactionConfirmations,\n} from '../actions/getTransactionConfirmations.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { UnionExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type GetTransactionConfirmationsOptions<\n  config extends Config,\n  chainId extends\n    | config['chains'][number]['id']\n    | undefined = config['chains'][number]['id'],\n  selectData = GetTransactionConfirmationsData,\n> = UnionExactPartial<GetTransactionConfirmationsParameters<config, chainId>> &\n  ScopeKeyParameter &\n  QueryParameter<\n    GetTransactionConfirmationsQueryFnData,\n    GetTransactionConfirmationsErrorType,\n    selectData,\n    GetTransactionConfirmationsQueryKey<config, chainId>\n  >\n\nexport function getTransactionConfirmationsQueryOptions<\n  config extends Config,\n  chainId extends\n    | config['chains'][number]['id']\n    | undefined = config['chains'][number]['id'],\n  selectData = GetTransactionConfirmationsData,\n>(\n  config: config,\n  options: GetTransactionConfirmationsOptions<\n    config,\n    chainId,\n    selectData\n  > = {} as any,\n): GetTransactionConfirmationsQueryOptions<config, chainId, selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(\n      (options.hash || options.transactionReceipt) &&\n        (options.query?.enabled ?? true),\n    ),\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      if (!parameters.hash && !parameters.transactionReceipt)\n        throw new Error('hash or transactionReceipt is required')\n      const confirmations = await getTransactionConfirmations(config, {\n        ...(parameters as any),\n        hash: parameters.hash,\n        transactionReceipt: parameters.transactionReceipt,\n      })\n      return confirmations ?? null\n    },\n    queryKey: getTransactionConfirmationsQueryKey(options),\n  }\n}\n\nexport type GetTransactionConfirmationsQueryFnData =\n  GetTransactionConfirmationsReturnType\n\nexport type GetTransactionConfirmationsData =\n  GetTransactionConfirmationsQueryFnData\n\nexport function getTransactionConfirmationsQueryKey<\n  config extends Config,\n  chainId extends\n    | config['chains'][number]['id']\n    | undefined = config['chains'][number]['id'],\n>(\n  options: UnionExactPartial<\n    GetTransactionConfirmationsParameters<config, chainId>\n  > &\n    ScopeKeyParameter = {} as any,\n) {\n  return ['transactionConfirmations', filterQueryOptions(options)] as const\n}\n\nexport type GetTransactionConfirmationsQueryKey<\n  config extends Config,\n  chainId extends\n    | config['chains'][number]['id']\n    | undefined = config['chains'][number]['id'],\n> = ReturnType<typeof getTransactionConfirmationsQueryKey<config, chainId>>\n\nexport type GetTransactionConfirmationsQueryOptions<\n  config extends Config,\n  chainId extends\n    | config['chains'][number]['id']\n    | undefined = config['chains'][number]['id'],\n  selectData = GetTransactionConfirmationsData,\n> = QueryOptions<\n  GetTransactionConfirmationsQueryFnData,\n  GetTransactionConfirmationsErrorType,\n  selectData,\n  GetTransactionConfirmationsQueryKey<config, chainId>\n>\n"
  },
  {
    "path": "packages/core/src/query/getTransactionCount.test.ts",
    "content": "import { accounts, chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getTransactionCountQueryOptions } from './getTransactionCount.js'\n\nconst address = accounts[0]\n\ntest('default', () => {\n  expect(\n    getTransactionCountQueryOptions(config, { address }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"transactionCount\",\n        {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    getTransactionCountQueryOptions(config, {\n      address,\n      chainId: chain.mainnet.id,\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"transactionCount\",\n        {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"chainId\": 1,\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: blockNumber', () => {\n  expect(\n    getTransactionCountQueryOptions(config, {\n      address,\n      blockNumber: 13677382n,\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"transactionCount\",\n        {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"blockNumber\": 13677382n,\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: blockTag', () => {\n  expect(\n    getTransactionCountQueryOptions(config, {\n      address,\n      blockTag: 'earliest',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"transactionCount\",\n        {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"blockTag\": \"earliest\",\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/getTransactionCount.ts",
    "content": "import {\n  type GetTransactionCountErrorType,\n  type GetTransactionCountParameters,\n  type GetTransactionCountReturnType,\n  getTransactionCount,\n} from '../actions/getTransactionCount.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type GetTransactionCountOptions<\n  config extends Config,\n  selectData = GetTransactionCountData,\n> = Compute<\n  ExactPartial<GetTransactionCountParameters<config>> & ScopeKeyParameter\n> &\n  QueryParameter<\n    GetTransactionCountQueryFnData,\n    GetTransactionCountErrorType,\n    selectData,\n    GetTransactionCountQueryKey<config>\n  >\n\nexport function getTransactionCountQueryOptions<\n  config extends Config,\n  selectData = GetTransactionCountData,\n>(\n  config: config,\n  options: GetTransactionCountOptions<config, selectData> = {},\n): GetTransactionCountQueryOptions<config, selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(options.address && (options.query?.enabled ?? true)),\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      if (!parameters.address) throw new Error('address is required')\n      const transactionCount = await getTransactionCount(config, {\n        ...(parameters as any),\n        address: parameters.address,\n      })\n      return transactionCount ?? null\n    },\n    queryKey: getTransactionCountQueryKey(options),\n  }\n}\n\nexport type GetTransactionCountQueryFnData =\n  Compute<GetTransactionCountReturnType>\n\nexport type GetTransactionCountData = GetTransactionCountQueryFnData\n\nexport function getTransactionCountQueryKey<config extends Config>(\n  options: Compute<\n    ExactPartial<GetTransactionCountParameters<config>> & ScopeKeyParameter\n  > = {},\n) {\n  return ['transactionCount', filterQueryOptions(options)] as const\n}\n\nexport type GetTransactionCountQueryKey<config extends Config> = ReturnType<\n  typeof getTransactionCountQueryKey<config>\n>\n\nexport type GetTransactionCountQueryOptions<\n  config extends Config,\n  selectData = GetTransactionCountData,\n> = QueryOptions<\n  GetTransactionCountQueryFnData,\n  GetTransactionCountErrorType,\n  selectData,\n  GetTransactionCountQueryKey<config>\n>\n"
  },
  {
    "path": "packages/core/src/query/getTransactionReceipt.test-d.ts",
    "content": "import { http } from 'viem'\nimport { mainnet, zkSync } from 'viem/chains'\nimport type { ZkSyncL2ToL1Log, ZkSyncLog } from 'viem/zksync'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { createConfig } from '../createConfig.js'\nimport { getTransactionReceiptQueryOptions } from './getTransactionReceipt.js'\n\nconst context = {} as any\n\ntest('chain formatters', async () => {\n  const config = createConfig({\n    chains: [mainnet, zkSync],\n    transports: { [mainnet.id]: http(), [zkSync.id]: http() },\n  })\n  const options = getTransactionReceiptQueryOptions(config, { hash: '0x123' })\n  const result = await options.queryFn(context)\n  if (result.chainId === zkSync.id) {\n    expectTypeOf(result.l1BatchNumber).toEqualTypeOf<bigint | null>()\n    expectTypeOf(result.l1BatchTxIndex).toEqualTypeOf<bigint | null>()\n    expectTypeOf(result.logs).toEqualTypeOf<ZkSyncLog[]>()\n    expectTypeOf(result.l2ToL1Logs).toEqualTypeOf<ZkSyncL2ToL1Log[]>()\n  }\n  // @ts-expect-error\n  result.l1BatchNumber\n})\n\ntest('chainId', async () => {\n  const config = createConfig({\n    chains: [zkSync],\n    transports: { [zkSync.id]: http() },\n  })\n  const options = getTransactionReceiptQueryOptions(config, {\n    hash: '0x123',\n    chainId: zkSync.id,\n  })\n  const result = await options.queryFn(context)\n  expectTypeOf(result.l1BatchNumber).toEqualTypeOf<bigint | null>()\n  expectTypeOf(result.l1BatchTxIndex).toEqualTypeOf<bigint | null>()\n  expectTypeOf(result.logs).toEqualTypeOf<ZkSyncLog[]>()\n  expectTypeOf(result.l2ToL1Logs).toEqualTypeOf<ZkSyncL2ToL1Log[]>()\n})\n"
  },
  {
    "path": "packages/core/src/query/getTransactionReceipt.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getTransactionReceiptQueryOptions } from './getTransactionReceipt.js'\n\ntest('default', () => {\n  expect(\n    getTransactionReceiptQueryOptions(config, {\n      hash: '0xbf7d27700d053765c9638d3b9d39eb3c56bfc48377583e8be483d61f9f18a871',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"getTransactionReceipt\",\n        {\n          \"hash\": \"0xbf7d27700d053765c9638d3b9d39eb3c56bfc48377583e8be483d61f9f18a871\",\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    getTransactionReceiptQueryOptions(config, {\n      chainId: chain.mainnet2.id,\n      hash: '0xbf7d27700d053765c9638d3b9d39eb3c56bfc48377583e8be483d61f9f18a871',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"getTransactionReceipt\",\n        {\n          \"chainId\": 456,\n          \"hash\": \"0xbf7d27700d053765c9638d3b9d39eb3c56bfc48377583e8be483d61f9f18a871\",\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/getTransactionReceipt.ts",
    "content": "import type { GetTransactionReceiptReturnType } from '../actions/getTransactionReceipt.js'\nimport {\n  type GetTransactionReceiptErrorType,\n  type GetTransactionReceiptParameters,\n  getTransactionReceipt,\n} from '../actions/getTransactionReceipt.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type GetTransactionReceiptOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetTransactionReceiptData<config, chainId>,\n> = Compute<\n  ExactPartial<GetTransactionReceiptParameters<config, chainId>> &\n    ScopeKeyParameter\n> &\n  QueryParameter<\n    GetTransactionReceiptQueryFnData<config, chainId>,\n    GetTransactionReceiptErrorType,\n    selectData,\n    GetTransactionReceiptQueryKey<config, chainId>\n  >\n\nexport function getTransactionReceiptQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetTransactionReceiptData<config, chainId>,\n>(\n  config: config,\n  options: GetTransactionReceiptOptions<config, chainId, selectData> = {},\n): GetTransactionReceiptQueryOptions<config, chainId, selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(options.hash && (options.query?.enabled ?? true)),\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      if (!parameters.hash) throw new Error('hash is required')\n      return getTransactionReceipt(config, {\n        ...(parameters as any),\n        hash: parameters.hash,\n      })\n    },\n    queryKey: getTransactionReceiptQueryKey(options),\n  }\n}\n\nexport type GetTransactionReceiptQueryFnData<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = GetTransactionReceiptReturnType<config, chainId>\n\nexport type GetTransactionReceiptData<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = GetTransactionReceiptQueryFnData<config, chainId>\n\nexport function getTransactionReceiptQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n>(\n  options: Compute<\n    ExactPartial<GetTransactionReceiptParameters<config, chainId>> &\n      ScopeKeyParameter\n  > = {},\n) {\n  return ['getTransactionReceipt', filterQueryOptions(options)] as const\n}\n\nexport type GetTransactionReceiptQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = ReturnType<typeof getTransactionReceiptQueryKey<config, chainId>>\n\nexport type GetTransactionReceiptQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetTransactionReceiptData<config, chainId>,\n> = QueryOptions<\n  GetTransactionReceiptQueryFnData<config, chainId>,\n  GetTransactionReceiptErrorType,\n  selectData,\n  GetTransactionReceiptQueryKey<config, chainId>\n>\n"
  },
  {
    "path": "packages/core/src/query/getWalletClient.test-d.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { getWalletClientQueryOptions } from './getWalletClient.js'\n\nconst context = {} as any\n\ntest('default', async () => {\n  const options = getWalletClientQueryOptions(config)\n  const client = await options.queryFn(context)\n  expectTypeOf(client.chain).toEqualTypeOf<(typeof config)['chains'][number]>()\n  expectTypeOf(client.transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('parameters: chainId', async () => {\n  const options = getWalletClientQueryOptions(config, {\n    chainId: chain.mainnet.id,\n  })\n  const client = await options.queryFn(context)\n  expectTypeOf(client.chain).toEqualTypeOf<typeof chain.mainnet>()\n  expectTypeOf(client.chain).not.toEqualTypeOf<typeof chain.mainnet2>()\n  expectTypeOf(client.transport.type).toEqualTypeOf<'http'>()\n})\n"
  },
  {
    "path": "packages/core/src/query/getWalletClient.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { getWalletClientQueryOptions } from './getWalletClient.js'\n\ntest('default', () => {\n  expect(getWalletClientQueryOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"enabled\": false,\n      \"gcTime\": 0,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"walletClient\",\n        {},\n      ],\n      \"staleTime\": Infinity,\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    getWalletClientQueryOptions(config, { chainId: chain.mainnet.id }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": false,\n      \"gcTime\": 0,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"walletClient\",\n        {\n          \"chainId\": 1,\n        },\n      ],\n      \"staleTime\": Infinity,\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/getWalletClient.ts",
    "content": "import {\n  type GetWalletClientErrorType,\n  type GetWalletClientParameters,\n  type GetWalletClientReturnType,\n  getWalletClient,\n} from '../actions/getWalletClient.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type GetWalletClientOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetWalletClientData<config, chainId>,\n> = Compute<\n  ExactPartial<GetWalletClientParameters<config, chainId>> & ScopeKeyParameter\n> &\n  QueryParameter<\n    GetWalletClientQueryFnData<config, chainId>,\n    GetWalletClientErrorType,\n    selectData,\n    GetWalletClientQueryKey<config, chainId>\n  >\n\nexport function getWalletClientQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetWalletClientData<config, chainId>,\n>(\n  config: config,\n  options: GetWalletClientOptions<config, chainId, selectData> = {},\n): GetWalletClientQueryOptions<config, chainId, selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(\n      options.connector?.getProvider && (options.query?.enabled ?? true),\n    ),\n    gcTime: 0,\n    queryFn: async (context) => {\n      if (!options.connector?.getProvider)\n        throw new Error('connector is required')\n      const [, { connectorUid: _, scopeKey: __, ...parameters }] =\n        context.queryKey\n      return getWalletClient(config, {\n        ...parameters,\n        connector: options.connector,\n      }) as never\n    },\n    queryKey: getWalletClientQueryKey(options),\n    staleTime: Number.POSITIVE_INFINITY,\n  }\n}\n\nexport type GetWalletClientQueryFnData<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = GetWalletClientReturnType<config, chainId>\n\nexport type GetWalletClientData<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = GetWalletClientQueryFnData<config, chainId>\n\nexport function getWalletClientQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n>(\n  options: Compute<\n    ExactPartial<GetWalletClientParameters<config, chainId>> & ScopeKeyParameter\n  > = {},\n) {\n  return ['walletClient', filterQueryOptions(options)] as const\n}\n\nexport type GetWalletClientQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = ReturnType<typeof getWalletClientQueryKey<config, chainId>>\n\nexport type GetWalletClientQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = GetWalletClientData<config, chainId>,\n> = QueryOptions<\n  GetWalletClientQueryFnData<config, chainId>,\n  GetWalletClientErrorType,\n  selectData,\n  GetWalletClientQueryKey<config, chainId>\n>\n"
  },
  {
    "path": "packages/core/src/query/infiniteReadContracts.test-d.ts",
    "content": "import { abi, config } from '@wagmi/test'\nimport type { MulticallResponse } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { infiniteReadContractsQueryOptions } from './infiniteReadContracts.js'\n\ntest('default', async () => {\n  const options = infiniteReadContractsQueryOptions(config, {\n    cacheKey: 'foo',\n    contracts(pageParam) {\n      expectTypeOf(pageParam).toEqualTypeOf(options.initialPageParam)\n      return [\n        {\n          address: '0x',\n          abi: abi.erc20,\n          functionName: 'balanceOf',\n          args: ['0x'],\n        },\n        {\n          address: '0x',\n          abi: abi.wagmiMintExample,\n          functionName: 'tokenURI',\n          args: [123n],\n        },\n      ]\n    },\n    query: {\n      initialPageParam: 0,\n      getNextPageParam(lastPage, allPages, lastPageParam, allPageParams) {\n        expectTypeOf(lastPage).toEqualTypeOf<\n          [MulticallResponse<bigint>, MulticallResponse<string>]\n        >()\n        expectTypeOf(allPages).toEqualTypeOf<\n          [MulticallResponse<bigint>, MulticallResponse<string>][]\n        >()\n        expectTypeOf(lastPageParam).toEqualTypeOf(options.initialPageParam)\n        expectTypeOf(allPageParams).toEqualTypeOf([options.initialPageParam])\n        return lastPageParam + 1\n      },\n    },\n  })\n  const result = await options.queryFn({} as any)\n  expectTypeOf(result).toEqualTypeOf<\n    [MulticallResponse<bigint>, MulticallResponse<string>]\n  >()\n})\n\ntest('allowFailure: false', async () => {\n  const options = infiniteReadContractsQueryOptions(config, {\n    allowFailure: false,\n    cacheKey: 'foo',\n    contracts(pageParam) {\n      expectTypeOf(pageParam).toEqualTypeOf(options.initialPageParam)\n      return [\n        {\n          address: '0x',\n          abi: abi.erc20,\n          functionName: 'balanceOf',\n          args: ['0x'],\n        },\n        {\n          address: '0x',\n          abi: abi.wagmiMintExample,\n          functionName: 'tokenURI',\n          args: [123n],\n        },\n      ]\n    },\n    query: {\n      initialPageParam: 0,\n      getNextPageParam(lastPage, allPages, lastPageParam, allPageParams) {\n        expectTypeOf(lastPage).toEqualTypeOf<[bigint, string]>()\n        expectTypeOf(allPages).toEqualTypeOf<[bigint, string][]>()\n        expectTypeOf(lastPageParam).toEqualTypeOf(options.initialPageParam)\n        expectTypeOf(allPageParams).toEqualTypeOf([options.initialPageParam])\n        return lastPageParam + 1\n      },\n    },\n  })\n  const result = await options.queryFn({} as any)\n  expectTypeOf(result).toEqualTypeOf<[bigint, string]>()\n})\n\ntest('initialPageParam', async () => {\n  const options = infiniteReadContractsQueryOptions(config, {\n    allowFailure: false,\n    cacheKey: 'foo',\n    contracts(pageParam) {\n      expectTypeOf(pageParam).toEqualTypeOf(options.initialPageParam)\n      return [\n        {\n          address: '0x',\n          abi: abi.erc20,\n          functionName: 'balanceOf',\n          args: ['0x'],\n        },\n        {\n          address: '0x',\n          abi: abi.wagmiMintExample,\n          functionName: 'tokenURI',\n          args: [123n],\n        },\n      ]\n    },\n    query: {\n      initialPageParam: 'bar',\n      getNextPageParam(lastPage, allPages, lastPageParam, allPageParams) {\n        expectTypeOf(lastPage).toEqualTypeOf<[bigint, string]>()\n        expectTypeOf(allPages).toEqualTypeOf<[bigint, string][]>()\n        expectTypeOf(lastPageParam).toEqualTypeOf(options.initialPageParam)\n        expectTypeOf(allPageParams).toEqualTypeOf([options.initialPageParam])\n        return lastPageParam + 1\n      },\n    },\n  })\n  const result = await options.queryFn({} as any)\n  expectTypeOf(result).toEqualTypeOf<[bigint, string]>()\n})\n\ntest('behavior: `contracts` after `getNextPageParam`', async () => {\n  const options = infiniteReadContractsQueryOptions(config, {\n    allowFailure: false,\n    cacheKey: 'foo',\n    query: {\n      initialPageParam: 0,\n      getNextPageParam(lastPage, allPages, lastPageParam, allPageParams) {\n        expectTypeOf(lastPage).toEqualTypeOf<unknown[]>()\n        expectTypeOf(allPages).toEqualTypeOf<unknown[][]>()\n        expectTypeOf(lastPageParam).toEqualTypeOf(options.initialPageParam)\n        expectTypeOf(allPageParams).toEqualTypeOf([options.initialPageParam])\n        return lastPageParam + 1\n      },\n    },\n    contracts(pageParam) {\n      expectTypeOf(pageParam).toEqualTypeOf(options.initialPageParam)\n      return [\n        {\n          address: '0x',\n          abi: abi.erc20,\n          functionName: 'balanceOf',\n          args: ['0x'],\n        },\n        {\n          address: '0x',\n          abi: abi.wagmiMintExample,\n          functionName: 'tokenURI',\n          args: [123n],\n        },\n      ]\n    },\n  })\n  const result = await options.queryFn({} as any)\n  expectTypeOf(result).toEqualTypeOf<unknown[]>()\n})\n\ntest('overloads', async () => {\n  const options = infiniteReadContractsQueryOptions(config, {\n    allowFailure: false,\n    cacheKey: 'foo',\n    contracts(pageParam) {\n      expectTypeOf(pageParam).toEqualTypeOf<number>()\n      return [\n        {\n          address: '0x',\n          abi: abi.viewOverloads,\n          functionName: 'foo',\n        },\n        {\n          address: '0x',\n          abi: abi.viewOverloads,\n          functionName: 'foo',\n          args: ['0x'],\n        },\n        {\n          address: '0x',\n          abi: abi.viewOverloads,\n          functionName: 'foo',\n          args: ['0x', '0x'],\n        },\n      ]\n    },\n    query: {\n      initialPageParam: 0,\n      getNextPageParam(_, allPages) {\n        return allPages.length + 1\n      },\n    },\n  })\n\n  const result = await options.queryFn({} as any)\n  expectTypeOf(result).toEqualTypeOf<\n    [\n      number,\n      string,\n      {\n        foo: `0x${string}`\n        bar: `0x${string}`\n      },\n    ]\n  >()\n})\n"
  },
  {
    "path": "packages/core/src/query/infiniteReadContracts.test.ts",
    "content": "import { abi, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { infiniteReadContractsQueryOptions } from './infiniteReadContracts.js'\n\ntest('default', () => {\n  expect(\n    infiniteReadContractsQueryOptions(config, {\n      allowFailure: true,\n      batchSize: 1024,\n      blockNumber: 123n,\n      blockTag: 'latest',\n      cacheKey: 'foo',\n      chainId: 1,\n      multicallAddress: '0x',\n      scopeKey: 'bar',\n      contracts(_pageParam) {\n        return [\n          {\n            address: '0x',\n            abi: abi.erc20,\n            functionName: 'balanceOf',\n            args: ['0x'],\n          },\n          {\n            address: '0x',\n            abi: abi.wagmiMintExample,\n            functionName: 'tokenURI',\n            args: [123n],\n          },\n        ]\n      },\n      query: {\n        initialPageParam: 0,\n        getNextPageParam(_lastPage, _allPages, lastPageParam, _allPageParams) {\n          return lastPageParam + 1\n        },\n      },\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"getNextPageParam\": [Function],\n      \"initialPageParam\": 0,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"infiniteReadContracts\",\n        {\n          \"allowFailure\": true,\n          \"batchSize\": 1024,\n          \"blockNumber\": 123n,\n          \"blockTag\": \"latest\",\n          \"cacheKey\": \"foo\",\n          \"chainId\": 1,\n          \"multicallAddress\": \"0x\",\n          \"scopeKey\": \"bar\",\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/infiniteReadContracts.ts",
    "content": "import type { ContractFunctionParameters } from 'viem'\nimport {\n  type ReadContractsErrorType,\n  type ReadContractsParameters,\n  type ReadContractsReturnType,\n  readContracts,\n} from '../actions/readContracts.js'\nimport type { Config } from '../createConfig.js'\nimport type {\n  ChainIdParameter,\n  ScopeKeyParameter,\n} from '../types/properties.js'\nimport type { StrictOmit } from '../types/utils.js'\nimport type { InfiniteQueryOptions } from './types.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type InfiniteReadContractsOptions<\n  contracts extends readonly unknown[],\n  allowFailure extends boolean,\n  pageParam,\n  config extends Config,\n> = {\n  cacheKey: string\n  contracts(\n    pageParam: pageParam,\n  ): ReadContractsParameters<contracts, allowFailure, config>['contracts']\n} & StrictOmit<\n  ReadContractsParameters<contracts, allowFailure, config>,\n  'contracts'\n> &\n  ScopeKeyParameter\n\nexport function infiniteReadContractsQueryOptions<\n  config extends Config,\n  const contracts extends readonly ContractFunctionParameters[],\n  allowFailure extends boolean = true,\n  pageParam = unknown,\n>(\n  config: config,\n  options: InfiniteReadContractsOptions<\n    contracts,\n    allowFailure,\n    pageParam,\n    config\n  > &\n    ChainIdParameter<config> &\n    RequiredPageParamsParameters<contracts, allowFailure, pageParam>,\n) {\n  return {\n    ...options.query,\n    async queryFn({ pageParam, queryKey }) {\n      const { contracts } = options\n      const { cacheKey: _, scopeKey: _s, ...parameters } = queryKey[1]\n      return (await readContracts(config, {\n        ...parameters,\n        contracts: contracts(pageParam as any),\n      })) as ReadContractsReturnType<contracts, allowFailure>\n    },\n    queryKey: infiniteReadContractsQueryKey(options),\n  } as const satisfies InfiniteQueryOptions<\n    InfiniteReadContractsQueryFnData<contracts, allowFailure>,\n    ReadContractsErrorType,\n    InfiniteReadContractsData<contracts, allowFailure>,\n    InfiniteReadContractsData<contracts, allowFailure>,\n    InfiniteReadContractsQueryKey<contracts, allowFailure, pageParam, config>,\n    pageParam\n  >\n}\n\ntype RequiredPageParamsParameters<\n  contracts extends readonly unknown[],\n  allowFailure extends boolean,\n  pageParam,\n> = {\n  query: {\n    initialPageParam: pageParam\n    getNextPageParam(\n      lastPage: InfiniteReadContractsQueryFnData<contracts, allowFailure>,\n      allPages: InfiniteReadContractsQueryFnData<contracts, allowFailure>[],\n      lastPageParam: pageParam,\n      allPageParams: pageParam[],\n    ): pageParam | undefined | null\n  }\n}\n\nexport type InfiniteReadContractsQueryFnData<\n  contracts extends readonly unknown[],\n  allowFailure extends boolean,\n> = ReadContractsReturnType<contracts, allowFailure>\n\nexport type InfiniteReadContractsData<\n  contracts extends readonly unknown[],\n  allowFailure extends boolean,\n> = InfiniteReadContractsQueryFnData<contracts, allowFailure>\n\nexport function infiniteReadContractsQueryKey<\n  config extends Config,\n  const contracts extends readonly unknown[],\n  allowFailure extends boolean,\n  pageParam,\n>(\n  options: InfiniteReadContractsOptions<\n    contracts,\n    allowFailure,\n    pageParam,\n    config\n  > &\n    ChainIdParameter<config> &\n    RequiredPageParamsParameters<contracts, allowFailure, pageParam>,\n) {\n  const { contracts: _, ...parameters } = options\n  return ['infiniteReadContracts', filterQueryOptions(parameters)] as const\n}\n\nexport type InfiniteReadContractsQueryKey<\n  contracts extends readonly unknown[],\n  allowFailure extends boolean,\n  pageParam,\n  config extends Config,\n> = ReturnType<\n  typeof infiniteReadContractsQueryKey<\n    config,\n    contracts,\n    allowFailure,\n    pageParam\n  >\n>\n"
  },
  {
    "path": "packages/core/src/query/prepareTransactionRequest.test-d.ts",
    "content": "import { accounts, config } from '@wagmi/test'\nimport { http, parseEther } from 'viem'\nimport { celo, mainnet } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { createConfig } from '../createConfig.js'\nimport { prepareTransactionRequestQueryOptions } from './prepareTransactionRequest.js'\n\nconst context = {} as any\nconst targetAccount = accounts[1]\n\ntest('default', async () => {\n  const options = prepareTransactionRequestQueryOptions(config, {\n    chainId: 1,\n    to: '0x',\n    value: parseEther('1'),\n  })\n  const response = await options.queryFn(context)\n  const { nonce: _nonce, ...request } = response\n  request.to\n  request.chainId\n\n  expectTypeOf(response.chainId).toEqualTypeOf<1>()\n})\n\ntest('chain formatters', async () => {\n  const config = createConfig({\n    chains: [celo, mainnet],\n    transports: { [celo.id]: http(), [mainnet.id]: http() },\n  })\n\n  {\n    const options = prepareTransactionRequestQueryOptions(config, {\n      to: targetAccount,\n      value: parseEther('0.01'),\n      feeCurrency: '0x',\n    })\n    const request = await options.queryFn(context)\n    if (request.chainId === celo.id) {\n      expectTypeOf(request.chainId).toEqualTypeOf(celo.id)\n      expectTypeOf(request.feeCurrency).toEqualTypeOf<\n        `0x${string}` | undefined\n      >()\n    }\n  }\n\n  {\n    const options = prepareTransactionRequestQueryOptions(config, {\n      chainId: celo.id,\n      to: targetAccount,\n      value: parseEther('0.01'),\n      feeCurrency: '0x',\n    })\n    const request = await options.queryFn(context)\n    expectTypeOf(request.chainId).toEqualTypeOf(celo.id)\n    expectTypeOf(request.feeCurrency).toEqualTypeOf<`0x${string}` | undefined>()\n  }\n\n  {\n    const options = prepareTransactionRequestQueryOptions(config, {\n      chainId: mainnet.id,\n      to: targetAccount,\n      value: parseEther('0.01'),\n      // @ts-expect-error\n      feeCurrency: '0x',\n    })\n    const request = await options.queryFn(context)\n    expectTypeOf(request.chainId).toEqualTypeOf(mainnet.id)\n  }\n})\n"
  },
  {
    "path": "packages/core/src/query/prepareTransactionRequest.test.ts",
    "content": "import { accounts, chain, config } from '@wagmi/test'\nimport { parseEther, parseGwei } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { expect, test } from 'vitest'\n\nimport { prepareTransactionRequestQueryOptions } from './prepareTransactionRequest.js'\n\nconst targetAccount = accounts[0]\n\ntest('default', () => {\n  expect(\n    prepareTransactionRequestQueryOptions(config, {\n      to: targetAccount,\n      value: parseEther('1'),\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"prepareTransactionRequest\",\n        {\n          \"to\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"value\": 1000000000000000000n,\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: account', () => {\n  expect(\n    prepareTransactionRequestQueryOptions(config, {\n      account: privateKeyToAccount(\n        '0x0123456789012345678901234567890123456789012345678901234567890123',\n      ),\n      to: targetAccount,\n      value: parseEther('1'),\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"prepareTransactionRequest\",\n        {\n          \"account\": {\n            \"address\": \"0x14791697260E4c9A71f18484C9f997B308e59325\",\n            \"nonceManager\": undefined,\n            \"publicKey\": \"0x046655feed4d214c261e0a6b554395596f1f1476a77d999560e5a8df9b8a1a3515217e88dd05e938efdd71b2cce322bf01da96cd42087b236e8f5043157a9c068e\",\n            \"sign\": [Function],\n            \"signAuthorization\": [Function],\n            \"signMessage\": [Function],\n            \"signTransaction\": [Function],\n            \"signTypedData\": [Function],\n            \"source\": \"privateKey\",\n            \"type\": \"local\",\n          },\n          \"to\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"value\": 1000000000000000000n,\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: data', () => {\n  expect(\n    prepareTransactionRequestQueryOptions(config, {\n      data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n      to: targetAccount,\n      value: parseEther('1'),\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"prepareTransactionRequest\",\n        {\n          \"data\": \"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2\",\n          \"to\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"value\": 1000000000000000000n,\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    prepareTransactionRequestQueryOptions(config, {\n      chainId: chain.mainnet2.id,\n      to: targetAccount,\n      value: parseEther('1'),\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"prepareTransactionRequest\",\n        {\n          \"chainId\": 456,\n          \"to\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"value\": 1000000000000000000n,\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: nonce', () => {\n  expect(\n    prepareTransactionRequestQueryOptions(config, {\n      nonce: 5,\n      to: targetAccount,\n      value: parseEther('1'),\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"prepareTransactionRequest\",\n        {\n          \"nonce\": 5,\n          \"to\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"value\": 1000000000000000000n,\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: gasPrice', () => {\n  expect(\n    prepareTransactionRequestQueryOptions(config, {\n      gasPrice: parseGwei('10'),\n      to: targetAccount,\n      value: parseEther('1'),\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"prepareTransactionRequest\",\n        {\n          \"gasPrice\": 10000000000n,\n          \"to\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"value\": 1000000000000000000n,\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: maxFeePerGas', () => {\n  expect(\n    prepareTransactionRequestQueryOptions(config, {\n      maxFeePerGas: parseGwei('100'),\n      to: targetAccount,\n      value: parseEther('1'),\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"prepareTransactionRequest\",\n        {\n          \"maxFeePerGas\": 100000000000n,\n          \"to\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"value\": 1000000000000000000n,\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: maxPriorityFeePerGas', () => {\n  expect(\n    prepareTransactionRequestQueryOptions(config, {\n      maxPriorityFeePerGas: parseGwei('5'),\n      to: targetAccount,\n      value: parseEther('1'),\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"prepareTransactionRequest\",\n        {\n          \"maxPriorityFeePerGas\": 5000000000n,\n          \"to\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"value\": 1000000000000000000n,\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: type', () => {\n  expect(\n    prepareTransactionRequestQueryOptions(config, {\n      type: 'eip1559',\n      to: targetAccount,\n      value: parseEther('1'),\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"prepareTransactionRequest\",\n        {\n          \"to\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"type\": \"eip1559\",\n          \"value\": 1000000000000000000n,\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: parameters', () => {\n  expect(\n    prepareTransactionRequestQueryOptions(config, {\n      parameters: ['gas'],\n      to: targetAccount,\n      value: parseEther('1'),\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"prepareTransactionRequest\",\n        {\n          \"parameters\": [\n            \"gas\",\n          ],\n          \"to\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"value\": 1000000000000000000n,\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/prepareTransactionRequest.ts",
    "content": "import type { PrepareTransactionRequestRequest as viem_PrepareTransactionRequestRequest } from 'viem'\n\nimport {\n  type PrepareTransactionRequestErrorType,\n  type PrepareTransactionRequestParameters,\n  type PrepareTransactionRequestReturnType,\n  prepareTransactionRequest,\n} from '../actions/prepareTransactionRequest.js'\nimport type { Config } from '../createConfig.js'\nimport type { SelectChains } from '../types/chain.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { UnionExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type PrepareTransactionRequestOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined,\n  request extends viem_PrepareTransactionRequestRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  >,\n  selectData = PrepareTransactionRequestData<config, chainId, request>,\n> = UnionExactPartial<\n  PrepareTransactionRequestParameters<config, chainId, request>\n> &\n  ScopeKeyParameter &\n  QueryParameter<\n    PrepareTransactionRequestQueryFnData<config, chainId, request>,\n    PrepareTransactionRequestErrorType,\n    selectData,\n    PrepareTransactionRequestQueryKey<config, chainId, request>\n  >\n\nexport function prepareTransactionRequestQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined,\n  request extends viem_PrepareTransactionRequestRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  >,\n  selectData = PrepareTransactionRequestData<config, chainId, request>,\n>(\n  config: config,\n  options: PrepareTransactionRequestOptions<\n    config,\n    chainId,\n    request,\n    selectData\n  > = {} as any,\n): PrepareTransactionRequestQueryOptions<config, chainId, request, selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(options.to && (options.query?.enabled ?? true)),\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      if (!parameters.to) throw new Error('to is required')\n      return prepareTransactionRequest(config, {\n        ...(parameters as any),\n        to: parameters.to,\n      }) as unknown as Promise<\n        PrepareTransactionRequestQueryFnData<config, chainId, request>\n      >\n    },\n    queryKey: prepareTransactionRequestQueryKey(\n      options,\n    ) as PrepareTransactionRequestQueryKey<config, chainId, request>,\n  }\n}\n\nexport type PrepareTransactionRequestQueryFnData<\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined,\n  request extends viem_PrepareTransactionRequestRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  >,\n> = PrepareTransactionRequestReturnType<config, chainId, request>\n\nexport type PrepareTransactionRequestData<\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined,\n  request extends viem_PrepareTransactionRequestRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  >,\n> = PrepareTransactionRequestQueryFnData<config, chainId, request>\n\nexport function prepareTransactionRequestQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined,\n  request extends viem_PrepareTransactionRequestRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  >,\n>(\n  options: UnionExactPartial<\n    PrepareTransactionRequestParameters<config, chainId, request>\n  > &\n    ScopeKeyParameter = {} as any,\n) {\n  return ['prepareTransactionRequest', filterQueryOptions(options)] as const\n}\n\nexport type PrepareTransactionRequestQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined,\n  request extends viem_PrepareTransactionRequestRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  >,\n> = ReturnType<\n  typeof prepareTransactionRequestQueryKey<config, chainId, request>\n>\n\nexport type PrepareTransactionRequestQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined,\n  request extends viem_PrepareTransactionRequestRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  >,\n  selectData = PrepareTransactionRequestData<config, chainId, request>,\n> = QueryOptions<\n  PrepareTransactionRequestQueryFnData<config, chainId, request>,\n  PrepareTransactionRequestErrorType,\n  selectData,\n  PrepareTransactionRequestQueryKey<config, chainId, request>\n>\n"
  },
  {
    "path": "packages/core/src/query/readContract.test-d.ts",
    "content": "import { abi, config } from '@wagmi/test'\nimport { assertType, expectTypeOf, test } from 'vitest'\n\nimport { readContractQueryOptions } from './readContract.js'\n\nconst context = {} as any\n\ntest('default', async () => {\n  const options = readContractQueryOptions(config, {\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'balanceOf',\n    args: ['0x'],\n  })\n  const result = await options.queryFn(context)\n  expectTypeOf(result).toEqualTypeOf<bigint>()\n\n  readContractQueryOptions(config, {\n    address: '0x',\n    abi: abi.erc20,\n    // @ts-expect-error\n    functionName: 'foo',\n    args: ['0x'],\n  })\n})\n\ntest('overloads', async () => {\n  {\n    const options = readContractQueryOptions(config, {\n      address: '0x',\n      abi: abi.viewOverloads,\n      functionName: 'foo',\n    })\n    const result = await options.queryFn(context)\n    assertType<number>(result)\n  }\n  {\n    const options = readContractQueryOptions(config, {\n      address: '0x',\n      abi: abi.viewOverloads,\n      functionName: 'foo',\n      args: [],\n    })\n    const result = await options.queryFn(context)\n    assertType<number>(result)\n  }\n  {\n    const options = readContractQueryOptions(config, {\n      address: '0x',\n      abi: abi.viewOverloads,\n      functionName: 'foo',\n      args: ['0x'],\n    })\n    const result = await options.queryFn(context)\n    assertType<string>(result)\n  }\n  {\n    const options = readContractQueryOptions(config, {\n      address: '0x',\n      abi: abi.viewOverloads,\n      functionName: 'foo',\n      args: ['0x', '0x'],\n    })\n    const result = await options.queryFn(context)\n    assertType<{\n      foo: `0x${string}`\n      bar: `0x${string}`\n    }>(result)\n  }\n})\n\ntest('deployless read (bytecode)', async () => {\n  const options = readContractQueryOptions(config, {\n    code: '0x',\n    abi: abi.erc20,\n    functionName: 'balanceOf',\n    args: ['0x'],\n  })\n  const result = await options.queryFn(context)\n  expectTypeOf(result).toEqualTypeOf<bigint>()\n})\n\ntest('deployless read (factory)', async () => {\n  const options = readContractQueryOptions(config, {\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'balanceOf',\n    args: ['0x'],\n    factory: '0x',\n    factoryData: '0x',\n  })\n  const result = await options.queryFn(context)\n  expectTypeOf(result).toEqualTypeOf<bigint>()\n})\n"
  },
  {
    "path": "packages/core/src/query/readContract.test.ts",
    "content": "import { abi, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { readContractQueryOptions } from './readContract.js'\n\ntest('default', () => {\n  expect(\n    readContractQueryOptions(config, {\n      address: '0x',\n      abi: abi.erc20,\n      functionName: 'balanceOf',\n      args: ['0x'],\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"readContract\",\n        {\n          \"address\": \"0x\",\n          \"args\": [\n            \"0x\",\n          ],\n          \"functionName\": \"balanceOf\",\n        },\n      ],\n      \"structuralSharing\": [Function],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/readContract.ts",
    "content": "import type { Abi, ContractFunctionArgs, ContractFunctionName } from 'viem'\nimport {\n  type ReadContractErrorType,\n  type ReadContractParameters,\n  type ReadContractReturnType,\n  readContract,\n} from '../actions/readContract.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { UnionExactPartial } from '../types/utils.js'\nimport { filterQueryOptions, structuralSharing } from './utils.js'\n\nexport type ReadContractOptions<\n  abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'pure' | 'view'>,\n  args extends ContractFunctionArgs<abi, 'pure' | 'view', functionName>,\n  config extends Config,\n  selectData = ReadContractData<abi, functionName, args>,\n> = UnionExactPartial<ReadContractParameters<abi, functionName, args, config>> &\n  ScopeKeyParameter &\n  QueryParameter<\n    ReadContractQueryFnData<abi, functionName, args>,\n    ReadContractErrorType,\n    selectData,\n    ReadContractQueryKey<abi, functionName, args, config>\n  >\n\nexport function readContractQueryOptions<\n  config extends Config,\n  const abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'pure' | 'view'>,\n  const args extends ContractFunctionArgs<abi, 'pure' | 'view', functionName>,\n  selectData = ReadContractData<abi, functionName, args>,\n>(\n  config: config,\n  options: ReadContractOptions<abi, functionName, args, config> = {} as any,\n): ReadContractQueryOptions<abi, functionName, args, config, selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(\n      Boolean(options.address || ('code' in options && options.code)) &&\n        options.abi &&\n        options.functionName &&\n        (options.query?.enabled ?? true),\n    ),\n    // TODO: Support `signal` once Viem actions allow passthrough\n    // https://tkdodo.eu/blog/why-you-want-react-query#bonus-cancellation\n    queryFn: async (context) => {\n      if (!options.abi) throw new Error('abi is required')\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      if (!parameters.functionName) throw new Error('functionName is required')\n      const result = await readContract(config, {\n        ...(parameters as any),\n        abi: options.abi,\n        address: parameters.address,\n        code:\n          'code' in parameters && parameters.code ? parameters.code : undefined,\n        functionName: parameters.functionName,\n      })\n      return result as ReadContractData<abi, functionName, args>\n    },\n    queryKey: readContractQueryKey(options as any) as any,\n    structuralSharing,\n  } as ReadContractQueryOptions<abi, functionName, args, config, selectData>\n}\n\nexport type ReadContractQueryFnData<\n  abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'pure' | 'view'>,\n  args extends ContractFunctionArgs<abi, 'pure' | 'view', functionName>,\n> = ReadContractReturnType<abi, functionName, args>\n\nexport type ReadContractData<\n  abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'pure' | 'view'>,\n  args extends ContractFunctionArgs<abi, 'pure' | 'view', functionName>,\n> = ReadContractQueryFnData<abi, functionName, args>\n\nexport function readContractQueryKey<\n  config extends Config,\n  const abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'pure' | 'view'>,\n  args extends ContractFunctionArgs<abi, 'pure' | 'view', functionName>,\n>(\n  options: UnionExactPartial<\n    ReadContractParameters<abi, functionName, args, config>\n  > &\n    ScopeKeyParameter = {} as any,\n) {\n  return ['readContract', filterQueryOptions(options)] as const\n}\n\nexport type ReadContractQueryKey<\n  abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'pure' | 'view'>,\n  args extends ContractFunctionArgs<abi, 'pure' | 'view', functionName>,\n  config extends Config,\n> = ReturnType<typeof readContractQueryKey<config, abi, functionName, args>>\n\nexport type ReadContractQueryOptions<\n  abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'pure' | 'view'>,\n  args extends ContractFunctionArgs<abi, 'pure' | 'view', functionName>,\n  config extends Config,\n  selectData = ReadContractData<abi, functionName, args>,\n> = QueryOptions<\n  ReadContractQueryFnData<abi, functionName, args>,\n  ReadContractErrorType,\n  selectData,\n  ReadContractQueryKey<abi, functionName, args, config>\n>\n"
  },
  {
    "path": "packages/core/src/query/readContracts.test-d.ts",
    "content": "import { abi, config } from '@wagmi/test'\nimport { assertType, expectTypeOf, test } from 'vitest'\n\nimport { readContractsQueryOptions } from './readContracts.js'\n\nconst context = {} as any\n\ntest('default', async () => {\n  const options = readContractsQueryOptions(config, {\n    contracts: [\n      {\n        address: '0x',\n        abi: abi.erc20,\n        functionName: 'balanceOf',\n        args: ['0x'],\n      },\n      {\n        address: '0x',\n        abi: abi.wagmiMintExample,\n        functionName: 'tokenURI',\n        args: [123n],\n      },\n    ],\n  })\n  const result = await options.queryFn({} as any)\n  expectTypeOf(result).toEqualTypeOf<\n    [\n      (\n        | { error: Error; result?: undefined; status: 'failure' }\n        | { error?: undefined; result: bigint; status: 'success' }\n      ),\n      (\n        | { error: Error; result?: undefined; status: 'failure' }\n        | { error?: undefined; result: string; status: 'success' }\n      ),\n    ]\n  >()\n})\n\ntest('allowFailure: false', async () => {\n  const options = readContractsQueryOptions(config, {\n    allowFailure: false,\n    contracts: [\n      {\n        address: '0x',\n        abi: abi.erc20,\n        functionName: 'balanceOf',\n        args: ['0x'],\n      },\n      {\n        address: '0x',\n        abi: abi.wagmiMintExample,\n        functionName: 'tokenURI',\n        args: [123n],\n      },\n    ],\n  })\n  const result = await options.queryFn({} as any)\n  expectTypeOf(result).toEqualTypeOf<[bigint, string]>()\n})\n\ntest('overloads', async () => {\n  {\n    const options = readContractsQueryOptions(config, {\n      allowFailure: false,\n      contracts: [\n        { address: '0x', abi: abi.viewOverloads, functionName: 'foo' },\n      ],\n    })\n    const result = await options.queryFn(context)\n    assertType<[number]>(result)\n  }\n  {\n    const options = readContractsQueryOptions(config, {\n      allowFailure: false,\n      contracts: [\n        {\n          address: '0x',\n          abi: abi.viewOverloads,\n          functionName: 'foo',\n          args: [],\n        },\n      ],\n    })\n    const result = await options.queryFn(context)\n    assertType<[number]>(result)\n  }\n  {\n    const options = readContractsQueryOptions(config, {\n      allowFailure: false,\n      contracts: [\n        {\n          address: '0x',\n          abi: abi.viewOverloads,\n          functionName: 'foo',\n          args: ['0x'],\n        },\n      ],\n    })\n    const result = await options.queryFn(context)\n    assertType<[string]>(result)\n  }\n  {\n    const options = readContractsQueryOptions(config, {\n      allowFailure: false,\n      contracts: [\n        {\n          address: '0x',\n          abi: abi.viewOverloads,\n          functionName: 'foo',\n          args: ['0x', '0x'],\n        },\n      ],\n    })\n    const result = await options.queryFn(context)\n    assertType<\n      [\n        {\n          foo: `0x${string}`\n          bar: `0x${string}`\n        },\n      ]\n    >(result)\n  }\n})\n"
  },
  {
    "path": "packages/core/src/query/readContracts.test.ts",
    "content": "import { abi, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport {\n  readContractsQueryKey,\n  readContractsQueryOptions,\n} from './readContracts.js'\n\ntest('default', () => {\n  expect(\n    readContractsQueryOptions(config, {\n      contracts: [\n        {\n          address: '0x',\n          abi: abi.erc20,\n          functionName: 'balanceOf',\n          args: ['0x'],\n        },\n      ],\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"readContracts\",\n        {\n          \"contracts\": [\n            {\n              \"address\": \"0x\",\n              \"args\": [\n                \"0x\",\n              ],\n              \"functionName\": \"balanceOf\",\n            },\n          ],\n        },\n      ],\n    }\n  `)\n})\n\ntest('behavior: query key should not change when contracts have explicit chainIds', () => {\n  const contracts = [\n    {\n      address: '0x',\n      abi: abi.erc20,\n      functionName: 'balanceOf',\n      args: ['0x'],\n      chainId: 1,\n    },\n    {\n      address: '0x',\n      abi: abi.erc20,\n      functionName: 'totalSupply',\n      chainId: 1,\n    },\n  ] as const\n\n  const queryKeyChain1 = readContractsQueryKey({ contracts, chainId: 1 })\n  const queryKeyChain10 = readContractsQueryKey({ contracts, chainId: 10 })\n\n  expect(queryKeyChain1).toEqual(queryKeyChain10)\n})\n"
  },
  {
    "path": "packages/core/src/query/readContracts.ts",
    "content": "import type {\n  ContractFunctionParameters,\n  MulticallParameters as viem_MulticallParameters,\n} from 'viem'\nimport {\n  type ReadContractsErrorType,\n  type ReadContractsReturnType,\n  readContracts,\n} from '../actions/readContracts.js'\nimport type { Config } from '../createConfig.js'\nimport type {\n  ChainIdParameter,\n  ScopeKeyParameter,\n} from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type ReadContractsOptions<\n  contracts extends readonly unknown[],\n  allowFailure extends boolean,\n  config extends Config,\n  selectData = ReadContractsData<contracts, allowFailure>,\n> = ExactPartial<\n  viem_MulticallParameters<\n    contracts,\n    allowFailure,\n    { optional: true; properties: ChainIdParameter<config> }\n  >\n> &\n  ScopeKeyParameter &\n  QueryParameter<\n    ReadContractsQueryFnData<contracts, allowFailure>,\n    ReadContractsErrorType,\n    selectData,\n    ReadContractsQueryKey<contracts, allowFailure, config>\n  >\n\nexport function readContractsQueryOptions<\n  config extends Config,\n  const contracts extends readonly unknown[],\n  allowFailure extends boolean = true,\n  selectData = ReadContractsData<contracts, allowFailure>,\n>(\n  config: config,\n  options: ReadContractsOptions<contracts, allowFailure, config, selectData> &\n    ChainIdParameter<config> = {},\n): ReadContractsQueryOptions<contracts, allowFailure, config, selectData> {\n  return {\n    ...options.query,\n    queryFn: async (context) => {\n      const contracts: ContractFunctionParameters[] = []\n      const length = context.queryKey[1].contracts.length\n      for (let i = 0; i < length; i++) {\n        const contract = context.queryKey[1].contracts[i]!\n        const abi = (options.contracts?.[i] as ContractFunctionParameters).abi\n        contracts.push({ ...contract, abi })\n      }\n      const { scopeKey: _, ...parameters } = context.queryKey[1]\n      return readContracts(config, {\n        ...parameters,\n        contracts,\n      }) as Promise<ReadContractsReturnType<contracts, allowFailure>>\n    },\n    queryKey: readContractsQueryKey(options),\n  }\n}\n\nexport type ReadContractsQueryFnData<\n  contracts extends readonly unknown[],\n  allowFailure extends boolean,\n> = ReadContractsReturnType<contracts, allowFailure>\n\nexport type ReadContractsData<\n  contracts extends readonly unknown[],\n  allowFailure extends boolean,\n> = ReadContractsQueryFnData<contracts, allowFailure>\n\nexport function readContractsQueryKey<\n  config extends Config,\n  const contracts extends readonly unknown[],\n  allowFailure extends boolean,\n>(\n  options: ExactPartial<\n    viem_MulticallParameters<\n      contracts,\n      allowFailure,\n      { optional: true; properties: ChainIdParameter<config> }\n    >\n  > &\n    ScopeKeyParameter &\n    ChainIdParameter<config> = {},\n) {\n  const contracts = []\n  let hasContractWithoutChainId = false\n  for (const contract of (options.contracts ??\n    []) as (ContractFunctionParameters & { chainId: number })[]) {\n    const { abi: _, ...rest } = contract\n    if (rest.chainId === undefined) hasContractWithoutChainId = true\n    const chainId = rest.chainId ?? options.chainId\n    contracts.push({ ...rest, ...(chainId ? { chainId } : {}) })\n  }\n  const { chainId: _, ...rest } = options\n  return [\n    'readContracts',\n    filterQueryOptions({\n      ...rest,\n      ...(hasContractWithoutChainId && options.chainId\n        ? { chainId: options.chainId }\n        : {}),\n      contracts,\n    }),\n  ] as const\n}\n\nexport type ReadContractsQueryKey<\n  contracts extends readonly unknown[],\n  allowFailure extends boolean,\n  config extends Config,\n> = ReturnType<typeof readContractsQueryKey<config, contracts, allowFailure>>\n\nexport type ReadContractsQueryOptions<\n  contracts extends readonly unknown[],\n  allowFailure extends boolean,\n  config extends Config,\n  selectData = ReadContractsData<contracts, allowFailure>,\n> = QueryOptions<\n  ReadContractsQueryFnData<contracts, allowFailure>,\n  ReadContractsErrorType,\n  selectData,\n  ReadContractsQueryKey<contracts, allowFailure, config>\n>\n"
  },
  {
    "path": "packages/core/src/query/reconnect.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { reconnectMutationOptions } from './reconnect.js'\n\ntest('default', () => {\n  expect(reconnectMutationOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"mutationFn\": [Function],\n      \"mutationKey\": [\n        \"reconnect\",\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/reconnect.ts",
    "content": "import type { MutationOptions } from '@tanstack/query-core'\nimport {\n  type ReconnectErrorType,\n  type ReconnectParameters,\n  type ReconnectReturnType,\n  reconnect,\n} from '../actions/reconnect.js'\nimport type { Config } from '../createConfig.js'\nimport type { MutationParameter } from '../types/query.js'\nimport type { Compute } from '../types/utils.js'\nimport type { Mutate, MutateAsync } from './types.js'\n\nexport type ReconnectOptions<context = unknown> = MutationParameter<\n  ReconnectData,\n  ReconnectErrorType,\n  ReconnectVariables,\n  context\n>\n\nexport function reconnectMutationOptions<context>(\n  config: Config,\n  options: ReconnectOptions<context> = {},\n): ReconnectMutationOptions {\n  return {\n    ...(options.mutation as any),\n    mutationFn(variables) {\n      return reconnect(config, variables)\n    },\n    mutationKey: ['reconnect'],\n  }\n}\n\nexport type ReconnectMutationOptions = MutationOptions<\n  ReconnectData,\n  ReconnectErrorType,\n  ReconnectVariables\n>\n\nexport type ReconnectData = Compute<ReconnectReturnType>\n\nexport type ReconnectVariables = ReconnectParameters | undefined\n\nexport type ReconnectMutate<context = unknown> = Mutate<\n  ReconnectData,\n  ReconnectErrorType,\n  ReconnectVariables,\n  context\n>\n\nexport type ReconnectMutateAsync<context = unknown> = MutateAsync<\n  ReconnectData,\n  ReconnectErrorType,\n  ReconnectVariables,\n  context\n>\n"
  },
  {
    "path": "packages/core/src/query/sendCalls.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { sendCallsMutationOptions } from './sendCalls.js'\n\ntest('default', () => {\n  expect(sendCallsMutationOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"mutationFn\": [Function],\n      \"mutationKey\": [\n        \"sendCalls\",\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/sendCalls.ts",
    "content": "import type { MutateOptions, MutationOptions } from '@tanstack/query-core'\nimport {\n  type SendCallsErrorType,\n  type SendCallsParameters,\n  type SendCallsReturnType,\n  sendCalls,\n} from '../actions/sendCalls.js'\nimport type { Config } from '../createConfig.js'\nimport type { MutationParameter } from '../types/query.js'\nimport type { Compute } from '../types/utils.js'\n\nexport type SendCallsOptions<\n  config extends Config,\n  context = unknown,\n> = MutationParameter<\n  SendCallsData,\n  SendCallsErrorType,\n  SendCallsVariables<config, config['chains'][number]['id']>,\n  context\n>\n\nexport function sendCallsMutationOptions<config extends Config, context>(\n  config: config,\n  options: SendCallsOptions<config, context> = {},\n): SendCallsMutationOptions<config> {\n  return {\n    ...(options.mutation as any),\n    mutationFn(variables) {\n      return sendCalls(config, variables)\n    },\n    mutationKey: ['sendCalls'],\n  }\n}\n\nexport type SendCallsMutationOptions<config extends Config> = MutationOptions<\n  SendCallsData,\n  SendCallsErrorType,\n  SendCallsVariables<config, config['chains'][number]['id']>\n>\n\nexport type SendCallsData = Compute<SendCallsReturnType>\n\nexport type SendCallsVariables<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  calls extends readonly unknown[] = readonly unknown[],\n> = SendCallsParameters<config, chainId, calls>\n\nexport type SendCallsMutate<config extends Config, context = unknown> = <\n  const calls extends readonly unknown[],\n  chainId extends config['chains'][number]['id'],\n>(\n  variables: SendCallsVariables<config, chainId, calls>,\n  options?:\n    | Compute<\n        MutateOptions<\n          SendCallsData,\n          SendCallsErrorType,\n          Compute<SendCallsVariables<config, chainId, calls>>,\n          context\n        >\n      >\n    | undefined,\n) => void\n\nexport type SendCallsMutateAsync<config extends Config, context = unknown> = <\n  const calls extends readonly unknown[],\n  chainId extends config['chains'][number]['id'],\n>(\n  variables: SendCallsVariables<config, chainId, calls>,\n  options?:\n    | Compute<\n        MutateOptions<\n          SendCallsData,\n          SendCallsErrorType,\n          Compute<SendCallsVariables<config, chainId, calls>>,\n          context\n        >\n      >\n    | undefined,\n) => Promise<SendCallsData>\n"
  },
  {
    "path": "packages/core/src/query/sendCallsSync.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { sendCallsSyncMutationOptions } from './sendCallsSync.js'\n\ntest('default', () => {\n  expect(sendCallsSyncMutationOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"mutationFn\": [Function],\n      \"mutationKey\": [\n        \"sendCallsSync\",\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/sendCallsSync.ts",
    "content": "import type { MutateOptions, MutationOptions } from '@tanstack/query-core'\nimport {\n  type SendCallsSyncErrorType,\n  type SendCallsSyncParameters,\n  type SendCallsSyncReturnType,\n  sendCallsSync,\n} from '../actions/sendCallsSync.js'\nimport type { Config } from '../createConfig.js'\nimport type { MutationParameter } from '../types/query.js'\nimport type { Compute } from '../types/utils.js'\n\nexport type SendCallsSyncOptions<\n  config extends Config,\n  context = unknown,\n> = MutationParameter<\n  SendCallsSyncData,\n  SendCallsSyncErrorType,\n  SendCallsSyncVariables<config, config['chains'][number]['id']>,\n  context\n>\n\nexport function sendCallsSyncMutationOptions<config extends Config, context>(\n  config: config,\n  options: SendCallsSyncOptions<config, context> = {},\n): SendCallsSyncMutationOptions<config> {\n  return {\n    ...(options.mutation as any),\n    mutationFn(variables) {\n      return sendCallsSync(config, variables)\n    },\n    mutationKey: ['sendCallsSync'],\n  }\n}\n\nexport type SendCallsSyncMutationOptions<config extends Config> =\n  MutationOptions<\n    SendCallsSyncData,\n    SendCallsSyncErrorType,\n    SendCallsSyncVariables<config, config['chains'][number]['id']>\n  >\n\nexport type SendCallsSyncData = Compute<SendCallsSyncReturnType>\n\nexport type SendCallsSyncVariables<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  calls extends readonly unknown[] = readonly unknown[],\n> = SendCallsSyncParameters<config, chainId, calls>\n\nexport type SendCallsSyncMutate<config extends Config, context = unknown> = <\n  const calls extends readonly unknown[],\n  chainId extends config['chains'][number]['id'],\n>(\n  variables: SendCallsSyncVariables<config, chainId, calls>,\n  options?:\n    | Compute<\n        MutateOptions<\n          SendCallsSyncData,\n          SendCallsSyncErrorType,\n          Compute<SendCallsSyncVariables<config, chainId, calls>>,\n          context\n        >\n      >\n    | undefined,\n) => void\n\nexport type SendCallsSyncMutateAsync<\n  config extends Config,\n  context = unknown,\n> = <\n  const calls extends readonly unknown[],\n  chainId extends config['chains'][number]['id'],\n>(\n  variables: SendCallsSyncVariables<config, chainId, calls>,\n  options?:\n    | Compute<\n        MutateOptions<\n          SendCallsSyncData,\n          SendCallsSyncErrorType,\n          Compute<SendCallsSyncVariables<config, chainId, calls>>,\n          context\n        >\n      >\n    | undefined,\n) => Promise<SendCallsSyncData>\n"
  },
  {
    "path": "packages/core/src/query/sendTransaction.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { sendTransactionMutationOptions } from './sendTransaction.js'\n\ntest('default', () => {\n  expect(sendTransactionMutationOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"mutationFn\": [Function],\n      \"mutationKey\": [\n        \"sendTransaction\",\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/sendTransaction.ts",
    "content": "import type { MutateOptions, MutationOptions } from '@tanstack/query-core'\nimport {\n  type SendTransactionErrorType,\n  type SendTransactionParameters,\n  type SendTransactionReturnType,\n  sendTransaction,\n} from '../actions/sendTransaction.js'\nimport type { Config } from '../createConfig.js'\nimport type { MutationParameter } from '../types/query.js'\nimport type { Compute } from '../types/utils.js'\n\nexport type SendTransactionOptions<\n  config extends Config,\n  context = unknown,\n> = MutationParameter<\n  SendTransactionData,\n  SendTransactionErrorType,\n  SendTransactionVariables<config, config['chains'][number]['id']>,\n  context\n>\n\nexport function sendTransactionMutationOptions<config extends Config, context>(\n  config: config,\n  options: SendTransactionOptions<config, context> = {},\n): SendTransactionMutationOptions<config> {\n  return {\n    ...(options.mutation as any),\n    mutationFn(variables) {\n      return sendTransaction(config, variables)\n    },\n    mutationKey: ['sendTransaction'],\n  }\n}\n\nexport type SendTransactionMutationOptions<config extends Config> =\n  MutationOptions<\n    SendTransactionData,\n    SendTransactionErrorType,\n    SendTransactionVariables<config, config['chains'][number]['id']>\n  >\n\nexport type SendTransactionData = Compute<SendTransactionReturnType>\n\nexport type SendTransactionVariables<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = SendTransactionParameters<config, chainId>\n\nexport type SendTransactionMutate<config extends Config, context = unknown> = <\n  chainId extends config['chains'][number]['id'],\n>(\n  variables: SendTransactionVariables<config, chainId>,\n  options?:\n    | Compute<\n        MutateOptions<\n          SendTransactionData,\n          SendTransactionErrorType,\n          Compute<SendTransactionVariables<config, chainId>>,\n          context\n        >\n      >\n    | undefined,\n) => void\n\nexport type SendTransactionMutateAsync<\n  config extends Config,\n  context = unknown,\n> = <chainId extends config['chains'][number]['id']>(\n  variables: SendTransactionVariables<config, chainId>,\n  options?:\n    | Compute<\n        MutateOptions<\n          SendTransactionData,\n          SendTransactionErrorType,\n          Compute<SendTransactionVariables<config, chainId>>,\n          context\n        >\n      >\n    | undefined,\n) => Promise<SendTransactionData>\n"
  },
  {
    "path": "packages/core/src/query/sendTransactionSync.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { sendTransactionSyncMutationOptions } from './sendTransactionSync.js'\n\ntest('default', () => {\n  expect(sendTransactionSyncMutationOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"mutationFn\": [Function],\n      \"mutationKey\": [\n        \"sendTransactionSync\",\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/sendTransactionSync.ts",
    "content": "import type { MutateOptions, MutationOptions } from '@tanstack/query-core'\nimport {\n  type SendTransactionSyncErrorType,\n  type SendTransactionSyncParameters,\n  type SendTransactionSyncReturnType,\n  sendTransactionSync,\n} from '../actions/sendTransactionSync.js'\nimport type { Config } from '../createConfig.js'\nimport type { MutationParameter } from '../types/query.js'\nimport type { Compute } from '../types/utils.js'\n\nexport type SendTransactionSyncOptions<\n  config extends Config,\n  context = unknown,\n> = MutationParameter<\n  SendTransactionSyncData,\n  SendTransactionSyncErrorType,\n  SendTransactionSyncVariables<config, config['chains'][number]['id']>,\n  context\n>\n\nexport function sendTransactionSyncMutationOptions<\n  config extends Config,\n  context,\n>(\n  config: config,\n  options: SendTransactionSyncOptions<config, context> = {},\n): SendTransactionSyncMutationOptions<config> {\n  return {\n    ...(options.mutation as any),\n    mutationFn(variables) {\n      return sendTransactionSync(config, variables)\n    },\n    mutationKey: ['sendTransactionSync'],\n  }\n}\n\nexport type SendTransactionSyncMutationOptions<config extends Config> =\n  MutationOptions<\n    SendTransactionSyncData,\n    SendTransactionSyncErrorType,\n    SendTransactionSyncVariables<config, config['chains'][number]['id']>\n  >\n\nexport type SendTransactionSyncData = Compute<SendTransactionSyncReturnType>\n\nexport type SendTransactionSyncVariables<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = SendTransactionSyncParameters<config, chainId>\n\nexport type SendTransactionSyncMutate<\n  config extends Config,\n  context = unknown,\n> = <chainId extends config['chains'][number]['id']>(\n  variables: SendTransactionSyncVariables<config, chainId>,\n  options?:\n    | Compute<\n        MutateOptions<\n          SendTransactionSyncData,\n          SendTransactionSyncErrorType,\n          Compute<SendTransactionSyncVariables<config, chainId>>,\n          context\n        >\n      >\n    | undefined,\n) => void\n\nexport type SendTransactionSyncMutateAsync<\n  config extends Config,\n  context = unknown,\n> = <chainId extends config['chains'][number]['id']>(\n  variables: SendTransactionSyncVariables<config, chainId>,\n  options?:\n    | Compute<\n        MutateOptions<\n          SendTransactionSyncData,\n          SendTransactionSyncErrorType,\n          Compute<SendTransactionSyncVariables<config, chainId>>,\n          context\n        >\n      >\n    | undefined,\n) => Promise<SendTransactionSyncData>\n"
  },
  {
    "path": "packages/core/src/query/showCallsStatus.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { showCallsStatusMutationOptions } from './showCallsStatus.js'\n\ntest('default', () => {\n  expect(showCallsStatusMutationOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"mutationFn\": [Function],\n      \"mutationKey\": [\n        \"showCallsStatus\",\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/showCallsStatus.ts",
    "content": "import type { MutateOptions, MutationOptions } from '@tanstack/query-core'\nimport {\n  type ShowCallsStatusErrorType,\n  type ShowCallsStatusParameters,\n  type ShowCallsStatusReturnType,\n  showCallsStatus,\n} from '../actions/showCallsStatus.js'\nimport type { Config } from '../createConfig.js'\nimport type { MutationParameter } from '../types/query.js'\nimport type { Compute } from '../types/utils.js'\n\nexport type ShowCallsStatusOptions<context = unknown> = MutationParameter<\n  ShowCallsStatusData,\n  ShowCallsStatusErrorType,\n  ShowCallsStatusVariables,\n  context\n>\n\nexport function showCallsStatusMutationOptions<config extends Config, context>(\n  config: config,\n  options: ShowCallsStatusOptions<context> = {},\n): ShowCallsStatusMutationOptions {\n  return {\n    ...(options.mutation as any),\n    mutationFn(variables) {\n      return showCallsStatus(config, variables)\n    },\n    mutationKey: ['showCallsStatus'],\n  }\n}\n\nexport type ShowCallsStatusMutationOptions = MutationOptions<\n  ShowCallsStatusData,\n  ShowCallsStatusErrorType,\n  ShowCallsStatusVariables\n>\n\nexport type ShowCallsStatusData = Compute<ShowCallsStatusReturnType>\n\nexport type ShowCallsStatusVariables = ShowCallsStatusParameters\n\nexport type ShowCallsStatusMutate<context = unknown> = (\n  variables: ShowCallsStatusVariables,\n  options?:\n    | Compute<\n        MutateOptions<\n          ShowCallsStatusData,\n          ShowCallsStatusErrorType,\n          Compute<ShowCallsStatusVariables>,\n          context\n        >\n      >\n    | undefined,\n) => void\n\nexport type ShowCallsStatusMutateAsync<context = unknown> = (\n  variables: ShowCallsStatusVariables,\n  options?:\n    | Compute<\n        MutateOptions<\n          ShowCallsStatusData,\n          ShowCallsStatusErrorType,\n          Compute<ShowCallsStatusVariables>,\n          context\n        >\n      >\n    | undefined,\n) => Promise<ShowCallsStatusData>\n"
  },
  {
    "path": "packages/core/src/query/signMessage.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { signMessageMutationOptions } from './signMessage.js'\n\ntest('default', () => {\n  expect(signMessageMutationOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"mutationFn\": [Function],\n      \"mutationKey\": [\n        \"signMessage\",\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/signMessage.ts",
    "content": "import type { MutationOptions } from '@tanstack/query-core'\nimport {\n  type SignMessageErrorType,\n  type SignMessageParameters,\n  type SignMessageReturnType,\n  signMessage,\n} from '../actions/signMessage.js'\nimport type { Config } from '../createConfig.js'\nimport type { MutationParameter } from '../types/query.js'\nimport type { Compute } from '../types/utils.js'\nimport type { Mutate, MutateAsync } from './types.js'\n\nexport type SignMessageOptions<context = unknown> = MutationParameter<\n  SignMessageData,\n  SignMessageErrorType,\n  SignMessageVariables,\n  context\n>\n\nexport function signMessageMutationOptions<context>(\n  config: Config,\n  options: SignMessageOptions<context> = {},\n): SignMessageMutationOptions {\n  return {\n    ...(options.mutation as any),\n    mutationFn(variables) {\n      return signMessage(config, variables)\n    },\n    mutationKey: ['signMessage'],\n  }\n}\n\nexport type SignMessageMutationOptions = MutationOptions<\n  SignMessageData,\n  SignMessageErrorType,\n  SignMessageVariables\n>\n\nexport type SignMessageData = SignMessageReturnType\n\nexport type SignMessageVariables = Compute<SignMessageParameters>\n\nexport type SignMessageMutate<context = unknown> = Mutate<\n  SignMessageData,\n  SignMessageErrorType,\n  SignMessageVariables,\n  context\n>\n\nexport type SignMessageMutateAsync<context = unknown> = MutateAsync<\n  SignMessageData,\n  SignMessageErrorType,\n  SignMessageVariables,\n  context\n>\n"
  },
  {
    "path": "packages/core/src/query/signTransaction.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { signTransactionMutationOptions } from './signTransaction.js'\n\ntest('default', () => {\n  expect(signTransactionMutationOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"mutationFn\": [Function],\n      \"mutationKey\": [\n        \"signTransaction\",\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/signTransaction.ts",
    "content": "import type { MutateOptions, MutationOptions } from '@tanstack/query-core'\nimport type { SignTransactionRequest as viem_SignTransactionRequest } from 'viem'\nimport {\n  type SignTransactionErrorType,\n  type SignTransactionParameters,\n  type SignTransactionReturnType,\n  signTransaction,\n} from '../actions/signTransaction.js'\nimport type { Config } from '../createConfig.js'\nimport type { SelectChains } from '../types/chain.js'\nimport type { MutationParameter } from '../types/query.js'\nimport type { Compute } from '../types/utils.js'\n\nexport type SignTransactionOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  request extends viem_SignTransactionRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  >,\n  context = unknown,\n> = MutationParameter<\n  SignTransactionData<config, chainId, request>,\n  SignTransactionErrorType,\n  SignTransactionVariables<config, chainId, request>,\n  context\n>\n\nexport function signTransactionMutationOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  request extends viem_SignTransactionRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  >,\n  context,\n>(\n  config: config,\n  options: SignTransactionOptions<config, chainId, request, context> = {},\n): SignTransactionMutationOptions<config, chainId, request> {\n  return {\n    ...(options.mutation as any),\n    mutationFn(variables) {\n      return signTransaction(config, variables as any)\n    },\n    mutationKey: ['signTransaction'],\n  }\n}\n\nexport type SignTransactionMutationOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  request extends viem_SignTransactionRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  >,\n> = MutationOptions<\n  SignTransactionData<config, chainId, request>,\n  SignTransactionErrorType,\n  SignTransactionVariables<config, chainId, request>\n>\n\nexport type SignTransactionData<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  request extends viem_SignTransactionRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  >,\n  // > = Compute<SignTransactionReturnType<config, chainId, request>>\n> = SignTransactionReturnType<config, chainId, request>\n\nexport type SignTransactionVariables<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  request extends viem_SignTransactionRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  >,\n> = SignTransactionParameters<config, chainId, request>\n\nexport type SignTransactionMutate<config extends Config, context = unknown> = <\n  chainId extends config['chains'][number]['id'],\n  const request extends viem_SignTransactionRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  >,\n>(\n  variables: SignTransactionVariables<config, chainId, request> & request,\n  options?:\n    | Compute<\n        MutateOptions<\n          SignTransactionData<config, chainId, request>,\n          SignTransactionErrorType,\n          Compute<SignTransactionVariables<config, chainId, request>>,\n          context\n        >\n      >\n    | undefined,\n) => void\n\nexport type SignTransactionMutateAsync<\n  config extends Config,\n  context = unknown,\n> = <\n  chainId extends config['chains'][number]['id'],\n  const request extends viem_SignTransactionRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  >,\n>(\n  variables: SignTransactionVariables<config, chainId, request> & request,\n  options?:\n    | Compute<\n        MutateOptions<\n          SignTransactionData<config, chainId, request>,\n          SignTransactionErrorType,\n          Compute<SignTransactionVariables<config, chainId, request>>,\n          context\n        >\n      >\n    | undefined,\n) => Promise<SignTransactionData<config, chainId, request>>\n"
  },
  {
    "path": "packages/core/src/query/signTypedData.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { signTypedDataMutationOptions } from './signTypedData.js'\n\ntest('default', () => {\n  expect(signTypedDataMutationOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"mutationFn\": [Function],\n      \"mutationKey\": [\n        \"signTypedData\",\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/signTypedData.ts",
    "content": "import type { MutateOptions, MutationOptions } from '@tanstack/query-core'\nimport type { TypedData } from 'viem'\nimport {\n  type SignTypedDataErrorType,\n  type SignTypedDataParameters,\n  type SignTypedDataReturnType,\n  signTypedData,\n} from '../actions/signTypedData.js'\nimport type { Config } from '../createConfig.js'\nimport type { MutationParameter } from '../types/query.js'\nimport type { Compute } from '../types/utils.js'\n\nexport type SignTypedDataOptions<context = unknown> = MutationParameter<\n  SignTypedDataData,\n  SignTypedDataErrorType,\n  SignTypedDataVariables,\n  context\n>\n\nexport function signTypedDataMutationOptions<config extends Config, context>(\n  config: config,\n  options: SignTypedDataOptions<context> = {},\n): SignTypedDataMutationOptions {\n  return {\n    ...(options.mutation as any),\n    mutationFn(variables) {\n      return signTypedData(config, variables)\n    },\n    mutationKey: ['signTypedData'],\n  }\n}\n\nexport type SignTypedDataMutationOptions = MutationOptions<\n  SignTypedDataData,\n  SignTypedDataErrorType,\n  SignTypedDataVariables\n>\n\nexport type SignTypedDataData = Compute<SignTypedDataReturnType>\n\nexport type SignTypedDataVariables<\n  typedData extends TypedData | Record<string, unknown> = TypedData,\n  primaryType extends keyof typedData | 'EIP712Domain' = keyof typedData,\n  ///\n  primaryTypes = typedData extends TypedData ? keyof typedData : string,\n> = SignTypedDataParameters<typedData, primaryType, primaryTypes>\n\nexport type SignTypedDataMutate<context = unknown> = <\n  const typedData extends TypedData | Record<string, unknown>,\n  primaryType extends keyof typedData | 'EIP712Domain',\n>(\n  variables: SignTypedDataVariables<typedData, primaryType>,\n  options?:\n    | MutateOptions<\n        SignTypedDataData,\n        SignTypedDataErrorType,\n        SignTypedDataVariables<\n          typedData,\n          primaryType,\n          // use `primaryType` to make sure it's not union of all possible primary types\n          primaryType\n        >,\n        context\n      >\n    | undefined,\n) => void\n\nexport type SignTypedDataMutateAsync<context = unknown> = <\n  const typedData extends TypedData | Record<string, unknown>,\n  primaryType extends keyof typedData | 'EIP712Domain',\n>(\n  variables: SignTypedDataVariables<typedData, primaryType>,\n  options?:\n    | MutateOptions<\n        SignTypedDataData,\n        SignTypedDataErrorType,\n        SignTypedDataVariables<\n          typedData,\n          primaryType,\n          // use `primaryType` to make sure it's not union of all possible primary types\n          primaryType\n        >,\n        context\n      >\n    | undefined,\n) => Promise<SignTypedDataData>\n"
  },
  {
    "path": "packages/core/src/query/simulateContract.test-d.ts",
    "content": "import { abi, config } from '@wagmi/test'\nimport { type Address, http } from 'viem'\nimport { celo, mainnet } from 'viem/chains'\nimport { assertType, expectTypeOf, test } from 'vitest'\nimport { createConfig } from '../createConfig.js'\nimport {\n  type SimulateContractOptions,\n  simulateContractQueryOptions,\n} from './simulateContract.js'\n\nconst context = {} as any\n\ntest('default', async () => {\n  const options = simulateContractQueryOptions(config, {\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    chainId: 1,\n  })\n  const response = await options.queryFn(context)\n\n  expectTypeOf(response).toMatchTypeOf<{\n    result: boolean\n    request: {\n      chainId: 1\n      abi: readonly [\n        {\n          readonly name: 'transferFrom'\n          readonly type: 'function'\n          readonly stateMutability: 'nonpayable'\n          readonly inputs: readonly [\n            { readonly type: 'address'; readonly name: 'sender' },\n            { readonly type: 'address'; readonly name: 'recipient' },\n            { readonly type: 'uint256'; readonly name: 'amount' },\n          ]\n          readonly outputs: readonly [{ type: 'bool' }]\n        },\n      ]\n      functionName: 'transferFrom'\n      args: readonly [Address, Address, bigint]\n    }\n  }>()\n})\n\ntest('chain formatters', () => {\n  const config = createConfig({\n    chains: [mainnet, celo],\n    transports: { [celo.id]: http(), [mainnet.id]: http() },\n  })\n\n  type Result = SimulateContractOptions<\n    typeof abi.erc20,\n    'transferFrom',\n    [Address, Address, bigint],\n    typeof config,\n    (typeof config)['chains'][number]['id']\n  >\n  expectTypeOf<Result>().toMatchTypeOf<{\n    chainId?: typeof celo.id | typeof mainnet.id | undefined\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  simulateContractQueryOptions(config, {\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    feeCurrency: '0x',\n  })\n\n  type Result2 = SimulateContractOptions<\n    typeof abi.erc20,\n    'transferFrom',\n    [Address, Address, bigint],\n    typeof config,\n    typeof celo.id\n  >\n  expectTypeOf<Result2>().toMatchTypeOf<{\n    functionName?: 'approve' | 'transfer' | 'transferFrom' | undefined\n    args?: readonly [Address, Address, bigint] | undefined\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  simulateContractQueryOptions(config, {\n    chainId: celo.id,\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    feeCurrency: '0x',\n  })\n\n  type Result3 = SimulateContractOptions<\n    typeof abi.erc20,\n    'transferFrom',\n    [Address, Address, bigint],\n    typeof config,\n    typeof mainnet.id\n  >\n  expectTypeOf<Result3>().toMatchTypeOf<{\n    functionName?: 'approve' | 'transfer' | 'transferFrom' | undefined\n    args?: readonly [Address, Address, bigint] | undefined\n  }>()\n  expectTypeOf<Result3>().not.toMatchTypeOf<{\n    feeCurrency?: `0x${string}` | undefined\n  }>()\n  simulateContractQueryOptions(config, {\n    chainId: mainnet.id,\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n})\n\ntest('overloads', async () => {\n  {\n    const options = simulateContractQueryOptions(config, {\n      address: '0x',\n      abi: abi.writeOverloads,\n      functionName: 'foo',\n    })\n    const result = await options.queryFn(context)\n    assertType<number>(result.result)\n  }\n  {\n    const options = simulateContractQueryOptions(config, {\n      address: '0x',\n      abi: abi.writeOverloads,\n      functionName: 'foo',\n      args: [],\n    })\n    const result = await options.queryFn(context)\n    assertType<number>(result.result)\n  }\n  {\n    const options = simulateContractQueryOptions(config, {\n      address: '0x',\n      abi: abi.writeOverloads,\n      functionName: 'foo',\n      args: ['0x'],\n    })\n    const result = await options.queryFn(context)\n    assertType<string>(result.result)\n  }\n  {\n    const options = simulateContractQueryOptions(config, {\n      address: '0x',\n      abi: abi.writeOverloads,\n      functionName: 'foo',\n      args: ['0x', '0x'],\n      //^?\n    })\n    const result = await options.queryFn(context)\n    assertType<{\n      foo: `0x${string}`\n      bar: `0x${string}`\n    }>(result.result)\n  }\n})\n"
  },
  {
    "path": "packages/core/src/query/simulateContract.test.ts",
    "content": "import { abi, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { simulateContractQueryOptions } from './simulateContract.js'\n\ntest('default', () => {\n  expect(\n    simulateContractQueryOptions(config, {\n      address: '0x',\n      abi: abi.erc20,\n      functionName: 'transferFrom',\n      args: ['0x', '0x', 123n],\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": false,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"simulateContract\",\n        {\n          \"address\": \"0x\",\n          \"args\": [\n            \"0x\",\n            \"0x\",\n            123n,\n          ],\n          \"functionName\": \"transferFrom\",\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/simulateContract.ts",
    "content": "import type { Abi, ContractFunctionArgs, ContractFunctionName } from 'viem'\n\nimport {\n  type SimulateContractErrorType,\n  type SimulateContractParameters,\n  type SimulateContractReturnType,\n  simulateContract,\n} from '../actions/simulateContract.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { UnionExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type SimulateContractOptions<\n  abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  >,\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined,\n  selectData = SimulateContractData<abi, functionName, args, config, chainId>,\n> = UnionExactPartial<\n  SimulateContractParameters<abi, functionName, args, config, chainId>\n> &\n  ScopeKeyParameter &\n  QueryParameter<\n    SimulateContractQueryFnData<abi, functionName, args, config, chainId>,\n    SimulateContractErrorType,\n    selectData,\n    SimulateContractQueryKey<abi, functionName, args, config, chainId>\n  >\n\nexport function simulateContractQueryOptions<\n  const abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  const args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  >,\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined,\n  selectData = SimulateContractData<abi, functionName, args, config, chainId>,\n>(\n  config: config,\n  options: SimulateContractOptions<\n    abi,\n    functionName,\n    args,\n    config,\n    chainId,\n    selectData\n  > = {} as any,\n): SimulateContractQueryOptions<\n  abi,\n  functionName,\n  args,\n  config,\n  chainId,\n  selectData\n> {\n  return {\n    ...options.query,\n    enabled: Boolean(\n      options.abi &&\n        options.address &&\n        options.connector &&\n        options.functionName &&\n        (options.query?.enabled ?? true),\n    ),\n    queryFn: async (context) => {\n      if (!options.abi) throw new Error('abi is required')\n      if (!options.connector) throw new Error('connector is required')\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      if (!parameters.address) throw new Error('address is required')\n      if (!parameters.functionName) throw new Error('functionName is required')\n      return simulateContract(config, {\n        ...(parameters as any),\n        abi: options.abi,\n        address: parameters.address,\n        connector: options.connector,\n        functionName: parameters.functionName,\n      })\n    },\n    queryKey: simulateContractQueryKey(options as any),\n  }\n}\n\nexport type SimulateContractQueryFnData<\n  abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  >,\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined,\n> = SimulateContractReturnType<abi, functionName, args, config, chainId>\n\nexport type SimulateContractData<\n  abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  >,\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined,\n> = SimulateContractQueryFnData<abi, functionName, args, config, chainId>\n\nexport function simulateContractQueryKey<\n  abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  const args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  >,\n  const config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined,\n>(\n  options: UnionExactPartial<\n    SimulateContractParameters<abi, functionName, args, config, chainId>\n  > &\n    ScopeKeyParameter = {} as any,\n) {\n  const { connector: _, ...rest } = options\n  return ['simulateContract', filterQueryOptions(rest)] as const\n}\n\nexport type SimulateContractQueryKey<\n  abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  >,\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined,\n> = ReturnType<\n  typeof simulateContractQueryKey<abi, functionName, args, config, chainId>\n>\n\nexport type SimulateContractQueryOptions<\n  abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  >,\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined,\n  selectData = SimulateContractData<abi, functionName, args, config, chainId>,\n> = QueryOptions<\n  SimulateContractQueryFnData<abi, functionName, args, config, chainId>,\n  SimulateContractErrorType,\n  selectData,\n  SimulateContractQueryKey<abi, functionName, args, config, chainId>\n>\n"
  },
  {
    "path": "packages/core/src/query/switchChain.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { switchChainMutationOptions } from './switchChain.js'\n\ntest('default', () => {\n  expect(switchChainMutationOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"mutationFn\": [Function],\n      \"mutationKey\": [\n        \"switchChain\",\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/switchChain.ts",
    "content": "import type { MutateOptions, MutationOptions } from '@tanstack/query-core'\nimport {\n  type SwitchChainErrorType,\n  type SwitchChainParameters,\n  type SwitchChainReturnType,\n  switchChain,\n} from '../actions/switchChain.js'\nimport type { Config } from '../createConfig.js'\nimport type { MutationParameter } from '../types/query.js'\nimport type { Compute } from '../types/utils.js'\n\nexport type SwitchChainOptions<\n  config extends Config,\n  context = unknown,\n> = MutationParameter<\n  SwitchChainData<config, config['chains'][number]['id']>,\n  SwitchChainErrorType,\n  SwitchChainVariables<config, config['chains'][number]['id']>,\n  context\n>\n\nexport function switchChainMutationOptions<config extends Config, context>(\n  config: config,\n  options: SwitchChainOptions<config, context> = {},\n): SwitchChainMutationOptions<config> {\n  return {\n    ...(options.mutation as any),\n    mutationFn(variables) {\n      return switchChain(config, variables)\n    },\n    mutationKey: ['switchChain'],\n  }\n}\n\nexport type SwitchChainMutationOptions<config extends Config> = MutationOptions<\n  SwitchChainData<config, config['chains'][number]['id']>,\n  SwitchChainErrorType,\n  SwitchChainVariables<config, config['chains'][number]['id']>\n>\n\nexport type SwitchChainData<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = Compute<SwitchChainReturnType<config, chainId>>\n\nexport type SwitchChainVariables<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = Compute<SwitchChainParameters<config, chainId>>\n\nexport type SwitchChainMutate<config extends Config, context = unknown> = <\n  chainId extends config['chains'][number]['id'],\n>(\n  variables: SwitchChainVariables<config, chainId>,\n  options?:\n    | Compute<\n        MutateOptions<\n          SwitchChainData<config, chainId>,\n          SwitchChainErrorType,\n          Compute<SwitchChainVariables<config, chainId>>,\n          context\n        >\n      >\n    | undefined,\n) => void\n\nexport type SwitchChainMutateAsync<config extends Config, context = unknown> = <\n  chainId extends config['chains'][number]['id'],\n>(\n  variables: SwitchChainVariables<config, chainId>,\n  options?:\n    | Compute<\n        MutateOptions<\n          SwitchChainData<config, chainId>,\n          SwitchChainErrorType,\n          Compute<SwitchChainVariables<config, chainId>>,\n          context\n        >\n      >\n    | undefined,\n) => Promise<SwitchChainData<config, chainId>>\n"
  },
  {
    "path": "packages/core/src/query/switchConnection.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { switchConnectionMutationOptions } from './switchConnection.js'\n\ntest('default', () => {\n  expect(switchConnectionMutationOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"mutationFn\": [Function],\n      \"mutationKey\": [\n        \"switchConnection\",\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/switchConnection.ts",
    "content": "import type { MutationOptions } from '@tanstack/query-core'\nimport {\n  type SwitchConnectionErrorType,\n  type SwitchConnectionParameters,\n  type SwitchConnectionReturnType,\n  switchConnection,\n} from '../actions/switchConnection.js'\nimport type { Config } from '../createConfig.js'\nimport type { MutationParameter } from '../types/query.js'\nimport type { Compute } from '../types/utils.js'\nimport type { Mutate, MutateAsync } from './types.js'\n\nexport type SwitchConnectionOptions<\n  config extends Config,\n  context = unknown,\n> = MutationParameter<\n  SwitchConnectionData<config>,\n  SwitchConnectionErrorType,\n  SwitchConnectionVariables,\n  context\n>\n\nexport function switchConnectionMutationOptions<config extends Config, context>(\n  config: config,\n  options: SwitchConnectionOptions<config, context> = {},\n): SwitchConnectionMutationOptions<config> {\n  return {\n    ...(options.mutation as any),\n    mutationFn(variables) {\n      return switchConnection(config, variables)\n    },\n    mutationKey: ['switchConnection'],\n  }\n}\n\nexport type SwitchConnectionMutationOptions<config extends Config> =\n  MutationOptions<\n    SwitchConnectionData<config>,\n    SwitchConnectionErrorType,\n    SwitchConnectionVariables\n  >\n\nexport type SwitchConnectionData<config extends Config> = Compute<\n  SwitchConnectionReturnType<config>\n>\n\nexport type SwitchConnectionVariables = Compute<SwitchConnectionParameters>\n\nexport type SwitchConnectionMutate<\n  config extends Config,\n  context = unknown,\n> = Mutate<\n  SwitchConnectionData<config>,\n  SwitchConnectionErrorType,\n  SwitchConnectionVariables,\n  context\n>\n\nexport type SwitchConnectionMutateAsync<\n  config extends Config,\n  context = unknown,\n> = MutateAsync<\n  SwitchConnectionData<config>,\n  SwitchConnectionErrorType,\n  SwitchConnectionVariables,\n  context\n>\n"
  },
  {
    "path": "packages/core/src/query/types.ts",
    "content": "import type {\n  DefaultError,\n  InfiniteQueryObserverOptions,\n  MutateOptions,\n  QueryFunction,\n  QueryKey,\n} from '@tanstack/query-core'\n\nimport type { Compute, StrictOmit } from '../types/utils.js'\n\nexport type InfiniteQueryOptions<\n  queryFnData = unknown,\n  error = DefaultError,\n  data = queryFnData,\n  queryData = queryFnData,\n  queryKey extends QueryKey = QueryKey,\n  pageParam = unknown,\n  ///\n  options extends InfiniteQueryObserverOptions<\n    queryFnData,\n    error,\n    data,\n    queryData,\n    queryKey,\n    pageParam\n  > = InfiniteQueryObserverOptions<\n    queryFnData,\n    error,\n    data,\n    queryData,\n    queryKey,\n    pageParam\n  >,\n> = Compute<\n  // `queryFn` doesn't pass through `pageParam` correctly\n  StrictOmit<options, 'queryFn'> & {\n    queryFn?(\n      context: QueryFunctionContext<queryKey, pageParam>,\n    ): options['queryFn'] extends (...args: any) => any\n      ? ReturnType<NonNullable<options['queryFn']>>\n      : unknown\n  }\n>\n\n// `QueryFunctionContext` not exported resulting in TS2742 error so grabbing from `QueryFunction`\ntype QueryFunctionContext<\n  TQueryKey extends QueryKey = QueryKey,\n  TPageParam = never,\n> = Parameters<QueryFunction<unknown, TQueryKey, TPageParam>>[0]\n\nexport type Mutate<\n  data = unknown,\n  error = unknown,\n  variables = void,\n  context = unknown,\n> = (\n  ...args: Parameters<MutateFn<data, error, Compute<variables>, context>>\n) => void\n\nexport type MutateAsync<\n  data = unknown,\n  error = unknown,\n  variables = void,\n  context = unknown,\n> = MutateFn<data, error, Compute<variables>, context>\n\ntype MutateFn<\n  data = unknown,\n  error = unknown,\n  variables = void,\n  context = unknown,\n> = undefined extends variables\n  ? (\n      variables?: variables,\n      options?:\n        | Compute<MutateOptions<data, error, variables, context>>\n        | undefined,\n    ) => Promise<data>\n  : (\n      variables: variables,\n      options?:\n        | Compute<MutateOptions<data, error, variables, context>>\n        | undefined,\n    ) => Promise<data>\n"
  },
  {
    "path": "packages/core/src/query/utils.test.ts",
    "content": "import { abi } from '@wagmi/test'\nimport { expect, expectTypeOf, test } from 'vitest'\nimport { filterQueryOptions, structuralSharing } from './utils.js'\n\ntest('structuralSharing', () => {\n  expect(\n    structuralSharing({ foo: 'bar' }, { foo: 'bar' }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"foo\": \"bar\",\n    }\n  `)\n  expect(\n    structuralSharing({ foo: 'bar' }, { foo: 'baz' }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"foo\": \"baz\",\n    }\n  `)\n})\n\ntest('filterQueryOptions', () => {\n  const options = filterQueryOptions({\n    foo: 'bar',\n    baz: true,\n    abi: abi.erc20,\n    connector: undefined,\n  })\n  expectTypeOf(options).toEqualTypeOf<{\n    foo: string\n    baz: boolean\n    connectorUid?: string | undefined\n  }>()\n  expect(options).toMatchInlineSnapshot(`\n    {\n      \"baz\": true,\n      \"foo\": \"bar\",\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/utils.ts",
    "content": "import { type QueryKey, replaceEqualDeep } from '@tanstack/query-core'\nimport type { Connector } from '../createConfig.js'\nimport type { Compute, StrictOmit } from '../types/utils.js'\n\nexport function structuralSharing<data>(\n  oldData: data | undefined,\n  newData: data,\n): data {\n  return replaceEqualDeep(oldData, newData)\n}\n\nexport function hashFn(queryKey: QueryKey): string {\n  return JSON.stringify(queryKey, (_, value) => {\n    if (isPlainObject(value))\n      return Object.keys(value)\n        .sort()\n        .reduce((result, key) => {\n          result[key] = value[key]\n          return result\n        }, {} as any)\n    if (typeof value === 'bigint') return value.toString()\n    return value\n  })\n}\n\n// biome-ignore lint/complexity/noBannedTypes: using\nfunction isPlainObject(value: any): value is Object {\n  if (!hasObjectPrototype(value)) {\n    return false\n  }\n\n  // If has modified constructor\n  const ctor = value.constructor\n  if (typeof ctor === 'undefined') return true\n\n  // If has modified prototype\n  const prot = ctor.prototype\n  if (!hasObjectPrototype(prot)) return false\n\n  // If constructor does not have an Object-specific method\n  // biome-ignore lint/suspicious/noPrototypeBuiltins: using\n  if (!prot.hasOwnProperty('isPrototypeOf')) return false\n\n  // Most likely a plain Object\n  return true\n}\n\nfunction hasObjectPrototype(o: any): boolean {\n  return Object.prototype.toString.call(o) === '[object Object]'\n}\n\nexport function filterQueryOptions<\n  type extends Record<string, unknown> & { connector?: Connector | undefined },\n>(\n  options: type,\n): Compute<\n  StrictOmit<type, 'abi' | 'config' | 'connector' | 'query' | 'watch'> &\n    (type extends { connector?: Connector | undefined }\n      ? { connectorUid?: string }\n      : unknown)\n> {\n  // destructuring is super fast\n  // biome-ignore format: no formatting\n  const {\n    // import('@tanstack/query-core').QueryOptions\n    // biome-ignore lint/correctness/noUnusedVariables: tossing\n    _defaulted, behavior, gcTime, initialData, initialDataUpdatedAt, maxPages, meta, networkMode, queryFn, queryHash, queryKey, queryKeyHashFn, retry, retryDelay, structuralSharing,\n\n    // import('@tanstack/query-core').InfiniteQueryObserverOptions\n    // biome-ignore lint/correctness/noUnusedVariables: tossing\n    getPreviousPageParam, getNextPageParam, initialPageParam,\n\n    // import('@tanstack/react-query').UseQueryOptions\n    // biome-ignore lint/correctness/noUnusedVariables: tossing\n    _optimisticResults, enabled, notifyOnChangeProps, placeholderData, refetchInterval, refetchIntervalInBackground, refetchOnMount, refetchOnReconnect, refetchOnWindowFocus, retryOnMount, select, staleTime, suspense, throwOnError,\n\n    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n    // wagmi\n    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n    // biome-ignore lint/correctness/noUnusedVariables: tossing\n    abi, config, connector, query, watch,\n    ...rest\n  } = options\n  if (connector) return { connectorUid: connector?.uid, ...rest } as never\n  return rest as never\n}\n"
  },
  {
    "path": "packages/core/src/query/verifyMessage.test.ts",
    "content": "import { accounts, chain, config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { verifyMessageQueryOptions } from './verifyMessage.js'\n\nconst address = accounts[0]\n\ntest('default', () => {\n  expect(\n    verifyMessageQueryOptions(config, {\n      address,\n      message: 'This is a test message for viem!',\n      signature:\n        '0xefd5fb29a274ea6682673d8b3caa9263e936d48d486e5df68893003e0a76496439594d12245008c6fba1c8e3ef28241cffe1bef27ff6bca487b167f261f329251c',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"verifyMessage\",\n        {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"message\": \"This is a test message for viem!\",\n          \"signature\": \"0xefd5fb29a274ea6682673d8b3caa9263e936d48d486e5df68893003e0a76496439594d12245008c6fba1c8e3ef28241cffe1bef27ff6bca487b167f261f329251c\",\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    verifyMessageQueryOptions(config, {\n      chainId: chain.mainnet2.id,\n      address,\n      message: 'This is a test message for viem!',\n      signature:\n        '0xefd5fb29a274ea6682673d8b3caa9263e936d48d486e5df68893003e0a76496439594d12245008c6fba1c8e3ef28241cffe1bef27ff6bca487b167f261f329251c',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"verifyMessage\",\n        {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"chainId\": 456,\n          \"message\": \"This is a test message for viem!\",\n          \"signature\": \"0xefd5fb29a274ea6682673d8b3caa9263e936d48d486e5df68893003e0a76496439594d12245008c6fba1c8e3ef28241cffe1bef27ff6bca487b167f261f329251c\",\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: blockNumber', () => {\n  expect(\n    verifyMessageQueryOptions(config, {\n      blockNumber: 1234567890n,\n      address,\n      message: 'This is a test message for viem!',\n      signature:\n        '0xefd5fb29a274ea6682673d8b3caa9263e936d48d486e5df68893003e0a76496439594d12245008c6fba1c8e3ef28241cffe1bef27ff6bca487b167f261f329251c',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"verifyMessage\",\n        {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"blockNumber\": 1234567890n,\n          \"message\": \"This is a test message for viem!\",\n          \"signature\": \"0xefd5fb29a274ea6682673d8b3caa9263e936d48d486e5df68893003e0a76496439594d12245008c6fba1c8e3ef28241cffe1bef27ff6bca487b167f261f329251c\",\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: blockTag', () => {\n  expect(\n    verifyMessageQueryOptions(config, {\n      blockTag: 'safe',\n      address,\n      message: 'This is a test message for viem!',\n      signature:\n        '0xefd5fb29a274ea6682673d8b3caa9263e936d48d486e5df68893003e0a76496439594d12245008c6fba1c8e3ef28241cffe1bef27ff6bca487b167f261f329251c',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"verifyMessage\",\n        {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"blockTag\": \"safe\",\n          \"message\": \"This is a test message for viem!\",\n          \"signature\": \"0xefd5fb29a274ea6682673d8b3caa9263e936d48d486e5df68893003e0a76496439594d12245008c6fba1c8e3ef28241cffe1bef27ff6bca487b167f261f329251c\",\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/verifyMessage.ts",
    "content": "import {\n  type VerifyMessageErrorType,\n  type VerifyMessageParameters,\n  type VerifyMessageReturnType,\n  verifyMessage,\n} from '../actions/verifyMessage.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type VerifyMessageOptions<\n  config extends Config,\n  selectData = VerifyMessageData,\n> = Compute<ExactPartial<VerifyMessageParameters<config>> & ScopeKeyParameter> &\n  QueryParameter<\n    VerifyMessageQueryFnData,\n    VerifyMessageErrorType,\n    selectData,\n    VerifyMessageQueryKey<config>\n  >\n\nexport function verifyMessageQueryOptions<\n  config extends Config,\n  selectData = VerifyMessageData,\n>(\n  config: config,\n  options: VerifyMessageOptions<config, selectData> = {},\n): VerifyMessageQueryOptions<config, selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(\n      options.address &&\n        options.message &&\n        options.signature &&\n        (options.query?.enabled ?? true),\n    ),\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      if (!parameters.address) throw new Error('address is required')\n      if (!parameters.message) throw new Error('message is required')\n      if (!parameters.signature) throw new Error('signature is required')\n      const verified = await verifyMessage(config, {\n        ...parameters,\n        address: parameters.address,\n        message: parameters.message,\n        signature: parameters.signature,\n      })\n      return verified ?? null\n    },\n    queryKey: verifyMessageQueryKey(options),\n  }\n}\n\nexport type VerifyMessageQueryFnData = VerifyMessageReturnType\n\nexport type VerifyMessageData = VerifyMessageQueryFnData\n\nexport function verifyMessageQueryKey<config extends Config>(\n  options: Compute<\n    ExactPartial<VerifyMessageParameters<config>> & ScopeKeyParameter\n  > = {},\n) {\n  return ['verifyMessage', filterQueryOptions(options)] as const\n}\n\nexport type VerifyMessageQueryKey<config extends Config> = ReturnType<\n  typeof verifyMessageQueryKey<config>\n>\n\nexport type VerifyMessageQueryOptions<\n  config extends Config,\n  selectData = VerifyMessageData,\n> = QueryOptions<\n  VerifyMessageQueryFnData,\n  VerifyMessageErrorType,\n  selectData,\n  VerifyMessageQueryKey<config>\n>\n"
  },
  {
    "path": "packages/core/src/query/verifyTypedData.test-d.ts",
    "content": "import { config, typedData } from '@wagmi/test'\nimport { test } from 'vitest'\n\nimport { verifyTypedDataQueryOptions } from './verifyTypedData.js'\n\ntest('default', async () => {\n  verifyTypedDataQueryOptions(config, {\n    address: '0x',\n    ...typedData.basic,\n    primaryType: 'Mail',\n    signature: '0x',\n  })\n  verifyTypedDataQueryOptions(config, {\n    address: '0x',\n    ...typedData.basic,\n    // @ts-expect-error\n    primaryType: 'foobarbaz',\n    signature: '0x',\n  })\n})\n"
  },
  {
    "path": "packages/core/src/query/verifyTypedData.test.ts",
    "content": "import { accounts, chain, config, typedData } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { verifyTypedDataQueryOptions } from './verifyTypedData.js'\n\nconst address = accounts[0]\n\ntest('default', () => {\n  expect(\n    verifyTypedDataQueryOptions(config, {\n      address,\n      ...typedData.basic,\n      primaryType: 'Mail',\n      signature:\n        '0xefd5fb29a274ea6682673d8b3caa9263e936d48d486e5df68893003e0a76496439594d12245008c6fba1c8e3ef28241cffe1bef27ff6bca487b167f261f329251c',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"verifyTypedData\",\n        {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"domain\": {\n            \"chainId\": 1,\n            \"name\": \"Ether Mail\",\n            \"verifyingContract\": \"0x0000000000000000000000000000000000000000\",\n            \"version\": \"1\",\n          },\n          \"message\": {\n            \"contents\": \"Hello, Bob!\",\n            \"from\": {\n              \"name\": \"Cow\",\n              \"wallet\": \"0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826\",\n            },\n            \"to\": {\n              \"name\": \"Bob\",\n              \"wallet\": \"0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB\",\n            },\n          },\n          \"primaryType\": \"Mail\",\n          \"signature\": \"0xefd5fb29a274ea6682673d8b3caa9263e936d48d486e5df68893003e0a76496439594d12245008c6fba1c8e3ef28241cffe1bef27ff6bca487b167f261f329251c\",\n          \"types\": {\n            \"Mail\": [\n              {\n                \"name\": \"from\",\n                \"type\": \"Person\",\n              },\n              {\n                \"name\": \"to\",\n                \"type\": \"Person\",\n              },\n              {\n                \"name\": \"contents\",\n                \"type\": \"string\",\n              },\n            ],\n            \"Person\": [\n              {\n                \"name\": \"name\",\n                \"type\": \"string\",\n              },\n              {\n                \"name\": \"wallet\",\n                \"type\": \"address\",\n              },\n            ],\n          },\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: chainId', () => {\n  expect(\n    verifyTypedDataQueryOptions(config, {\n      ...typedData.basic,\n      domain: {\n        ...typedData.basic.domain,\n        chainId: chain.mainnet2.id,\n      },\n      chainId: chain.mainnet2.id,\n      address,\n      primaryType: 'Mail',\n      signature:\n        '0xefd5fb29a274ea6682673d8b3caa9263e936d48d486e5df68893003e0a76496439594d12245008c6fba1c8e3ef28241cffe1bef27ff6bca487b167f261f329251c',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"verifyTypedData\",\n        {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"chainId\": 456,\n          \"domain\": {\n            \"chainId\": 456,\n            \"name\": \"Ether Mail\",\n            \"verifyingContract\": \"0x0000000000000000000000000000000000000000\",\n            \"version\": \"1\",\n          },\n          \"message\": {\n            \"contents\": \"Hello, Bob!\",\n            \"from\": {\n              \"name\": \"Cow\",\n              \"wallet\": \"0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826\",\n            },\n            \"to\": {\n              \"name\": \"Bob\",\n              \"wallet\": \"0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB\",\n            },\n          },\n          \"primaryType\": \"Mail\",\n          \"signature\": \"0xefd5fb29a274ea6682673d8b3caa9263e936d48d486e5df68893003e0a76496439594d12245008c6fba1c8e3ef28241cffe1bef27ff6bca487b167f261f329251c\",\n          \"types\": {\n            \"Mail\": [\n              {\n                \"name\": \"from\",\n                \"type\": \"Person\",\n              },\n              {\n                \"name\": \"to\",\n                \"type\": \"Person\",\n              },\n              {\n                \"name\": \"contents\",\n                \"type\": \"string\",\n              },\n            ],\n            \"Person\": [\n              {\n                \"name\": \"name\",\n                \"type\": \"string\",\n              },\n              {\n                \"name\": \"wallet\",\n                \"type\": \"address\",\n              },\n            ],\n          },\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: blockNumber', () => {\n  expect(\n    verifyTypedDataQueryOptions(config, {\n      blockNumber: 1234567890n,\n      address,\n      ...typedData.basic,\n      primaryType: 'Mail',\n      signature:\n        '0xefd5fb29a274ea6682673d8b3caa9263e936d48d486e5df68893003e0a76496439594d12245008c6fba1c8e3ef28241cffe1bef27ff6bca487b167f261f329251c',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"verifyTypedData\",\n        {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"blockNumber\": 1234567890n,\n          \"domain\": {\n            \"chainId\": 1,\n            \"name\": \"Ether Mail\",\n            \"verifyingContract\": \"0x0000000000000000000000000000000000000000\",\n            \"version\": \"1\",\n          },\n          \"message\": {\n            \"contents\": \"Hello, Bob!\",\n            \"from\": {\n              \"name\": \"Cow\",\n              \"wallet\": \"0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826\",\n            },\n            \"to\": {\n              \"name\": \"Bob\",\n              \"wallet\": \"0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB\",\n            },\n          },\n          \"primaryType\": \"Mail\",\n          \"signature\": \"0xefd5fb29a274ea6682673d8b3caa9263e936d48d486e5df68893003e0a76496439594d12245008c6fba1c8e3ef28241cffe1bef27ff6bca487b167f261f329251c\",\n          \"types\": {\n            \"Mail\": [\n              {\n                \"name\": \"from\",\n                \"type\": \"Person\",\n              },\n              {\n                \"name\": \"to\",\n                \"type\": \"Person\",\n              },\n              {\n                \"name\": \"contents\",\n                \"type\": \"string\",\n              },\n            ],\n            \"Person\": [\n              {\n                \"name\": \"name\",\n                \"type\": \"string\",\n              },\n              {\n                \"name\": \"wallet\",\n                \"type\": \"address\",\n              },\n            ],\n          },\n        },\n      ],\n    }\n  `)\n})\n\ntest('parameters: blockTag', () => {\n  expect(\n    verifyTypedDataQueryOptions(config, {\n      blockTag: 'pending',\n      address,\n      ...typedData.basic,\n      primaryType: 'Mail',\n      signature:\n        '0xefd5fb29a274ea6682673d8b3caa9263e936d48d486e5df68893003e0a76496439594d12245008c6fba1c8e3ef28241cffe1bef27ff6bca487b167f261f329251c',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": true,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"verifyTypedData\",\n        {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"blockTag\": \"pending\",\n          \"domain\": {\n            \"chainId\": 1,\n            \"name\": \"Ether Mail\",\n            \"verifyingContract\": \"0x0000000000000000000000000000000000000000\",\n            \"version\": \"1\",\n          },\n          \"message\": {\n            \"contents\": \"Hello, Bob!\",\n            \"from\": {\n              \"name\": \"Cow\",\n              \"wallet\": \"0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826\",\n            },\n            \"to\": {\n              \"name\": \"Bob\",\n              \"wallet\": \"0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB\",\n            },\n          },\n          \"primaryType\": \"Mail\",\n          \"signature\": \"0xefd5fb29a274ea6682673d8b3caa9263e936d48d486e5df68893003e0a76496439594d12245008c6fba1c8e3ef28241cffe1bef27ff6bca487b167f261f329251c\",\n          \"types\": {\n            \"Mail\": [\n              {\n                \"name\": \"from\",\n                \"type\": \"Person\",\n              },\n              {\n                \"name\": \"to\",\n                \"type\": \"Person\",\n              },\n              {\n                \"name\": \"contents\",\n                \"type\": \"string\",\n              },\n            ],\n            \"Person\": [\n              {\n                \"name\": \"name\",\n                \"type\": \"string\",\n              },\n              {\n                \"name\": \"wallet\",\n                \"type\": \"address\",\n              },\n            ],\n          },\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/verifyTypedData.ts",
    "content": "import type { TypedData } from 'viem'\nimport {\n  type VerifyTypedDataErrorType,\n  type VerifyTypedDataParameters,\n  type VerifyTypedDataReturnType,\n  verifyTypedData,\n} from '../actions/verifyTypedData.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { UnionExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type VerifyTypedDataOptions<\n  typedData extends TypedData | Record<string, unknown>,\n  primaryType extends keyof typedData | 'EIP712Domain',\n  config extends Config,\n  selectData = VerifyTypedDataData,\n> = UnionExactPartial<\n  VerifyTypedDataParameters<typedData, primaryType, config>\n> &\n  ScopeKeyParameter &\n  QueryParameter<\n    VerifyTypedDataQueryFnData,\n    VerifyTypedDataErrorType,\n    selectData,\n    VerifyTypedDataQueryKey<typedData, primaryType, config>\n  >\n\nexport function verifyTypedDataQueryOptions<\n  const typedData extends TypedData | Record<string, unknown>,\n  primaryType extends keyof typedData | 'EIP712Domain',\n  config extends Config,\n  selectData = VerifyTypedDataData,\n>(\n  config: config,\n  options: VerifyTypedDataOptions<\n    typedData,\n    primaryType,\n    config,\n    selectData\n  > = {} as any,\n): VerifyTypedDataQueryOptions<typedData, primaryType, config, selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(\n      options.address &&\n        options.message &&\n        options.primaryType &&\n        options.signature &&\n        options.types &&\n        (options.query?.enabled ?? true),\n    ),\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      if (!parameters.address) throw new Error('address is required')\n      if (!parameters.message) throw new Error('message is required')\n      if (!parameters.primaryType) throw new Error('primaryType is required')\n      if (!parameters.signature) throw new Error('signature is required')\n      if (!parameters.types) throw new Error('types is required')\n      const verified = await verifyTypedData(config, {\n        ...(parameters as any),\n        address: parameters.address,\n        message: parameters.message,\n        primaryType: parameters.primaryType,\n        signature: parameters.signature,\n        types: parameters.types,\n      })\n      return verified ?? null\n    },\n    queryKey: verifyTypedDataQueryKey(options as any) as any,\n  }\n}\n\nexport type VerifyTypedDataQueryFnData = VerifyTypedDataReturnType\n\nexport type VerifyTypedDataData = VerifyTypedDataQueryFnData\n\nexport function verifyTypedDataQueryKey<\n  config extends Config,\n  const typedData extends TypedData | Record<string, unknown>,\n  primaryType extends keyof typedData | 'EIP712Domain',\n>(\n  options: UnionExactPartial<\n    VerifyTypedDataParameters<typedData, primaryType, config>\n  > &\n    ScopeKeyParameter = {} as any,\n) {\n  return ['verifyTypedData', filterQueryOptions(options)] as const\n}\n\nexport type VerifyTypedDataQueryKey<\n  typedData extends TypedData | Record<string, unknown>,\n  primaryType extends keyof typedData | 'EIP712Domain',\n  config extends Config,\n> = ReturnType<typeof verifyTypedDataQueryKey<config, typedData, primaryType>>\n\nexport type VerifyTypedDataQueryOptions<\n  typedData extends TypedData | Record<string, unknown>,\n  primaryType extends keyof typedData | 'EIP712Domain',\n  config extends Config,\n  selectData = VerifyTypedDataData,\n> = QueryOptions<\n  VerifyTypedDataQueryFnData,\n  VerifyTypedDataErrorType,\n  selectData,\n  VerifyTypedDataQueryKey<typedData, primaryType, config>\n>\n"
  },
  {
    "path": "packages/core/src/query/waitForCallsStatus.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { waitForCallsStatusQueryOptions } from './waitForCallsStatus.js'\n\ntest('default', () => {\n  expect(\n    waitForCallsStatusQueryOptions(config, {\n      id: '0x0000000000000000000000000000000000000000',\n    }),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": false,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"callsStatus\",\n        {\n          \"id\": \"0x0000000000000000000000000000000000000000\",\n        },\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/waitForCallsStatus.ts",
    "content": "import {\n  type WaitForCallsStatusErrorType,\n  type WaitForCallsStatusParameters,\n  type WaitForCallsStatusReturnType,\n  waitForCallsStatus,\n} from '../actions/waitForCallsStatus.js'\nimport type { Config } from '../createConfig.js'\nimport { filterQueryOptions } from '../query/utils.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\n\nexport type WaitForCallsStatusOptions<selectData = WaitForCallsStatusData> =\n  Compute<ExactPartial<WaitForCallsStatusParameters> & ScopeKeyParameter> &\n    QueryParameter<\n      WaitForCallsStatusQueryFnData,\n      WaitForCallsStatusErrorType,\n      selectData,\n      WaitForCallsStatusQueryKey\n    >\n\nexport function waitForCallsStatusQueryOptions<\n  config extends Config,\n  selectData = WaitForCallsStatusData,\n>(\n  config: config,\n  options: WaitForCallsStatusOptions<selectData>,\n): WaitForCallsStatusQueryOptions<selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(\n      options.id &&\n        options.connector?.getProvider &&\n        (options.query?.enabled ?? true),\n    ),\n    queryFn: async (context) => {\n      if (!options.connector?.getProvider)\n        throw new Error('connector is required')\n      const [, { connectorUid: _, scopeKey: __, ...parameters }] =\n        context.queryKey\n      if (!parameters.id) throw new Error('id is required')\n      const status = await waitForCallsStatus(config, {\n        ...parameters,\n        id: parameters.id,\n      })\n      return status\n    },\n    queryKey: waitForCallsStatusQueryKey(options),\n  }\n}\n\nexport type WaitForCallsStatusQueryFnData = WaitForCallsStatusReturnType\n\nexport type WaitForCallsStatusData = WaitForCallsStatusQueryFnData\n\nexport function waitForCallsStatusQueryKey(\n  options: Compute<\n    ExactPartial<WaitForCallsStatusParameters> & ScopeKeyParameter\n  > = {},\n) {\n  return ['callsStatus', filterQueryOptions(options)] as const\n}\n\nexport type WaitForCallsStatusQueryKey = ReturnType<\n  typeof waitForCallsStatusQueryKey\n>\n\nexport type WaitForCallsStatusQueryOptions<\n  selectData = WaitForCallsStatusData,\n> = QueryOptions<\n  WaitForCallsStatusQueryFnData,\n  WaitForCallsStatusErrorType,\n  selectData,\n  WaitForCallsStatusQueryKey\n>\n"
  },
  {
    "path": "packages/core/src/query/waitForTransactionReceipt.test-d.ts",
    "content": "import { http } from 'viem'\nimport { mainnet, zkSync } from 'viem/chains'\nimport type { ZkSyncL2ToL1Log, ZkSyncLog } from 'viem/zksync'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { createConfig } from '../createConfig.js'\nimport { waitForTransactionReceiptQueryOptions } from './waitForTransactionReceipt.js'\n\nconst context = {} as any\n\ntest('chain formatters', async () => {\n  const config = createConfig({\n    chains: [mainnet, zkSync],\n    transports: { [mainnet.id]: http(), [zkSync.id]: http() },\n  })\n  const options = waitForTransactionReceiptQueryOptions(config, {\n    hash: '0x123',\n  })\n  const result = await options.queryFn(context)\n  if (result.chainId === zkSync.id) {\n    expectTypeOf(result.l1BatchNumber).toEqualTypeOf<bigint | null>()\n    expectTypeOf(result.l1BatchTxIndex).toEqualTypeOf<bigint | null>()\n    expectTypeOf(result.logs).toEqualTypeOf<ZkSyncLog[]>()\n    expectTypeOf(result.l2ToL1Logs).toEqualTypeOf<ZkSyncL2ToL1Log[]>()\n  }\n  // @ts-expect-error\n  result.l1BatchNumber\n})\n\ntest('chainId', async () => {\n  const config = createConfig({\n    chains: [zkSync],\n    transports: { [zkSync.id]: http() },\n  })\n  const options = waitForTransactionReceiptQueryOptions(config, {\n    hash: '0x123',\n    chainId: zkSync.id,\n  })\n  const result = await options.queryFn(context)\n  expectTypeOf(result.l1BatchNumber).toEqualTypeOf<bigint | null>()\n  expectTypeOf(result.l1BatchTxIndex).toEqualTypeOf<bigint | null>()\n  expectTypeOf(result.logs).toEqualTypeOf<ZkSyncLog[]>()\n  expectTypeOf(result.l2ToL1Logs).toEqualTypeOf<ZkSyncL2ToL1Log[]>()\n})\n"
  },
  {
    "path": "packages/core/src/query/waitForTransactionReceipt.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { waitForTransactionReceiptQueryOptions } from './waitForTransactionReceipt.js'\n\ntest('default', () => {\n  expect(\n    waitForTransactionReceiptQueryOptions(config, {}),\n  ).toMatchInlineSnapshot(`\n    {\n      \"enabled\": false,\n      \"queryFn\": [Function],\n      \"queryKey\": [\n        \"waitForTransactionReceipt\",\n        {},\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/waitForTransactionReceipt.ts",
    "content": "import {\n  type WaitForTransactionReceiptErrorType,\n  type WaitForTransactionReceiptParameters,\n  type WaitForTransactionReceiptReturnType,\n  waitForTransactionReceipt,\n} from '../actions/waitForTransactionReceipt.js'\nimport type { Config } from '../createConfig.js'\nimport type { ScopeKeyParameter } from '../types/properties.js'\nimport type { QueryOptions, QueryParameter } from '../types/query.js'\nimport type { Compute, ExactPartial } from '../types/utils.js'\nimport { filterQueryOptions } from './utils.js'\n\nexport type WaitForTransactionReceiptOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = WaitForTransactionReceiptData<config, chainId>,\n> = Compute<\n  ExactPartial<WaitForTransactionReceiptParameters<config, chainId>> &\n    ScopeKeyParameter\n> &\n  QueryParameter<\n    WaitForTransactionReceiptQueryFnData<config, chainId>,\n    WaitForTransactionReceiptErrorType,\n    selectData,\n    WaitForTransactionReceiptQueryKey<config, chainId>\n  >\n\nexport function waitForTransactionReceiptQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = WaitForTransactionReceiptData<config, chainId>,\n>(\n  config: config,\n  options: WaitForTransactionReceiptOptions<config, chainId, selectData> = {},\n): WaitForTransactionReceiptQueryOptions<config, chainId, selectData> {\n  return {\n    ...options.query,\n    enabled: Boolean(options.hash && (options.query?.enabled ?? true)),\n    queryFn: async (context) => {\n      const [, { scopeKey: _, ...parameters }] = context.queryKey\n      if (!parameters.hash) throw new Error('hash is required')\n      return waitForTransactionReceipt(config, {\n        ...parameters,\n        onReplaced: options.onReplaced,\n        hash: parameters.hash,\n      }) as unknown as Promise<\n        WaitForTransactionReceiptReturnType<config, chainId>\n      >\n    },\n    queryKey: waitForTransactionReceiptQueryKey(options),\n  }\n}\n\nexport type WaitForTransactionReceiptQueryFnData<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = WaitForTransactionReceiptReturnType<config, chainId>\n\nexport type WaitForTransactionReceiptData<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = WaitForTransactionReceiptQueryFnData<config, chainId>\n\nexport function waitForTransactionReceiptQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n>(\n  options: Compute<\n    ExactPartial<WaitForTransactionReceiptParameters<config, chainId>> &\n      ScopeKeyParameter\n  > = {},\n) {\n  const { onReplaced: _, ...rest } = options\n  return ['waitForTransactionReceipt', filterQueryOptions(rest)] as const\n}\n\nexport type WaitForTransactionReceiptQueryKey<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = ReturnType<typeof waitForTransactionReceiptQueryKey<config, chainId>>\n\nexport type WaitForTransactionReceiptQueryOptions<\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  selectData = WaitForTransactionReceiptData<config, chainId>,\n> = QueryOptions<\n  WaitForTransactionReceiptQueryFnData<config, chainId>,\n  WaitForTransactionReceiptErrorType,\n  selectData,\n  WaitForTransactionReceiptQueryKey<config, chainId>\n>\n"
  },
  {
    "path": "packages/core/src/query/watchAsset.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { watchAssetMutationOptions } from './watchAsset.js'\n\ntest('default', () => {\n  expect(watchAssetMutationOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"mutationFn\": [Function],\n      \"mutationKey\": [\n        \"watchAsset\",\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/watchAsset.ts",
    "content": "import type { MutationOptions } from '@tanstack/query-core'\nimport {\n  type WatchAssetErrorType,\n  type WatchAssetParameters,\n  type WatchAssetReturnType,\n  watchAsset,\n} from '../actions/watchAsset.js'\nimport type { Config } from '../createConfig.js'\nimport type { MutationParameter } from '../types/query.js'\nimport type { Compute } from '../types/utils.js'\nimport type { Mutate, MutateAsync } from './types.js'\n\nexport type WatchAssetOptions<context = unknown> = MutationParameter<\n  WatchAssetData,\n  WatchAssetErrorType,\n  WatchAssetVariables,\n  context\n>\n\nexport function watchAssetMutationOptions<context>(\n  config: Config,\n  options: WatchAssetOptions<context> = {},\n): WatchAssetMutationOptions {\n  return {\n    ...(options.mutation as any),\n    mutationFn(variables) {\n      return watchAsset(config, variables)\n    },\n    mutationKey: ['watchAsset'],\n  }\n}\n\nexport type WatchAssetMutationOptions = MutationOptions<\n  WatchAssetData,\n  WatchAssetErrorType,\n  WatchAssetVariables\n>\n\nexport type WatchAssetData = WatchAssetReturnType\n\nexport type WatchAssetVariables = Compute<WatchAssetParameters>\n\nexport type WatchAssetMutate<context = unknown> = Mutate<\n  WatchAssetData,\n  WatchAssetErrorType,\n  WatchAssetVariables,\n  context\n>\n\nexport type WatchAssetMutateAsync<context = unknown> = MutateAsync<\n  WatchAssetData,\n  WatchAssetErrorType,\n  WatchAssetVariables,\n  context\n>\n"
  },
  {
    "path": "packages/core/src/query/writeContract.test-d.ts",
    "content": "import { http } from 'viem'\nimport { writeContract } from 'viem/actions'\nimport { base } from 'viem/chains'\nimport { test } from 'vitest'\n\nimport { createConfig } from '../createConfig.js'\nimport type { WriteContractMutate } from './writeContract.js'\n\n// https://github.com/wevm/wagmi/issues/3981\ntest('gh#3981', () => {\n  const config = createConfig({\n    chains: [base],\n    transports: {\n      [base.id]: http(),\n    },\n  })\n\n  const abi = [\n    {\n      type: 'function',\n      name: 'example1',\n      inputs: [\n        { name: 'exampleName', type: 'address', internalType: 'address' },\n      ],\n      outputs: [],\n      stateMutability: 'payable',\n    },\n    {\n      type: 'function',\n      name: 'example2',\n      inputs: [\n        { name: 'exampleName', type: 'address', internalType: 'address' },\n      ],\n      outputs: [],\n      stateMutability: 'nonpayable',\n    },\n  ] as const\n\n  const write: WriteContractMutate<typeof config> = () => {}\n  write({\n    abi,\n    address: '0x...',\n    functionName: 'example1',\n    args: ['0x...'],\n    value: 123n,\n  })\n  write({\n    abi: [\n      {\n        type: 'function',\n        name: 'example1',\n        inputs: [\n          { name: 'exampleName', type: 'address', internalType: 'address' },\n        ],\n        outputs: [],\n        stateMutability: 'payable',\n      },\n      {\n        type: 'function',\n        name: 'example2',\n        inputs: [\n          { name: 'exampleName', type: 'address', internalType: 'address' },\n        ],\n        outputs: [],\n        stateMutability: 'nonpayable',\n      },\n    ] as const,\n    address: '0x...',\n    functionName: 'example1',\n    args: ['0x...'],\n    value: 123n,\n  })\n\n  write({\n    abi,\n    address: '0x...',\n    functionName: 'example2',\n    args: ['0x...'],\n    // @ts-expect-error\n    value: 123n,\n  })\n  write({\n    abi: [\n      {\n        type: 'function',\n        name: 'example1',\n        inputs: [\n          { name: 'exampleName', type: 'address', internalType: 'address' },\n        ],\n        outputs: [],\n        stateMutability: 'payable',\n      },\n      {\n        type: 'function',\n        name: 'example2',\n        inputs: [\n          { name: 'exampleName', type: 'address', internalType: 'address' },\n        ],\n        outputs: [],\n        stateMutability: 'nonpayable',\n      },\n    ],\n    address: '0x...',\n    functionName: 'example1',\n    args: ['0x...'],\n    value: 123n,\n  })\n\n  const client = config.getClient({ chainId: base.id })\n  writeContract(client, {\n    abi,\n    address: '0x...',\n    account: '0x...',\n    functionName: 'example1',\n    args: ['0x...'],\n    value: 123n,\n  })\n  writeContract(client, {\n    abi: [\n      {\n        type: 'function',\n        name: 'example1',\n        inputs: [\n          { name: 'exampleName', type: 'address', internalType: 'address' },\n        ],\n        outputs: [],\n        stateMutability: 'payable',\n      },\n      {\n        type: 'function',\n        name: 'example2',\n        inputs: [\n          { name: 'exampleName', type: 'address', internalType: 'address' },\n        ],\n        outputs: [],\n        stateMutability: 'nonpayable',\n      },\n    ] as const,\n    address: '0x...',\n    account: '0x...',\n    functionName: 'example1',\n    args: ['0x...'],\n    value: 123n,\n  })\n})\n"
  },
  {
    "path": "packages/core/src/query/writeContract.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expect, test } from 'vitest'\n\nimport { writeContractMutationOptions } from './writeContract.js'\n\ntest('default', () => {\n  expect(writeContractMutationOptions(config)).toMatchInlineSnapshot(`\n    {\n      \"mutationFn\": [Function],\n      \"mutationKey\": [\n        \"writeContract\",\n      ],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/query/writeContract.ts",
    "content": "import type { MutateOptions, MutationOptions } from '@tanstack/query-core'\nimport type { Abi, ContractFunctionArgs, ContractFunctionName } from 'viem'\nimport {\n  type WriteContractErrorType,\n  type WriteContractParameters,\n  type WriteContractReturnType,\n  writeContract,\n} from '../actions/writeContract.js'\nimport type { Config } from '../createConfig.js'\nimport type { MutationParameter } from '../types/query.js'\nimport type { Compute } from '../types/utils.js'\n\nexport type WriteContractOptions<\n  config extends Config,\n  context = unknown,\n> = MutationParameter<\n  WriteContractData,\n  WriteContractErrorType,\n  WriteContractVariables<\n    Abi,\n    string,\n    readonly unknown[],\n    config,\n    config['chains'][number]['id']\n  >,\n  context\n>\n\nexport function writeContractMutationOptions<config extends Config, context>(\n  config: config,\n  options: WriteContractOptions<config, context> = {},\n): WriteContractMutationOptions<config> {\n  return {\n    ...(options.mutation as any),\n    mutationFn(variables) {\n      return writeContract(config, variables)\n    },\n    mutationKey: ['writeContract'],\n  }\n}\n\nexport type WriteContractMutationOptions<config extends Config> =\n  MutationOptions<\n    WriteContractData,\n    WriteContractErrorType,\n    WriteContractVariables<\n      Abi,\n      string,\n      readonly unknown[],\n      config,\n      config['chains'][number]['id']\n    >\n  >\n\nexport type WriteContractData = Compute<WriteContractReturnType>\n\nexport type WriteContractVariables<\n  abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  >,\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  ///\n  allFunctionNames = ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n> = WriteContractParameters<\n  abi,\n  functionName,\n  args,\n  config,\n  chainId,\n  allFunctionNames\n>\n\nexport type WriteContractMutate<config extends Config, context = unknown> = <\n  const abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  >,\n  chainId extends config['chains'][number]['id'],\n>(\n  variables: WriteContractVariables<abi, functionName, args, config, chainId>,\n  options?:\n    | MutateOptions<\n        WriteContractData,\n        WriteContractErrorType,\n        WriteContractVariables<\n          abi,\n          functionName,\n          args,\n          config,\n          chainId,\n          // use `functionName` to make sure it's not union of all possible function names\n          functionName\n        >,\n        context\n      >\n    | undefined,\n) => void\n\nexport type WriteContractMutateAsync<\n  config extends Config,\n  context = unknown,\n> = <\n  const abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  >,\n  chainId extends config['chains'][number]['id'],\n>(\n  variables: WriteContractVariables<abi, functionName, args, config, chainId>,\n  options?:\n    | MutateOptions<\n        WriteContractData,\n        WriteContractErrorType,\n        WriteContractVariables<\n          abi,\n          functionName,\n          args,\n          config,\n          chainId,\n          // use `functionName` to make sure it's not union of all possible function names\n          functionName\n        >,\n        context\n      >\n    | undefined,\n) => Promise<WriteContractData>\n"
  },
  {
    "path": "packages/core/src/query/writeContractSync.ts",
    "content": "import type { MutateOptions, MutationOptions } from '@tanstack/query-core'\nimport type { Abi, ContractFunctionArgs, ContractFunctionName } from 'viem'\nimport {\n  type WriteContractSyncErrorType,\n  type WriteContractSyncParameters,\n  type WriteContractSyncReturnType,\n  writeContractSync,\n} from '../actions/writeContractSync.js'\nimport type { Config } from '../createConfig.js'\nimport type { MutationParameter } from '../types/query.js'\nimport type { Compute } from '../types/utils.js'\n\nexport type WriteContractSyncOptions<\n  config extends Config,\n  context = unknown,\n> = MutationParameter<\n  WriteContractSyncData,\n  WriteContractSyncErrorType,\n  WriteContractSyncVariables<\n    Abi,\n    string,\n    readonly unknown[],\n    config,\n    config['chains'][number]['id']\n  >,\n  context\n>\n\nexport function writeContractSyncMutationOptions<\n  config extends Config,\n  context,\n>(\n  config: config,\n  options: WriteContractSyncOptions<config, context> = {},\n): WriteContractSyncMutationOptions<config> {\n  return {\n    ...(options.mutation as any),\n    mutationFn(variables) {\n      return writeContractSync(config, variables)\n    },\n    mutationKey: ['writeContractSync'],\n  }\n}\n\nexport type WriteContractSyncMutationOptions<config extends Config> =\n  MutationOptions<\n    WriteContractSyncData,\n    WriteContractSyncErrorType,\n    WriteContractSyncVariables<\n      Abi,\n      string,\n      readonly unknown[],\n      config,\n      config['chains'][number]['id']\n    >\n  >\n\nexport type WriteContractSyncData = Compute<WriteContractSyncReturnType>\n\nexport type WriteContractSyncVariables<\n  abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  >,\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n> = WriteContractSyncParameters<abi, functionName, args, config, chainId>\n\nexport type WriteContractSyncMutate<\n  config extends Config,\n  context = unknown,\n> = <\n  const abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  >,\n  chainId extends config['chains'][number]['id'],\n>(\n  variables: WriteContractSyncVariables<\n    abi,\n    functionName,\n    args,\n    config,\n    chainId\n  >,\n  options?:\n    | MutateOptions<\n        WriteContractSyncData,\n        WriteContractSyncErrorType,\n        WriteContractSyncVariables<abi, functionName, args, config, chainId>,\n        context\n      >\n    | undefined,\n) => void\n\nexport type WriteContractSyncMutateAsync<\n  config extends Config,\n  context = unknown,\n> = <\n  const abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  >,\n  chainId extends config['chains'][number]['id'],\n>(\n  variables: WriteContractSyncVariables<\n    abi,\n    functionName,\n    args,\n    config,\n    chainId\n  >,\n  options?:\n    | MutateOptions<\n        WriteContractSyncData,\n        WriteContractSyncErrorType,\n        WriteContractSyncVariables<abi, functionName, args, config, chainId>,\n        context\n      >\n    | undefined,\n) => Promise<WriteContractSyncData>\n"
  },
  {
    "path": "packages/core/src/tempo/AGENTS.md",
    "content": "# Agent Guidelines\n\nAgent guidance for `@wagmi/core/tempo`.\n\n> **Communication Style**: Be brief, concise. Maximize information density, minimize tokens. Incomplete sentences acceptable when clear. Remove filler words. Prioritize clarity over grammar.\n\n## Code Generation\n\n### Wagmi Actions\n\nWhen generating Wagmi actions (in `actions/`), follow these guidelines.\n\nAn example of a generated action set can be found in `actions/fee.ts`.\n\n#### Source of Truth\n\n- **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`)\n- Wagmi actions are wrappers around Viem actions that integrate with Wagmi's config and TanStack Query\n\n#### Documentation Requirements\n\nAll actions **must include comprehensive TSDoc** with:\n\n1. **Function description** - What the action does\n2. **`@example` block** - Complete working example showing:\n   - Required imports (`createConfig`, `http`, action imports)\n   - Config setup with chains and transports\n   - Action usage with realistic parameters\n   - Expected return value handling (if applicable)\n3. **`@param` tags** - For each parameter (config, parameters)\n4. **`@returns` tag** - Description of the return value\n\nExample:\n```ts\n/**\n * Gets the user's default fee token.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const token = await Actions.fee.getUserToken(config, {\n *   account: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The user's fee token address.\n */\n```\n\n#### Action Types\n\n##### Query-based Actions (Read-Only)\n\nFor read-only actions that fetch data:\n\n- Return the result from the corresponding Viem action\n- Parameters include `ChainIdParameter<config>` and the Viem action's parameters\n- Must include query utilities for TanStack Query integration\n\n```ts\nexport function myAction<config extends Config>(\n  config: config,\n  parameters: myAction.Parameters<config>,\n): Promise<myAction.ReturnValue<config>> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return viem_Actions.myAction(client, rest)\n}\n```\n\n##### Mutation-based Actions (Write)\n\nFor state-changing actions, both variants must be implemented:\n\n**1. Standard Variant**\n\n- Uses `getConnectorClient` to get the wallet client\n- Returns the result from the corresponding Viem action\n- Does not wait for transaction confirmation\n\n```ts\nexport async function myAction<config extends Config>(\n  config: config,\n  parameters: myAction.Parameters<config>,\n): Promise<myAction.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return viem_Actions.myAction(\n    client,\n    parameters as viem_Actions.myAction.Parameters,\n  )\n}\n```\n\n**2. Sync Variant (`*Sync`)**\n\n- Named with `Sync` suffix (e.g., `setUserTokenSync`)\n- Uses `getConnectorClient` to get the wallet client\n- Waits for transaction inclusion on a block before returning a response\n- Returns both the receipt and extracted event data\n\n```ts\nexport async function myActionSync<config extends Config>(\n  config: config,\n  parameters: myActionSync.Parameters<config>,\n): Promise<myActionSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return viem_Actions.myActionSync(\n    client,\n    parameters as viem_Actions.myActionSync.Parameters,\n  )\n}\n```\n\n#### Namespace Properties\n\n##### Query-based Actions\n\nAll query-based actions must include the following components:\n\n- Include `enabled` logic to disable the query when required reactive parameters (e.g. addresses) are undefined\n- The `enabled` conditional must check ALL required reactive parameters (e.g., `account && spender` for allowance checks)\n- If there isn't an `ErrorType` for the Viem Action, use `import { BaseError } from 'viem'`\n\n```ts\nimport { filterQueryOptions } from './utils.js'\nimport type { QueryOptions, QueryParameter } from './utils.js'\n\nexport function myAction<config extends Config>(\n  config: config,\n  parameters: myAction.Parameters<config>,\n): Promise<myAction.ReturnValue> { ... }\n\nexport namespace myAction {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    viem_Actions.myAction.Parameters\n\n  export type ReturnValue = viem_Actions.myAction.ReturnValue\n\n  export type ErrorType = viem_Actions.myAction.ErrorType\n\n  export function queryKey<config extends Config>(\n    parameters: Parameters<config>,\n  ) {\n    return ['myAction', filterQueryOptions(parameters)] as const\n  }\n\n  export type QueryKey<config extends Config> = ReturnType<\n    typeof queryKey<config>\n  >\n\n  export function queryOptions<config extends Config, selectData = ReturnValue>(\n    config: Config,\n    parameters: queryOptions.Parameters<config, selectData>,\n  ): queryOptions.ReturnValue<config, selectData> {\n    const { query, ...rest } = parameters\n    return {\n      ...query,\n      enabled: Boolean(rest.account && (query?.enabled ?? true)),\n      queryKey: queryKey(rest),\n      async queryFn(context) {\n        const [, parameters] = context.queryKey\n        return await myAction(config, parameters)\n      },\n    }\n  }\n\n  export declare namespace queryOptions {\n    export type Parameters<\n      config extends Config,\n      selectData = myAction.ReturnValue,\n    > = myAction.Parameters<config> &\n      QueryParameter<\n        myAction.ReturnValue,\n        myAction.ErrorType,\n        selectData,\n        myAction.QueryKey<config>\n      >\n\n    export type ReturnValue<\n      config extends Config,\n      selectData = myAction.ReturnValue,\n    > = QueryOptions<\n      myAction.ReturnValue,\n      myAction.ErrorType,\n      selectData,\n      myAction.QueryKey<config>\n    >\n  }\n}\n```\n\n##### Mutation-based Actions\n\nAll mutation-based actions must include the following components:\n\n- If there isn't an `ErrorType` for the Viem Action, use `import { BaseError } from 'viem'`\n\n```ts\nexport async function myAction<config extends Config>(\n  config: config,\n  parameters: myAction.Parameters<config>,\n): Promise<myAction.ReturnValue> { ... }\n\nexport declare namespace myAction {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    Omit<viem_Actions.myAction.Parameters<undefined, Account>, 'chain'>\n\n  export type ReturnValue = viem_Actions.myAction.ReturnValue\n\n  export type ErrorType = viem_Actions.myAction.ErrorType\n}\n\nexport declare namespace myActionSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    Omit<viem_Actions.myActionSync.Parameters<undefined, Account>, 'chain'>\n\n  export type ReturnValue = viem_Actions.myActionSync.ReturnValue\n\n  export type ErrorType = viem_Actions.myActionSync.ErrorType\n}\n```\n\n#### Testing\n\nTests should be co-located with actions in `*action-name*.test.ts` files.\n\n**Important**: Wagmi action tests should follow the same test flows as the corresponding Viem action tests in `src/tempo/actions/`. This includes:\n- Setting up the same initial state (creating tokens, granting roles, minting tokens, etc.)\n- Testing the same behaviors and edge cases\n- Using the same test data and assertions where applicable\n\nThe 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.\n\nSee `actions/token.test.ts` for a comprehensive example of test patterns and structure.\n\n##### Test Structure\n\nOrganize tests by action name with a default test case. Use namespace imports for cleaner code:\n\n```ts\nimport { connect } from '@wagmi/core'\nimport { accounts,  config, queryClient } from '@wagmi/test/tempo'\nimport { describe, expect, test } from 'vitest'\nimport * as myNamespace from './myNamespace.js'\n\nconst account = accounts[0]\n\n// Query-based actions\ndescribe('myAction', () => {\n  test('default', async () => {\n    const result = await myNamespace.myAction(config, {\n      // ...\n    })\n    expect(result).toMatchInlineSnapshot(`...`)\n  })\n\n  describe('queryOptions', () => {\n    test('default', async () => {\n      const options = myNamespace.myAction.queryOptions(config, {\n        // ...\n      })\n      expect(await queryClient.fetchQuery(options)).toMatchInlineSnapshot(`...`)\n    })\n  })\n})\n\n// Mutation-based actions\ndescribe('myAction', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n    \n    // Include any necessary setup from the corresponding viem test\n    // e.g., create tokens, grant roles, mint tokens, etc.\n    \n    const hash = await myNamespace.myAction(config, {\n      // ... (no account parameter needed)\n    })\n    expect(hash).toBeDefined()\n  })\n})\n\ndescribe('myActionSync', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n    \n    // Include any necessary setup from the corresponding viem test\n    \n    const result = await myNamespace.myActionSync(config, {\n      // ... (no account parameter needed)\n    })\n    expect(result).toBeDefined()\n  })\n})\n```\n"
  },
  {
    "path": "packages/core/src/tempo/Connectors.test.ts",
    "content": "/// <reference types=\"@vitest/browser-playwright\" />\nimport { createConfig, createStorage } from '@wagmi/core'\nimport { KeyManager, webAuthn } from '@wagmi/core/tempo'\nimport { tempoLocal } from '@wagmi/test/tempo'\nimport { http } from 'viem'\nimport { describe, expect, test } from 'vitest'\nimport { cdp } from 'vitest/browser'\n\nasync function setupWebAuthn() {\n  const client = cdp()\n  await client.send('WebAuthn.enable')\n  const result = await client.send('WebAuthn.addVirtualAuthenticator', {\n    options: {\n      protocol: 'ctap2',\n      transport: 'internal',\n      hasResidentKey: true,\n      hasUserVerification: true,\n      isUserVerified: true,\n      automaticPresenceSimulation: true,\n    },\n  })\n  return async () => {\n    const client = cdp()\n    await client.send('WebAuthn.removeVirtualAuthenticator', {\n      authenticatorId: result.authenticatorId,\n    })\n    await client.send('WebAuthn.disable')\n  }\n}\n\ndescribe('webAuthn', () => {\n  describe('sign-up with grantAccessKey', () => {\n    test('passes chainId to signKeyAuthorization', async (context) => {\n      const cleanup = await setupWebAuthn()\n      context.onTestFinished(async () => await cleanup())\n\n      const storage = createStorage({ storage: localStorage })\n      const config = createConfig({\n        chains: [tempoLocal],\n        connectors: [],\n        storage,\n        transports: {\n          [tempoLocal.id]: http(),\n        },\n      })\n\n      const connector = config._internal.connectors.setup(\n        webAuthn({\n          grantAccessKey: true,\n          keyManager: KeyManager.localStorage(),\n        }),\n      )\n\n      const chainId = tempoLocal.id\n\n      const result = await connector.connect({\n        capabilities: { type: 'sign-up', label: 'ChainId Test' },\n        chainId,\n      })\n\n      expect(result.chainId).toBe(chainId)\n\n      // Retrieve the pending key authorization from storage to verify chainId.\n      // The connector stores it at `pendingKeyAuthorization:<address>`.\n      const address = (result.accounts as readonly string[])[0]!.toLowerCase()\n      const keyAuth = await storage.getItem(\n        `pendingKeyAuthorization:${address}` as any,\n      )\n\n      expect(keyAuth).toBeDefined()\n      // The key authorization should include the chainId passed during connect.\n      // KeyAuthorization stores chainId as bigint.\n      expect(BigInt((keyAuth as any).chainId)).toBe(BigInt(chainId))\n    })\n  })\n})\n"
  },
  {
    "path": "packages/core/src/tempo/Connectors.ts",
    "content": "import * as Address from 'ox/Address'\nimport type * as Hex from 'ox/Hex'\nimport * as PublicKey from 'ox/PublicKey'\nimport { KeyAuthorization, SignatureEnvelope } from 'ox/tempo'\nimport {\n  createClient,\n  defineChain,\n  type EIP1193Provider,\n  getAddress,\n  SwitchChainError,\n} from 'viem'\nimport {\n  generatePrivateKey,\n  type LocalAccount,\n  privateKeyToAccount,\n} from 'viem/accounts'\nimport {\n  Account,\n  WebAuthnP256,\n  WebCryptoP256,\n  walletNamespaceCompat,\n} from 'viem/tempo'\nimport { createConnector } from '../connectors/createConnector.js'\nimport { ChainNotConfiguredError } from '../errors/config.js'\nimport type { OneOf } from '../types/utils.js'\nimport type * as KeyManager from './KeyManager.js'\n\n/** @deprecated use `webAuthn.Parameters` instead */\nexport type WebAuthnParameters = webAuthn.Parameters\n\nwebAuthn.type = 'webAuthn' as const\n\n/**\n * Connector for a WebAuthn EOA.\n */\nexport function webAuthn(options: webAuthn.Parameters) {\n  let account: Account.RootAccount | undefined\n  let accessKey: Account.AccessKeyAccount | undefined\n\n  const defaultAccessKeyOptions = {\n    expiry: Math.floor(\n      (Date.now() + 24 * 60 * 60 * 1000) / 1000, // one day\n    ),\n    strict: false,\n  }\n  const accessKeyOptions = (() => {\n    if (typeof options.grantAccessKey === 'object')\n      return { ...defaultAccessKeyOptions, ...options.grantAccessKey }\n    if (options.grantAccessKey === true) return defaultAccessKeyOptions\n    return undefined\n  })()\n\n  type Properties = {\n    // TODO(v3): Make `withCapabilities: true` default behavior\n    connect<withCapabilities extends boolean = false>(parameters: {\n      chainId?: number | undefined\n      capabilities?:\n        | (OneOf<\n            | {\n                label?: string | undefined\n                type: 'sign-up'\n              }\n            | {\n                selectAccount?: boolean | undefined\n                type: 'sign-in'\n              }\n            | {\n                type?: undefined\n              }\n          > & {\n            credential?: { id: string; publicKey: Hex.Hex } | undefined\n            sign?:\n              | {\n                  hash: Hex.Hex\n                }\n              | undefined\n          })\n        | undefined\n      isReconnecting?: boolean | undefined\n      withCapabilities?: withCapabilities | boolean | undefined\n    }): Promise<{\n      accounts: withCapabilities extends true\n        ? readonly {\n            address: Address.Address\n            capabilities: { signature?: Hex.Hex | undefined }\n          }[]\n        : readonly Address.Address[]\n      chainId: number\n    }>\n  }\n  type Provider = Pick<EIP1193Provider, 'request'>\n  type StorageItem = {\n    [\n      key: `pendingKeyAuthorization:${string}`\n    ]: KeyAuthorization.KeyAuthorization\n    'webAuthn.activeCredential': WebAuthnP256.P256Credential\n    'webAuthn.lastActiveCredential': WebAuthnP256.P256Credential\n  }\n\n  return createConnector<Provider, Properties, StorageItem>((config) => ({\n    id: 'webAuthn',\n    name: 'EOA (WebAuthn)',\n    type: 'webAuthn',\n    async setup() {\n      const credential = await config.storage?.getItem(\n        'webAuthn.activeCredential',\n      )\n      if (!credential) return\n      account = Account.fromWebAuthnP256(credential, {\n        rpId: options.getOptions?.rpId ?? options.rpId,\n      })\n    },\n    async connect(parameters = {}) {\n      const capabilities =\n        'capabilities' in parameters ? (parameters.capabilities ?? {}) : {}\n      const signHash =\n        'sign' in capabilities ? capabilities.sign?.hash : undefined\n\n      // Fast path: if a credential is provided directly, use it.\n      if ('credential' in capabilities && capabilities.credential) {\n        const credential =\n          capabilities.credential as WebAuthnP256.P256Credential\n        config.storage?.setItem(\n          'webAuthn.activeCredential',\n          normalizeValue(credential),\n        )\n        config.storage?.setItem(\n          'webAuthn.lastActiveCredential',\n          normalizeValue(credential),\n        )\n        account = Account.fromWebAuthnP256(credential, {\n          rpId: options.getOptions?.rpId ?? options.rpId,\n        })\n        const address = getAddress(account.address)\n        const chainId = parameters.chainId ?? config.chains[0]?.id\n        if (!chainId) throw new ChainNotConfiguredError()\n        return {\n          accounts: (parameters.withCapabilities\n            ? [{ address }]\n            : [address]) as never,\n          chainId,\n        }\n      }\n\n      if (\n        accessKeyOptions?.strict &&\n        accessKeyOptions.expiry &&\n        accessKeyOptions.expiry < Date.now() / 1000\n      )\n        throw new Error(\n          `\\`grantAccessKey.expiry = ${accessKeyOptions.expiry}\\` is in the past (${new Date(accessKeyOptions.expiry * 1000).toLocaleString()}). Please provide a valid expiry.`,\n        )\n\n      // We are going to need to find:\n      // - a WebAuthn `credential` to instantiate an account\n      // - optionally, a `keyPair` to use as the access key for the account\n      // - optionally, a signed `keyAuthorization` to provision the access key\n      const {\n        credential,\n        keyAuthorization,\n        keyPair,\n        signature: signedHash,\n      } = await (async () => {\n        // If the connection type is of \"sign-up\", we are going to create a new credential\n        // and provision an access key (if needed).\n        if (capabilities.type === 'sign-up') {\n          // Create credential (sign up)\n          const createOptions_remote = await options.keyManager.getChallenge?.()\n          const label =\n            capabilities.label ??\n            options.createOptions?.label ??\n            new Date().toISOString()\n          const rpId =\n            createOptions_remote?.rp?.id ??\n            options.createOptions?.rpId ??\n            options.rpId\n          const credential = await WebAuthnP256.createCredential({\n            ...(options.createOptions ?? {}),\n            label,\n            rpId,\n            ...(createOptions_remote ?? {}),\n          })\n          await options.keyManager.setPublicKey({\n            credential: credential.raw,\n            publicKey: credential.publicKey,\n          })\n\n          // Get key pair (access key) to use for the account.\n          // Skip if signing a hash — access key provisioning is deferred.\n          const keyPair = await (async () => {\n            if (signHash) return undefined\n            if (!accessKeyOptions) return undefined\n            return await WebCryptoP256.createKeyPair()\n          })()\n\n          return { credential, keyPair, signature: undefined }\n        }\n\n        // If we are not selecting an account, we will check if an active credential is present in\n        // storage and if so, we will use it to instantiate an account.\n        if (!capabilities.selectAccount) {\n          const credential = (await config.storage?.getItem(\n            'webAuthn.activeCredential',\n          )) as WebAuthnP256.getCredential.ReturnValue | undefined\n\n          if (credential) {\n            // If signing a hash, skip local keypair checks and return\n            // the stored credential — the hash will be signed via\n            // `account.sign` since `createCredential` cannot sign.\n            if (signHash)\n              return { credential, keyPair: undefined, signature: undefined }\n\n            // Get key pair (access key) to use for the account.\n            const keyPair = await (async () => {\n              if (!accessKeyOptions) return undefined\n              const address = Address.fromPublicKey(\n                PublicKey.fromHex(credential.publicKey),\n              )\n              return await idb.get(`accessKey:${address}`)\n            })()\n\n            // If the access key provisioning is not in strict mode, return the credential and key pair (if exists).\n            if (!accessKeyOptions?.strict)\n              return { credential, keyPair, signature: undefined }\n\n            // If a key pair is found, return the credential and key pair.\n            if (keyPair) return { credential, keyPair, signature: undefined }\n\n            // If we are reconnecting, throw an error if not found.\n            if (parameters.isReconnecting)\n              throw new Error('credential not found.')\n\n            // Otherwise, we want to continue to sign up or register against new key pair.\n          }\n        }\n\n        // Discover credential\n        {\n          // Get key pair (access key) to use for the account.\n          // Skip if signing a hash — access key provisioning is deferred.\n          const keyPair = await (async () => {\n            if (signHash) return undefined\n            if (!accessKeyOptions) return undefined\n            return await WebCryptoP256.createKeyPair()\n          })()\n\n          // If we are provisioning an access key, we will need to sign a key authorization.\n          // We will need the hash (digest) to sign, and the address of the access key to construct the key authorization.\n          const { hash, keyAuthorization_unsigned } = await (async () => {\n            const accessKeyAddress = keyPair\n              ? Address.fromPublicKey(keyPair.publicKey)\n              : undefined\n\n            if (!accessKeyAddress)\n              return { keyAuthorization_unsigned: undefined, hash: undefined }\n\n            const chainId = parameters.chainId ?? config.chains[0]?.id\n            const keyAuthorization_unsigned = KeyAuthorization.from({\n              address: accessKeyAddress,\n              chainId: chainId ? BigInt(chainId) : undefined,\n              expiry: accessKeyOptions?.expiry,\n              strict: accessKeyOptions?.strict ?? false,\n              type: 'p256',\n            })\n            const hash = KeyAuthorization.getSignPayload(\n              keyAuthorization_unsigned,\n            )\n            return { keyAuthorization_unsigned, hash }\n          })()\n\n          // If no active credential, we will attempt to load the last active credential from storage.\n          const lastActiveCredential = !capabilities.selectAccount\n            ? await config.storage?.getItem('webAuthn.lastActiveCredential')\n            : undefined\n          const credential = await WebAuthnP256.getCredential({\n            ...(options.getOptions ?? {}),\n            credentialId: lastActiveCredential?.id,\n            async getPublicKey(credential) {\n              const publicKey = await options.keyManager.getPublicKey({\n                credential,\n              })\n              if (!publicKey) throw new Error('publicKey not found.')\n              return publicKey\n            },\n            hash: signHash ?? hash,\n            rpId: options.getOptions?.rpId ?? options.rpId,\n          })\n\n          const envelope = SignatureEnvelope.from({\n            metadata: credential.metadata,\n            signature: credential.signature,\n            publicKey: PublicKey.fromHex(credential.publicKey),\n            type: 'webAuthn',\n          })\n\n          const keyAuthorization = keyAuthorization_unsigned\n            ? KeyAuthorization.from({\n                ...keyAuthorization_unsigned,\n                signature: envelope,\n              })\n            : undefined\n\n          const signature =\n            signHash && !keyAuthorization_unsigned\n              ? SignatureEnvelope.serialize(envelope)\n              : undefined\n\n          return { credential, keyAuthorization, keyPair, signature }\n        }\n      })()\n\n      config.storage?.setItem(\n        'webAuthn.lastActiveCredential',\n        normalizeValue(credential),\n      )\n      config.storage?.setItem(\n        'webAuthn.activeCredential',\n        normalizeValue(credential),\n      )\n\n      account = Account.fromWebAuthnP256(credential, {\n        rpId: options.getOptions?.rpId ?? options.rpId,\n      })\n\n      let signature: Hex.Hex | undefined\n      if (signHash && !signedHash) {\n        signature = await account.sign({ hash: signHash })\n      } else if (signedHash) {\n        signature = signedHash\n      } else if (keyPair) {\n        accessKey = Account.fromWebCryptoP256(keyPair, {\n          access: account,\n        })\n\n        // If we are reconnecting, check if the access key is expired.\n        if (parameters.isReconnecting) {\n          if (\n            'keyAuthorization' in keyPair &&\n            keyPair.keyAuthorization.expiry &&\n            keyPair.keyAuthorization.expiry < Date.now() / 1000\n          ) {\n            // remove any pending key authorizations from storage.\n            await config?.storage?.removeItem(\n              `pendingKeyAuthorization:${account.address.toLowerCase()}`,\n            )\n\n            const message = `Access key expired (on ${new Date(keyPair.keyAuthorization.expiry * 1000).toLocaleString()}).`\n            accessKey = undefined\n\n            // if in strict mode, disconnect and throw an error.\n            if (accessKeyOptions?.strict) {\n              await this.disconnect()\n              throw new Error(message)\n            }\n            // otherwise, fall back to the root account.\n            // biome-ignore lint/suspicious/noConsole: notify\n            console.warn(`${message} Falling back to passkey.`)\n          }\n        }\n        // If we are not reconnecting, orchestrate the provisioning of the access key.\n        else {\n          const keyAuth =\n            keyAuthorization ??\n            (await account.signKeyAuthorization(accessKey, {\n              ...accessKeyOptions,\n              chainId: BigInt(parameters.chainId ?? config.chains[0]?.id ?? 0),\n            } as never))\n\n          await config?.storage?.setItem(\n            `pendingKeyAuthorization:${account.address.toLowerCase()}`,\n            keyAuth as never,\n          )\n          await idb.set(`accessKey:${account.address.toLowerCase()}`, {\n            ...keyPair,\n            keyAuthorization: keyAuth,\n          })\n        }\n        // If we are granting an access key and it is in strict mode, throw an error if the access key is not provisioned.\n      } else if (accessKeyOptions?.strict) {\n        await config.storage?.removeItem('webAuthn.activeCredential')\n        throw new Error('access key not found')\n      }\n\n      const address = getAddress(account.address)\n\n      const chainId = parameters.chainId ?? config.chains[0]?.id\n      if (!chainId) throw new ChainNotConfiguredError()\n\n      return {\n        accounts: (parameters.withCapabilities\n          ? [{ address, capabilities: { signature } }]\n          : [address]) as never,\n        chainId,\n      }\n    },\n    async disconnect() {\n      await config.storage?.removeItem('webAuthn.activeCredential')\n      config.emitter.emit('disconnect')\n      account = undefined\n    },\n    async getAccounts() {\n      if (!account) return []\n      return [getAddress(account.address)]\n    },\n    async getChainId() {\n      return config.chains[0]?.id!\n    },\n    async isAuthorized() {\n      try {\n        const accounts = await this.getAccounts()\n        return !!accounts.length\n      } catch (error) {\n        // biome-ignore lint/suspicious/noConsole: notify\n        console.error(\n          'Connector.webAuthn: Failed to check authorization',\n          error,\n        )\n        return false\n      }\n    },\n    async switchChain({ chainId }) {\n      const chain = config.chains.find((chain) => chain.id === chainId)\n      if (!chain) throw new SwitchChainError(new ChainNotConfiguredError())\n      return chain\n    },\n    onAccountsChanged() {},\n    onChainChanged(chain) {\n      const chainId = Number(chain)\n      config.emitter.emit('change', { chainId })\n    },\n    async onDisconnect() {\n      config.emitter.emit('disconnect')\n      account = undefined\n    },\n    async getClient({ chainId } = {}) {\n      const chain =\n        config.chains.find((x) => x.id === chainId) ?? config.chains[0]\n      if (!chain) throw new ChainNotConfiguredError()\n\n      const transports = config.transports\n      if (!transports) throw new ChainNotConfiguredError()\n\n      const transport = transports[chain.id]\n      if (!transport) throw new ChainNotConfiguredError()\n\n      const targetAccount = await (async () => {\n        if (!accessKey) return account\n        if (!account) throw new Error('account not found.')\n\n        const item = await idb.get(`accessKey:${account.address.toLowerCase()}`)\n        if (\n          item?.keyAuthorization.expiry &&\n          item.keyAuthorization.expiry < Date.now() / 1000\n        ) {\n          // remove any pending key authorizations from storage.\n          await config?.storage?.removeItem(\n            `pendingKeyAuthorization:${account.address.toLowerCase()}`,\n          )\n\n          const message = `Access key expired (on ${new Date(item.keyAuthorization.expiry * 1000).toLocaleString()}).`\n\n          // if in strict mode, disconnect and throw an error.\n          if (accessKeyOptions?.strict) {\n            await this.disconnect()\n            throw new Error(message)\n          }\n\n          // otherwise, fall back to the root account.\n          // biome-ignore lint/suspicious/noConsole: notify\n          console.warn(`${message} Falling back to passkey.`)\n          return account\n        }\n        return accessKey\n      })()\n      if (!targetAccount) throw new Error('account not found.')\n\n      const targetChain = defineChain({\n        ...chain,\n        prepareTransactionRequest: [\n          async (args, { phase }) => {\n            const keyAuthorization = await (async () => {\n              {\n                const keyAuthorization = (\n                  args as {\n                    keyAuthorization?:\n                      | KeyAuthorization.KeyAuthorization\n                      | undefined\n                  }\n                ).keyAuthorization\n                if (keyAuthorization) return keyAuthorization\n              }\n\n              const keyAuthorization = await config.storage?.getItem(\n                `pendingKeyAuthorization:${targetAccount?.address.toLowerCase()}`,\n              )\n              await config.storage?.removeItem(\n                `pendingKeyAuthorization:${targetAccount?.address.toLowerCase()}`,\n              )\n              return keyAuthorization\n            })()\n\n            const [prepareTransactionRequestFn, options] = (() => {\n              if (!chain.prepareTransactionRequest)\n                return [undefined, undefined]\n              if (typeof chain.prepareTransactionRequest === 'function')\n                return [chain.prepareTransactionRequest, undefined]\n              return chain.prepareTransactionRequest\n            })()\n\n            const request = await (async () => {\n              if (!prepareTransactionRequestFn) return {}\n              if (!options || options?.runAt?.includes(phase))\n                return await prepareTransactionRequestFn(args, { phase })\n              return {}\n            })()\n\n            return {\n              ...args,\n              ...request,\n              keyAuthorization,\n            }\n          },\n          {\n            runAt: [\n              'afterFillParameters',\n              'beforeFillParameters',\n              'beforeFillTransaction',\n            ],\n          },\n        ],\n      })\n\n      return createClient({\n        account: targetAccount,\n        chain: targetChain,\n        transport: walletNamespaceCompat(transport, {\n          account: targetAccount,\n        }),\n      })\n    },\n    async getProvider({ chainId } = {}) {\n      const { request } = await this.getClient!({ chainId })\n      return { request }\n    },\n  }))\n}\n\nexport namespace webAuthn {\n  export type Parameters = {\n    /** Options for WebAuthn registration. */\n    createOptions?:\n      | Pick<\n          WebAuthnP256.createCredential.Parameters,\n          'createFn' | 'label' | 'rpId' | 'userId' | 'timeout'\n        >\n      | undefined\n    /** Options for WebAuthn authentication. */\n    getOptions?:\n      | Pick<WebAuthnP256.getCredential.Parameters, 'getFn' | 'rpId'>\n      | undefined\n    /**\n     * Whether or not to grant an access key upon connection, and optionally, expiry + limits to assign to the key.\n     */\n    grantAccessKey?:\n      | boolean\n      | (Pick<KeyAuthorization.KeyAuthorization, 'expiry' | 'limits'> & {\n          /** Whether or not to throw an error and disconnect if the access key is not provisioned or is expired. */\n          strict?: boolean | undefined\n        })\n    /** Public key manager. */\n    keyManager: KeyManager.KeyManager\n    /** The RP ID to use for WebAuthn. */\n    rpId?: string | undefined\n  }\n}\n\n/**\n * Normalizes a value into a structured-clone compatible format.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/structuredClone\n */\nfunction normalizeValue<type>(value: type): type {\n  if (Array.isArray(value)) return value.map(normalizeValue) as never\n  if (typeof value === 'function') return undefined as never\n  if (typeof value !== 'object' || value === null) return value\n  if (Object.getPrototypeOf(value) !== Object.prototype)\n    try {\n      return structuredClone(value)\n    } catch {\n      return undefined as never\n    }\n\n  const normalized: Record<string, unknown> = {}\n  for (const [k, v] of Object.entries(value)) normalized[k] = normalizeValue(v)\n  return normalized as never\n}\n\n// Based on `idb-keyval`\n// https://github.com/jakearchibald/idb-keyval\nlet defaultGetStoreFunc:\n  | (<type>(\n      txMode: IDBTransactionMode,\n      callback: (store: IDBObjectStore) => type | PromiseLike<type>,\n    ) => Promise<type>)\n  | undefined\n\nconst idb = {\n  /**\n   * Get a value by its key.\n   *\n   * @param key\n   * @param customStore Method to get a custom store. Use with caution (see the docs).\n   */\n  get<type = any>(key: IDBValidKey): Promise<type | undefined> {\n    return this.defaultGetStore()('readonly', (store) =>\n      this.promisifyRequest(store.get(key)),\n    )\n  },\n  /**\n   * Set a value with a key.\n   *\n   * @param key\n   * @param value\n   * @param customStore Method to get a custom store. Use with caution (see the docs).\n   */\n  set(key: IDBValidKey, value: any): Promise<void> {\n    return this.defaultGetStore()('readwrite', (store) => {\n      store.put(value, key)\n      return this.promisifyRequest(store.transaction)\n    })\n  },\n  defaultGetStore() {\n    if (!defaultGetStoreFunc)\n      defaultGetStoreFunc = this.createStore('keyval-store', 'keyval')\n    return defaultGetStoreFunc\n  },\n  createStore(\n    dbName: string,\n    storeName: string,\n  ): NonNullable<typeof defaultGetStoreFunc> {\n    let dbp: Promise<IDBDatabase> | undefined\n\n    const getDB = () => {\n      if (dbp) return dbp\n      const request = indexedDB.open(dbName)\n      request.onupgradeneeded = () =>\n        request.result.createObjectStore(storeName)\n      dbp = this.promisifyRequest(request)\n\n      dbp.then(\n        (db) => {\n          // It seems like Safari sometimes likes to just close the connection.\n          // It's supposed to fire this event when that happens. Let's hope it does!\n          db.onclose = () => {\n            dbp = undefined\n          }\n        },\n        () => {},\n      )\n      return dbp\n    }\n\n    return (txMode, callback) =>\n      getDB().then((db) =>\n        callback(db.transaction(storeName, txMode).objectStore(storeName)),\n      )\n  },\n  promisifyRequest<type = undefined>(\n    request: IDBRequest<type> | IDBTransaction,\n  ): Promise<type> {\n    return new Promise<type>((resolve, reject) => {\n      // @ts-ignore - file size hacks\n      request.oncomplete = request.onsuccess = () => resolve(request.result)\n      // @ts-ignore - file size hacks\n      request.onabort = request.onerror = () => reject(request.error)\n    })\n  },\n}\n\n/** @deprecated use `dangerous_secp256k1.Parameters` instead */\nexport type Dangerous_Secp256k1Parameters = dangerous_secp256k1.Parameters\n\ndangerous_secp256k1.type = 'dangerous_secp256k1' as const\n\n/**\n * Connector for a Secp256k1 EOA.\n *\n * WARNING: NOT RECOMMENDED FOR PRODUCTION USAGE.\n * This connector stores private keys in clear text, and are bound to the session\n * length of the storage used.\n */\nexport function dangerous_secp256k1(\n  options: dangerous_secp256k1.Parameters = {},\n) {\n  let account: LocalAccount | undefined\n\n  type Properties = {\n    // TODO(v3): Make `withCapabilities: true` default behavior\n    connect<withCapabilities extends boolean = false>(parameters: {\n      capabilities?: { type?: 'sign-up' | undefined } | undefined\n      chainId?: number | undefined\n      isReconnecting?: boolean | undefined\n      withCapabilities?: withCapabilities | boolean | undefined\n    }): Promise<{\n      accounts: readonly Address.Address[]\n      chainId: number\n    }>\n  }\n  type Provider = Pick<EIP1193Provider, 'request'>\n  type StorageItem = {\n    'secp256k1.activeAddress': Address.Address\n    'secp256k1.lastActiveAddress': Address.Address\n    [key: `secp256k1.${string}.privateKey`]: Hex.Hex\n  }\n\n  return createConnector<Provider, Properties, StorageItem>((config) => ({\n    id: 'secp256k1',\n    name: 'EOA (Secp256k1)',\n    type: 'secp256k1',\n    async setup() {\n      const address = await config.storage?.getItem('secp256k1.activeAddress')\n      const privateKey = await config.storage?.getItem(\n        `secp256k1.${address}.privateKey`,\n      )\n      if (privateKey) account = privateKeyToAccount(privateKey)\n      else if (\n        address &&\n        options.account &&\n        Address.isEqual(address, options.account.address)\n      )\n        account = options.account\n    },\n    async connect(parameters = {}) {\n      const address = await (async () => {\n        if (\n          'capabilities' in parameters &&\n          parameters.capabilities?.type === 'sign-up'\n        ) {\n          const privateKey = generatePrivateKey()\n          const account = privateKeyToAccount(privateKey)\n          const address = account.address\n          await config.storage?.setItem(\n            `secp256k1.${address}.privateKey`,\n            privateKey,\n          )\n          await config.storage?.setItem('secp256k1.activeAddress', address)\n          await config.storage?.setItem('secp256k1.lastActiveAddress', address)\n          return address\n        }\n\n        const address = await config.storage?.getItem(\n          'secp256k1.lastActiveAddress',\n        )\n        const privateKey = await config.storage?.getItem(\n          `secp256k1.${address}.privateKey`,\n        )\n\n        if (privateKey) account = privateKeyToAccount(privateKey)\n        else if (options.account) {\n          account = options.account\n          await config.storage?.setItem(\n            'secp256k1.lastActiveAddress',\n            account.address,\n          )\n        }\n\n        if (!account) throw new Error('account not found.')\n\n        await config.storage?.setItem(\n          'secp256k1.activeAddress',\n          account.address,\n        )\n        return account.address\n      })()\n\n      const chainId = parameters.chainId ?? config.chains[0]?.id\n      if (!chainId) throw new ChainNotConfiguredError()\n\n      return {\n        accounts: (parameters.withCapabilities\n          ? [{ address }]\n          : [address]) as never,\n        chainId,\n      }\n    },\n    async disconnect() {\n      await config.storage?.removeItem('secp256k1.activeAddress')\n      account = undefined\n    },\n    async getAccounts() {\n      if (!account) return []\n      return [getAddress(account.address)]\n    },\n    async getChainId() {\n      return config.chains[0]?.id!\n    },\n    async isAuthorized() {\n      try {\n        const accounts = await this.getAccounts()\n        return !!accounts.length\n      } catch (error) {\n        // biome-ignore lint/suspicious/noConsole: notify\n        console.error(\n          'Connector.secp256k1: Failed to check authorization',\n          error,\n        )\n        return false\n      }\n    },\n    async switchChain({ chainId }) {\n      const chain = config.chains.find((chain) => chain.id === chainId)\n      if (!chain) throw new SwitchChainError(new ChainNotConfiguredError())\n      return chain\n    },\n    onAccountsChanged() {},\n    onChainChanged(chain) {\n      const chainId = Number(chain)\n      config.emitter.emit('change', { chainId })\n    },\n    async onDisconnect() {\n      config.emitter.emit('disconnect')\n      account = undefined\n    },\n    async getClient({ chainId } = {}) {\n      const chain =\n        config.chains.find((x) => x.id === chainId) ?? config.chains[0]\n      if (!chain) throw new ChainNotConfiguredError()\n\n      const transports = config.transports\n      if (!transports) throw new ChainNotConfiguredError()\n\n      const transport = transports[chain.id]\n      if (!transport) throw new ChainNotConfiguredError()\n\n      if (!account) throw new Error('account not found.')\n\n      return createClient({\n        account,\n        chain,\n        transport: walletNamespaceCompat(transport, {\n          account,\n        }),\n      })\n    },\n    async getProvider({ chainId } = {}) {\n      const { request } = await this.getClient!({ chainId })\n      return { request }\n    },\n  }))\n}\n\nexport declare namespace dangerous_secp256k1 {\n  export type Parameters = {\n    account?: LocalAccount | undefined\n  }\n}\n"
  },
  {
    "path": "packages/core/src/tempo/KeyManager.ts",
    "content": "import type { WebAuthnP256 } from 'ox'\nimport * as Base64 from 'ox/Base64'\nimport type * as Hex from 'ox/Hex'\nimport * as Json from 'ox/Json'\nimport {\n  type CreateStorageParameters,\n  createStorage,\n  type Storage,\n} from '../createStorage.js'\n\nexport type KeyManager = {\n  /** Function to fetch create options for WebAuthn. */\n  getChallenge?:\n    | (() => Promise<{\n        challenge: Hex.Hex\n        rp?: { id: string; name: string } | undefined\n      }>)\n    | undefined\n  /** Function to fetch the public key for a credential. */\n  getPublicKey: (parameters: {\n    credential: WebAuthnP256.P256Credential['raw']\n  }) => Promise<Hex.Hex>\n  /** Function to set the public key for a credential. */\n  setPublicKey: (parameters: {\n    credential: WebAuthnP256.P256Credential['raw']\n    publicKey: Hex.Hex\n  }) => Promise<void>\n}\n\n/** Instantiates a key manager. */\nexport function from<manager extends KeyManager>(manager: manager): manager {\n  return manager\n}\n\n/** Instantiates a key manager from a Storage instance. */\nexport function fromStorage(storage: Storage): KeyManager {\n  return from({\n    async getPublicKey(parameters) {\n      const publicKey = await storage.getItem(parameters.credential.id)\n      if (!publicKey) throw new Error('publicKey not found.')\n      return publicKey as Hex.Hex\n    },\n    async setPublicKey(parameters) {\n      await storage.setItem(parameters.credential.id, parameters.publicKey)\n    },\n  })\n}\n\n/**\n * Instantiates a key manager from a localStorage instance.\n *\n * WARNING: Do not use this in production.\n * This is because we are unable to extract a user's public key after the registration\n * process. If a user clears their storage, or visits the website on a different device,\n * they will not be able to access their account.\n *\n * Instead, we recommend to set up a remote store such as [`KeyManager.http`](#http) to register\n * public keys against their WebAuthn credential.\n *\n * @see {@link http}\n *\n * @deprecated\n */\nexport function localStorage(options: localStorage.Options = {}) {\n  const { key = 'wagmi.keyManager' } = options\n  const storage = createStorage({\n    ...options,\n    key,\n    storage: typeof window !== 'undefined' ? window.localStorage : undefined,\n  })\n  return fromStorage(storage)\n}\n\nexport namespace localStorage {\n  export type Options = Omit<CreateStorageParameters, 'storage'>\n}\n\n/**\n * Instantiates a key manager that uses HTTP endpoints for credential management.\n *\n * @example\n * ```tsx\n * import { KeyManager } from '@wagmi/core/tempo'\n *\n * const keyManager = KeyManager.http('https://api.example.com')\n * ```\n *\n * @param url - The URL to use for the HTTP endpoints.\n * @param options - Configuration options for HTTP endpoints.\n * @returns A KeyManager instance that uses HTTP for credential operations.\n */\nexport function http(\n  url:\n    | string\n    | {\n        getChallenge?: string | Request | undefined\n        getPublicKey?: string | Request | undefined\n        setPublicKey?: string | Request | undefined\n      },\n  options: http.Options = {},\n): KeyManager {\n  const { fetch: fetchFn = globalThis.fetch } = options\n  const { getChallenge, getPublicKey, setPublicKey } = (() => {\n    const base = typeof url === 'string' ? url : ''\n    const urls = typeof url === 'object' ? url : {}\n    return {\n      getChallenge: urls.getChallenge ?? `${base}/challenge`,\n      getPublicKey: urls.getPublicKey ?? `${base}/:credentialId`,\n      setPublicKey: urls.setPublicKey ?? `${base}/:credentialId`,\n    }\n  })()\n\n  return from({\n    async getChallenge() {\n      const request =\n        getChallenge instanceof Request\n          ? getChallenge\n          : new Request(getChallenge)\n\n      const response = await fetchFn(request)\n\n      if (!response.ok)\n        throw new Error(`Failed to get create options: ${response.statusText}`)\n      return await response.json()\n    },\n\n    async getPublicKey(parameters) {\n      const request =\n        getPublicKey instanceof Request\n          ? getPublicKey\n          : new Request(getPublicKey)\n\n      const response = await fetchFn(\n        new Request(\n          request.url.replace(':credentialId', parameters.credential.id),\n          request,\n        ),\n      )\n\n      if (!response.ok)\n        throw new Error(`Failed to get public key: ${response.statusText}`)\n      const data = await response.json()\n      return data.publicKey as Hex.Hex\n    },\n\n    async setPublicKey(parameters) {\n      const request =\n        setPublicKey instanceof Request\n          ? setPublicKey\n          : new Request(setPublicKey)\n\n      const response = await fetchFn(\n        new Request(\n          request.url.replace(':credentialId', parameters.credential.id),\n          request,\n        ),\n        {\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/json',\n          },\n          body: Json.stringify({\n            ...parameters,\n            credential: serializeCredential(parameters.credential),\n          }),\n        },\n      )\n\n      if (!response.ok)\n        throw new Error(`Failed to set public key: ${response.statusText}`)\n    },\n  })\n}\n\nexport namespace http {\n  export type Options = {\n    /** Custom fetch function. @default `globalThis.fetch`. */\n    fetch?: typeof fetch | undefined\n  }\n}\n\n/**\n * Serializes a WebAuthn credential for JSON transmission.\n * @internal\n */\nfunction serializeCredential(\n  credential: WebAuthnP256.P256Credential['raw'],\n): Record<string, unknown> {\n  const response = credential.response\n  return {\n    ...credential,\n    rawId: Base64.fromBytes(new Uint8Array(credential.rawId)),\n    response: {\n      clientDataJSON: Base64.fromBytes(new Uint8Array(response.clientDataJSON)),\n      ...('attestationObject' in response && {\n        attestationObject: Base64.fromBytes(\n          new Uint8Array(response.attestationObject as ArrayBuffer),\n        ),\n      }),\n      ...('getAuthenticatorData' in response &&\n        typeof response.getAuthenticatorData === 'function' && {\n          authenticatorData: Base64.fromBytes(\n            new Uint8Array(\n              response.getAuthenticatorData.call(response) as ArrayBuffer,\n            ),\n          ),\n        }),\n      ...('getPublicKey' in response &&\n        typeof response.getPublicKey === 'function' && {\n          publicKey: Base64.fromBytes(\n            new Uint8Array(response.getPublicKey.call(response) as ArrayBuffer),\n          ),\n        }),\n      ...('getPublicKeyAlgorithm' in response &&\n        typeof response.getPublicKeyAlgorithm === 'function' && {\n          publicKeyAlgorithm: response.getPublicKeyAlgorithm.call(response),\n        }),\n      ...('getTransports' in response &&\n        typeof response.getTransports === 'function' && {\n          transports: response.getTransports.call(response),\n        }),\n      ...('authenticatorData' in response && {\n        authenticatorData: Base64.fromBytes(\n          new Uint8Array(response.authenticatorData as ArrayBuffer),\n        ),\n      }),\n      ...('signature' in response && {\n        signature: Base64.fromBytes(\n          new Uint8Array(response.signature as ArrayBuffer),\n        ),\n      }),\n      ...('userHandle' in response && response.userHandle\n        ? {\n            userHandle: Base64.fromBytes(\n              new Uint8Array(response.userHandle as ArrayBuffer),\n            ),\n          }\n        : {}),\n    },\n  }\n}\n"
  },
  {
    "path": "packages/core/src/tempo/actions/amm.test.ts",
    "content": "import { connect, getConnectorClient } from '@wagmi/core'\nimport {\n  accounts,\n  addresses,\n  config,\n  queryClient,\n  viem_setupPoolWithLiquidity,\n} from '@wagmi/test/tempo'\nimport { parseUnits } from 'viem'\nimport { describe, expect, test } from 'vitest'\nimport * as ammActions from './amm.js'\nimport * as tokenActions from './token.js'\n\nconst account = accounts[0]\n\ndescribe('getPool', () => {\n  test('default', async () => {\n    const pool = await ammActions.getPool(config, {\n      userToken: addresses.alphaUsd,\n      validatorToken: '0x20c0000000000000000000000000000000000001',\n    })\n    expect(pool).toMatchInlineSnapshot(`\n      {\n        \"reserveUserToken\": 0n,\n        \"reserveValidatorToken\": 0n,\n        \"totalSupply\": 0n,\n      }\n    `)\n  })\n\n  describe('queryOptions', () => {\n    test('default', async () => {\n      const options = ammActions.getPool.queryOptions(config, {\n        userToken: addresses.alphaUsd,\n        validatorToken: '0x20c0000000000000000000000000000000000001',\n      })\n      const pool = await queryClient.fetchQuery(options)\n      expect(pool).toMatchInlineSnapshot(`\n        {\n          \"reserveUserToken\": 0n,\n          \"reserveValidatorToken\": 0n,\n          \"totalSupply\": 0n,\n        }\n      `)\n    })\n  })\n})\n\ndescribe('getLiquidityBalance', () => {\n  test('default', async () => {\n    const balance = await ammActions.getLiquidityBalance(config, {\n      userToken: addresses.alphaUsd,\n      validatorToken: '0x20c0000000000000000000000000000000000001',\n      address: account.address,\n    })\n    expect(balance).toMatchInlineSnapshot('0n')\n  })\n\n  describe('queryOptions', () => {\n    test('default', async () => {\n      const options = ammActions.getLiquidityBalance.queryOptions(config, {\n        userToken: addresses.alphaUsd,\n        validatorToken: '0x20c0000000000000000000000000000000000001',\n        address: account.address,\n      })\n      const balance = await queryClient.fetchQuery(options)\n      expect(balance).toMatchInlineSnapshot('0n')\n    })\n  })\n})\n\ndescribe('mintSync', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token for testing\n    const { token } = await tokenActions.createSync(config, {\n      name: 'Test Token',\n      symbol: 'TEST',\n      currency: 'USD',\n    })\n\n    // Grant issuer role to mint tokens\n    await tokenActions.grantRolesSync(config, {\n      token,\n      roles: ['issuer'],\n      to: account.address,\n    })\n\n    // Mint some tokens to account\n    await tokenActions.mintSync(config, {\n      to: account.address,\n      amount: parseUnits('1000', 6),\n      token,\n    })\n\n    // Add liquidity to pool\n    const { receipt: mintReceipt, ...mintResult } = await ammActions.mintSync(\n      config,\n      {\n        userTokenAddress: token,\n        validatorTokenAddress: addresses.alphaUsd,\n        validatorTokenAmount: parseUnits('100', 6),\n        to: account.address,\n      },\n    )\n    expect(mintReceipt).toBeDefined()\n    expect(mintResult.amountValidatorToken).toBe(100000000n)\n    expect(mintResult.liquidity).toBe(49999000n)\n    expect(mintResult.sender).toBe(account.address)\n    expect(mintResult.to).toBe(account.address)\n    expect(mintResult.validatorToken.toLowerCase()).toBe(\n      addresses.alphaUsd.toLowerCase(),\n    )\n  })\n})\n\ndescribe.skip('burnSync', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    const client = await getConnectorClient(config)\n    const { tokenAddress } = await viem_setupPoolWithLiquidity(client)\n\n    const account2 = accounts[1]\n\n    // Get LP balance before burn\n    const lpBalanceBefore = await ammActions.getLiquidityBalance(config, {\n      userToken: tokenAddress,\n      validatorToken: addresses.alphaUsd,\n      address: account.address,\n    })\n\n    // TODO(TEMPO-1183): Remove this janky fix to get some user token in the pool\n    await tokenActions.transferSync(config, {\n      to: account2.address,\n      amount: 600n,\n      token: tokenAddress,\n      feeToken: tokenAddress,\n    })\n\n    // Burn half of LP tokens\n    const { receipt: burnReceipt, ...burnResult } = await ammActions.burnSync(\n      config,\n      {\n        userToken: tokenAddress,\n        validatorToken: addresses.alphaUsd,\n        liquidity: lpBalanceBefore / 2n,\n        to: account.address,\n      },\n    )\n    expect(burnReceipt).toBeDefined()\n    expect(burnResult).toMatchInlineSnapshot(`\n      {\n        \"amountUserToken\": 337n,\n        \"amountValidatorToken\": 49998664n,\n        \"liquidity\": 24999500n,\n        \"sender\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        \"to\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        \"userToken\": \"0x20c0000000000000000000000000000000000005\",\n        \"validatorToken\": \"0x20C0000000000000000000000000000000000001\",\n      }\n    `)\n  })\n})\n\ndescribe.skip('rebalanceSwapSync', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    const client = await getConnectorClient(config)\n    const { tokenAddress } = await viem_setupPoolWithLiquidity(client)\n\n    const account2 = accounts[1]\n\n    // TODO(TEMPO-1183): Remove this janky fix to get some user token in the pool\n    await tokenActions.transferSync(config, {\n      to: account2.address,\n      amount: 600n,\n      token: tokenAddress,\n      feeToken: tokenAddress,\n    })\n\n    // Perform rebalance swap\n    const { receipt: swapReceipt, ...swapResult } =\n      await ammActions.rebalanceSwapSync(config, {\n        userToken: tokenAddress,\n        validatorToken: addresses.alphaUsd,\n        amountOut: 100n,\n        to: account2.address,\n      })\n    expect(swapReceipt).toBeDefined()\n    expect(swapResult).toMatchInlineSnapshot(`\n      {\n        \"amountIn\": 100n,\n        \"amountOut\": 100n,\n        \"swapper\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        \"userToken\": \"0x20C0000000000000000000000000000000000006\",\n        \"validatorToken\": \"0x20C0000000000000000000000000000000000001\",\n      }\n    `)\n  })\n})\n"
  },
  {
    "path": "packages/core/src/tempo/actions/amm.ts",
    "content": "import type { Account, BaseErrorType } from 'viem'\nimport { Actions } from 'viem/tempo'\nimport { getConnectorClient } from '../../actions/getConnectorClient.js'\nimport type { Config } from '../../createConfig.js'\nimport type {\n  ChainIdParameter,\n  ConnectorParameter,\n} from '../../types/properties.js'\nimport type { UnionLooseOmit } from '../../types/utils.js'\nimport type { QueryOptions, QueryParameter } from './utils.js'\nimport { filterQueryOptions } from './utils.js'\n\n/**\n * Gets the reserves for a liquidity pool.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const pool = await Actions.amm.getPool(config, {\n *   userToken: '0x...',\n *   validatorToken: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The pool reserves.\n */\nexport function getPool<config extends Config>(\n  config: config,\n  parameters: getPool.Parameters<config>,\n): Promise<getPool.ReturnValue> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.amm.getPool(client, rest)\n}\n\nexport namespace getPool {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.amm.getPool.Parameters\n\n  export type ReturnValue = Actions.amm.getPool.ReturnValue\n\n  export type ErrorType = BaseErrorType\n\n  export function queryKey<config extends Config>(\n    parameters: Parameters<config>,\n  ) {\n    return ['getPool', filterQueryOptions(parameters)] as const\n  }\n\n  export type QueryKey<config extends Config> = ReturnType<\n    typeof queryKey<config>\n  >\n\n  export function queryOptions<config extends Config, selectData = ReturnValue>(\n    config: Config,\n    parameters: queryOptions.Parameters<config, selectData>,\n  ): queryOptions.ReturnValue<config, selectData> {\n    const { query, ...rest } = parameters\n    return {\n      ...query,\n      enabled: Boolean(\n        rest.userToken && rest.validatorToken && (query?.enabled ?? true),\n      ),\n      queryKey: queryKey(rest),\n      async queryFn({ queryKey }) {\n        const [, parameters] = queryKey\n        return await getPool(config, parameters)\n      },\n    }\n  }\n\n  export declare namespace queryOptions {\n    export type Parameters<\n      config extends Config,\n      selectData = getPool.ReturnValue,\n    > = getPool.Parameters<config> &\n      QueryParameter<\n        getPool.ReturnValue,\n        getPool.ErrorType,\n        selectData,\n        getPool.QueryKey<config>\n      >\n\n    export type ReturnValue<\n      config extends Config,\n      selectData = getPool.ReturnValue,\n    > = QueryOptions<\n      getPool.ReturnValue,\n      getPool.ErrorType,\n      selectData,\n      getPool.QueryKey<config>\n    >\n  }\n}\n\n/**\n * Gets the LP token balance for an account in a specific pool.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const poolId = await Actions.amm.getPoolId(config, {\n *   userToken: '0x...',\n *   validatorToken: '0x...',\n * })\n *\n * const balance = await Actions.amm.getLiquidityBalance(config, {\n *   poolId,\n *   address: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The LP token balance.\n */\nexport function getLiquidityBalance<config extends Config>(\n  config: config,\n  parameters: getLiquidityBalance.Parameters<config>,\n): Promise<getLiquidityBalance.ReturnValue> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.amm.getLiquidityBalance(client, rest)\n}\n\nexport namespace getLiquidityBalance {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.amm.getLiquidityBalance.Parameters\n\n  export type ReturnValue = Actions.amm.getLiquidityBalance.ReturnValue\n\n  export type ErrorType = BaseErrorType\n\n  export function queryKey<config extends Config>(\n    parameters: Parameters<config>,\n  ) {\n    return ['getLiquidityBalance', filterQueryOptions(parameters)] as const\n  }\n\n  export type QueryKey<config extends Config> = ReturnType<\n    typeof queryKey<config>\n  >\n\n  export function queryOptions<config extends Config, selectData = ReturnValue>(\n    config: Config,\n    parameters: queryOptions.Parameters<config, selectData>,\n  ): queryOptions.ReturnValue<config, selectData> {\n    const { query, ...rest } = parameters\n    return {\n      ...query,\n      enabled: Boolean(\n        rest.address &&\n          (rest.poolId ||\n            (rest.userToken !== undefined &&\n              rest.validatorToken !== undefined)) &&\n          (query?.enabled ?? true),\n      ),\n      queryKey: queryKey(rest),\n      async queryFn({ queryKey }) {\n        const [, parameters] = queryKey\n        return await getLiquidityBalance(config, parameters as any)\n      },\n    }\n  }\n\n  export declare namespace queryOptions {\n    export type Parameters<\n      config extends Config,\n      selectData = getLiquidityBalance.ReturnValue,\n    > = getLiquidityBalance.Parameters<config> &\n      QueryParameter<\n        getLiquidityBalance.ReturnValue,\n        getLiquidityBalance.ErrorType,\n        selectData,\n        getLiquidityBalance.QueryKey<config>\n      >\n\n    export type ReturnValue<\n      config extends Config,\n      selectData = getLiquidityBalance.ReturnValue,\n    > = QueryOptions<\n      getLiquidityBalance.ReturnValue,\n      getLiquidityBalance.ErrorType,\n      selectData,\n      getLiquidityBalance.QueryKey<config>\n    >\n  }\n}\n\n/**\n * Performs a rebalance swap from validator token to user token.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.amm.rebalanceSwap(config, {\n *   userToken: '0x...',\n *   validatorToken: '0x...',\n *   amountOut: 100n,\n *   to: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function rebalanceSwap<config extends Config>(\n  config: config,\n  parameters: rebalanceSwap.Parameters<config>,\n): Promise<Actions.amm.rebalanceSwap.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.amm.rebalanceSwap(client, parameters as never)\n}\n\nexport declare namespace rebalanceSwap {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.amm.rebalanceSwap.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.amm.rebalanceSwap.ReturnValue\n\n  export type ErrorType = BaseErrorType\n}\n\n/**\n * Performs a rebalance swap from validator token to user token.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.amm.rebalanceSwapSync(config, {\n *   userToken: '0x...',\n *   validatorToken: '0x...',\n *   amountOut: 100n,\n *   to: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function rebalanceSwapSync<config extends Config>(\n  config: config,\n  parameters: rebalanceSwapSync.Parameters<config>,\n): Promise<Actions.amm.rebalanceSwapSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.amm.rebalanceSwapSync(client, parameters as never)\n}\n\nexport declare namespace rebalanceSwapSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.amm.rebalanceSwapSync.Parameters<\n        config['chains'][number],\n        Account\n      >,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.amm.rebalanceSwapSync.ReturnValue\n\n  export type ErrorType = BaseErrorType\n}\n\n/**\n * Adds liquidity to a pool.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.amm.mint(config, {\n *   userTokenAddress: '0x20c0...beef',\n *   validatorTokenAddress: '0x20c0...babe',\n *   validatorTokenAmount: 100n,\n *   to: '0xfeed...fede',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function mint<config extends Config>(\n  config: config,\n  parameters: mint.Parameters<config>,\n): Promise<Actions.amm.mint.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.amm.mint(client, parameters as never)\n}\n\nexport declare namespace mint {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.amm.mint.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.amm.mint.ReturnValue\n\n  export type ErrorType = BaseErrorType\n}\n\n/**\n * Adds liquidity to a pool.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.amm.mintSync(config, {\n *   userTokenAddress: '0x20c0...beef',\n *   validatorTokenAddress: '0x20c0...babe',\n *   validatorTokenAmount: 100n,\n *   to: '0xfeed...fede',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function mintSync<config extends Config>(\n  config: config,\n  parameters: mintSync.Parameters<config>,\n): Promise<Actions.amm.mintSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.amm.mintSync(client, parameters as never)\n}\n\nexport declare namespace mintSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.amm.mintSync.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.amm.mintSync.ReturnValue\n\n  export type ErrorType = BaseErrorType\n}\n\n/**\n * Removes liquidity from a pool.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.amm.burn(config, {\n *   userToken: '0x20c0...beef',\n *   validatorToken: '0x20c0...babe',\n *   liquidity: 50n,\n *   to: '0xfeed...fede',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function burn<config extends Config>(\n  config: config,\n  parameters: burn.Parameters<config>,\n): Promise<Actions.amm.burn.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.amm.burn(client, parameters as never)\n}\n\nexport declare namespace burn {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.amm.burn.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.amm.burn.ReturnValue\n\n  export type ErrorType = BaseErrorType\n}\n\n/**\n * Removes liquidity from a pool.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.amm.burnSync(config, {\n *   userToken: '0x20c0...beef',\n *   validatorToken: '0x20c0...babe',\n *   liquidity: 50n,\n *   to: '0xfeed...fede',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function burnSync<config extends Config>(\n  config: config,\n  parameters: burnSync.Parameters<config>,\n): Promise<Actions.amm.burnSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.amm.burnSync(client, parameters as never)\n}\n\nexport declare namespace burnSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.amm.burnSync.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.amm.burnSync.ReturnValue\n\n  export type ErrorType = BaseErrorType\n}\n\n/**\n * Watches for rebalance swap events.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const unwatch = Actions.amm.watchRebalanceSwap(config, {\n *   onRebalanceSwap: (args, log) => {\n *     console.log('Rebalance swap:', args)\n *   },\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchRebalanceSwap<config extends Config>(\n  config: config,\n  parameters: watchRebalanceSwap.Parameters<config>,\n) {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.amm.watchRebalanceSwap(client, rest)\n}\n\nexport declare namespace watchRebalanceSwap {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.amm.watchRebalanceSwap.Parameters\n}\n\n/**\n * Watches for liquidity mint events.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const unwatch = Actions.amm.watchMint(config, {\n *   onMint: (args, log) => {\n *     console.log('Liquidity added:', args)\n *   },\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchMint<config extends Config>(\n  config: config,\n  parameters: watchMint.Parameters<config>,\n) {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.amm.watchMint(client, rest)\n}\n\nexport declare namespace watchMint {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.amm.watchMint.Parameters\n}\n\n/**\n * Watches for liquidity burn events.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const unwatch = Actions.amm.watchBurn(config, {\n *   onBurn: (args, log) => {\n *     console.log('Liquidity removed:', args)\n *   },\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchBurn<config extends Config>(\n  config: config,\n  parameters: watchBurn.Parameters<config>,\n) {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.amm.watchBurn(client, rest)\n}\n\nexport declare namespace watchBurn {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.amm.watchBurn.Parameters\n}\n"
  },
  {
    "path": "packages/core/src/tempo/actions/dex.test.ts",
    "content": "import { connect } from '@wagmi/core'\nimport { accounts, addresses, config, setupTokenPair } from '@wagmi/test/tempo'\nimport { isAddress, parseUnits } from 'viem'\nimport { Tick } from 'viem/tempo'\nimport { describe, expect, test, vi } from 'vitest'\nimport * as dex from './dex.js'\nimport * as token from './token.js'\n\nconst account = accounts[0]\nconst account2 = accounts[1]\n\ndescribe('buy', () => {\n  test('default', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // Place ask order to create liquidity\n    await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('500', 6),\n      type: 'sell',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    // Get initial balances\n    const baseBalanceBefore = await token.getBalance(config, {\n      token: base,\n      account: account.address,\n    })\n\n    // Buy base tokens with quote tokens\n    const { receipt } = await dex.buySync(config, {\n      tokenIn: quote,\n      tokenOut: base,\n      amountOut: parseUnits('100', 6),\n      maxAmountIn: parseUnits('150', 6),\n    })\n\n    expect(receipt).toBeDefined()\n    expect(receipt.status).toBe('success')\n\n    // Verify balances changed\n    const baseBalanceAfter = await token.getBalance(config, {\n      token: base,\n      account: account.address,\n    })\n\n    // Should have received base tokens\n    expect(baseBalanceAfter).toBeGreaterThan(baseBalanceBefore)\n  })\n\n  test('behavior: respects maxAmountIn', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // Place ask order at high price\n    await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('500', 6),\n      type: 'sell',\n      tick: Tick.fromPrice('1.01'), // 1% above peg\n    })\n\n    // Try to buy with insufficient maxAmountIn - should fail\n    await expect(\n      dex.buySync(config, {\n        tokenIn: quote,\n        tokenOut: base,\n        amountOut: parseUnits('100', 6),\n        maxAmountIn: parseUnits('50', 6), // Way too low for 1% premium\n      }),\n    ).rejects.toThrow('The contract function \"swapExactAmountOut\" reverted')\n  })\n\n  test('behavior: fails with insufficient liquidity', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // Don't place any orders - no liquidity\n\n    // Try to buy - should fail due to no liquidity\n    await expect(\n      dex.buySync(config, {\n        tokenIn: quote,\n        tokenOut: base,\n        amountOut: parseUnits('100', 6),\n        maxAmountIn: parseUnits('150', 6),\n      }),\n    ).rejects.toThrow('The contract function \"swapExactAmountOut\" reverted')\n  })\n})\n\ndescribe('cancel', () => {\n  test('default', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // Place a bid order\n    const { orderId } = await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    // Check initial DEX balance (should be 0)\n    const dexBalanceBefore = await dex.getBalance(config, {\n      account: account.address,\n      token: quote,\n    })\n    expect(dexBalanceBefore).toBe(0n)\n\n    // Cancel the order\n    const { receipt, ...result } = await dex.cancelSync(config, {\n      orderId,\n    })\n\n    expect(receipt).toBeDefined()\n    expect(receipt.status).toBe('success')\n    expect(result.orderId).toBe(orderId)\n\n    // Check DEX balance after cancel - tokens should be refunded to internal balance\n    const dexBalanceAfter = await dex.getBalance(config, {\n      account: account.address,\n      token: quote,\n    })\n    expect(dexBalanceAfter).toBeGreaterThan(0n)\n  })\n\n  test('behavior: only maker can cancel', async () => {\n    const { base } = await setupTokenPair()\n\n    // Account places order\n    const { orderId } = await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    // Transfer gas to account2\n    await token.transferSync(config, {\n      to: account2.address,\n      amount: parseUnits('1', 6),\n      token: addresses.alphaUsd,\n    })\n\n    // Use a different account via the connector\n    await connect(config, {\n      connector: config.connectors[1]!,\n    })\n\n    // Account2 tries to cancel - should fail\n    await expect(\n      dex.cancelSync(config, {\n        orderId,\n      }),\n    ).rejects.toThrow('The contract function \"cancel\" reverted')\n  })\n\n  test('behavior: cannot cancel non-existent order', async () => {\n    await setupTokenPair()\n\n    // Try to cancel an order that doesn't exist\n    await expect(\n      dex.cancelSync(config, {\n        orderId: 999n,\n      }),\n    ).rejects.toThrow('The contract function \"cancel\" reverted')\n  })\n})\n\ndescribe('createPair', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    const { token: baseToken } = await token.createSync(config, {\n      name: 'Test Base Token',\n      symbol: 'BASE',\n      currency: 'USD',\n      admin: account,\n    })\n\n    const { receipt, ...result } = await dex.createPairSync(config, {\n      base: baseToken,\n    })\n\n    expect(receipt).toBeDefined()\n    expect(receipt.status).toBe('success')\n\n    const { key, ...rest } = result\n    expect(key).toBeDefined()\n    expect(rest).toEqual(\n      expect.objectContaining({\n        base: expect.toSatisfy(isAddress),\n        quote: expect.toSatisfy(isAddress),\n      }),\n    )\n  })\n})\n\ndescribe('getBalance', () => {\n  test('default', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // Initial balance should be 0\n    const initialBalance = await dex.getBalance(config, {\n      account: account.address,\n      token: quote,\n    })\n    expect(initialBalance).toBe(0n)\n\n    // Place and cancel order to create internal balance\n    const { orderId } = await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.0005'),\n    })\n\n    await dex.cancelSync(config, {\n      orderId,\n    })\n\n    // Now balance should be > 0 (refunded quote tokens)\n    const balance = await dex.getBalance(config, {\n      account: account.address,\n      token: quote,\n    })\n    expect(balance).toBeGreaterThan(0n)\n  })\n\n  test('behavior: check different account', async () => {\n    const { quote } = await setupTokenPair()\n\n    // Check account2's balance (should be 0)\n    const balance = await dex.getBalance(config, {\n      account: account2.address,\n      token: quote,\n    })\n    expect(balance).toBe(0n)\n  })\n\n  test('behavior: balances are per-token', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // Create balance in quote token\n    const { orderId } = await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.001'),\n    })\n    await dex.cancelSync(config, { orderId })\n\n    // Check quote balance (should have refunded tokens)\n    const quoteBalance = await dex.getBalance(config, {\n      account: account.address,\n      token: quote,\n    })\n    expect(quoteBalance).toBeGreaterThan(0n)\n\n    // Check base balance (should still be 0)\n    const baseBalance = await dex.getBalance(config, {\n      account: account.address,\n      token: base,\n    })\n    expect(baseBalance).toBe(0n)\n  })\n})\n\ndescribe('getBuyQuote', () => {\n  test('default', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // Place ask orders to create liquidity\n    await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('500', 6),\n      type: 'sell',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    // Get quote for buying base tokens\n    const amountIn = await dex.getBuyQuote(config, {\n      tokenIn: quote,\n      tokenOut: base,\n      amountOut: parseUnits('100', 6),\n    })\n\n    expect(amountIn).toBeGreaterThan(0n)\n    // Should be approximately 100 * 1.001 = 100.1\n    expect(amountIn).toBeGreaterThan(parseUnits('100', 6))\n  })\n\n  test('behavior: fails with no liquidity', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // No orders placed - no liquidity\n\n    // Quote should fail\n    await expect(\n      dex.getBuyQuote(config, {\n        tokenIn: quote,\n        tokenOut: base,\n        amountOut: parseUnits('100', 6),\n      }),\n    ).rejects.toThrow(\n      'The contract function \"quoteSwapExactAmountOut\" reverted',\n    )\n  })\n})\n\ndescribe('getOrder', () => {\n  test('default', async () => {\n    const { base } = await setupTokenPair()\n\n    // Place an order to get an order ID\n    const { orderId } = await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    // Get the order details\n    const order = await dex.getOrder(config, {\n      orderId,\n    })\n\n    expect(order).toBeDefined()\n    expect(order.maker).toBe(account.address)\n    expect(order.isBid).toBe(true)\n    expect(order.tick).toBe(Tick.fromPrice('1.001'))\n    expect(order.amount).toBe(parseUnits('100', 6))\n    expect(order.remaining).toBe(parseUnits('100', 6))\n    expect(order.isFlip).toBe(false)\n  })\n\n  test('behavior: returns flip order details', async () => {\n    const { base } = await setupTokenPair()\n\n    // Place a flip order\n    const { orderId } = await dex.placeFlipSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.001'),\n      flipTick: Tick.fromPrice('1.002'),\n    })\n\n    // Get the order details\n    const order = await dex.getOrder(config, {\n      orderId,\n    })\n\n    expect(order).toBeDefined()\n    expect(order.maker).toBe(account.address)\n    expect(order.isBid).toBe(true)\n    expect(order.tick).toBe(Tick.fromPrice('1.001'))\n    expect(order.amount).toBe(parseUnits('100', 6))\n    expect(order.isFlip).toBe(true)\n    expect(order.flipTick).toBe(Tick.fromPrice('1.002'))\n  })\n\n  test('behavior: fails for non-existent order', async () => {\n    await setupTokenPair()\n\n    // Try to get an order that doesn't exist\n    await expect(\n      dex.getOrder(config, {\n        orderId: 999n,\n      }),\n    ).rejects.toThrow('The contract function \"getOrder\" reverted')\n  })\n\n  test('behavior: reflects order state after partial fill', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // Place a large sell order\n    const { orderId } = await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('500', 6),\n      type: 'sell',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    // Get initial order state\n    const orderBefore = await dex.getOrder(config, {\n      orderId,\n    })\n    expect(orderBefore.amount).toBe(parseUnits('500', 6))\n    expect(orderBefore.remaining).toBe(parseUnits('500', 6))\n\n    // Partially fill the order with a buy\n    await dex.buySync(config, {\n      tokenIn: quote,\n      tokenOut: base,\n      amountOut: parseUnits('100', 6),\n      maxAmountIn: parseUnits('150', 6),\n    })\n\n    // Get order state after partial fill\n    const orderAfter = await dex.getOrder(config, {\n      orderId,\n    })\n    expect(orderAfter.amount).toBe(parseUnits('500', 6)) // amount unchanged\n    expect(orderAfter.remaining).toBeLessThan(parseUnits('500', 6)) // remaining decreased\n  })\n\n  test('behavior: linked list pointers for multiple orders at same tick', async () => {\n    const { base } = await setupTokenPair()\n\n    const tick = Tick.fromPrice('1.001')\n\n    // Place first order\n    const { orderId: orderId1 } = await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick,\n    })\n\n    // Place second order at same tick\n    const { orderId: orderId2 } = await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick,\n    })\n\n    // Get first order\n    const order1 = await dex.getOrder(config, {\n      orderId: orderId1,\n    })\n    expect(order1.prev).toBe(0n) // should be 0 as it's first\n    expect(order1.next).toBe(orderId2) // should point to second order\n\n    // Get second order\n    const order2 = await dex.getOrder(config, {\n      orderId: orderId2,\n    })\n    expect(order2.prev).toBe(orderId1) // should point to first order\n    expect(order2.next).toBe(0n) // should be 0 as it's last\n  })\n})\n\ndescribe('getOrderbook', () => {\n  test('default', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // Get orderbook information\n    const book = await dex.getOrderbook(config, {\n      base,\n      quote,\n    })\n\n    expect(book).toBeDefined()\n    expect(book.base).toBe(base)\n    expect(book.quote).toBe(quote)\n    expect(book.bestBidTick).toBeDefined()\n    expect(book.bestAskTick).toBeDefined()\n  })\n\n  test('behavior: shows best bid and ask after orders placed', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    const bidTick = Tick.fromPrice('0.999')\n    const askTick = Tick.fromPrice('1.001')\n\n    // Place a bid order\n    await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: bidTick,\n    })\n\n    // Place an ask order\n    await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'sell',\n      tick: askTick,\n    })\n\n    // Get orderbook\n    const book = await dex.getOrderbook(config, {\n      base,\n      quote,\n    })\n\n    expect(book.bestBidTick).toBe(bidTick)\n    expect(book.bestAskTick).toBe(askTick)\n  })\n\n  test('behavior: best ticks update after better orders placed', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // Place initial bid at 0.999\n    await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('0.999'),\n    })\n\n    // Get orderbook\n    const bookBefore = await dex.getOrderbook(config, {\n      base,\n      quote,\n    })\n    expect(bookBefore.bestBidTick).toBe(Tick.fromPrice('0.999'))\n\n    // Place better bid at 1.0\n    await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.0'),\n    })\n\n    // Get orderbook again\n    const bookAfter = await dex.getOrderbook(config, {\n      base,\n      quote,\n    })\n    expect(bookAfter.bestBidTick).toBe(Tick.fromPrice('1.0'))\n  })\n\n  test.todo('behavior: best ticks update after order cancellation')\n\n  test('behavior: multiple pairs have independent orderbooks', async () => {\n    const { base: base1, quote: quote1 } = await setupTokenPair()\n    const { base: base2, quote: quote2 } = await setupTokenPair()\n\n    // Place order on first pair\n    await dex.placeSync(config, {\n      token: base1,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    // Place order on second pair at different tick\n    await dex.placeSync(config, {\n      token: base2,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('0.999'),\n    })\n\n    // Get orderbooks\n    const book1 = await dex.getOrderbook(config, {\n      base: base1,\n      quote: quote1,\n    })\n\n    const book2 = await dex.getOrderbook(config, {\n      base: base2,\n      quote: quote2,\n    })\n\n    // Each pair should have its own best tick\n    expect(book1.bestBidTick).toBe(Tick.fromPrice('1.001'))\n    expect(book2.bestBidTick).toBe(Tick.fromPrice('0.999'))\n  })\n})\n\ndescribe('getTickLevel', () => {\n  test('default', async () => {\n    const { base } = await setupTokenPair()\n\n    const tick = Tick.fromPrice('1.001')\n\n    // Place an order to create liquidity at this tick\n    const { orderId } = await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick,\n    })\n\n    // Get the price level\n    const level = await dex.getTickLevel(config, {\n      base,\n      tick,\n      isBid: true,\n    })\n\n    expect(level).toBeDefined()\n    expect(level.head).toBe(orderId) // head should be our order\n    expect(level.tail).toBe(orderId) // tail should also be our order (only one)\n    expect(level.totalLiquidity).toBeGreaterThan(0n)\n  })\n\n  test('behavior: empty price level', async () => {\n    const { base } = await setupTokenPair()\n\n    const tick = Tick.fromPrice('1.001')\n\n    // Query a tick with no orders\n    const level = await dex.getTickLevel(config, {\n      base,\n      tick,\n      isBid: true,\n    })\n\n    expect(level).toBeDefined()\n    expect(level.head).toBe(0n)\n    expect(level.tail).toBe(0n)\n    expect(level.totalLiquidity).toBe(0n)\n  })\n\n  test('behavior: multiple orders at same tick', async () => {\n    const { base } = await setupTokenPair()\n\n    const tick = Tick.fromPrice('1.001')\n\n    // Place first order\n    const { orderId: orderId1 } = await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick,\n    })\n\n    // Place second order at same tick\n    const { orderId: orderId2 } = await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick,\n    })\n\n    // Get the price level\n    const level = await dex.getTickLevel(config, {\n      base,\n      tick,\n      isBid: true,\n    })\n\n    expect(level.head).toBe(orderId1) // head should be first order\n    expect(level.tail).toBe(orderId2) // tail should be last order\n    // Total liquidity should be sum of both orders (approximately)\n    expect(level.totalLiquidity).toBeGreaterThan(parseUnits('145', 6))\n  })\n\n  test('behavior: bid vs ask sides', async () => {\n    const { base } = await setupTokenPair()\n\n    const tick = Tick.fromPrice('1.001')\n\n    // Place a buy order (bid)\n    await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick,\n    })\n\n    // Place a sell order (ask) at same tick\n    await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'sell',\n      tick,\n    })\n\n    // Get bid side\n    const bidLevel = await dex.getTickLevel(config, {\n      base,\n      tick,\n      isBid: true,\n    })\n\n    // Get ask side\n    const askLevel = await dex.getTickLevel(config, {\n      base,\n      tick,\n      isBid: false,\n    })\n\n    // Both should have liquidity but different amounts\n    expect(bidLevel.totalLiquidity).toBeGreaterThan(0n)\n    expect(askLevel.totalLiquidity).toBeGreaterThan(0n)\n    expect(bidLevel.head).not.toBe(askLevel.head)\n  })\n\n  test('behavior: liquidity changes after order cancellation', async () => {\n    const { base } = await setupTokenPair()\n\n    const tick = Tick.fromPrice('1.001')\n\n    // Place orders\n    const { orderId: orderId1 } = await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick,\n    })\n\n    await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick,\n    })\n\n    // Get level before cancellation\n    const levelBefore = await dex.getTickLevel(config, {\n      base,\n      tick,\n      isBid: true,\n    })\n\n    // Cancel first order\n    await dex.cancelSync(config, {\n      orderId: orderId1,\n    })\n\n    // Get level after cancellation\n    const levelAfter = await dex.getTickLevel(config, {\n      base,\n      tick,\n      isBid: true,\n    })\n\n    // Total liquidity should decrease\n    expect(levelAfter.totalLiquidity).toBeLessThan(levelBefore.totalLiquidity)\n  })\n\n  test('behavior: liquidity changes after partial fill', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    const tick = Tick.fromPrice('1.001')\n\n    // Place sell order\n    await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('500', 6),\n      type: 'sell',\n      tick,\n    })\n\n    // Get level before fill\n    const levelBefore = await dex.getTickLevel(config, {\n      base,\n      tick,\n      isBid: false,\n    })\n\n    // Partially fill the order\n    await dex.buySync(config, {\n      tokenIn: quote,\n      tokenOut: base,\n      amountOut: parseUnits('100', 6),\n      maxAmountIn: parseUnits('150', 6),\n    })\n\n    // Get level after fill\n    const levelAfter = await dex.getTickLevel(config, {\n      base,\n      tick,\n      isBid: false,\n    })\n\n    // Total liquidity should decrease\n    expect(levelAfter.totalLiquidity).toBeLessThan(levelBefore.totalLiquidity)\n  })\n\n  test('behavior: tick at boundaries', async () => {\n    const { base } = await setupTokenPair()\n\n    // Place order at min tick\n    await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'sell',\n      tick: Tick.minTick,\n    })\n\n    // Query min tick\n    const minLevel = await dex.getTickLevel(config, {\n      base,\n      tick: Tick.minTick,\n      isBid: false,\n    })\n    expect(minLevel.totalLiquidity).toBeGreaterThan(0n)\n\n    // Place order at max tick\n    await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.maxTick,\n    })\n\n    // Query max tick\n    const maxLevel = await dex.getTickLevel(config, {\n      base,\n      tick: Tick.maxTick,\n      isBid: true,\n    })\n    expect(maxLevel.totalLiquidity).toBeGreaterThan(0n)\n  })\n})\n\ndescribe('getSellQuote', () => {\n  test('default', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // Place bid orders to create liquidity\n    await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('500', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('0.999'),\n    })\n\n    // Get quote for selling base tokens\n    const amountOut = await dex.getSellQuote(config, {\n      tokenIn: base,\n      tokenOut: quote,\n      amountIn: parseUnits('100', 6),\n    })\n\n    expect(amountOut).toBeGreaterThan(0n)\n    // Should be approximately 100 * 0.999 = 99.9\n    expect(amountOut).toBeLessThan(parseUnits('100', 6))\n  })\n\n  test('behavior: fails with no liquidity', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // Quote should fail with no liquidity\n    await expect(\n      dex.getSellQuote(config, {\n        tokenIn: base,\n        tokenOut: quote,\n        amountIn: parseUnits('100', 6),\n      }),\n    ).rejects.toThrow('The contract function \"quoteSwapExactAmountIn\" reverted')\n  })\n})\n\ndescribe('place', () => {\n  test('default', async () => {\n    // Setup token pair\n    const { base } = await setupTokenPair()\n\n    // Place a sell order\n    const { receipt, orderId, token, ...result } = await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'sell',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    expect(receipt).toBeDefined()\n    expect(receipt.status).toBe('success')\n    expect(orderId).toBeGreaterThan(0n)\n    expect(token).toBe(base)\n    expect(result).toMatchInlineSnapshot(`\n      {\n        \"amount\": 100000000n,\n        \"flipTick\": 0,\n        \"isBid\": false,\n        \"isFlipOrder\": false,\n        \"maker\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        \"tick\": 100,\n      }\n    `)\n\n    // Place a buy order\n    const {\n      receipt: receipt2,\n      orderId: orderId2,\n      token: token2,\n      ...result2\n    } = await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.001'),\n    })\n    expect(receipt2.status).toBe('success')\n    expect(orderId2).toBeGreaterThan(0n)\n    expect(token2).toBe(base)\n    expect(result2).toMatchInlineSnapshot(`\n      {\n        \"amount\": 100000000n,\n        \"flipTick\": 0,\n        \"isBid\": true,\n        \"isFlipOrder\": false,\n        \"maker\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        \"tick\": 100,\n      }\n    `)\n  })\n\n  test('behavior: tick at boundaries', async () => {\n    const { base } = await setupTokenPair()\n\n    // Test at min tick (-2000)\n    const { receipt: receipt1, ...result1 } = await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'sell',\n      tick: Tick.minTick,\n    })\n    expect(receipt1.status).toBe('success')\n    expect(result1.tick).toBe(-2000)\n\n    // Test at max tick (2000)\n    const { receipt: receipt2, ...result2 } = await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.maxTick,\n    })\n    expect(receipt2.status).toBe('success')\n    expect(result2.tick).toBe(2000)\n  })\n\n  test('behavior: tick validation fails outside bounds', async () => {\n    const { base } = await setupTokenPair()\n\n    // Test tick above max tick should fail\n    await expect(\n      dex.placeSync(config, {\n        token: base,\n        amount: parseUnits('100', 6),\n        type: 'buy',\n        tick: Tick.maxTick + 1,\n      }),\n    ).rejects.toThrow('The contract function \"place\" reverted')\n\n    // Test tick below min tick should fail\n    await expect(\n      dex.placeSync(config, {\n        token: base,\n        amount: parseUnits('100', 6),\n        type: 'sell',\n        tick: Tick.minTick - 1,\n      }),\n    ).rejects.toThrow('The contract function \"place\" reverted')\n  })\n\n  test('behavior: transfers from wallet', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // Get balances before placing order\n    const baseBalanceBefore = await token.getBalance(config, {\n      token: base,\n      account: account.address,\n    })\n    const quoteBalanceBefore = await token.getBalance(config, {\n      token: quote,\n      account: account.address,\n    })\n\n    // Place a buy order - should transfer quote tokens to escrow\n    const orderAmount = parseUnits('100', 6)\n    const tick = Tick.fromPrice('1.001')\n    await dex.placeSync(config, {\n      token: base,\n      amount: orderAmount,\n      type: 'buy',\n      tick,\n    })\n\n    // Get balances after placing order\n    const baseBalanceAfter = await token.getBalance(config, {\n      token: base,\n      account: account.address,\n    })\n    const quoteBalanceAfter = await token.getBalance(config, {\n      token: quote,\n      account: account.address,\n    })\n\n    // Base token balance should be unchanged (we're buying base, not selling)\n    expect(baseBalanceAfter).toBe(baseBalanceBefore)\n\n    // Quote token balance should decrease (escrowed for the bid)\n    // Amount = orderAmount * (1 + tick/1000) for bids\n    const expectedQuoteEscrowed =\n      (orderAmount * BigInt(100000 + tick)) / BigInt(100000)\n    expect(quoteBalanceBefore - quoteBalanceAfter).toBeGreaterThanOrEqual(\n      expectedQuoteEscrowed,\n    )\n  })\n\n  test('behavior: multiple orders at same tick', async () => {\n    const { base } = await setupTokenPair()\n\n    const tick = Tick.fromPrice('1.0005')\n\n    // Place first order\n    const { orderId: orderId1 } = await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick,\n    })\n\n    // Place second order at same tick\n    const { orderId: orderId2 } = await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick,\n    })\n\n    // Order IDs should be different and sequential\n    expect(orderId2).toBeGreaterThan(orderId1)\n  })\n})\n\ndescribe('placeFlip', () => {\n  test('default', async () => {\n    const { base } = await setupTokenPair()\n\n    // Place a flip bid order\n    const { receipt, orderId, token, ...result } = await dex.placeFlipSync(\n      config,\n      {\n        token: base,\n        amount: parseUnits('100', 6),\n        type: 'buy',\n        tick: Tick.fromPrice('1.001'),\n        flipTick: Tick.fromPrice('1.002'),\n      },\n    )\n\n    expect(receipt).toBeDefined()\n    expect(receipt.status).toBe('success')\n    expect(orderId).toBeGreaterThan(0n)\n    expect(token).toBe(base)\n    expect(result.flipTick).toBe(Tick.fromPrice('1.002'))\n    expect(result).toMatchInlineSnapshot(`\n      {\n        \"amount\": 100000000n,\n        \"flipTick\": 200,\n        \"isBid\": true,\n        \"isFlipOrder\": true,\n        \"maker\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        \"tick\": 100,\n      }\n    `)\n  })\n\n  test('behavior: flip bid requires flipTick > tick', async () => {\n    const { base } = await setupTokenPair()\n\n    // Valid: flipTick > tick for bid\n    const { receipt: receipt1 } = await dex.placeFlipSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.0005'),\n      flipTick: Tick.fromPrice('1.001'),\n    })\n    expect(receipt1.status).toBe('success')\n\n    // Invalid: flipTick <= tick for bid should fail\n    await expect(\n      dex.placeFlipSync(config, {\n        token: base,\n        amount: parseUnits('100', 6),\n        type: 'buy',\n        tick: Tick.fromPrice('1.001'),\n        flipTick: Tick.fromPrice('1.001'), // Equal\n      }),\n    ).rejects.toThrow('The contract function \"placeFlip\" reverted')\n\n    await expect(\n      dex.placeFlipSync(config, {\n        token: base,\n        amount: parseUnits('100', 6),\n        type: 'buy',\n        tick: Tick.fromPrice('1.001'),\n        flipTick: Tick.fromPrice('1.0005'), // Less than\n      }),\n    ).rejects.toThrow('The contract function \"placeFlip\" reverted')\n  })\n\n  test('behavior: flip ask requires flipTick < tick', async () => {\n    const { base } = await setupTokenPair()\n\n    // Valid: flipTick < tick for ask\n    const { receipt: receipt1 } = await dex.placeFlipSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'sell',\n      tick: Tick.fromPrice('1.001'),\n      flipTick: Tick.fromPrice('1.0005'),\n    })\n    expect(receipt1.status).toBe('success')\n\n    // Invalid: flipTick >= tick for ask should fail\n    await expect(\n      dex.placeFlipSync(config, {\n        token: base,\n        amount: parseUnits('100', 6),\n        type: 'sell',\n        tick: Tick.fromPrice('1.0005'),\n        flipTick: Tick.fromPrice('1.0005'), // Equal\n      }),\n    ).rejects.toThrow('The contract function \"placeFlip\" reverted')\n\n    await expect(\n      dex.placeFlipSync(config, {\n        token: base,\n        amount: parseUnits('100', 6),\n        type: 'sell',\n        tick: Tick.fromPrice('1.0005'),\n        flipTick: Tick.fromPrice('1.001'), // Greater than\n      }),\n    ).rejects.toThrow('The contract function \"placeFlip\" reverted')\n  })\n\n  test('behavior: flip ticks at boundaries', async () => {\n    const { base } = await setupTokenPair()\n\n    // Flip order with ticks at extreme boundaries\n    const { receipt } = await dex.placeFlipSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.minTick,\n      flipTick: Tick.maxTick,\n    })\n    expect(receipt.status).toBe('success')\n  })\n})\n\ndescribe('sell', () => {\n  test('default', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // Place bid order to create liquidity\n    await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('500', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('0.999'),\n    })\n\n    // Sell base tokens\n    const { receipt } = await dex.sellSync(config, {\n      tokenIn: base,\n      tokenOut: quote,\n      amountIn: parseUnits('100', 6),\n      minAmountOut: parseUnits('50', 6),\n    })\n\n    expect(receipt).toBeDefined()\n    expect(receipt.status).toBe('success')\n  })\n\n  test('behavior: respects minAmountOut', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // Place bid order at low price\n    await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('500', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('0.99'), // 1% below peg\n    })\n\n    // Try to sell with too high minAmountOut - should fail\n    await expect(\n      dex.sellSync(config, {\n        tokenIn: base,\n        tokenOut: quote,\n        amountIn: parseUnits('100', 6),\n        minAmountOut: parseUnits('150', 6), // Way too high\n      }),\n    ).rejects.toThrow('The contract function \"swapExactAmountIn\" reverted')\n  })\n\n  test('behavior: fails with insufficient liquidity', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // No orders - no liquidity\n\n    // Try to sell - should fail\n    await expect(\n      dex.sellSync(config, {\n        tokenIn: base,\n        tokenOut: quote,\n        amountIn: parseUnits('100', 6),\n        minAmountOut: parseUnits('50', 6),\n      }),\n    ).rejects.toThrow('The contract function \"swapExactAmountIn\" reverted')\n  })\n})\n\ndescribe('watchFlipOrderPlaced', () => {\n  test('default', async () => {\n    const { base } = await setupTokenPair()\n\n    const receivedOrders: Array<{\n      args: dex.watchFlipOrderPlaced.Args\n      log: dex.watchFlipOrderPlaced.Log\n    }> = []\n\n    const unwatch = dex.watchFlipOrderPlaced(config, {\n      onFlipOrderPlaced: (args, log) => {\n        receivedOrders.push({ args, log })\n      },\n    })\n\n    try {\n      // Place flip order\n      await dex.placeFlipSync(config, {\n        token: base,\n        amount: parseUnits('100', 6),\n        type: 'buy',\n        tick: Tick.fromPrice('1.001'),\n        flipTick: Tick.fromPrice('1.002'),\n      })\n\n      await vi.waitFor(() => {\n        expect(receivedOrders).toHaveLength(1)\n      })\n      expect(receivedOrders[0]?.args.flipTick).toBe(Tick.fromPrice('1.002'))\n      expect(receivedOrders[0]?.args.tick).toBe(Tick.fromPrice('1.001'))\n    } finally {\n      unwatch()\n    }\n  })\n})\n\ndescribe('watchOrderCancelled', () => {\n  test('default', async () => {\n    const { base } = await setupTokenPair()\n\n    const receivedCancellations: Array<{\n      args: dex.watchOrderCancelled.Args\n      log: dex.watchOrderCancelled.Log\n    }> = []\n\n    const unwatch = dex.watchOrderCancelled(config, {\n      onOrderCancelled: (args, log) => {\n        receivedCancellations.push({ args, log })\n      },\n    })\n\n    try {\n      // Place order\n      const { orderId } = await dex.placeSync(config, {\n        token: base,\n        amount: parseUnits('100', 6),\n        type: 'buy',\n        tick: Tick.fromPrice('1.001'),\n      })\n\n      // Cancel order\n      await dex.cancelSync(config, {\n        orderId,\n      })\n\n      await vi.waitFor(() => {\n        expect(receivedCancellations).toHaveLength(1)\n      })\n      expect(receivedCancellations[0]?.args.orderId).toBe(orderId)\n    } finally {\n      unwatch()\n    }\n  })\n\n  test('behavior: filter by orderId', async () => {\n    const { base } = await setupTokenPair()\n\n    // Place two orders\n    const { orderId: orderId1 } = await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    const { orderId: orderId2 } = await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    const receivedCancellations: Array<{\n      args: dex.watchOrderCancelled.Args\n      log: dex.watchOrderCancelled.Log\n    }> = []\n\n    // Watch only for cancellation of orderId1\n    const unwatch = dex.watchOrderCancelled(config, {\n      orderId: orderId1,\n      onOrderCancelled: (args, log) => {\n        receivedCancellations.push({ args, log })\n      },\n    })\n\n    try {\n      // Cancel orderId1 (should be captured)\n      await dex.cancelSync(config, {\n        orderId: orderId1,\n      })\n\n      // Cancel orderId2 (should NOT be captured)\n      await dex.cancelSync(config, {\n        orderId: orderId2,\n      })\n\n      await vi.waitFor(() => {\n        expect(receivedCancellations).toHaveLength(1)\n      })\n      expect(receivedCancellations[0]?.args.orderId).toBe(orderId1)\n    } finally {\n      unwatch()\n    }\n  })\n})\n\ndescribe('watchOrderFilled', () => {\n  test('default', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // Place a sell order to create liquidity\n    const { orderId } = await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'sell',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    const receivedFills: Array<{\n      args: dex.watchOrderFilled.Args\n      log: dex.watchOrderFilled.Log\n    }> = []\n\n    const unwatch = dex.watchOrderFilled(config, {\n      onOrderFilled: (args, log) => {\n        receivedFills.push({ args, log })\n      },\n    })\n\n    try {\n      // Buy from the order to trigger a fill\n      await dex.buySync(config, {\n        tokenIn: quote,\n        tokenOut: base,\n        amountOut: parseUnits('50', 6),\n        maxAmountIn: parseUnits('100', 6),\n      })\n\n      await vi.waitFor(() => {\n        expect(receivedFills.length).toBeGreaterThanOrEqual(1)\n      })\n      expect(receivedFills[0]?.args.orderId).toBe(orderId)\n      expect(receivedFills[0]?.args.maker).toBe(account.address)\n      expect(receivedFills[0]?.args.taker).toBe(account.address)\n      expect(receivedFills[0]?.args.amountFilled).toBeGreaterThan(0n)\n    } finally {\n      unwatch()\n    }\n  })\n\n  test('behavior: filter by orderId', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // Place two sell orders\n    const { orderId: orderId1 } = await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'sell',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    const { orderId: orderId2 } = await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'sell',\n      tick: Tick.fromPrice('1.002'),\n    })\n\n    const receivedFills: Array<{\n      args: dex.watchOrderFilled.Args\n      log: dex.watchOrderFilled.Log\n    }> = []\n\n    // Watch only for fills on orderId1\n    const unwatch = dex.watchOrderFilled(config, {\n      orderId: orderId1,\n      onOrderFilled: (args, log) => {\n        receivedFills.push({ args, log })\n      },\n    })\n\n    try {\n      // Buy enough to fill orderId1 only (cheaper price first)\n      await dex.buySync(config, {\n        tokenIn: quote,\n        tokenOut: base,\n        amountOut: parseUnits('50', 6),\n        maxAmountIn: parseUnits('100', 6),\n      })\n\n      await vi.waitFor(() => {\n        expect(receivedFills.length).toBeGreaterThanOrEqual(1)\n      })\n      expect(receivedFills[0]?.args.orderId).toBe(orderId1)\n\n      // Suppress unused variable warning\n      void orderId2\n    } finally {\n      unwatch()\n    }\n  })\n})\n\ndescribe('watchOrderPlaced', () => {\n  test('default', async () => {\n    const { base } = await setupTokenPair()\n\n    const receivedOrders: Array<{\n      args: dex.watchOrderPlaced.Args\n      log: dex.watchOrderPlaced.Log\n    }> = []\n\n    const unwatch = dex.watchOrderPlaced(config, {\n      onOrderPlaced: (args, log) => {\n        receivedOrders.push({ args, log })\n      },\n    })\n\n    try {\n      // Place first order\n      await dex.placeSync(config, {\n        token: base,\n        amount: parseUnits('100', 6),\n        type: 'buy',\n        tick: Tick.fromPrice('1.001'),\n      })\n\n      // Place second order\n      await dex.placeSync(config, {\n        token: base,\n        amount: parseUnits('100', 6),\n        type: 'sell',\n        tick: Tick.fromPrice('0.999'),\n      })\n\n      await vi.waitFor(() => {\n        expect(receivedOrders).toHaveLength(2)\n      })\n      expect(receivedOrders[0]?.args.isBid).toBe(true)\n      expect(receivedOrders[0]?.args.amount).toBe(parseUnits('100', 6))\n      expect(receivedOrders[1]?.args.isBid).toBe(false)\n      expect(receivedOrders[1]?.args.amount).toBe(parseUnits('100', 6))\n    } finally {\n      unwatch()\n    }\n  })\n\n  test('behavior: filter by token', async () => {\n    const { base } = await setupTokenPair()\n    const { base: base2 } = await setupTokenPair()\n\n    const receivedOrders: Array<{\n      args: dex.watchOrderPlaced.Args\n      log: dex.watchOrderPlaced.Log\n    }> = []\n\n    // Watch only for orders on base\n    const unwatch = dex.watchOrderPlaced(config, {\n      token: base,\n      onOrderPlaced: (args, log) => {\n        receivedOrders.push({ args, log })\n      },\n    })\n\n    try {\n      // Place order on base (should be captured)\n      await dex.placeSync(config, {\n        token: base,\n        amount: parseUnits('100', 6),\n        type: 'buy',\n        tick: Tick.fromPrice('1.001'),\n      })\n\n      // Place order on base2 (should NOT be captured)\n      await dex.placeSync(config, {\n        token: base2,\n        amount: parseUnits('100', 6),\n        type: 'buy',\n        tick: Tick.fromPrice('1.001'),\n      })\n\n      await vi.waitFor(() => {\n        expect(receivedOrders).toHaveLength(1)\n      })\n      expect(receivedOrders[0]?.args.token.toLowerCase()).toBe(\n        base.toLowerCase(),\n      )\n    } finally {\n      unwatch()\n    }\n  })\n})\n\ndescribe('withdraw', () => {\n  test('default', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // Create internal balance\n    const { orderId } = await dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    await dex.cancelSync(config, { orderId })\n\n    // Get DEX balance\n    const dexBalance = await dex.getBalance(config, {\n      account: account.address,\n      token: quote,\n    })\n    expect(dexBalance).toBeGreaterThan(0n)\n\n    // Get wallet balance before withdraw\n    const walletBalanceBefore = await token.getBalance(config, {\n      token: quote,\n      account: account.address,\n    })\n\n    // Withdraw from DEX\n    const { receipt } = await dex.withdrawSync(config, {\n      token: quote,\n      amount: dexBalance,\n    })\n\n    expect(receipt).toBeDefined()\n    expect(receipt.status).toBe('success')\n\n    // Check DEX balance is now 0\n    const dexBalanceAfter = await dex.getBalance(config, {\n      account: account.address,\n      token: quote,\n    })\n    expect(dexBalanceAfter).toBe(0n)\n\n    // Check wallet balance increased\n    const walletBalanceAfter = await token.getBalance(config, {\n      token: quote,\n      account: account.address,\n    })\n    expect(walletBalanceAfter).toBeGreaterThan(walletBalanceBefore)\n  })\n})\n"
  },
  {
    "path": "packages/core/src/tempo/actions/dex.ts",
    "content": "import type { Account, BaseErrorType } from 'viem'\nimport { Actions } from 'viem/tempo'\nimport { getConnectorClient } from '../../actions/getConnectorClient.js'\nimport type { Config } from '../../createConfig.js'\nimport type {\n  ChainIdParameter,\n  ConnectorParameter,\n} from '../../types/properties.js'\nimport type { PartialBy, UnionLooseOmit } from '../../types/utils.js'\nimport type { QueryOptions, QueryParameter } from './utils.js'\n\n/**\n * Buys a specific amount of tokens.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.dex.buy(config, {\n *   tokenIn: '0x20c...11',\n *   tokenOut: '0x20c...20',\n *   amountOut: parseUnits('100', 6),\n *   maxAmountIn: parseUnits('105', 6),\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function buy<config extends Config>(\n  config: config,\n  parameters: buy.Parameters<config>,\n): Promise<Actions.dex.buy.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.dex.buy(client, parameters as never)\n}\n\nexport declare namespace buy {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.dex.buy.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.dex.buy.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.dex.buy.ErrorType\n}\n\n/**\n * Buys a specific amount of tokens.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.dex.buySync(config, {\n *   tokenIn: '0x20c...11',\n *   tokenOut: '0x20c...20',\n *   amountOut: parseUnits('100', 6),\n *   maxAmountIn: parseUnits('105', 6),\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt.\n */\nexport async function buySync<config extends Config>(\n  config: config,\n  parameters: buySync.Parameters<config>,\n): Promise<Actions.dex.buySync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.dex.buySync(client, parameters as never)\n}\n\nexport declare namespace buySync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.dex.buySync.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.dex.buySync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.dex.buySync.ErrorType\n}\n\n/**\n * Cancels an order from the orderbook.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.dex.cancel(config, {\n *   orderId: 123n,\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function cancel<config extends Config>(\n  config: config,\n  parameters: cancel.Parameters<config>,\n): Promise<Actions.dex.cancel.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.dex.cancel(client, parameters as never)\n}\n\nexport declare namespace cancel {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.dex.cancel.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.dex.cancel.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.dex.cancel.ErrorType\n}\n\n/**\n * Cancels an order from the orderbook.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.dex.cancelSync(config, {\n *   orderId: 123n,\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function cancelSync<config extends Config>(\n  config: config,\n  parameters: cancelSync.Parameters<config>,\n): Promise<Actions.dex.cancelSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.dex.cancelSync(client, parameters as never)\n}\n\nexport declare namespace cancelSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.dex.cancelSync.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.dex.cancelSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.dex.cancelSync.ErrorType\n}\n\n/**\n * Cancels a stale order from the orderbook.\n *\n * A stale order is one where the owner's balance or allowance has dropped\n * below the order amount.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.dex.cancelStale(config, {\n *   orderId: 123n,\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function cancelStale<config extends Config>(\n  config: config,\n  parameters: cancelStale.Parameters<config>,\n): Promise<Actions.dex.cancelStale.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.dex.cancelStale(client, parameters as never)\n}\n\nexport declare namespace cancelStale {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.dex.cancelStale.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.dex.cancelStale.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.dex.cancelStale.ErrorType\n}\n\n/**\n * Cancels a stale order from the orderbook and waits for confirmation.\n *\n * A stale order is one where the owner's balance or allowance has dropped\n * below the order amount.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.dex.cancelStaleSync(config, {\n *   orderId: 123n,\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function cancelStaleSync<config extends Config>(\n  config: config,\n  parameters: cancelStaleSync.Parameters<config>,\n): Promise<Actions.dex.cancelStaleSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.dex.cancelStaleSync(client, parameters as never)\n}\n\nexport declare namespace cancelStaleSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.dex.cancelStaleSync.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.dex.cancelStaleSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.dex.cancelStaleSync.ErrorType\n}\n\n/**\n * Creates a new trading pair on the DEX.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.dex.createPair(config, {\n *   base: '0x20c...11',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function createPair<config extends Config>(\n  config: config,\n  parameters: createPair.Parameters<config>,\n): Promise<Actions.dex.createPair.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.dex.createPair(client, parameters as never)\n}\n\nexport declare namespace createPair {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.dex.createPair.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.dex.createPair.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.dex.createPair.ErrorType\n}\n\n/**\n * Creates a new trading pair on the DEX.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.dex.createPairSync(config, {\n *   base: '0x20c...11',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function createPairSync<config extends Config>(\n  config: config,\n  parameters: createPairSync.Parameters<config>,\n): Promise<Actions.dex.createPairSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.dex.createPairSync(client, parameters as never)\n}\n\nexport declare namespace createPairSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.dex.createPairSync.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.dex.createPairSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.dex.createPairSync.ErrorType\n}\n\n/**\n * Gets a user's token balance on the DEX.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const balance = await Actions.dex.getBalance(config, {\n *   account: '0x...',\n *   token: '0x20c...11',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The user's token balance on the DEX.\n */\nexport function getBalance<config extends Config>(\n  config: config,\n  parameters: getBalance.Parameters<config>,\n): Promise<getBalance.ReturnValue> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.dex.getBalance(client, rest)\n}\n\nexport namespace getBalance {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.dex.getBalance.Parameters\n\n  export type ReturnValue = Actions.dex.getBalance.ReturnValue\n\n  export type ErrorType = BaseErrorType\n\n  export function queryKey<config extends Config>(\n    parameters: PartialBy<Parameters<config>, 'account'>,\n  ) {\n    return ['getBalance', parameters] as const\n  }\n\n  export type QueryKey<config extends Config> = ReturnType<\n    typeof queryKey<config>\n  >\n\n  export function queryOptions<config extends Config, selectData = ReturnValue>(\n    config: Config,\n    parameters: queryOptions.Parameters<config, selectData>,\n  ): queryOptions.ReturnValue<config, selectData> {\n    const { query, ...rest } = parameters\n    return {\n      ...query,\n      enabled: Boolean(rest.account && (query?.enabled ?? true)),\n      queryKey: queryKey(rest),\n      async queryFn({ queryKey }) {\n        const [, { account, ...parameters }] = queryKey\n        if (!account) throw new Error('account is required.')\n        return await getBalance(config, { account, ...parameters })\n      },\n    }\n  }\n\n  export declare namespace queryOptions {\n    export type Parameters<\n      config extends Config,\n      selectData = getBalance.ReturnValue,\n    > = PartialBy<getBalance.Parameters<config>, 'account'> &\n      QueryParameter<\n        getBalance.ReturnValue,\n        getBalance.ErrorType,\n        selectData,\n        getBalance.QueryKey<config>\n      >\n\n    export type ReturnValue<\n      config extends Config,\n      selectData = getBalance.ReturnValue,\n    > = QueryOptions<\n      getBalance.ReturnValue,\n      getBalance.ErrorType,\n      selectData,\n      getBalance.QueryKey<config>\n    >\n  }\n}\n\n/**\n * Gets the quote for buying a specific amount of tokens.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const amountIn = await Actions.dex.getBuyQuote(config, {\n *   amountOut: parseUnits('100', 6),\n *   tokenIn: '0x20c...11',\n *   tokenOut: '0x20c...20',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The amount of tokenIn needed to buy the specified amountOut.\n */\nexport function getBuyQuote<config extends Config>(\n  config: config,\n  parameters: getBuyQuote.Parameters<config>,\n): Promise<getBuyQuote.ReturnValue> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.dex.getBuyQuote(client, rest)\n}\n\nexport namespace getBuyQuote {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.dex.getBuyQuote.Parameters\n\n  export type ReturnValue = Actions.dex.getBuyQuote.ReturnValue\n\n  export type ErrorType = BaseErrorType\n\n  export function queryKey<config extends Config>(\n    parameters: Parameters<config>,\n  ) {\n    return ['getBuyQuote', parameters] as const\n  }\n\n  export type QueryKey<config extends Config> = ReturnType<\n    typeof queryKey<config>\n  >\n\n  export function queryOptions<config extends Config, selectData = ReturnValue>(\n    config: Config,\n    parameters: queryOptions.Parameters<config, selectData>,\n  ): queryOptions.ReturnValue<config, selectData> {\n    const { query, ...rest } = parameters\n    return {\n      ...query,\n      enabled: Boolean(\n        rest.tokenIn &&\n          rest.tokenOut &&\n          rest.amountOut &&\n          (query?.enabled ?? true),\n      ),\n      queryKey: queryKey(rest),\n      async queryFn({ queryKey }) {\n        const [, parameters] = queryKey\n        return await getBuyQuote(config, parameters)\n      },\n    }\n  }\n\n  export declare namespace queryOptions {\n    export type Parameters<\n      config extends Config,\n      selectData = getBuyQuote.ReturnValue,\n    > = getBuyQuote.Parameters<config> &\n      QueryParameter<\n        getBuyQuote.ReturnValue,\n        getBuyQuote.ErrorType,\n        selectData,\n        getBuyQuote.QueryKey<config>\n      >\n\n    export type ReturnValue<\n      config extends Config,\n      selectData = getBuyQuote.ReturnValue,\n    > = QueryOptions<\n      getBuyQuote.ReturnValue,\n      getBuyQuote.ErrorType,\n      selectData,\n      getBuyQuote.QueryKey<config>\n    >\n  }\n}\n\n/**\n * Gets an order's details from the orderbook.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const order = await Actions.dex.getOrder(config, {\n *   orderId: 123n,\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The order details.\n */\nexport function getOrder<config extends Config>(\n  config: config,\n  parameters: getOrder.Parameters<config>,\n): Promise<getOrder.ReturnValue> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.dex.getOrder(client, rest)\n}\n\nexport namespace getOrder {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.dex.getOrder.Parameters\n\n  export type ReturnValue = Actions.dex.getOrder.ReturnValue\n\n  export type ErrorType = BaseErrorType\n\n  export function queryKey<config extends Config>(\n    parameters: Parameters<config>,\n  ) {\n    return ['getOrder', parameters] as const\n  }\n\n  export type QueryKey<config extends Config> = ReturnType<\n    typeof queryKey<config>\n  >\n\n  export function queryOptions<config extends Config, selectData = ReturnValue>(\n    config: Config,\n    parameters: queryOptions.Parameters<config, selectData>,\n  ): queryOptions.ReturnValue<config, selectData> {\n    const { query, ...rest } = parameters\n    return {\n      ...query,\n      enabled: Boolean(rest.orderId !== undefined && (query?.enabled ?? true)),\n      queryKey: queryKey(rest),\n      async queryFn({ queryKey }) {\n        const [, parameters] = queryKey\n        return await getOrder(config, parameters)\n      },\n    }\n  }\n\n  export declare namespace queryOptions {\n    export type Parameters<\n      config extends Config,\n      selectData = getOrder.ReturnValue,\n    > = getOrder.Parameters<config> &\n      QueryParameter<\n        getOrder.ReturnValue,\n        getOrder.ErrorType,\n        selectData,\n        getOrder.QueryKey<config>\n      >\n\n    export type ReturnValue<\n      config extends Config,\n      selectData = getOrder.ReturnValue,\n    > = QueryOptions<\n      getOrder.ReturnValue,\n      getOrder.ErrorType,\n      selectData,\n      getOrder.QueryKey<config>\n    >\n  }\n}\n\n/**\n * Gets orderbook information for a trading pair.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const book = await Actions.dex.getOrderbook(config, {\n *   base: '0x20c...11',\n *   quote: '0x20c...20',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The orderbook information.\n */\nexport function getOrderbook<config extends Config>(\n  config: config,\n  parameters: getOrderbook.Parameters<config>,\n): Promise<getOrderbook.ReturnValue> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.dex.getOrderbook(client, rest)\n}\n\nexport namespace getOrderbook {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.dex.getOrderbook.Parameters\n\n  export type ReturnValue = Actions.dex.getOrderbook.ReturnValue\n\n  export type ErrorType = BaseErrorType\n\n  export function queryKey<config extends Config>(\n    parameters: Parameters<config>,\n  ) {\n    return ['getOrderbook', parameters] as const\n  }\n\n  export type QueryKey<config extends Config> = ReturnType<\n    typeof queryKey<config>\n  >\n\n  export function queryOptions<config extends Config, selectData = ReturnValue>(\n    config: Config,\n    parameters: queryOptions.Parameters<config, selectData>,\n  ): queryOptions.ReturnValue<config, selectData> {\n    const { query, ...rest } = parameters\n    return {\n      ...query,\n      enabled: Boolean(rest.base && rest.quote && (query?.enabled ?? true)),\n      queryKey: queryKey(rest),\n      async queryFn({ queryKey }) {\n        const [, parameters] = queryKey\n        return await getOrderbook(config, parameters)\n      },\n    }\n  }\n\n  export declare namespace queryOptions {\n    export type Parameters<\n      config extends Config,\n      selectData = getOrderbook.ReturnValue,\n    > = getOrderbook.Parameters<config> &\n      QueryParameter<\n        getOrderbook.ReturnValue,\n        getOrderbook.ErrorType,\n        selectData,\n        getOrderbook.QueryKey<config>\n      >\n\n    export type ReturnValue<\n      config extends Config,\n      selectData = getOrderbook.ReturnValue,\n    > = QueryOptions<\n      getOrderbook.ReturnValue,\n      getOrderbook.ErrorType,\n      selectData,\n      getOrderbook.QueryKey<config>\n    >\n  }\n}\n\n/**\n * Gets the price level information at a specific tick.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions, Tick } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const level = await Actions.dex.getTickLevel(config, {\n *   base: '0x20c...11',\n *   tick: Tick.fromPrice('1.001'),\n *   isBid: true,\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The price level information.\n */\nexport function getTickLevel<config extends Config>(\n  config: config,\n  parameters: getTickLevel.Parameters<config>,\n): Promise<getTickLevel.ReturnValue> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.dex.getTickLevel(client, rest)\n}\n\nexport namespace getTickLevel {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.dex.getTickLevel.Parameters\n\n  export type ReturnValue = Actions.dex.getTickLevel.ReturnValue\n\n  export type ErrorType = BaseErrorType\n\n  export function queryKey<config extends Config>(\n    parameters: Parameters<config>,\n  ) {\n    return ['getTickLevel', parameters] as const\n  }\n\n  export type QueryKey<config extends Config> = ReturnType<\n    typeof queryKey<config>\n  >\n\n  export function queryOptions<config extends Config, selectData = ReturnValue>(\n    config: Config,\n    parameters: queryOptions.Parameters<config, selectData>,\n  ): queryOptions.ReturnValue<config, selectData> {\n    const { query, ...rest } = parameters\n    return {\n      ...query,\n      enabled: Boolean(\n        rest.base &&\n          rest.tick !== undefined &&\n          rest.isBid !== undefined &&\n          (query?.enabled ?? true),\n      ),\n      queryKey: queryKey(rest),\n      async queryFn({ queryKey }) {\n        const [, parameters] = queryKey\n        return await getTickLevel(config, parameters)\n      },\n    }\n  }\n\n  export declare namespace queryOptions {\n    export type Parameters<\n      config extends Config,\n      selectData = getTickLevel.ReturnValue,\n    > = getTickLevel.Parameters<config> &\n      QueryParameter<\n        getTickLevel.ReturnValue,\n        getTickLevel.ErrorType,\n        selectData,\n        getTickLevel.QueryKey<config>\n      >\n\n    export type ReturnValue<\n      config extends Config,\n      selectData = getTickLevel.ReturnValue,\n    > = QueryOptions<\n      getTickLevel.ReturnValue,\n      getTickLevel.ErrorType,\n      selectData,\n      getTickLevel.QueryKey<config>\n    >\n  }\n}\n\n/**\n * Gets the quote for selling a specific amount of tokens.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const amountOut = await Actions.dex.getSellQuote(config, {\n *   amountIn: parseUnits('100', 6),\n *   tokenIn: '0x20c...11',\n *   tokenOut: '0x20c...20',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The amount of tokenOut received for selling the specified amountIn.\n */\nexport function getSellQuote<config extends Config>(\n  config: config,\n  parameters: getSellQuote.Parameters<config>,\n): Promise<getSellQuote.ReturnValue> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.dex.getSellQuote(client, rest)\n}\n\nexport namespace getSellQuote {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.dex.getSellQuote.Parameters\n\n  export type ReturnValue = Actions.dex.getSellQuote.ReturnValue\n\n  export type ErrorType = BaseErrorType\n\n  export function queryKey<config extends Config>(\n    parameters: Parameters<config>,\n  ) {\n    return ['getSellQuote', parameters] as const\n  }\n\n  export type QueryKey<config extends Config> = ReturnType<\n    typeof queryKey<config>\n  >\n\n  export function queryOptions<config extends Config, selectData = ReturnValue>(\n    config: Config,\n    parameters: queryOptions.Parameters<config, selectData>,\n  ): queryOptions.ReturnValue<config, selectData> {\n    const { query, ...rest } = parameters\n    return {\n      ...query,\n      enabled: Boolean(\n        rest.tokenIn &&\n          rest.tokenOut &&\n          rest.amountIn &&\n          (query?.enabled ?? true),\n      ),\n      queryKey: queryKey(rest),\n      async queryFn({ queryKey }) {\n        const [, parameters] = queryKey\n        return await getSellQuote(config, parameters)\n      },\n    }\n  }\n\n  export declare namespace queryOptions {\n    export type Parameters<\n      config extends Config,\n      selectData = getSellQuote.ReturnValue,\n    > = getSellQuote.Parameters<config> &\n      QueryParameter<\n        getSellQuote.ReturnValue,\n        getSellQuote.ErrorType,\n        selectData,\n        getSellQuote.QueryKey<config>\n      >\n\n    export type ReturnValue<\n      config extends Config,\n      selectData = getSellQuote.ReturnValue,\n    > = QueryOptions<\n      getSellQuote.ReturnValue,\n      getSellQuote.ErrorType,\n      selectData,\n      getSellQuote.QueryKey<config>\n    >\n  }\n}\n\n/**\n * Places a limit order on the orderbook.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.dex.place(config, {\n *   amount: parseUnits('100', 6),\n *   tick: Tick.fromPrice('0.99'),\n *   token: '0x20c...11',\n *   type: 'buy',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function place<config extends Config>(\n  config: config,\n  parameters: place.Parameters<config>,\n): Promise<Actions.dex.place.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.dex.place(client, parameters as never)\n}\n\nexport declare namespace place {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.dex.place.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.dex.place.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.dex.place.ErrorType\n}\n\n/**\n * Places a flip order that automatically flips when filled.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.dex.placeFlip(config, {\n *   amount: parseUnits('100', 6),\n *   flipTick: Tick.fromPrice('1.01'),\n *   tick: Tick.fromPrice('0.99'),\n *   token: '0x20c...11',\n *   type: 'buy',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function placeFlip<config extends Config>(\n  config: config,\n  parameters: placeFlip.Parameters<config>,\n): Promise<Actions.dex.placeFlip.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.dex.placeFlip(client, parameters as never)\n}\n\nexport declare namespace placeFlip {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.dex.placeFlip.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.dex.placeFlip.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.dex.placeFlip.ErrorType\n}\n\n/**\n * Places a flip order that automatically flips when filled.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.dex.placeFlipSync(config, {\n *   amount: parseUnits('100', 6),\n *   flipTick: Tick.fromPrice('1.01'),\n *   tick: Tick.fromPrice('0.99'),\n *   token: '0x20c...11',\n *   type: 'buy',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function placeFlipSync<config extends Config>(\n  config: config,\n  parameters: placeFlipSync.Parameters<config>,\n): Promise<Actions.dex.placeFlipSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.dex.placeFlipSync(client, parameters as never)\n}\n\nexport declare namespace placeFlipSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.dex.placeFlipSync.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.dex.placeFlipSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.dex.placeFlipSync.ErrorType\n}\n\n/**\n * Places a limit order on the orderbook.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.dex.placeSync(config, {\n *   amount: parseUnits('100', 6),\n *   tick: Tick.fromPrice('0.99'),\n *   token: '0x20c...11',\n *   type: 'buy',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function placeSync<config extends Config>(\n  config: config,\n  parameters: placeSync.Parameters<config>,\n): Promise<Actions.dex.placeSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.dex.placeSync(client, parameters as never)\n}\n\nexport declare namespace placeSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.dex.placeSync.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.dex.placeSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.dex.placeSync.ErrorType\n}\n\n/**\n * Sells a specific amount of tokens.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.dex.sell(config, {\n *   amountIn: parseUnits('100', 6),\n *   minAmountOut: parseUnits('95', 6),\n *   tokenIn: '0x20c...11',\n *   tokenOut: '0x20c...20',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function sell<config extends Config>(\n  config: config,\n  parameters: sell.Parameters<config>,\n): Promise<Actions.dex.sell.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.dex.sell(client, parameters as never)\n}\n\nexport declare namespace sell {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.dex.sell.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.dex.sell.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.dex.sell.ErrorType\n}\n\n/**\n * Sells a specific amount of tokens.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.dex.sellSync(config, {\n *   amountIn: parseUnits('100', 6),\n *   minAmountOut: parseUnits('95', 6),\n *   tokenIn: '0x20c...11',\n *   tokenOut: '0x20c...20',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt.\n */\nexport async function sellSync<config extends Config>(\n  config: config,\n  parameters: sellSync.Parameters<config>,\n): Promise<Actions.dex.sellSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.dex.sellSync(client, parameters as never)\n}\n\nexport declare namespace sellSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.dex.sellSync.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.dex.sellSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.dex.sellSync.ErrorType\n}\n\n/**\n * Watches for flip order placement events on the DEX.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const unwatch = Actions.dex.watchFlipOrderPlaced(config, {\n *   onFlipOrderPlaced: (args, log) => {\n *     console.log('Flip order placed:', args)\n *   },\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchFlipOrderPlaced<config extends Config>(\n  config: config,\n  parameters: watchFlipOrderPlaced.Parameters<config>,\n) {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.dex.watchFlipOrderPlaced(client, rest)\n}\n\nexport declare namespace watchFlipOrderPlaced {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.dex.watchFlipOrderPlaced.Parameters\n\n  export type Args = Actions.dex.watchFlipOrderPlaced.Args\n\n  export type Log = Actions.dex.watchFlipOrderPlaced.Log\n}\n\n/**\n * Watches for order cancellation events on the DEX.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const unwatch = Actions.dex.watchOrderCancelled(config, {\n *   onOrderCancelled: (args, log) => {\n *     console.log('Order cancelled:', args)\n *   },\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchOrderCancelled<config extends Config>(\n  config: config,\n  parameters: watchOrderCancelled.Parameters<config>,\n) {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.dex.watchOrderCancelled(client, rest)\n}\n\nexport declare namespace watchOrderCancelled {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.dex.watchOrderCancelled.Parameters\n\n  export type Args = Actions.dex.watchOrderCancelled.Args\n\n  export type Log = Actions.dex.watchOrderCancelled.Log\n}\n\n/**\n * Watches for order filled events on the DEX.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const unwatch = Actions.dex.watchOrderFilled(config, {\n *   onOrderFilled: (args, log) => {\n *     console.log('Order filled:', args)\n *   },\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchOrderFilled<config extends Config>(\n  config: config,\n  parameters: watchOrderFilled.Parameters<config>,\n) {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.dex.watchOrderFilled(client, rest)\n}\n\nexport declare namespace watchOrderFilled {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.dex.watchOrderFilled.Parameters\n\n  export type Args = Actions.dex.watchOrderFilled.Args\n\n  export type Log = Actions.dex.watchOrderFilled.Log\n}\n\n/**\n * Watches for order placement events on the DEX.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const unwatch = Actions.dex.watchOrderPlaced(config, {\n *   onOrderPlaced: (args, log) => {\n *     console.log('Order placed:', args)\n *   },\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchOrderPlaced<config extends Config>(\n  config: config,\n  parameters: watchOrderPlaced.Parameters<config>,\n) {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.dex.watchOrderPlaced(client, rest)\n}\n\nexport declare namespace watchOrderPlaced {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.dex.watchOrderPlaced.Parameters\n\n  export type Args = Actions.dex.watchOrderPlaced.Args\n\n  export type Log = Actions.dex.watchOrderPlaced.Log\n}\n\n/**\n * Withdraws tokens from the DEX to the caller's wallet.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.dex.withdraw(config, {\n *   amount: 100n,\n *   token: '0x20c...11',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function withdraw<config extends Config>(\n  config: config,\n  parameters: withdraw.Parameters<config>,\n): Promise<Actions.dex.withdraw.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.dex.withdraw(client, parameters as never)\n}\n\nexport declare namespace withdraw {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.dex.withdraw.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.dex.withdraw.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.dex.withdraw.ErrorType\n}\n\n/**\n * Withdraws tokens from the DEX to the caller's wallet.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.dex.withdrawSync(config, {\n *   amount: 100n,\n *   token: '0x20c...11',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function withdrawSync<config extends Config>(\n  config: config,\n  parameters: withdrawSync.Parameters<config>,\n): Promise<Actions.dex.withdrawSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.dex.withdrawSync(client, parameters as never)\n}\n\nexport declare namespace withdrawSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.dex.withdrawSync.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.dex.withdrawSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.dex.withdrawSync.ErrorType\n}\n"
  },
  {
    "path": "packages/core/src/tempo/actions/faucet.ts",
    "content": "import type { BaseErrorType } from 'viem'\nimport { Actions } from 'viem/tempo'\nimport type { Config } from '../../createConfig.js'\nimport type { ChainIdParameter } from '../../types/properties.js'\nimport type { UnionCompute } from '../../types/utils.js'\n\n/**\n * Funds an account with an initial amount of set token(s)\n * on Tempo's testnet.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hashes = await Actions.faucet.fund(config, {\n *   account: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction hashes.\n */\nexport async function fund<config extends Config>(\n  config: config,\n  parameters: fund.Parameters<config>,\n): Promise<fund.ReturnValue> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.faucet.fund(client, rest)\n}\n\nexport declare namespace fund {\n  export type Parameters<config extends Config> = UnionCompute<\n    ChainIdParameter<config> & Actions.faucet.fund.Parameters\n  >\n\n  export type ReturnValue = Actions.faucet.fund.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.faucet.fund.ErrorType\n}\n\n/**\n * Funds an account with an initial amount of set token(s)\n * on Tempo's testnet. Returns with the transaction receipts.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const receipts = await Actions.faucet.fundSync(config, {\n *   account: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction hashes.\n */\nexport async function fundSync<config extends Config>(\n  config: config,\n  parameters: fundSync.Parameters<config>,\n): Promise<fundSync.ReturnValue> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.faucet.fundSync(client, rest)\n}\n\nexport declare namespace fundSync {\n  export type Parameters<config extends Config> = UnionCompute<\n    ChainIdParameter<config> & Actions.faucet.fundSync.Parameters\n  >\n\n  export type ReturnValue = Actions.faucet.fundSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.faucet.fundSync.ErrorType\n}\n"
  },
  {
    "path": "packages/core/src/tempo/actions/fee.test.ts",
    "content": "import { connect } from '@wagmi/core'\nimport { accounts, config, queryClient } from '@wagmi/test/tempo'\nimport { describe, expect, test } from 'vitest'\nimport { getUserToken, setUserToken, setUserTokenSync } from './fee.js'\n\nconst account = accounts[0]\n\ndescribe('getUserToken', () => {\n  test('default', async () => {\n    const result = await getUserToken(config, {\n      account,\n    })\n    expect(result).toMatchInlineSnapshot(`\n      {\n        \"address\": \"0x20C0000000000000000000000000000000000001\",\n        \"id\": 1n,\n      }\n    `)\n  })\n\n  describe('queryOptions', () => {\n    test('default', async () => {\n      const options = getUserToken.queryOptions(config, {\n        account,\n      })\n      expect(await queryClient.fetchQuery(options)).toMatchInlineSnapshot(\n        `\n        {\n          \"address\": \"0x20C0000000000000000000000000000000000001\",\n          \"id\": 1n,\n        }\n      `,\n      )\n    })\n  })\n})\n\ndescribe('setUserToken', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n    const hash = await setUserToken(config, {\n      account,\n      token: '0x20C0000000000000000000000000000000000001',\n    })\n    expect(hash).toBeDefined()\n  })\n})\n\ndescribe('setUserTokenSync', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n    const result = await setUserTokenSync(config, {\n      account,\n      token: '0x20C0000000000000000000000000000000000001',\n    })\n    expect(result).toBeDefined()\n  })\n})\n"
  },
  {
    "path": "packages/core/src/tempo/actions/fee.ts",
    "content": "import type { Account, BaseErrorType } from 'viem'\nimport { Actions } from 'viem/tempo'\nimport { getConnectorClient } from '../../actions/getConnectorClient.js'\nimport type { Config } from '../../createConfig.js'\nimport type {\n  ChainIdParameter,\n  ConnectorParameter,\n} from '../../types/properties.js'\nimport type { PartialBy, UnionLooseOmit } from '../../types/utils.js'\nimport type { QueryOptions, QueryParameter } from './utils.js'\nimport { filterQueryOptions } from './utils.js'\n\n/**\n * Gets the user's default fee token.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.fee.getUserToken(config, {\n *   account: '0x20c...0055',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns Transaction hash.\n */\nexport function getUserToken<config extends Config>(\n  config: config,\n  parameters: getUserToken.Parameters<config>,\n): Promise<getUserToken.ReturnValue> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.fee.getUserToken(client, rest)\n}\n\nexport namespace getUserToken {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.fee.getUserToken.Parameters\n\n  export type ReturnValue = Actions.fee.getUserToken.ReturnValue\n\n  export type ErrorType = BaseErrorType\n\n  export function queryKey<config extends Config>(\n    parameters: PartialBy<Parameters<config>, 'account'>,\n  ) {\n    return ['getUserToken', filterQueryOptions(parameters)] as const\n  }\n\n  export type QueryKey<config extends Config> = ReturnType<\n    typeof queryKey<config>\n  >\n\n  export function queryOptions<config extends Config, selectData = ReturnValue>(\n    config: Config,\n    parameters: queryOptions.Parameters<config, selectData>,\n  ): queryOptions.ReturnValue<config, selectData> {\n    const { query, ...rest } = parameters\n    return {\n      ...query,\n      enabled: Boolean(rest.account && (query?.enabled ?? true)),\n      queryKey: queryKey(rest),\n      async queryFn(context) {\n        const [, { account, ...parameters }] = context.queryKey\n        if (!account) throw new Error('account is required.')\n        return await getUserToken(config, { account, ...parameters })\n      },\n    }\n  }\n\n  export declare namespace queryOptions {\n    export type Parameters<\n      config extends Config,\n      selectData = getUserToken.ReturnValue,\n    > = PartialBy<getUserToken.Parameters<config>, 'account'> &\n      QueryParameter<\n        getUserToken.ReturnValue,\n        getUserToken.ErrorType,\n        selectData,\n        getUserToken.QueryKey<config>\n      >\n\n    export type ReturnValue<\n      config extends Config,\n      selectData = getUserToken.ReturnValue,\n    > = QueryOptions<\n      getUserToken.ReturnValue,\n      getUserToken.ErrorType,\n      selectData,\n      getUserToken.QueryKey<config>\n    >\n  }\n}\n\n/**\n * Sets the user's default fee token.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.fee.setUserToken(config, {\n *   token: '0x20c...0055',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function setUserToken<config extends Config>(\n  config: config,\n  parameters: setUserToken.Parameters<config>,\n): Promise<Actions.fee.setUserToken.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.fee.setUserToken(client, parameters as never)\n}\n\nexport declare namespace setUserToken {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.fee.setUserToken.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.fee.setUserToken.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.fee.setUserToken.ErrorType\n}\n\n/**\n * Sets the user's default fee token.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.fee.setUserTokenSync(config, {\n *   token: '0x20c...0055',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function setUserTokenSync<config extends Config>(\n  config: config,\n  parameters: setUserTokenSync.Parameters<config>,\n): Promise<Actions.fee.setUserTokenSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.fee.setUserTokenSync(client, parameters as never)\n}\n\nexport declare namespace setUserTokenSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.fee.setUserTokenSync.Parameters<\n        config['chains'][number],\n        Account\n      >,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.fee.setUserTokenSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.fee.setUserTokenSync.ErrorType\n}\n\n/**\n * Watches for user token set events on the Fee Manager.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const unwatch = Actions.fee.watchSetUserToken(config, {\n *   onUserTokenSet: (args, log) => {\n *     console.log('User token set:', args)\n *   },\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchSetUserToken<config extends Config>(\n  config: config,\n  parameters: watchSetUserToken.Parameters<config>,\n): () => void {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.fee.watchSetUserToken(client, rest)\n}\n\nexport declare namespace watchSetUserToken {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.fee.watchSetUserToken.Parameters\n}\n"
  },
  {
    "path": "packages/core/src/tempo/actions/index.ts",
    "content": "/** biome-ignore-all lint/performance/noReExportAll: entrypoint */\n// biome-ignore lint/performance/noBarrelFile: stable\nexport * as amm from './amm.js'\nexport * as dex from './dex.js'\nexport * as faucet from './faucet.js'\nexport * as fee from './fee.js'\nexport * as nonce from './nonce.js'\nexport * as policy from './policy.js'\nexport * as reward from './reward.js'\nexport * as token from './token.js'\n"
  },
  {
    "path": "packages/core/src/tempo/actions/nonce.test.ts",
    "content": "import { accounts, config, queryClient, restart } from '@wagmi/test/tempo'\nimport { beforeEach, describe, expect, test, vi } from 'vitest'\nimport * as nonce from './nonce.js'\nimport * as token from './token.js'\n\nconst account = accounts[0]\nconst account2 = accounts[1]\n\nbeforeEach(async () => {\n  await restart()\n})\n\ndescribe('getNonce', () => {\n  test('default', async () => {\n    const result = await nonce.getNonce(config, {\n      account: account.address,\n      nonceKey: 1n,\n    })\n    expect(result).toBe(0n)\n  })\n\n  test('queryOptions', async () => {\n    const options = nonce.getNonce.queryOptions(config, {\n      account: account.address,\n      nonceKey: 1n,\n    })\n    const result = await queryClient.fetchQuery(options)\n    expect(result).toBe(0n)\n  })\n})\n\ntest('watchNonceIncremented', async () => {\n  const events: any[] = []\n  const unwatch = nonce.watchNonceIncremented(config, {\n    onNonceIncremented: (args) => {\n      events.push(args)\n    },\n    args: {\n      account: account.address,\n      nonceKey: 5n,\n    },\n  })\n\n  // Have to manually set nonce because eth_FillTransaction does not support nonce keys\n  await token.transferSync(config, {\n    to: account2.address,\n    amount: 1n,\n    token: 1n,\n    nonceKey: 5n,\n    nonce: 0,\n  })\n\n  await token.transferSync(config, {\n    to: account2.address,\n    amount: 1n,\n    token: 1n,\n    nonceKey: 5n,\n    nonce: 1,\n  })\n\n  await vi.waitFor(() => {\n    expect(events).toHaveLength(2)\n  })\n  unwatch()\n\n  expect(events[0]?.account).toBe(account.address)\n  expect(events[0]?.nonceKey).toBe(5n)\n  expect(events[0]?.newNonce).toBe(1n)\n  expect(events[1]?.newNonce).toBe(2n)\n})\n"
  },
  {
    "path": "packages/core/src/tempo/actions/nonce.ts",
    "content": "import type { BaseErrorType } from 'viem'\nimport { Actions } from 'viem/tempo'\nimport type { Config } from '../../createConfig.js'\nimport type { ChainIdParameter } from '../../types/properties.js'\nimport type { PartialBy } from '../../types/utils.js'\nimport type { QueryOptions, QueryParameter } from './utils.js'\nimport { filterQueryOptions } from './utils.js'\n\n/**\n * Gets the nonce for an account and nonce key.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const nonce = await Actions.nonce.getNonce(config, {\n *   account: '0x...',\n *   nonceKey: 1n,\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The nonce value.\n */\nexport function getNonce<config extends Config>(\n  config: config,\n  parameters: getNonce.Parameters<config>,\n): Promise<getNonce.ReturnValue> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.nonce.getNonce(client, rest)\n}\n\nexport namespace getNonce {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.nonce.getNonce.Parameters\n\n  export type ReturnValue = Actions.nonce.getNonce.ReturnValue\n\n  export type ErrorType = BaseErrorType\n\n  export function queryKey<config extends Config>(\n    parameters: PartialBy<Parameters<config>, 'account' | 'nonceKey'>,\n  ) {\n    return ['getNonce', filterQueryOptions(parameters)] as const\n  }\n\n  export type QueryKey<config extends Config> = ReturnType<\n    typeof queryKey<config>\n  >\n\n  export function queryOptions<config extends Config, selectData = ReturnValue>(\n    config: Config,\n    parameters: queryOptions.Parameters<config, selectData>,\n  ): queryOptions.ReturnValue<config, selectData> {\n    const { query, ...rest } = parameters\n    return {\n      ...query,\n      enabled: Boolean(\n        rest.account && rest.nonceKey !== undefined && (query?.enabled ?? true),\n      ),\n      queryKey: queryKey(rest),\n      async queryFn(context) {\n        const [, { account, nonceKey, ...parameters }] = context.queryKey\n        if (!account) throw new Error('account is required.')\n        if (nonceKey === undefined) throw new Error('nonceKey is required.')\n        return await getNonce(config, { account, nonceKey, ...parameters })\n      },\n    }\n  }\n\n  export declare namespace queryOptions {\n    export type Parameters<\n      config extends Config,\n      selectData = getNonce.ReturnValue,\n    > = PartialBy<getNonce.Parameters<config>, 'account' | 'nonceKey'> &\n      QueryParameter<\n        getNonce.ReturnValue,\n        getNonce.ErrorType,\n        selectData,\n        getNonce.QueryKey<config>\n      >\n\n    export type ReturnValue<\n      config extends Config,\n      selectData = getNonce.ReturnValue,\n    > = QueryOptions<\n      getNonce.ReturnValue,\n      getNonce.ErrorType,\n      selectData,\n      getNonce.QueryKey<config>\n    >\n  }\n}\n\n/**\n * Watches for nonce incremented events.\n *\n * @deprecated This function has been deprecated post-AllegroModerato. It will be removed in a future version.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const unwatch = Actions.nonce.watchNonceIncremented(config, {\n *   onNonceIncremented: (args, log) => {\n *     console.log('Nonce incremented:', args)\n *   },\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchNonceIncremented<config extends Config>(\n  config: config,\n  parameters: watchNonceIncremented.Parameters<config>,\n): () => void {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.nonce.watchNonceIncremented(client, rest)\n}\n\nexport declare namespace watchNonceIncremented {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.nonce.watchNonceIncremented.Parameters\n}\n"
  },
  {
    "path": "packages/core/src/tempo/actions/policy.test.ts",
    "content": "import { connect } from '@wagmi/core'\nimport { accounts, config, queryClient } from '@wagmi/test/tempo'\nimport { describe, expect, test, vi } from 'vitest'\nimport * as policy from './policy.js'\n\nconst account = accounts[0]\nconst account2 = accounts[1]\n\ndescribe('create', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    const result = await policy.createSync(config, {\n      type: 'whitelist',\n    })\n\n    expect(result.receipt).toBeDefined()\n    expect(result.policyId).toBeDefined()\n    expect(result.policyType).toBe(0)\n    expect(result.updater).toBe(account.address)\n\n    // verify policy was created\n    const data = await policy.getData(config, {\n      policyId: result.policyId,\n    })\n    expect(data.admin).toBe(account.address)\n    expect(data.type).toBe('whitelist')\n  })\n\n  test('behavior: blacklist', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    const result = await policy.createSync(config, {\n      type: 'blacklist',\n    })\n\n    expect(result.receipt).toBeDefined()\n    expect(result.policyId).toBeDefined()\n    expect(result.policyType).toBe(1)\n    expect(result.updater).toBe(account.address)\n\n    // verify policy was created\n    const data = await policy.getData(config, {\n      policyId: result.policyId,\n    })\n    expect(data.admin).toBe(account.address)\n    expect(data.type).toBe('blacklist')\n  })\n})\n\ndescribe('setAdmin', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // create policy\n    const { policyId } = await policy.createSync(config, {\n      type: 'whitelist',\n    })\n\n    // set new admin\n    const { receipt: setAdminReceipt, ...setAdminResult } =\n      await policy.setAdminSync(config, {\n        policyId,\n        admin: account2.address,\n      })\n    expect(setAdminReceipt).toBeDefined()\n    expect(setAdminResult.policyId).toBe(policyId)\n    expect(setAdminResult.admin).toBe(account2.address)\n    expect(setAdminResult.updater).toBe(account.address)\n\n    {\n      // verify new admin\n      const data = await policy.getData(config, {\n        policyId,\n      })\n      expect(data.admin).toBe(account2.address)\n    }\n  })\n})\n\ndescribe('modifyWhitelist', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // create whitelist policy\n    const { policyId } = await policy.createSync(config, {\n      type: 'whitelist',\n    })\n\n    // verify account2 is not authorized\n    {\n      const isAuthorized = await policy.isAuthorized(config, {\n        policyId,\n        user: account2.address,\n      })\n      expect(isAuthorized).toBe(false)\n    }\n\n    // add account2 to whitelist\n    const addResult = await policy.modifyWhitelistSync(config, {\n      policyId,\n      address: account2.address,\n      allowed: true,\n    })\n\n    expect(addResult.receipt).toBeDefined()\n    expect(addResult.policyId).toBe(policyId)\n    expect(addResult.account).toBe(account2.address)\n    expect(addResult.allowed).toBe(true)\n    expect(addResult.updater).toBe(account.address)\n\n    // verify account2 is authorized\n    {\n      const isAuthorized = await policy.isAuthorized(config, {\n        policyId,\n        user: account2.address,\n      })\n      expect(isAuthorized).toBe(true)\n    }\n\n    // remove account2 from whitelist\n    const removeResult = await policy.modifyWhitelistSync(config, {\n      policyId,\n      address: account2.address,\n      allowed: false,\n    })\n\n    expect(removeResult.receipt).toBeDefined()\n    expect(removeResult.policyId).toBe(policyId)\n    expect(removeResult.account).toBe(account2.address)\n    expect(removeResult.allowed).toBe(false)\n    expect(removeResult.updater).toBe(account.address)\n\n    // verify account2 is no longer authorized\n    {\n      const isAuthorized = await policy.isAuthorized(config, {\n        policyId,\n        user: account2.address,\n      })\n      expect(isAuthorized).toBe(false)\n    }\n  })\n})\n\ndescribe('modifyBlacklist', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // create blacklist policy\n    const { policyId } = await policy.createSync(config, {\n      type: 'blacklist',\n    })\n\n    // verify account2 is authorized (not blacklisted)\n    {\n      const isAuthorized = await policy.isAuthorized(config, {\n        policyId,\n        user: account2.address,\n      })\n      expect(isAuthorized).toBe(true)\n    }\n\n    // add account2 to blacklist\n    const addResult = await policy.modifyBlacklistSync(config, {\n      policyId,\n      address: account2.address,\n      restricted: true,\n    })\n\n    expect(addResult.receipt).toBeDefined()\n    expect(addResult.policyId).toBe(policyId)\n    expect(addResult.account).toBe(account2.address)\n    expect(addResult.restricted).toBe(true)\n    expect(addResult.updater).toBe(account.address)\n\n    // verify account2 is not authorized (blacklisted)\n    {\n      const isAuthorized = await policy.isAuthorized(config, {\n        policyId,\n        user: account2.address,\n      })\n      expect(isAuthorized).toBe(false)\n    }\n\n    // remove account2 from blacklist\n    const removeResult = await policy.modifyBlacklistSync(config, {\n      policyId,\n      address: account2.address,\n      restricted: false,\n    })\n\n    expect(removeResult.receipt).toBeDefined()\n    expect(removeResult.policyId).toBe(policyId)\n    expect(removeResult.account).toBe(account2.address)\n    expect(removeResult.restricted).toBe(false)\n    expect(removeResult.updater).toBe(account.address)\n\n    // verify account2 is authorized again\n    {\n      const isAuthorized = await policy.isAuthorized(config, {\n        policyId,\n        user: account2.address,\n      })\n      expect(isAuthorized).toBe(true)\n    }\n  })\n})\n\ndescribe('getData', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // create policy\n    const { policyId } = await policy.createSync(config, {\n      type: 'whitelist',\n    })\n\n    {\n      // get policy data\n      const data = await policy.getData(config, {\n        policyId,\n      })\n      expect(data.admin).toBe(account.address)\n      expect(data.type).toBe('whitelist')\n    }\n  })\n\n  test('behavior: blacklist', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // create blacklist policy\n    const { policyId } = await policy.createSync(config, {\n      type: 'blacklist',\n    })\n\n    {\n      // get policy data\n      const data = await policy.getData(config, {\n        policyId,\n      })\n      expect(data.admin).toBe(account.address)\n      expect(data.type).toBe('blacklist')\n    }\n  })\n\n  describe('queryOptions', () => {\n    test('default', async () => {\n      await connect(config, {\n        connector: config.connectors[0]!,\n      })\n\n      // create policy\n      const { policyId } = await policy.createSync(config, {\n        type: 'whitelist',\n      })\n\n      const options = policy.getData.queryOptions(config, {\n        policyId,\n      })\n      const data = await queryClient.fetchQuery(options)\n\n      expect(data.admin).toBe(account.address)\n      expect(data.type).toBe('whitelist')\n    })\n  })\n})\n\ndescribe('isAuthorized', () => {\n  test('special policy: always-reject (policyId 0)', async () => {\n    const isAuthorized = await policy.isAuthorized(config, {\n      policyId: 0n,\n      user: account.address,\n    })\n    expect(isAuthorized).toBe(false)\n  })\n\n  test('special policy: always-allow (policyId 1)', async () => {\n    const isAuthorized = await policy.isAuthorized(config, {\n      policyId: 1n,\n      user: account.address,\n    })\n    expect(isAuthorized).toBe(true)\n  })\n\n  describe('queryOptions', () => {\n    test('default', async () => {\n      const options = policy.isAuthorized.queryOptions(config, {\n        policyId: 1n,\n        user: account.address,\n      })\n      const isAuthorized = await queryClient.fetchQuery(options)\n\n      expect(isAuthorized).toBe(true)\n    })\n  })\n})\n\ndescribe('watchCreate', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    const events: any[] = []\n    const unwatch = policy.watchCreate(config, {\n      onPolicyCreated: (args, log) => {\n        events.push({ args, log })\n      },\n    })\n\n    // create policy\n    await policy.createSync(config, {\n      type: 'whitelist',\n    })\n\n    await vi.waitFor(() => {\n      expect(events.length).toBeGreaterThanOrEqual(1)\n    })\n    unwatch()\n\n    expect(events[0].args.policyId).toBeDefined()\n    expect(events[0].args.updater).toBe(account.address)\n    expect(events[0].args.type).toBe('whitelist')\n  })\n})\n\ndescribe('watchAdminUpdated', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // create policy\n    const { policyId } = await policy.createSync(config, {\n      type: 'whitelist',\n    })\n\n    const events: any[] = []\n    const unwatch = policy.watchAdminUpdated(config, {\n      onAdminUpdated: (args, log) => {\n        events.push({ args, log })\n      },\n    })\n\n    // set new admin\n    await policy.setAdminSync(config, {\n      policyId,\n      admin: account2.address,\n    })\n\n    await vi.waitFor(() => {\n      const event = events.find((e) => e.args.admin === account2.address)\n      expect(event).toBeDefined()\n    })\n    unwatch()\n\n    const event = events.find((e) => e.args.admin === account2.address)\n    expect(event.args.policyId).toBe(policyId)\n    expect(event.args.updater).toBe(account.address)\n  })\n})\n\ndescribe('watchWhitelistUpdated', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // create whitelist policy\n    const { policyId } = await policy.createSync(config, {\n      type: 'whitelist',\n    })\n\n    const events: any[] = []\n    const unwatch = policy.watchWhitelistUpdated(config, {\n      onWhitelistUpdated: (args, log) => {\n        events.push({ args, log })\n      },\n    })\n\n    // add address to whitelist\n    await policy.modifyWhitelistSync(config, {\n      policyId,\n      address: account2.address,\n      allowed: true,\n    })\n\n    // remove address from whitelist\n    await policy.modifyWhitelistSync(config, {\n      policyId,\n      address: account2.address,\n      allowed: false,\n    })\n\n    await vi.waitFor(() => {\n      expect(events.length).toBeGreaterThanOrEqual(2)\n    })\n    unwatch()\n\n    expect(events[0].args.policyId).toBe(policyId)\n    expect(events[0].args.updater).toBe(account.address)\n    expect(events[0].args.account).toBe(account2.address)\n    expect(events[0].args.allowed).toBe(true)\n    expect(events[1].args.allowed).toBe(false)\n  })\n})\n\ndescribe('watchBlacklistUpdated', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // create blacklist policy\n    const { policyId } = await policy.createSync(config, {\n      type: 'blacklist',\n    })\n\n    const events: any[] = []\n    const unwatch = policy.watchBlacklistUpdated(config, {\n      onBlacklistUpdated: (args, log) => {\n        events.push({ args, log })\n      },\n    })\n\n    // add address to blacklist\n    await policy.modifyBlacklistSync(config, {\n      policyId,\n      address: account2.address,\n      restricted: true,\n    })\n\n    // remove address from blacklist\n    await policy.modifyBlacklistSync(config, {\n      policyId,\n      address: account2.address,\n      restricted: false,\n    })\n\n    await vi.waitFor(() => {\n      expect(events.length).toBeGreaterThanOrEqual(2)\n    })\n    unwatch()\n\n    expect(events[0].args.policyId).toBe(policyId)\n    expect(events[0].args.updater).toBe(account.address)\n    expect(events[0].args.account).toBe(account2.address)\n    expect(events[0].args.restricted).toBe(true)\n    expect(events[1].args.restricted).toBe(false)\n  })\n})\n"
  },
  {
    "path": "packages/core/src/tempo/actions/policy.ts",
    "content": "import type { Account, BaseErrorType } from 'viem'\nimport { Actions } from 'viem/tempo'\nimport { getConnectorClient } from '../../actions/getConnectorClient.js'\nimport type { Config } from '../../createConfig.js'\nimport type {\n  ChainIdParameter,\n  ConnectorParameter,\n} from '../../types/properties.js'\nimport type { UnionLooseOmit } from '../../types/utils.js'\nimport type { QueryOptions, QueryParameter } from './utils.js'\n\n/**\n * Creates a new policy.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.policy.create(config, {\n *   type: 'whitelist',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns Transaction hash.\n */\nexport async function create<config extends Config>(\n  config: config,\n  parameters: create.Parameters<config>,\n): Promise<Actions.policy.create.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.policy.create(client, parameters as never)\n}\n\nexport declare namespace create {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.policy.create.Parameters<config['chains'][number], Account>,\n      'chain' | 'admin'\n    >\n\n  export type ReturnValue = Actions.policy.create.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.policy.create.ErrorType\n}\n\n/**\n * Creates a new policy.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.policy.createSync(config, {\n *   type: 'whitelist',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function createSync<config extends Config>(\n  config: config,\n  parameters: createSync.Parameters<config>,\n): Promise<Actions.policy.createSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.policy.createSync(client, parameters as never)\n}\n\nexport declare namespace createSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.policy.createSync.Parameters<config['chains'][number], Account>,\n      'chain' | 'admin'\n    >\n\n  export type ReturnValue = Actions.policy.createSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.policy.createSync.ErrorType\n}\n\n/**\n * Sets the admin for a policy.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.policy.setAdmin(config, {\n *   policyId: 2n,\n *   admin: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns Transaction hash.\n */\nexport async function setAdmin<config extends Config>(\n  config: config,\n  parameters: setAdmin.Parameters<config>,\n): Promise<Actions.policy.setAdmin.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.policy.setAdmin(client, parameters as never)\n}\n\nexport declare namespace setAdmin {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.policy.setAdmin.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.policy.setAdmin.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.policy.setAdmin.ErrorType\n}\n\n/**\n * Sets the admin for a policy.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.policy.setAdminSync(config, {\n *   policyId: 2n,\n *   admin: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function setAdminSync<config extends Config>(\n  config: config,\n  parameters: setAdminSync.Parameters<config>,\n): Promise<Actions.policy.setAdminSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.policy.setAdminSync(client, parameters as never)\n}\n\nexport declare namespace setAdminSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.policy.setAdminSync.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.policy.setAdminSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.policy.setAdminSync.ErrorType\n}\n\n/**\n * Modifies a policy whitelist.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.policy.modifyWhitelist(config, {\n *   policyId: 2n,\n *   address: '0x...',\n *   allowed: true,\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns Transaction hash.\n */\nexport async function modifyWhitelist<config extends Config>(\n  config: config,\n  parameters: modifyWhitelist.Parameters<config>,\n): Promise<Actions.policy.modifyWhitelist.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.policy.modifyWhitelist(client, parameters as never)\n}\n\nexport declare namespace modifyWhitelist {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.policy.modifyWhitelist.Parameters<\n        config['chains'][number],\n        Account\n      >,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.policy.modifyWhitelist.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.policy.modifyWhitelist.ErrorType\n}\n\n/**\n * Modifies a policy whitelist.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.policy.modifyWhitelistSync(config, {\n *   policyId: 2n,\n *   address: '0x...',\n *   allowed: true,\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function modifyWhitelistSync<config extends Config>(\n  config: config,\n  parameters: modifyWhitelistSync.Parameters<config>,\n): Promise<Actions.policy.modifyWhitelistSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.policy.modifyWhitelistSync(client, parameters as never)\n}\n\nexport declare namespace modifyWhitelistSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.policy.modifyWhitelistSync.Parameters<\n        config['chains'][number],\n        Account\n      >,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.policy.modifyWhitelistSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.policy.modifyWhitelistSync.ErrorType\n}\n\n/**\n * Modifies a policy blacklist.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.policy.modifyBlacklist(config, {\n *   policyId: 2n,\n *   address: '0x...',\n *   restricted: true,\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns Transaction hash.\n */\nexport async function modifyBlacklist<config extends Config>(\n  config: config,\n  parameters: modifyBlacklist.Parameters<config>,\n): Promise<Actions.policy.modifyBlacklist.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.policy.modifyBlacklist(client, parameters as never)\n}\n\nexport declare namespace modifyBlacklist {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.policy.modifyBlacklist.Parameters<\n        config['chains'][number],\n        Account\n      >,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.policy.modifyBlacklist.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.policy.modifyBlacklist.ErrorType\n}\n\n/**\n * Modifies a policy blacklist.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.policy.modifyBlacklistSync(config, {\n *   policyId: 2n,\n *   address: '0x...',\n *   restricted: true,\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function modifyBlacklistSync<config extends Config>(\n  config: config,\n  parameters: modifyBlacklistSync.Parameters<config>,\n): Promise<Actions.policy.modifyBlacklistSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.policy.modifyBlacklistSync(client, parameters as never)\n}\n\nexport declare namespace modifyBlacklistSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.policy.modifyBlacklistSync.Parameters<\n        config['chains'][number],\n        Account\n      >,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.policy.modifyBlacklistSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.policy.modifyBlacklistSync.ErrorType\n}\n\n/**\n * Gets policy data.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const data = await Actions.policy.getData(config, {\n *   policyId: 2n,\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The policy data.\n */\nexport function getData<config extends Config>(\n  config: config,\n  parameters: getData.Parameters<config>,\n): Promise<getData.ReturnValue> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.policy.getData(client, rest)\n}\n\nexport namespace getData {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.policy.getData.Parameters\n\n  export type ReturnValue = Actions.policy.getData.ReturnValue\n\n  export type ErrorType = BaseErrorType\n\n  export function queryKey<config extends Config>(\n    parameters: Parameters<config>,\n  ) {\n    return ['getData', parameters] as const\n  }\n\n  export type QueryKey<config extends Config> = ReturnType<\n    typeof queryKey<config>\n  >\n\n  export function queryOptions<config extends Config, selectData = ReturnValue>(\n    config: Config,\n    parameters: queryOptions.Parameters<config, selectData>,\n  ): queryOptions.ReturnValue<config, selectData> {\n    const { query, ...rest } = parameters\n    return {\n      ...query,\n      enabled: Boolean(rest.policyId !== undefined && (query?.enabled ?? true)),\n      queryKey: queryKey(rest),\n      async queryFn({ queryKey }) {\n        const [, parameters] = queryKey\n        return await getData(config, parameters)\n      },\n    }\n  }\n\n  export declare namespace queryOptions {\n    export type Parameters<\n      config extends Config,\n      selectData = getData.ReturnValue,\n    > = getData.Parameters<config> &\n      QueryParameter<\n        getData.ReturnValue,\n        getData.ErrorType,\n        selectData,\n        getData.QueryKey<config>\n      >\n\n    export type ReturnValue<\n      config extends Config,\n      selectData = getData.ReturnValue,\n    > = QueryOptions<\n      getData.ReturnValue,\n      getData.ErrorType,\n      selectData,\n      getData.QueryKey<config>\n    >\n  }\n}\n\n/**\n * Checks if a user is authorized by a policy.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const authorized = await Actions.policy.isAuthorized(config, {\n *   policyId: 2n,\n *   user: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns Whether the user is authorized.\n */\nexport function isAuthorized<config extends Config>(\n  config: config,\n  parameters: isAuthorized.Parameters<config>,\n): Promise<isAuthorized.ReturnValue> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.policy.isAuthorized(client, rest)\n}\n\nexport namespace isAuthorized {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.policy.isAuthorized.Parameters\n\n  export type ReturnValue = Actions.policy.isAuthorized.ReturnValue\n\n  export type ErrorType = BaseErrorType\n\n  export function queryKey<config extends Config>(\n    parameters: Parameters<config>,\n  ) {\n    return ['isAuthorized', parameters] as const\n  }\n\n  export type QueryKey<config extends Config> = ReturnType<\n    typeof queryKey<config>\n  >\n\n  export function queryOptions<config extends Config, selectData = ReturnValue>(\n    config: Config,\n    parameters: queryOptions.Parameters<config, selectData>,\n  ): queryOptions.ReturnValue<config, selectData> {\n    const { query, ...rest } = parameters\n    return {\n      ...query,\n      enabled: Boolean(\n        rest.policyId !== undefined && rest.user && (query?.enabled ?? true),\n      ),\n      queryKey: queryKey(rest),\n      async queryFn({ queryKey }) {\n        const [, parameters] = queryKey\n        return await isAuthorized(config, parameters)\n      },\n    }\n  }\n\n  export declare namespace queryOptions {\n    export type Parameters<\n      config extends Config,\n      selectData = isAuthorized.ReturnValue,\n    > = isAuthorized.Parameters<config> &\n      QueryParameter<\n        isAuthorized.ReturnValue,\n        isAuthorized.ErrorType,\n        selectData,\n        isAuthorized.QueryKey<config>\n      >\n\n    export type ReturnValue<\n      config extends Config,\n      selectData = isAuthorized.ReturnValue,\n    > = QueryOptions<\n      isAuthorized.ReturnValue,\n      isAuthorized.ErrorType,\n      selectData,\n      isAuthorized.QueryKey<config>\n    >\n  }\n}\n\n/**\n * Watches for policy creation events.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const unwatch = Actions.policy.watchCreate(config, {\n *   onPolicyCreated: (args, log) => {\n *     console.log('Policy created:', args)\n *   },\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchCreate<config extends Config>(\n  config: config,\n  parameters: watchCreate.Parameters<config>,\n) {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.policy.watchCreate(client, rest)\n}\n\nexport declare namespace watchCreate {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.policy.watchCreate.Parameters\n}\n\n/**\n * Watches for policy admin update events.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const unwatch = Actions.policy.watchAdminUpdated(config, {\n *   onAdminUpdated: (args, log) => {\n *     console.log('Policy admin updated:', args)\n *   },\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchAdminUpdated<config extends Config>(\n  config: config,\n  parameters: watchAdminUpdated.Parameters<config>,\n) {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.policy.watchAdminUpdated(client, rest)\n}\n\nexport declare namespace watchAdminUpdated {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.policy.watchAdminUpdated.Parameters\n}\n\n/**\n * Watches for whitelist update events.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const unwatch = Actions.policy.watchWhitelistUpdated(config, {\n *   onWhitelistUpdated: (args, log) => {\n *     console.log('Whitelist updated:', args)\n *   },\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchWhitelistUpdated<config extends Config>(\n  config: config,\n  parameters: watchWhitelistUpdated.Parameters<config>,\n) {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.policy.watchWhitelistUpdated(client, rest)\n}\n\nexport declare namespace watchWhitelistUpdated {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.policy.watchWhitelistUpdated.Parameters\n}\n\n/**\n * Watches for blacklist update events.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const unwatch = Actions.policy.watchBlacklistUpdated(config, {\n *   onBlacklistUpdated: (args, log) => {\n *     console.log('Blacklist updated:', args)\n *   },\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchBlacklistUpdated<config extends Config>(\n  config: config,\n  parameters: watchBlacklistUpdated.Parameters<config>,\n) {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.policy.watchBlacklistUpdated(client, rest)\n}\n\nexport declare namespace watchBlacklistUpdated {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.policy.watchBlacklistUpdated.Parameters\n}\n"
  },
  {
    "path": "packages/core/src/tempo/actions/reward.test.ts",
    "content": "import { getConnection } from '@wagmi/core'\nimport { config, queryClient, setupToken } from '@wagmi/test/tempo'\nimport { parseUnits } from 'viem'\nimport { describe, expect, test, vi } from 'vitest'\nimport * as actions from './reward.js'\nimport * as tokenActions from './token.js'\n\ndescribe('claimSync', () => {\n  test('default', async () => {\n    const { token } = await setupToken()\n\n    const connection = getConnection(config)\n\n    const balanceBefore = await tokenActions.getBalance(config, {\n      account: connection.address!,\n      token,\n    })\n\n    // Opt in to rewards\n    await actions.setRecipientSync(config, {\n      recipient: connection.address!,\n      token,\n    })\n\n    // Mint reward tokens\n    const rewardAmount = parseUnits('100', 6)\n    await tokenActions.mintSync(config, {\n      amount: rewardAmount,\n      to: connection.address!,\n      token,\n    })\n\n    // Start immediate reward\n    await actions.distributeSync(config, {\n      amount: rewardAmount,\n      token,\n    })\n\n    // Trigger reward accrual by transferring\n    await tokenActions.transferSync(config, {\n      amount: 1n,\n      to: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n      token,\n    })\n\n    // Claim rewards\n    const { receipt } = await actions.claimSync(config, {\n      token,\n    })\n\n    expect(receipt).toBeDefined()\n\n    const balanceAfter = await tokenActions.getBalance(config, {\n      account: connection.address!,\n      token,\n    })\n\n    // Balance should have increased due to claimed rewards\n    expect(balanceAfter).toBeGreaterThan(\n      balanceBefore + rewardAmount - parseUnits('1', 6),\n    )\n  })\n})\n\ndescribe('getGlobalRewardPerToken', () => {\n  test('default', async () => {\n    const { token } = await setupToken()\n\n    const rate = await actions.getGlobalRewardPerToken(config, {\n      token,\n    })\n\n    expect(rate).toBe(0n)\n  })\n\n  describe('queryOptions', () => {\n    test('default', async () => {\n      const { token } = await setupToken()\n\n      const options = actions.getGlobalRewardPerToken.queryOptions(config, {\n        token,\n      })\n\n      const rate = await queryClient.fetchQuery(options)\n\n      expect(rate).toBe(0n)\n    })\n  })\n})\n\ndescribe('getUserRewardInfo', () => {\n  test('default', async () => {\n    const { token } = await setupToken()\n\n    const connection = getConnection(config)\n\n    const info = await actions.getUserRewardInfo(config, {\n      token,\n      account: connection.address!,\n    })\n\n    expect(info.rewardRecipient).toBeDefined()\n    expect(info.rewardPerToken).toBeDefined()\n    expect(info.rewardBalance).toBeDefined()\n  })\n\n  describe('queryOptions', () => {\n    test('default', async () => {\n      const { token } = await setupToken()\n\n      const connection = getConnection(config)\n\n      const options = actions.getUserRewardInfo.queryOptions(config, {\n        token,\n        account: connection.address!,\n      })\n\n      const info = await queryClient.fetchQuery(options)\n\n      expect(info.rewardRecipient).toBeDefined()\n      expect(info.rewardPerToken).toBeDefined()\n      expect(info.rewardBalance).toBeDefined()\n    })\n  })\n})\n\ndescribe('setRecipientSync', () => {\n  test('default', async () => {\n    const { token } = await setupToken()\n\n    const connection = getConnection(config)\n\n    // Set reward recipient\n    const { holder, receipt, recipient } = await actions.setRecipientSync(\n      config,\n      {\n        recipient: connection.address!,\n        token,\n      },\n    )\n\n    expect(receipt).toBeDefined()\n    expect(holder).toBe(connection.address)\n    expect(recipient).toBe(connection.address)\n  })\n})\n\ndescribe('watchRewardDistributed', () => {\n  test('default', async () => {\n    const { token } = await setupToken()\n\n    const connection = getConnection(config)\n\n    // Setup rewards\n    await actions.setRecipientSync(config, {\n      recipient: connection.address!,\n      token,\n    })\n\n    const rewardAmount = parseUnits('100', 6)\n    await tokenActions.mintSync(config, {\n      amount: rewardAmount,\n      to: connection.address!,\n      token,\n    })\n\n    const events: any[] = []\n    const unwatch = actions.watchRewardDistributed(config, {\n      token,\n      onRewardDistributed: (args) => {\n        events.push(args)\n      },\n    })\n\n    await actions.distributeSync(config, {\n      amount: rewardAmount,\n      token,\n    })\n\n    await vi.waitFor(() => {\n      expect(events.length).toBeGreaterThan(0)\n    })\n    unwatch()\n\n    expect(events[0]?.amount).toBe(rewardAmount)\n    expect(events[0]?.funder).toBe(connection.address)\n  })\n})\n\ndescribe('watchRewardRecipientSet', () => {\n  test('default', async () => {\n    const { token } = await setupToken()\n\n    const account = getConnection(config)\n\n    const events: any[] = []\n    const unwatch = actions.watchRewardRecipientSet(config, {\n      token,\n      onRewardRecipientSet: (args) => {\n        events.push(args)\n      },\n    })\n\n    await actions.setRecipientSync(config, {\n      recipient: account.address!,\n      token,\n    })\n\n    await vi.waitFor(() => {\n      expect(events.length).toBeGreaterThan(0)\n    })\n    unwatch()\n\n    expect(events[0]?.holder).toBe(account.address)\n    expect(events[0]?.recipient).toBe(account.address)\n  })\n})\n"
  },
  {
    "path": "packages/core/src/tempo/actions/reward.ts",
    "content": "import type { Account, BaseErrorType } from 'viem'\nimport { Actions } from 'viem/tempo'\nimport { getConnectorClient } from '../../actions/getConnectorClient.js'\nimport type { Config } from '../../createConfig.js'\nimport type {\n  ChainIdParameter,\n  ConnectorParameter,\n} from '../../types/properties.js'\nimport type { UnionLooseOmit } from '../../types/utils.js'\nimport type { QueryOptions, QueryParameter } from './utils.js'\n\n/**\n * Claims accumulated rewards for a recipient.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoTestnet],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.reward.claim(config, {\n *   token: '0x20c0000000000000000000000000000000000001',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function claim<config extends Config>(\n  config: config,\n  parameters: claim.Parameters<config>,\n): Promise<Actions.reward.claim.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.reward.claim(client, parameters as never)\n}\n\nexport declare namespace claim {\n  export type Parameters<config extends Config = Config> =\n    ChainIdParameter<config> &\n      ConnectorParameter &\n      UnionLooseOmit<\n        Actions.reward.claim.Parameters<config['chains'][number], Account>,\n        'chain'\n      >\n\n  export type ReturnValue = Actions.reward.claim.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.reward.claim.ErrorType\n}\n\n/**\n * Claims accumulated rewards for a recipient and waits for confirmation.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoTestnet],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.reward.claimSync(config, {\n *   token: '0x20c0000000000000000000000000000000000001',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt.\n */\nexport async function claimSync<config extends Config>(\n  config: config,\n  parameters: claimSync.Parameters<config>,\n): Promise<Actions.reward.claimSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.reward.claimSync(client, parameters as never)\n}\n\nexport declare namespace claimSync {\n  export type Parameters<config extends Config = Config> =\n    ChainIdParameter<config> &\n      ConnectorParameter &\n      UnionLooseOmit<\n        Actions.reward.claimSync.Parameters<config['chains'][number], Account>,\n        'chain'\n      >\n\n  export type ReturnValue = Actions.reward.claimSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.reward.claimSync.ErrorType\n}\n\n/**\n * Gets the global reward per token value for a token.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoModerato],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const value = await Actions.reward.getGlobalRewardPerToken(config, {\n *   token: '0x20c0000000000000000000000000000000000001',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The global reward per token value (scaled by 1e18).\n */\nexport function getGlobalRewardPerToken<config extends Config>(\n  config: config,\n  parameters: getGlobalRewardPerToken.Parameters<config>,\n): Promise<getGlobalRewardPerToken.ReturnValue> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.reward.getGlobalRewardPerToken(client, rest)\n}\n\nexport namespace getGlobalRewardPerToken {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.reward.getGlobalRewardPerToken.Parameters\n\n  export type ReturnValue = Actions.reward.getGlobalRewardPerToken.ReturnValue\n\n  export type ErrorType = BaseErrorType\n\n  export function queryKey<config extends Config>(\n    parameters: Parameters<config>,\n  ) {\n    return ['getGlobalRewardPerToken', parameters] as const\n  }\n\n  export type QueryKey<config extends Config> = ReturnType<\n    typeof queryKey<config>\n  >\n\n  export function queryOptions<config extends Config, selectData = ReturnValue>(\n    config: Config,\n    parameters: queryOptions.Parameters<config, selectData>,\n  ): queryOptions.ReturnValue<config, selectData> {\n    const { query, ...rest } = parameters\n    return {\n      ...query,\n      enabled: Boolean(rest.token && (query?.enabled ?? true)),\n      queryKey: queryKey(rest),\n      async queryFn({ queryKey }) {\n        const [, parameters] = queryKey\n        return await getGlobalRewardPerToken(config, parameters)\n      },\n    }\n  }\n\n  export declare namespace queryOptions {\n    export type Parameters<\n      config extends Config,\n      selectData = getGlobalRewardPerToken.ReturnValue,\n    > = getGlobalRewardPerToken.Parameters<config> &\n      QueryParameter<\n        getGlobalRewardPerToken.ReturnValue,\n        getGlobalRewardPerToken.ErrorType,\n        selectData,\n        getGlobalRewardPerToken.QueryKey<config>\n      >\n\n    export type ReturnValue<\n      config extends Config,\n      selectData = getGlobalRewardPerToken.ReturnValue,\n    > = QueryOptions<\n      getGlobalRewardPerToken.ReturnValue,\n      getGlobalRewardPerToken.ErrorType,\n      selectData,\n      getGlobalRewardPerToken.QueryKey<config>\n    >\n  }\n}\n\n/**\n * Gets the reward information for a specific account.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoTestnet],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const info = await Actions.reward.getUserRewardInfo(config, {\n *   token: '0x20c0000000000000000000000000000000000001',\n *   account: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The user's reward information (recipient, rewardPerToken, rewardBalance).\n */\nexport function getUserRewardInfo<config extends Config>(\n  config: config,\n  parameters: getUserRewardInfo.Parameters<config>,\n): Promise<getUserRewardInfo.ReturnValue> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.reward.getUserRewardInfo(client, rest)\n}\n\nexport namespace getUserRewardInfo {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.reward.getUserRewardInfo.Parameters\n\n  export type ReturnValue = Actions.reward.getUserRewardInfo.ReturnValue\n\n  export type ErrorType = BaseErrorType\n\n  export function queryKey<config extends Config>(\n    parameters: Parameters<config>,\n  ) {\n    return ['getUserRewardInfo', parameters] as const\n  }\n\n  export type QueryKey<config extends Config> = ReturnType<\n    typeof queryKey<config>\n  >\n\n  export function queryOptions<config extends Config, selectData = ReturnValue>(\n    config: Config,\n    parameters: queryOptions.Parameters<config, selectData>,\n  ): queryOptions.ReturnValue<config, selectData> {\n    const { query, ...rest } = parameters\n    return {\n      ...query,\n      enabled: Boolean(rest.token && rest.account && (query?.enabled ?? true)),\n      queryKey: queryKey(rest),\n      async queryFn({ queryKey }) {\n        const [, parameters] = queryKey\n        return await getUserRewardInfo(config, parameters)\n      },\n    }\n  }\n\n  export declare namespace queryOptions {\n    export type Parameters<\n      config extends Config,\n      selectData = getUserRewardInfo.ReturnValue,\n    > = getUserRewardInfo.Parameters<config> &\n      QueryParameter<\n        getUserRewardInfo.ReturnValue,\n        getUserRewardInfo.ErrorType,\n        selectData,\n        getUserRewardInfo.QueryKey<config>\n      >\n\n    export type ReturnValue<\n      config extends Config,\n      selectData = getUserRewardInfo.ReturnValue,\n    > = QueryOptions<\n      getUserRewardInfo.ReturnValue,\n      getUserRewardInfo.ErrorType,\n      selectData,\n      getUserRewardInfo.QueryKey<config>\n    >\n  }\n}\n\n/**\n * Sets or changes the reward recipient for a token holder.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoTestnet],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.reward.setRecipient(config, {\n *   recipient: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n *   token: '0x20c0000000000000000000000000000000000001',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function setRecipient<config extends Config>(\n  config: config,\n  parameters: setRecipient.Parameters<config>,\n): Promise<Actions.reward.setRecipient.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.reward.setRecipient(client, parameters as never)\n}\n\nexport declare namespace setRecipient {\n  export type Parameters<config extends Config = Config> =\n    ChainIdParameter<config> &\n      ConnectorParameter &\n      UnionLooseOmit<\n        Actions.reward.setRecipient.Parameters<\n          config['chains'][number],\n          Account\n        >,\n        'chain'\n      >\n\n  export type ReturnValue = Actions.reward.setRecipient.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.reward.setRecipient.ErrorType\n}\n\n/**\n * Sets or changes the reward recipient for a token holder and waits for confirmation.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoTestnet],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.reward.setRecipientSync(config, {\n *   recipient: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n *   token: '0x20c0000000000000000000000000000000000001',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function setRecipientSync<config extends Config>(\n  config: config,\n  parameters: setRecipientSync.Parameters<config>,\n): Promise<Actions.reward.setRecipientSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.reward.setRecipientSync(client, parameters as never)\n}\n\nexport declare namespace setRecipientSync {\n  export type Parameters<config extends Config = Config> =\n    ChainIdParameter<config> &\n      ConnectorParameter &\n      UnionLooseOmit<\n        Actions.reward.setRecipientSync.Parameters<\n          config['chains'][number],\n          Account\n        >,\n        'chain'\n      >\n\n  export type ReturnValue = Actions.reward.setRecipientSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.reward.setRecipientSync.ErrorType\n}\n\n/**\n * Distributes tokens to opted-in holders.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoTestnet],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.reward.distribute(config, {\n *   amount: 100000000000000000000n,\n *   seconds: 86400,\n *   token: '0x20c0000000000000000000000000000000000001',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function distribute<config extends Config>(\n  config: config,\n  parameters: distribute.Parameters<config>,\n): Promise<Actions.reward.distribute.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.reward.distribute(client, parameters as never)\n}\n\nexport declare namespace distribute {\n  export type Parameters<config extends Config = Config> =\n    ChainIdParameter<config> &\n      ConnectorParameter &\n      UnionLooseOmit<\n        Actions.reward.distribute.Parameters<config['chains'][number], Account>,\n        'chain'\n      >\n\n  export type ReturnValue = Actions.reward.distribute.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.reward.distribute.ErrorType\n}\n\n/**\n * Distributes tokens to opted-in holders and waits for confirmation.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoTestnet],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.reward.distributeSync(config, {\n *   amount: 100000000000000000000n,\n *   seconds: 86400,\n *   token: '0x20c0000000000000000000000000000000000001',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function distributeSync<config extends Config>(\n  config: config,\n  parameters: distributeSync.Parameters<config>,\n): Promise<Actions.reward.distributeSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n\n  return Actions.reward.distributeSync(client, parameters as never)\n}\n\nexport declare namespace distributeSync {\n  export type Parameters<config extends Config = Config> =\n    ChainIdParameter<config> &\n      ConnectorParameter &\n      UnionLooseOmit<\n        Actions.reward.distributeSync.Parameters<\n          config['chains'][number],\n          Account\n        >,\n        'chain'\n      >\n\n  export type ReturnValue = Actions.reward.distributeSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.reward.distributeSync.ErrorType\n}\n\n/**\n * Watches for reward distributed events.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoTestnet],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const unwatch = Actions.reward.watchRewardDistributed(config, {\n *   token: '0x20c0000000000000000000000000000000000001',\n *   onRewardDistributed: (args, log) => {\n *     console.log('Reward distributed:', args)\n *   },\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchRewardDistributed<config extends Config>(\n  config: config,\n  parameters: watchRewardDistributed.Parameters<config>,\n) {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.reward.watchRewardDistributed(client, rest)\n}\n\nexport declare namespace watchRewardDistributed {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.reward.watchRewardDistributed.Parameters\n}\n\n/**\n * Watches for reward recipient set events.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempoTestnet],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const unwatch = Actions.reward.watchRewardRecipientSet(config, {\n *   token: '0x20c0000000000000000000000000000000000001',\n *   onRewardRecipientSet: (args, log) => {\n *     console.log('Reward recipient set:', args)\n *   },\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchRewardRecipientSet<config extends Config>(\n  config: config,\n  parameters: watchRewardRecipientSet.Parameters<config>,\n) {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.reward.watchRewardRecipientSet(client, rest)\n}\n\nexport declare namespace watchRewardRecipientSet {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.reward.watchRewardRecipientSet.Parameters\n}\n"
  },
  {
    "path": "packages/core/src/tempo/actions/token.test.ts",
    "content": "import { connect } from '@wagmi/core'\nimport { accounts, addresses, config, queryClient } from '@wagmi/test/tempo'\nimport { parseUnits } from 'viem'\nimport { describe, expect, test, vi } from 'vitest'\nimport * as token from './token.js'\n\nconst account = accounts[0]\nconst account2 = accounts[1]\n\ndescribe('getAllowance', () => {\n  test('default', async () => {\n    const allowance = await token.getAllowance(config, {\n      account: account.address,\n      spender: account2.address,\n      token: addresses.alphaUsd,\n    })\n    expect(allowance).toBeDefined()\n    expect(typeof allowance).toBe('bigint')\n  })\n\n  describe('queryOptions', () => {\n    test('default', async () => {\n      const options = token.getAllowance.queryOptions(config, {\n        account: account.address,\n        spender: account2.address,\n        token: addresses.alphaUsd,\n      })\n      const allowance = await queryClient.fetchQuery(options)\n      expect(allowance).toBeDefined()\n      expect(typeof allowance).toBe('bigint')\n    })\n  })\n})\n\ndescribe('getBalance', () => {\n  test('default', async () => {\n    const balance = await token.getBalance(config, {\n      account: account.address,\n      token: addresses.alphaUsd,\n    })\n    expect(balance).toBeDefined()\n    expect(typeof balance).toBe('bigint')\n    expect(balance).toBeGreaterThan(0n)\n  })\n\n  describe('queryOptions', () => {\n    test('default', async () => {\n      const options = token.getBalance.queryOptions(config, {\n        account: account.address,\n        token: addresses.alphaUsd,\n      })\n      const balance = await queryClient.fetchQuery(options)\n      expect(balance).toBeDefined()\n      expect(typeof balance).toBe('bigint')\n      expect(balance).toBeGreaterThan(0n)\n    })\n  })\n})\n\ndescribe('getMetadata', () => {\n  test('default', async () => {\n    const metadata = await token.getMetadata(config, {\n      token: addresses.alphaUsd,\n    })\n    expect(metadata).toBeDefined()\n    expect(metadata).toMatchInlineSnapshot(`\n      {\n        \"currency\": \"USD\",\n        \"decimals\": 6,\n        \"name\": \"AlphaUSD\",\n        \"paused\": false,\n        \"quoteToken\": \"0x20C0000000000000000000000000000000000000\",\n        \"supplyCap\": 340282366920938463463374607431768211455n,\n        \"symbol\": \"AlphaUSD\",\n        \"totalSupply\": 202914184810805067765n,\n        \"transferPolicyId\": 1n,\n      }\n    `)\n  })\n\n  describe('queryOptions', () => {\n    test('default', async () => {\n      const options = token.getMetadata.queryOptions(config, {\n        token: addresses.alphaUsd,\n      })\n      const metadata = await queryClient.fetchQuery(options)\n      expect(metadata).toBeDefined()\n      expect(metadata).toMatchInlineSnapshot(`\n        {\n          \"currency\": \"USD\",\n          \"decimals\": 6,\n          \"name\": \"AlphaUSD\",\n          \"paused\": false,\n          \"quoteToken\": \"0x20C0000000000000000000000000000000000000\",\n          \"supplyCap\": 340282366920938463463374607431768211455n,\n          \"symbol\": \"AlphaUSD\",\n          \"totalSupply\": 202914184810805067765n,\n          \"transferPolicyId\": 1n,\n        }\n      `)\n    })\n  })\n})\n\ndescribe('getRoleAdmin', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a token where we're the admin\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'GetRoleAdmin Test',\n      symbol: 'GRATEST',\n    })\n\n    const adminRole = await token.getRoleAdmin(config, {\n      token: tokenAddr,\n      role: 'issuer',\n    })\n    expect(adminRole).toBeDefined()\n    expect(typeof adminRole).toBe('string')\n    expect(adminRole).toBe(\n      '0x0000000000000000000000000000000000000000000000000000000000000000',\n    )\n  })\n\n  describe('queryOptions', () => {\n    test('default', async () => {\n      await connect(config, {\n        connector: config.connectors[0]!,\n      })\n\n      // Create a token where we're the admin\n      const { token: tokenAddr } = await token.createSync(config, {\n        currency: 'USD',\n        name: 'GetRoleAdmin Query Test',\n        symbol: 'GRAQTEST',\n      })\n\n      const options = token.getRoleAdmin.queryOptions(config, {\n        token: tokenAddr,\n        role: 'issuer',\n      })\n      const adminRole = await queryClient.fetchQuery(options)\n      expect(adminRole).toBeDefined()\n      expect(typeof adminRole).toBe('string')\n      expect(adminRole).toBe(\n        '0x0000000000000000000000000000000000000000000000000000000000000000',\n      )\n    })\n  })\n})\n\ndescribe('hasRole', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a token where we're the admin\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'HasRole Test',\n      symbol: 'HRTEST',\n    })\n\n    const result = await token.hasRole(config, {\n      token: tokenAddr,\n      account: account.address,\n      role: 'defaultAdmin',\n    })\n    expect(result).toBeDefined()\n    expect(typeof result).toBe('boolean')\n    expect(result).toBe(true)\n  })\n\n  describe('queryOptions', () => {\n    test('default', async () => {\n      await connect(config, {\n        connector: config.connectors[0]!,\n      })\n\n      // Create a token where we're the admin\n      const { token: tokenAddr } = await token.createSync(config, {\n        currency: 'USD',\n        name: 'HasRole Query Test',\n        symbol: 'HRQTEST',\n      })\n\n      const options = token.hasRole.queryOptions(config, {\n        token: tokenAddr,\n        account: account.address,\n        role: 'defaultAdmin',\n      })\n      const result = await queryClient.fetchQuery(options)\n      expect(result).toBeDefined()\n      expect(typeof result).toBe('boolean')\n      expect(result).toBe(true)\n    })\n  })\n})\n\ndescribe('approve', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n    const hash = await token.approve(config, {\n      amount: parseUnits('100', 6),\n      spender: account2.address,\n      token: addresses.alphaUsd,\n    })\n    expect(hash).toBeDefined()\n    expect(typeof hash).toBe('string')\n  })\n})\n\ndescribe('approveSync', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n    const { receipt, ...result } = await token.approveSync(config, {\n      amount: parseUnits('100', 6),\n      spender: account2.address,\n      token: addresses.alphaUsd,\n    })\n    expect(receipt).toBeDefined()\n    expect(result).toMatchInlineSnapshot(`\n      {\n        \"amount\": 100000000n,\n        \"owner\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        \"spender\": \"0x8C8d35429F74ec245F8Ef2f4Fd1e551cFF97d650\",\n      }\n    `)\n  })\n})\n\ndescribe('transfer', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n    const hash = await token.transfer(config, {\n      amount: parseUnits('1', 6),\n      to: account2.address,\n      token: addresses.alphaUsd,\n    })\n    expect(hash).toBeDefined()\n    expect(typeof hash).toBe('string')\n  })\n})\n\ndescribe('transferSync', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n    const { receipt, ...result } = await token.transferSync(config, {\n      amount: parseUnits('1', 6),\n      to: account2.address,\n      token: addresses.alphaUsd,\n    })\n    expect(receipt).toBeDefined()\n    expect(result).toMatchInlineSnapshot(`\n      {\n        \"amount\": 1000000n,\n        \"from\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        \"to\": \"0x8C8d35429F74ec245F8Ef2f4Fd1e551cFF97d650\",\n      }\n    `)\n  })\n})\n\ndescribe('mint', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token where we're the admin\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Mintable Token',\n      symbol: 'MINT',\n    })\n\n    // Grant issuer role\n    await token.grantRolesSync(config, {\n      token: tokenAddr,\n      roles: ['issuer'],\n      to: account.address,\n    })\n\n    const hash = await token.mint(config, {\n      token: tokenAddr,\n      to: account.address,\n      amount: parseUnits('100', 6),\n    })\n    expect(hash).toBeDefined()\n    expect(typeof hash).toBe('string')\n  })\n})\n\ndescribe('mintSync', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token where we're the admin\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Mintable Token Sync',\n      symbol: 'MINTSYNC',\n    })\n\n    // Grant issuer role\n    await token.grantRolesSync(config, {\n      token: tokenAddr,\n      roles: ['issuer'],\n      to: account.address,\n    })\n\n    const { receipt, ...result } = await token.mintSync(config, {\n      token: tokenAddr,\n      to: account.address,\n      amount: parseUnits('100', 6),\n    })\n    expect(receipt).toBeDefined()\n    expect(result).toMatchInlineSnapshot(`\n      {\n        \"amount\": 100000000n,\n        \"to\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n      }\n    `)\n  })\n})\n\ndescribe('burn', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token where we're the admin\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Burnable Token',\n      symbol: 'BURN',\n    })\n\n    // Grant issuer role\n    await token.grantRolesSync(config, {\n      token: tokenAddr,\n      roles: ['issuer'],\n      to: account.address,\n    })\n\n    // Mint some tokens first\n    await token.mintSync(config, {\n      token: tokenAddr,\n      to: account.address,\n      amount: parseUnits('1000', 6),\n    })\n\n    const hash = await token.burn(config, {\n      token: tokenAddr,\n      amount: parseUnits('1', 6),\n    })\n    expect(hash).toBeDefined()\n    expect(typeof hash).toBe('string')\n  })\n})\n\ndescribe('burnSync', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token where we're the admin\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Burnable Token Sync',\n      symbol: 'BURNSYNC',\n    })\n\n    // Grant issuer role\n    await token.grantRolesSync(config, {\n      token: tokenAddr,\n      roles: ['issuer'],\n      to: account.address,\n    })\n\n    // Mint some tokens first\n    await token.mintSync(config, {\n      token: tokenAddr,\n      to: account.address,\n      amount: parseUnits('1000', 6),\n    })\n\n    const { receipt, ...result } = await token.burnSync(config, {\n      token: tokenAddr,\n      amount: parseUnits('1', 6),\n    })\n    expect(receipt).toBeDefined()\n    expect(result).toMatchInlineSnapshot(`\n      {\n        \"amount\": 1000000n,\n        \"from\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n      }\n    `)\n  })\n})\n\ndescribe('create', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n    const hash = await token.create(config, {\n      name: 'Test Token',\n      symbol: 'TEST',\n      currency: 'USD',\n    })\n    expect(hash).toBeDefined()\n    expect(typeof hash).toBe('string')\n  })\n})\n\ndescribe('createSync', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n    const { receipt, ...result } = await token.createSync(config, {\n      name: 'Test Token',\n      symbol: 'TEST',\n      currency: 'USD',\n    })\n    expect(receipt).toBeDefined()\n    expect(result.token).toBeDefined()\n    expect(result.tokenId).toBeDefined()\n    expect(result.name).toBe('Test Token')\n    expect(result.symbol).toBe('TEST')\n    expect(result.currency).toBe('USD')\n    expect(result.admin).toBe(account.address)\n  })\n})\n\ndescribe.todo('burnBlocked')\n\ndescribe.todo('burnBlockedSync')\n\ndescribe('changeTransferPolicy', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Policy Token',\n      symbol: 'POLICY',\n    })\n\n    const hash = await token.changeTransferPolicy(config, {\n      token: tokenAddr,\n      policyId: 0n,\n    })\n    expect(hash).toBeDefined()\n    expect(typeof hash).toBe('string')\n  })\n})\n\ndescribe('changeTransferPolicySync', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Policy Token Sync',\n      symbol: 'POLICYSYNC',\n    })\n\n    const { receipt, ...result } = await token.changeTransferPolicySync(\n      config,\n      {\n        token: tokenAddr,\n        policyId: 0n,\n      },\n    )\n    expect(receipt).toBeDefined()\n    expect(result).toMatchInlineSnapshot(`\n      {\n        \"newPolicyId\": 0n,\n        \"updater\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n      }\n    `)\n  })\n})\n\ndescribe('grantRoles', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Grant Roles Token',\n      symbol: 'GRANT',\n    })\n\n    const hash = await token.grantRoles(config, {\n      token: tokenAddr,\n      roles: ['issuer'],\n      to: account2.address,\n    })\n    expect(hash).toBeDefined()\n    expect(typeof hash).toBe('string')\n  })\n})\n\ndescribe('grantRolesSync', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Grant Roles Token Sync',\n      symbol: 'GRANTSYNC',\n    })\n\n    const { receipt, value } = await token.grantRolesSync(config, {\n      token: tokenAddr,\n      roles: ['issuer'],\n      to: account2.address,\n    })\n    expect(receipt).toBeDefined()\n    expect(value).toBeDefined()\n    expect(value.length).toBe(1)\n    expect(value[0]?.account).toBe(account2.address)\n    expect(value[0]?.hasRole).toBe(true)\n  })\n})\n\ndescribe('pause', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Pausable Token',\n      symbol: 'PAUSE',\n    })\n\n    // Grant pause role\n    await token.grantRolesSync(config, {\n      token: tokenAddr,\n      roles: ['pause'],\n      to: account.address,\n    })\n\n    const hash = await token.pause(config, {\n      token: tokenAddr,\n    })\n    expect(hash).toBeDefined()\n    expect(typeof hash).toBe('string')\n  })\n})\n\ndescribe('pauseSync', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Pausable Token Sync',\n      symbol: 'PAUSESYNC',\n    })\n\n    // Grant pause role\n    await token.grantRolesSync(config, {\n      token: tokenAddr,\n      roles: ['pause'],\n      to: account.address,\n    })\n\n    const { receipt, ...result } = await token.pauseSync(config, {\n      token: tokenAddr,\n    })\n    expect(receipt).toBeDefined()\n    expect(result).toMatchInlineSnapshot(`\n      {\n        \"isPaused\": true,\n        \"updater\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n      }\n    `)\n  })\n})\n\ndescribe('unpause', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Unpausable Token',\n      symbol: 'UNPAUSE',\n    })\n\n    // Grant pause and unpause roles\n    await token.grantRolesSync(config, {\n      token: tokenAddr,\n      roles: ['pause', 'unpause'],\n      to: account.address,\n    })\n\n    // First pause it\n    await token.pauseSync(config, {\n      token: tokenAddr,\n    })\n\n    const hash = await token.unpause(config, {\n      token: tokenAddr,\n    })\n    expect(hash).toBeDefined()\n    expect(typeof hash).toBe('string')\n  })\n})\n\ndescribe('unpauseSync', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Unpausable Token Sync',\n      symbol: 'UNPAUSESYNC',\n    })\n\n    // Grant pause and unpause roles\n    await token.grantRolesSync(config, {\n      token: tokenAddr,\n      roles: ['pause', 'unpause'],\n      to: account.address,\n    })\n\n    // First pause it\n    await token.pauseSync(config, {\n      token: tokenAddr,\n    })\n\n    const { receipt, ...result } = await token.unpauseSync(config, {\n      token: tokenAddr,\n    })\n    expect(receipt).toBeDefined()\n    expect(result).toMatchInlineSnapshot(`\n      {\n        \"isPaused\": false,\n        \"updater\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n      }\n    `)\n  })\n})\n\ndescribe('revokeRoles', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Revoke Roles Token',\n      symbol: 'REVOKE',\n    })\n\n    // Grant issuer role to account2\n    await token.grantRolesSync(config, {\n      token: tokenAddr,\n      roles: ['issuer'],\n      to: account2.address,\n    })\n\n    const hash = await token.revokeRoles(config, {\n      token: tokenAddr,\n      roles: ['issuer'],\n      from: account2.address,\n    })\n    expect(hash).toBeDefined()\n    expect(typeof hash).toBe('string')\n  })\n})\n\ndescribe('revokeRolesSync', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Revoke Roles Token Sync',\n      symbol: 'REVOKESYNC',\n    })\n\n    // Grant issuer role to account2\n    await token.grantRolesSync(config, {\n      token: tokenAddr,\n      roles: ['issuer'],\n      to: account2.address,\n    })\n\n    const { receipt, value } = await token.revokeRolesSync(config, {\n      token: tokenAddr,\n      roles: ['issuer'],\n      from: account2.address,\n    })\n    expect(receipt).toBeDefined()\n    expect(value).toBeDefined()\n    expect(value.length).toBe(1)\n    expect(value[0]?.account).toBe(account2.address)\n    expect(value[0]?.hasRole).toBe(false)\n  })\n})\n\ndescribe('renounceRoles', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Renounce Roles Token',\n      symbol: 'RENOUNCE',\n    })\n\n    // Grant issuer role to ourselves\n    await token.grantRolesSync(config, {\n      token: tokenAddr,\n      roles: ['issuer'],\n      to: account.address,\n    })\n\n    const hash = await token.renounceRoles(config, {\n      token: tokenAddr,\n      roles: ['issuer'],\n    })\n    expect(hash).toBeDefined()\n    expect(typeof hash).toBe('string')\n  })\n})\n\ndescribe('renounceRolesSync', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Renounce Roles Token Sync',\n      symbol: 'RENOUNCESYNC',\n    })\n\n    // Grant issuer role to ourselves\n    await token.grantRolesSync(config, {\n      token: tokenAddr,\n      roles: ['issuer'],\n      to: account.address,\n    })\n\n    const { receipt, value } = await token.renounceRolesSync(config, {\n      token: tokenAddr,\n      roles: ['issuer'],\n    })\n    expect(receipt).toBeDefined()\n    expect(value).toBeDefined()\n    expect(value.length).toBe(1)\n    expect(value[0]?.account).toBe(account.address)\n    expect(value[0]?.hasRole).toBe(false)\n  })\n})\n\ndescribe('setRoleAdmin', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Role Admin Token',\n      symbol: 'ROLEADMIN',\n    })\n\n    const hash = await token.setRoleAdmin(config, {\n      token: tokenAddr,\n      role: 'issuer',\n      adminRole: 'pause',\n    })\n    expect(hash).toBeDefined()\n    expect(typeof hash).toBe('string')\n  })\n})\n\ndescribe('setRoleAdminSync', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Role Admin Token Sync',\n      symbol: 'ROLEADMINSYNC',\n    })\n\n    const { receipt, ...result } = await token.setRoleAdminSync(config, {\n      token: tokenAddr,\n      role: 'issuer',\n      adminRole: 'pause',\n    })\n    expect(receipt).toBeDefined()\n    expect(result.role).toBeDefined()\n    expect(result.newAdminRole).toBeDefined()\n    expect(result.sender).toBe(account.address)\n  })\n})\n\ndescribe('setSupplyCap', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Supply Cap Token',\n      symbol: 'SUPPLYCAP',\n    })\n\n    const hash = await token.setSupplyCap(config, {\n      token: tokenAddr,\n      supplyCap: parseUnits('1000000', 6),\n    })\n    expect(hash).toBeDefined()\n    expect(typeof hash).toBe('string')\n  })\n})\n\ndescribe('setSupplyCapSync', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Supply Cap Token Sync',\n      symbol: 'SUPPLYCAPSYNC',\n    })\n\n    const { receipt, ...result } = await token.setSupplyCapSync(config, {\n      token: tokenAddr,\n      supplyCap: parseUnits('1000000', 6),\n    })\n    expect(receipt).toBeDefined()\n    expect(result.newSupplyCap).toBe(parseUnits('1000000', 6))\n    expect(result.updater).toBe(account.address)\n  })\n})\n\ndescribe('prepareUpdateQuoteToken', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create quote token\n    const { token: quoteToken } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Quote Token',\n      symbol: 'QUOTE',\n    })\n\n    // Create main token\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Main Token',\n      symbol: 'MAIN',\n    })\n\n    const hash = await token.prepareUpdateQuoteToken(config, {\n      token: tokenAddr,\n      quoteToken,\n    })\n    expect(hash).toBeDefined()\n    expect(typeof hash).toBe('string')\n  })\n})\n\ndescribe('prepareUpdateQuoteTokenSync', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create quote token\n    const { token: quoteToken } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Quote Token Sync',\n      symbol: 'QUOTESYNC',\n    })\n\n    // Create main token\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Main Token Sync',\n      symbol: 'MAINSYNC',\n    })\n\n    const { receipt, ...result } = await token.prepareUpdateQuoteTokenSync(\n      config,\n      {\n        token: tokenAddr,\n        quoteToken,\n      },\n    )\n    expect(receipt).toBeDefined()\n    expect(result.nextQuoteToken).toBe(quoteToken)\n    expect(result.updater).toBe(account.address)\n  })\n})\n\ndescribe('updateQuoteToken', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create quote token\n    const { token: quoteToken } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Quote Token Finalize',\n      symbol: 'QUOTEFINAL',\n    })\n\n    // Create main token\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Main Token Finalize',\n      symbol: 'MAINFINAL',\n    })\n\n    // Prepare quote token update first\n    await token.prepareUpdateQuoteTokenSync(config, {\n      token: tokenAddr,\n      quoteToken,\n    })\n\n    const hash = await token.updateQuoteToken(config, {\n      token: tokenAddr,\n    })\n    expect(hash).toBeDefined()\n    expect(typeof hash).toBe('string')\n  })\n})\n\ndescribe('updateQuoteTokenSync', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create quote token\n    const { token: quoteToken } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Quote Token Finalize Sync',\n      symbol: 'QUOTEFINALSYNC',\n    })\n\n    // Create main token\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Main Token Finalize Sync',\n      symbol: 'MAINFINALSYNC',\n    })\n\n    // Prepare quote token update first\n    await token.prepareUpdateQuoteTokenSync(config, {\n      token: tokenAddr,\n      quoteToken,\n    })\n\n    const { receipt, ...result } = await token.updateQuoteTokenSync(config, {\n      token: tokenAddr,\n    })\n    expect(receipt).toBeDefined()\n    expect(result.newQuoteToken).toBe(quoteToken)\n    expect(result.updater).toBe(account.address)\n  })\n})\n\ndescribe.todo('permit')\n\ndescribe.todo('permitSync')\n\ndescribe('watchAdminRole', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Watch Admin Role Token',\n      symbol: 'WATCHADMIN',\n    })\n\n    const events: any[] = []\n    const unwatch = token.watchAdminRole(config, {\n      token: tokenAddr,\n      onRoleAdminUpdated: (args) => {\n        events.push(args)\n      },\n    })\n\n    // Trigger event by setting a role admin\n    await token.setRoleAdminSync(config, {\n      token: tokenAddr,\n      role: 'issuer',\n      adminRole: 'pause',\n    })\n\n    await vi.waitFor(() => {\n      expect(events.length).toBeGreaterThan(0)\n    })\n    unwatch()\n\n    expect(events[0]).toBeDefined()\n  })\n})\n\ndescribe('watchApprove', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    const events: any[] = []\n    const unwatch = token.watchApprove(config, {\n      onApproval: (args) => {\n        events.push(args)\n      },\n      token: addresses.alphaUsd,\n    })\n\n    // Trigger approval event\n    await token.approveSync(config, {\n      amount: parseUnits('50', 6),\n      spender: account2.address,\n      token: addresses.alphaUsd,\n    })\n\n    await vi.waitFor(() => {\n      expect(events.length).toBeGreaterThan(0)\n    })\n    unwatch()\n\n    expect(events[0]?.owner).toBe(account.address)\n    expect(events[0]?.spender).toBe(account2.address)\n    expect(events[0]?.amount).toBe(parseUnits('50', 6))\n  })\n})\n\ndescribe('watchBurn', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Watch Burn Token',\n      symbol: 'WATCHBURN',\n    })\n\n    // Grant issuer role and mint tokens\n    await token.grantRolesSync(config, {\n      token: tokenAddr,\n      roles: ['issuer'],\n      to: account.address,\n    })\n    await token.mintSync(config, {\n      token: tokenAddr,\n      to: account.address,\n      amount: parseUnits('1000', 6),\n    })\n\n    const events: any[] = []\n    const unwatch = token.watchBurn(config, {\n      token: tokenAddr,\n      onBurn: (args) => {\n        events.push(args)\n      },\n    })\n\n    // Trigger burn event\n    await token.burnSync(config, {\n      token: tokenAddr,\n      amount: parseUnits('10', 6),\n    })\n\n    await vi.waitFor(() => {\n      expect(events.length).toBeGreaterThan(0)\n    })\n    unwatch()\n\n    expect(events[0]?.from).toBe(account.address)\n    expect(events[0]?.amount).toBe(parseUnits('10', 6))\n  })\n})\n\ndescribe('watchCreate', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    const events: any[] = []\n    const unwatch = token.watchCreate(config, {\n      onTokenCreated: (args) => {\n        events.push(args)\n      },\n    })\n\n    // Trigger token creation event\n    await token.createSync(config, {\n      name: 'Watch Create Token',\n      symbol: 'WATCHCREATE',\n      currency: 'USD',\n    })\n\n    await vi.waitFor(() => {\n      expect(events.length).toBeGreaterThan(0)\n    })\n    unwatch()\n\n    expect(events[0]?.name).toBe('Watch Create Token')\n    expect(events[0]?.symbol).toBe('WATCHCREATE')\n    expect(events[0]?.currency).toBe('USD')\n    expect(events[0]?.admin).toBe(account.address)\n  })\n})\n\ndescribe('watchMint', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Watch Mint Token',\n      symbol: 'WATCHMINT',\n    })\n\n    // Grant issuer role\n    await token.grantRolesSync(config, {\n      token: tokenAddr,\n      roles: ['issuer'],\n      to: account.address,\n    })\n\n    const events: any[] = []\n    const unwatch = token.watchMint(config, {\n      token: tokenAddr,\n      onMint: (args) => {\n        events.push(args)\n      },\n    })\n\n    // Trigger mint event\n    await token.mintSync(config, {\n      token: tokenAddr,\n      to: account.address,\n      amount: parseUnits('100', 6),\n    })\n\n    await vi.waitFor(() => {\n      expect(events.length).toBeGreaterThan(0)\n    })\n    unwatch()\n\n    expect(events[0]?.to).toBe(account.address)\n    expect(events[0]?.amount).toBe(parseUnits('100', 6))\n  })\n})\n\ndescribe('watchRole', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await token.createSync(config, {\n      currency: 'USD',\n      name: 'Watch Role Token',\n      symbol: 'WATCHROLE',\n    })\n\n    const events: any[] = []\n    const unwatch = token.watchRole(config, {\n      token: tokenAddr,\n      onRoleUpdated: (args) => {\n        events.push(args)\n      },\n    })\n\n    // Trigger role update event by granting a role\n    await token.grantRolesSync(config, {\n      token: tokenAddr,\n      roles: ['issuer'],\n      to: account2.address,\n    })\n\n    await vi.waitFor(() => {\n      expect(events.find((e) => e.account === account2.address)).toBeDefined()\n    })\n    unwatch()\n\n    const event = events.find((e) => e.account === account2.address)\n    expect(event?.hasRole).toBe(true)\n    expect(event?.type).toBe('granted')\n  })\n})\n\ndescribe('watchTransfer', () => {\n  test('default', async () => {\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n\n    const events: any[] = []\n    const unwatch = token.watchTransfer(config, {\n      token: addresses.alphaUsd,\n      onTransfer: (args) => {\n        events.push(args)\n      },\n    })\n\n    // Trigger transfer event\n    await token.transferSync(config, {\n      amount: parseUnits('5', 6),\n      to: account2.address,\n      token: addresses.alphaUsd,\n    })\n\n    await vi.waitFor(() => {\n      expect(events.length).toBeGreaterThan(0)\n    })\n    unwatch()\n\n    expect(events[0]?.from).toBe(account.address)\n    expect(events[0]?.to).toBe(account2.address)\n    expect(events[0]?.amount).toBe(parseUnits('5', 6))\n  })\n})\n"
  },
  {
    "path": "packages/core/src/tempo/actions/token.ts",
    "content": "import type { Account, BaseErrorType } from 'viem'\nimport { Actions } from 'viem/tempo'\nimport { getConnectorClient } from '../../actions/getConnectorClient.js'\nimport type { Config } from '../../createConfig.js'\nimport type {\n  ChainIdParameter,\n  ConnectorParameter,\n} from '../../types/properties.js'\nimport type { UnionLooseOmit } from '../../types/utils.js'\nimport type { QueryOptions, QueryParameter } from './utils.js'\n\n/**\n * Approves a spender to transfer TIP20 tokens on behalf of the caller.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { Actions } from '@wagmi/core/tempo'\n * import { tempo } from '@wagmi/core/chains'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.token.approve(config, {\n *   spender: '0x...',\n *   amount: 100n,\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns Transaction hash.\n */\nexport async function approve<config extends Config>(\n  config: config,\n  parameters: approve.Parameters<config>,\n): Promise<Actions.token.approve.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.approve(client, parameters as never)\n}\n\nexport declare namespace approve {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.approve.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.approve.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.approve.ErrorType\n}\n\n/**\n * Approves a spender to transfer TIP20 tokens on behalf of the caller.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.token.approveSync(config, {\n *   spender: '0x...',\n *   amount: 100n,\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function approveSync<config extends Config>(\n  config: config,\n  parameters: approveSync.Parameters<config>,\n): Promise<Actions.token.approveSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.approveSync(client, parameters as never)\n}\n\nexport declare namespace approveSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.approveSync.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.approveSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.approveSync.ErrorType\n}\n\n/**\n * Burns TIP20 tokens from the caller's balance.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.token.burn(config, {\n *   amount: 100n,\n *   token: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns Transaction hash.\n */\nexport async function burn<config extends Config>(\n  config: config,\n  parameters: burn.Parameters<config>,\n): Promise<Actions.token.burn.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.burn(client, parameters as never)\n}\n\nexport declare namespace burn {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.burn.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.burn.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.burn.ErrorType\n}\n\n/**\n * Burns TIP20 tokens from a blocked address.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.token.burnBlocked(config, {\n *   from: '0x...',\n *   amount: 100n,\n *   token: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns Transaction hash.\n */\nexport async function burnBlocked<config extends Config>(\n  config: config,\n  parameters: burnBlocked.Parameters<config>,\n): Promise<Actions.token.burnBlocked.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return await Actions.token.burnBlocked(client, parameters as never)\n}\n\nexport declare namespace burnBlocked {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.burnBlocked.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.burnBlocked.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.burnBlocked.ErrorType\n}\n\n/**\n * Burns TIP20 tokens from a blocked address.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.token.burnBlockedSync(config, {\n *   from: '0x...',\n *   amount: 100n,\n *   token: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function burnBlockedSync<config extends Config>(\n  config: config,\n  parameters: burnBlockedSync.Parameters<config>,\n): Promise<Actions.token.burnBlockedSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.burnBlockedSync(client, parameters as never)\n}\n\nexport declare namespace burnBlockedSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.burnBlockedSync.Parameters<\n        config['chains'][number],\n        Account\n      >,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.burnBlockedSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.burnBlockedSync.ErrorType\n}\n\n/**\n * Burns TIP20 tokens from the caller's balance.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.token.burnSync(config, {\n *   amount: 100n,\n *   token: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function burnSync<config extends Config>(\n  config: config,\n  parameters: burnSync.Parameters<config>,\n): Promise<Actions.token.burnSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.burnSync(client, parameters as never)\n}\n\nexport declare namespace burnSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.burnSync.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.burnSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.burnSync.ErrorType\n}\n\n/**\n * Changes the transfer policy ID for a TIP20 token.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.token.changeTransferPolicy(config, {\n *   token: '0x...',\n *   policyId: 1n,\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns Transaction hash.\n */\nexport async function changeTransferPolicy<config extends Config>(\n  config: config,\n  parameters: changeTransferPolicy.Parameters<config>,\n): Promise<Actions.token.changeTransferPolicy.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.changeTransferPolicy(client, parameters as never)\n}\n\nexport declare namespace changeTransferPolicy {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.changeTransferPolicy.Parameters<\n        config['chains'][number],\n        Account\n      >,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.changeTransferPolicy.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.changeTransferPolicy.ErrorType\n}\n\n/**\n * Changes the transfer policy ID for a TIP20 token.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.token.changeTransferPolicySync(config, {\n *   token: '0x...',\n *   policyId: 1n,\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function changeTransferPolicySync<config extends Config>(\n  config: config,\n  parameters: changeTransferPolicySync.Parameters<config>,\n): Promise<Actions.token.changeTransferPolicySync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.changeTransferPolicySync(client, parameters as never)\n}\n\nexport declare namespace changeTransferPolicySync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.changeTransferPolicySync.Parameters<\n        config['chains'][number],\n        Account\n      >,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.changeTransferPolicySync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.changeTransferPolicySync.ErrorType\n}\n\n/**\n * Creates a new TIP20 token.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.token.create(config, {\n *   name: 'My Token',\n *   symbol: 'MTK',\n *   currency: 'USD',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns Transaction hash.\n */\nexport async function create<config extends Config>(\n  config: config,\n  parameters: create.Parameters<config>,\n): Promise<Actions.token.create.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.create(client, parameters as never)\n}\n\nexport declare namespace create {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.create.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.create.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.create.ErrorType\n}\n\n/**\n * Creates a new TIP20 token.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.token.createSync(config, {\n *   name: 'My Token',\n *   symbol: 'MTK',\n *   currency: 'USD',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function createSync<config extends Config>(\n  config: config,\n  parameters: createSync.Parameters<config>,\n): Promise<Actions.token.createSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.createSync(client, parameters as never)\n}\n\nexport declare namespace createSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.createSync.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.createSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.createSync.ErrorType\n}\n\n/**\n * Updates the quote token for a TIP20 token.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.token.updateQuoteToken(config, {\n *   token: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns Transaction hash.\n */\nexport async function updateQuoteToken<config extends Config>(\n  config: config,\n  parameters: updateQuoteToken.Parameters<config>,\n): Promise<Actions.token.updateQuoteToken.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.updateQuoteToken(client, parameters as never)\n}\n\nexport declare namespace updateQuoteToken {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.updateQuoteToken.Parameters<\n        config['chains'][number],\n        Account\n      >,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.updateQuoteToken.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.updateQuoteToken.ErrorType\n}\n\n/**\n * Updates the quote token for a TIP20 token.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.token.updateQuoteTokenSync(config, {\n *   token: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function updateQuoteTokenSync<config extends Config>(\n  config: config,\n  parameters: updateQuoteTokenSync.Parameters<config>,\n): Promise<Actions.token.updateQuoteTokenSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.updateQuoteTokenSync(client, parameters as never)\n}\n\nexport declare namespace updateQuoteTokenSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.updateQuoteTokenSync.Parameters<\n        config['chains'][number],\n        Account\n      >,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.updateQuoteTokenSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.updateQuoteTokenSync.ErrorType\n}\n\n/**\n * Gets TIP20 token allowance.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const allowance = await Actions.token.getAllowance(config, {\n *   account: '0x...',\n *   spender: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The token allowance.\n */\nexport function getAllowance<config extends Config>(\n  config: config,\n  parameters: getAllowance.Parameters<config>,\n): Promise<getAllowance.ReturnValue> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.token.getAllowance(client, rest)\n}\n\nexport namespace getAllowance {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.token.getAllowance.Parameters\n\n  export type ReturnValue = Actions.token.getAllowance.ReturnValue\n\n  export type ErrorType = BaseErrorType\n\n  export function queryKey<config extends Config>(\n    parameters: Parameters<config>,\n  ) {\n    return ['getAllowance', parameters] as const\n  }\n\n  export type QueryKey<config extends Config> = ReturnType<\n    typeof queryKey<config>\n  >\n\n  export function queryOptions<config extends Config, selectData = ReturnValue>(\n    config: Config,\n    parameters: queryOptions.Parameters<config, selectData>,\n  ): queryOptions.ReturnValue<config, selectData> {\n    const { query, ...rest } = parameters\n    return {\n      ...query,\n      enabled: Boolean(\n        rest.account && rest.spender && rest.token && (query?.enabled ?? true),\n      ),\n      queryKey: queryKey(rest),\n      async queryFn(context) {\n        const [, parameters] = context.queryKey\n        return await getAllowance(config, parameters)\n      },\n    }\n  }\n\n  export declare namespace queryOptions {\n    export type Parameters<\n      config extends Config,\n      selectData = getAllowance.ReturnValue,\n    > = getAllowance.Parameters<config> &\n      QueryParameter<\n        getAllowance.ReturnValue,\n        getAllowance.ErrorType,\n        selectData,\n        getAllowance.QueryKey<config>\n      >\n\n    export type ReturnValue<\n      config extends Config,\n      selectData = getAllowance.ReturnValue,\n    > = QueryOptions<\n      getAllowance.ReturnValue,\n      getAllowance.ErrorType,\n      selectData,\n      getAllowance.QueryKey<config>\n    >\n  }\n}\n\n/**\n * Gets TIP20 token balance for an address.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const balance = await Actions.token.getBalance(config, {\n *   account: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The token balance.\n */\nexport function getBalance<config extends Config>(\n  config: config,\n  parameters: getBalance.Parameters<config>,\n): Promise<getBalance.ReturnValue> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.token.getBalance(client, rest as never)\n}\n\nexport namespace getBalance {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.token.getBalance.Parameters\n\n  export type ReturnValue = Actions.token.getBalance.ReturnValue\n\n  export type ErrorType = BaseErrorType\n\n  export function queryKey<config extends Config>(\n    parameters: Parameters<config>,\n  ) {\n    return ['getBalance', parameters] as const\n  }\n\n  export type QueryKey<config extends Config> = ReturnType<\n    typeof queryKey<config>\n  >\n\n  export function queryOptions<config extends Config, selectData = ReturnValue>(\n    config: Config,\n    parameters: queryOptions.Parameters<config, selectData>,\n  ): queryOptions.ReturnValue<config, selectData> {\n    const { query, ...rest } = parameters\n    return {\n      ...query,\n      enabled: Boolean(rest.account && rest.token && (query?.enabled ?? true)),\n      queryKey: queryKey(rest),\n      async queryFn(context) {\n        const [, parameters] = context.queryKey\n        return (await getBalance(config, parameters)) ?? null\n      },\n    }\n  }\n\n  export declare namespace queryOptions {\n    export type Parameters<\n      config extends Config,\n      selectData = getBalance.ReturnValue,\n    > = getBalance.Parameters<config> &\n      QueryParameter<\n        getBalance.ReturnValue,\n        getBalance.ErrorType,\n        selectData,\n        getBalance.QueryKey<config>\n      >\n\n    export type ReturnValue<\n      config extends Config,\n      selectData = getBalance.ReturnValue,\n    > = QueryOptions<\n      getBalance.ReturnValue,\n      getBalance.ErrorType,\n      selectData,\n      getBalance.QueryKey<config>\n    >\n  }\n}\n\n/**\n * Gets TIP20 token metadata.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const metadata = await Actions.token.getMetadata(config, {\n *   token: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The token metadata.\n */\nexport function getMetadata<config extends Config>(\n  config: config,\n  parameters: getMetadata.Parameters<config>,\n): Promise<getMetadata.ReturnValue> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.token.getMetadata(client, rest)\n}\n\nexport namespace getMetadata {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.token.getMetadata.Parameters\n\n  export type ReturnValue = Actions.token.getMetadata.ReturnValue\n\n  export type ErrorType = BaseErrorType\n\n  export function queryKey<config extends Config>(\n    parameters: Parameters<config>,\n  ) {\n    return ['getMetadata', parameters] as const\n  }\n\n  export type QueryKey<config extends Config> = ReturnType<\n    typeof queryKey<config>\n  >\n\n  export function queryOptions<config extends Config, selectData = ReturnValue>(\n    config: Config,\n    parameters: queryOptions.Parameters<config, selectData>,\n  ): queryOptions.ReturnValue<config, selectData> {\n    const { query, ...rest } = parameters\n    return {\n      ...query,\n      enabled: Boolean(rest.token && (query?.enabled ?? true)),\n      queryKey: queryKey(rest),\n      async queryFn(context) {\n        const [, parameters] = context.queryKey\n        return await getMetadata(config, parameters)\n      },\n    }\n  }\n\n  export declare namespace queryOptions {\n    export type Parameters<\n      config extends Config,\n      selectData = getMetadata.ReturnValue,\n    > = getMetadata.Parameters<config> &\n      QueryParameter<\n        getMetadata.ReturnValue,\n        getMetadata.ErrorType,\n        selectData,\n        getMetadata.QueryKey<config>\n      >\n\n    export type ReturnValue<\n      config extends Config,\n      selectData = getMetadata.ReturnValue,\n    > = QueryOptions<\n      getMetadata.ReturnValue,\n      getMetadata.ErrorType,\n      selectData,\n      getMetadata.QueryKey<config>\n    >\n  }\n}\n\n/**\n * Gets the admin role for a specific role in a TIP20 token.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const adminRole = await Actions.token.getRoleAdmin(config, {\n *   role: 'issuer',\n *   token: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The admin role hash.\n */\nexport function getRoleAdmin<config extends Config>(\n  config: config,\n  parameters: getRoleAdmin.Parameters<config>,\n): Promise<getRoleAdmin.ReturnValue> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.token.getRoleAdmin(client, rest)\n}\n\nexport namespace getRoleAdmin {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.token.getRoleAdmin.Parameters\n\n  export type ReturnValue = Actions.token.getRoleAdmin.ReturnValue\n\n  export type ErrorType = BaseErrorType\n\n  export function queryKey<config extends Config>(\n    parameters: Parameters<config>,\n  ) {\n    return ['getRoleAdmin', parameters] as const\n  }\n\n  export type QueryKey<config extends Config> = ReturnType<\n    typeof queryKey<config>\n  >\n\n  export function queryOptions<config extends Config, selectData = ReturnValue>(\n    config: Config,\n    parameters: queryOptions.Parameters<config, selectData>,\n  ): queryOptions.ReturnValue<config, selectData> {\n    const { query, ...rest } = parameters\n    return {\n      ...query,\n      enabled: Boolean(rest.token && rest.role && (query?.enabled ?? true)),\n      queryKey: queryKey(rest),\n      async queryFn(context) {\n        const [, parameters] = context.queryKey\n        return await getRoleAdmin(config, parameters)\n      },\n    }\n  }\n\n  export declare namespace queryOptions {\n    export type Parameters<\n      config extends Config,\n      selectData = getRoleAdmin.ReturnValue,\n    > = getRoleAdmin.Parameters<config> &\n      QueryParameter<\n        getRoleAdmin.ReturnValue,\n        getRoleAdmin.ErrorType,\n        selectData,\n        getRoleAdmin.QueryKey<config>\n      >\n\n    export type ReturnValue<\n      config extends Config,\n      selectData = getRoleAdmin.ReturnValue,\n    > = QueryOptions<\n      getRoleAdmin.ReturnValue,\n      getRoleAdmin.ErrorType,\n      selectData,\n      getRoleAdmin.QueryKey<config>\n    >\n  }\n}\n\n/**\n * Grants a role for a TIP20 token.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.token.grantRoles(config, {\n *   token: '0x...',\n *   to: '0x...',\n *   roles: ['issuer'],\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns Transaction hash.\n */\nexport async function grantRoles<config extends Config>(\n  config: config,\n  parameters: grantRoles.Parameters<config>,\n): Promise<Actions.token.grantRoles.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.grantRoles(client, parameters as never)\n}\n\nexport declare namespace grantRoles {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.grantRoles.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.grantRoles.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.grantRoles.ErrorType\n}\n\n/**\n * Grants a role for a TIP20 token.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.token.grantRolesSync(config, {\n *   token: '0x...',\n *   to: '0x...',\n *   roles: ['issuer'],\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function grantRolesSync<config extends Config>(\n  config: config,\n  parameters: grantRolesSync.Parameters<config>,\n): Promise<Actions.token.grantRolesSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.grantRolesSync(client, parameters as never)\n}\n\nexport declare namespace grantRolesSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.grantRolesSync.Parameters<\n        config['chains'][number],\n        Account\n      >,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.grantRolesSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.grantRolesSync.ErrorType\n}\n\n/**\n * Checks if an account has a specific role for a TIP20 token.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hasRole = await Actions.token.hasRole(config, {\n *   account: '0x...',\n *   role: 'issuer',\n *   token: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns Whether the account has the role.\n */\nexport function hasRole<config extends Config>(\n  config: config,\n  parameters: hasRole.Parameters<config>,\n): Promise<hasRole.ReturnValue> {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.token.hasRole(client, rest)\n}\n\nexport namespace hasRole {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.token.hasRole.Parameters\n\n  export type ReturnValue = Actions.token.hasRole.ReturnValue\n\n  export type ErrorType = BaseErrorType\n\n  export function queryKey<config extends Config>(\n    parameters: Parameters<config>,\n  ) {\n    return ['hasRole', parameters] as const\n  }\n\n  export type QueryKey<config extends Config> = ReturnType<\n    typeof queryKey<config>\n  >\n\n  export function queryOptions<config extends Config, selectData = ReturnValue>(\n    config: Config,\n    parameters: queryOptions.Parameters<config, selectData>,\n  ): queryOptions.ReturnValue<config, selectData> {\n    const { query, ...rest } = parameters\n    return {\n      ...query,\n      enabled: Boolean(\n        rest.token && rest.role && rest.account && (query?.enabled ?? true),\n      ),\n      queryKey: queryKey(rest),\n      async queryFn(context) {\n        const [, parameters] = context.queryKey\n        return await hasRole(config, parameters)\n      },\n    }\n  }\n\n  export declare namespace queryOptions {\n    export type Parameters<\n      config extends Config,\n      selectData = hasRole.ReturnValue,\n    > = hasRole.Parameters<config> &\n      QueryParameter<\n        hasRole.ReturnValue,\n        hasRole.ErrorType,\n        selectData,\n        hasRole.QueryKey<config>\n      >\n\n    export type ReturnValue<\n      config extends Config,\n      selectData = hasRole.ReturnValue,\n    > = QueryOptions<\n      hasRole.ReturnValue,\n      hasRole.ErrorType,\n      selectData,\n      hasRole.QueryKey<config>\n    >\n  }\n}\n\n/**\n * Mints TIP20 tokens to an address.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.token.mint(config, {\n *   to: '0x...',\n *   amount: 100n,\n *   token: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns Transaction hash.\n */\nexport async function mint<config extends Config>(\n  config: config,\n  parameters: mint.Parameters<config>,\n): Promise<Actions.token.mint.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.mint(client, parameters as never)\n}\n\nexport declare namespace mint {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.mint.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.mint.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.mint.ErrorType\n}\n\n/**\n * Mints TIP20 tokens to an address.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.token.mintSync(config, {\n *   to: '0x...',\n *   amount: 100n,\n *   token: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function mintSync<config extends Config>(\n  config: config,\n  parameters: mintSync.Parameters<config>,\n): Promise<Actions.token.mintSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.mintSync(client, parameters as never)\n}\n\nexport declare namespace mintSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.mintSync.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.mintSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.mintSync.ErrorType\n}\n\n/**\n * Pauses a TIP20 token.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.token.pause(config, {\n *   token: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns Transaction hash.\n */\nexport async function pause<config extends Config>(\n  config: config,\n  parameters: pause.Parameters<config>,\n): Promise<Actions.token.pause.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.pause(client, parameters as never)\n}\n\nexport declare namespace pause {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.pause.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.pause.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.pause.ErrorType\n}\n\n/**\n * Pauses a TIP20 token.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.token.pauseSync(config, {\n *   token: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function pauseSync<config extends Config>(\n  config: config,\n  parameters: pauseSync.Parameters<config>,\n): Promise<Actions.token.pauseSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.pauseSync(client, parameters as never)\n}\n\nexport declare namespace pauseSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.pauseSync.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.pauseSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.pauseSync.ErrorType\n}\n\n/**\n * Renounces a role for a TIP20 token.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.token.renounceRoles(config, {\n *   token: '0x...',\n *   roles: ['issuer'],\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns Transaction hash.\n */\nexport async function renounceRoles<config extends Config>(\n  config: config,\n  parameters: renounceRoles.Parameters<config>,\n): Promise<Actions.token.renounceRoles.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.renounceRoles(client, parameters as never)\n}\n\nexport declare namespace renounceRoles {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.renounceRoles.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.renounceRoles.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.renounceRoles.ErrorType\n}\n\n/**\n * Renounces a role for a TIP20 token.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.token.renounceRolesSync(config, {\n *   token: '0x...',\n *   roles: ['issuer'],\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function renounceRolesSync<config extends Config>(\n  config: config,\n  parameters: renounceRolesSync.Parameters<config>,\n): Promise<Actions.token.renounceRolesSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.renounceRolesSync(client, parameters as never)\n}\n\nexport declare namespace renounceRolesSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.renounceRolesSync.Parameters<\n        config['chains'][number],\n        Account\n      >,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.renounceRolesSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.renounceRolesSync.ErrorType\n}\n\n/**\n * Revokes a role for a TIP20 token.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.token.revokeRoles(config, {\n *   token: '0x...',\n *   from: '0x...',\n *   roles: ['issuer'],\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns Transaction hash.\n */\nexport async function revokeRoles<config extends Config>(\n  config: config,\n  parameters: revokeRoles.Parameters<config>,\n): Promise<Actions.token.revokeRoles.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.revokeRoles(client, parameters as never)\n}\n\nexport declare namespace revokeRoles {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.revokeRoles.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.revokeRoles.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.revokeRoles.ErrorType\n}\n\n/**\n * Revokes a role for a TIP20 token.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.token.revokeRolesSync(config, {\n *   token: '0x...',\n *   from: '0x...',\n *   roles: ['issuer'],\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function revokeRolesSync<config extends Config>(\n  config: config,\n  parameters: revokeRolesSync.Parameters<config>,\n): Promise<Actions.token.revokeRolesSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.revokeRolesSync(client, parameters as never)\n}\n\nexport declare namespace revokeRolesSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.revokeRolesSync.Parameters<\n        config['chains'][number],\n        Account\n      >,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.revokeRolesSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.revokeRolesSync.ErrorType\n}\n\n/**\n * Sets the admin role for a specific role in a TIP20 token.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.token.setRoleAdmin(config, {\n *   token: '0x...',\n *   role: 'issuer',\n *   adminRole: 'pause',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns Transaction hash.\n */\nexport async function setRoleAdmin<config extends Config>(\n  config: config,\n  parameters: setRoleAdmin.Parameters<config>,\n): Promise<Actions.token.setRoleAdmin.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.setRoleAdmin(client, parameters as never)\n}\n\nexport declare namespace setRoleAdmin {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.setRoleAdmin.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.setRoleAdmin.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.setRoleAdmin.ErrorType\n}\n\n/**\n * Sets the admin role for a specific role in a TIP20 token.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.token.setRoleAdminSync(config, {\n *   token: '0x...',\n *   role: 'issuer',\n *   adminRole: 'pause',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function setRoleAdminSync<config extends Config>(\n  config: config,\n  parameters: setRoleAdminSync.Parameters<config>,\n): Promise<Actions.token.setRoleAdminSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.setRoleAdminSync(client, parameters as never)\n}\n\nexport declare namespace setRoleAdminSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.setRoleAdminSync.Parameters<\n        config['chains'][number],\n        Account\n      >,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.setRoleAdminSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.setRoleAdminSync.ErrorType\n}\n\n/**\n * Sets the supply cap for a TIP20 token.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.token.setSupplyCap(config, {\n *   token: '0x...',\n *   supplyCap: 1000000n,\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns Transaction hash.\n */\nexport async function setSupplyCap<config extends Config>(\n  config: config,\n  parameters: setSupplyCap.Parameters<config>,\n): Promise<Actions.token.setSupplyCap.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.setSupplyCap(client, parameters as never)\n}\n\nexport declare namespace setSupplyCap {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.setSupplyCap.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.setSupplyCap.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.setSupplyCap.ErrorType\n}\n\n/**\n * Sets the supply cap for a TIP20 token.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.token.setSupplyCapSync(config, {\n *   token: '0x...',\n *   supplyCap: 1000000n,\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function setSupplyCapSync<config extends Config>(\n  config: config,\n  parameters: setSupplyCapSync.Parameters<config>,\n): Promise<Actions.token.setSupplyCapSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.setSupplyCapSync(client, parameters as never)\n}\n\nexport declare namespace setSupplyCapSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.setSupplyCapSync.Parameters<\n        config['chains'][number],\n        Account\n      >,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.setSupplyCapSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.setSupplyCapSync.ErrorType\n}\n\n/**\n * Transfers TIP20 tokens to another address.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.token.transfer(config, {\n *   to: '0x...',\n *   amount: 100n,\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns Transaction hash.\n */\nexport async function transfer<config extends Config>(\n  config: config,\n  parameters: transfer.Parameters<config>,\n): Promise<Actions.token.transfer.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.transfer(client, parameters as never)\n}\n\nexport declare namespace transfer {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.transfer.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.transfer.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.transfer.ErrorType\n}\n\n/**\n * Transfers TIP20 tokens to another address.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.token.transferSync(config, {\n *   to: '0x...',\n *   amount: 100n,\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function transferSync<config extends Config>(\n  config: config,\n  parameters: transferSync.Parameters<config>,\n): Promise<Actions.token.transferSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.transferSync(client, parameters as never)\n}\n\nexport declare namespace transferSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.transferSync.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.transferSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.transferSync.ErrorType\n}\n\n/**\n * Unpauses a TIP20 token.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.token.unpause(config, {\n *   token: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns Transaction hash.\n */\nexport async function unpause<config extends Config>(\n  config: config,\n  parameters: unpause.Parameters<config>,\n): Promise<Actions.token.unpause.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.unpause(client, parameters as never)\n}\n\nexport declare namespace unpause {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.unpause.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.unpause.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.unpause.ErrorType\n}\n\n/**\n * Unpauses a TIP20 token.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.token.unpauseSync(config, {\n *   token: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function unpauseSync<config extends Config>(\n  config: config,\n  parameters: unpauseSync.Parameters<config>,\n): Promise<Actions.token.unpauseSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.unpauseSync(client, parameters as never)\n}\n\nexport declare namespace unpauseSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.unpauseSync.Parameters<config['chains'][number], Account>,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.unpauseSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.unpauseSync.ErrorType\n}\n\n/**\n * Prepares the quote token update for a TIP20 token.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const hash = await Actions.token.prepareUpdateQuoteToken(config, {\n *   token: '0x...',\n *   quoteToken: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns Transaction hash.\n */\nexport async function prepareUpdateQuoteToken<config extends Config>(\n  config: config,\n  parameters: prepareUpdateQuoteToken.Parameters<config>,\n): Promise<Actions.token.prepareUpdateQuoteToken.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.prepareUpdateQuoteToken(client, parameters as never)\n}\n\nexport declare namespace prepareUpdateQuoteToken {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.prepareUpdateQuoteToken.Parameters<\n        config['chains'][number],\n        Account\n      >,\n      'chain'\n    >\n\n  export type ReturnValue = Actions.token.prepareUpdateQuoteToken.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.prepareUpdateQuoteToken.ErrorType\n}\n\n/**\n * Prepares the quote token update for a TIP20 token.\n *\n * Note: This is a synchronous action that waits for the transaction to\n * be included on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const result = await Actions.token.prepareUpdateQuoteTokenSync(config, {\n *   token: '0x...',\n *   quoteToken: '0x...',\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function prepareUpdateQuoteTokenSync<config extends Config>(\n  config: config,\n  parameters: prepareUpdateQuoteTokenSync.Parameters<config>,\n): Promise<Actions.token.prepareUpdateQuoteTokenSync.ReturnValue> {\n  const { account, chainId, connector } = parameters\n  const client = await getConnectorClient(config, {\n    account,\n    assertChainId: false,\n    chainId,\n    connector,\n  })\n  return Actions.token.prepareUpdateQuoteTokenSync(client, parameters as never)\n}\n\nexport declare namespace prepareUpdateQuoteTokenSync {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    ConnectorParameter &\n    UnionLooseOmit<\n      Actions.token.prepareUpdateQuoteTokenSync.Parameters<\n        config['chains'][number],\n        Account\n      >,\n      'chain'\n    >\n\n  export type ReturnValue =\n    Actions.token.prepareUpdateQuoteTokenSync.ReturnValue\n\n  export type ErrorType = BaseErrorType // TODO: Actions.token.prepareUpdateQuoteTokenSync.ErrorType\n}\n\n/**\n * Watches for TIP20 token role admin updates.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const unwatch = Actions.token.watchAdminRole(config, {\n *   onRoleAdminUpdated: (args, log) => {\n *     console.log('Role admin updated:', args)\n *   },\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchAdminRole<config extends Config>(\n  config: config,\n  parameters: watchAdminRole.Parameters<config>,\n) {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.token.watchAdminRole(client, rest)\n}\n\nexport declare namespace watchAdminRole {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.token.watchAdminRole.Parameters\n}\n\n/**\n * Watches for TIP20 token approval events.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const unwatch = Actions.token.watchApprove(config, {\n *   onApproval: (args, log) => {\n *     console.log('Approval:', args)\n *   },\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchApprove<config extends Config>(\n  config: config,\n  parameters: watchApprove.Parameters<config>,\n) {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.token.watchApprove(client, rest)\n}\n\nexport declare namespace watchApprove {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.token.watchApprove.Parameters\n}\n\n/**\n * Watches for TIP20 token burn events.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const unwatch = Actions.token.watchBurn(config, {\n *   onBurn: (args, log) => {\n *     console.log('Burn:', args)\n *   },\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchBurn<config extends Config>(\n  config: config,\n  parameters: watchBurn.Parameters<config>,\n) {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.token.watchBurn(client, rest)\n}\n\nexport declare namespace watchBurn {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.token.watchBurn.Parameters\n}\n\n/**\n * Watches for new TIP20 tokens created.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const unwatch = Actions.token.watchCreate(config, {\n *   onTokenCreated: (args, log) => {\n *     console.log('Token created:', args)\n *   },\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchCreate<config extends Config>(\n  config: config,\n  parameters: watchCreate.Parameters<config>,\n) {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.token.watchCreate(client, rest)\n}\n\nexport declare namespace watchCreate {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.token.watchCreate.Parameters\n}\n\n/**\n * Watches for TIP20 token mint events.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const unwatch = Actions.token.watchMint(config, {\n *   onMint: (args, log) => {\n *     console.log('Mint:', args)\n *   },\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchMint<config extends Config>(\n  config: config,\n  parameters: watchMint.Parameters<config>,\n) {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.token.watchMint(client, rest)\n}\n\nexport declare namespace watchMint {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.token.watchMint.Parameters\n\n  export type ReturnValue = Actions.token.watchMint.ReturnValue\n}\n\n/**\n * Watches for TIP20 token role membership updates.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const unwatch = Actions.token.watchRole(config, {\n *   onRoleUpdated: (args, log) => {\n *     console.log('Role updated:', args)\n *   },\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchRole<config extends Config>(\n  config: config,\n  parameters: watchRole.Parameters<config>,\n) {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.token.watchRole(client, rest)\n}\n\nexport declare namespace watchRole {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.token.watchRole.Parameters\n}\n\n/**\n * Watches for TIP20 token transfer events.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const unwatch = Actions.token.watchTransfer(config, {\n *   onTransfer: (args, log) => {\n *     console.log('Transfer:', args)\n *   },\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchTransfer<config extends Config>(\n  config: config,\n  parameters: watchTransfer.Parameters<config>,\n) {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.token.watchTransfer(client, rest)\n}\n\nexport declare namespace watchTransfer {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.token.watchTransfer.Parameters\n}\n\n/**\n * Watches for TIP20 token quote token update events.\n *\n * @example\n * ```ts\n * import { createConfig, http } from '@wagmi/core'\n * import { tempo } from '@wagmi/core/chains'\n * import { Actions } from '@wagmi/core/tempo'\n *\n * const config = createConfig({\n *   chains: [tempo],\n *   transports: {\n *     [tempo.id]: http(),\n *   },\n * })\n *\n * const unwatch = Actions.token.watchUpdateQuoteToken(config, {\n *   onUpdateQuoteToken: (args, log) => {\n *     if (args.completed)\n *       console.log('quote token update completed:', args.newQuoteToken)\n *     else\n *       console.log('quote token update proposed:', args.newQuoteToken)\n *   },\n * })\n * ```\n *\n * @param config - Config.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchUpdateQuoteToken<config extends Config>(\n  config: config,\n  parameters: watchUpdateQuoteToken.Parameters<config>,\n) {\n  const { chainId, ...rest } = parameters\n  const client = config.getClient({ chainId })\n  return Actions.token.watchUpdateQuoteToken(client, rest)\n}\n\nexport declare namespace watchUpdateQuoteToken {\n  export type Parameters<config extends Config> = ChainIdParameter<config> &\n    Actions.token.watchUpdateQuoteToken.Parameters\n}\n"
  },
  {
    "path": "packages/core/src/tempo/actions/utils.ts",
    "content": "import type * as Query from '@tanstack/query-core'\nimport type { RequiredBy, UnionLooseOmit } from '../../types/utils.js'\n\nexport type QueryParameter<\n  queryFnData = unknown,\n  error = Query.DefaultError,\n  data = queryFnData,\n  queryKey extends Query.QueryKey = Query.QueryKey,\n> = {\n  query?:\n    | UnionLooseOmit<\n        QueryOptions<queryFnData, error, data, queryKey>,\n        'queryKey' | 'queryFn'\n      >\n    | undefined\n}\n\nexport type QueryOptions<\n  queryFnData = unknown,\n  error = Query.DefaultError,\n  data = queryFnData,\n  queryKey extends Query.QueryKey = Query.QueryKey,\n> = RequiredBy<\n  Query.QueryOptions<queryFnData, error, data, queryKey>,\n  'queryKey' | 'queryFn'\n> & { enabled: boolean }\n\nexport function filterQueryOptions<type extends Record<string, unknown>>(\n  options: type,\n): type {\n  // biome-ignore format: no formatting\n  const {\n    // import('@tanstack/query-core').QueryOptions\n    // biome-ignore lint/correctness/noUnusedVariables: tossing\n    _defaulted, behavior, gcTime, initialData, initialDataUpdatedAt, maxPages, meta, networkMode, queryFn, queryHash, queryKey, queryKeyHashFn, retry, retryDelay, structuralSharing,\n\n    // import('@tanstack/query-core').InfiniteQueryObserverOptions\n    // biome-ignore lint/correctness/noUnusedVariables: tossing\n    getPreviousPageParam, getNextPageParam, initialPageParam,\n\n    // import('@tanstack/react-query').UseQueryOptions\n    // biome-ignore lint/correctness/noUnusedVariables: tossing\n    _optimisticResults, enabled, notifyOnChangeProps, placeholderData, refetchInterval, refetchIntervalInBackground, refetchOnMount, refetchOnReconnect, refetchOnWindowFocus, retryOnMount, select, staleTime, suspense, throwOnError,\n\n    // wagmi\n    // biome-ignore lint/correctness/noUnusedVariables: tossing\n    config, connector, query,\n    ...rest\n  } = options\n\n  return rest as type\n}\n"
  },
  {
    "path": "packages/core/src/transports/connector.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { optimism } from 'viem/chains'\nimport { expect, test } from 'vitest'\nimport { createStore } from 'zustand'\n\nimport { injected } from '../connectors/injected.js'\nimport { mock } from '../connectors/mock.js'\nimport { unstable_connector } from './connector.js'\n\nconst connector = config.connectors[0]!\n\ntest('setup', () => {\n  expect(unstable_connector(injected)({})).toMatchInlineSnapshot(`\n    {\n      \"config\": {\n        \"key\": \"connector\",\n        \"methods\": undefined,\n        \"name\": \"Connector\",\n        \"request\": [Function],\n        \"retryCount\": 3,\n        \"retryDelay\": 150,\n        \"timeout\": undefined,\n        \"type\": \"connector\",\n      },\n      \"request\": [Function],\n      \"value\": undefined,\n    }\n  `)\n})\n\ntest('behavior: connector type not found', async () => {\n  const transport = unstable_connector({ type: 'foo' })({})\n  await expect(() =>\n    transport.request({ method: 'eth_chainId' }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [ProviderDisconnectedError: The Provider is disconnected from all chains.\n\n    Details: Could not find connector of type \"foo\" in \\`connectors\\` passed to \\`createConfig\\`.\n    Version: viem@2.47.5]\n  `)\n})\n\ntest('behavior: provider is disconnected', async () => {\n  const transport = unstable_connector(mock)({\n    connectors: createStore(() => [\n      {\n        ...connector,\n        async getProvider() {\n          return undefined\n        },\n      },\n    ]),\n  })\n\n  await expect(() =>\n    transport.request({ method: 'eth_chainId' }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [ProviderDisconnectedError: The Provider is disconnected from all chains.\n\n    Details: Provider is disconnected.\n    Version: viem@2.47.5]\n  `)\n})\n\ntest('behavior: chainId mismatch', async () => {\n  const transport = unstable_connector(mock)({\n    chain: optimism,\n    connectors: createStore(() => [\n      {\n        ...connector,\n        async getProvider(options = {}) {\n          if (options.chainId === optimism.id) return connector.getProvider()\n          return undefined\n        },\n      },\n    ]),\n  })\n\n  await expect(() =>\n    transport.request({ method: 'eth_chainId' }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [ChainDisconnectedError: The Provider is not connected to the requested chain.\n\n    Details: The current chain of the connector (id: 1) does not match the target chain for the request (id: 10 – OP Mainnet).\n    Version: viem@2.47.5]\n  `)\n})\n\ntest('behavior: request', async () => {\n  const transport = unstable_connector(mock)({\n    connectors: createStore(() => [connector]),\n  })\n\n  await expect(\n    transport.request({ method: 'eth_chainId' }),\n  ).resolves.toThrowErrorMatchingInlineSnapshot(`\"0x1\"`)\n})\n"
  },
  {
    "path": "packages/core/src/transports/connector.ts",
    "content": "import {\n  ChainDisconnectedError,\n  createTransport,\n  type EIP1193Parameters,\n  type EIP1193Provider,\n  type EIP1193RequestFn,\n  hexToNumber,\n  ProviderDisconnectedError,\n  type TransportConfig,\n  type WalletRpcSchema,\n  withRetry,\n  withTimeout,\n} from 'viem'\n\nimport type { Connector, Transport } from '../createConfig.js'\n\nexport type ConnectorTransportConfig = {\n  /** The key of the transport. */\n  key?: TransportConfig['key'] | undefined\n  /** The name of the transport. */\n  name?: TransportConfig['name'] | undefined\n  /** The max number of times to retry. */\n  retryCount?: TransportConfig['retryCount'] | undefined\n  /** The base delay (in ms) between retries. */\n  retryDelay?: TransportConfig['retryDelay'] | undefined\n}\n\nexport type ConnectorTransport = Transport\n\nexport function unstable_connector(\n  connector: Pick<Connector, 'type'>,\n  config: ConnectorTransportConfig = {},\n): Transport<'connector'> {\n  const { type } = connector\n  const { key = 'connector', name = 'Connector', retryDelay } = config\n\n  return (parameters) => {\n    const { chain, connectors } = parameters\n    const retryCount = config.retryCount ?? parameters.retryCount\n\n    const request: EIP1193RequestFn = async ({ method, params }) => {\n      const connector = connectors?.getState().find((c) => c.type === type)\n      if (!connector)\n        throw new ProviderDisconnectedError(\n          new Error(\n            `Could not find connector of type \"${type}\" in \\`connectors\\` passed to \\`createConfig\\`.`,\n          ),\n        )\n\n      const provider = (await connector.getProvider({\n        chainId: chain?.id,\n      })) as EIP1193Provider | undefined\n      if (!provider)\n        throw new ProviderDisconnectedError(\n          new Error('Provider is disconnected.'),\n        )\n\n      // We are applying a retry & timeout strategy here as some injected wallets (e.g. MetaMask) fail to\n      // immediately resolve a JSON-RPC request on page load.\n      const chainId = hexToNumber(\n        await withRetry(() =>\n          withTimeout(() => provider.request({ method: 'eth_chainId' }), {\n            timeout: 100,\n          }),\n        ),\n      )\n      if (chain && chainId !== chain.id)\n        throw new ChainDisconnectedError(\n          new Error(\n            `The current chain of the connector (id: ${chainId}) does not match the target chain for the request (id: ${chain.id} – ${chain.name}).`,\n          ),\n        )\n\n      const body = { method, params } as EIP1193Parameters<WalletRpcSchema>\n      return provider.request(body)\n    }\n\n    return createTransport({\n      key,\n      name,\n      request,\n      retryCount,\n      retryDelay,\n      type: 'connector',\n    })\n  }\n}\n"
  },
  {
    "path": "packages/core/src/transports/fallback.test.ts",
    "content": "import { http } from 'viem'\nimport { expect, test } from 'vitest'\nimport { unstable_connector } from './connector.js'\nimport { fallback } from './fallback.js'\n\ntest('setup', () => {\n  expect(\n    fallback([\n      unstable_connector({ type: 'injected' }),\n      http('https://example.com'),\n    ])({}),\n  ).toMatchInlineSnapshot(`\n    {\n      \"config\": {\n        \"key\": \"fallback\",\n        \"methods\": undefined,\n        \"name\": \"Fallback\",\n        \"request\": [Function],\n        \"retryCount\": 3,\n        \"retryDelay\": 150,\n        \"timeout\": undefined,\n        \"type\": \"fallback\",\n      },\n      \"request\": [Function],\n      \"value\": {\n        \"onResponse\": [Function],\n        \"transports\": [\n          {\n            \"config\": {\n              \"key\": \"connector\",\n              \"methods\": undefined,\n              \"name\": \"Connector\",\n              \"request\": [Function],\n              \"retryCount\": 0,\n              \"retryDelay\": 150,\n              \"timeout\": undefined,\n              \"type\": \"connector\",\n            },\n            \"request\": [Function],\n            \"value\": undefined,\n          },\n          {\n            \"config\": {\n              \"key\": \"http\",\n              \"methods\": undefined,\n              \"name\": \"HTTP JSON-RPC\",\n              \"request\": [Function],\n              \"retryCount\": 0,\n              \"retryDelay\": 150,\n              \"timeout\": 10000,\n              \"type\": \"http\",\n            },\n            \"request\": [Function],\n            \"value\": {\n              \"fetchOptions\": undefined,\n              \"url\": \"https://example.com\",\n            },\n          },\n        ],\n      },\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/transports/fallback.ts",
    "content": "import { fallback as viem_fallback } from 'viem'\n\nimport type { Transport } from '../createConfig.js'\n\nexport function fallback(\n  transports: Transport[],\n  config?: Parameters<typeof viem_fallback>[1],\n) {\n  return viem_fallback(transports, config)\n}\n"
  },
  {
    "path": "packages/core/src/types/chain.test-d.ts",
    "content": "import type { Chain, mainnet, optimism, sepolia } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport type { Config } from '../createConfig.js'\nimport type { SelectChains } from './chain.js'\nimport type { Merge } from './utils.js'\n\ntest('not narrowable', () => {\n  type Result = SelectChains<Config, number>\n  expectTypeOf<Result>().toEqualTypeOf<readonly [Chain]>()\n})\n\ntest('chainId', () => {\n  type Result = SelectChains<\n    Config<readonly [typeof mainnet, typeof optimism]>,\n    1\n  >\n  expectTypeOf<Result>().toEqualTypeOf<readonly [typeof mainnet]>()\n})\n\ntest('at least one chain has formatters', () => {\n  type Result = SelectChains<Config<readonly [typeof mainnet, typeof optimism]>>\n  expectTypeOf<Result>().toEqualTypeOf<\n    readonly [typeof mainnet, typeof optimism]\n  >()\n})\n\ntest('no formatters', () => {\n  type Result = SelectChains<Config<readonly [typeof mainnet, typeof sepolia]>>\n  expectTypeOf<Result>().toEqualTypeOf<\n    readonly [Merge<Chain, { id: typeof mainnet.id | typeof sepolia.id }>]\n  >()\n})\n"
  },
  {
    "path": "packages/core/src/types/chain.ts",
    "content": "import type { Chain, ChainFormatters } from 'viem'\n\nimport type { Config } from '../createConfig.js'\nimport type { IsNarrowable, Merge } from './utils.js'\n\n/** Filters {@link Config} chains by {@link chainId} or simplifies if no `ChainFormatters` are present. */\nexport type SelectChains<\n  config extends Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n> = Config extends config\n  ? readonly [Chain] // chains not inferrable, return default\n  : IsNarrowable<chainId, config['chains'][number]['id']> extends true\n    ? readonly [Extract<config['chains'][number], { id: chainId }>] // select specific chain\n    : HasFormatter<config['chains']> extends true\n      ? config['chains'] // return all chains since one has formatter\n      : // return default chain with ID set to union (allows for more simple type since the only thing that is different is the chain ID for each chain)\n        readonly [Merge<Chain, { id: config['chains'][number]['id'] }>]\n\ntype HasFormatter<chains extends readonly Chain[]> = chains extends readonly [\n  infer head extends Chain,\n  ...infer tail extends readonly Chain[],\n]\n  ? IsNarrowable<head['formatters'], ChainFormatters | undefined> extends true\n    ? true\n    : HasFormatter<tail>\n  : false\n"
  },
  {
    "path": "packages/core/src/types/properties.ts",
    "content": "import type { Config, Connector } from '../createConfig.js'\n\nexport type ChainIdParameter<\n  config extends Config,\n  chainId extends\n    | config['chains'][number]['id']\n    | undefined = config['chains'][number]['id'],\n> = {\n  chainId?:\n    | (chainId extends config['chains'][number]['id'] ? chainId : undefined)\n    | config['chains'][number]['id']\n    | undefined\n}\n\nexport type ConfigParameter<config extends Config = Config> = {\n  config?: Config | config | undefined\n}\n\nexport type ConnectorParameter = {\n  connector?: Connector | undefined\n}\n\nexport type EnabledParameter = {\n  enabled?: boolean | undefined\n}\n\nexport type ScopeKeyParameter = { scopeKey?: string | undefined }\n\nexport type SyncConnectedChainParameter = {\n  syncConnectedChain?: boolean | undefined\n}\n"
  },
  {
    "path": "packages/core/src/types/query.ts",
    "content": "import type * as Query from '@tanstack/query-core'\nimport type { Compute, LooseOmit, RequiredBy, UnionLooseOmit } from './utils.js'\n\nexport type MutationParameter<\n  data = unknown,\n  error = Error,\n  variables = void,\n  context = unknown,\n> = {\n  mutation?:\n    | LooseOmit<\n        Query.MutationOptions<data, error, Compute<variables>, context>,\n        'mutationFn' | 'mutationKey' | 'throwOnError'\n      >\n    | undefined\n}\n\nexport type QueryParameter<\n  queryFnData = unknown,\n  error = Query.DefaultError,\n  data = queryFnData,\n  queryKey extends Query.QueryKey = Query.QueryKey,\n> = {\n  query?:\n    | UnionLooseOmit<\n        QueryOptions<queryFnData, error, data, queryKey>,\n        'queryKey' | 'queryFn'\n      >\n    | undefined\n}\n\nexport type QueryOptions<\n  queryFnData = unknown,\n  error = Query.DefaultError,\n  data = queryFnData,\n  queryKey extends Query.QueryKey = Query.QueryKey,\n> = Omit<\n  RequiredBy<\n    Query.QueryObserverOptions<queryFnData, error, data, queryFnData, queryKey>,\n    'queryKey'\n  >,\n  'queryFn' | 'queryHash' | 'queryKeyHashFn' | 'throwOnError'\n> & {\n  queryFn: Exclude<\n    Query.QueryObserverOptions<\n      queryFnData,\n      error,\n      data,\n      queryFnData,\n      queryKey\n    >['queryFn'],\n    typeof Query.skipToken | undefined\n  >\n}\n"
  },
  {
    "path": "packages/core/src/types/register.ts",
    "content": "import type { Config } from '../createConfig.js'\n\n// biome-ignore lint/suspicious/noEmptyInterface: using\nexport interface Register {}\nexport type ResolvedRegister = {\n  config: Register extends { config: infer config extends Config }\n    ? config\n    : Config\n}\n"
  },
  {
    "path": "packages/core/src/types/utils.test-d.ts",
    "content": "import { assertType, expectTypeOf, test } from 'vitest'\n\nimport type {\n  Compute,\n  ExactPartial,\n  IsNever,\n  Mutable,\n  OneOf,\n  PartialBy,\n} from './utils.js'\n\ntest('ExactPartial', () => {\n  expectTypeOf<ExactPartial<{ foo: boolean; bar: boolean }>>().toEqualTypeOf<{\n    foo?: boolean | undefined\n    bar?: boolean | undefined\n  }>()\n})\n\ntest('IsNever', () => {\n  expectTypeOf<IsNever<never>>().toEqualTypeOf<true>()\n})\n\ntest('Mutable', () => {\n  expectTypeOf<\n    Mutable<{ foo: boolean; readonly bar: boolean }>\n  >().toEqualTypeOf<{ foo: boolean; bar: boolean }>()\n})\n\ntest('OneOf', () => {\n  assertType<OneOf<{ foo: boolean } | { bar: boolean }>>({ foo: false })\n  assertType<OneOf<{ foo: boolean } | { bar: boolean }>>({ bar: false })\n})\n\ntest('PartialBy', () => {\n  type Result = Compute<PartialBy<{ foo: string; bar: number }, 'foo'>>\n  expectTypeOf<Result>().toEqualTypeOf<{\n    foo?: string | undefined\n    bar: number\n  }>()\n})\n"
  },
  {
    "path": "packages/core/src/types/utils.ts",
    "content": "/** Combines members of an intersection into a readable type. */\n// https://twitter.com/mattpocockuk/status/1622730173446557697?s=20&t=NdpAcmEFXY01xkqU3KO0Mg\nexport type Compute<type> = { [key in keyof type]: type[key] } & unknown\n\n/**\n * Makes all properties of an object optional.\n *\n * Compatible with [`exactOptionalPropertyTypes`](https://www.typescriptlang.org/tsconfig#exactOptionalPropertyTypes).\n */\nexport type ExactPartial<type> = {\n  [key in keyof type]?: type[key] | undefined\n}\n\n/**\n * Creates a fixed array of `count` elements of type `type`.\n *\n * @example\n * ```ts\n * type Result = FixedArray<string, 3>\n * //   ^? type Result = readonly [string, string, string]\n * ```\n */\nexport type FixedArray<\n  type,\n  count extends number,\n  result extends readonly type[] = [],\n> = result['length'] extends count\n  ? result\n  : FixedArray<type, count, readonly [...result, type]>\n\n/** Checks if {@link type} can be narrowed further than {@link type2} */\nexport type IsNarrowable<type, type2> = IsUnknown<type> extends true\n  ? false\n  : undefined extends type\n    ? false\n    : IsNever<\n          (type extends type2 ? true : false) &\n            (type2 extends type ? false : true)\n        > extends true\n      ? false\n      : true\n\n/**\n * @internal\n * Checks if {@link type} is `never`\n */\nexport type IsNever<type> = [type] extends [never] ? true : false\n\n/**\n * @internal\n * Checks if {@link type} is `unknown`\n */\nexport type IsUnknown<type> = unknown extends type ? true : false\n\n/** Merges two object types into new type  */\nexport type Merge<obj1, obj2> = Compute<\n  LooseOmit<obj1, keyof obj2 extends infer key extends string ? key : never> &\n    obj2\n>\n\n/** Removes `readonly` from all properties of an object. */\nexport type Mutable<type extends object> = {\n  -readonly [key in keyof type]: type[key]\n}\n\n/** Strict version of built-in Omit type */\nexport type StrictOmit<type, keys extends keyof type> = Pick<\n  type,\n  Exclude<keyof type, keys>\n>\n\n/** Makes objects destructurable. */\nexport type OneOf<\n  union extends object,\n  ///\n  keys extends KeyofUnion<union> = KeyofUnion<union>,\n> = union extends infer Item\n  ? Compute<Item & { [K in Exclude<keys, keyof Item>]?: undefined }>\n  : never\ntype KeyofUnion<type> = type extends type ? keyof type : never\n\n/** Makes {@link key} optional in {@link type} while preserving type inference. */\n// s/o trpc (https://github.com/trpc/trpc/blob/main/packages/server/src/types.ts#L6)\nexport type PartialBy<type, key extends keyof type> = ExactPartial<\n  Pick<type, key>\n> &\n  StrictOmit<type, key>\n\n/* Removes `undefined` from object property */\nexport type RemoveUndefined<type> = {\n  [key in keyof type]: NonNullable<type[key]>\n}\n\n/**\n * Creates a type that is {@link type} with the required keys {@link key}.\n *\n * @example\n * ```ts\n * RequiredBy<{ a?: string, b: number }, 'a'>\n * // { a: string, b: number }\n * ```\n *\n * @internal\n */\nexport type RequiredBy<type, key extends keyof type> = Omit<type, key> &\n  ExactRequired<Pick<type, key>>\n\n/** @internal */\nexport type ExactRequired<type> = {\n  [key in keyof type]-?: Exclude<type[key], undefined>\n}\n\n///////////////////////////////////////////////////////////////////////////\n// Loose types\n\n/** Loose version of {@link StrictOmit} */\nexport type LooseOmit<type, keys extends string> = Pick<\n  type,\n  Exclude<keyof type, keys>\n>\n\n///////////////////////////////////////////////////////////////////////////\n// Union types\n\nexport type UnionCompute<type> = type extends object ? Compute<type> : type\n\nexport type UnionLooseOmit<type, keys extends string> = type extends any\n  ? LooseOmit<type, keys>\n  : never\n\nexport type UnionStrictOmit<type, keys extends keyof type> = type extends any\n  ? StrictOmit<type, keys>\n  : never\n\nexport type UnionExactPartial<type> = type extends object\n  ? ExactPartial<type>\n  : type\n"
  },
  {
    "path": "packages/core/src/utils/cookie.test.ts",
    "content": "import { http } from 'viem'\nimport { mainnet } from 'viem/chains'\nimport { expect, test } from 'vitest'\n\nimport { createConfig } from '../createConfig.js'\nimport { createStorage } from '../createStorage.js'\nimport { cookieStorage, cookieToInitialState, parseCookie } from './cookie.js'\n\ntest('cookieStorage', () => {\n  expect(cookieStorage.getItem('recentConnectorId')).toMatchInlineSnapshot(\n    'null',\n  )\n  cookieStorage.setItem('recentConnectorId', 'foo')\n  expect(cookieStorage.getItem('recentConnectorId')).toMatchInlineSnapshot(\n    `\"foo\"`,\n  )\n  cookieStorage.removeItem('recentConnectorId')\n  expect(cookieStorage.getItem('recentConnectorId')).toMatchInlineSnapshot(\n    'null',\n  )\n})\n\ntest('cookieToInitialState', () => {\n  const config = createConfig({\n    chains: [mainnet],\n    transports: { [mainnet.id]: http() },\n    storage: createStorage({ storage: cookieStorage }),\n  })\n\n  expect(\n    cookieToInitialState(\n      config,\n      'wagmi.store={\"state\":{\"connections\":{\"__type\":\"Map\",\"value\":[]},\"chainId\":1,\"current\":null},\"version\":2}; ',\n    ),\n  ).toMatchInlineSnapshot(`\n    {\n      \"chainId\": 1,\n      \"connections\": Map {},\n      \"current\": null,\n    }\n  `)\n\n  expect(cookieToInitialState(config)).toMatchInlineSnapshot('undefined')\n  expect(cookieToInitialState(config), 'foo').toMatchInlineSnapshot('undefined')\n})\n\ntest('parseCookie', () => {\n  expect(\n    parseCookie(\n      'wagmi.store={\"state\":{\"connections\":{\"__type\":\"Map\",\"value\":[]},\"chainId\":1,\"current\":null},\"version\":2}; ',\n      'wagmi.store',\n    ),\n  ).toMatchInlineSnapshot(\n    `\"{\"state\":{\"connections\":{\"__type\":\"Map\",\"value\":[]},\"chainId\":1,\"current\":null},\"version\":2}\"`,\n  )\n\n  expect(\n    parseCookie(\n      'foo=\"bar\"; wagmi.store={\"state\":{\"connections\":{\"__type\":\"Map\",\"value\":[]},\"chainId\":1,\"current\":null},\"version\":2}; ',\n      'wagmi.store',\n    ),\n  ).toMatchInlineSnapshot(\n    `\"{\"state\":{\"connections\":{\"__type\":\"Map\",\"value\":[]},\"chainId\":1,\"current\":null},\"version\":2}\"`,\n  )\n\n  expect(parseCookie('foo=\"bar\"; ', 'wagmi.store')).toMatchInlineSnapshot(\n    'undefined',\n  )\n})\n"
  },
  {
    "path": "packages/core/src/utils/cookie.ts",
    "content": "import type { Config, State } from '../createConfig.js'\nimport type { BaseStorage } from '../createStorage.js'\nimport { deserialize } from './deserialize.js'\n\nexport const cookieStorage = {\n  getItem(key) {\n    if (typeof window === 'undefined') return null\n    const value = parseCookie(document.cookie, key)\n    return value ?? null\n  },\n  setItem(key, value) {\n    if (typeof window === 'undefined') return\n    // biome-ignore lint/suspicious/noDocumentCookie: using\n    document.cookie = `${key}=${value};path=/;samesite=Lax`\n  },\n  removeItem(key) {\n    if (typeof window === 'undefined') return\n    // biome-ignore lint/suspicious/noDocumentCookie: using\n    document.cookie = `${key}=;max-age=-1;path=/`\n  },\n} satisfies BaseStorage\n\nexport function cookieToInitialState(config: Config, cookie?: string | null) {\n  if (!cookie) return undefined\n  const key = `${config.storage?.key}.store`\n  const parsed = parseCookie(cookie, key)\n  if (!parsed) return undefined\n  return deserialize<{ state: State }>(parsed).state\n}\n\nexport function parseCookie(cookie: string, key: string) {\n  const keyValue = cookie.split('; ').find((x) => x.startsWith(`${key}=`))\n  if (!keyValue) return undefined\n  return keyValue.substring(key.length + 1)\n}\n"
  },
  {
    "path": "packages/core/src/utils/deepEqual.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport { deepEqual } from './deepEqual.js'\n\ntest('compares primitive values', () => {\n  expect(deepEqual(true, true)).toBe(true)\n  expect(deepEqual(true, false)).toBe(false)\n\n  expect(deepEqual(1, 1)).toBe(true)\n  expect(deepEqual(1, 2)).toBe(false)\n\n  expect(deepEqual('zustand', 'zustand')).toBe(true)\n  expect(deepEqual('zustand', 'redux')).toBe(false)\n})\n\ntest('compares objects', () => {\n  expect(deepEqual({ foo: 'bar', asd: 123 }, { foo: 'bar', asd: 123 })).toBe(\n    true,\n  )\n\n  expect(\n    deepEqual({ foo: 'bar', asd: 123 }, { foo: 'bar', foobar: true }),\n  ).toBe(false)\n\n  expect(\n    deepEqual({ foo: 'bar', asd: 123 }, { foo: 'bar', asd: 123, foobar: true }),\n  ).toBe(false)\n})\n\ntest('compares arrays', () => {\n  expect(deepEqual([1, 2, 3], [1, 2, 3])).toBe(true)\n\n  expect(deepEqual([1, 2, 3], [2, 3, 4])).toBe(false)\n\n  expect(\n    deepEqual([{ foo: 'bar' }, { asd: 123 }], [{ foo: 'bar' }, { asd: 123 }]),\n  ).toBe(true)\n\n  expect(deepEqual([{ foo: 'bar' }], [{ foo: 'bar', asd: 123 }])).toBe(false)\n})\n"
  },
  {
    "path": "packages/core/src/utils/deepEqual.ts",
    "content": "/** Forked from https://github.com/epoberezkin/fast-deep-equal */\n\nexport function deepEqual(a: any, b: any) {\n  if (a === b) return true\n\n  if (a && b && typeof a === 'object' && typeof b === 'object') {\n    if (a.constructor !== b.constructor) return false\n\n    let length: number\n    let i: number\n\n    if (Array.isArray(a) && Array.isArray(b)) {\n      length = a.length\n      if (length !== b.length) return false\n      for (i = length; i-- !== 0; ) if (!deepEqual(a[i], b[i])) return false\n      return true\n    }\n\n    if (\n      typeof a.valueOf === 'function' &&\n      a.valueOf !== Object.prototype.valueOf\n    )\n      return a.valueOf() === b.valueOf()\n    if (\n      typeof a.toString === 'function' &&\n      a.toString !== Object.prototype.toString\n    )\n      return a.toString() === b.toString()\n\n    const keys = Object.keys(a)\n    length = keys.length\n    if (length !== Object.keys(b).length) return false\n\n    for (i = length; i-- !== 0; ) if (!Object.hasOwn(b, keys[i]!)) return false\n\n    for (i = length; i-- !== 0; ) {\n      const key = keys[i]\n\n      if (key && !deepEqual(a[key], b[key])) return false\n    }\n\n    return true\n  }\n\n  // true if both NaN, false otherwise\n  // biome-ignore lint/suspicious/noSelfCompare: using\n  return a !== a && b !== b\n}\n"
  },
  {
    "path": "packages/core/src/utils/deserialize.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport { deserialize } from './deserialize.js'\nimport { serialize } from './serialize.js'\n\ntest('deserializes', () => {\n  const deserializedCache = deserialize(\n    serialize({\n      some: 'complex',\n      object: {\n        that: 'has',\n        many: [\n          { many: 'many', manymany: 'many' },\n          { many: 'many' },\n          { many: 'many' },\n          {\n            many: {\n              properties: {\n                ones: {\n                  that: {\n                    have: {\n                      functions: () => null,\n                    },\n                  },\n                },\n              },\n            },\n          },\n        ],\n      },\n      and: {\n        ones: {\n          that: {\n            have: {\n              bigints: 123456789012345678901234567890n,\n            },\n          },\n        },\n      },\n      also: {\n        ones: {\n          that: {\n            have: {\n              proxies: new Proxy({ lol: 'nice' }, {}),\n            },\n          },\n        },\n      },\n    }),\n  )\n  expect(deserializedCache).toMatchInlineSnapshot(`\n      {\n        \"also\": {\n          \"ones\": {\n            \"that\": {\n              \"have\": {\n                \"proxies\": {\n                  \"lol\": \"nice\",\n                },\n              },\n            },\n          },\n        },\n        \"and\": {\n          \"ones\": {\n            \"that\": {\n              \"have\": {\n                \"bigints\": 123456789012345678901234567890n,\n              },\n            },\n          },\n        },\n        \"object\": {\n          \"many\": [\n            {\n              \"many\": \"many\",\n              \"manymany\": \"many\",\n            },\n            {\n              \"many\": \"many\",\n            },\n            {\n              \"many\": \"many\",\n            },\n            {\n              \"many\": {\n                \"properties\": {\n                  \"ones\": {\n                    \"that\": {\n                      \"have\": {},\n                    },\n                  },\n                },\n              },\n            },\n          ],\n          \"that\": \"has\",\n        },\n        \"some\": \"complex\",\n      }\n    `)\n})\n\ntest('Map', () => {\n  const map = new Map().set('foo', { bar: 'baz' })\n  const deserializedCache = deserialize(serialize({ map }))\n  expect(deserializedCache).toEqual({ map })\n})\n\ntest('bigint', () => {\n  const bigint = 123n\n  const deserializedCache = deserialize(serialize({ bigint }))\n  expect(deserializedCache).toEqual({ bigint })\n})\n"
  },
  {
    "path": "packages/core/src/utils/deserialize.ts",
    "content": "type Reviver = (key: string, value: any) => any\n\nexport function deserialize<type>(value: string, reviver?: Reviver): type {\n  return JSON.parse(value, (key, value_) => {\n    let value = value_\n    if (value?.__type === 'bigint') value = BigInt(value.value)\n    if (value?.__type === 'Map') value = new Map(value.value)\n    return reviver?.(key, value) ?? value\n  })\n}\n"
  },
  {
    "path": "packages/core/src/utils/extractRpcUrls.test.ts",
    "content": "import { http } from 'viem'\nimport { mainnet, optimism, sepolia } from 'viem/chains'\nimport { expect, test } from 'vitest'\n\nimport { injected } from '../connectors/injected.js'\nimport { unstable_connector } from '../transports/connector.js'\nimport { fallback } from '../transports/fallback.js'\nimport { extractRpcUrls } from './extractRpcUrls.js'\n\ntest('default', () => {\n  expect(\n    extractRpcUrls({\n      chain: mainnet,\n      transports: {\n        [mainnet.id]: fallback([\n          http('https://wagmi.com'),\n          http('https://lol.com'),\n        ]),\n        [sepolia.id]: http('https://sepoliarocks.com'),\n        [optimism.id]: http(),\n      },\n    }),\n  ).toMatchInlineSnapshot(`\n    [\n      \"https://wagmi.com\",\n      \"https://lol.com\",\n    ]\n  `)\n\n  expect(\n    extractRpcUrls({\n      chain: sepolia,\n      transports: {\n        [mainnet.id]: fallback([\n          http('https://wagmi.com'),\n          http('https://lol.com'),\n        ]),\n        [sepolia.id]: http('https://sepoliarocks.com'),\n        [optimism.id]: http(),\n      },\n    }),\n  ).toMatchInlineSnapshot(`\n    [\n      \"https://sepoliarocks.com\",\n    ]\n  `)\n\n  expect(\n    extractRpcUrls({\n      chain: optimism,\n      transports: {\n        [mainnet.id]: fallback([\n          http('https://wagmi.com'),\n          http('https://lol.com'),\n        ]),\n        [sepolia.id]: http('https://sepoliarocks.com'),\n        [optimism.id]: http(),\n      },\n    }),\n  ).toMatchInlineSnapshot(`\n    [\n      \"https://mainnet.optimism.io\",\n    ]\n  `)\n\n  expect(\n    extractRpcUrls({\n      chain: mainnet,\n    }),\n  ).toMatchInlineSnapshot(`\n    [\n      \"https://eth.merkle.io\",\n    ]\n  `)\n\n  expect(\n    extractRpcUrls({\n      chain: mainnet,\n      transports: {\n        [mainnet.id]: fallback([\n          unstable_connector(injected),\n          http('https://lol.com'),\n        ]),\n      },\n    }),\n  ).toMatchInlineSnapshot(`\n    [\n      \"https://eth.merkle.io\",\n      \"https://lol.com\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/core/src/utils/extractRpcUrls.ts",
    "content": "import type { Chain, Transport } from 'viem'\n\ntype ExtractRpcUrlsParameters = {\n  transports?: Record<string, Transport> | undefined\n  chain: Chain\n}\n\nexport function extractRpcUrls(parameters: ExtractRpcUrlsParameters) {\n  const { chain } = parameters\n  const fallbackUrl = chain.rpcUrls.default.http[0]\n\n  if (!parameters.transports) return [fallbackUrl]\n\n  const transport = parameters.transports?.[chain.id]?.({ chain })\n  const transports = (transport?.value?.transports as NonNullable<\n    typeof transport\n  >[]) || [transport]\n  return transports.map(({ value }) => value?.url || fallbackUrl)\n}\n"
  },
  {
    "path": "packages/core/src/utils/getAction.test.ts",
    "content": "import { abi, address, config } from '@wagmi/test'\nimport * as viem_actions from 'viem/actions'\nimport { expect, test, vi } from 'vitest'\n\nimport { getAction } from './getAction.js'\n\ntest('uses tree-shakable action', async () => {\n  const client = config.getClient({ chainId: 1 })\n\n  const name = 'getBlockNumber'\n  const actions = { ...viem_actions }\n  const spy = vi.spyOn(actions, name)\n  const action = getAction(client, actions[name], name)\n\n  await action({})\n  expect(spy).toBeCalledWith(client, {})\n})\n\ntest('uses client action', async () => {\n  const client = config\n    .getClient({ chainId: 1 })\n    .extend(() => ({ getBlockNumber: async () => 69n }))\n\n  const name = 'getBlockNumber'\n  const spy = vi.spyOn(client, name)\n  const action = getAction(client, client[name], name)\n\n  await action({})\n  expect(spy).toBeCalledWith({})\n})\n\ntest('internal call', async () => {\n  const client = config.getClient({ chainId: 1 }).extend(() => ({\n    async call() {\n      return {\n        data: '0x0000000000000000000000000000000000000000000000000000000000000045',\n      }\n    },\n  }))\n\n  await expect(\n    viem_actions.readContract(client, {\n      address: address.wagmiMintExample,\n      abi: abi.erc20,\n      functionName: 'balanceOf',\n      args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n    }),\n  ).resolves.toEqual(69n)\n})\n"
  },
  {
    "path": "packages/core/src/utils/getAction.ts",
    "content": "import type {\n  Account,\n  Chain,\n  Client,\n  PublicActions,\n  RpcSchema,\n  Transport,\n  WalletActions,\n} from 'viem'\n\n/**\n * Retrieves and returns an action from the client (if exists), and falls\n * back to the tree-shakable action.\n *\n * Useful for extracting overridden actions from a client (ie. if a consumer\n * wants to override the `sendTransaction` implementation).\n */\nexport function getAction<\n  transport extends Transport,\n  chain extends Chain | undefined,\n  account extends Account | undefined,\n  rpcSchema extends RpcSchema | undefined,\n  extended extends { [key: string]: unknown },\n  client extends Client<transport, chain, account, rpcSchema, extended>,\n  parameters,\n  returnType,\n>(\n  client: client,\n  actionFn: (_: any, parameters: parameters) => returnType,\n  // Some minifiers drop `Function.prototype.name`, or replace it with short letters,\n  // meaning that `actionFn.name` will not always work. For that case, the consumer\n  // needs to pass the name explicitly.\n  name: keyof PublicActions | keyof WalletActions,\n): (parameters: parameters) => returnType {\n  const action_implicit = client[actionFn.name]\n  if (typeof action_implicit === 'function')\n    return action_implicit as (params: parameters) => returnType\n\n  const action_explicit = client[name]\n  if (typeof action_explicit === 'function')\n    return action_explicit as (params: parameters) => returnType\n\n  return (params) => actionFn(client, params)\n}\n"
  },
  {
    "path": "packages/core/src/utils/getVersion.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport { getVersion } from './getVersion.js'\n\ntest('default', () => {\n  expect(getVersion()).toMatchInlineSnapshot(`\"@wagmi/core@x.y.z\"`)\n})\n"
  },
  {
    "path": "packages/core/src/utils/getVersion.ts",
    "content": "import { version } from '../version.js'\n\nexport const getVersion = () => `@wagmi/core@${version}`\n"
  },
  {
    "path": "packages/core/src/utils/serialize.test.ts",
    "content": "import { describe, expect, it } from 'vitest'\n\nimport { serialize } from './serialize.js'\n\nclass Foo {\n  value: string\n\n  constructor(value: string) {\n    this.value = value\n  }\n}\n\nconst simpleObject = {\n  boolean: true,\n  fn() {\n    return 'foo'\n  },\n  nan: Number.NaN,\n  nil: null,\n  number: 123,\n  string: 'foo',\n  undef: undefined,\n  [Symbol('key')]: 'value',\n}\n\nconst bigintObject = Object.assign({}, simpleObject, {\n  bigint: 123n,\n  nested: {\n    bigint: {\n      value: 69n,\n    },\n  },\n})\n\nconst bufferString = 'this is a test buffer'\nconst complexObject = Object.assign({}, simpleObject, {\n  array: ['foo', { bar: 'baz' }],\n  buffer: Buffer.alloc(bufferString.length, bufferString),\n  error: new Error('boom'),\n  foo: new Foo('value'),\n  map: new Map().set('foo', { bar: 'baz' }),\n  object: { foo: { bar: 'baz' } },\n  promise: Promise.resolve('foo'),\n  regexp: /foo/,\n  set: new Set().add('foo').add({ bar: 'baz' }),\n  weakmap: new WeakMap([\n    [{}, 'foo'],\n    [{}, 'bar'],\n  ]),\n  weakset: new WeakSet([{}, {}]),\n})\n\nconst circularObject = Object.assign(\n  {},\n  complexObject,\n  {\n    map: { __type: 'Map', value: [['foo', { bar: 'baz' }]] },\n  },\n  {\n    deeply: {\n      nested: {\n        reference: {},\n      },\n    },\n  },\n)\n\ncircularObject.deeply.nested.reference = circularObject\n\ndescribe('stringify', () => {\n  describe('handling of object types', () => {\n    it('should handle simple objects', () => {\n      const result = serialize(simpleObject)\n\n      expect(result).toMatchInlineSnapshot(\n        `\"{\"boolean\":true,\"nan\":null,\"nil\":null,\"number\":123,\"string\":\"foo\"}\"`,\n      )\n    })\n\n    it('should handle objects with bigints', () => {\n      const result = serialize(bigintObject)\n\n      expect(result).toMatchInlineSnapshot(\n        `\"{\"boolean\":true,\"nan\":null,\"nil\":null,\"number\":123,\"string\":\"foo\",\"bigint\":{\"__type\":\"bigint\",\"value\":\"123\"},\"nested\":{\"bigint\":{\"value\":{\"__type\":\"bigint\",\"value\":\"69\"}}}}\"`,\n      )\n    })\n\n    it('should handle simple objects with a custom replacer', () => {\n      const replacer = (_key: string, value: any) =>\n        value && typeof value === 'object' ? value : `primitive-${value}`\n\n      const result = serialize(simpleObject, replacer)\n\n      expect(result).toMatchInlineSnapshot(\n        `\"{\"boolean\":\"primitive-true\",\"fn\":\"primitive-fn() {\\\\n    return \\\\\"foo\\\\\";\\\\n  }\",\"nan\":\"primitive-NaN\",\"nil\":\"primitive-null\",\"number\":\"primitive-123\",\"string\":\"primitive-foo\",\"undef\":\"primitive-undefined\"}\"`,\n      )\n    })\n\n    it('should handle simple objects with indentation', () => {\n      const result = serialize(simpleObject, null, 2)\n\n      expect(result).toMatchInlineSnapshot(`\n        \"{\n          \"boolean\": true,\n          \"nan\": null,\n          \"nil\": null,\n          \"number\": 123,\n          \"string\": \"foo\"\n        }\"\n      `)\n    })\n\n    it('should handle bigint objects with indentation', () => {\n      const result = serialize(bigintObject, null, 2)\n\n      expect(result).toMatchInlineSnapshot(`\n        \"{\n          \"boolean\": true,\n          \"nan\": null,\n          \"nil\": null,\n          \"number\": 123,\n          \"string\": \"foo\",\n          \"bigint\": {\n            \"__type\": \"bigint\",\n            \"value\": \"123\"\n          },\n          \"nested\": {\n            \"bigint\": {\n              \"value\": {\n                \"__type\": \"bigint\",\n                \"value\": \"69\"\n              }\n            }\n          }\n        }\"\n      `)\n    })\n\n    it('should handle complex objects', () => {\n      const result = serialize(complexObject)\n\n      expect(result).toMatchInlineSnapshot(\n        `\"{\"boolean\":true,\"nan\":null,\"nil\":null,\"number\":123,\"string\":\"foo\",\"array\":[\"foo\",{\"bar\":\"baz\"}],\"buffer\":{\"type\":\"Buffer\",\"data\":[116,104,105,115,32,105,115,32,97,32,116,101,115,116,32,98,117,102,102,101,114]},\"error\":{},\"foo\":{\"value\":\"value\"},\"map\":{\"__type\":\"Map\",\"value\":[[\"foo\",{\"bar\":\"baz\"}]]},\"object\":{\"foo\":{\"bar\":\"baz\"}},\"promise\":{},\"regexp\":{},\"set\":{},\"weakmap\":{},\"weakset\":{}}\"`,\n      )\n    })\n\n    it('should handle complex objects with a custom replacer', () => {\n      const replacer = (_key: string, value: any) =>\n        value && typeof value === 'object' ? value : `primitive-${value}`\n\n      const result = serialize(complexObject, replacer)\n\n      expect(result).toMatchInlineSnapshot(\n        `\"{\"boolean\":\"primitive-true\",\"fn\":\"primitive-fn() {\\\\n    return \\\\\"foo\\\\\";\\\\n  }\",\"nan\":\"primitive-NaN\",\"nil\":\"primitive-null\",\"number\":\"primitive-123\",\"string\":\"primitive-foo\",\"undef\":\"primitive-undefined\",\"array\":[\"primitive-foo\",{\"bar\":\"primitive-baz\"}],\"buffer\":{\"type\":\"primitive-Buffer\",\"data\":[\"primitive-116\",\"primitive-104\",\"primitive-105\",\"primitive-115\",\"primitive-32\",\"primitive-105\",\"primitive-115\",\"primitive-32\",\"primitive-97\",\"primitive-32\",\"primitive-116\",\"primitive-101\",\"primitive-115\",\"primitive-116\",\"primitive-32\",\"primitive-98\",\"primitive-117\",\"primitive-102\",\"primitive-102\",\"primitive-101\",\"primitive-114\"]},\"error\":{},\"foo\":{\"value\":\"primitive-value\"},\"map\":{\"__type\":\"primitive-Map\",\"value\":[[\"primitive-foo\",{\"bar\":\"primitive-baz\"}]]},\"object\":{\"foo\":{\"bar\":\"primitive-baz\"}},\"promise\":{},\"regexp\":{},\"set\":{},\"weakmap\":{},\"weakset\":{}}\"`,\n      )\n    })\n\n    it('should handle circular objects', () => {\n      const result = serialize(circularObject)\n\n      expect(result).toEqual(\n        JSON.stringify(\n          circularObject,\n          (() => {\n            const cache: any[] = []\n\n            return (_key, value) => {\n              if (value && typeof value === 'object' && ~cache.indexOf(value)) {\n                return '[ref=.]'\n              }\n\n              cache.push(value)\n\n              return value\n            }\n          })(),\n        ),\n      )\n    })\n\n    it('should handle circular objects with a custom circular replacer', () => {\n      const result = serialize(\n        circularObject,\n        null,\n        null,\n        (_key: string, _value: string, referenceKey: string) => referenceKey,\n      )\n      const circularReplacer = (() => {\n        const cache: any[] = []\n\n        return (_key: string, value: any) => {\n          if (value && typeof value === 'object' && ~cache.indexOf(value)) {\n            return '.'\n          }\n\n          cache.push(value)\n\n          return value\n        }\n      })()\n\n      expect(result).toEqual(JSON.stringify(circularObject, circularReplacer))\n    })\n  })\n\n  describe('key references', () => {\n    it('should point to the top level object when it is referenced', () => {\n      const object = {\n        foo: 'bar',\n        deeply: {\n          recursive: {\n            object: {},\n          },\n        },\n      }\n\n      object.deeply.recursive.object = object\n\n      expect(serialize(object)).toEqual(\n        `{\"foo\":\"bar\",\"deeply\":{\"recursive\":{\"object\":\"[ref=.]\"}}}`,\n      )\n    })\n\n    it('should point to the nested object when it is referenced', () => {\n      const object = {\n        foo: 'bar',\n        deeply: {\n          recursive: {\n            object: {},\n          },\n        },\n      }\n\n      object.deeply.recursive.object = object.deeply.recursive\n\n      expect(serialize(object)).toEqual(\n        `{\"foo\":\"bar\",\"deeply\":{\"recursive\":{\"object\":\"[ref=.deeply.recursive]\"}}}`,\n      )\n    })\n  })\n})\n"
  },
  {
    "path": "packages/core/src/utils/serialize.ts",
    "content": "/**\n * Get the reference key for the circular value\n *\n * @param keys the keys to build the reference key from\n * @param cutoff the maximum number of keys to include\n * @returns the reference key\n */\nfunction getReferenceKey(keys: string[], cutoff: number) {\n  return keys.slice(0, cutoff).join('.') || '.'\n}\n\n/**\n * Faster `Array.prototype.indexOf` implementation build for slicing / splicing\n *\n * @param array the array to match the value in\n * @param value the value to match\n * @returns the matching index, or -1\n */\nfunction getCutoff(array: any[], value: any) {\n  const { length } = array\n\n  for (let index = 0; index < length; ++index) {\n    if (array[index] === value) {\n      return index + 1\n    }\n  }\n\n  return 0\n}\n\ntype StandardReplacer = (key: string, value: any) => any\ntype CircularReplacer = (key: string, value: any, referenceKey: string) => any\n\n/**\n * Create a replacer method that handles circular values\n *\n * @param [replacer] a custom replacer to use for non-circular values\n * @param [circularReplacer] a custom replacer to use for circular methods\n * @returns the value to stringify\n */\nfunction createReplacer(\n  replacer?: StandardReplacer | null | undefined,\n  circularReplacer?: CircularReplacer | null | undefined,\n): StandardReplacer {\n  const hasReplacer = typeof replacer === 'function'\n  const hasCircularReplacer = typeof circularReplacer === 'function'\n\n  const cache: any[] = []\n  const keys: string[] = []\n\n  return function replace(this: any, key: string, value: any) {\n    if (typeof value === 'object') {\n      if (cache.length) {\n        const thisCutoff = getCutoff(cache, this)\n\n        if (thisCutoff === 0) {\n          cache[cache.length] = this\n        } else {\n          cache.splice(thisCutoff)\n          keys.splice(thisCutoff)\n        }\n\n        keys[keys.length] = key\n\n        const valueCutoff = getCutoff(cache, value)\n\n        if (valueCutoff !== 0) {\n          return hasCircularReplacer\n            ? circularReplacer.call(\n                this,\n                key,\n                value,\n                getReferenceKey(keys, valueCutoff),\n              )\n            : `[ref=${getReferenceKey(keys, valueCutoff)}]`\n        }\n      } else {\n        cache[0] = value\n        keys[0] = key\n      }\n    }\n\n    return hasReplacer ? replacer.call(this, key, value) : value\n  }\n}\n\n/**\n * Stringifier that handles circular values\n *\n * Forked from https://github.com/planttheidea/fast-stringify\n *\n * @param value to stringify\n * @param [replacer] a custom replacer function for handling standard values\n * @param [indent] the number of spaces to indent the output by\n * @param [circularReplacer] a custom replacer function for handling circular values\n * @returns the stringified output\n */\nexport function serialize(\n  value: any,\n  replacer?: StandardReplacer | null | undefined,\n  indent?: number | null | undefined,\n  circularReplacer?: CircularReplacer | null | undefined,\n) {\n  return JSON.stringify(\n    value,\n    createReplacer((key, value_) => {\n      let value = value_\n      if (typeof value === 'bigint')\n        value = { __type: 'bigint', value: value_.toString() }\n      if (value instanceof Map)\n        value = { __type: 'Map', value: Array.from(value_.entries()) }\n      return replacer?.(key, value) ?? value\n    }, circularReplacer),\n    indent ?? undefined,\n  )\n}\n"
  },
  {
    "path": "packages/core/src/utils/uid.ts",
    "content": "const size = 256\nlet index = size\nlet buffer: string\n\nexport function uid(length = 11) {\n  if (!buffer || index + length > size * 2) {\n    buffer = ''\n    index = 0\n    for (let i = 0; i < size; i++) {\n      buffer += ((256 + Math.random() * 256) | 0).toString(16).substring(1)\n    }\n  }\n  return buffer.substring(index, index++ + length)\n}\n"
  },
  {
    "path": "packages/core/src/version.ts",
    "content": "export const version = '3.4.0'\n"
  },
  {
    "path": "packages/core/test/setup.ts",
    "content": "import { vi } from 'vitest'\n\nvi.mock('../src/version.ts', () => {\n  return { version: 'x.y.z' }\n})\n"
  },
  {
    "path": "packages/core/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"include\": [\"src/**/*.ts\"],\n  \"exclude\": [\"src/**/*.bench-d.ts\", \"src/**/*.test.ts\", \"src/**/*.test-d.ts\"],\n  \"compilerOptions\": {\n    \"sourceMap\": true\n  }\n}\n"
  },
  {
    "path": "packages/core/tsconfig.json",
    "content": "{\n  \"extends\": \"./tsconfig.build.json\",\n  \"include\": [\"src/**/*.ts\", \"test/**/*.ts\"],\n  \"exclude\": [],\n  \"compilerOptions\": {\n    \"resolveJsonModule\": true\n  }\n}\n"
  },
  {
    "path": "packages/create-wagmi/CHANGELOG.md",
    "content": "# create-wagmi\n\n## 2.0.19\n\n### Patch Changes\n\n- Fixed Vite React template build by removing global Buffer patch ([#4900](https://github.com/wevm/wagmi/pull/4900))\n\n## 2.0.18\n\n### Patch Changes\n\n- Bumped next.js template dependencies ([`d717d86`](https://github.com/wevm/wagmi/commit/d717d86962a6335d9c23e7fe530f17bae16f4e10))\n\n## 2.0.17\n\n### Patch Changes\n\n- Bumped next.js template dependencies ([`99c7e2f`](https://github.com/wevm/wagmi/commit/99c7e2f096ef3fc277b3f517c0ddd983bd920880))\n\n## 2.0.16\n\n### Patch Changes\n\n- Bumped Wagmi version ([`0112d33`](https://github.com/wevm/wagmi/commit/0112d33a20340f37b3b19538f55e1f32cb24c5f1))\n\n## 2.0.15\n\n### Patch Changes\n\n- [#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\n\n## 2.0.14\n\n### Patch Changes\n\n- [#4450](https://github.com/wevm/wagmi/pull/4450) [`7b9a6bb35881b657a00bdd7ccd7edea32660f5bf`](https://github.com/wevm/wagmi/commit/7b9a6bb35881b657a00bdd7ccd7edea32660f5bf) Thanks [@tmm](https://github.com/tmm)! - Removed internal usage of `fs-extra`.\n\n## 2.0.13\n\n### Patch Changes\n\n- [#4060](https://github.com/wevm/wagmi/pull/4060) [`95965c1f19d480b97f2b297a077a9e607dee32ad`](https://github.com/wevm/wagmi/commit/95965c1f19d480b97f2b297a077a9e607dee32ad) Thanks [@dalechyn](https://github.com/dalechyn)! - Bumped Tanstack Query dependencies to fix typing issues between exported Wagmi query options and TanStack Query suspense query methods (due to [`direction` property in `QueryFunctionContext` being deprecated](https://github.com/TanStack/query/pull/7410)).\n\n## 2.0.12\n\n### Patch Changes\n\n- [`c00303d0c5909680b3124f92c0a2d2f31ea30405`](https://github.com/wevm/wagmi/commit/c00303d0c5909680b3124f92c0a2d2f31ea30405) Thanks [@tmm](https://github.com/tmm)! - Bumped Next.js version\n\n## 2.0.11\n\n### Patch Changes\n\n- [#3871](https://github.com/wevm/wagmi/pull/3871) [`0e6bd286`](https://github.com/wevm/wagmi/commit/0e6bd286ca2572d2bfbe206db460528b7c2ebc63) Thanks [@jxom](https://github.com/jxom)! - Added `.npmrc` with `legacy-peer-deps = true` to templates.\n\n## 2.0.10\n\n### Patch Changes\n\n- [`3f8203bd`](https://github.com/wevm/wagmi/commit/3f8203bd77fcf6b6756640b5971d09741ae3853d) Thanks [@tmm](https://github.com/tmm)! - Set Wagmi-related package versions to latest.\n\n## 2.0.9\n\n### Patch Changes\n\n- [#3518](https://github.com/wevm/wagmi/pull/3518) [`338e857d`](https://github.com/wevm/wagmi/commit/338e857d8cb2fe85e13d9207bef14cada1c1962d) Thanks [@tmm](https://github.com/tmm)! - Bumped dependencies.\n\n## 2.0.8\n\n### Patch Changes\n\n- [#3510](https://github.com/wevm/wagmi/pull/3510) [`660ff80d`](https://github.com/wevm/wagmi/commit/660ff80d5b046967a446eba43ee54b8359a37d0d) Thanks [@tmm](https://github.com/tmm)! - Fixed issue where connectors returning multiple addresses didn't checksum correctly.\n\n## 2.0.7\n\n### Patch Changes\n\n- [#3496](https://github.com/wevm/wagmi/pull/3496) [`ba7f8a75`](https://github.com/wevm/wagmi/commit/ba7f8a758efb07664c6e401b5e7e325e7c62341b) Thanks [@tmm](https://github.com/tmm)! - Bumped dependencies.\n\n## 2.0.6\n\n### Patch Changes\n\n- [#3427](https://github.com/wevm/wagmi/pull/3427) [`370f1b4a`](https://github.com/wevm/wagmi/commit/370f1b4a3f154d181acf381c31c2e7862e22c0e4) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Bumped dependencies.\n\n## 2.0.5\n\n### Patch Changes\n\n- [#3459](https://github.com/wevm/wagmi/pull/3459) [`d950b666`](https://github.com/wevm/wagmi/commit/d950b666b56700ca039ce16cdfdf34564991e7f5) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Bumped dependencies\n\n## 2.0.4\n\n### Patch Changes\n\n- [#3443](https://github.com/wevm/wagmi/pull/3443) [`007024a6`](https://github.com/wevm/wagmi/commit/007024a684ddbecf924cdc06dd6a8854fc3d5eeb) Thanks [@jmrossy](https://github.com/jmrossy)! - Bumped dependencies.\n\n- [#3447](https://github.com/wevm/wagmi/pull/3447) [`a02a26ad`](https://github.com/wevm/wagmi/commit/a02a26ad030d3afb78f744377d61b5c60b65d97a) Thanks [@tmm](https://github.com/tmm)! - Bumped dependencies.\n\n## 2.0.3\n\n### Patch Changes\n\n- [`ec0d8b41`](https://github.com/wevm/wagmi/commit/ec0d8b4112181fefb11025e436a94a6114761d37) Thanks [@tmm](https://github.com/tmm)! - Added note to `metaMask` connector.\n\n## 2.0.2\n\n### Patch Changes\n\n- [#3384](https://github.com/wevm/wagmi/pull/3384) [`ee868c33`](https://github.com/wevm/wagmi/commit/ee868c3385dae511230b6ddcb5627c1293cc1844) Thanks [@tmm](https://github.com/tmm)! - Fixed connectors not bubbling error when connecting with `chainId` and subsequent user rejection.\n\n## 2.0.1\n\n### Major Changes\n\n- [#3333](https://github.com/wevm/wagmi/pull/3333) [`b3a0baaa`](https://github.com/wevm/wagmi/commit/b3a0baaaee7decf750d376aab2502cd33ca4825a) Thanks [@tmm](https://github.com/tmm)! - Added support for Wagmi 2.0.\n\n## 1.0.5\n\n### Patch Changes\n\n- 6ba996f: Fixed optional WalletConnect Cloud Project ID prompt\n\n## 1.0.4\n\n### Patch Changes\n\n- eb8dd9d: Updated wagmi & viem. Added ConnectKit template back in.\n\n## 1.0.3\n\n### Patch Changes\n\n- 00d9080: Added RainbowKit & Web3Modal wagmi v1 templates\n\n## 1.0.2\n\n### Patch Changes\n\n- 3c65f77: Fixed Next.js default template title\n\n## 1.0.0\n\n### Major Changes\n\n- affc13e: Updated to wagmi v1.\n\n## 0.1.19\n\n### Patch Changes\n\n- 1282f0e: Updated templates to use WalletConnect v2 by default\n\n## 0.1.18\n\n### Patch Changes\n\n- 12dcfe0: Updated wagmi to 0.12 in ConnectKit templates.\n\n## 0.1.17\n\n### Patch Changes\n\n- 6eba01a: Updated wagmi to 0.12.\n- 3a0ab8c: Added .env to .gitignore in templates.\n\n## 0.1.16\n\n### Patch Changes\n\n- 7ad50f1: Upgraded `@wagmi/cli`\n\n## 0.1.15\n\n### Patch Changes\n\n- 6e30599: Added `test` config to `foundry.toml` on the Foundry templates.\n\n## 0.1.14\n\n### Patch Changes\n\n- 19f3675: Bumped `wagmi` to `~0.11.0`.\n\n## 0.1.13\n\n### Patch Changes\n\n- c1ab75c: Bump @wagmi/cli\n\n## 0.1.12\n\n### Patch Changes\n\n- af6e551: Added templates for `@wagmi/cli`:\n\n  - `@wagmi/cli (Mint NFT Example)`\n  - `@wagmi/cli + ERC20`\n  - `@wagmi/cli + Etherscan (Mint NFT Example)`\n  - `@wagmi/cli + Foundry (Counter.sol Example)`\n\n## 0.1.11\n\n### Patch Changes\n\n- cc638dd: Fixed an issue where Vite projects used `process.env` instead of `import.meta.env`.\n- 75d1c2d: Updated `wagmi` to `~0.10.0`.\n\n## 0.1.10\n\n### Patch Changes\n\n- 9cd7140: Amend gitignore files for Vite templates\n\n## 0.1.9\n\n### Patch Changes\n\n- 904a2e1: Fixed import env variables in Vite (React) templates\n\n## 0.1.8\n\n### Patch Changes\n\n- 65cc841: Update RainbowKit & ConnectKit templates to `wagmi@~0.9.0`\n\n## 0.1.7\n\n### Patch Changes\n\n- a59d9c5: Upgrade `default` & `web3modal` templates to `wagmi@0.9`\n\n## 0.1.6\n\n### Patch Changes\n\n- b544457: Updated `connectkit` to `1.1.0` in the ConnectKit templates\n\n## 0.1.5\n\n### Patch Changes\n\n- 6bd6c74: Updated repo link in package.json\n\n## 0.1.4\n\n### Patch Changes\n\n- c39666b: Added ability to select providers\n- 37708ed: **Added ability to select frameworks.**\n\n  Each directory in `templates/` now mirrors a \"framework\", where its child directories mirror a \"template\" for that framework.\n\n  Example:\n\n  ```\n  templates/\n    next/\n      connectkit/\n      default/\n      rainbowkit/\n      web3modal\n    vite-react/\n      connectkit/\n      default/\n      rainbowkit/\n      web3modal/\n  ```\n\n- 399d2b9: Moved template configuration to the template level + added hooks\n\n## 0.1.3\n\n### Patch Changes\n\n- 353332a: Added Web3Modal template\n- dd95b14: **next-with-connectkit**: Update `connectkit` to `^1.0.0`\n\n## 0.1.2\n\n### Patch Changes\n\n- 34f666b: Fixed issue where package manager install process would not log error\n\n## 0.1.1\n\n### Patch Changes\n\n- 900cbdc: Updated `@rainbow-me/rainbowkit` dependency in Next + RainbowKit template\n\n## 0.1.0\n\n### Minor Changes\n\n- 23993d2: ## 🎉 Initial release 🎉\n\n  Get up and running quickly with wagmi by using the `create-wagmi` CLI. This tool interactively scaffolds a new wagmi project for you so you can start building instantly without the hassle of setting up `git`, installing packages, worrying about TypeScript configuration, etc.\n\n  To get started, `create-wagmi` can be instantiated with one of your favorite package managers:\n\n  ```bash\n  npm init wagmi\n  # or\n  pnpm create wagmi\n  # or\n  yarn create wagmi\n  ```\n"
  },
  {
    "path": "packages/create-wagmi/README.md",
    "content": "# create-wagmi\n\nGet up and running quickly with [Wagmi](https://wagmi.sh) by using the `create-wagmi` CLI.\n\n## Installation\n\n```bash\nnpm create wagmi\n# or\npnpm create wagmi\n# or\nyarn create wagmi\n```\n\n## Documentation\n\nFor documentation and guides, visit [wagmi.sh](https://wagmi.sh/cli/create-wagmi).\n"
  },
  {
    "path": "packages/create-wagmi/package.json",
    "content": "{\n  \"name\": \"create-wagmi\",\n  \"description\": \"Create Wagmi apps with one command\",\n  \"version\": \"2.0.19\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/wevm/wagmi.git\",\n    \"directory\": \"packages/create-wagmi\"\n  },\n  \"scripts\": {\n    \"build\": \"pnpm run build:esm+types\",\n    \"build:esm+types\": \"tsc --project tsconfig.build.json --outDir ./dist/esm --declaration --declarationMap --declarationDir ./dist/types\",\n    \"check:types\": \"tsc --noEmit\",\n    \"clean\": \"rm -rf dist tsconfig.tsbuildinfo\",\n    \"dev\": \"bun src/cli.ts\",\n    \"test:build\": \"publint --strict\"\n  },\n  \"files\": [\n    \"dist/**\",\n    \"!dist/**/*.tsbuildinfo\",\n    \"src/**/*.ts\",\n    \"!src/**/*.test.ts\",\n    \"!src/**/*.test-d.ts\",\n    \"templates/**\"\n  ],\n  \"bin\": {\n    \"wagmi\": \"./dist/esm/cli.js\"\n  },\n  \"sideEffects\": false,\n  \"type\": \"module\",\n  \"exports\": {\n    \"./package.json\": \"./package.json\"\n  },\n  \"dependencies\": {\n    \"cac\": \"^6.7.14\",\n    \"cross-spawn\": \"^7.0.3\",\n    \"picocolors\": \"^1.0.0\",\n    \"prompts\": \"^2.4.2\"\n  },\n  \"devDependencies\": {\n    \"@types/cross-spawn\": \"^6.0.6\",\n    \"@types/node\": \"^24.5.1\",\n    \"@types/prompts\": \"^2.4.9\"\n  },\n  \"contributors\": [\n    \"awkweb.eth <t@wevm.dev>\",\n    \"jxom.eth <j@wevm.dev>\"\n  ],\n  \"funding\": \"https://github.com/sponsors/wevm\",\n  \"keywords\": [\n    \"wagmi\",\n    \"eth\",\n    \"ethereum\",\n    \"dapps\",\n    \"wallet\",\n    \"web3\",\n    \"cli\"\n  ]\n}\n"
  },
  {
    "path": "packages/create-wagmi/src/cli.test.ts",
    "content": "import {\n  type ExecSyncOptionsWithStringEncoding,\n  execSync,\n} from 'node:child_process'\nimport { mkdirSync, readdirSync, writeFileSync } from 'node:fs'\nimport { rm } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport pc from 'picocolors'\nimport { afterEach, beforeAll, expect, test } from 'vitest'\n\nimport { version } from './version.js'\n\nconst cliPath = join(__dirname, '../dist/esm/cli.js')\n\nconst projectName = 'test-app'\nconst genPath = join(__dirname, projectName)\n\nfunction run(\n  args: string[],\n  options: ExecSyncOptionsWithStringEncoding = { encoding: 'utf8' },\n): string {\n  return execSync(`node ${cliPath} ${args.join(' ')}`, options)\n}\n\nfunction createNonEmptyDir() {\n  mkdirSync(genPath, { recursive: true })\n  const file = join(genPath, 'foo')\n  writeFileSync(file, 'bar')\n}\n\nbeforeAll(async () => {\n  execSync('pnpm --filter create-wagmi build')\n  await rm(genPath, { recursive: true, force: true })\n})\nafterEach(async () => {\n  await rm(genPath, { recursive: true, force: true })\n})\n\ntest('prompts for the project name if none supplied', () => {\n  const stdout = run([])\n  expect(stdout).toContain('Project name:')\n})\n\ntest('prompts for the framework if none supplied when target dir is current directory', () => {\n  mkdirSync(genPath)\n  const stdout = run(['.'], { cwd: genPath, encoding: 'utf8' })\n  expect(stdout).toContain('Select a framework:')\n})\n\ntest('prompts for the framework if none supplied', () => {\n  const stdout = run([projectName])\n  expect(stdout).toContain('Select a framework:')\n})\n\ntest('prompts for the framework on not supplying a value for --template', () => {\n  const stdout = run([projectName, '--template'])\n  expect(stdout).toContain('Select a framework:')\n})\n\ntest('prompts for the framework on supplying an invalid template', () => {\n  const stdout = run([projectName, '--template', 'unknown'])\n  expect(stdout).toContain(\n    `\"unknown\" isn't a valid template. Please choose from below:`,\n  )\n})\n\ntest('asks to overwrite non-empty target directory', () => {\n  createNonEmptyDir()\n  const stdout = run([projectName], { cwd: __dirname, encoding: 'utf8' })\n  expect(stdout).toContain(`Target directory \"${projectName}\" is not empty.`)\n})\n\ntest('asks to overwrite non-empty current directory', () => {\n  createNonEmptyDir()\n  const stdout = run(['.'], { cwd: genPath, encoding: 'utf8' })\n  expect(stdout).toContain('Current directory is not empty.')\n})\n\nconst templateFiles = readdirSync(\n  join(cliPath, '../../../templates/vite-react'),\n)\n  .map((filePath) => {\n    if (filePath === '_gitignore') return '.gitignore'\n    if (filePath === '_env.local') return '.env.local'\n    if (filePath === '_npmrc') return '.npmrc'\n    return filePath\n  })\n  .sort()\n\ntest('successfully scaffolds a project based on vite-react starter template', () => {\n  mkdirSync(genPath, { recursive: true })\n  const stdout = run([projectName, '--template', 'vite-react'], {\n    cwd: __dirname,\n    encoding: 'utf8',\n  })\n  const generatedFiles = readdirSync(genPath).sort()\n\n  expect(stdout).toContain(`Scaffolding project in ${genPath}`)\n  expect(templateFiles).toEqual(generatedFiles)\n})\n\ntest('works with the -t alias', () => {\n  mkdirSync(genPath, { recursive: true })\n  const stdout = run([projectName, '-t', 'vite-react'], {\n    cwd: __dirname,\n    encoding: 'utf8',\n  })\n  const generatedFiles = readdirSync(genPath).sort()\n\n  expect(stdout).toContain(`Scaffolding project in ${genPath}`)\n  expect(templateFiles).toEqual(generatedFiles)\n})\n\ntest('uses different package manager', () => {\n  mkdirSync(genPath, { recursive: true })\n  const stdout = run([projectName, '--bun', '-t', 'vite-react'], {\n    cwd: __dirname,\n    encoding: 'utf8',\n  })\n\n  expect(stdout).toContain('bun install')\n})\n\ntest('shows help', () => {\n  const stdout = run(['--help'])\n  expect(\n    stdout\n      .replace(version, 'x.y.z')\n      .replace(pc.green('<project-directory>'), '<project-directory>'),\n  ).toMatchInlineSnapshot(`\n    \"create-wagmi/x.y.z\n\n    Usage:\n      $ create-wagmi <project-directory> [options]\n\n    Options:\n      -t, --template [name]  Template to bootstrap with. Available: vite-react, next, vite-vue, nuxt, vite-vanilla \n      --bun                  Use bun as your package manager \n      --npm                  Use npm as your package manager \n      --pnpm                 Use pnpm as your package manager \n      --yarn                 Use yarn as your package manager \n      -h, --help             Display this message \n      -v, --version          Display version number \n    \"\n  `)\n})\n\ntest('shows version', () => {\n  const stdout = run(['--version'])\n  expect(stdout).toContain(`create-wagmi/${version} `)\n})\n"
  },
  {
    "path": "packages/create-wagmi/src/cli.ts",
    "content": "#!/usr/bin/env node\nimport * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { cac } from 'cac'\nimport spawn from 'cross-spawn'\nimport pc from 'picocolors'\nimport prompts from 'prompts'\n\nimport { type Framework, frameworks } from './frameworks.js'\nimport {\n  copy,\n  emptyDir,\n  formatTargetDir,\n  isEmpty,\n  isValidPackageName,\n  pkgFromUserAgent,\n  toValidPackageName,\n} from './utils.js'\nimport { version } from './version.js'\n\nconst templates = frameworks\n  .map((f) => f.variants?.map((v) => v.name) || [f.name])\n  .reduce((a, b) => a.concat(b), [])\n\nconst cli = cac('create-wagmi')\n\ncli\n  .usage(`${pc.green('<project-directory>')} [options]`)\n  .option(\n    '-t, --template [name]',\n    `Template to bootstrap with. Available: ${templates\n      .sort((a, b) => (a && !b ? -1 : 1))\n      .join(', ')}`,\n  )\n  .option('--bun', 'Use bun as your package manager')\n  .option('--npm', 'Use npm as your package manager')\n  .option('--pnpm', 'Use pnpm as your package manager')\n  .option('--yarn', 'Use yarn as your package manager')\n\ncli.help()\ncli.version(version)\n\nconst cwd = process.cwd()\n\nconst renameFiles: Record<string, string | undefined> = {\n  '_env.local': '.env.local',\n  // https://github.com/npm/npm/issues/1862\n  _gitignore: '.gitignore',\n  _npmrc: '.npmrc',\n}\n\nconst defaultTargetDir = 'wagmi-project'\n\nasync function init() {\n  const { args, options } = cli.parse(process.argv)\n  if (options.help) return\n  if (options.version) return\n\n  const argTargetDir = formatTargetDir(args[0])\n  const argTemplate = options.template || options.t\n\n  let targetDir = argTargetDir || defaultTargetDir\n  function getProjectName() {\n    return targetDir === '.' ? path.basename(path.resolve()) : targetDir\n  }\n\n  let result: prompts.Answers<\n    'framework' | 'overwrite' | 'packageName' | 'projectName' | 'variant'\n  >\n  try {\n    result = await prompts(\n      [\n        {\n          type: argTargetDir ? null : 'text',\n          name: 'projectName',\n          message: pc.reset('Project name:'),\n          initial: defaultTargetDir,\n          onState(state) {\n            targetDir = formatTargetDir(state.value) || defaultTargetDir\n          },\n        },\n        {\n          type() {\n            return !fs.existsSync(targetDir) || isEmpty(targetDir)\n              ? null\n              : 'confirm'\n          },\n          name: 'overwrite',\n          message() {\n            return `${\n              targetDir === '.'\n                ? 'Current directory'\n                : `Target directory \"${targetDir}\"`\n            } is not empty. Remove existing files and continue?`\n          },\n        },\n        {\n          type(_, { overwrite }: { overwrite?: boolean }) {\n            if (overwrite === false)\n              throw new Error(`${pc.red('×')} Operation cancelled`)\n            return null\n          },\n          name: 'overwriteChecker',\n        },\n        {\n          type() {\n            return isValidPackageName(getProjectName()) ? null : 'text'\n          },\n          name: 'packageName',\n          message: pc.reset('Package name:'),\n          initial() {\n            return toValidPackageName(getProjectName())\n          },\n          validate(dir) {\n            return isValidPackageName(dir) || 'Invalid package.json name'\n          },\n        },\n        {\n          type:\n            argTemplate && templates.includes(argTemplate) ? null : 'select',\n          name: 'framework',\n          message:\n            typeof argTemplate === 'string' && !templates.includes(argTemplate)\n              ? pc.reset(\n                  `\"${argTemplate}\" isn't a valid template. Please choose from below: `,\n                )\n              : pc.reset('Select a framework:'),\n          initial: 0,\n          choices: frameworks.map((framework) => {\n            const frameworkColor = framework.color\n            return {\n              title: frameworkColor(framework.display || framework.name),\n              value: framework,\n            }\n          }),\n        },\n        {\n          type(framework: Framework) {\n            return framework?.variants?.length > 1 ? 'select' : null\n          },\n          name: 'variant',\n          message: pc.reset('Select a variant:'),\n          choices(framework: Framework) {\n            return framework.variants.map((variant) => {\n              const variantColor = variant.color\n              return {\n                title: variantColor(variant.display || variant.name),\n                value: variant.name,\n              }\n            })\n          },\n        },\n      ],\n      {\n        onCancel() {\n          throw new Error(`${pc.red('×')} Operation cancelled`)\n        },\n      },\n    )\n  } catch (error) {\n    console.log((error as Error).message)\n    return\n  }\n\n  // user choice associated with prompts\n  const {\n    framework,\n    overwrite,\n    packageName,\n    variant = framework?.variants[0]?.name,\n  } = result\n\n  const root = path.join(cwd, targetDir)\n\n  if (overwrite) emptyDir(root)\n  else if (!fs.existsSync(root)) fs.mkdirSync(root, { recursive: true })\n\n  // determine template\n  const template: string = variant || framework?.name || argTemplate\n\n  const pkgInfo = pkgFromUserAgent(process.env.npm_config_user_agent)\n  type PkgManager = 'bun' | 'npm' | 'pnpm' | 'yarn'\n  let pkgManager: PkgManager\n  if (options.bun) pkgManager = 'bun'\n  else if (options.npm) pkgManager = 'npm'\n  else if (options.pnpm) pkgManager = 'pnpm'\n  else if (options.yarn) pkgManager = 'yarn'\n  else pkgManager = pkgInfo ? (pkgInfo.name as PkgManager) : 'npm'\n  const isYarn1 = pkgManager === 'yarn' && pkgInfo?.version?.startsWith('1.')\n\n  const { customCommand } =\n    frameworks.flatMap((f) => f.variants).find((v) => v.name === template) ?? {}\n\n  if (customCommand) {\n    const fullCustomCommand = customCommand\n      .replace(/^npm create /, () => {\n        // `bun create` uses it's own set of templates,\n        // the closest alternative is using `bun x` directly on the package\n        if (pkgManager === 'bun') return 'bun x create-'\n        return `${pkgManager} create `\n      })\n      // Only Yarn 1.x doesn't support `@version` in the `create` command\n      .replace('@latest', () => (isYarn1 ? '' : '@latest'))\n      .replace(/^npm exec/, () => {\n        // Prefer `pnpm dlx`, `yarn dlx`, or `bun x`\n        if (pkgManager === 'pnpm') return 'pnpm dlx'\n        if (pkgManager === 'yarn' && !isYarn1) return 'yarn dlx'\n        if (pkgManager === 'bun') return 'bun x'\n        // Use `npm exec` in all other cases,\n        // including Yarn 1.x and other custom npm clients.\n        return 'npm exec'\n      })\n\n    const [command, ...args] = fullCustomCommand.split(' ')\n    // we replace TARGET_DIR here because targetDir may include a space\n    const replacedArgs = args.map((arg) => arg.replace('TARGET_DIR', targetDir))\n    const { status } = spawn.sync(command!, replacedArgs, {\n      stdio: 'inherit',\n    })\n    process.exit(status ?? 0)\n  }\n\n  console.log(`\\nScaffolding project in ${root}...`)\n\n  const templateDir = path.resolve(\n    fileURLToPath(import.meta.url),\n    '../../../templates',\n    template,\n  )\n\n  function write(file: string, content?: string) {\n    const targetPath = path.join(root, renameFiles[file] ?? file)\n    if (content) fs.writeFileSync(targetPath, content)\n    else copy(path.join(templateDir, file), targetPath)\n  }\n\n  const files = fs.readdirSync(templateDir)\n  for (const file of files.filter((f) => f !== 'package.json')) {\n    write(file)\n  }\n\n  const pkg = JSON.parse(\n    fs.readFileSync(path.join(templateDir, 'package.json'), 'utf-8'),\n  )\n\n  pkg.name = packageName || getProjectName()\n\n  write('package.json', `${JSON.stringify(pkg, null, 2)}\\n`)\n\n  const cdProjectName = path.relative(cwd, root)\n  console.log('\\nDone. Now run:\\n')\n  if (root !== cwd)\n    console.log(\n      `  cd ${\n        cdProjectName.includes(' ') ? `\"${cdProjectName}\"` : cdProjectName\n      }`,\n    )\n\n  switch (pkgManager) {\n    case 'yarn':\n      console.log('  yarn')\n      console.log('  yarn dev')\n      break\n    default:\n      console.log(`  ${pkgManager} install`)\n      console.log(`  ${pkgManager} run dev`)\n      break\n  }\n  console.log()\n}\n\ninit().catch((e) => {\n  // biome-ignore lint/suspicious/noConsole: logging error\n  console.error(e)\n})\n"
  },
  {
    "path": "packages/create-wagmi/src/frameworks.ts",
    "content": "import pc from 'picocolors'\n\ntype ColorFunc = (str: string | number) => string\n\ntype FrameworkVariant = {\n  name: string\n  display: string\n  color: ColorFunc\n  customCommand?: string\n}\n\nexport type Framework = {\n  name: string\n  display: string\n  color: ColorFunc\n  variants: readonly FrameworkVariant[]\n}\n\nexport const frameworks: readonly Framework[] = [\n  {\n    name: 'react',\n    display: 'React',\n    color: pc.cyan,\n    variants: [\n      {\n        name: 'vite-react',\n        display: 'Vite',\n        color: pc.blue,\n      },\n      {\n        name: 'next',\n        display: 'Next',\n        color: pc.yellow,\n      },\n    ],\n  },\n  {\n    name: 'vue',\n    display: 'Vue',\n    color: pc.green,\n    variants: [\n      {\n        name: 'vite-vue',\n        display: 'Vite',\n        color: pc.blue,\n      },\n      {\n        name: 'nuxt',\n        display: 'Nuxt',\n        color: pc.yellow,\n      },\n    ],\n  },\n  {\n    name: 'vanilla',\n    display: 'Vanilla',\n    color: pc.magenta,\n    variants: [\n      {\n        name: 'vite-vanilla',\n        display: 'Vite',\n        color: pc.blue,\n      },\n    ],\n  },\n]\n"
  },
  {
    "path": "packages/create-wagmi/src/index.test-d.ts",
    "content": "import { expectTypeOf } from 'vitest'\n\n// noop test because vitest typecheck fails unless each workspace project has type test\nexpectTypeOf(1).toEqualTypeOf<number>()\n"
  },
  {
    "path": "packages/create-wagmi/src/utils.ts",
    "content": "import * as fs from 'node:fs'\nimport * as path from 'node:path'\n\nexport function formatTargetDir(targetDir: string | undefined) {\n  return targetDir?.trim().replace(/\\/+$/g, '')\n}\n\nexport function copy(src: string, dest: string) {\n  const stat = fs.statSync(src)\n  if (stat.isDirectory()) copyDir(src, dest)\n  else fs.copyFileSync(src, dest)\n}\n\nfunction copyDir(srcDir: string, destDir: string) {\n  fs.mkdirSync(destDir, { recursive: true })\n  for (const file of fs.readdirSync(srcDir)) {\n    const srcFile = path.resolve(srcDir, file)\n    const destFile = path.resolve(destDir, file)\n    copy(srcFile, destFile)\n  }\n}\n\nexport function isValidPackageName(projectName: string) {\n  return /^(?:@[a-z\\d\\-*~][a-z\\d\\-*._~]*\\/)?[a-z\\d\\-~][a-z\\d\\-._~]*$/.test(\n    projectName,\n  )\n}\n\nexport function toValidPackageName(projectName: string) {\n  return projectName\n    .trim()\n    .toLowerCase()\n    .replace(/\\s+/g, '-')\n    .replace(/^[._]/, '')\n    .replace(/[^a-z\\d\\-~]+/g, '-')\n}\n\nexport function isEmpty(path: string) {\n  const files = fs.readdirSync(path)\n  return files.length === 0 || (files.length === 1 && files[0] === '.git')\n}\n\nexport function emptyDir(dir: string) {\n  if (!fs.existsSync(dir)) return\n  for (const file of fs.readdirSync(dir)) {\n    if (file === '.git') continue\n    fs.rmSync(path.resolve(dir, file), { recursive: true, force: true })\n  }\n}\n\nexport function pkgFromUserAgent(userAgent: string | undefined) {\n  if (!userAgent) return undefined\n  const pkgSpec = userAgent.split(' ')[0]!\n  const pkgSpecArr = pkgSpec.split('/')\n  return {\n    name: pkgSpecArr[0],\n    version: pkgSpecArr[1],\n  }\n}\n\n// function setupReactSwc(root: string, isTs: boolean) {\n//   editFile(path.resolve(root, 'package.json'), (content) => {\n//     return content.replace(\n//       /\"@vitejs\\/plugin-react\": \".+?\"/,\n//       `\"@vitejs/plugin-react-swc\": \"^3.3.2\"`,\n//     )\n//   })\n//   editFile(\n//     path.resolve(root, `vite.config.${isTs ? 'ts' : 'js'}`),\n//     (content) => {\n//       return content.replace('@vitejs/plugin-react', '@vitejs/plugin-react-swc')\n//     },\n//   )\n// }\n\n// function editFile(file: string, callback: (content: string) => string) {\n//   const content = fs.readFileSync(file, 'utf-8')\n//   fs.writeFileSync(file, callback(content), 'utf-8')\n// }\n"
  },
  {
    "path": "packages/create-wagmi/src/version.ts",
    "content": "export const version = '2.0.19'\n"
  },
  {
    "path": "packages/create-wagmi/templates/next/README.md",
    "content": "This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-wagmi`](https://github.com/wevm/wagmi/tree/main/packages/create-wagmi).\n"
  },
  {
    "path": "packages/create-wagmi/templates/next/_env.local",
    "content": "NEXT_TELEMETRY_DISABLED=1\n"
  },
  {
    "path": "packages/create-wagmi/templates/next/_gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.js\n\n# testing\n/coverage\n\n# next.js\n/.next/\n/out/\n\n# production\n/build\n\n# misc\n.DS_Store\n*.pem\n\n# debug\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# local env files\n.env*.local\n\n# vercel\n.vercel\n\n# typescript\n*.tsbuildinfo\nnext-env.d.ts\n"
  },
  {
    "path": "packages/create-wagmi/templates/next/_npmrc",
    "content": "legacy-peer-deps = true"
  },
  {
    "path": "packages/create-wagmi/templates/next/next-env.d.ts",
    "content": "/// <reference types=\"next\" />\n/// <reference types=\"next/image-types/global\" />\n\n// NOTE: This file should not be edited\n// see https://nextjs.org/docs/basic-features/typescript for more information.\n"
  },
  {
    "path": "packages/create-wagmi/templates/next/next.config.ts",
    "content": "import type { NextConfig } from 'next'\n\nconst nextConfig: NextConfig = {}\n\nexport default nextConfig\n"
  },
  {
    "path": "packages/create-wagmi/templates/next/package.json",
    "content": "{\n  \"name\": \"wagmi-next-starter\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"dev\": \"next dev\",\n    \"build\": \"next build\",\n    \"start\": \"next start\",\n    \"lint\": \"next lint\"\n  },\n  \"dependencies\": {\n    \"@tanstack/react-query\": \"latest\",\n    \"next\": \"latest\",\n    \"react\": \"latest\",\n    \"react-dom\": \"latest\",\n    \"viem\": \"latest\",\n    \"wagmi\": \"latest\"\n  },\n  \"devDependencies\": {\n    \"@types/node\": \"^24.10.1\",\n    \"@types/react\": \"latest\",\n    \"@types/react-dom\": \"latest\",\n    \"@wagmi/cli\": \"latest\",\n    \"typescript\": \"latest\"\n  }\n}\n"
  },
  {
    "path": "packages/create-wagmi/templates/next/src/app/globals.css",
    "content": ":root {\n  background-color: #181818;\n  color: rgba(255, 255, 255, 0.87);\n  color-scheme: light dark;\n  font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;\n  font-synthesis: none;\n  font-weight: 400;\n  line-height: 1.5;\n  text-rendering: optimizeLegibility;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-text-size-adjust: 100%;\n}\n\n@media (prefers-color-scheme: light) {\n  :root {\n    background-color: #f8f8f8;\n    color: #181818;\n  }\n}\n"
  },
  {
    "path": "packages/create-wagmi/templates/next/src/app/layout.tsx",
    "content": "import './globals.css'\nimport type { Metadata } from 'next'\nimport { Inter } from 'next/font/google'\nimport { headers } from 'next/headers'\nimport { type ReactNode } from 'react'\nimport { cookieToInitialState } from 'wagmi'\n\nimport { getConfig } from '../wagmi'\nimport { Providers } from './providers'\n\nconst inter = Inter({ subsets: ['latin'] })\n\nexport const metadata: Metadata = {\n  title: 'Create Wagmi',\n  description: 'Generated by create-wagmi',\n}\n\nexport default async function RootLayout(props: { children: ReactNode }) {\n  const initialState = cookieToInitialState(\n    getConfig(),\n    (await headers()).get('cookie'),\n  )\n  return (\n    <html lang=\"en\">\n      <body className={inter.className}>\n        <Providers initialState={initialState}>{props.children}</Providers>\n      </body>\n    </html>\n  )\n}\n"
  },
  {
    "path": "packages/create-wagmi/templates/next/src/app/page.tsx",
    "content": "'use client'\n\nimport { useConnect, useConnection, useConnectors, useDisconnect } from 'wagmi'\n\nfunction App() {\n  const connection = useConnection()\n  const { connect, status, error } = useConnect()\n  const connectors = useConnectors()\n  const { disconnect } = useDisconnect()\n\n  return (\n    <>\n      <div>\n        <h2>Connection</h2>\n\n        <div>\n          status: {connection.status}\n          <br />\n          addresses: {JSON.stringify(connection.addresses)}\n          <br />\n          chainId: {connection.chainId}\n        </div>\n\n        {connection.status === 'connected' && (\n          <button type=\"button\" onClick={() => disconnect()}>\n            Disconnect\n          </button>\n        )}\n      </div>\n\n      <div>\n        <h2>Connect</h2>\n        {connectors.map((connector) => (\n          <button\n            key={connector.uid}\n            onClick={() => connect({ connector })}\n            type=\"button\"\n          >\n            {connector.name}\n          </button>\n        ))}\n        <div>{status}</div>\n        <div>{error?.message}</div>\n      </div>\n    </>\n  )\n}\n\nexport default App\n"
  },
  {
    "path": "packages/create-wagmi/templates/next/src/app/providers.tsx",
    "content": "'use client'\n\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { type ReactNode, useState } from 'react'\nimport { type State, WagmiProvider } from 'wagmi'\n\nimport { getConfig } from '@/wagmi'\n\nexport function Providers(props: {\n  children: ReactNode\n  initialState?: State\n}) {\n  const [config] = useState(() => getConfig())\n  const [queryClient] = useState(() => new QueryClient())\n\n  return (\n    <WagmiProvider config={config} initialState={props.initialState}>\n      <QueryClientProvider client={queryClient}>\n        {props.children}\n      </QueryClientProvider>\n    </WagmiProvider>\n  )\n}\n"
  },
  {
    "path": "packages/create-wagmi/templates/next/src/wagmi.ts",
    "content": "import { cookieStorage, createConfig, createStorage, http } from 'wagmi'\nimport { mainnet, sepolia } from 'wagmi/chains'\n\nexport function getConfig() {\n  return createConfig({\n    chains: [mainnet, sepolia],\n    storage: createStorage({\n      storage: cookieStorage,\n    }),\n    ssr: true,\n    transports: {\n      [mainnet.id]: http(),\n      [sepolia.id]: http(),\n    },\n  })\n}\n\ndeclare module 'wagmi' {\n  interface Register {\n    config: ReturnType<typeof getConfig>\n  }\n}\n"
  },
  {
    "path": "packages/create-wagmi/templates/next/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es5\",\n    \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n    \"allowJs\": true,\n    \"skipLibCheck\": true,\n    \"strict\": true,\n    \"noEmit\": true,\n    \"esModuleInterop\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"bundler\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"jsx\": \"react-jsx\",\n    \"incremental\": true,\n    \"plugins\": [\n      {\n        \"name\": \"next\"\n      }\n    ],\n    \"paths\": {\n      \"@/*\": [\"./src/*\"]\n    }\n  },\n  \"include\": [\n    \"next-env.d.ts\",\n    \"**/*.ts\",\n    \"**/*.tsx\",\n    \".next/dev/types/**/*.ts\",\n    \".next/types/**/*.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "packages/create-wagmi/templates/nuxt/_env.local",
    "content": "NUXT_TELEMETRY_DISABLED=1\n\n"
  },
  {
    "path": "packages/create-wagmi/templates/nuxt/_gitignore",
    "content": "# Nuxt dev/build outputs\n.output\n.data\n.nuxt\n.nitro\n.cache\ndist\n\n# Node dependencies\nnode_modules\n\n# Logs\nlogs\n*.log\n\n# Misc\n.DS_Store\n.fleet\n.idea\n\n# Local env files\n.env\n.env.*\n!.env.example\n"
  },
  {
    "path": "packages/create-wagmi/templates/nuxt/_npmrc",
    "content": "legacy-peer-deps = true\n\n"
  },
  {
    "path": "packages/create-wagmi/templates/nuxt/app.vue",
    "content": "<template>\n  <Connect />\n  <Connection />\n</template>\n\n<style>\n:root {\n  background-color: #181818;\n  color: rgba(255, 255, 255, 0.87);\n  color-scheme: light dark;\n  font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;\n  font-synthesis: none;\n  font-weight: 400;\n  line-height: 1.5;\n  text-rendering: optimizeLegibility;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-text-size-adjust: 100%;\n}\n\n@media (prefers-color-scheme: light) {\n  :root {\n    background-color: #f8f8f8;\n    color: #181818;\n  }\n}\n</style>\n"
  },
  {
    "path": "packages/create-wagmi/templates/nuxt/components/Connect.vue",
    "content": "<script setup lang=\"ts\">\nimport { useChainId, useConnect, useConnectors } from '@wagmi/vue'\n\nconst chainId = useChainId()\nconst { connect, error, status } = useConnect()\nconst connectors = useConnectors()\n</script>\n\n<template>\n  <h2>Connect</h2>\n\n  <button v-for=\"connector in connectors\" :key=\"connector.id\" type=\"button\" @click=\"connect({ connector, chainId })\">\n    {{ connector.name }}\n  </button>\n\n  <div>\n    {{ status }}\n    {{ error?.message }}\n  </div>\n</template>\n"
  },
  {
    "path": "packages/create-wagmi/templates/nuxt/components/Connection.vue",
    "content": "<script setup lang=\"ts\">\nimport { useConnection, useDisconnect } from '@wagmi/vue'\n\nconst { address, chainId, status } = useConnection()\nconst { disconnect } = useDisconnect()\n</script>\n\n<template>\n  <h2>Connection</h2>\n\n  <div>\n    address: {{ address }}\n    <br />\n    chainId: {{ chainId }}\n    <br />\n    status: {{ status }}\n  </div>\n\n  <button v-if=\"status !== 'disconnected'\" type=\"button\" @click=\"disconnect()\">\n    Disconnect\n  </button>\n</template>\n"
  },
  {
    "path": "packages/create-wagmi/templates/nuxt/nuxt.config.ts",
    "content": "import { defineNuxtConfig } from 'nuxt/config'\n\n// https://nuxt.com/docs/api/configuration/nuxt-config\nexport default defineNuxtConfig({\n  devtools: { enabled: true },\n  modules: ['@wagmi/vue/nuxt'],\n})\n"
  },
  {
    "path": "packages/create-wagmi/templates/nuxt/package.json",
    "content": "{\n  \"name\": \"nuxt-app\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"build\": \"nuxt typecheck && nuxt build\",\n    \"dev\": \"nuxt dev\",\n    \"generate\": \"nuxt generate\",\n    \"preview\": \"nuxt preview\",\n    \"postinstall\": \"nuxt prepare\"\n  },\n  \"dependencies\": {\n    \"@tanstack/vue-query\": \"latest\",\n    \"@wagmi/vue\": \"latest\",\n    \"nuxt\": \"latest\",\n    \"viem\": \"latest\",\n    \"vue\": \"latest\",\n    \"vue-router\": \"latest\"\n  },\n  \"devDependencies\": {\n    \"typescript\": \"latest\",\n    \"vue-tsc\": \"latest\"\n  }\n}\n"
  },
  {
    "path": "packages/create-wagmi/templates/nuxt/plugins/wagmi.ts",
    "content": "import { VueQueryPlugin } from '@tanstack/vue-query'\nimport { WagmiPlugin } from '@wagmi/vue'\nimport { defineNuxtPlugin } from 'nuxt/app'\n\nimport { config } from '../wagmi'\n\n// TODO: Move to @wagmi/vue/nuxt nitro plugin\nexport default defineNuxtPlugin((nuxtApp) => {\n  nuxtApp.vueApp.use(WagmiPlugin, { config }).use(VueQueryPlugin, {})\n})\n"
  },
  {
    "path": "packages/create-wagmi/templates/nuxt/server/tsconfig.json",
    "content": "{\n  \"extends\": \"../.nuxt/tsconfig.server.json\"\n}\n"
  },
  {
    "path": "packages/create-wagmi/templates/nuxt/tsconfig.json",
    "content": "{\n  // https://nuxt.com/docs/guide/concepts/typescript\n  \"extends\": \"./.nuxt/tsconfig.json\"\n}\n"
  },
  {
    "path": "packages/create-wagmi/templates/nuxt/wagmi.ts",
    "content": "import { cookieStorage, createConfig, createStorage, http } from '@wagmi/vue'\nimport { mainnet, optimism, sepolia } from '@wagmi/vue/chains'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia, optimism],\n  storage: createStorage({\n    storage: cookieStorage,\n  }),\n  ssr: true,\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n    [optimism.id]: http(),\n  },\n})\n\ndeclare module '@wagmi/vue' {\n  interface Register {\n    config: typeof config\n  }\n}\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-react/README.md",
    "content": "This is a [Vite](https://vitejs.dev) project bootstrapped with [`create-wagmi`](https://github.com/wevm/wagmi/tree/main/packages/create-wagmi).\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-react/_gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-react/_npmrc",
    "content": "legacy-peer-deps = true"
  },
  {
    "path": "packages/create-wagmi/templates/vite-react/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Create Wagmi</title>\n  </head>\n  <body>\n    <div id=\"root\"></div>\n    <script type=\"module\" src=\"/src/main.tsx\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-react/package.json",
    "content": "{\n  \"name\": \"wagmi-vite-starter\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"tsc && vite build\",\n    \"preview\": \"vite preview\"\n  },\n  \"dependencies\": {\n    \"@tanstack/react-query\": \"latest\",\n    \"react\": \"latest\",\n    \"react-dom\": \"latest\",\n    \"viem\": \"latest\",\n    \"wagmi\": \"latest\"\n  },\n  \"devDependencies\": {\n    \"@types/react\": \"latest\",\n    \"@types/react-dom\": \"latest\",\n    \"@vitejs/plugin-react\": \"latest\",\n    \"@wagmi/cli\": \"latest\",\n    \"typescript\": \"latest\",\n    \"vite\": \"latest\"\n  }\n}\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-react/src/App.tsx",
    "content": "import { useConnect, useConnection, useConnectors, useDisconnect } from 'wagmi'\n\nfunction App() {\n  const connection = useConnection()\n  const { connect, status, error } = useConnect()\n  const connectors = useConnectors()\n  const { disconnect } = useDisconnect()\n\n  return (\n    <>\n      <div>\n        <h2>Connection</h2>\n\n        <div>\n          status: {connection.status}\n          <br />\n          addresses: {JSON.stringify(connection.addresses)}\n          <br />\n          chainId: {connection.chainId}\n        </div>\n\n        {connection.status === 'connected' && (\n          <button type=\"button\" onClick={() => disconnect()}>\n            Disconnect\n          </button>\n        )}\n      </div>\n\n      <div>\n        <h2>Connect</h2>\n        {connectors.map((connector) => (\n          <button\n            key={connector.uid}\n            onClick={() => connect({ connector })}\n            type=\"button\"\n          >\n            {connector.name}\n          </button>\n        ))}\n        <div>{status}</div>\n        <div>{error?.message}</div>\n      </div>\n    </>\n  )\n}\n\nexport default App\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-react/src/index.css",
    "content": ":root {\n  background-color: #181818;\n  color: rgba(255, 255, 255, 0.87);\n  color-scheme: light dark;\n  font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;\n  font-synthesis: none;\n  font-weight: 400;\n  line-height: 1.5;\n  text-rendering: optimizeLegibility;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-text-size-adjust: 100%;\n}\n\n@media (prefers-color-scheme: light) {\n  :root {\n    background-color: #f8f8f8;\n    color: #181818;\n  }\n}\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-react/src/main.tsx",
    "content": "import { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport React from 'react'\nimport ReactDOM from 'react-dom/client'\nimport { WagmiProvider } from 'wagmi'\n\nimport App from './App.tsx'\nimport { config } from './wagmi.ts'\n\nimport './index.css'\n\nconst queryClient = new QueryClient()\n\nReactDOM.createRoot(document.getElementById('root')!).render(\n  <React.StrictMode>\n    <WagmiProvider config={config}>\n      <QueryClientProvider client={queryClient}>\n        <App />\n      </QueryClientProvider>\n    </WagmiProvider>\n  </React.StrictMode>,\n)\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-react/src/vite-env.d.ts",
    "content": "/// <reference types=\"vite/client\" />\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-react/src/wagmi.ts",
    "content": "import { createConfig, http } from 'wagmi'\nimport { mainnet, sepolia } from 'wagmi/chains'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n\ndeclare module 'wagmi' {\n  interface Register {\n    config: typeof config\n  }\n}\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-react/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2020\",\n    \"useDefineForClassFields\": true,\n    \"lib\": [\"ES2020\", \"DOM\", \"DOM.Iterable\"],\n    \"module\": \"ESNext\",\n    \"skipLibCheck\": true,\n\n    /* Bundler mode */\n    \"moduleResolution\": \"bundler\",\n    \"allowImportingTsExtensions\": true,\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"noEmit\": true,\n    \"jsx\": \"react-jsx\",\n\n    /* Linting */\n    \"strict\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"noFallthroughCasesInSwitch\": true\n  },\n  \"include\": [\"src\"],\n  \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-react/tsconfig.node.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"skipLibCheck\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"bundler\",\n    \"allowSyntheticDefaultImports\": true\n  },\n  \"include\": [\"vite.config.ts\"]\n}\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-react/vite.config.ts",
    "content": "import react from '@vitejs/plugin-react'\nimport { defineConfig } from 'vite'\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [react()],\n})\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-vanilla/_gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-vanilla/_npmrc",
    "content": "legacy-peer-deps = true"
  },
  {
    "path": "packages/create-wagmi/templates/vite-vanilla/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Create Wagmi</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script type=\"module\" src=\"/src/main.ts\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-vanilla/package.json",
    "content": "{\n  \"name\": \"wagmi-core-vanilla-starter\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"tsc && vite build\",\n    \"preview\": \"vite preview\"\n  },\n  \"dependencies\": {\n    \"@wagmi/connectors\": \"latest\",\n    \"@wagmi/core\": \"latest\",\n    \"react\": \"latest\",\n    \"react-dom\": \"latest\",\n    \"viem\": \"latest\"\n  },\n  \"devDependencies\": {\n    \"@wagmi/cli\": \"latest\",\n    \"typescript\": \"latest\",\n    \"vite\": \"latest\"\n  }\n}\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-vanilla/src/main.ts",
    "content": "import { connect, disconnect, reconnect, watchConnection } from '@wagmi/core'\nimport { Buffer } from 'buffer'\n\nimport './style.css'\nimport { config } from './wagmi'\n\nglobalThis.Buffer = Buffer\n\ndocument.querySelector<HTMLDivElement>('#app')!.innerHTML = `\n  <div>\n    <div id=\"connection\">\n      <h2>Connection</h2>\n\n      <div>\n        status:\n        <br />\n        addresses:\n        <br />\n        chainId:\n      </div>\n    </div>\n\n    <div id=\"connect\">\n      <h2>Connect</h2>\n      ${config.connectors\n        .map(\n          (connector) =>\n            `<button class=\"connect\" id=\"${connector.uid}\" type=\"button\">${connector.name}</button>`,\n        )\n        .join('')}\n    </div>\n  </div>\n`\n\nsetupApp(document.querySelector<HTMLDivElement>('#app')!)\n\nfunction setupApp(element: HTMLDivElement) {\n  const connectElement = element.querySelector<HTMLDivElement>('#connect')\n  const buttons = element.querySelectorAll<HTMLButtonElement>('.connect')\n  for (const button of buttons) {\n    const connector = config.connectors.find(\n      (connector) => connector.uid === button.id,\n    )!\n    button.addEventListener('click', async () => {\n      try {\n        const errorElement = element.querySelector<HTMLDivElement>('#error')\n        if (errorElement) errorElement.remove()\n        await connect(config, { connector })\n      } catch (error) {\n        const errorElement = document.createElement('div')\n        errorElement.id = 'error'\n        errorElement.innerText = (error as Error).message\n        connectElement?.appendChild(errorElement)\n      }\n    })\n  }\n\n  watchConnection(config, {\n    onChange(connection) {\n      const connectionElement =\n        element.querySelector<HTMLDivElement>('#connection')!\n      connectionElement.innerHTML = `\n        <h2>Connection</h2>\n        <div>\n          status: ${connection.status}\n          <br />\n          addresses: ${\n            connection.addresses ? JSON.stringify(connection.addresses) : ''\n          }\n          <br />\n          chainId: ${connection.chainId ?? ''}\n        </div>\n        ${\n          connection.status === 'connected'\n            ? `<button id=\"disconnect\" type=\"button\">Disconnect</button>`\n            : ''\n        }\n      `\n\n      const disconnectButton =\n        element.querySelector<HTMLButtonElement>('#disconnect')\n      if (disconnectButton)\n        disconnectButton.addEventListener('click', () => disconnect(config))\n    },\n  })\n\n  reconnect(config)\n    .then(() => {})\n    .catch(() => {})\n}\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-vanilla/src/style.css",
    "content": ":root {\n  background-color: #181818;\n  color: rgba(255, 255, 255, 0.87);\n  color-scheme: light dark;\n  font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;\n  font-synthesis: none;\n  font-weight: 400;\n  line-height: 1.5;\n  text-rendering: optimizeLegibility;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-text-size-adjust: 100%;\n}\n\n@media (prefers-color-scheme: light) {\n  :root {\n    background-color: #f8f8f8;\n    color: #181818;\n  }\n}\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-vanilla/src/vite-env.d.ts",
    "content": "/// <reference types=\"vite/client\" />\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-vanilla/src/wagmi.ts",
    "content": "import { createConfig, http } from '@wagmi/core'\nimport { mainnet, sepolia } from '@wagmi/core/chains'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-vanilla/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2020\",\n    \"useDefineForClassFields\": true,\n    \"module\": \"ESNext\",\n    \"lib\": [\"ES2020\", \"DOM\", \"DOM.Iterable\"],\n    \"skipLibCheck\": true,\n\n    /* Bundler mode */\n    \"moduleResolution\": \"bundler\",\n    \"allowImportingTsExtensions\": true,\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"noEmit\": true,\n\n    /* Linting */\n    \"strict\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"noFallthroughCasesInSwitch\": true\n  },\n  \"include\": [\"src\"]\n}\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-vue/README.md",
    "content": "This is a [Vite](https://vitejs.dev) project bootstrapped with [`create-wagmi`](https://github.com/wevm/wagmi/tree/main/packages/create-wagmi).\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-vue/_gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-vue/_npmrc",
    "content": "legacy-peer-deps = true"
  },
  {
    "path": "packages/create-wagmi/templates/vite-vue/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Create Wagmi</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script type=\"module\" src=\"/src/main.ts\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-vue/package.json",
    "content": "{\n  \"name\": \"wagmi-vue-vite-starter\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"vue-tsc && vite build\",\n    \"preview\": \"vite preview\"\n  },\n  \"dependencies\": {\n    \"@tanstack/vue-query\": \"latest\",\n    \"@wagmi/vue\": \"latest\",\n    \"viem\": \"latest\",\n    \"vue\": \"latest\"\n  },\n  \"devDependencies\": {\n    \"@vitejs/plugin-vue\": \"latest\",\n    \"vite\": \"latest\",\n    \"vue-tsc\": \"latest\"\n  }\n}\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-vue/src/App.vue",
    "content": "<script setup lang=\"ts\">\nimport Connect from './components/Connect.vue'\nimport Connection from './components/Connection.vue'\n</script>\n\n<template>\n  <Connection />\n  <Balance />\n  <Connect />\n  <Connections />\n  <SwitchAccount />\n  <SwitchChain />\n  <BlockNumber />\n  <ReadContract />\n  <SendTransaction />\n  <WriteContract />\n  <Client />\n  <ConnectorClient />\n</template>\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-vue/src/components/Connect.vue",
    "content": "<script setup lang=\"ts\">\nimport { useChainId, useConnect, useConnectors } from '@wagmi/vue'\n\nconst chainId = useChainId()\nconst { connect, error, status } = useConnect()\nconst connectors = useConnectors()\n</script>\n\n<template>\n  <h2>Connect</h2>\n\n  <button v-for=\"connector in connectors\" :key=\"connector.id\" type=\"button\" @click=\"connect({ connector, chainId })\">\n    {{ connector.name }}\n  </button>\n\n  <div>\n    {{ status }}\n    {{ error?.message }}\n  </div>\n</template>\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-vue/src/components/Connection.vue",
    "content": "<script setup lang=\"ts\">\nimport { useConnection, useDisconnect } from '@wagmi/vue'\n\nconst { address, chainId, status } = useConnection()\nconst { disconnect } = useDisconnect()\n</script>\n\n<template>\n  <h2>Connection</h2>\n\n  <div>\n    address: {{ address }}\n    <br />\n    chainId: {{ chainId }}\n    <br />\n    status: {{ status }}\n  </div>\n\n  <button v-if=\"status !== 'disconnected'\" type=\"button\" @click=\"disconnect()\">\n    Disconnect\n  </button>\n</template>\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-vue/src/main.ts",
    "content": "import { VueQueryPlugin } from '@tanstack/vue-query'\nimport { WagmiPlugin } from '@wagmi/vue'\nimport { Buffer } from 'buffer'\nimport { createApp } from 'vue'\n\n// `@coinbase-wallet/sdk` uses `Buffer`\nglobalThis.Buffer = Buffer\n\nimport App from './App.vue'\nimport './style.css'\nimport { config } from './wagmi'\n\nconst app = createApp(App)\n\napp.use(WagmiPlugin, { config }).use(VueQueryPlugin, {})\n\napp.mount('#app')\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-vue/src/style.css",
    "content": ":root {\n  background-color: #181818;\n  color: rgba(255, 255, 255, 0.87);\n  color-scheme: light dark;\n  font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;\n  font-synthesis: none;\n  font-weight: 400;\n  line-height: 1.5;\n  text-rendering: optimizeLegibility;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-text-size-adjust: 100%;\n}\n\n@media (prefers-color-scheme: light) {\n  :root {\n    background-color: #f8f8f8;\n    color: #181818;\n  }\n}\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-vue/src/vite-env.d.ts",
    "content": "/// <reference types=\"vite/client\" />\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-vue/src/wagmi.ts",
    "content": "import { createConfig, createStorage, http } from '@wagmi/vue'\nimport { mainnet, optimism, sepolia } from '@wagmi/vue/chains'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia, optimism],\n  storage: createStorage({ storage: localStorage, key: 'vite-vue' }),\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n    [optimism.id]: http(),\n  },\n})\n\ndeclare module '@wagmi/vue' {\n  interface Register {\n    config: typeof config\n  }\n}\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-vue/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2020\",\n    \"useDefineForClassFields\": true,\n    \"module\": \"ESNext\",\n    \"lib\": [\"ES2020\", \"DOM\", \"DOM.Iterable\"],\n    \"skipLibCheck\": true,\n\n    /* Bundler mode */\n    \"moduleResolution\": \"bundler\",\n    \"allowImportingTsExtensions\": true,\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"noEmit\": true,\n    \"jsx\": \"preserve\",\n\n    /* Linting */\n    \"strict\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"noFallthroughCasesInSwitch\": true\n  },\n  \"include\": [\"src/**/*.ts\", \"src/**/*.tsx\", \"src/**/*.vue\"],\n  \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-vue/tsconfig.node.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"skipLibCheck\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"bundler\",\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": true\n  },\n  \"include\": [\"vite.config.ts\"]\n}\n"
  },
  {
    "path": "packages/create-wagmi/templates/vite-vue/vite.config.ts",
    "content": "import vue from '@vitejs/plugin-vue'\nimport { defineConfig } from 'vite'\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [vue()],\n})\n"
  },
  {
    "path": "packages/create-wagmi/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"include\": [\"src/**/*.ts\"],\n  \"exclude\": [\"src/**/*.test.ts\"],\n  \"compilerOptions\": {\n    \"sourceMap\": true\n  }\n}\n"
  },
  {
    "path": "packages/create-wagmi/tsconfig.json",
    "content": "{\n  \"extends\": \"./tsconfig.build.json\",\n  \"include\": [\"src/**/*.ts\"],\n  \"exclude\": []\n}\n"
  },
  {
    "path": "packages/react/CHANGELOG.md",
    "content": "# wagmi\n\n## 3.5.0\n\n### Minor Changes\n\n- Added `useSignTransaction` ([#4995](https://github.com/wevm/wagmi/pull/4995))\n\n### Patch Changes\n\n- Updated dependencies [[`8b96e2f`](https://github.com/wevm/wagmi/commit/8b96e2f46d9b3441d3b499b03924700ac0629be6)]:\n  - @wagmi/core@3.4.0\n  - @wagmi/connectors@7.2.1\n\n## 3.4.4\n\n### Patch Changes\n\n- Updated dependencies [[`c1dedd9`](https://github.com/wevm/wagmi/commit/c1dedd99c0a1878d7cd48476946868636ac81dd8), [`9dbdd82`](https://github.com/wevm/wagmi/commit/9dbdd8277808eb361fe7fe01ea34e4c6bb85c7a5)]:\n  - @wagmi/core@3.3.4\n  - @wagmi/connectors@7.2.0\n\n## 3.4.3\n\n### Patch Changes\n\n- Added ability to sign arbitrary `hash` on `webAuthn#connect`. ([#4994](https://github.com/wevm/wagmi/pull/4994))\n\n- Updated dependencies [[`4b3f5a3`](https://github.com/wevm/wagmi/commit/4b3f5a3f7b3f242e8fbc1f08ae2f81ae13c5e09f)]:\n  - @wagmi/core@3.3.3\n  - @wagmi/connectors@7.1.7\n\n## 3.4.2\n\n### Patch Changes\n\n- Updated dependencies [[`68e17db`](https://github.com/wevm/wagmi/commit/68e17db7ff84982db8f52f54e6f047c5efab62ab)]:\n  - @wagmi/core@3.3.2\n  - @wagmi/connectors@7.1.6\n\n## 3.4.1\n\n### Patch Changes\n\n- Updated dependencies [[`7f756bd`](https://github.com/wevm/wagmi/commit/7f756bda12cd332016f0bb3a2f20307c37499309)]:\n  - @wagmi/core@3.3.1\n  - @wagmi/connectors@7.1.5\n\n## 3.4.0\n\n### Minor Changes\n\n- Added `useContractEvents` hook. ([#4905](https://github.com/wevm/wagmi/pull/4905))\n\n- Added `useBlobBaseFee` and `useWriteContractSync` hooks. ([`dfe7904`](https://github.com/wevm/wagmi/commit/dfe790426d5ac24d55eacdf8d0193292de801911))\n\n### Patch Changes\n\n- Fixed `createUseWriteContract` not returning `mutate`/`mutateAsyc` with `abi` injected. ([#4967](https://github.com/wevm/wagmi/pull/4967))\n\n- Fixed re-subscribe every render for `useWatchBlockNumber`, `useWatchBlocks`, `useWatchContractEvent`, `useWatchPendingTransactions`. ([`b5d6911`](https://github.com/wevm/wagmi/commit/b5d6911a863e35d677374acd744c054daacd663a))\n\n- Updated dependencies [[`dfe7904`](https://github.com/wevm/wagmi/commit/dfe790426d5ac24d55eacdf8d0193292de801911), [`d503a2c`](https://github.com/wevm/wagmi/commit/d503a2cb6ef96018669a66d03f72a2b2b06dc0fb), [`5399840`](https://github.com/wevm/wagmi/commit/53998407645edd95d85e50a931acaed87c05e256), [`5978cc5`](https://github.com/wevm/wagmi/commit/5978cc508ac837be88ed84c15ea5aa805f59005a), [`67612ed`](https://github.com/wevm/wagmi/commit/67612edfbcb971b71c86964aae72ff3ef80bbe10), [`dbe9484`](https://github.com/wevm/wagmi/commit/dbe9484c1a635c3fc9b658a7d8e34ccc0a82ed1d)]:\n  - @wagmi/core@3.3.0\n  - @wagmi/connectors@7.1.4\n\n## 3.3.4\n\n### Patch Changes\n\n- Fixed issue where `wagmi/tempo` hooks were not propagating `UseQueryOptions`. ([#4955](https://github.com/wevm/wagmi/pull/4955))\n\n## 3.3.3\n\n### Patch Changes\n\n- Updated dependencies [[`979fe26`](https://github.com/wevm/wagmi/commit/979fe265e5273a8b49a4469ffab88b1a18b1aeaa), [`979fe26`](https://github.com/wevm/wagmi/commit/979fe265e5273a8b49a4469ffab88b1a18b1aeaa), [`e4541de`](https://github.com/wevm/wagmi/commit/e4541def76a1744dc36c188453265cc6e9d83722)]:\n  - @wagmi/core@3.2.3\n  - @wagmi/connectors@7.1.3\n\n## 3.3.2\n\n### Patch Changes\n\n- Updated query internals. ([`4fefa57`](https://github.com/wevm/wagmi/commit/4fefa576014820b454344b579282ddecde5c7994))\n\n- Updated dependencies [[`4fefa57`](https://github.com/wevm/wagmi/commit/4fefa576014820b454344b579282ddecde5c7994)]:\n  - @wagmi/core@3.2.2\n  - @wagmi/connectors@7.1.2\n\n## 3.3.1\n\n### Patch Changes\n\n- Updated dependencies [[`a373b50`](https://github.com/wevm/wagmi/commit/a373b504f2ba199ca63ec0da6138ad1aa12a3a8f)]:\n  - @wagmi/core@3.2.1\n  - @wagmi/connectors@7.1.1\n\n## 3.3.0\n\n### Minor Changes\n\n- Updated to `viem@2.44.0` with Tempo Moderato support. ([#4940](https://github.com/wevm/wagmi/pull/4940))\n\n  **Breaking Changes (Tempo)**\n\n  - Renamed `reward.useStart` → `reward.useDistribute`\n  - Renamed `reward.useStartSync` → `reward.useDistributeSync`\n  - Renamed `reward.useGetTotalPerSecond` → `reward.useGetGlobalRewardPerToken`\n  - Renamed `reward.useWatchRewardScheduled` → `reward.useWatchRewardDistributed`\n  - Removed `nonce.useNonceKeyCount`\n  - Removed `nonce.useWatchActiveKeyCountChanged`\n  - Removed `amm.useWatchFeeSwap`\n\n  **New Features (Tempo)**\n\n  - Added `dex.useCancelStale` hook\n  - Added `dex.useCancelStaleSync` hook\n\n### Patch Changes\n\n- Updated dependencies [[`2ee3f55`](https://github.com/wevm/wagmi/commit/2ee3f559a2637c7aab3fca6c7d196cf238ecd63d)]:\n  - @wagmi/core@3.2.0\n  - @wagmi/connectors@7.1.3\n\n## 3.2.0\n\n### Minor Changes\n\n- Added first-class support and extension for [Tempo](https://docs.tempo.xyz) via `/tempo` entrypoint. ([#4922](https://github.com/wevm/wagmi/pull/4922))\n\n### Patch Changes\n\n- Updated dependencies [[`14989e4`](https://github.com/wevm/wagmi/commit/14989e425a36b765a6a24e5abf1782c2a26c70db)]:\n  - @wagmi/core@3.1.0\n  - @wagmi/connectors@7.1.2\n\n## 3.1.4\n\n### Patch Changes\n\n- Updated dependencies [[`a5c4381`](https://github.com/wevm/wagmi/commit/a5c4381563374018dca0074017b21181ac027e9a)]:\n  - @wagmi/core@3.0.2\n  - @wagmi/connectors@7.0.6\n\n## 3.1.3\n\n### Patch Changes\n\n- Fixed published exports. ([`ed86500`](https://github.com/wevm/wagmi/commit/ed86500fbd56e5f543cb04e990b2dadc08d8b3b5))\n\n- Updated dependencies [[`ed86500`](https://github.com/wevm/wagmi/commit/ed86500fbd56e5f543cb04e990b2dadc08d8b3b5)]:\n  - @wagmi/connectors@7.0.5\n\n## 3.1.2\n\n### Patch Changes\n\n- Updated dependencies [[`9bbf13e`](https://github.com/wevm/wagmi/commit/9bbf13eac895669e70b233de767c8731d221f16e)]:\n  - @wagmi/connectors@7.0.4\n\n## 3.1.1\n\n### Patch Changes\n\n- Fixed `useReadContract` return type inference for ABI function overloads. ([`058c8c1`](https://github.com/wevm/wagmi/commit/058c8c18459a69a4aa2141e34640273a06a819f4))\n\n- Updated dependencies [[`058c8c1`](https://github.com/wevm/wagmi/commit/058c8c18459a69a4aa2141e34640273a06a819f4)]:\n  - @wagmi/core@3.0.1\n  - @wagmi/connectors@7.0.3\n\n## 3.1.0\n\n### Minor Changes\n\n- Deprecated custom mutate function names and renamed to `mutate`/`mutateAsync` to reduce destructure key renaming fatigue and align with TanStack Query terminology. ([#4878](https://github.com/wevm/wagmi/pull/4878))\n\n  **Before**\n\n  Had to destructure hook result and often rename keys when using multiple of the same hook. Could decide not to destructure, but syntax becomes awkward for mutate functions (e.g. `connect.connect` or `connect.connectAsync`).\n\n  ```ts\n  const { connect, isPending: connectIsPending } = useConnect();\n  const {\n    writeContract: transfer,\n    error: transferError,\n    isPending: transferIsPending,\n  } = useWriteContract();\n  const { writeContract: approve, error: approveError } = useWriteContract();\n  ```\n\n  **After**\n\n  Allows you to name the hook result whatever you want and not worry about also renaming properties.\n\n  ```ts\n  const connect = useConnect(); // connect.isPending\n  const transfer = useWriteContract(); // transfer.mutate, transfer.error, transfer.isPending\n  const approve = useWriteContract(); // approve.mutate, approve.error\n  ```\n\n## 3.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`0a46561`](https://github.com/wevm/wagmi/commit/0a4656137e1f9ed101dd1f79545d516aba32a92e)]:\n  - @wagmi/connectors@7.0.2\n\n## 3.0.1\n\n### Patch Changes\n\n- Updated dependencies [[`856548a`](https://github.com/wevm/wagmi/commit/856548a5ae23c8771e3a51a919e1e978b83c4b00)]:\n  - @wagmi/connectors@7.0.1\n\n## 3.0.0\n\n### Major Changes\n\n- 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))\n\n  #### baseAccount\n\n  [`baseAccount`](https://wagmi.sh/react/api/connectors/baseAccount) requires `@base-org/account`\n\n  ```\n  pnpm add @base-org/account@~2.4.0\n  ```\n\n  #### coinbaseWallet\n\n  [`coinbaseWallet`](https://wagmi.sh/react/api/connectors/coinbaseWallet) requires `@coinbase/wallet-sdk`\n\n  ```\n  pnpm add @coinbase/wallet-sdk@~4.3.6\n  ```\n\n  #### gemini\n\n  [`gemini`](https://wagmi.sh/react/api/connectors/gemini) requires `@gemini-wallet/core`\n\n  ```\n  pnpm add @gemini-wallet/core@~0.3.1\n  ```\n\n  #### metaMask\n\n  [`metaMask`](https://wagmi.sh/react/api/connectors/metaMask) requires `@metamask/sdk`\n\n  ```\n  pnpm add @metamask/sdk@~0.33.1\n  ```\n\n  #### porto\n\n  [`porto`](https://wagmi.sh/react/api/connectors/porto) requires `porto`\n\n  ```\n  pnpm add porto@~0.2.35\n  ```\n\n  #### safe\n\n  [`safe`](https://wagmi.sh/react/api/connectors/safe) requires `@safe-global/safe-apps-provider` and `@safe-global/safe-apps-sdk`\n\n  ```\n  pnpm add @safe-global/safe-apps-provider@~0.18.6 @safe-global/safe-apps-sdk@~9.1.0\n  ```\n\n  #### walletConnect\n\n  [`walletConnect`](https://wagmi.sh/react/api/connectors/walletConnect) requires `walletconnect/ethereum-provider`\n\n  ```\n  pnpm add @walletconnect/ethereum-provider@~2.21.1\n  ```\n\n### Patch Changes\n\n- Updated dependencies [[`73e7326`](https://github.com/wevm/wagmi/commit/73e7326ac21303d7790765c78a7076b319b2ad26)]:\n  - @wagmi/connectors@7.0.0\n  - @wagmi/core@3.0.0\n\n## 2.19.5\n\n### Patch Changes\n\n- Updated dependencies [[`5388de5`](https://github.com/wevm/wagmi/commit/5388de593847b23368c42646c27ee5438260062d)]:\n  - @wagmi/connectors@6.2.0\n\n## 2.19.4\n\n### Patch Changes\n\n- Optimized internal `chainId` computation for `useReadContracts` to reduce unnecessary query invalidations. ([#4872](https://github.com/wevm/wagmi/pull/4872))\n\n## 2.19.3\n\n### Patch Changes\n\n- Updated dependencies [[`2ddb506`](https://github.com/wevm/wagmi/commit/2ddb506b67fcb2abb464765d2af88df2eb58de60)]:\n  - @wagmi/connectors@6.1.4\n\n## 2.19.2\n\n### Patch Changes\n\n- Updated dependencies [[`65cf154`](https://github.com/wevm/wagmi/commit/65cf1544d65bfb1fb830c405a371e8cd3c3fb73e)]:\n  - @wagmi/connectors@6.1.3\n\n## 2.19.1\n\n### Patch Changes\n\n- Updated dependencies [[`faf3eed`](https://github.com/wevm/wagmi/commit/faf3eeddb97c300f971083f8ee9b02a29ad23cbb)]:\n  - @wagmi/connectors@6.1.2\n\n## 2.19.0\n\n### Minor Changes\n\n- Exported internal types ([`3e634b7`](https://github.com/wevm/wagmi/commit/3e634b7bcf0bd0e67e59fcb74ad89dfb56e4eae9))\n\n### Patch Changes\n\n- Updated dependencies [[`990dd23`](https://github.com/wevm/wagmi/commit/990dd2339e96b302931056e0fb898bd2dd42a04d)]:\n  - @wagmi/connectors@6.1.1\n\n## 2.18.2\n\n### Patch Changes\n\n- Updated dependencies [[`ae31a8d`](https://github.com/wevm/wagmi/commit/ae31a8d3d0b436841d6546ab2565dee624204aca)]:\n  - @wagmi/connectors@6.1.0\n\n## 2.18.1\n\n### Patch Changes\n\n- Updated dependencies [[`74100b0`](https://github.com/wevm/wagmi/commit/74100b0dea2dfe7b057fdbe1660596554c70642e)]:\n  - @wagmi/core@2.22.1\n  - @wagmi/connectors@6.0.1\n\n## 2.18.0\n\n### Minor Changes\n\n- Added `useSendTransactionSync` and `useSendCallsSync` Hooks. ([#4823](https://github.com/wevm/wagmi/pull/4823))\n\n### Patch Changes\n\n- Updated dependencies [[`ebb2352`](https://github.com/wevm/wagmi/commit/ebb2352375e05e52d0bcf6ae1a60ac4e798bf29f)]:\n  - @wagmi/core@2.22.0\n  - @wagmi/connectors@6.0.0\n\n## 2.17.5\n\n### Patch Changes\n\n- Updated dependencies [[`2f0db95`](https://github.com/wevm/wagmi/commit/2f0db9553d30dd95b3245c44dafec4fa1a758397), [`866aeb0`](https://github.com/wevm/wagmi/commit/866aeb0e6361ef9114246e50149c1077bc05bf10)]:\n  - @wagmi/connectors@5.11.2\n  - @wagmi/core@2.21.2\n\n## 2.17.4\n\n### Patch Changes\n\n- Updated dependencies [[`41eb70e`](https://github.com/wevm/wagmi/commit/41eb70e072774b282053a5e98669a7d01c0e2438), [`9a00e42`](https://github.com/wevm/wagmi/commit/9a00e423d52df9478681df743f00429717ffc584)]:\n  - @wagmi/connectors@5.11.1\n\n## 2.17.3\n\n### Patch Changes\n\n- Updated dependencies [[`f05c075`](https://github.com/wevm/wagmi/commit/f05c075365a737d870a657f2db9220eb93ad0ac1)]:\n  - @wagmi/connectors@5.11.0\n\n## 2.17.2\n\n### Patch Changes\n\n- Updated dependencies [[`72b703a`](https://github.com/wevm/wagmi/commit/72b703ab379c74ecf88f637cf47f31786c823a48)]:\n  - @wagmi/core@2.21.1\n  - @wagmi/connectors@5.10.2\n\n## 2.17.1\n\n### Patch Changes\n\n- Updated dependencies [[`5937456`](https://github.com/wevm/wagmi/commit/59374562f2c3a41245687eb1c29ee8023737c7cc)]:\n  - @wagmi/connectors@5.10.1\n\n## 2.17.0\n\n### Minor Changes\n\n- [#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.\n\n### Patch Changes\n\n- Updated dependencies [[`8736133a13eb82099e20468b735525a266fdfd6c`](https://github.com/wevm/wagmi/commit/8736133a13eb82099e20468b735525a266fdfd6c)]:\n  - @wagmi/connectors@5.10.0\n  - @wagmi/core@2.21.0\n\n## 2.16.9\n\n### Patch Changes\n\n- Updated dependencies [[`ce06e137e7bfaf000464b1cecd6c86e19a66ebcf`](https://github.com/wevm/wagmi/commit/ce06e137e7bfaf000464b1cecd6c86e19a66ebcf)]:\n  - @wagmi/core@2.20.3\n  - @wagmi/connectors@5.9.9\n\n## 2.16.8\n\n### Patch Changes\n\n- Updated dependencies [[`a03da817a388646c9b4885792101a67eef3616e7`](https://github.com/wevm/wagmi/commit/a03da817a388646c9b4885792101a67eef3616e7)]:\n  - @wagmi/connectors@5.9.8\n\n## 2.16.7\n\n### Patch Changes\n\n- Updated dependencies [[`986b96427a4bb743d2673dfbc7e8cb5041316db3`](https://github.com/wevm/wagmi/commit/986b96427a4bb743d2673dfbc7e8cb5041316db3)]:\n  - @wagmi/core@2.20.2\n  - @wagmi/connectors@5.9.7\n\n## 2.16.6\n\n### Patch Changes\n\n- [#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.\n\n- Updated dependencies [[`d4c367ca46c508598c997cf229a31593a1e2b8b8`](https://github.com/wevm/wagmi/commit/d4c367ca46c508598c997cf229a31593a1e2b8b8)]:\n  - @wagmi/core@2.20.1\n  - @wagmi/connectors@5.9.6\n\n## 2.16.5\n\n### Patch Changes\n\n- Updated dependencies [[`a13aa2b68890f180f6ac3f741cbb9817494cb66c`](https://github.com/wevm/wagmi/commit/a13aa2b68890f180f6ac3f741cbb9817494cb66c)]:\n  - @wagmi/core@2.20.0\n  - @wagmi/connectors@5.9.5\n\n## 2.16.4\n\n### Patch Changes\n\n- Updated dependencies [[`f4039419b83b52b2984de149db85c11f503ffe39`](https://github.com/wevm/wagmi/commit/f4039419b83b52b2984de149db85c11f503ffe39)]:\n  - @wagmi/connectors@5.9.4\n\n## 2.16.3\n\n### Patch Changes\n\n- Updated dependencies [[`909324d28c81e15c9df312b277dcff1983fbae4d`](https://github.com/wevm/wagmi/commit/909324d28c81e15c9df312b277dcff1983fbae4d)]:\n  - @wagmi/connectors@5.9.3\n\n## 2.16.2\n\n### Patch Changes\n\n- Updated dependencies [[`b5f017dbc707729eb0b36d617352be224d1139d4`](https://github.com/wevm/wagmi/commit/b5f017dbc707729eb0b36d617352be224d1139d4)]:\n  - @wagmi/core@2.19.0\n  - @wagmi/connectors@5.9.2\n\n## 2.16.1\n\n### Patch Changes\n\n- Updated dependencies [[`6fbafd425e488dbeee8404162dbeb3c737eeb8cf`](https://github.com/wevm/wagmi/commit/6fbafd425e488dbeee8404162dbeb3c737eeb8cf), [`6514ba29a5acb918773235fed0238d7d679d06d5`](https://github.com/wevm/wagmi/commit/6514ba29a5acb918773235fed0238d7d679d06d5)]:\n  - @wagmi/connectors@5.9.1\n  - @wagmi/core@2.18.1\n\n## 2.16.0\n\n### Minor Changes\n\n- [#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.\n\n### Patch Changes\n\n- Updated dependencies [[`eac550ae5b49f96a7e3404a6d88adc62d3889013`](https://github.com/wevm/wagmi/commit/eac550ae5b49f96a7e3404a6d88adc62d3889013)]:\n  - @wagmi/connectors@6.0.0\n  - @wagmi/core@2.18.0\n\n## 2.15.7\n\n### Patch Changes\n\n- Updated dependencies [[`e75bd89406e9b6ff5b7d3a7148ab34140fe6352a`](https://github.com/wevm/wagmi/commit/e75bd89406e9b6ff5b7d3a7148ab34140fe6352a)]:\n  - @wagmi/connectors@5.8.6\n\n## 2.15.6\n\n### Patch Changes\n\n- Updated dependencies [[`7ce242b549d8cc78e6c319d9ee419693da36704c`](https://github.com/wevm/wagmi/commit/7ce242b549d8cc78e6c319d9ee419693da36704c)]:\n  - @wagmi/core@2.17.3\n  - @wagmi/connectors@5.8.5\n\n## 2.15.5\n\n### Patch Changes\n\n- Updated dependencies [[`3a90f358820444a85bb727742b0a16eb943fc361`](https://github.com/wevm/wagmi/commit/3a90f358820444a85bb727742b0a16eb943fc361)]:\n  - @wagmi/connectors@5.8.4\n\n## 2.15.4\n\n### Patch Changes\n\n- Updated dependencies [[`42b1fed58e9ac09da0f8ebf3e9271f98a707aaac`](https://github.com/wevm/wagmi/commit/42b1fed58e9ac09da0f8ebf3e9271f98a707aaac)]:\n  - @wagmi/connectors@5.8.3\n\n## 2.15.3\n\n### Patch Changes\n\n- Updated dependencies [[`29297a48af72b537173d948ccd2fe37d39914c66`](https://github.com/wevm/wagmi/commit/29297a48af72b537173d948ccd2fe37d39914c66), [`07370106d5fb6b8fe300992d93abf25b3d0eaf57`](https://github.com/wevm/wagmi/commit/07370106d5fb6b8fe300992d93abf25b3d0eaf57)]:\n  - @wagmi/core@2.17.2\n  - @wagmi/connectors@5.8.2\n\n## 2.15.2\n\n### Patch Changes\n\n- [#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`.\n\n- Updated dependencies [[`01f64e64fa4f85cdd30023903f972f4f9023681f`](https://github.com/wevm/wagmi/commit/01f64e64fa4f85cdd30023903f972f4f9023681f)]:\n  - @wagmi/core@2.17.1\n  - @wagmi/connectors@5.8.1\n\n## 2.15.1\n\n### Patch Changes\n\n- Updated dependencies [[`cc5517ff6880bb630f1b201930acc20dd1a0b451`](https://github.com/wevm/wagmi/commit/cc5517ff6880bb630f1b201930acc20dd1a0b451)]:\n  - @wagmi/connectors@5.8.0\n\n## 2.15.0\n\n### Minor Changes\n\n- [#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.\n\n### Patch Changes\n\n- Updated dependencies [[`88427b2bcd13ec375ef519e9ad1ccffef9f02a7b`](https://github.com/wevm/wagmi/commit/88427b2bcd13ec375ef519e9ad1ccffef9f02a7b), [`799ee4d4b23c2ecd64e3f3668e67634e81939719`](https://github.com/wevm/wagmi/commit/799ee4d4b23c2ecd64e3f3668e67634e81939719), [`3f8b2edc4f237cccff1009bcef03d51ca27a7324`](https://github.com/wevm/wagmi/commit/3f8b2edc4f237cccff1009bcef03d51ca27a7324)]:\n  - @wagmi/connectors@6.0.0\n  - @wagmi/core@2.17.0\n\n## 2.14.16\n\n### Patch Changes\n\n- Updated dependencies [[`b59c024b23c69f5459b17390531207cfdf126ce4`](https://github.com/wevm/wagmi/commit/b59c024b23c69f5459b17390531207cfdf126ce4)]:\n  - @wagmi/connectors@5.7.12\n\n## 2.14.15\n\n### Patch Changes\n\n- [`a4bd0623eed28e3761a27295831a60ad835f0ee0`](https://github.com/wevm/wagmi/commit/a4bd0623eed28e3761a27295831a60ad835f0ee0) Thanks [@jxom](https://github.com/jxom)! - **Experimental (EIP-5792):** Updated `id` parameter to be optional on `useWaitForCallsStatus`.\n\n- Updated dependencies [[`a4bd0623eed28e3761a27295831a60ad835f0ee0`](https://github.com/wevm/wagmi/commit/a4bd0623eed28e3761a27295831a60ad835f0ee0)]:\n  - @wagmi/core@2.16.7\n  - @wagmi/connectors@5.7.11\n\n## 2.14.14\n\n### Patch Changes\n\n- [#4586](https://github.com/wevm/wagmi/pull/4586) [`edf47477b2f6385a1c3ae01d36a8498c47f30a0b`](https://github.com/wevm/wagmi/commit/edf47477b2f6385a1c3ae01d36a8498c47f30a0b) Thanks [@jxom](https://github.com/jxom)! - **Experimental (EIP-5792):** Added `waitForCallsStatus` + `useWaitForCallsStatus`.\n\n- Updated dependencies [[`edf47477b2f6385a1c3ae01d36a8498c47f30a0b`](https://github.com/wevm/wagmi/commit/edf47477b2f6385a1c3ae01d36a8498c47f30a0b), [`e944812ebc234a72c1417b77cff341166f5e0fef`](https://github.com/wevm/wagmi/commit/e944812ebc234a72c1417b77cff341166f5e0fef)]:\n  - @wagmi/core@2.16.6\n  - @wagmi/connectors@5.7.10\n\n## 2.14.13\n\n### Patch Changes\n\n- Updated dependencies [[`5b7101fddb61df56e34b2e02b46bc409e496eaf9`](https://github.com/wevm/wagmi/commit/5b7101fddb61df56e34b2e02b46bc409e496eaf9)]:\n  - @wagmi/connectors@5.7.9\n\n## 2.14.12\n\n### Patch Changes\n\n- [`d0c9a86921a4e939373cc6e763284e53f2a2e93c`](https://github.com/wevm/wagmi/commit/d0c9a86921a4e939373cc6e763284e53f2a2e93c) Thanks [@jxom](https://github.com/jxom)! - **Experimental (ERC-5792)**: Added support for `account: null` in `sendCalls` to cater for sending calls without a connected account (account will be filled by the wallet).\n\n- Updated dependencies [[`d0c9a86921a4e939373cc6e763284e53f2a2e93c`](https://github.com/wevm/wagmi/commit/d0c9a86921a4e939373cc6e763284e53f2a2e93c)]:\n  - @wagmi/core@2.16.5\n  - @wagmi/connectors@5.7.8\n\n## 2.14.11\n\n### Patch Changes\n\n- [`507f864d91238bfd423d0e36d3619eb9f6e52eec`](https://github.com/wevm/wagmi/commit/507f864d91238bfd423d0e36d3619eb9f6e52eec) Thanks [@jxom](https://github.com/jxom)! - Updated `@coinbase/wallet-sdk`.\n\n- Updated dependencies [[`507f864d91238bfd423d0e36d3619eb9f6e52eec`](https://github.com/wevm/wagmi/commit/507f864d91238bfd423d0e36d3619eb9f6e52eec)]:\n  - @wagmi/connectors@5.7.7\n  - @wagmi/core@2.16.4\n\n## 2.14.10\n\n### Patch Changes\n\n- Updated dependencies [[`639952c97f0fe3927106f42d3c9f7f366cdf7f7a`](https://github.com/wevm/wagmi/commit/639952c97f0fe3927106f42d3c9f7f366cdf7f7a), [`5aa2c095f7bfb6dfcf91c6945c3e1f9c9dd05766`](https://github.com/wevm/wagmi/commit/5aa2c095f7bfb6dfcf91c6945c3e1f9c9dd05766)]:\n  - @wagmi/connectors@5.7.6\n\n## 2.14.9\n\n### Patch Changes\n\n- Updated dependencies [[`a257e8d4f97431a4af872cda1817b4ae17c7bbed`](https://github.com/wevm/wagmi/commit/a257e8d4f97431a4af872cda1817b4ae17c7bbed)]:\n  - @wagmi/connectors@5.7.5\n\n## 2.14.8\n\n### Patch Changes\n\n- Updated dependencies [[`c8a257e0f6d2ece013b873895c35769a8a804fdc`](https://github.com/wevm/wagmi/commit/c8a257e0f6d2ece013b873895c35769a8a804fdc)]:\n  - @wagmi/connectors@5.7.4\n\n## 2.14.7\n\n### Patch Changes\n\n- [#4497](https://github.com/wevm/wagmi/pull/4497) [`00c144b21bac3f0797b683d8a4a81f7399c6e042`](https://github.com/wevm/wagmi/commit/00c144b21bac3f0797b683d8a4a81f7399c6e042) Thanks [@tmm](https://github.com/tmm)! - Bumped `use-sync-external-store` version for React 19.\n\n## 2.14.6\n\n### Patch Changes\n\n- [#4480](https://github.com/wevm/wagmi/pull/4480) [`384a1d91597622eb59e1c05dc13ce25017c5b6d8`](https://github.com/wevm/wagmi/commit/384a1d91597622eb59e1c05dc13ce25017c5b6d8) Thanks [@RodeRickIsWatching](https://github.com/RodeRickIsWatching)! - Fixed invocation of default storage.\n\n- Updated dependencies [[`384a1d91597622eb59e1c05dc13ce25017c5b6d8`](https://github.com/wevm/wagmi/commit/384a1d91597622eb59e1c05dc13ce25017c5b6d8)]:\n  - @wagmi/core@2.16.3\n  - @wagmi/connectors@5.7.3\n\n## 2.14.5\n\n### Patch Changes\n\n- [`012907032b532a438fce48f407470250cbc8f0c6`](https://github.com/wevm/wagmi/commit/012907032b532a438fce48f407470250cbc8f0c6) Thanks [@jxom](https://github.com/jxom)! - Fixed assignment in `getDefaultStorage`.\n\n- Updated dependencies [[`012907032b532a438fce48f407470250cbc8f0c6`](https://github.com/wevm/wagmi/commit/012907032b532a438fce48f407470250cbc8f0c6)]:\n  - @wagmi/core@2.16.2\n  - @wagmi/connectors@5.7.2\n\n## 2.14.4\n\n### Patch Changes\n\n- Updated dependencies [[`9c8c35a3b829f2c58edcd3a29e2dcd99974d7470`](https://github.com/wevm/wagmi/commit/9c8c35a3b829f2c58edcd3a29e2dcd99974d7470), [`3892ebd21c06beef4b28ece4e70d2a38807bce6f`](https://github.com/wevm/wagmi/commit/3892ebd21c06beef4b28ece4e70d2a38807bce6f)]:\n  - @wagmi/connectors@5.7.1\n  - @wagmi/core@2.16.1\n\n## 2.14.3\n\n### Patch Changes\n\n- Updated dependencies [[`e3f63a02c1f7d80481804584f262bc98dab0400d`](https://github.com/wevm/wagmi/commit/e3f63a02c1f7d80481804584f262bc98dab0400d)]:\n  - @wagmi/connectors@5.7.0\n\n## 2.14.2\n\n### Patch Changes\n\n- Updated dependencies [[`adf2253b10c6d4fc583e4bc9f01a8ef5ca267c85`](https://github.com/wevm/wagmi/commit/adf2253b10c6d4fc583e4bc9f01a8ef5ca267c85)]:\n  - @wagmi/connectors@5.6.2\n\n## 2.14.1\n\n### Patch Changes\n\n- Updated dependencies [[`987404f590c1d29ebb3cb68928f5e54aa032793d`](https://github.com/wevm/wagmi/commit/987404f590c1d29ebb3cb68928f5e54aa032793d)]:\n  - @wagmi/connectors@5.6.1\n\n## 2.14.0\n\n### Minor Changes\n\n- [#4453](https://github.com/wevm/wagmi/pull/4453) [`070e48480194c8d7f45bda1d7dd1346e6f5d7227`](https://github.com/wevm/wagmi/commit/070e48480194c8d7f45bda1d7dd1346e6f5d7227) Thanks [@tmm](https://github.com/tmm)! - Added support to `useConnect` for custom `connector.connect` parameters.\n\n### Patch Changes\n\n- Updated dependencies [[`afea6b67822a7a2b96901ec851441d27ee0f7a52`](https://github.com/wevm/wagmi/commit/afea6b67822a7a2b96901ec851441d27ee0f7a52), [`070e48480194c8d7f45bda1d7dd1346e6f5d7227`](https://github.com/wevm/wagmi/commit/070e48480194c8d7f45bda1d7dd1346e6f5d7227), [`8b0726c1106fce88b782e676498eabf0718b2619`](https://github.com/wevm/wagmi/commit/8b0726c1106fce88b782e676498eabf0718b2619)]:\n  - @wagmi/connectors@5.6.0\n  - @wagmi/core@2.16.0\n\n## 2.13.5\n\n### Patch Changes\n\n- [#4447](https://github.com/wevm/wagmi/pull/4447) [`244f7777d9d227b3134d4cb9b9dda64f50cbddd3`](https://github.com/wevm/wagmi/commit/244f7777d9d227b3134d4cb9b9dda64f50cbddd3) Thanks [@Aerilym](https://github.com/Aerilym)! - Fixed config parameter passing in useSimulateContract and useEstimateGas\n\n## 2.13.4\n\n### Patch Changes\n\n- [`2f79a3da4872d6158569017b1927a07a1ff5e7ba`](https://github.com/wevm/wagmi/commit/2f79a3da4872d6158569017b1927a07a1ff5e7ba) Thanks [@tmm](https://github.com/tmm)! - Exported `injected` and `mock`.\n\n## 2.13.3\n\n### Patch Changes\n\n- [#4433](https://github.com/wevm/wagmi/pull/4433) [`06e186cd679b27fe195309110e766fcf46d4efbc`](https://github.com/wevm/wagmi/commit/06e186cd679b27fe195309110e766fcf46d4efbc) Thanks [@Aerilym](https://github.com/Aerilym)! - Bumped Metamask SDK version to `0.31.1`.\n\n- Updated dependencies [[`06e186cd679b27fe195309110e766fcf46d4efbc`](https://github.com/wevm/wagmi/commit/06e186cd679b27fe195309110e766fcf46d4efbc)]:\n  - @wagmi/connectors@5.5.3\n  - @wagmi/core@2.15.2\n\n## 2.13.2\n\n### Patch Changes\n\n- Updated dependencies [[`e563ef69130a511fd6f3f72ed4cd4fbe1390541f`](https://github.com/wevm/wagmi/commit/e563ef69130a511fd6f3f72ed4cd4fbe1390541f)]:\n  - @wagmi/connectors@5.5.2\n\n## 2.13.1\n\n### Patch Changes\n\n- [`b8bbb409f4934538e3dd6cac5aaf7346292d0693`](https://github.com/wevm/wagmi/commit/b8bbb409f4934538e3dd6cac5aaf7346292d0693) Thanks [@jxom](https://github.com/jxom)! - Fixed issue where `null` gas would accidentally pass through.\n\n- Updated dependencies [[`b8bbb409f4934538e3dd6cac5aaf7346292d0693`](https://github.com/wevm/wagmi/commit/b8bbb409f4934538e3dd6cac5aaf7346292d0693)]:\n  - @wagmi/core@2.15.1\n  - @wagmi/connectors@5.5.1\n\n## 2.13.0\n\n### Minor Changes\n\n- [#4417](https://github.com/wevm/wagmi/pull/4417) [`42e65ea4fea99c639817088bba915e0933d17141`](https://github.com/wevm/wagmi/commit/42e65ea4fea99c639817088bba915e0933d17141) Thanks [@jxom](https://github.com/jxom)! - Removed simulation in `writeContract` & `sendTransaction`.\n\n### Patch Changes\n\n- Updated dependencies [[`42e65ea4fea99c639817088bba915e0933d17141`](https://github.com/wevm/wagmi/commit/42e65ea4fea99c639817088bba915e0933d17141)]:\n  - @wagmi/connectors@6.0.0\n  - @wagmi/core@2.15.0\n\n## 2.12.33\n\n### Patch Changes\n\n- Updated dependencies [[`7ca62b44cd997d48f92c2b81343726a5908aa00b`](https://github.com/wevm/wagmi/commit/7ca62b44cd997d48f92c2b81343726a5908aa00b)]:\n  - @wagmi/connectors@5.4.0\n\n## 2.12.32\n\n### Patch Changes\n\n- Updated dependencies [[`a13aa8d7c38eb3cc8171a02d6302e6d12cf6bcb3`](https://github.com/wevm/wagmi/commit/a13aa8d7c38eb3cc8171a02d6302e6d12cf6bcb3), [`a13aa8d7c38eb3cc8171a02d6302e6d12cf6bcb3`](https://github.com/wevm/wagmi/commit/a13aa8d7c38eb3cc8171a02d6302e6d12cf6bcb3)]:\n  - @wagmi/core@2.14.6\n  - @wagmi/connectors@5.3.10\n\n## 2.12.31\n\n### Patch Changes\n\n- Updated dependencies [[`b12a04eeec985c48d2feac94b011d41fb29ca23e`](https://github.com/wevm/wagmi/commit/b12a04eeec985c48d2feac94b011d41fb29ca23e)]:\n  - @wagmi/connectors@5.3.9\n\n## 2.12.30\n\n### Patch Changes\n\n- Updated dependencies [[`6b9bbacdc7bffd44fc2165362a5e65fd434e7646`](https://github.com/wevm/wagmi/commit/6b9bbacdc7bffd44fc2165362a5e65fd434e7646), [`dac62dc99a0679fa632a0fae49873d6053d06b35`](https://github.com/wevm/wagmi/commit/dac62dc99a0679fa632a0fae49873d6053d06b35)]:\n  - @wagmi/core@2.14.5\n  - @wagmi/connectors@5.3.8\n\n## 2.12.29\n\n### Patch Changes\n\n- Updated dependencies [[`e08681c81fbdf475213e2d0f4c5517d0abf4e743`](https://github.com/wevm/wagmi/commit/e08681c81fbdf475213e2d0f4c5517d0abf4e743)]:\n  - @wagmi/core@2.14.4\n  - @wagmi/connectors@5.3.7\n\n## 2.12.28\n\n### Patch Changes\n\n- Updated dependencies [[`7558ff3133c11bc4c49473d08ee9a47eaa12df5b`](https://github.com/wevm/wagmi/commit/7558ff3133c11bc4c49473d08ee9a47eaa12df5b)]:\n  - @wagmi/connectors@5.3.6\n\n## 2.12.27\n\n### Patch Changes\n\n- Updated dependencies [[`cb7dd2ebb871d0be8f1a11a8cd8ce592cd74b7c7`](https://github.com/wevm/wagmi/commit/cb7dd2ebb871d0be8f1a11a8cd8ce592cd74b7c7), [`7fe78f2d09778fc01fd0cffe85ba198e64999275`](https://github.com/wevm/wagmi/commit/7fe78f2d09778fc01fd0cffe85ba198e64999275)]:\n  - @wagmi/core@2.14.3\n  - @wagmi/connectors@5.3.5\n\n## 2.12.26\n\n### Patch Changes\n\n- Updated dependencies [[`b6861a4c378dab78d8751ae0ac2aa425f3c24b8f`](https://github.com/wevm/wagmi/commit/b6861a4c378dab78d8751ae0ac2aa425f3c24b8f), [`d0d0963bb5904a15cf0355862d62dd141ce0c31c`](https://github.com/wevm/wagmi/commit/d0d0963bb5904a15cf0355862d62dd141ce0c31c), [`ecac0ba36243d94c9199d0bd21937104c835d9a0`](https://github.com/wevm/wagmi/commit/ecac0ba36243d94c9199d0bd21937104c835d9a0)]:\n  - @wagmi/connectors@5.3.4\n  - @wagmi/core@2.14.2\n\n## 2.12.25\n\n### Patch Changes\n\n- Updated dependencies [[`83c6d16b7d6dddfa6bda036e04f00ec313c6248c`](https://github.com/wevm/wagmi/commit/83c6d16b7d6dddfa6bda036e04f00ec313c6248c)]:\n  - @wagmi/connectors@5.3.3\n\n## 2.12.24\n\n### Patch Changes\n\n- [`a4c5389c1a299bd7acf9df4a0d607e2ced709280`](https://github.com/wevm/wagmi/commit/a4c5389c1a299bd7acf9df4a0d607e2ced709280) Thanks [@jxom](https://github.com/jxom)! - Exported `Transport` type (for inference).\n\n## 2.12.23\n\n### Patch Changes\n\n- Updated dependencies [[`8970cc51398e1ac713435533096215c6d31ffdf9`](https://github.com/wevm/wagmi/commit/8970cc51398e1ac713435533096215c6d31ffdf9)]:\n  - @wagmi/connectors@5.3.2\n\n## 2.12.22\n\n### Patch Changes\n\n- Updated dependencies [[`052e72e1f8c1c14fcbdce04a9f8fa7ec28d83702`](https://github.com/wevm/wagmi/commit/052e72e1f8c1c14fcbdce04a9f8fa7ec28d83702), [`b250fc21ee577b2a75c5a34ff684f62fb4ad771a`](https://github.com/wevm/wagmi/commit/b250fc21ee577b2a75c5a34ff684f62fb4ad771a)]:\n  - @wagmi/core@2.14.1\n  - @wagmi/connectors@5.3.1\n\n## 2.12.21\n\n### Patch Changes\n\n- Updated dependencies [[`f43e074f473820b208a6295d7c97f847332f1a1d`](https://github.com/wevm/wagmi/commit/f43e074f473820b208a6295d7c97f847332f1a1d)]:\n  - @wagmi/connectors@6.0.0\n  - @wagmi/core@2.14.0\n\n## 2.12.20\n\n### Patch Changes\n\n- Updated dependencies [[`c05caabc20c3ced9682cfc7ba1f3f7dcfece0703`](https://github.com/wevm/wagmi/commit/c05caabc20c3ced9682cfc7ba1f3f7dcfece0703), [`5ae49af590ff168426c9c283d54c34ae5148fcd9`](https://github.com/wevm/wagmi/commit/5ae49af590ff168426c9c283d54c34ae5148fcd9), [`f3182b22e6e454d9bd74f1b940ef34431fd9555d`](https://github.com/wevm/wagmi/commit/f3182b22e6e454d9bd74f1b940ef34431fd9555d)]:\n  - @wagmi/core@2.13.9\n  - @wagmi/connectors@5.2.2\n\n## 2.12.19\n\n### Patch Changes\n\n- Updated dependencies [[`91a40f2db08e3a91db421b8732a5511a1e6c88fd`](https://github.com/wevm/wagmi/commit/91a40f2db08e3a91db421b8732a5511a1e6c88fd)]:\n  - @wagmi/connectors@5.2.1\n\n## 2.12.18\n\n### Patch Changes\n\n- Updated dependencies [[`34a0c3b7eea778aee7c27f7ace5e4b2be4e8a0a4`](https://github.com/wevm/wagmi/commit/34a0c3b7eea778aee7c27f7ace5e4b2be4e8a0a4)]:\n  - @wagmi/connectors@5.2.0\n\n## 2.12.17\n\n### Patch Changes\n\n- Updated dependencies [[`3b2123664b7ac66848390739e855c3b9702ab60c`](https://github.com/wevm/wagmi/commit/3b2123664b7ac66848390739e855c3b9702ab60c)]:\n  - @wagmi/connectors@5.1.15\n\n## 2.12.16\n\n### Patch Changes\n\n- Updated dependencies [[`56f2482508f2ba71bd6b0295c70c6abca7101e57`](https://github.com/wevm/wagmi/commit/56f2482508f2ba71bd6b0295c70c6abca7101e57)]:\n  - @wagmi/connectors@5.1.14\n  - @wagmi/core@2.13.8\n\n## 2.12.15\n\n### Patch Changes\n\n- [#4229](https://github.com/wevm/wagmi/pull/4229) [`c6b8efd26254c8e692b2b67286ed538fc183b992`](https://github.com/wevm/wagmi/commit/c6b8efd26254c8e692b2b67286ed538fc183b992) Thanks [@weilliao05621](https://github.com/weilliao05621)! - Stabilized `useAccount` return type object reference.\n\n## 2.12.14\n\n### Patch Changes\n\n- Updated dependencies [[`be75c2d4ef636d7362420ab0a106bfdf63f5d1e6`](https://github.com/wevm/wagmi/commit/be75c2d4ef636d7362420ab0a106bfdf63f5d1e6)]:\n  - @wagmi/core@2.13.7\n  - @wagmi/connectors@5.1.13\n\n## 2.12.13\n\n### Patch Changes\n\n- Updated dependencies [[`edcbf5d6fbe92f639bead800502edda9e0aa39f1`](https://github.com/wevm/wagmi/commit/edcbf5d6fbe92f639bead800502edda9e0aa39f1)]:\n  - @wagmi/core@2.13.6\n  - @wagmi/connectors@5.1.12\n\n## 2.12.12\n\n### Patch Changes\n\n- Updated dependencies [[`82404c960e04c83e0bae6e1e12459ef9debf9554`](https://github.com/wevm/wagmi/commit/82404c960e04c83e0bae6e1e12459ef9debf9554), [`d07ad7f63a018256908a673d078aaf79e47ac703`](https://github.com/wevm/wagmi/commit/d07ad7f63a018256908a673d078aaf79e47ac703)]:\n  - @wagmi/connectors@5.1.11\n\n## 2.12.11\n\n### Patch Changes\n\n- [#4262](https://github.com/wevm/wagmi/pull/4262) [`8531f83db3a1fbb8202c3e426b7f85679f587a52`](https://github.com/wevm/wagmi/commit/8531f83db3a1fbb8202c3e426b7f85679f587a52) Thanks [@nezouse](https://github.com/nezouse)! - Added experimental actions entrypoint.\n\n## 2.12.10\n\n### Patch Changes\n\n- [#4260](https://github.com/wevm/wagmi/pull/4260) [`969a208a110b760a13fd7263360320f52440a9b6`](https://github.com/wevm/wagmi/commit/969a208a110b760a13fd7263360320f52440a9b6) Thanks [@tmm](https://github.com/tmm)! - Fixed `useReadContract` deployless reads support.\n\n- [#4259](https://github.com/wevm/wagmi/pull/4259) [`f47ce8f6d263e49fdff90b8edb3190142d2657bb`](https://github.com/wevm/wagmi/commit/f47ce8f6d263e49fdff90b8edb3190142d2657bb) Thanks [@tmm](https://github.com/tmm)! - Disabled `useConnectorClient` and `useWalletClient` during reconnection if connector is not fully restored.\n\n- Updated dependencies [[`81de006e66121a18c61945c1f9b8426c83a5713c`](https://github.com/wevm/wagmi/commit/81de006e66121a18c61945c1f9b8426c83a5713c), [`f47ce8f6d263e49fdff90b8edb3190142d2657bb`](https://github.com/wevm/wagmi/commit/f47ce8f6d263e49fdff90b8edb3190142d2657bb)]:\n  - @wagmi/connectors@5.1.10\n  - @wagmi/core@2.13.5\n\n## 2.12.9\n\n### Patch Changes\n\n- Updated dependencies [[`21bd0e473d374cbbd7a01bececa6022d529026ba`](https://github.com/wevm/wagmi/commit/21bd0e473d374cbbd7a01bececa6022d529026ba), [`5c89c6853e616437a3be2b019db895451fecfb3c`](https://github.com/wevm/wagmi/commit/5c89c6853e616437a3be2b019db895451fecfb3c)]:\n  - @wagmi/connectors@5.1.9\n\n## 2.12.8\n\n### Patch Changes\n\n- Updated dependencies [[`b580ad4edff1721e0b9d138cf5ae2ec74d2374c7`](https://github.com/wevm/wagmi/commit/b580ad4edff1721e0b9d138cf5ae2ec74d2374c7)]:\n  - @wagmi/connectors@5.1.8\n\n## 2.12.7\n\n### Patch Changes\n\n- Updated dependencies [[`91fd81a068789c5020e891f539bcad8f54a7a52f`](https://github.com/wevm/wagmi/commit/91fd81a068789c5020e891f539bcad8f54a7a52f)]:\n  - @wagmi/connectors@5.1.7\n\n## 2.12.6\n\n### Patch Changes\n\n- Updated dependencies [[`3168616298cbb6135d0ffda771cba4126e83eba8`](https://github.com/wevm/wagmi/commit/3168616298cbb6135d0ffda771cba4126e83eba8), [`d7608ef9a79459465dc8c06a2ab740465c881907`](https://github.com/wevm/wagmi/commit/d7608ef9a79459465dc8c06a2ab740465c881907)]:\n  - @wagmi/connectors@5.1.6\n\n## 2.12.5\n\n### Patch Changes\n\n- Updated dependencies [[`b4c8971788c70b09479946ecfa998cff2f1b3953`](https://github.com/wevm/wagmi/commit/b4c8971788c70b09479946ecfa998cff2f1b3953)]:\n  - @wagmi/core@2.13.4\n  - @wagmi/connectors@5.1.5\n\n## 2.12.4\n\n### Patch Changes\n\n- Updated dependencies [[`871dbdbfe59ac8ad01d1ec6150ea7b091b7b7de4`](https://github.com/wevm/wagmi/commit/871dbdbfe59ac8ad01d1ec6150ea7b091b7b7de4)]:\n  - @wagmi/core@2.13.3\n  - @wagmi/connectors@5.1.4\n\n## 2.12.3\n\n### Patch Changes\n\n- Updated dependencies [[`1b9b523fa9b9dfe839aecdf4b40caa9547d7e594`](https://github.com/wevm/wagmi/commit/1b9b523fa9b9dfe839aecdf4b40caa9547d7e594)]:\n  - @wagmi/core@2.13.2\n  - @wagmi/connectors@5.1.3\n\n## 2.12.2\n\n### Patch Changes\n\n- Updated dependencies [[`abb490dac4f0f02f46cb0878e7ca9a0db6aada56`](https://github.com/wevm/wagmi/commit/abb490dac4f0f02f46cb0878e7ca9a0db6aada56), [`28e0e5c9a4f856583f9d36a807502bd51a0c6ec2`](https://github.com/wevm/wagmi/commit/28e0e5c9a4f856583f9d36a807502bd51a0c6ec2)]:\n  - @wagmi/connectors@5.1.2\n\n## 2.12.1\n\n### Patch Changes\n\n- Updated dependencies [[`07c1227f306d0efb9421d4bb77a774f92f5fcf45`](https://github.com/wevm/wagmi/commit/07c1227f306d0efb9421d4bb77a774f92f5fcf45)]:\n  - @wagmi/core@2.13.1\n  - @wagmi/connectors@5.1.1\n\n## 2.12.0\n\n### Minor Changes\n\n- [#4162](https://github.com/wevm/wagmi/pull/4162) [`a73a7737b756886b388f120ae423e72cca53e8a0`](https://github.com/wevm/wagmi/commit/a73a7737b756886b388f120ae423e72cca53e8a0) Thanks [@jxom](https://github.com/jxom)! - Added functionality for consumer-defined RPC URLs (`config.transports`) to be propagated to the WalletConnect & MetaMask Connectors.\n\n### Patch Changes\n\n- Updated dependencies [[`a73a7737b756886b388f120ae423e72cca53e8a0`](https://github.com/wevm/wagmi/commit/a73a7737b756886b388f120ae423e72cca53e8a0)]:\n  - @wagmi/connectors@6.0.0\n  - @wagmi/core@2.13.0\n\n## 2.11.3\n\n### Patch Changes\n\n- [#4124](https://github.com/wevm/wagmi/pull/4124) [`26616462db2e0140025f22c505c4541cfecb9308`](https://github.com/wevm/wagmi/commit/26616462db2e0140025f22c505c4541cfecb9308) Thanks [@t0rbik](https://github.com/t0rbik)! - Updated `useConnectorClient` to be enabled when status is `'reconnecting'` or `'connected'` (previously was also enabled when status was `'connecting'`).\n\n## 2.11.2\n\n### Patch Changes\n\n- Updated dependencies [[`5bc8c8877810b2eec24a829df87dce40a51e6f20`](https://github.com/wevm/wagmi/commit/5bc8c8877810b2eec24a829df87dce40a51e6f20), [`8d81df5cc884d0a210dedd3c1ea0e2e9e52b83c5`](https://github.com/wevm/wagmi/commit/8d81df5cc884d0a210dedd3c1ea0e2e9e52b83c5)]:\n  - @wagmi/core@2.12.2\n  - @wagmi/connectors@5.0.26\n\n## 2.11.1\n\n### Patch Changes\n\n- [#4146](https://github.com/wevm/wagmi/pull/4146) [`cc996e08e930c9e88cf753a1e874652059e81a3b`](https://github.com/wevm/wagmi/commit/cc996e08e930c9e88cf753a1e874652059e81a3b) Thanks [@jxom](https://github.com/jxom)! - Updated `@safe-global/safe-apps-sdk` + `@safe-global/safe-apps-provider` dependencies.\n\n- Updated dependencies [[`cc996e08e930c9e88cf753a1e874652059e81a3b`](https://github.com/wevm/wagmi/commit/cc996e08e930c9e88cf753a1e874652059e81a3b)]:\n  - @wagmi/connectors@5.0.25\n  - @wagmi/core@2.12.1\n\n## 2.11.0\n\n### Minor Changes\n\n- [#4128](https://github.com/wevm/wagmi/pull/4128) [`5581a810ef70308e99c6f8b630cd4bca59f64afc`](https://github.com/wevm/wagmi/commit/5581a810ef70308e99c6f8b630cd4bca59f64afc) Thanks [@dalechyn](https://github.com/dalechyn)! - Added `useWatchAsset` hook.\n\n### Patch Changes\n\n- Updated dependencies [[`5581a810ef70308e99c6f8b630cd4bca59f64afc`](https://github.com/wevm/wagmi/commit/5581a810ef70308e99c6f8b630cd4bca59f64afc)]:\n  - @wagmi/core@2.12.0\n  - @wagmi/connectors@6.0.0\n\n## 2.10.11\n\n### Patch Changes\n\n- [`d3814ab4b88f9f0e052b53bc3d458df87b43f01d`](https://github.com/wevm/wagmi/commit/d3814ab4b88f9f0e052b53bc3d458df87b43f01d) Thanks [@jxom](https://github.com/jxom)! - Updated `mipd` dependency.\n\n- Updated dependencies [[`b08013eaa9ce97c02f8a7128ea400e3da7ef74bb`](https://github.com/wevm/wagmi/commit/b08013eaa9ce97c02f8a7128ea400e3da7ef74bb), [`d3814ab4b88f9f0e052b53bc3d458df87b43f01d`](https://github.com/wevm/wagmi/commit/d3814ab4b88f9f0e052b53bc3d458df87b43f01d)]:\n  - @wagmi/core@2.11.8\n  - @wagmi/connectors@5.0.23\n\n## 2.10.10\n\n### Patch Changes\n\n- Updated dependencies [[`0bb8b562ae04ecfeb2d6b2f1b980ebae31dc127e`](https://github.com/wevm/wagmi/commit/0bb8b562ae04ecfeb2d6b2f1b980ebae31dc127e)]:\n  - @wagmi/connectors@5.0.22\n  - @wagmi/core@2.11.7\n\n## 2.10.9\n\n### Patch Changes\n\n- [#4060](https://github.com/wevm/wagmi/pull/4060) [`95965c1f19d480b97f2b297a077a9e607dee32ad`](https://github.com/wevm/wagmi/commit/95965c1f19d480b97f2b297a077a9e607dee32ad) Thanks [@dalechyn](https://github.com/dalechyn)! - Bumped Tanstack Query dependencies to fix typing issues between exported Wagmi query options and TanStack Query suspense query methods (due to [`direction` property in `QueryFunctionContext` being deprecated](https://github.com/TanStack/query/pull/7410)).\n\n- Updated dependencies [[`ff0760b5900114bcfdf420a9fba3cc278ac95afe`](https://github.com/wevm/wagmi/commit/ff0760b5900114bcfdf420a9fba3cc278ac95afe), [`95965c1f19d480b97f2b297a077a9e607dee32ad`](https://github.com/wevm/wagmi/commit/95965c1f19d480b97f2b297a077a9e607dee32ad)]:\n  - @wagmi/connectors@5.0.21\n  - @wagmi/core@2.11.6\n\n## 2.10.8\n\n### Patch Changes\n\n- Updated dependencies [[`43fa971d34cac57fa5a2898ad4d839b95d7af37c`](https://github.com/wevm/wagmi/commit/43fa971d34cac57fa5a2898ad4d839b95d7af37c)]:\n  - @wagmi/connectors@5.0.20\n\n## 2.10.7\n\n### Patch Changes\n\n- Updated dependencies [[`b7ad208030d9f2e3f89912ff76b16cdbd848feda`](https://github.com/wevm/wagmi/commit/b7ad208030d9f2e3f89912ff76b16cdbd848feda)]:\n  - @wagmi/connectors@5.0.19\n\n## 2.10.6\n\n### Patch Changes\n\n- Updated dependencies [[`44d24620c9e3957f3245d14d6a042736371df70b`](https://github.com/wevm/wagmi/commit/44d24620c9e3957f3245d14d6a042736371df70b)]:\n  - @wagmi/connectors@5.0.18\n\n## 2.10.5\n\n### Patch Changes\n\n- Updated dependencies [[`04f2b846b113f3d300d82c9fa75212f1805817c5`](https://github.com/wevm/wagmi/commit/04f2b846b113f3d300d82c9fa75212f1805817c5)]:\n  - @wagmi/core@2.11.5\n  - @wagmi/connectors@5.0.17\n\n## 2.10.4\n\n### Patch Changes\n\n- Updated dependencies [[`9e8345cd56186b997b5e56deaa2cfc69b30d15f6`](https://github.com/wevm/wagmi/commit/9e8345cd56186b997b5e56deaa2cfc69b30d15f6), [`02c38c28d1aa0ad7a61c33775de603ed974c5c1b`](https://github.com/wevm/wagmi/commit/02c38c28d1aa0ad7a61c33775de603ed974c5c1b)]:\n  - @wagmi/core@2.11.4\n  - @wagmi/connectors@5.0.16\n\n## 2.10.3\n\n### Patch Changes\n\n- Updated dependencies [[`8974e6269bb5d7bfaa90db0246bc7d13e8bff798`](https://github.com/wevm/wagmi/commit/8974e6269bb5d7bfaa90db0246bc7d13e8bff798)]:\n  - @wagmi/core@2.11.3\n  - @wagmi/connectors@5.0.15\n\n## 2.10.2\n\n### Patch Changes\n\n- Updated dependencies [[`b4d9ef79deb554ee20fed6666a474be5e7cdd522`](https://github.com/wevm/wagmi/commit/b4d9ef79deb554ee20fed6666a474be5e7cdd522)]:\n  - @wagmi/core@2.11.2\n  - @wagmi/connectors@5.0.14\n\n## 2.10.1\n\n### Patch Changes\n\n- Updated dependencies [[`9c862d8d63e3d692a22cef2a90782b74a9103f17`](https://github.com/wevm/wagmi/commit/9c862d8d63e3d692a22cef2a90782b74a9103f17)]:\n  - @wagmi/connectors@5.0.13\n  - @wagmi/core@2.11.1\n\n## 2.10.0\n\n### Minor Changes\n\n- [#3816](https://github.com/wevm/wagmi/pull/3816) [`06bb598a7f04c7b167f5b7ff6d46bd15886a6a14`](https://github.com/wevm/wagmi/commit/06bb598a7f04c7b167f5b7ff6d46bd15886a6a14) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Added `useDeployContract` hook.\n\n### Patch Changes\n\n- Updated dependencies [[`06bb598a7f04c7b167f5b7ff6d46bd15886a6a14`](https://github.com/wevm/wagmi/commit/06bb598a7f04c7b167f5b7ff6d46bd15886a6a14), [`24a45b269bd0214a29d6f82a84ac66ef8c3f3822`](https://github.com/wevm/wagmi/commit/24a45b269bd0214a29d6f82a84ac66ef8c3f3822)]:\n  - @wagmi/core@2.11.0\n  - @wagmi/connectors@6.0.0\n\n## 2.9.12\n\n### Patch Changes\n\n- Updated dependencies [[`f2a7cefab96691ebed8b8e45ffde071c47b58dbe`](https://github.com/wevm/wagmi/commit/f2a7cefab96691ebed8b8e45ffde071c47b58dbe), [`f0ea0b2a7fe193dadfeb49a4c8031ee451c638b5`](https://github.com/wevm/wagmi/commit/f0ea0b2a7fe193dadfeb49a4c8031ee451c638b5), [`e3b124ce414b8fd1b2214e2c5a28dc72158a13d1`](https://github.com/wevm/wagmi/commit/e3b124ce414b8fd1b2214e2c5a28dc72158a13d1)]:\n  - @wagmi/core@2.10.6\n  - @wagmi/connectors@5.0.11\n\n## 2.9.11\n\n### Patch Changes\n\n- Updated dependencies [[`560952acd4bfe33db6c7c07b35c613cef278677c`](https://github.com/wevm/wagmi/commit/560952acd4bfe33db6c7c07b35c613cef278677c)]:\n  - @wagmi/connectors@5.0.10\n\n## 2.9.10\n\n### Patch Changes\n\n- Updated dependencies [[`32cdd7b7dc5aff916c040628519562c3a99d418d`](https://github.com/wevm/wagmi/commit/32cdd7b7dc5aff916c040628519562c3a99d418d)]:\n  - @wagmi/connectors@5.0.9\n\n## 2.9.9\n\n### Patch Changes\n\n- Updated dependencies [[`c1952d1ff7f0a491dc88595a49159451b07b5621`](https://github.com/wevm/wagmi/commit/c1952d1ff7f0a491dc88595a49159451b07b5621)]:\n  - @wagmi/connectors@5.0.8\n\n## 2.9.8\n\n### Patch Changes\n\n- Updated dependencies [[`030c7c2cb380dfd67a2182f62e2aa7a6e1601898`](https://github.com/wevm/wagmi/commit/030c7c2cb380dfd67a2182f62e2aa7a6e1601898)]:\n  - @wagmi/core@2.10.5\n  - @wagmi/connectors@5.0.7\n\n## 2.9.7\n\n### Patch Changes\n\n- Updated dependencies [[`51fde8a0433b4fff357c1a8d7e08b41b4c86c968`](https://github.com/wevm/wagmi/commit/51fde8a0433b4fff357c1a8d7e08b41b4c86c968)]:\n  - @wagmi/core@2.10.4\n  - @wagmi/connectors@5.0.6\n\n## 2.9.6\n\n### Patch Changes\n\n- Updated dependencies [[`70dd28669dd8d2ce08217cd02e29a8fbba7a08d4`](https://github.com/wevm/wagmi/commit/70dd28669dd8d2ce08217cd02e29a8fbba7a08d4)]:\n  - @wagmi/connectors@5.0.5\n\n## 2.9.5\n\n### Patch Changes\n\n- Updated dependencies [[`be9e1b8a9818b92eb0654a20d9471e9e39329e7e`](https://github.com/wevm/wagmi/commit/be9e1b8a9818b92eb0654a20d9471e9e39329e7e)]:\n  - @wagmi/connectors@5.0.4\n\n## 2.9.4\n\n### Patch Changes\n\n- Updated dependencies [[`2804a8a583b1874271154898b4bae38756ef581c`](https://github.com/wevm/wagmi/commit/2804a8a583b1874271154898b4bae38756ef581c), [`2804a8a583b1874271154898b4bae38756ef581c`](https://github.com/wevm/wagmi/commit/2804a8a583b1874271154898b4bae38756ef581c)]:\n  - @wagmi/connectors@5.0.3\n  - @wagmi/core@2.10.3\n\n## 2.9.3\n\n### Patch Changes\n\n- [`ec2f63f106fd468f28b43d3b88ab3e89aaf5e81a`](https://github.com/wevm/wagmi/commit/ec2f63f106fd468f28b43d3b88ab3e89aaf5e81a) Thanks [@tmm](https://github.com/tmm)! - Fixed `useSwitchChain` `chains` typing.\n\n## 2.9.2\n\n### Patch Changes\n\n- [#3940](https://github.com/wevm/wagmi/pull/3940) [`a5071f581dfdfb961718873643a2fc629101c72a`](https://github.com/wevm/wagmi/commit/a5071f581dfdfb961718873643a2fc629101c72a) Thanks [@jxom](https://github.com/jxom)! - Fixed usage of `metaMask` connector in Vite environments.\n\n- Updated dependencies [[`a5071f581dfdfb961718873643a2fc629101c72a`](https://github.com/wevm/wagmi/commit/a5071f581dfdfb961718873643a2fc629101c72a)]:\n  - @wagmi/connectors@5.0.2\n  - @wagmi/core@2.10.2\n\n## 2.9.1\n\n### Patch Changes\n\n- Bumped versions.\n\n- Updated dependencies []:\n  - @wagmi/connectors@5.0.1\n  - @wagmi/core@2.10.1\n\n## 2.9.0\n\n### Minor Changes\n\n- [#3928](https://github.com/wevm/wagmi/pull/3928) [`3117e71825f9c58a0d718f3d1686f1a191fa9cb1`](https://github.com/wevm/wagmi/commit/3117e71825f9c58a0d718f3d1686f1a191fa9cb1) Thanks [@tmm](https://github.com/tmm)! - Updated the default Coinbase SDK in `coinbaseWallet` Connector to v4.x.\n\n### Patch Changes\n\n- Updated dependencies [[`3117e71825f9c58a0d718f3d1686f1a191fa9cb1`](https://github.com/wevm/wagmi/commit/3117e71825f9c58a0d718f3d1686f1a191fa9cb1), [`3117e71825f9c58a0d718f3d1686f1a191fa9cb1`](https://github.com/wevm/wagmi/commit/3117e71825f9c58a0d718f3d1686f1a191fa9cb1)]:\n  - @wagmi/connectors@5.0.0\n  - @wagmi/core@2.10.0\n\n## 2.8.8\n\n### Patch Changes\n\n- [#3906](https://github.com/wevm/wagmi/pull/3906) [`32fcb4a31dde6b0206961d8ffe9c651f8a459c67`](https://github.com/wevm/wagmi/commit/32fcb4a31dde6b0206961d8ffe9c651f8a459c67) Thanks [@tmm](https://github.com/tmm)! - Added support for Vue.\n\n- Updated dependencies [[`32fcb4a31dde6b0206961d8ffe9c651f8a459c67`](https://github.com/wevm/wagmi/commit/32fcb4a31dde6b0206961d8ffe9c651f8a459c67)]:\n  - @wagmi/connectors@4.3.10\n  - @wagmi/core@2.9.8\n\n## 2.8.7\n\n### Patch Changes\n\n- [#3924](https://github.com/wevm/wagmi/pull/3924) [`1f58734f88458e0f6adb05c99f0c90f36ab286b8`](https://github.com/wevm/wagmi/commit/1f58734f88458e0f6adb05c99f0c90f36ab286b8) Thanks [@jxom](https://github.com/jxom)! - Refactored `isChainsStale` logic in `walletConnect` connector.\n\n- Updated dependencies [[`1f58734f88458e0f6adb05c99f0c90f36ab286b8`](https://github.com/wevm/wagmi/commit/1f58734f88458e0f6adb05c99f0c90f36ab286b8)]:\n  - @wagmi/connectors@4.3.9\n  - @wagmi/core@2.9.7\n\n## 2.8.6\n\n### Patch Changes\n\n- [#3917](https://github.com/wevm/wagmi/pull/3917) [`05948fdad5bb4a56b08916d45b3dec2cb1e5f55b`](https://github.com/wevm/wagmi/commit/05948fdad5bb4a56b08916d45b3dec2cb1e5f55b) Thanks [@jxom](https://github.com/jxom)! - Updated `@metamask/sdk`.\n\n- Updated dependencies [[`05948fdad5bb4a56b08916d45b3dec2cb1e5f55b`](https://github.com/wevm/wagmi/commit/05948fdad5bb4a56b08916d45b3dec2cb1e5f55b)]:\n  - @wagmi/connectors@4.3.8\n  - @wagmi/core@2.9.6\n\n## 2.8.5\n\n### Patch Changes\n\n- [`4fecbbb66d0aacd03b8c62a6455d11a33cde8f85`](https://github.com/wevm/wagmi/commit/4fecbbb66d0aacd03b8c62a6455d11a33cde8f85) Thanks [@jxom](https://github.com/jxom)! - Fixed address comparison in `getConnectorClient`.\n\n- Updated dependencies [[`4fecbbb66d0aacd03b8c62a6455d11a33cde8f85`](https://github.com/wevm/wagmi/commit/4fecbbb66d0aacd03b8c62a6455d11a33cde8f85)]:\n  - @wagmi/core@2.9.5\n  - @wagmi/connectors@4.3.7\n\n## 2.8.4\n\n### Patch Changes\n\n- Updated dependencies [[`e6139a97c4b8804d734b1547b5e3921ce01fbe24`](https://github.com/wevm/wagmi/commit/e6139a97c4b8804d734b1547b5e3921ce01fbe24)]:\n  - @wagmi/core@2.9.4\n  - @wagmi/connectors@4.3.6\n\n## 2.8.3\n\n### Patch Changes\n\n- [#3904](https://github.com/wevm/wagmi/pull/3904) [`addca28ebc20f1a4367c35fe9ef786decff9c87e`](https://github.com/wevm/wagmi/commit/addca28ebc20f1a4367c35fe9ef786decff9c87e) Thanks [@jxom](https://github.com/jxom)! - Updated `@walletconnect/ethereum-provider`.\n\n- Updated dependencies [[`addca28ebc20f1a4367c35fe9ef786decff9c87e`](https://github.com/wevm/wagmi/commit/addca28ebc20f1a4367c35fe9ef786decff9c87e)]:\n  - @wagmi/connectors@4.3.5\n  - @wagmi/core@2.9.3\n\n## 2.8.2\n\n### Patch Changes\n\n- [#3902](https://github.com/wevm/wagmi/pull/3902) [`204b7b624612405500ec098fb9e35facd3f74ca4`](https://github.com/wevm/wagmi/commit/204b7b624612405500ec098fb9e35facd3f74ca4) Thanks [@jxom](https://github.com/jxom)! - Made third-party SDK imports type-only.\n\n- Updated dependencies [[`204b7b624612405500ec098fb9e35facd3f74ca4`](https://github.com/wevm/wagmi/commit/204b7b624612405500ec098fb9e35facd3f74ca4)]:\n  - @wagmi/connectors@4.3.4\n  - @wagmi/core@2.9.2\n\n## 2.8.1\n\n### Patch Changes\n\n- [`cda6a5d5`](https://github.com/wevm/wagmi/commit/cda6a5d56328330fbde050b4ef40b01c58d2519a) Thanks [@jxom](https://github.com/jxom)! - Updated packages.\n\n- Updated dependencies [[`cda6a5d5`](https://github.com/wevm/wagmi/commit/cda6a5d56328330fbde050b4ef40b01c58d2519a)]:\n  - @wagmi/core@2.9.1\n  - @wagmi/connectors@4.3.3\n\n## 2.8.0\n\n### Minor Changes\n\n- [#3878](https://github.com/wevm/wagmi/pull/3878) [`017828fc`](https://github.com/wevm/wagmi/commit/017828fc027c7a84b54ea9d627e9389f4d60d6c2) Thanks [@jxom](https://github.com/jxom)! - Added experimental EIP-5792 Actions & Hooks.\n\n### Patch Changes\n\n- Updated dependencies [[`017828fc`](https://github.com/wevm/wagmi/commit/017828fc027c7a84b54ea9d627e9389f4d60d6c2)]:\n  - @wagmi/core@2.9.0\n  - @wagmi/connectors@4.3.2\n\n## 2.7.1\n\n### Patch Changes\n\n- [#3869](https://github.com/wevm/wagmi/pull/3869) [`d4a78eb0`](https://github.com/wevm/wagmi/commit/d4a78eb07119d2e5617e52481ac7d6c6d1583ddc) Thanks [@jxom](https://github.com/jxom)! - Fixed issue where `prepareTransactionRequest` would internally call unsupported wallet RPC methods.\n\n- Updated dependencies [[`d4a78eb0`](https://github.com/wevm/wagmi/commit/d4a78eb07119d2e5617e52481ac7d6c6d1583ddc)]:\n  - @wagmi/core@2.8.1\n  - @wagmi/connectors@4.3.1\n\n## 2.7.0\n\n### Minor Changes\n\n- [#3868](https://github.com/wevm/wagmi/pull/3868) [`c2af20b8`](https://github.com/wevm/wagmi/commit/c2af20b88cf16970d087faaec10b463357a5836e) Thanks [@jxom](https://github.com/jxom)! - Added `supportsSimulation` property to connectors that indicates if the connector's wallet supports contract simulation.\n\n### Patch Changes\n\n- [#3858](https://github.com/wevm/wagmi/pull/3858) [`0d141f17`](https://github.com/wevm/wagmi/commit/0d141f171d6ec44bcbfc9c876565b5e2fb8af6de) Thanks [@yulafezmesi](https://github.com/yulafezmesi)! - Fixed accessing reverted reason property inside `waitForTransactionReceipt`.\n\n- Updated dependencies [[`0d141f17`](https://github.com/wevm/wagmi/commit/0d141f171d6ec44bcbfc9c876565b5e2fb8af6de), [`c2af20b8`](https://github.com/wevm/wagmi/commit/c2af20b88cf16970d087faaec10b463357a5836e)]:\n  - @wagmi/core@2.8.0\n  - @wagmi/connectors@5.0.0\n\n## 2.6.0\n\n### Minor Changes\n\n- [#3857](https://github.com/wevm/wagmi/pull/3857) [`d4274c03`](https://github.com/wevm/wagmi/commit/d4274c03a6af5f2d26d31432016ebc14950a330e) Thanks [@tmm](https://github.com/tmm)! - Added `addEthereumChainParameter` to `switchChain`-related methods.\n\n### Patch Changes\n\n- Updated dependencies [[`d4274c03`](https://github.com/wevm/wagmi/commit/d4274c03a6af5f2d26d31432016ebc14950a330e), [`4781a405`](https://github.com/wevm/wagmi/commit/4781a4056d4ffc2c74f96a75429e9b2cd2417ad8), [`400c960b`](https://github.com/wevm/wagmi/commit/400c960b30d701c134850c695ae903a382c29b5b)]:\n  - @wagmi/connectors@5.0.0\n  - @wagmi/core@2.7.0\n\n## 2.5.22\n\n### Patch Changes\n\n- [`e3c832a1`](https://github.com/wevm/wagmi/commit/e3c832a12c301f9b0ee129d877b3101d220ba8b2) Thanks [@jxom](https://github.com/jxom)! - Fixed undefined `navigator` issue in MetaMask connector.\n\n- Updated dependencies [[`e3c832a1`](https://github.com/wevm/wagmi/commit/e3c832a12c301f9b0ee129d877b3101d220ba8b2)]:\n  - @wagmi/connectors@4.1.28\n  - @wagmi/core@2.6.19\n\n## 2.5.21\n\n### Patch Changes\n\n- [#3848](https://github.com/wevm/wagmi/pull/3848) [`dd40a41c`](https://github.com/wevm/wagmi/commit/dd40a41c526ab60a288aff2250ed8dba92a27b16) Thanks [@jxom](https://github.com/jxom)! - Updated MetaMask SDK.\n\n- Updated dependencies [[`dd40a41c`](https://github.com/wevm/wagmi/commit/dd40a41c526ab60a288aff2250ed8dba92a27b16)]:\n  - @wagmi/connectors@4.1.27\n  - @wagmi/core@2.6.18\n\n## 2.5.20\n\n### Patch Changes\n\n- [#3822](https://github.com/wevm/wagmi/pull/3822) [`a97bfbae`](https://github.com/wevm/wagmi/commit/a97bfbaeb615cfef04665e5e7348d85d17f960f0) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where Wagmi would not correctly rehydrate the active chain when a persisted store was being used.\n\n- Updated dependencies [[`a97bfbae`](https://github.com/wevm/wagmi/commit/a97bfbaeb615cfef04665e5e7348d85d17f960f0)]:\n  - @wagmi/core@2.6.17\n  - @wagmi/connectors@4.1.26\n\n## 2.5.19\n\n### Patch Changes\n\n- [#3793](https://github.com/wevm/wagmi/pull/3793) [`f85b83ae`](https://github.com/wevm/wagmi/commit/f85b83ae95dd0bb73ffbdb49afa174e7c68298e1) Thanks [@tmm](https://github.com/tmm)! - Wired up `config` inside hooks so you can pass it explicitly and not use the `WagmiProvider`.\n\n- Updated dependencies [[`42ad380d`](https://github.com/wevm/wagmi/commit/42ad380d9a5d8bc0f61d73612142dea9d098de5e)]:\n  - @wagmi/connectors@4.1.25\n  - @wagmi/core@2.6.16\n\n## 2.5.18\n\n### Patch Changes\n\n- Updated dependencies [[`b907d5ac`](https://github.com/wevm/wagmi/commit/b907d5ac3a746bcbccc06d1fe78c5bd8f9a7d685)]:\n  - @wagmi/core@2.6.15\n  - @wagmi/connectors@4.1.24\n\n## 2.5.17\n\n### Patch Changes\n\n- [#3779](https://github.com/wevm/wagmi/pull/3779) [`3da20bb8`](https://github.com/wevm/wagmi/commit/3da20bb80e7c3efeef8227ced66ad615370fc242) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where `eth_requestAccounts` would be called upon reconnect instead of `eth_accounts`.\n\n- [`a3d1858f`](https://github.com/wevm/wagmi/commit/a3d1858fce448d2b70e36ee692ef1589b74e9d3f) Thanks [@jxom](https://github.com/jxom)! - Fixed hydration conditional in `createConfig`.\n\n- Updated dependencies [[`b3b54ef1`](https://github.com/wevm/wagmi/commit/b3b54ef179c5fa0d1694d38d4b808549a0550409), [`3da20bb8`](https://github.com/wevm/wagmi/commit/3da20bb80e7c3efeef8227ced66ad615370fc242), [`a3d1858f`](https://github.com/wevm/wagmi/commit/a3d1858fce448d2b70e36ee692ef1589b74e9d3f)]:\n  - @wagmi/core@2.6.14\n  - @wagmi/connectors@4.1.23\n\n## 2.5.16\n\n### Patch Changes\n\n- [`b80236dc`](https://github.com/wevm/wagmi/commit/b80236dc623095fe8f1e1d10957d7776fb6ab48b) Thanks [@jxom](https://github.com/jxom)! - Removed unneeded `uniqueBy` check on connectors state.\n\n- Updated dependencies [[`b80236dc`](https://github.com/wevm/wagmi/commit/b80236dc623095fe8f1e1d10957d7776fb6ab48b)]:\n  - @wagmi/core@2.6.13\n  - @wagmi/connectors@4.1.22\n\n## 2.5.15\n\n### Patch Changes\n\n- [#3740](https://github.com/wevm/wagmi/pull/3740) [`3373c644`](https://github.com/wevm/wagmi/commit/3373c6444c38ef16532d18cfc351b3fe2bf2d351) Thanks [@BrickheadJohnny](https://github.com/BrickheadJohnny)! - Removed unnecessary re-renders from `useConnectorClient` and `useWalletClient`.\n\n- Updated dependencies [[`a59069e9`](https://github.com/wevm/wagmi/commit/a59069e9fab45dd606bb89a7f829fe94c51a5494), [`0acd3132`](https://github.com/wevm/wagmi/commit/0acd31320f534993af566be5490c2978b6184f66)]:\n  - @wagmi/core@2.6.12\n  - @wagmi/connectors@4.1.21\n\n## 2.5.14\n\n### Patch Changes\n\n- [`e1ca4e63`](https://github.com/wevm/wagmi/commit/e1ca4e637ae6cec7f5902b0a2c0e0efc3b751a1d) Thanks [@tmm](https://github.com/tmm)! - Deprecated `normalizeChainId`. Use `Number` instead.\n\n- Updated dependencies [[`e1ca4e63`](https://github.com/wevm/wagmi/commit/e1ca4e637ae6cec7f5902b0a2c0e0efc3b751a1d)]:\n  - @wagmi/connectors@4.1.20\n  - @wagmi/core@2.6.11\n\n## 2.5.13\n\n### Patch Changes\n\n- [`dbdca8fd`](https://github.com/wevm/wagmi/commit/dbdca8fd14b90c166222a66a373c1b33c06ce019) Thanks [@jxom](https://github.com/jxom)! - Fixed issue where duplicate connectors could be instantiated if injected after page mount.\n\n- Updated dependencies [[`dbdca8fd`](https://github.com/wevm/wagmi/commit/dbdca8fd14b90c166222a66a373c1b33c06ce019)]:\n  - @wagmi/core@2.6.10\n  - @wagmi/connectors@4.1.19\n\n## 2.5.12\n\n### Patch Changes\n\n- [#3612](https://github.com/wevm/wagmi/pull/3612) [`97237bb0`](https://github.com/wevm/wagmi/commit/97237bb05c30860b9b12c094e82a38ce59d9bedf) Thanks [@m1heng](https://github.com/m1heng)! - Added missing `functionName` parameter to `useWriteContract` codegen helper.\n\n## 2.5.11\n\n### Patch Changes\n\n- [#3714](https://github.com/wevm/wagmi/pull/3714) [`f1628d65`](https://github.com/wevm/wagmi/commit/f1628d65f06e9ef18e6c4e2eb4f6e3ab2e700924) Thanks [@dalechyn](https://github.com/dalechyn)! - Replaced `Omit` with `UnionOmit` for `UseMutationReturnType`.\n\n- [#3715](https://github.com/wevm/wagmi/pull/3715) [`d56edf4f`](https://github.com/wevm/wagmi/commit/d56edf4f27c52acc7a0f57114454b0d3e22cacd6) Thanks [@jxom](https://github.com/jxom)! - Fixed SSR hydration issues.\n\n- Updated dependencies [[`d56edf4f`](https://github.com/wevm/wagmi/commit/d56edf4f27c52acc7a0f57114454b0d3e22cacd6)]:\n  - @wagmi/core@2.6.9\n  - @wagmi/connectors@4.1.18\n\n## 2.5.10\n\n### Patch Changes\n\n- [#3643](https://github.com/wevm/wagmi/pull/3643) [`e46bcd47`](https://github.com/wevm/wagmi/commit/e46bcd4738a18da15b53f6612b614379c1985374) Thanks [@TateB](https://github.com/TateB)! - Fixed race condition arising from `reconnect`.\n\n- Updated dependencies [[`e46bcd47`](https://github.com/wevm/wagmi/commit/e46bcd4738a18da15b53f6612b614379c1985374)]:\n  - @wagmi/core@2.6.8\n  - @wagmi/connectors@4.1.17\n\n## 2.5.9\n\n### Patch Changes\n\n- [`f5648dd2`](https://github.com/wevm/wagmi/commit/f5648dd28b3576b628f57732b89287f55acbb1c1) Thanks [@jxom](https://github.com/jxom)! - Updated `prepareTransactionRequest` types for `viem@2.8.0`.\n\n- [`1c1fee6a`](https://github.com/wevm/wagmi/commit/1c1fee6ab8f01f7734ac6ce05093fa8e388beb3e) Thanks [@jxom](https://github.com/jxom)! - Updated `@walletconnect/ethereum-provider`.\n\n- Updated dependencies [[`b479b5e8`](https://github.com/wevm/wagmi/commit/b479b5e8a5866cba792862f22e6352c4fb566137), [`f5648dd2`](https://github.com/wevm/wagmi/commit/f5648dd28b3576b628f57732b89287f55acbb1c1), [`1c1fee6a`](https://github.com/wevm/wagmi/commit/1c1fee6ab8f01f7734ac6ce05093fa8e388beb3e), [`88a2d744`](https://github.com/wevm/wagmi/commit/88a2d744a1315908c9e54156026df3ad2435ad44)]:\n  - @wagmi/core@2.6.7\n  - @wagmi/connectors@4.1.16\n\n## 2.5.8\n\n### Patch Changes\n\n- Updated dependencies [[`a91c0b64`](https://github.com/wevm/wagmi/commit/a91c0b64ba8b3e6537a560e69724eb601f26af27)]:\n  - @wagmi/core@2.6.6\n  - @wagmi/connectors@4.1.15\n\n## 2.5.7\n\n### Patch Changes\n\n- [#3580](https://github.com/wevm/wagmi/pull/3580) [`c677dcd2`](https://github.com/wevm/wagmi/commit/c677dcd245dccdf69289a3d66dded237b09570a2) Thanks [@tmm](https://github.com/tmm)! - Made `useSwitchChain().chains` reactive.\n\n- Updated dependencies [[`ca5decdb`](https://github.com/wevm/wagmi/commit/ca5decdb712f81e3f5dab933a94b967bca5b6af4), [`c677dcd2`](https://github.com/wevm/wagmi/commit/c677dcd245dccdf69289a3d66dded237b09570a2)]:\n  - @wagmi/connectors@4.1.14\n  - @wagmi/core@2.6.5\n\n## 2.5.6\n\n### Patch Changes\n\n- Updated dependencies [[`7c6618e6`](https://github.com/wevm/wagmi/commit/7c6618e6a0eb1ff39cf8f66b34d3ddc14be538fe), [`fa25b448`](https://github.com/wevm/wagmi/commit/fa25b4482504b4d9729a5687ea6d6dc959265bc0), [`895f28e8`](https://github.com/wevm/wagmi/commit/895f28e873af7c8eda5ca85734ff67c8979fd950)]:\n  - @wagmi/core@2.6.4\n  - @wagmi/connectors@4.1.13\n\n## 2.5.5\n\n### Patch Changes\n\n- Updated dependencies [[`9c3b85dd`](https://github.com/wevm/wagmi/commit/9c3b85dd0a9a4a593e1d7e029345275735330e32), [`2a72214a`](https://github.com/wevm/wagmi/commit/2a72214a2901d6b6ddd39f80238aa0bd4db670a7)]:\n  - @wagmi/core@2.6.3\n  - @wagmi/connectors@4.1.12\n\n## 2.5.4\n\n### Patch Changes\n\n- [`3f8203bd`](https://github.com/wevm/wagmi/commit/3f8203bd77fcf6b6756640b5971d09741ae3853d) Thanks [@tmm](https://github.com/tmm)! - Fixed `useBlock` parameters passthrough to Viem.\n\n## 2.5.3\n\n### Patch Changes\n\n- [#3518](https://github.com/wevm/wagmi/pull/3518) [`338e857d`](https://github.com/wevm/wagmi/commit/338e857d8cb2fe85e13d9207bef14cada1c1962d) Thanks [@tmm](https://github.com/tmm)! - Bumped dependencies.\n\n- Updated dependencies [[`414eb048`](https://github.com/wevm/wagmi/commit/414eb048af492caac70c0e874dfc87c30702804a), [`338e857d`](https://github.com/wevm/wagmi/commit/338e857d8cb2fe85e13d9207bef14cada1c1962d), [`338e857d`](https://github.com/wevm/wagmi/commit/338e857d8cb2fe85e13d9207bef14cada1c1962d)]:\n  - @wagmi/core@2.6.2\n  - @wagmi/connectors@4.1.11\n\n## 2.5.2\n\n### Patch Changes\n\n- [#3433](https://github.com/wevm/wagmi/pull/3433) [`101a7dd1`](https://github.com/wevm/wagmi/commit/101a7dd131b0cae2dc25579ecab9044290efd37b) Thanks [@tmm](https://github.com/tmm)! - Fixed `useClient` and `usePublicClient` throwing when used with unconfigured `chainId`.\n\n- [#3510](https://github.com/wevm/wagmi/pull/3510) [`660ff80d`](https://github.com/wevm/wagmi/commit/660ff80d5b046967a446eba43ee54b8359a37d0d) Thanks [@tmm](https://github.com/tmm)! - Fixed issue where connectors returning multiple addresses didn't checksum correctly.\n\n- Updated dependencies [[`660ff80d`](https://github.com/wevm/wagmi/commit/660ff80d5b046967a446eba43ee54b8359a37d0d), [`101a7dd1`](https://github.com/wevm/wagmi/commit/101a7dd131b0cae2dc25579ecab9044290efd37b)]:\n  - @wagmi/connectors@4.1.10\n  - @wagmi/core@2.6.1\n\n## 2.5.1\n\n### Patch Changes\n\n- [#3496](https://github.com/wevm/wagmi/pull/3496) [`ba7f8a75`](https://github.com/wevm/wagmi/commit/ba7f8a758efb07664c6e401b5e7e325e7c62341b) Thanks [@tmm](https://github.com/tmm)! - Bumped dependencies.\n\n- Updated dependencies [[`ba7f8a75`](https://github.com/wevm/wagmi/commit/ba7f8a758efb07664c6e401b5e7e325e7c62341b), [`ba7f8a75`](https://github.com/wevm/wagmi/commit/ba7f8a758efb07664c6e401b5e7e325e7c62341b)]:\n  - @wagmi/connectors@4.1.9\n  - @wagmi/core@2.6.0\n\n## 2.5.0\n\n### Minor Changes\n\n- [#3461](https://github.com/wevm/wagmi/pull/3461) [`ca98041d`](https://github.com/wevm/wagmi/commit/ca98041d1b39893d90246929485f4db0d1c6f9f7) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Added `useTransactionConfirmations` hook.\n\n### Patch Changes\n\n- Updated dependencies [[`ca98041d`](https://github.com/wevm/wagmi/commit/ca98041d1b39893d90246929485f4db0d1c6f9f7)]:\n  - @wagmi/core@2.5.0\n  - @wagmi/connectors@4.1.8\n\n## 2.4.0\n\n### Minor Changes\n\n- [#3427](https://github.com/wevm/wagmi/pull/3427) [`370f1b4a`](https://github.com/wevm/wagmi/commit/370f1b4a3f154d181acf381c31c2e7862e22c0e4) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Added `usePrepareTransactionRequest` hook.\n\n### Patch Changes\n\n- Updated dependencies [[`370f1b4a`](https://github.com/wevm/wagmi/commit/370f1b4a3f154d181acf381c31c2e7862e22c0e4), [`370f1b4a`](https://github.com/wevm/wagmi/commit/370f1b4a3f154d181acf381c31c2e7862e22c0e4)]:\n  - @wagmi/connectors@4.1.7\n  - @wagmi/core@2.4.0\n\n## 2.3.1\n\n### Patch Changes\n\n- [#3476](https://github.com/wevm/wagmi/pull/3476) [`3be5bb7b`](https://github.com/wevm/wagmi/commit/3be5bb7b0b38646e12e6da5c762ef74dff66bcc2) Thanks [@jxom](https://github.com/jxom)! - Modified persist strategy to only store \"critical\" properties that are needed before hydration.\n\n- Updated dependencies [[`3be5bb7b`](https://github.com/wevm/wagmi/commit/3be5bb7b0b38646e12e6da5c762ef74dff66bcc2)]:\n  - @wagmi/core@2.3.1\n  - @wagmi/connectors@4.1.6\n\n## 2.3.0\n\n### Minor Changes\n\n- [#3459](https://github.com/wevm/wagmi/pull/3459) [`d950b666`](https://github.com/wevm/wagmi/commit/d950b666b56700ca039ce16cdfdf34564991e7f5) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Added `useEnsText` action.\n\n### Patch Changes\n\n- [#3467](https://github.com/wevm/wagmi/pull/3467) [`90ef39bb`](https://github.com/wevm/wagmi/commit/90ef39bb0f4ecb3c914d317875348e35ba0f4524) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where connectors that share the same provider instance could reconnect when they have never been connected before.\n\n- [`1cfb6e5a`](https://github.com/wevm/wagmi/commit/1cfb6e5a875e707abcee00dd5739e87da05e8c90) Thanks [@jxom](https://github.com/jxom)! - Bumped listener limit on WalletConnect connector.\n\n- Updated dependencies [[`d950b666`](https://github.com/wevm/wagmi/commit/d950b666b56700ca039ce16cdfdf34564991e7f5), [`d950b666`](https://github.com/wevm/wagmi/commit/d950b666b56700ca039ce16cdfdf34564991e7f5), [`90ef39bb`](https://github.com/wevm/wagmi/commit/90ef39bb0f4ecb3c914d317875348e35ba0f4524), [`1cfb6e5a`](https://github.com/wevm/wagmi/commit/1cfb6e5a875e707abcee00dd5739e87da05e8c90)]:\n  - @wagmi/core@2.3.0\n  - @wagmi/connectors@5.0.0\n\n## 2.2.1\n\n### Patch Changes\n\n- [#3443](https://github.com/wevm/wagmi/pull/3443) [`007024a6`](https://github.com/wevm/wagmi/commit/007024a684ddbecf924cdc06dd6a8854fc3d5eeb) Thanks [@jmrossy](https://github.com/jmrossy)! - Bumped dependencies.\n\n- [#3447](https://github.com/wevm/wagmi/pull/3447) [`a02a26ad`](https://github.com/wevm/wagmi/commit/a02a26ad030d3afb78f744377d61b5c60b65d97a) Thanks [@tmm](https://github.com/tmm)! - Fixed account typing.\n\n- Updated dependencies [[`007024a6`](https://github.com/wevm/wagmi/commit/007024a684ddbecf924cdc06dd6a8854fc3d5eeb), [`a02a26ad`](https://github.com/wevm/wagmi/commit/a02a26ad030d3afb78f744377d61b5c60b65d97a), [`a02a26ad`](https://github.com/wevm/wagmi/commit/a02a26ad030d3afb78f744377d61b5c60b65d97a), [`007024a6`](https://github.com/wevm/wagmi/commit/007024a684ddbecf924cdc06dd6a8854fc3d5eeb)]:\n  - @wagmi/connectors@4.1.4\n  - @wagmi/core@2.2.1\n\n## 2.2.0\n\n### Minor Changes\n\n- [#3434](https://github.com/wevm/wagmi/pull/3434) [`00bf10a4`](https://github.com/wevm/wagmi/commit/00bf10a428b0d1c5dac35ebf25b19571e033ac26) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Added `useBytecode` and `useStorageAt` hooks.\n\n- [#3408](https://github.com/wevm/wagmi/pull/3408) [`fb6c4148`](https://github.com/wevm/wagmi/commit/fb6c4148d9e9e2fccfbe74c8f343b444dc68dec5) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Added `useProof` hook.\n\n- [#3416](https://github.com/wevm/wagmi/pull/3416) [`64c073f6`](https://github.com/wevm/wagmi/commit/64c073f6c2720961e2d6aff986670b73dbfab9c3) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Added `useTransactionReceipt` hook.\n\n### Patch Changes\n\n- Updated dependencies [[`00bf10a4`](https://github.com/wevm/wagmi/commit/00bf10a428b0d1c5dac35ebf25b19571e033ac26), [`64c073f6`](https://github.com/wevm/wagmi/commit/64c073f6c2720961e2d6aff986670b73dbfab9c3), [`fb6c4148`](https://github.com/wevm/wagmi/commit/fb6c4148d9e9e2fccfbe74c8f343b444dc68dec5)]:\n  - @wagmi/core@2.2.0\n  - @wagmi/connectors@5.0.0\n\n## 2.1.2\n\n### Patch Changes\n\n- [#3407](https://github.com/wevm/wagmi/pull/3407) [`e00b8205`](https://github.com/wevm/wagmi/commit/e00b82058685751637edfa9a6b2d196a12549fe7) Thanks [@jxom](https://github.com/jxom)! - Added a prelude gas estimate check to `sendTransaction`/`useSendTransaction`.\n\n- Updated dependencies [[`e00b8205`](https://github.com/wevm/wagmi/commit/e00b82058685751637edfa9a6b2d196a12549fe7)]:\n  - @wagmi/core@2.1.2\n  - @wagmi/connectors@4.1.2\n\n## 2.1.1\n\n### Patch Changes\n\n- [#3402](https://github.com/wevm/wagmi/pull/3402) [`64b82282`](https://github.com/wevm/wagmi/commit/64b82282c1e57e77c25aa0814673780e4d11edd4) Thanks [@Songkeys](https://github.com/Songkeys)! - Fixed SSR cookie support for cookies that have special characters, e.g. `=`.\n\n- [`ec0d8b41`](https://github.com/wevm/wagmi/commit/ec0d8b4112181fefb11025e436a94a6114761d37) Thanks [@tmm](https://github.com/tmm)! - Added note to `metaMask` connector.\n\n- Updated dependencies [[`64b82282`](https://github.com/wevm/wagmi/commit/64b82282c1e57e77c25aa0814673780e4d11edd4), [`ec0d8b41`](https://github.com/wevm/wagmi/commit/ec0d8b4112181fefb11025e436a94a6114761d37)]:\n  - @wagmi/core@2.1.1\n  - @wagmi/connectors@4.1.1\n\n## 2.1.0\n\n### Minor Changes\n\n- [#3387](https://github.com/wevm/wagmi/pull/3387) [`c9cd302e`](https://github.com/wevm/wagmi/commit/c9cd302e1c65c980deaee2e12567c2a8ec08b399) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Added `useCall` hook.\n\n### Patch Changes\n\n- Updated dependencies [[`c9cd302e`](https://github.com/wevm/wagmi/commit/c9cd302e1c65c980deaee2e12567c2a8ec08b399)]:\n  - @wagmi/core@2.1.0\n  - @wagmi/connectors@5.0.0\n\n## 2.0.3\n\n### Patch Changes\n\n- [#3384](https://github.com/wevm/wagmi/pull/3384) [`ee868c33`](https://github.com/wevm/wagmi/commit/ee868c3385dae511230b6ddcb5627c1293cc1844) Thanks [@tmm](https://github.com/tmm)! - Fixed connectors not bubbling error when connecting with `chainId` and subsequent user rejection.\n\n- Updated dependencies [[`ee868c33`](https://github.com/wevm/wagmi/commit/ee868c3385dae511230b6ddcb5627c1293cc1844)]:\n  - @wagmi/connectors@4.0.2\n  - @wagmi/core@2.0.2\n\n## 2.0.2\n\n### Patch Changes\n\n- [#3379](https://github.com/wevm/wagmi/pull/3379) [`30a186e5`](https://github.com/wevm/wagmi/commit/30a186e53d1135657d04f72f40d1c27186025370) Thanks [@tmm](https://github.com/tmm)! - Fixed `useConnect` error getting unset.\n\n## 2.0.1\n\n### Major Changes\n\n- [#3333](https://github.com/wevm/wagmi/pull/3333) [`b3a0baaa`](https://github.com/wevm/wagmi/commit/b3a0baaaee7decf750d376aab2502cd33ca4825a) Thanks [@tmm](https://github.com/tmm)! - Wagmi 2.0 featuring:\n\n  - Full TanStack Query support + queryKeys\n  - Connect multiple connectors\n  - Switch chains while disconnected\n  - EIP-6963 enabled\n  - Strongly typed chainId and chain properties\n  - Smaller bundle size\n  - Miscellaneous improvements and bug fixes\n\n  [Breaking Changes & Migration Guide](https://wagmi.sh/react/guides/migrate-from-v1-to-v2)\n\n### Patch Changes\n\n- Updated dependencies [[`b3a0baaa`](https://github.com/wevm/wagmi/commit/b3a0baaaee7decf750d376aab2502cd33ca4825a), [`b3a0baaa`](https://github.com/wevm/wagmi/commit/b3a0baaaee7decf750d376aab2502cd33ca4825a)]:\n  - @wagmi/connectors@4.0.0\n  - @wagmi/core@2.0.0\n\n## 1.4.13\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/core@1.4.13\n\n## 1.4.12\n\n### Patch Changes\n\n- [`53ca1f7e`](https://github.com/wevm/wagmi/commit/53ca1f7eb411d912e11fcce7e03bd61ed067959c) Thanks [@tmm](https://github.com/tmm)! - Removed LedgerConnector due to security vulnerability\n\n- Updated dependencies [[`53ca1f7e`](https://github.com/wevm/wagmi/commit/53ca1f7eb411d912e11fcce7e03bd61ed067959c)]:\n  - @wagmi/core@1.4.12\n\n## 1.4.11\n\n### Patch Changes\n\n- [#3299](https://github.com/wevm/wagmi/pull/3299) [`b02020b3`](https://github.com/wevm/wagmi/commit/b02020b3724e0228198f35817611bb063295906e) Thanks [@dasanra](https://github.com/dasanra)! - Fixed issue with [Safe SDK](https://github.com/wevm/viem/issues/579) by bumping `@safe-global/safe-apps-provider@0.18.1`\n\n- Updated dependencies [[`b02020b3`](https://github.com/wevm/wagmi/commit/b02020b3724e0228198f35817611bb063295906e)]:\n  - @wagmi/core@1.4.11\n\n## 1.4.10\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/core@1.4.10\n\n## 1.4.9\n\n### Patch Changes\n\n- [#3276](https://github.com/wevm/wagmi/pull/3276) [`83223a06`](https://github.com/wevm/wagmi/commit/83223a0659e2f675d897a1d3374c7af752c16abf) Thanks [@glitch-txs](https://github.com/glitch-txs)! - Removed required namespaces from WalletConnect connector\n\n- Updated dependencies [[`83223a06`](https://github.com/wevm/wagmi/commit/83223a0659e2f675d897a1d3374c7af752c16abf)]:\n  - @wagmi/core@1.4.9\n\n## 1.4.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/core@1.4.8\n\n## 1.4.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/core@1.4.7\n\n## 1.4.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/core@1.4.6\n\n## 1.4.5\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/core@1.4.5\n\n## 1.4.4\n\n### Patch Changes\n\n- [#3125](https://github.com/wagmi-dev/wagmi/pull/3125) [`725e73fe`](https://github.com/wagmi-dev/wagmi/commit/725e73feb9143dbaa6d540bb76d2009cef29da0b) Thanks [@lukasrosario](https://github.com/lukasrosario)! - Fixed an issue where `dataSuffix` was not being passed down into viem's `simulateContract`, causing the data to be omitted from requests.\n\n- Updated dependencies [[`725e73fe`](https://github.com/wagmi-dev/wagmi/commit/725e73feb9143dbaa6d540bb76d2009cef29da0b)]:\n  - @wagmi/core@1.4.4\n\n## 1.4.3\n\n### Patch Changes\n\n- [#3076](https://github.com/wagmi-dev/wagmi/pull/3076) [`4c36831b`](https://github.com/wagmi-dev/wagmi/commit/4c36831b7aa44d03b5c0decf64dcd20faae28a67) Thanks [@jxom](https://github.com/jxom)! - Pass `chain` to viem `sendTransaction`/`writeContract`.\n\n- [#3006](https://github.com/wagmi-dev/wagmi/pull/3006) [`f2ddce23`](https://github.com/wagmi-dev/wagmi/commit/f2ddce23324aff0a91e066100918dac552dc3b4a) Thanks [@jxom](https://github.com/jxom)! - Changed `normalize` to a dynamic import.\n\n- Updated dependencies [[`4c36831b`](https://github.com/wagmi-dev/wagmi/commit/4c36831b7aa44d03b5c0decf64dcd20faae28a67), [`f2ddce23`](https://github.com/wagmi-dev/wagmi/commit/f2ddce23324aff0a91e066100918dac552dc3b4a)]:\n  - @wagmi/core@1.4.3\n\n## 1.4.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/core@1.4.2\n\n## 1.4.1\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/core@1.4.1\n\n## 1.4.0\n\n### Minor Changes\n\n- [#2956](https://github.com/wagmi-dev/wagmi/pull/2956) [`2abeb285`](https://github.com/wagmi-dev/wagmi/commit/2abeb285674af3e539cc2550b1f5027b1eb0c895) Thanks [@tmm](https://github.com/tmm)! - Replaced `@wagmi/chains` with `viem/chains`.\n\n### Patch Changes\n\n- Updated dependencies [[`2abeb285`](https://github.com/wagmi-dev/wagmi/commit/2abeb285674af3e539cc2550b1f5027b1eb0c895)]:\n  - @wagmi/core@1.4.0\n\n## 1.3.11\n\n### Patch Changes\n\n- [`557e6400`](https://github.com/wagmi-dev/wagmi/commit/557e6400b9cef3b2c5131739143956c37d7c934a) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n- Updated dependencies [[`557e6400`](https://github.com/wagmi-dev/wagmi/commit/557e6400b9cef3b2c5131739143956c37d7c934a)]:\n  - @wagmi/core@1.3.10\n\n## 1.3.10\n\n### Patch Changes\n\n- [`247c5d11`](https://github.com/wagmi-dev/wagmi/commit/247c5d113e83acf3a6894264c00d4b125d455107) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n- Updated dependencies [[`247c5d11`](https://github.com/wagmi-dev/wagmi/commit/247c5d113e83acf3a6894264c00d4b125d455107)]:\n  - @wagmi/core@1.3.9\n\n## 1.3.9\n\n### Patch Changes\n\n- [#2741](https://github.com/wagmi-dev/wagmi/pull/2741) [`5b1453d9`](https://github.com/wagmi-dev/wagmi/commit/5b1453d95973ed51f1c235a919fffb707eab9b70) Thanks [@jxom](https://github.com/jxom)! - Updated references\n\n- Updated dependencies [[`5b1453d9`](https://github.com/wagmi-dev/wagmi/commit/5b1453d95973ed51f1c235a919fffb707eab9b70)]:\n  - @wagmi/core@1.3.8\n\n## 1.3.8\n\n### Patch Changes\n\n- [#2700](https://github.com/wagmi-dev/wagmi/pull/2700) [`30118e97`](https://github.com/wagmi-dev/wagmi/commit/30118e979b1b00302e035f31f58c15d1aed911d5) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n- Updated dependencies [[`30118e97`](https://github.com/wagmi-dev/wagmi/commit/30118e979b1b00302e035f31f58c15d1aed911d5)]:\n  - @wagmi/core@1.3.7\n\n## 1.3.7\n\n### Patch Changes\n\n- [`7ad2fdb8`](https://github.com/wagmi-dev/wagmi/commit/7ad2fdb81c7734d0c8107670800c68390e3bad99) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n- Updated dependencies [[`7ad2fdb8`](https://github.com/wagmi-dev/wagmi/commit/7ad2fdb81c7734d0c8107670800c68390e3bad99)]:\n  - @wagmi/core@1.3.6\n\n## 1.3.6\n\n### Patch Changes\n\n- [`aab63fc1`](https://github.com/wagmi-dev/wagmi/commit/aab63fc1f8949004573978ecd8574fada3360758) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n- Updated dependencies [[`aab63fc1`](https://github.com/wagmi-dev/wagmi/commit/aab63fc1f8949004573978ecd8574fada3360758)]:\n  - @wagmi/core@1.3.5\n\n## 1.3.5\n\n### Patch Changes\n\n- [#2669](https://github.com/wagmi-dev/wagmi/pull/2669) [`db75c459`](https://github.com/wagmi-dev/wagmi/commit/db75c4593b9c46970dc9d3c96d7adafc76878fc3) Thanks [@llllvvuu](https://github.com/llllvvuu)! - Modified `useAccount` and `useNetwork` to be reactive of wagmi Config (`config`).\n\n## 1.3.4\n\n### Patch Changes\n\n- [`b056f809`](https://github.com/wagmi-dev/wagmi/commit/b056f8095674d4addc6ecd09adf6001fe52e2b15) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where `onConnect` was not being called when multiple instances of `useAccount` existed.\n\n- [`22246d98`](https://github.com/wagmi-dev/wagmi/commit/22246d9884277d28ccad6ca2d9529b96b67d47fc) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n- Updated dependencies [[`22246d98`](https://github.com/wagmi-dev/wagmi/commit/22246d9884277d28ccad6ca2d9529b96b67d47fc)]:\n  - @wagmi/core@1.3.4\n\n## 1.3.3\n\n### Patch Changes\n\n- [`1946aa43`](https://github.com/wagmi-dev/wagmi/commit/1946aa43a65b684ef41b7b4c43c67bf29c13e854) Thanks [@jxom](https://github.com/jxom)! - Updated references\n\n- Updated dependencies [[`1946aa43`](https://github.com/wagmi-dev/wagmi/commit/1946aa43a65b684ef41b7b4c43c67bf29c13e854)]:\n  - @wagmi/core@1.3.3\n\n## 1.3.2\n\n### Patch Changes\n\n- [`e86d0940`](https://github.com/wagmi-dev/wagmi/commit/e86d09409bb20b64d24e1263abcf0291314f03c7) Thanks [@jxom](https://github.com/jxom)! - Updated references\n\n- Updated dependencies [[`e86d0940`](https://github.com/wagmi-dev/wagmi/commit/e86d09409bb20b64d24e1263abcf0291314f03c7)]:\n  - @wagmi/core@1.3.2\n\n## 1.3.1\n\n### Patch Changes\n\n- [`964042fa`](https://github.com/wagmi-dev/wagmi/commit/964042fa94d682977923c595820c58283fb9244a) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n- Updated dependencies [[`964042fa`](https://github.com/wagmi-dev/wagmi/commit/964042fa94d682977923c595820c58283fb9244a)]:\n  - @wagmi/core@1.3.1\n\n## 1.3.0\n\n### Minor Changes\n\n- [#2619](https://github.com/wagmi-dev/wagmi/pull/2619) [`0d79748c`](https://github.com/wagmi-dev/wagmi/commit/0d79748cec2b6ac2410ad2c9816cc662f2b70962) Thanks [@jxom](https://github.com/jxom)! - Updated references:\n  - Updated `@safe-global/safe-apps-sdk` to `^8.0.0` (the one with `viem` support)\n\n### Patch Changes\n\n- Updated dependencies [[`0d79748c`](https://github.com/wagmi-dev/wagmi/commit/0d79748cec2b6ac2410ad2c9816cc662f2b70962)]:\n  - @wagmi/core@1.3.0\n\n## 1.2.2\n\n### Patch Changes\n\n- [#2611](https://github.com/wagmi-dev/wagmi/pull/2611) [`6d1ed7a1`](https://github.com/wagmi-dev/wagmi/commit/6d1ed7a156729b4df5d66fef3ae9a8b5762a2d34) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n- Updated dependencies [[`6d1ed7a1`](https://github.com/wagmi-dev/wagmi/commit/6d1ed7a156729b4df5d66fef3ae9a8b5762a2d34)]:\n  - @wagmi/core@1.2.2\n\n## 1.2.1\n\n### Patch Changes\n\n- [#2589](https://github.com/wagmi-dev/wagmi/pull/2589) [`9680c347`](https://github.com/wagmi-dev/wagmi/commit/9680c347476500d28ceca20d23eeaed7931cb6e0) Thanks [@jxom](https://github.com/jxom)! - Fixed `writeContract` parameters to be compatible with `prepareWriteContract`.\n\n- [#2587](https://github.com/wagmi-dev/wagmi/pull/2587) [`cfff9994`](https://github.com/wagmi-dev/wagmi/commit/cfff999459384ac644ff7e62f53a7b787cf37507) Thanks [@jxom](https://github.com/jxom)! - Updated references\n\n- Updated dependencies [[`9680c347`](https://github.com/wagmi-dev/wagmi/commit/9680c347476500d28ceca20d23eeaed7931cb6e0), [`cfff9994`](https://github.com/wagmi-dev/wagmi/commit/cfff999459384ac644ff7e62f53a7b787cf37507)]:\n  - @wagmi/core@1.2.1\n\n## 1.2.0\n\n### Minor Changes\n\n- [#2536](https://github.com/wagmi-dev/wagmi/pull/2536) [`85e9760a`](https://github.com/wagmi-dev/wagmi/commit/85e9760a140cb169ac6236d9466b96e2105dd193) Thanks [@tmm](https://github.com/tmm)! - Changed `Address` type import from ABIType to viem.\n\n### Patch Changes\n\n- [#2539](https://github.com/wagmi-dev/wagmi/pull/2539) [`96319c64`](https://github.com/wagmi-dev/wagmi/commit/96319c640b9d07b375821c08a5c213355d8c290b) Thanks [@jxom](https://github.com/jxom)! - Updated references\n\n- Updated dependencies [[`85e9760a`](https://github.com/wagmi-dev/wagmi/commit/85e9760a140cb169ac6236d9466b96e2105dd193), [`96319c64`](https://github.com/wagmi-dev/wagmi/commit/96319c640b9d07b375821c08a5c213355d8c290b)]:\n  - @wagmi/core@1.2.0\n\n## 1.1.1\n\n### Patch Changes\n\n- [`02b98a9f`](https://github.com/wagmi-dev/wagmi/commit/02b98a9f9b2c503a47af4a8967e0202b5db21787) Thanks [@jxom](https://github.com/jxom)! - Updated `viem` peer dependency.\n\n- [`02b98a9f`](https://github.com/wagmi-dev/wagmi/commit/02b98a9f9b2c503a47af4a8967e0202b5db21787) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n- Updated dependencies [[`02b98a9f`](https://github.com/wagmi-dev/wagmi/commit/02b98a9f9b2c503a47af4a8967e0202b5db21787), [`02b98a9f`](https://github.com/wagmi-dev/wagmi/commit/02b98a9f9b2c503a47af4a8967e0202b5db21787)]:\n  - @wagmi/core@1.1.1\n\n## 1.1.0\n\n### Minor Changes\n\n- [#2482](https://github.com/wagmi-dev/wagmi/pull/2482) [`8764b54a`](https://github.com/wagmi-dev/wagmi/commit/8764b54aab68020063946112e8fe52aff650c99c) Thanks [@tmm](https://github.com/tmm)! - Bumped minimum TypeScript version to v5.0.4.\n\n### Patch Changes\n\n- [#2471](https://github.com/wagmi-dev/wagmi/pull/2471) [`74099cef`](https://github.com/wagmi-dev/wagmi/commit/74099cefd922317641529f7881a4c8a740d62cbe) Thanks [@iuriiiurevich](https://github.com/iuriiiurevich)! - Added `keepPreviousData` prop to `useContractRead`.\n\n- [#2484](https://github.com/wagmi-dev/wagmi/pull/2484) [`3adf1f4f`](https://github.com/wagmi-dev/wagmi/commit/3adf1f4feab863cb7b5d52c81ad46f7e4eb56f09) Thanks [@jxom](https://github.com/jxom)! - Updated `abitype` to 0.8.7\n\n- [#2484](https://github.com/wagmi-dev/wagmi/pull/2484) [`3adf1f4f`](https://github.com/wagmi-dev/wagmi/commit/3adf1f4feab863cb7b5d52c81ad46f7e4eb56f09) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n- [`01d4a6ed`](https://github.com/wagmi-dev/wagmi/commit/01d4a6ed53110712692599095d94f04dfb5b6e38) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where `useInvalidateOnBlock`'s `onBlock` was being called on every render.\n\n- Updated dependencies [[`8764b54a`](https://github.com/wagmi-dev/wagmi/commit/8764b54aab68020063946112e8fe52aff650c99c), [`3adf1f4f`](https://github.com/wagmi-dev/wagmi/commit/3adf1f4feab863cb7b5d52c81ad46f7e4eb56f09), [`3adf1f4f`](https://github.com/wagmi-dev/wagmi/commit/3adf1f4feab863cb7b5d52c81ad46f7e4eb56f09)]:\n  - @wagmi/core@1.1.0\n\n## 1.0.9\n\n### Patch Changes\n\n- [#2446](https://github.com/wagmi-dev/wagmi/pull/2446) [`899d8c06`](https://github.com/wagmi-dev/wagmi/commit/899d8c0698e6cc958ca8ad9ec586883edf20516e) Thanks [@iuriiiurevich](https://github.com/iuriiiurevich)! - Added `cancelRefetch: false` to `useInvalidateOnBlock`.\n\n## 1.0.8\n\n### Patch Changes\n\n- [#2441](https://github.com/wagmi-dev/wagmi/pull/2441) [`326edee4`](https://github.com/wagmi-dev/wagmi/commit/326edee4bc85db84a7a4e3768e33785849ab8d8e) Thanks [@tmm](https://github.com/tmm)! - Fixed internal type issue\n\n- Updated dependencies [[`326edee4`](https://github.com/wagmi-dev/wagmi/commit/326edee4bc85db84a7a4e3768e33785849ab8d8e)]:\n  - @wagmi/core@1.0.8\n\n## 1.0.7\n\n### Patch Changes\n\n- [#2433](https://github.com/wagmi-dev/wagmi/pull/2433) [`54fcff5f`](https://github.com/wagmi-dev/wagmi/commit/54fcff5f02f6933bbbe045ee0c83c5a78b6bba49) Thanks [@jxom](https://github.com/jxom)! - Added ability to pass an `account` to `useContractWrite`/`usePrepareContractWrite`.\n\n- Updated dependencies [[`54fcff5f`](https://github.com/wagmi-dev/wagmi/commit/54fcff5f02f6933bbbe045ee0c83c5a78b6bba49)]:\n  - @wagmi/core@1.0.7\n\n## 1.0.6\n\n### Patch Changes\n\n- [`ca2e1e96`](https://github.com/wagmi-dev/wagmi/commit/ca2e1e96149b87a7dc42c9db07e1f1ad2bb02c4a) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n- [#2401](https://github.com/wagmi-dev/wagmi/pull/2401) [`0f9dc875`](https://github.com/wagmi-dev/wagmi/commit/0f9dc875e90cfdd7a2028e04b7204caf9ea313b2) Thanks [@jxom](https://github.com/jxom)! - Exposed `account` on `readContract`/`useContractRead`.\n\n- Updated dependencies [[`ca2e1e96`](https://github.com/wagmi-dev/wagmi/commit/ca2e1e96149b87a7dc42c9db07e1f1ad2bb02c4a), [`0f9dc875`](https://github.com/wagmi-dev/wagmi/commit/0f9dc875e90cfdd7a2028e04b7204caf9ea313b2)]:\n  - @wagmi/core@1.0.6\n\n## 1.0.5\n\n### Patch Changes\n\n- [`90e2b3b3`](https://github.com/wagmi-dev/wagmi/commit/90e2b3b39efe0585fe28645ac2264109be17362a) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n- Updated dependencies [[`90e2b3b3`](https://github.com/wagmi-dev/wagmi/commit/90e2b3b39efe0585fe28645ac2264109be17362a)]:\n  - @wagmi/core@1.0.5\n\n## 1.0.4\n\n### Patch Changes\n\n- [#2344](https://github.com/wagmi-dev/wagmi/pull/2344) [`8a725458`](https://github.com/wagmi-dev/wagmi/commit/8a72545853ae1024acd9efd18c06142e8c6c5750) Thanks [@jxom](https://github.com/jxom)! - Added gas estimation back into `prepareSendTransaction`.\n\n- Updated dependencies [[`8a725458`](https://github.com/wagmi-dev/wagmi/commit/8a72545853ae1024acd9efd18c06142e8c6c5750)]:\n  - @wagmi/core@1.0.4\n\n## 1.0.3\n\n### Patch Changes\n\n- [#2338](https://github.com/wagmi-dev/wagmi/pull/2338) [`92bfdc2c`](https://github.com/wagmi-dev/wagmi/commit/92bfdc2c744539558ba93c95f140b46ad331cee4) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where synchronous switch chain behavior (WalletConnect v2) would encounter chain id race conditions in `watchWalletClient`.\n\n- Updated dependencies [[`92bfdc2c`](https://github.com/wagmi-dev/wagmi/commit/92bfdc2c744539558ba93c95f140b46ad331cee4)]:\n  - @wagmi/core@1.0.3\n\n## 1.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`09a4fd38`](https://github.com/wevm/wagmi/commit/09a4fd38f44eb176797925fd85314be17b610cd4)]:\n  - @wagmi/core@1.0.2\n\n## 1.0.1\n\n### Patch Changes\n\n- [`ea651cd7`](https://github.com/wevm/wagmi/commit/ea651cd7fc75b7866272605467db11fd6e1d81af) Thanks [@jxom](https://github.com/jxom)! - Downgraded abitype.\n\n- Updated dependencies [[`ea651cd7`](https://github.com/wevm/wagmi/commit/ea651cd7fc75b7866272605467db11fd6e1d81af)]:\n  - @wagmi/core@1.0.1\n\n## 1.0.0\n\n### Major Changes\n\n- [#2235](https://github.com/wevm/wagmi/pull/2235) [`5be0655c`](https://github.com/wevm/wagmi/commit/5be0655c8e48b25d38009022461fbf611af54349) Thanks [@jxom](https://github.com/jxom)! - Released v1. Read [Migration Guide](https://next.wagmi.sh/react/migration-guide#1xx-breaking-changes).\n\n### Patch Changes\n\n- Updated dependencies [[`5be0655c`](https://github.com/wevm/wagmi/commit/5be0655c8e48b25d38009022461fbf611af54349)]:\n  - @wagmi/core@1.0.0\n\n## 1.0.0-next.9\n\n### Patch Changes\n\n- Fixed `useContractEvent` effect dependencies.\n\n## 1.0.0-next.8\n\n### Patch Changes\n\n- Added \"use client\" banner\n\n## 1.0.0-next.7\n\n### Major Changes\n\n- [#2235](https://github.com/wevm/wagmi/pull/2235) [`708b2ce2`](https://github.com/wevm/wagmi/commit/708b2ce26efa8d3d910806a97cea5171dabc65de) Thanks [@jxom](https://github.com/jxom)! - Added `config.setPublicClient` & `config.setWebSocketPublicClient`\n\n- Updated references.\n\n### Patch Changes\n\n- Updated dependencies [[`708b2ce2`](https://github.com/wevm/wagmi/commit/708b2ce26efa8d3d910806a97cea5171dabc65de)]:\n  - @wagmi/core@1.0.0-next.7\n\n## 1.0.0-next.6\n\n### Major Changes\n\n- Added `config.setConnectors`\n\n### Patch Changes\n\n- Updated dependencies [[`708b2ce2`](https://github.com/wevm/wagmi/commit/708b2ce26efa8d3d910806a97cea5171dabc65de)]:\n  - @wagmi/core@1.0.0-next.6\n\n## 1.0.0-next.5\n\n### Major Changes\n\n- [#2235](https://github.com/wevm/wagmi/pull/2235) [`708b2ce2`](https://github.com/wevm/wagmi/commit/708b2ce26efa8d3d910806a97cea5171dabc65de) Thanks [@jxom](https://github.com/jxom)! - Added `config.setPublicClient` & `config.setWebSocketPublicClient`\n\n### Patch Changes\n\n- Updated dependencies [[`708b2ce2`](https://github.com/wevm/wagmi/commit/708b2ce26efa8d3d910806a97cea5171dabc65de)]:\n  - @wagmi/core@1.0.0-next.5\n\n## 1.0.0-next.4\n\n### Major Changes\n\n- Updated viem.\n  Removed `goerli` export from main entrypoint.\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/core@1.0.0-next.4\n\n## 1.0.0-next.3\n\n### Major Changes\n\n- Updated references.\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/core@1.0.0-next.3\n\n## 1.0.0-next.2\n\n### Major Changes\n\n- **Breaking:** Renamed `createClient` to `createConfig`\n- **Breaking:** Renamed `useClient` to `useConfig`\n- **Breaking:** Removed `request` as an argument to `usePrepareSendTransaction` & `useSendTransaction`. Arguments now belong on the root level of the Hook.\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/core@1.0.0-next.2\n\n## 1.0.0-next.1\n\n### Major Changes\n\n- updated viem\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/core@1.0.0-next.1\n\n## 1.0.0-next.0\n\n### Major Changes\n\n- [`a7dda00c`](https://github.com/wevm/wagmi/commit/a7dda00c5b546f8b2c42b527e4d9ac1b9e9ab1fb) Thanks [@jxom](https://github.com/jxom)! - Released v1.\n\n### Patch Changes\n\n- Updated dependencies [[`a7dda00c`](https://github.com/wevm/wagmi/commit/a7dda00c5b546f8b2c42b527e4d9ac1b9e9ab1fb)]:\n  - @wagmi/core@1.0.0-next.0\n\n## 0.12.13\n\n### Patch Changes\n\n- [#2270](https://github.com/wevm/wagmi/pull/2270) [`6d1fa9df`](https://github.com/wevm/wagmi/commit/6d1fa9df790287729c3b33d4f01fd23c2f8153f1) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n- Updated dependencies [[`6d1fa9df`](https://github.com/wevm/wagmi/commit/6d1fa9df790287729c3b33d4f01fd23c2f8153f1)]:\n  - @wagmi/core@0.10.11\n\n## 0.12.12\n\n### Patch Changes\n\n- [#2208](https://github.com/wevm/wagmi/pull/2208) [`cfc696d8`](https://github.com/wevm/wagmi/commit/cfc696d83c6f768a2e1a29c5197efeed7f1d40a1) Thanks [@bangtoven](https://github.com/bangtoven)! - Bumped references to apply coinbase wallet sdk updates\n\n- Updated dependencies [[`cfc696d8`](https://github.com/wevm/wagmi/commit/cfc696d83c6f768a2e1a29c5197efeed7f1d40a1)]:\n  - @wagmi/core@0.10.10\n\n## 0.12.11\n\n### Patch Changes\n\n- [#2203](https://github.com/wevm/wagmi/pull/2203) [`a4ca4b05`](https://github.com/wevm/wagmi/commit/a4ca4b05c5bd20c20c5d0741bfb18f2c798b9529) Thanks [@tmm](https://github.com/tmm)! - Downgraded abitype.\n\n## 0.12.10\n\n### Patch Changes\n\n- [#2143](https://github.com/wevm/wagmi/pull/2143) [`26dc5326`](https://github.com/wevm/wagmi/commit/26dc53260fde1d3278018c0b20a6d48a093d9427) Thanks [@tmm](https://github.com/tmm)! - Exported Sepolia Chain.\n\n- [#2146](https://github.com/wevm/wagmi/pull/2146) [`21b6842e`](https://github.com/wevm/wagmi/commit/21b6842e8c296a0bbe71ebe0780d898abc4cf4a8) Thanks [@tmm](https://github.com/tmm)! - Bumped references\n\n- Updated dependencies [[`26dc5326`](https://github.com/wevm/wagmi/commit/26dc53260fde1d3278018c0b20a6d48a093d9427), [`21b6842e`](https://github.com/wevm/wagmi/commit/21b6842e8c296a0bbe71ebe0780d898abc4cf4a8)]:\n  - @wagmi/core@0.10.9\n\n## 0.12.9\n\n### Patch Changes\n\n- [#2120](https://github.com/wevm/wagmi/pull/2120) [`664c2b16`](https://github.com/wevm/wagmi/commit/664c2b1690bdce1ad7a619ac8f673c168dec6529) Thanks [@jxom](https://github.com/jxom)! - Bumped React Query & ABIType dependencies\n\n## 0.12.8\n\n### Patch Changes\n\n- [#2099](https://github.com/wevm/wagmi/pull/2099) [`f1fee5b3`](https://github.com/wevm/wagmi/commit/f1fee5b30a1bd13b5e66118bf9cdc44b0dc003a1) Thanks [@jxom](https://github.com/jxom)! - Added chains:\n\n  - `nexi`\n  - `polygonZkEvm`\n  - `xdc`\n  - `xdcTestnet`\n\n- [#2085](https://github.com/wevm/wagmi/pull/2085) [`7d64e3f5`](https://github.com/wevm/wagmi/commit/7d64e3f538a6149777bfa84ea9435769b2a7db58) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where multicall would not throw if the target chain was not configured on the wagmi client.\n\n- Updated dependencies [[`f1fee5b3`](https://github.com/wevm/wagmi/commit/f1fee5b30a1bd13b5e66118bf9cdc44b0dc003a1), [`7d64e3f5`](https://github.com/wevm/wagmi/commit/7d64e3f538a6149777bfa84ea9435769b2a7db58)]:\n  - @wagmi/core@0.10.8\n\n## 0.12.7\n\n### Patch Changes\n\n- [#2082](https://github.com/wevm/wagmi/pull/2082) [`2ccc8a25`](https://github.com/wevm/wagmi/commit/2ccc8a255e93f0a2bb7b22101656b3905ec59abd) Thanks [@jxom](https://github.com/jxom)! - Updated references.\n\n- Updated dependencies [[`2ccc8a25`](https://github.com/wevm/wagmi/commit/2ccc8a255e93f0a2bb7b22101656b3905ec59abd)]:\n  - @wagmi/core@0.10.7\n\n## 0.12.6\n\n### Patch Changes\n\n- [#2056](https://github.com/wevm/wagmi/pull/2056) [`944f6513`](https://github.com/wevm/wagmi/commit/944f6513adf09a6f0b3bd34f591d3bbd1f1ffd2e) Thanks [@tmm](https://github.com/tmm)! - Bumped references.\n\n- Updated dependencies [[`944f6513`](https://github.com/wevm/wagmi/commit/944f6513adf09a6f0b3bd34f591d3bbd1f1ffd2e)]:\n  - @wagmi/core@0.10.6\n\n## 0.12.5\n\n### Patch Changes\n\n- [#2053](https://github.com/wevm/wagmi/pull/2053) [`665df1bf`](https://github.com/wevm/wagmi/commit/665df1bf2afccb533102069def395e19fb7194dd) Thanks [@tmm](https://github.com/tmm)! - Fixed issue where you add a new chain to MetaMask, but the switch after is rejected.\n\n- Updated dependencies [[`665df1bf`](https://github.com/wevm/wagmi/commit/665df1bf2afccb533102069def395e19fb7194dd)]:\n  - @wagmi/core@0.10.5\n\n## 0.12.4\n\n### Patch Changes\n\n- [#2046](https://github.com/wevm/wagmi/pull/2046) [`90d8e9b8`](https://github.com/wevm/wagmi/commit/90d8e9b87962b72c54311649537e91a953660f9b) Thanks [@tmm](https://github.com/tmm)! - Exported internal type.\n\n- Updated dependencies [[`90d8e9b8`](https://github.com/wevm/wagmi/commit/90d8e9b87962b72c54311649537e91a953660f9b)]:\n  - @wagmi/core@0.10.4\n\n## 0.12.3\n\n### Patch Changes\n\n- [#2039](https://github.com/wevm/wagmi/pull/2039) [`bac893ab`](https://github.com/wevm/wagmi/commit/bac893ab26012d4d8741c4f80e8b8813aee26f0c) Thanks [@tmm](https://github.com/tmm)! - Updated references.\n\n- [#2043](https://github.com/wevm/wagmi/pull/2043) [`49a58320`](https://github.com/wevm/wagmi/commit/49a58320ab5f1f13bc4de25abcc028c8335e98f0) Thanks [@tmm](https://github.com/tmm)! - Removed `InjectedConnector` `shimChainChangedDisconnect` shim (no longer necessary).\n\n- [#2042](https://github.com/wevm/wagmi/pull/2042) [`e7ac7afc`](https://github.com/wevm/wagmi/commit/e7ac7afccb005e8d208c78d55b1fec979b8522a6) Thanks [@tmm](https://github.com/tmm)! - Fixed exposed types that weren't passed down.\n\n- Updated dependencies [[`bac893ab`](https://github.com/wevm/wagmi/commit/bac893ab26012d4d8741c4f80e8b8813aee26f0c), [`49a58320`](https://github.com/wevm/wagmi/commit/49a58320ab5f1f13bc4de25abcc028c8335e98f0)]:\n  - @wagmi/core@0.10.3\n\n## 0.12.2\n\n### Patch Changes\n\n- [#2016](https://github.com/wevm/wagmi/pull/2016) [`06bf61de`](https://github.com/wevm/wagmi/commit/06bf61dee6d2920777bd9392491e6b7aedebe7ab) Thanks [@jxom](https://github.com/jxom)! - Added chains:\n\n  - `boba`\n  - `chronos`\n  - `crossbell`\n  - `dfk`\n  - `dogechain`\n  - `flare`\n  - `flareTestnet`\n  - `klaytn`\n  - `scrollTestnet`\n  - `shardeumSphinx`\n  - `skaleCalypso`\n  - `skaleCalypsoTestnet`\n  - `skaleChaosTestnet`\n  - `skaleCryptoBlades`\n  - `skaleCryptoColosseum`\n  - `skaleEuropa`\n  - `skaleEuropaTestnet`\n  - `skaleExorde`\n  - `skaleHumanProtocol`\n  - `skaleNebula`\n  - `skaleNebulaTestnet`\n  - `skaleRazor`\n  - `skaleTitan`\n  - `skaleTitanTestnet`\n  - `songbird`\n  - `songbirdTestnet`\n  - `titan`\n  - `titanTestnet`\n  - `wanchain`\n  - `wanchainTestnet`\n\n- [#2016](https://github.com/wevm/wagmi/pull/2016) [`06bf61de`](https://github.com/wevm/wagmi/commit/06bf61dee6d2920777bd9392491e6b7aedebe7ab) Thanks [@jxom](https://github.com/jxom)! - Updated references/ submodule.\n\n- Updated dependencies [[`06bf61de`](https://github.com/wevm/wagmi/commit/06bf61dee6d2920777bd9392491e6b7aedebe7ab), [`06bf61de`](https://github.com/wevm/wagmi/commit/06bf61dee6d2920777bd9392491e6b7aedebe7ab)]:\n  - @wagmi/core@0.10.2\n\n## 0.12.0\n\n### Minor Changes\n\n- [#1902](https://github.com/wevm/wagmi/pull/1902) [`0994e896`](https://github.com/wevm/wagmi/commit/0994e8966349b8811db0a5886db3831dafc99245) Thanks [@jxom](https://github.com/jxom)! - **Breaking:** Removed the `version` config option for `WalletConnectConnector`.\n\n  `WalletConnectConnector` now uses WalletConnect v2 by default. WalletConnect v1 is now `WalletConnectLegacyConnector`.\n\n  ### WalletConnect v2\n\n  ```diff\n  import { WalletConnectConnector } from 'wagmi/connectors/walletConnect'\n\n  const connector = new WalletConnectConnector({\n    options: {\n  -   version: '2',\n      projectId: 'abc',\n    },\n  })\n  ```\n\n  ### WalletConnect v1\n\n  ```diff\n  -import { WalletConnectConnector } from 'wagmi/connectors/walletConnect'\n  +import { WalletConnectConnector } from 'wagmi/connectors/walletConnectLegacy'\n\n  -const connector = new WalletConnectConnector({\n  +const connector = new WalletConnectLegacyConnector({\n    options: {\n      qrcode: true,\n    },\n  })\n  ```\n\n### Patch Changes\n\n- Updated dependencies [[`0994e896`](https://github.com/wevm/wagmi/commit/0994e8966349b8811db0a5886db3831dafc99245)]:\n  - @wagmi/core@0.10.0\n\n## 0.11.7\n\n### Patch Changes\n\n- [#1907](https://github.com/wevm/wagmi/pull/1907) [`cc4e74ee`](https://github.com/wevm/wagmi/commit/cc4e74ee19665eccb3767052dab6ab956ff4e676) Thanks [@jxom](https://github.com/jxom)! - Added the following chains to the `wagmi/chains` entrypoint:\n\n  - `baseGoerli`\n  - `harmonyOne`\n  - `polygonZkEvmTestnet`\n\n- Updated dependencies [[`cc4e74ee`](https://github.com/wevm/wagmi/commit/cc4e74ee19665eccb3767052dab6ab956ff4e676)]:\n  - @wagmi/core@0.9.7\n\n## 0.11.6\n\n### Patch Changes\n\n- [#1882](https://github.com/wevm/wagmi/pull/1882) [`282cc1b0`](https://github.com/wevm/wagmi/commit/282cc1b02003684d582cea411b11792a59c26fd0) Thanks [@tmm](https://github.com/tmm)! - Updated references.\n\n- Updated dependencies [[`282cc1b0`](https://github.com/wevm/wagmi/commit/282cc1b02003684d582cea411b11792a59c26fd0)]:\n  - @wagmi/core@0.9.6\n\n## 0.11.5\n\n### Patch Changes\n\n- [#1812](https://github.com/wevm/wagmi/pull/1812) [`c7fd7fbd`](https://github.com/wevm/wagmi/commit/c7fd7fbde6f6c69a3a9a4f89d948c4dfb1d22679) Thanks [@jxom](https://github.com/jxom)! - Added the following chains to the `wagmi/chains` entrypoint:\n\n  - `filecoinCalibration`\n  - `moonbaseAlpha`\n  - `moonbeam`\n  - `moonriver`\n\n- Updated dependencies [[`c7fd7fbd`](https://github.com/wevm/wagmi/commit/c7fd7fbde6f6c69a3a9a4f89d948c4dfb1d22679)]:\n  - @wagmi/core@0.9.5\n\n## 0.11.4\n\n### Patch Changes\n\n- [#1679](https://github.com/wevm/wagmi/pull/1679) [`3cef111b`](https://github.com/wevm/wagmi/commit/3cef111b1e30120233d8754b33587cdf94aedd8f) Thanks [@aj-may](https://github.com/aj-may)! - Fixed `useAccount` `onConnect` and `onDisconnect` callbacks for React Strict Mode.\n\n- [#1786](https://github.com/wevm/wagmi/pull/1786) [`b173a431`](https://github.com/wevm/wagmi/commit/b173a43165c7925a4e56ce1e0327a31917e7edc5) Thanks [@tmm](https://github.com/tmm)! - Locked ethers peer dependency version to >=5.5.1 <6\n\n- [#1787](https://github.com/wevm/wagmi/pull/1787) [`f023fd8f`](https://github.com/wevm/wagmi/commit/f023fd8f66befb78b9a4df5ca971ceaa64e37ab4) Thanks [@tmm](https://github.com/tmm)! - Added `SafeConnector`\n\n- Updated dependencies [[`b173a431`](https://github.com/wevm/wagmi/commit/b173a43165c7925a4e56ce1e0327a31917e7edc5), [`f023fd8f`](https://github.com/wevm/wagmi/commit/f023fd8f66befb78b9a4df5ca971ceaa64e37ab4)]:\n  - @wagmi/core@0.9.4\n\n## 0.11.3\n\n### Patch Changes\n\n- [#1773](https://github.com/wevm/wagmi/pull/1773) [`9aaf1955`](https://github.com/wevm/wagmi/commit/9aaf195514d3b5f4d085c797fc5021d42a9efb6c) Thanks [@jxom](https://github.com/jxom)! - Updated `@walletconnect/universal-provider` on `WalletConnectConnector` v2.\n  Added more signable methods to `WalletConnectConnector` v2.\n\n- [#1773](https://github.com/wevm/wagmi/pull/1773) [`9aaf1955`](https://github.com/wevm/wagmi/commit/9aaf195514d3b5f4d085c797fc5021d42a9efb6c) Thanks [@jxom](https://github.com/jxom)! - Added Telos to the `wagmi/chains` entrypoint. Thanks @donnyquixotic!\n\n- Updated dependencies [[`9aaf1955`](https://github.com/wevm/wagmi/commit/9aaf195514d3b5f4d085c797fc5021d42a9efb6c), [`9aaf1955`](https://github.com/wevm/wagmi/commit/9aaf195514d3b5f4d085c797fc5021d42a9efb6c)]:\n  - @wagmi/core@0.9.3\n\n## 0.11.2\n\n### Patch Changes\n\n- [#1756](https://github.com/wevm/wagmi/pull/1756) [`31d06b8c`](https://github.com/wevm/wagmi/commit/31d06b8ce1e7af5e9d1a7ba57f1743b2dff7a53d) Thanks [@jxom](https://github.com/jxom)! - Added OKC Chain. Thanks @clark-cui!\n\n- [#1756](https://github.com/wevm/wagmi/pull/1756) [`31d06b8c`](https://github.com/wevm/wagmi/commit/31d06b8ce1e7af5e9d1a7ba57f1743b2dff7a53d) Thanks [@jxom](https://github.com/jxom)! - Fixed race condition between `switchNetwork` and mutation Actions that use `chainId` (e.g. `sendTransaction`). Thanks @DanInTheD4rk!\n\n- Updated dependencies [[`31d06b8c`](https://github.com/wevm/wagmi/commit/31d06b8ce1e7af5e9d1a7ba57f1743b2dff7a53d), [`31d06b8c`](https://github.com/wevm/wagmi/commit/31d06b8ce1e7af5e9d1a7ba57f1743b2dff7a53d)]:\n  - @wagmi/core@0.9.2\n\n## 0.11.1\n\n### Patch Changes\n\n- [#1752](https://github.com/wevm/wagmi/pull/1752) [`144a0e76`](https://github.com/wevm/wagmi/commit/144a0e76ef4bb9ba0650b5ffb9c63f95329819a4) Thanks [@jxom](https://github.com/jxom)! - Improved `WalletConnectConnector` (v2) initialization & updated dependencies.\n\n- [#1752](https://github.com/wevm/wagmi/pull/1752) [`144a0e76`](https://github.com/wevm/wagmi/commit/144a0e76ef4bb9ba0650b5ffb9c63f95329819a4) Thanks [@jxom](https://github.com/jxom)! - Added the following chains to the `wagmi/chains` entrypoint:\n\n  - Aurora – thanks @salil-naik\n  - Bronos – thanks @chedetinaveen\n  - Canto – thanks @tster\n  - Celo – thanks @aaronmgdr\n\n- Updated dependencies [[`144a0e76`](https://github.com/wevm/wagmi/commit/144a0e76ef4bb9ba0650b5ffb9c63f95329819a4), [`144a0e76`](https://github.com/wevm/wagmi/commit/144a0e76ef4bb9ba0650b5ffb9c63f95329819a4)]:\n  - @wagmi/core@0.9.1\n\n## 0.11.0\n\n### Minor Changes\n\n- [#1732](https://github.com/wevm/wagmi/pull/1732) [`01e21897`](https://github.com/wevm/wagmi/commit/01e2189747a5c22dc758c6d719b4145adc2a643c) Thanks [@tmm](https://github.com/tmm)! - Bumped minimum TypeScript version to typescript@>=4.9.4. TypeScript 5.0 is coming soon and has some great features we are excited to bring into wagmi. To prepare for this, update your TypeScript version to 4.9.4 or higher. There are likely no [breaking changes](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-9.html#correctness-fixes-and-breaking-changes) if you are coming from typescript@4.7.x || typescript@4.8.x.\n\n### Patch Changes\n\n- Updated dependencies [[`01e21897`](https://github.com/wevm/wagmi/commit/01e2189747a5c22dc758c6d719b4145adc2a643c)]:\n  - @wagmi/core@0.9.0\n\n## 0.10.15\n\n### Patch Changes\n\n- [#1718](https://github.com/wevm/wagmi/pull/1718) [`e62b5ef8`](https://github.com/wevm/wagmi/commit/e62b5ef8aaa8063abb5264790768899ea35bbd31) Thanks [@tmm](https://github.com/tmm)! - Updated references\n\n- Updated dependencies [[`e62b5ef8`](https://github.com/wevm/wagmi/commit/e62b5ef8aaa8063abb5264790768899ea35bbd31)]:\n  - @wagmi/core@0.8.19\n\n## 0.10.14\n\n### Patch Changes\n\n- [#1708](https://github.com/wevm/wagmi/pull/1708) [`07fc3801`](https://github.com/wevm/wagmi/commit/07fc3801fa13c2cb5f7cf9b86ba8320b05a6a135) Thanks [@jxom](https://github.com/jxom)! - Updated `references/` submodule.\n\n- Updated dependencies [[`07fc3801`](https://github.com/wevm/wagmi/commit/07fc3801fa13c2cb5f7cf9b86ba8320b05a6a135)]:\n  - @wagmi/core@0.8.18\n\n## 0.10.13\n\n### Patch Changes\n\n- [#1705](https://github.com/wevm/wagmi/pull/1705) [`9ff797dc`](https://github.com/wevm/wagmi/commit/9ff797dcb979dc86b798a432b74c98598165430d) Thanks [@jxom](https://github.com/jxom)! - Added the following chains to the `wagmi/chains` entrypoint:\n\n  - `crossbell` (thanks @Songkeys)\n  - `filecoin` & `filecoinHyperspace` (thanks @neil0x46dc)\n  - `gnosisChiado` (thanks @theNvN)\n  - `metis` & `metisGoerli` (thanks @CookedCookee)\n\n- Updated dependencies [[`9ff797dc`](https://github.com/wevm/wagmi/commit/9ff797dcb979dc86b798a432b74c98598165430d)]:\n  - @wagmi/core@0.8.17\n\n## 0.10.12\n\n### Patch Changes\n\n- [#1699](https://github.com/wevm/wagmi/pull/1699) [`2f1e7950`](https://github.com/wevm/wagmi/commit/2f1e7950e55550d9b50ef5ccb97cb609f4af39b1) Thanks [@tmm](https://github.com/tmm)! - Added public RPC URL property to Chain\n\n- Updated dependencies [[`2f1e7950`](https://github.com/wevm/wagmi/commit/2f1e7950e55550d9b50ef5ccb97cb609f4af39b1)]:\n  - @wagmi/core@0.8.16\n\n## 0.10.11\n\n### Patch Changes\n\n- [#1685](https://github.com/wevm/wagmi/pull/1685) [`917f5bc1`](https://github.com/wevm/wagmi/commit/917f5bc1fad578e35a8c6ee787e339bfdc156bab) Thanks [@jxom](https://github.com/jxom)! - Replaced qrcodemodal with web3modal for the WalletConnect v2 Connector.\n\n- Updated dependencies [[`917f5bc1`](https://github.com/wevm/wagmi/commit/917f5bc1fad578e35a8c6ee787e339bfdc156bab)]:\n  - @wagmi/core@0.8.15\n\n## 0.10.10\n\n### Patch Changes\n\n- [#1648](https://github.com/wevm/wagmi/pull/1648) [`a2db9170`](https://github.com/wevm/wagmi/commit/a2db91709720161cd70eeb5e84dd78433264f0a3) Thanks [@tmm](https://github.com/tmm)! - Exported internal type.\n\n## 0.10.9\n\n### Patch Changes\n\n- [#1646](https://github.com/wevm/wagmi/pull/1646) [`fcdbe353`](https://github.com/wevm/wagmi/commit/fcdbe3531e6d05cda4a4a511bae1ad4c9e426d88) Thanks [@jxom](https://github.com/jxom)! - Upgraded `zustand` to v4.3.1.\n\n- Updated dependencies [[`fcdbe353`](https://github.com/wevm/wagmi/commit/fcdbe3531e6d05cda4a4a511bae1ad4c9e426d88)]:\n  - @wagmi/core@0.8.14\n\n## 0.10.8\n\n### Patch Changes\n\n- [#1639](https://github.com/wevm/wagmi/pull/1639) [`c6869f06`](https://github.com/wevm/wagmi/commit/c6869f0604fffb197752a08256f31db77f52e746) Thanks [@jxom](https://github.com/jxom)! - Added `isRainbow` flag to `InjectedConnector`.\n\n- Updated dependencies [[`c6869f06`](https://github.com/wevm/wagmi/commit/c6869f0604fffb197752a08256f31db77f52e746)]:\n  - @wagmi/core@0.8.13\n\n## 0.10.7\n\n### Patch Changes\n\n- [#1636](https://github.com/wevm/wagmi/pull/1636) [`025f6771`](https://github.com/wevm/wagmi/commit/025f6771b32ff7eed22f527be81c5141ddaf9c3d) Thanks [@DanielSinclair](https://github.com/DanielSinclair)! - Added `isRainbow` flag to injected `window.ethereum` types.\n\n- Updated dependencies [[`025f6771`](https://github.com/wevm/wagmi/commit/025f6771b32ff7eed22f527be81c5141ddaf9c3d)]:\n  - @wagmi/core@0.8.12\n\n## 0.10.6\n\n### Patch Changes\n\n- [#1623](https://github.com/wevm/wagmi/pull/1623) [`c97a4bc5`](https://github.com/wevm/wagmi/commit/c97a4bc5df422dc9a9d3d8bac0261ec6933ce15b) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where `useSigner` would not update on account change.\n\n## 0.10.5\n\n### Patch Changes\n\n- [#1621](https://github.com/wevm/wagmi/pull/1621) [`5812b590`](https://github.com/wevm/wagmi/commit/5812b5909277bf2862cb57a31d52465b47291410) Thanks [@tmm](https://github.com/tmm)! - Bumped @wagmi/connectors\n\n- Updated dependencies [[`5812b590`](https://github.com/wevm/wagmi/commit/5812b5909277bf2862cb57a31d52465b47291410)]:\n  - @wagmi/core@0.8.11\n\n## 0.10.4\n\n### Patch Changes\n\n- [#1607](https://github.com/wevm/wagmi/pull/1607) [`49a41357`](https://github.com/wevm/wagmi/commit/49a41357f9ca39479bdf759f5998bc169a91ac87) Thanks [@tmm](https://github.com/tmm)! - Exported hook types.\n\n## 0.10.3\n\n### Patch Changes\n\n- [#1598](https://github.com/wevm/wagmi/pull/1598) [`fc10ebe6`](https://github.com/wevm/wagmi/commit/fc10ebe659dd5f3b7a8e00581f094652280a779b) Thanks [@jxom](https://github.com/jxom)! - Fixed CJS dependency version range\n\n- Updated dependencies [[`fc10ebe6`](https://github.com/wevm/wagmi/commit/fc10ebe659dd5f3b7a8e00581f094652280a779b)]:\n  - @wagmi/core@0.8.10\n\n## 0.10.2\n\n### Patch Changes\n\n- [#1593](https://github.com/wevm/wagmi/pull/1593) [`216d555c`](https://github.com/wevm/wagmi/commit/216d555c62bd95c3c7c8f8e20f7269f6c8504610) Thanks [@jxom](https://github.com/jxom)! - Added CJS escape hatch bundle under the \"cjs\" tag.\n\n- Updated dependencies [[`216d555c`](https://github.com/wevm/wagmi/commit/216d555c62bd95c3c7c8f8e20f7269f6c8504610)]:\n  - @wagmi/core@0.8.9\n\n## 0.10.1\n\n### Patch Changes\n\n- [#1573](https://github.com/wevm/wagmi/pull/1573) [`ef380d9c`](https://github.com/wevm/wagmi/commit/ef380d9c6d51ae0495b9c35925d2843c75d97fd4) Thanks [@tmm](https://github.com/tmm)! - Updated internal types.\n\n- Updated dependencies [[`ef380d9c`](https://github.com/wevm/wagmi/commit/ef380d9c6d51ae0495b9c35925d2843c75d97fd4)]:\n  - @wagmi/core@0.8.8\n\n## 0.10.0\n\n### Minor Changes\n\n- [#1470](https://github.com/wevm/wagmi/pull/1470) [`3a1a6c9f`](https://github.com/wevm/wagmi/commit/3a1a6c9fe5db5c360adfd116f9a03a1238b5720c) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: The `useSigner` hook now always returns `undefined` when no signer is present. Previously, it returned `null`.\n\n  When no signer is present, the hook will be in an `\"idle\"` status.\n\n### Patch Changes\n\n- [#1470](https://github.com/wevm/wagmi/pull/1470) [`3a1a6c9f`](https://github.com/wevm/wagmi/commit/3a1a6c9fe5db5c360adfd116f9a03a1238b5720c) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where `useSigner` would broadcast to other `useSigner`s unnecessarily.\n\n- [#1470](https://github.com/wevm/wagmi/pull/1470) [`3a1a6c9f`](https://github.com/wevm/wagmi/commit/3a1a6c9fe5db5c360adfd116f9a03a1238b5720c) Thanks [@jxom](https://github.com/jxom)! - The `WalletConnectConnector` now supports WalletConnect v2.\n\n  It can be enabled by setting `version` to `'2'` and supplying a [WalletConnect Cloud `projectId`](https://cloud.walletconnect.com/sign-in).\n\n- [#1570](https://github.com/wevm/wagmi/pull/1570) [`216f585b`](https://github.com/wevm/wagmi/commit/216f585be8a9e3a56e3243f49ccd54d655b5a6dd) Thanks [@jxom](https://github.com/jxom)! - Added `useWatchPendingTransactions`\n\n- Updated dependencies [[`216f585b`](https://github.com/wevm/wagmi/commit/216f585be8a9e3a56e3243f49ccd54d655b5a6dd), [`3a1a6c9f`](https://github.com/wevm/wagmi/commit/3a1a6c9fe5db5c360adfd116f9a03a1238b5720c)]:\n  - @wagmi/core@0.8.7\n\n## 0.9.6\n\n### Patch Changes\n\n- [#1539](https://github.com/wevm/wagmi/pull/1539) [`732da004`](https://github.com/wevm/wagmi/commit/732da0042c7e28091b2e36a484ea8239971306f5) Thanks [@0xFlicker](https://github.com/0xFlicker)! - All Providers (ie. Alchemy, Infura, Public) now use the ENS Registry address on the wagmi `Chain` object (`chain.contracts.ensRegistry`).\n\n- [#1574](https://github.com/wevm/wagmi/pull/1574) [`ecde3d10`](https://github.com/wevm/wagmi/commit/ecde3d1029ccdf90e2853ba0e9ae4f5f4ebb9c4c) Thanks [@jxom](https://github.com/jxom)! - Added the following chains:\n\n  - `iotex`\n  - `iotexTestnet`\n  - `zkSync`\n  - `zkSyncTestnet`\n\n- Updated dependencies [[`732da004`](https://github.com/wevm/wagmi/commit/732da0042c7e28091b2e36a484ea8239971306f5), [`ecde3d10`](https://github.com/wevm/wagmi/commit/ecde3d1029ccdf90e2853ba0e9ae4f5f4ebb9c4c)]:\n  - @wagmi/core@0.8.6\n\n## 0.9.5\n\n### Patch Changes\n\n- [#1542](https://github.com/wevm/wagmi/pull/1542) [`731b3b73`](https://github.com/wevm/wagmi/commit/731b3b733c6a093d1693d49de601705b7c730549) Thanks [@jxom](https://github.com/jxom)! - Added the following chains:\n\n  - `evmos`\n  - `evmosTestnet`\n  - `gnosis`\n\n- [#1542](https://github.com/wevm/wagmi/pull/1542) [`731b3b73`](https://github.com/wevm/wagmi/commit/731b3b733c6a093d1693d49de601705b7c730549) Thanks [@jxom](https://github.com/jxom)! - Updated Goerli symbol to `\"ETH\"`.\n\n- [#1542](https://github.com/wevm/wagmi/pull/1542) [`731b3b73`](https://github.com/wevm/wagmi/commit/731b3b733c6a093d1693d49de601705b7c730549) Thanks [@jxom](https://github.com/jxom)! - Updated Arbitrum Goerli RPC and Block Explorer.\n\n- [#1542](https://github.com/wevm/wagmi/pull/1542) [`731b3b73`](https://github.com/wevm/wagmi/commit/731b3b733c6a093d1693d49de601705b7c730549) Thanks [@jxom](https://github.com/jxom)! - Fixed issue where connecting to MetaMask may return with a stale address.\n\n- [#1542](https://github.com/wevm/wagmi/pull/1542) [`731b3b73`](https://github.com/wevm/wagmi/commit/731b3b733c6a093d1693d49de601705b7c730549) Thanks [@jxom](https://github.com/jxom)! - Removed ENS registry for Sepolia.\n\n- Updated dependencies [[`731b3b73`](https://github.com/wevm/wagmi/commit/731b3b733c6a093d1693d49de601705b7c730549), [`731b3b73`](https://github.com/wevm/wagmi/commit/731b3b733c6a093d1693d49de601705b7c730549), [`731b3b73`](https://github.com/wevm/wagmi/commit/731b3b733c6a093d1693d49de601705b7c730549), [`731b3b73`](https://github.com/wevm/wagmi/commit/731b3b733c6a093d1693d49de601705b7c730549), [`731b3b73`](https://github.com/wevm/wagmi/commit/731b3b733c6a093d1693d49de601705b7c730549)]:\n  - @wagmi/core@0.8.5\n\n## 0.9.4\n\n### Patch Changes\n\n- [#1508](https://github.com/wevm/wagmi/pull/1508) [`0b50b62f`](https://github.com/wevm/wagmi/commit/0b50b62f7389619e429509a3e337e451e823b059) Thanks [@jxom](https://github.com/jxom)! - Updated `@wagmi/chains` to `0.1.3`.\n\n- [#1507](https://github.com/wevm/wagmi/pull/1507) [`7a083bcf`](https://github.com/wevm/wagmi/commit/7a083bcf31d671817a4da2f40fb2160a1ba9d7b7) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where `useBlockNumber` would return data when `watch` is enabled and `enabled` is falsy.\n\n- [#1504](https://github.com/wevm/wagmi/pull/1504) [`11b8b794`](https://github.com/wevm/wagmi/commit/11b8b794fbfd4a2b40f39962e2758e9fbf48cb54) Thanks [@tmm](https://github.com/tmm)! - Converted ethers custom \"ACTION_REJECTED\" error to standard RPC Error.\n\n- Updated dependencies [[`0b50b62f`](https://github.com/wevm/wagmi/commit/0b50b62f7389619e429509a3e337e451e823b059), [`11b8b794`](https://github.com/wevm/wagmi/commit/11b8b794fbfd4a2b40f39962e2758e9fbf48cb54)]:\n  - @wagmi/core@0.8.4\n\n## 0.9.3\n\n### Patch Changes\n\n- [#1431](https://github.com/wevm/wagmi/pull/1431) [`af28f8f9`](https://github.com/wevm/wagmi/commit/af28f8f9cfc227e7c391927fdb934183edb5c2dc) Thanks [@jxom](https://github.com/jxom)! - Re-export connectors from `@wagmi/connectors`\n\n- [#1431](https://github.com/wevm/wagmi/pull/1431) [`af28f8f9`](https://github.com/wevm/wagmi/commit/af28f8f9cfc227e7c391927fdb934183edb5c2dc) Thanks [@jxom](https://github.com/jxom)! - Added `LedgerConnector` connector\n\n- Updated dependencies [[`af28f8f9`](https://github.com/wevm/wagmi/commit/af28f8f9cfc227e7c391927fdb934183edb5c2dc), [`af28f8f9`](https://github.com/wevm/wagmi/commit/af28f8f9cfc227e7c391927fdb934183edb5c2dc)]:\n  - @wagmi/core@0.8.3\n\n## 0.9.2\n\n### Patch Changes\n\n- [#1442](https://github.com/wevm/wagmi/pull/1442) [`cde15289`](https://github.com/wevm/wagmi/commit/cde152899c758dea10787412b0aef669ed7202b2) Thanks [@0xproflupin](https://github.com/0xproflupin)! - Added Phantom wallet support to `InjectedConnector`\n\n- [#1448](https://github.com/wevm/wagmi/pull/1448) [`c6075f3a`](https://github.com/wevm/wagmi/commit/c6075f3a16885d850ad2656272351f9517c9f67b) Thanks [@tmm](https://github.com/tmm)! - Updated [ABIType](https://github.com/wevm/abitype) version.\n\n- [#1444](https://github.com/wevm/wagmi/pull/1444) [`310a8bc4`](https://github.com/wevm/wagmi/commit/310a8bc428ce4e7f68377f581b45dcdd64381cce) Thanks [@jxom](https://github.com/jxom)! - Assert that a `connector` exists before invoking the callback in `watchSigner`.\n\n- [#1434](https://github.com/wevm/wagmi/pull/1434) [`100e2a3b`](https://github.com/wevm/wagmi/commit/100e2a3b22f4602716554487b1d98738e053be76) Thanks [@tmm](https://github.com/tmm)! - Updated `MockConnector` `chainId` behavior to default to first chain from `chains` if not provided in `options`.\n\n- Updated dependencies [[`cde15289`](https://github.com/wevm/wagmi/commit/cde152899c758dea10787412b0aef669ed7202b2), [`c6075f3a`](https://github.com/wevm/wagmi/commit/c6075f3a16885d850ad2656272351f9517c9f67b), [`310a8bc4`](https://github.com/wevm/wagmi/commit/310a8bc428ce4e7f68377f581b45dcdd64381cce), [`100e2a3b`](https://github.com/wevm/wagmi/commit/100e2a3b22f4602716554487b1d98738e053be76)]:\n  - @wagmi/core@0.8.2\n\n## 0.9.1\n\n### Patch Changes\n\n- [#1437](https://github.com/wevm/wagmi/pull/1437) [`c34a3dc6`](https://github.com/wevm/wagmi/commit/c34a3dc6396e6473d9f0505fad88ec910f8f5275) Thanks [@jxom](https://github.com/jxom)! - Omitted `\"EIP712Domain\"` type from `signTypedData` `types` arg since ethers throws an [internal error](https://github.com/ethers-io/ethers.js/blob/c80fcddf50a9023486e9f9acb1848aba4c19f7b6/packages/hash/src.ts/typed-data.ts#L466) if you include it.\n\n- [#1445](https://github.com/wevm/wagmi/pull/1445) [`51dd53cb`](https://github.com/wevm/wagmi/commit/51dd53cba3fe0f79fa1393270b738194577ddf54) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where the wagmi client wouldn't rehydrate the store in local storage when `autoConnect` is truthy.\n\n- Updated dependencies [[`c34a3dc6`](https://github.com/wevm/wagmi/commit/c34a3dc6396e6473d9f0505fad88ec910f8f5275), [`51dd53cb`](https://github.com/wevm/wagmi/commit/51dd53cba3fe0f79fa1393270b738194577ddf54)]:\n  - @wagmi/core@0.8.1\n\n## 0.9.0\n\n### Minor Changes\n\n- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: With the introduction of the [`wagmi/chains` entrypoint](/react/chains#wagmichains), `wagmi` no longer exports the following:\n\n  - `chain`\n  - `allChains`\n  - `defaultChains`\n  - `defaultL2Chains`\n  - `chainId`\n  - `etherscanBlockExplorers`\n  - `alchemyRpcUrls`, `infuraRpcUrls`, `publicRpcUrls`\n\n  Read below for migration steps.\n\n  #### Removed `chain`\n\n  The `chain` export has been removed. `wagmi` now only exports the `mainnet` & `goerli` chains. If you need to use an alternative chain (`polygon`, `optimism`, etc), you will need to import it from the [`wagmi/chains` entrypoint](/react/chains#wagmichains).\n\n  ```diff\n  import {\n  - chain\n    configureChains\n  } from 'wagmi'\n  + import { mainnet, polygon, optimism } from 'wagmi/chains'\n\n  const { ... } = configureChains(\n  - [chain.mainnet, chain.polygon, chain.optimism],\n  + [mainnet, polygon, optimism],\n    {\n      ...\n    }\n  )\n  ```\n\n  #### Removed `allChains`\n\n  The `allChains` export has been removed. If you need a list of all chains, you can utilize [`wagmi/chains` entrypoint](/react/chains#wagmichains).\n\n  ```diff\n  - import { allChains } from 'wagmi'\n  + import * as allChains from 'wagmi/chains'\n\n  const { ... } = configureChains(allChains, ...)\n  ```\n\n  #### Removed `defaultChains` & `defaultL2Chains`\n\n  The `defaultChains` & `defaultL2Chains` exports have been removed. If you still need the `defaultChains` or `defaultL2Chains` exports, you can build them yourself:\n\n  ```diff\n  - import { defaultChains } from 'wagmi'\n  + import { mainnet, goerli } from 'wagmi/chains'\n\n  + const defaultChains = [mainnet, goerli]\n  ```\n\n  > The `defaultChains` export was previously populated with `mainnet` & `goerli`.\n\n  ```diff\n  - import { defaultL2Chains } from 'wagmi'\n  + import {\n  +   arbitrum,\n  +   arbitrumGoerli,\n  +   polygon,\n  +   polygonMumbai,\n  +   optimism,\n  +   optimismGoerli\n  + } from 'wagmi/chains'\n\n  + const defaultL2Chains = [\n  +  arbitrum,\n  +  arbitrumGoerli,\n  +  polygon,\n  +  polygonMumbai,\n  +  optimism\n  +  optimismGoerli\n  + ]\n  ```\n\n  > The `defaultL2Chains` export was previously populated with `arbitrum` & `optimism`.\n\n  #### Removed `chainId`\n\n  The `chainId` export has been removed. You can extract a chain ID from the chain itself.\n\n  ```diff\n  - import { chainId } from 'wagmi'\n  + import { mainnet, polygon, optimism } from 'wagmi/chains'\n\n  -const mainnetChainId = chainId.mainnet\n  -const polygonChainId = chainId.polygon\n  -const optimismChainId = chainId.optimism\n  +const mainnetChainId = mainnet.chainId\n  +const polygonChainId = polygon.chainId\n  +const optimismChainId = optimism.chainId\n  ```\n\n  #### Removed `etherscanBlockExplorers`\n\n  The `etherscanBlockExplorers` export has been removed. You can extract a block explorer from the chain itself.\n\n  ```diff\n  - import { etherscanBlockExplorers } from 'wagmi'\n  + import { mainnet, polygon, optimism } from 'wagmi/chains'\n\n  -const mainnetEtherscanBlockExplorer = etherscanBlockExplorers.mainnet\n  -const polygonEtherscanBlockExplorer = etherscanBlockExplorers.polygon\n  -const optimismEtherscanBlockExplorer = etherscanBlockExplorers.optimism\n  +const mainnetEtherscanBlockExplorer = mainnet.blockExplorer\n  +const polygonEtherscanBlockExplorer = polygon.blockExplorer\n  +const optimismEtherscanBlockExplorer = optimism.blockExplorer\n  ```\n\n  #### Removed `alchemyRpcUrls`, `infuraRpcUrls` & `publicRpcUrls`\n\n  The `alchemyRpcUrls`, `infuraRpcUrls` & `publicRpcUrls` exports have been removed. You can extract a RPC URL from the chain itself.\n\n  ```diff\n  - import { alchemyRpcUrls, infuraRpcUrls, publicRpcUrls } from 'wagmi'\n  + import { mainnet } from 'wagmi/chains'\n\n  -const mainnetAlchemyRpcUrl = alchemyRpcUrls.mainnet\n  -const mainnetInfuraRpcUrl = infuraRpcUrls.mainnet\n  -const mainnetOptimismRpcUrl = publicRpcUrls.mainnet\n  +const mainnetAlchemyRpcUrl = mainnet.rpcUrls.alchemy\n  +const mainnetInfuraRpcUrl = mainnet.rpcUrls.infura\n  +const mainnetOptimismRpcUrl = mainnet.rpcUrls.optimism\n  ```\n\n- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: the shape of the `Chain` type has been modified.\n\n  #### RPC URLs\n\n  The `rpcUrls` shape has changed to include an array of URLs, and also the transport method (`http` or `webSocket`):\n\n  ```diff\n  type Chain = {\n    ...\n    rpcUrls: {\n  -   [key: string]: string\n  +   [key: string]: {\n  +     http: string[]\n  +     webSocket: string[]\n  +   }\n    }\n    ...\n  }\n  ```\n\n  Note that you will also need to ensure that usage is migrated:\n\n  ```diff\n  - const rpcUrl = mainnet.rpcUrls.alchemy\n  + const rpcUrl = mainnet.rpcUrls.alchemy.http[0]\n  ```\n\n  #### Contracts\n\n  The `multicall` and `ens` attributes have been moved into the `contracts` object:\n\n  ```diff\n  type Contract = {\n    address: Address\n    blockCreated?: number\n  }\n\n  type Chain = {\n    ...\n  - multicall: Contract\n  - ens: Contract\n  + contracts: {\n  +   multicall3: Contract\n  +   ensRegistry: Contract\n  + }\n    ...\n  }\n  ```\n\n  Note that you will also need to ensure that usage is migrated:\n\n  ```diff\n  - const multicallContract = mainnet.multicall\n  + const multicallContract = mainnet.contracts.multicall3\n  ```\n\n- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: Removed the `wait` config option on `useWaitForTransaction`. Use the transaction `hash` instead.\n\n  ```diff\n  const { data } = useWaitForTransaction({\n  - wait: transaction.wait\n  + hash: transaction.hash\n  })\n  ```\n\n- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - Updated errors to use `cause` instead of `internal`\n\n- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - `useEnsResolver`'s result is no longer persisted by the query client since it cannot serialize its prototype methods.\n\n- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: Changed `useWaitForTransaction` behavior to return an error if the transaction reverted.\n\n### Patch Changes\n\n- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - `useWaitForTransaction` now throws an error for cancelled or replaced transactions.\n\n- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - `useWaitForTransaction` now respects repriced (sped up) transactions.\n\n- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - Updated `@coinbase/wallet-sdk` to `^3.6.0`.\n\n- Updated dependencies [[`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652), [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652), [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652), [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652), [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652), [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652), [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652), [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652), [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652)]:\n  - @wagmi/core@0.8.0\n\n## 0.8.10\n\n### Patch Changes\n\n- [#1411](https://github.com/wevm/wagmi/pull/1411) [`659be184`](https://github.com/wevm/wagmi/commit/659be1840c613ce9f7aca9ac96694c4f60da4a66) Thanks [@tmm](https://github.com/tmm)! - Fixed issue where block invalidation was not properly disabled when setting `enabled: false`.\n\n- [#1409](https://github.com/wevm/wagmi/pull/1409) [`b557b3ee`](https://github.com/wevm/wagmi/commit/b557b3ee4fc58217e61d860fc3d1109d2abc813e) Thanks [@jxom](https://github.com/jxom)! - Ensure that `useSyncExternalStoreWithTracked` rerenders when no values are being tracked.\n\n- Updated dependencies [[`659be184`](https://github.com/wevm/wagmi/commit/659be1840c613ce9f7aca9ac96694c4f60da4a66)]:\n  - @wagmi/core@0.7.9\n\n## 0.8.9\n\n### Patch Changes\n\n- [#1406](https://github.com/wevm/wagmi/pull/1406) [`4f18c450`](https://github.com/wevm/wagmi/commit/4f18c450a4d7952bfcfa6c533348ffbe55893d3c) Thanks [@tmm](https://github.com/tmm)! - Function for selecting the [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193) Ethereum Provider to target. Defaults to `() => typeof window !== 'undefined' ? window.ethereum : undefined`.\n\n  ```ts\n  import { InjectedConnector } from \"wagmi/connectors/injected\";\n\n  const connector = new InjectedConnector({\n    options: {\n      name: \"My Injected Wallet\",\n      getProvider: () =>\n        typeof window !== \"undefined\" ? window.myInjectedWallet : undefined,\n    },\n  });\n  ```\n\n- Updated dependencies [[`4f18c450`](https://github.com/wevm/wagmi/commit/4f18c450a4d7952bfcfa6c533348ffbe55893d3c)]:\n  - @wagmi/core@0.7.8\n\n## 0.8.8\n\n### Patch Changes\n\n- [#1386](https://github.com/wevm/wagmi/pull/1386) [`206a2adb`](https://github.com/wevm/wagmi/commit/206a2adbb4ee5149a364543b34612050ccf78c21) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where `persister` would still use `window.localStorage` instead of the wagmi `storage`.\n\n- [#1376](https://github.com/wevm/wagmi/pull/1376) [`a70a9528`](https://github.com/wevm/wagmi/commit/a70a9528f93f4d7fea28b7652751dfef2dcacf9b) Thanks [@jxom](https://github.com/jxom)! - Fixed issue where `switchChain` on `WalletConnectConnector` would not resolve.\n\n- [#1392](https://github.com/wevm/wagmi/pull/1392) [`88afc849`](https://github.com/wevm/wagmi/commit/88afc84978afe9689ab7364633e4422ecd7699ea) Thanks [@tmm](https://github.com/tmm)! - Added check for active connector when connecting\n\n- Updated dependencies [[`206a2adb`](https://github.com/wevm/wagmi/commit/206a2adbb4ee5149a364543b34612050ccf78c21), [`a70a9528`](https://github.com/wevm/wagmi/commit/a70a9528f93f4d7fea28b7652751dfef2dcacf9b), [`206a2adb`](https://github.com/wevm/wagmi/commit/206a2adbb4ee5149a364543b34612050ccf78c21), [`88afc849`](https://github.com/wevm/wagmi/commit/88afc84978afe9689ab7364633e4422ecd7699ea)]:\n  - @wagmi/core@0.7.7\n\n## 0.8.7\n\n### Patch Changes\n\n- [#1384](https://github.com/wevm/wagmi/pull/1384) [`027e88d6`](https://github.com/wevm/wagmi/commit/027e88d6e5f8d028d46ee78aec8500701e0173d9) Thanks [@tmm](https://github.com/tmm)! - Fixed issue reconnecting after disconnect with `MetaMaskConnector` in MetaMask mobile browser.\n\n- [#1377](https://github.com/wevm/wagmi/pull/1377) [`089c4f3b`](https://github.com/wevm/wagmi/commit/089c4f3b3b8ce5cf7807f144410e2f64b72e0580) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where transforming `useContractRead`, `useContractReads` or `useContractInfiniteReads`'s return data via `select` wasn't inferring the type.\n\n- Updated dependencies [[`027e88d6`](https://github.com/wevm/wagmi/commit/027e88d6e5f8d028d46ee78aec8500701e0173d9)]:\n  - @wagmi/core@0.7.6\n\n## 0.8.6\n\n### Patch Changes\n\n- [`1169914a`](https://github.com/wevm/wagmi/commit/1169914a0f0ad2810ca1c536b1f1bc6c20f2c1be) Thanks [@jxom](https://github.com/jxom)! - Use `get_accounts` for `getSigner` in InjectedConnector\n\n- Updated dependencies [[`1169914a`](https://github.com/wevm/wagmi/commit/1169914a0f0ad2810ca1c536b1f1bc6c20f2c1be)]:\n  - @wagmi/core@0.7.5\n\n## 0.8.5\n\n### Patch Changes\n\n- [#1282](https://github.com/wevm/wagmi/pull/1282) [`6d286c9e`](https://github.com/wevm/wagmi/commit/6d286c9ed6f64a9872352904d4d171a6bc1c7a96) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where `useContractRead` would perform an unnecessary rerender if another hook had `watch` enabled.\n\n## 0.8.4\n\n### Patch Changes\n\n- [#1309](https://github.com/wevm/wagmi/pull/1309) [`1f4a4261`](https://github.com/wevm/wagmi/commit/1f4a4261247b1d3a90e3123157bc851a35d49b9c) Thanks [@tmm](https://github.com/tmm)! - Fixed internal type\n\n- Updated dependencies [[`1f4a4261`](https://github.com/wevm/wagmi/commit/1f4a4261247b1d3a90e3123157bc851a35d49b9c)]:\n  - @wagmi/core@0.7.4\n\n## 0.8.3\n\n### Patch Changes\n\n- [#1294](https://github.com/wevm/wagmi/pull/1294) [`b2f88949`](https://github.com/wevm/wagmi/commit/b2f88949f32aabaf13f318472648cd51a8b7f2e7) Thanks [@tmm](https://github.com/tmm)! - Set `abi` return type value for `usePrepareContractWrite` as more permissive when not inferrable as `Abi`.\n\n- Updated dependencies [[`b2f88949`](https://github.com/wevm/wagmi/commit/b2f88949f32aabaf13f318472648cd51a8b7f2e7)]:\n  - @wagmi/core@0.7.3\n\n## 0.8.2\n\n### Patch Changes\n\n- [`e9f806b6`](https://github.com/wevm/wagmi/commit/e9f806b652ba62effb3ddac464815e447fc287f6) Thanks [@tmm](https://github.com/tmm)! - Bumped abitype and zustand versions.\n\n- [#1290](https://github.com/wevm/wagmi/pull/1290) [`88450052`](https://github.com/wevm/wagmi/commit/88450052b9f070fe53e18d84f72918c410b961f0) Thanks [@tmm](https://github.com/tmm)! - Fixed `useAccount`'s' `onConnect` callback `isReconnected` flag.\n\n- Updated dependencies [[`e9f806b6`](https://github.com/wevm/wagmi/commit/e9f806b652ba62effb3ddac464815e447fc287f6)]:\n  - @wagmi/core@0.7.2\n\n## 0.8.1\n\n### Patch Changes\n\n- [#1272](https://github.com/wevm/wagmi/pull/1272) [`1f7fc41`](https://github.com/wevm/wagmi/commit/1f7fc419f7960bbdc51dfa85c2f33b89f1ecc1bf) Thanks [@tmm](https://github.com/tmm)! - Fixed ethers import path\n\n- Updated dependencies [[`1f7fc41`](https://github.com/wevm/wagmi/commit/1f7fc419f7960bbdc51dfa85c2f33b89f1ecc1bf)]:\n  - @wagmi/core@0.7.1\n\n## 0.8.0\n\n### Minor Changes\n\n- [#1202](https://github.com/wevm/wagmi/pull/1202) [`9bf56af`](https://github.com/wevm/wagmi/commit/9bf56af3c30bdb80abb1e785c002e00986fadfb2) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: Removed the following deprecated chains:\n\n  - `ropsten`\n  - `rinkeby`\n  - `kovan`\n  - `optimismKovan`\n  - `arbitrumRinkeby`\n\n  If you feel you still need to include one of these testnets in your application, you will have to define it manually:\n\n  ```diff\n  -import { rinkeby } from 'wagmi'\n  +import { Chain } from 'wagmi'\n\n  +export const rinkeby: Chain = {\n  + id: 4,\n  + name: 'Rinkeby',\n  + network: 'rinkeby',\n  + nativeCurrency: { name: 'Rinkeby Ether', symbol: 'ETH', decimals: 18 },\n  + rpcUrls: {\n  +   alchemy: 'https://eth-rinkeby.alchemyapi.io/v2',\n  +   default: 'https://rpc.ankr.com/eth_rinkeby',\n  +   infura: 'https://rinkeby.infura.io/v3',\n  +   public: 'https://rpc.ankr.com/eth_rinkeby',\n  +  },\n  + blockExplorers: {\n  +   etherscan: 'https://rinkeby.etherscan.io',\n  +   default: 'https://rinkeby.etherscan.io',\n  + },\n  + ens: {\n  +   address: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n  + },\n  + multicall: {\n  +   address: '0xca11bde05977b3631167028862be2a173976ca11',\n  +   blockCreated: 10299530,\n  + },\n  + testnet: true,\n  }\n  ```\n\n  You can reference these removed chains [here](https://github.com/wevm/wagmi/blob/389765f7d9af063ab0df07389a2bbfbc10a41060/packages/core/src/constants/chains.ts).\n\n- [#1202](https://github.com/wevm/wagmi/pull/1202) [`9bf56af`](https://github.com/wevm/wagmi/commit/9bf56af3c30bdb80abb1e785c002e00986fadfb2) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: Made `apiKey` required on `infuraProvider` and `alchemyProvider`.\n\n  ```diff\n  import { configureChains } from 'wagmi'\n\n  const config = configureChains(defaultChains, [\n  - alchemyProvider(),\n  + alchemyProvider({ apiKey: process.env.ALCHEMY_API_KEY })\n  ])\n  ```\n\n  You can find your Alchemy API key from the [Alchemy Dashboard](https://dashboard.alchemyapi.io/), or your Infura API key from the [Infura Dashboard](https://infura.io/login).\n\n- [#1202](https://github.com/wevm/wagmi/pull/1202) [`9bf56af`](https://github.com/wevm/wagmi/commit/9bf56af3c30bdb80abb1e785c002e00986fadfb2) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: `addressOrName` renamed to `address` for `useBalance` and `useEnsAvatar`.\n\n  ```diff\n  const result = useBalance({\n  - addressOrName: '0x…',\n  + address: '0x…',\n  })\n  ```\n\n  If you were using an ENS name instead of an address, you can resolve the name to an address before passing it to the action.\n\n  ```diff\n  + const { data: address } = useEnsAddress({ name: 'example.eth' })\n  const result = useBalance({\n  - addressOrName: 'example.eth',\n  + address,\n  })\n  ```\n\n- [#1202](https://github.com/wevm/wagmi/pull/1202) [`9bf56af`](https://github.com/wevm/wagmi/commit/9bf56af3c30bdb80abb1e785c002e00986fadfb2) Thanks [@tmm](https://github.com/tmm)! - Removed CommonJS support\n\n### Patch Changes\n\n- Updated dependencies [[`9bf56af`](https://github.com/wevm/wagmi/commit/9bf56af3c30bdb80abb1e785c002e00986fadfb2), [`9bf56af`](https://github.com/wevm/wagmi/commit/9bf56af3c30bdb80abb1e785c002e00986fadfb2), [`9bf56af`](https://github.com/wevm/wagmi/commit/9bf56af3c30bdb80abb1e785c002e00986fadfb2), [`9bf56af`](https://github.com/wevm/wagmi/commit/9bf56af3c30bdb80abb1e785c002e00986fadfb2)]:\n  - @wagmi/core@0.7.0\n\n## 0.7.15\n\n### Patch Changes\n\n- [#1262](https://github.com/wevm/wagmi/pull/1262) [`45e2ca4`](https://github.com/wevm/wagmi/commit/45e2ca4d1f33a7b1165c387d420b8d47f4f66935) Thanks [@tmm](https://github.com/tmm)! - Added default for `structuralSharing` for `useContractRead`, `useContractReads`, and `useContractInfiniteReads`.\n\n## 0.7.14\n\n### Patch Changes\n\n- [#1260](https://github.com/wevm/wagmi/pull/1260) [`0e12f03`](https://github.com/wevm/wagmi/commit/0e12f0380442bccca9ed18991e783819778032fe) Thanks [@ilmpc](https://github.com/ilmpc)! - Deprecated `isDataEqual` option from and added `structuralSharing` option to `useContractRead`, `useContractReads`, and `useContractInfiniteReads`.\n\n## 0.7.13\n\n### Patch Changes\n\n- [#1250](https://github.com/wevm/wagmi/pull/1250) [`ce2e0f4`](https://github.com/wevm/wagmi/commit/ce2e0f4a46b8fd1c509ead552012ef4c072a525b) Thanks [@tmm](https://github.com/tmm)! - Added support for Trust Wallet browser extension.\n\n- Updated dependencies [[`ce2e0f4`](https://github.com/wevm/wagmi/commit/ce2e0f4a46b8fd1c509ead552012ef4c072a525b)]:\n  - @wagmi/core@0.6.12\n\n## 0.7.12\n\n### Patch Changes\n\n- [#1234](https://github.com/wevm/wagmi/pull/1234) [`3ff9303`](https://github.com/wevm/wagmi/commit/3ff930349250f62137cca4ca3b382522882abf8a) Thanks [@tmm](https://github.com/tmm)! - Fixed issue with adding chain to wallet without block explorer URL.\n\n- Updated dependencies [[`3ff9303`](https://github.com/wevm/wagmi/commit/3ff930349250f62137cca4ca3b382522882abf8a)]:\n  - @wagmi/core@0.6.11\n\n## 0.7.11\n\n### Patch Changes\n\n- [#1232](https://github.com/wevm/wagmi/pull/1232) [`c0ca509`](https://github.com/wevm/wagmi/commit/c0ca509506dcf6d98b058df549dc761c9a5f3d1c) Thanks [@tmm](https://github.com/tmm)! - Added validation to check that chain is configured for connector when accessing `Signer`.\n\n- Updated dependencies [[`c0ca509`](https://github.com/wevm/wagmi/commit/c0ca509506dcf6d98b058df549dc761c9a5f3d1c)]:\n  - @wagmi/core@0.6.10\n\n## 0.7.10\n\n### Patch Changes\n\n- [#1206](https://github.com/wevm/wagmi/pull/1206) [`15ff089`](https://github.com/wevm/wagmi/commit/15ff0896216abecf5967294ae5aeb26ea7fb480b) Thanks [@jxom](https://github.com/jxom)! - Added `scopeKey` as a configuration option to the Hooks which scope its cache to a given context. Hooks that have identical scope will share the same cache.\n\n- [#1207](https://github.com/wevm/wagmi/pull/1207) [`c73d463`](https://github.com/wevm/wagmi/commit/c73d463d65c9dbfcfe709187e47323a769589741) Thanks [@lvshaoping007](https://github.com/lvshaoping007)! - Added Kucoin wallet support to `InjectedConnector`\n\n- Updated dependencies [[`c73d463`](https://github.com/wevm/wagmi/commit/c73d463d65c9dbfcfe709187e47323a769589741)]:\n  - @wagmi/core@0.6.9\n\n## 0.7.9\n\n### Patch Changes\n\n- [#1201](https://github.com/wevm/wagmi/pull/1201) [`9a07efa`](https://github.com/wevm/wagmi/commit/9a07efaa397d3ba03f2edbe527c359f21e22139a) Thanks [@jxom](https://github.com/jxom)! - Fixed issue where non-checksum addresses did not resolve with an ENS name\n\n- [#1132](https://github.com/wevm/wagmi/pull/1132) [`d41c0d6`](https://github.com/wevm/wagmi/commit/d41c0d650f8c0e54145758685b7604b8909d7ae0) Thanks [@toniocodo](https://github.com/toniocodo)! - Added ERC-4626 ABI\n\n- Updated dependencies [[`d41c0d6`](https://github.com/wevm/wagmi/commit/d41c0d650f8c0e54145758685b7604b8909d7ae0), [`9a07efa`](https://github.com/wevm/wagmi/commit/9a07efaa397d3ba03f2edbe527c359f21e22139a)]:\n  - @wagmi/core@0.6.8\n\n## 0.7.8\n\n### Patch Changes\n\n- [#1174](https://github.com/wevm/wagmi/pull/1174) [`196a458`](https://github.com/wevm/wagmi/commit/196a458f64141e8a9f39c1b1e1af5937f692cb39) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where `client.chains` (active connector chains) would be populated when there is no active connector (disconnected user).\n\n- [#1176](https://github.com/wevm/wagmi/pull/1176) [`389765f`](https://github.com/wevm/wagmi/commit/389765f7d9af063ab0df07389a2bbfbc10a41060) Thanks [@jxom](https://github.com/jxom)! - Migrate away from Alchemy RPC URLs in the public RPC URL list\n\n- Updated dependencies [[`196a458`](https://github.com/wevm/wagmi/commit/196a458f64141e8a9f39c1b1e1af5937f692cb39), [`389765f`](https://github.com/wevm/wagmi/commit/389765f7d9af063ab0df07389a2bbfbc10a41060)]:\n  - @wagmi/core@0.6.7\n\n## 0.7.7\n\n### Patch Changes\n\n- [#1166](https://github.com/wevm/wagmi/pull/1166) [`6fbe910`](https://github.com/wevm/wagmi/commit/6fbe91080b54e33e8543e9638ff5089e749ada3f) Thanks [@jxom](https://github.com/jxom)! - Export the React entrypoint `Client` type instead of `@wagmi/core`'s `Client`.\n\n- [`81ce9e6`](https://github.com/wevm/wagmi/commit/81ce9e64d85f7d01370324c1a529988a0919894f) Thanks [@jxom](https://github.com/jxom)! - Add `isPortal` to injected MetaMask flags.\n\n- [`c2c0109`](https://github.com/wevm/wagmi/commit/c2c01096ef4cd0ffadbb49062969c208604c6194) Thanks [@jxom](https://github.com/jxom)! - Add etherscan block explorer to Optimism Goerli\n\n- Updated dependencies [[`81ce9e6`](https://github.com/wevm/wagmi/commit/81ce9e64d85f7d01370324c1a529988a0919894f), [`c2c0109`](https://github.com/wevm/wagmi/commit/c2c01096ef4cd0ffadbb49062969c208604c6194)]:\n  - @wagmi/core@0.6.6\n\n## 0.7.6\n\n### Patch Changes\n\n- [#1162](https://github.com/wevm/wagmi/pull/1162) [`30335b3`](https://github.com/wevm/wagmi/commit/30335b3199fb425e398e9c492b50c68d5e2ade7e) Thanks [@tmm](https://github.com/tmm)! - Fixed issue where non-indexed event parameter types were set to `null`.\n\n- [#1162](https://github.com/wevm/wagmi/pull/1162) [`30335b3`](https://github.com/wevm/wagmi/commit/30335b3199fb425e398e9c492b50c68d5e2ade7e) Thanks [@tmm](https://github.com/tmm)! - Fixed issue where `useContractReads` and `useContractInfiniteReads` types were slowing down TypeScript compiler.\n\n- Updated dependencies [[`30335b3`](https://github.com/wevm/wagmi/commit/30335b3199fb425e398e9c492b50c68d5e2ade7e), [`30335b3`](https://github.com/wevm/wagmi/commit/30335b3199fb425e398e9c492b50c68d5e2ade7e)]:\n  - @wagmi/core@0.6.5\n\n## 0.7.5\n\n### Patch Changes\n\n- [#1103](https://github.com/wevm/wagmi/pull/1103) [`651eda0`](https://github.com/wevm/wagmi/commit/651eda06384bd0955268427f898e9337b2dc5a31) Thanks [@tmm](https://github.com/tmm)! - Bumped `abitype` dependency.\n\n- Updated dependencies [[`651eda0`](https://github.com/wevm/wagmi/commit/651eda06384bd0955268427f898e9337b2dc5a31)]:\n  - @wagmi/core@0.6.4\n\n## 0.7.4\n\n### Patch Changes\n\n- [#1099](https://github.com/wevm/wagmi/pull/1099) [`748e617`](https://github.com/wevm/wagmi/commit/748e61719ad706acae057be903321ebe0c2e817e) Thanks [@jxom](https://github.com/jxom)! - Added `isFetchedAfterMount` to the return value of hooks.\n\n  The `isFetchedAfterMount` will be truthy if the hook has fetched after the component has been mounted. This value can be utilized to not show the result if it has previously been cached.\n\n- [#1091](https://github.com/wevm/wagmi/pull/1091) [`a3aaf59`](https://github.com/wevm/wagmi/commit/a3aaf590e8e993017baa9a1ac50ecd63dd287caf) Thanks [@tmm](https://github.com/tmm)! - Fixed `useAccount` `onConnect`/`onDisconnect` from not firing when the account was already connected/disconnected.\n\n## 0.7.3\n\n### Patch Changes\n\n- [#1086](https://github.com/wevm/wagmi/pull/1086) [`4e28d2a`](https://github.com/wevm/wagmi/commit/4e28d2ad4c2e6b3479b728563040b9529463cbcf) Thanks [@tmm](https://github.com/tmm)! - Exposed module types.\n\n- Updated dependencies [[`4e28d2a`](https://github.com/wevm/wagmi/commit/4e28d2ad4c2e6b3479b728563040b9529463cbcf)]:\n  - @wagmi/core@0.6.3\n\n## 0.7.2\n\n### Patch Changes\n\n- [#1080](https://github.com/wevm/wagmi/pull/1080) [`3be5e8b`](https://github.com/wevm/wagmi/commit/3be5e8b01e58ed40cc9dab7ef9533c0197cb74d0) Thanks [@tmm](https://github.com/tmm)! - Added `abitype` to `dependencies` so types ship correctly.\n\n- Updated dependencies [[`3be5e8b`](https://github.com/wevm/wagmi/commit/3be5e8b01e58ed40cc9dab7ef9533c0197cb74d0)]:\n  - @wagmi/core@0.6.2\n\n## 0.7.1\n\n### Patch Changes\n\n- [#1074](https://github.com/wevm/wagmi/pull/1074) [`8db807f`](https://github.com/wevm/wagmi/commit/8db807f16149aa278c2a7db9ee5245431db12173) Thanks [@IljaDaderko](https://github.com/IljaDaderko)! - Exported `EventListener` type\n\n- Updated dependencies [[`8db807f`](https://github.com/wevm/wagmi/commit/8db807f16149aa278c2a7db9ee5245431db12173)]:\n  - @wagmi/core@0.6.1\n\n## 0.7.0\n\n### Minor Changes\n\n- [#940](https://github.com/wevm/wagmi/pull/940) [`b6cb8f4`](https://github.com/wevm/wagmi/commit/b6cb8f4cd15eb13073bc7e9ecb4bfa2c261c0663) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: `usePrepareContractWrite` now throws when a `chainId` is specified and the end-user is on a different chain id (the wrong network).\n\n  If you wish to defer this check until the click handler is pressed, you can place `chainId` in `useContractWrite` instead:\n\n  ```diff\n  import { usePrepareContractWrite, useContractWrite } from 'wagmi'\n  import { optimism } from 'wagmi/chains'\n\n  // ...\n\n  const { config } = usePrepareContractWrite({\n    addressOrName: '0xaf0326d92b97df1221759476b072abfd8084f9be',\n    contractInterface: ['function mint()'],\n    functionName: 'mint',\n  })\n  const { write } = useContractWrite({\n    ...config,\n  + chainId: optimism.id\n  })\n\n  ```\n\n- [#940](https://github.com/wevm/wagmi/pull/940) [`b6cb8f4`](https://github.com/wevm/wagmi/commit/b6cb8f4cd15eb13073bc7e9ecb4bfa2c261c0663) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: The `usePrepareSendTransaction` hook will now only run when the end-user is connected to their wallet.\n\n  This is to reach parity with `usePrepareContractWrite`.\n\n  If the end-user is not connected, then the `usePrepareSendTransaction` hook will remain idle.\n\n- [#940](https://github.com/wevm/wagmi/pull/940) [`b6cb8f4`](https://github.com/wevm/wagmi/commit/b6cb8f4cd15eb13073bc7e9ecb4bfa2c261c0663) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: `usePrepareSendTransaction` now throws when a `chainId` is specified and the end-user is on a different chain id (the wrong network).\n\n  If you wish to defer this check until the click handler is pressed, you can place `chainId` in `useContractWrite` instead:\n\n  ```diff\n  import { usePrepareSendTransaction, useContractWrite } from 'wagmi'\n  import { optimism } from 'wagmi/chains'\n\n  // ...\n\n  const { config } = usePrepareSendTransaction({\n    request: {\n      to: 'moxey.eth',\n      value: parseEther('1'),\n    },\n  })\n  const { sendTransaction } = useSendTransaction({\n    ...config,\n  + chainId: optimism.id\n  })\n\n  ```\n\n- [#941](https://github.com/wevm/wagmi/pull/941) [`0c96009`](https://github.com/wevm/wagmi/commit/0c96009398647a515a57f72ef25c32724f7c978c) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: `useContractEvent` no longer accepts a `signerOrProvider` configuration option.\n\n- [#941](https://github.com/wevm/wagmi/pull/941) [`0c96009`](https://github.com/wevm/wagmi/commit/0c96009398647a515a57f72ef25c32724f7c978c) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: `addressOrName` and `contractInterface` renamed to `address` and `abi` respectively for contract hooks: `useContract`, `useContractEvent`, `useContractRead`, `useContractReads`, `useContractInfiniteReads`, `useContractWrite`, `usePrepareContractWrite`.\n\n  ```diff\n  import { useContractRead } from 'wagmi'\n\n  const result = useContractRead({\n  - addressOrName: '0x…',\n  + address: '0x…',\n  - contractInterface: […] as const,\n  + abi: […] as const,\n    functionName: 'balanceOf',\n    args: ['0x…'],\n  })\n  ```\n\n  If you were using an ENS name instead of an address, you can resolve the name to an address before passing it to the action.\n\n  ```diff\n  - import { useContractRead } from 'wagmi'\n  + import { useContractRead, useEnsAddress } from 'wagmi'\n\n  + const { data: address} = useEnsAddress({ name: 'example.eth'})\n  const result = useContractRead({\n  - addressOrName: 'example.eth',\n  + address,\n    abi: […],\n    functionName: 'balanceOf',\n    args: ['0x…'],\n  })\n  ```\n\n- [#941](https://github.com/wevm/wagmi/pull/941) [`0c96009`](https://github.com/wevm/wagmi/commit/0c96009398647a515a57f72ef25c32724f7c978c) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: Updated TypeScript generics for contract and typed data hooks.\n\n  Adding a [const assertion](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions) to `abi` allows TypeScript to infer `functionName`, `args`, `overrides`, and return types for functions, and `eventName` and `listener` types for events.\n\n  ```diff\n  import { useContractRead } from 'wagmi'\n\n  const result = useContractRead({\n    address: '0x…',\n  - abi: […],\n  + abi: […] as const,\n    functionName: 'balanceOf', // will autocomplete and catch typos\n    args: ['0x…'], // inferred based on `abi`, `functionName`, `args`\n  })\n  result.data // inferred based on `functionName`\n  ```\n\n  This works for the following actions: `useContractRead`, `useContractWrite`, `usePrepareContractWrite`, `useContractReads`, `useContractInfiniteReads`, and `useContractEvent`.\n\n  Adding a [const assertion](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions) to `useSignTypedData`'s config option, `types`, allows TypeScript to infer `value`.\n\n  ```diff\n  import { useSignTypedData } from 'wagmi'\n\n  const result = useSignTypedData({\n    domain: {\n      name: 'Ether Mail',\n      version: '1',\n      chainId: 1,\n      verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n    },\n    types: {\n      Person: [\n        { name: 'name', type: 'string' },\n        { name: 'wallet', type: 'address' },\n      ],\n      Mail: [\n        { name: 'from', type: 'Person' },\n        { name: 'to', type: 'Person' },\n        { name: 'contents', type: 'string' },\n      ],\n  - },\n  + } as const,\n    value: { // `value` is inferred based on `types`\n      from: {\n        name: 'Cow',\n        wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n      },\n      to: {\n        name: 'Bob',\n        wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n      },\n      contents: 'Hello, Bob!',\n    },\n  })\n  ```\n\n- [#941](https://github.com/wevm/wagmi/pull/941) [`0c96009`](https://github.com/wevm/wagmi/commit/0c96009398647a515a57f72ef25c32724f7c978c) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: Updated TypeScript version to `typescript@>=4.7.4`.\n\n  `@wagmi/core` can now infer types based on [ABI](https://docs.soliditylang.org/en/v0.8.15/abi-spec.html#json) and [EIP-712](https://eips.ethereum.org/EIPS/eip-712) Typed Data definitions, giving you full end-to-end type-safety from your contracts to your frontend and incredible developer experience (e.g. autocomplete contract function names and catch misspellings, type contract function arguments, etc.).\n\n  For this to work, you must upgrade to `typescript@>=4.7.4`. Why is TypeScript v4.7.4 or greater necessary? TypeScript 4.7.4 introduced the ability to [extend constraints on inferred type variables](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/#extends-constraints-on-infer-type-variables), which is used extensively to help narrow types for ABIs. Good news! When upgrading TypeScript from 4.6 to 4.7 there are likely no [breaking changes](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-7.html#breaking-changes) for your set up.\n\n- [#941](https://github.com/wevm/wagmi/pull/941) [`0c96009`](https://github.com/wevm/wagmi/commit/0c96009398647a515a57f72ef25c32724f7c978c) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: Updated `paginatedIndexesConfig` `fn` parameter return type. `fn` now returns an array instead of a single object.\n\n  ```diff\n  import { BigNumber } from 'ethers'\n  import { paginatedIndexesConfig, useContractInfiniteReads } from 'wagmi'\n\n  useContractInfiniteReads({\n    cacheKey: 'contracts',\n    ...paginatedIndexesConfig(\n  -    (index) => ({\n  +    (index) => [{\n        ...mlootContractConfig,\n        functionName: 'tokenURI',\n        args: [BigNumber.from(index)] as const,\n  -    }),\n  +    }],\n      { start: 0, perPage: 10, direction: 'increment' },\n    ),\n  })\n  ```\n\n- [#941](https://github.com/wevm/wagmi/pull/941) [`0c96009`](https://github.com/wevm/wagmi/commit/0c96009398647a515a57f72ef25c32724f7c978c) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: `args` config option must now be an array for the following hooks: `useContractRead`, `useContractWrite`, `usePrepareContractWrite`, `useContractReads`, and `useContractInfiniteReads`.\n\n  ```diff\n  import { useContractRead } from 'wagmi'\n\n  const { data } = useContractRead({\n    address: '0x…',\n    abi: […],\n    functionName: 'balanceOf',\n  - args: '0x…',\n  + args: ['0x…'],\n  })\n  ```\n\n### Patch Changes\n\n- [#940](https://github.com/wevm/wagmi/pull/940) [`b6cb8f4`](https://github.com/wevm/wagmi/commit/b6cb8f4cd15eb13073bc7e9ecb4bfa2c261c0663) Thanks [@jxom](https://github.com/jxom)! - The `useSigner` hook now accepts an optional `chainId` to use for signer initialization as an argument.\n\n  ```tsx\n  import { useSigner } from \"wagmi\";\n  import { optimism } from \"wagmi/core\";\n\n  // ...\n\n  useSigner({ chainId: optimism.id });\n  ```\n\n- [#1061](https://github.com/wevm/wagmi/pull/1061) [`a4ffe8b`](https://github.com/wevm/wagmi/commit/a4ffe8b25516d5504685ae94579da4cd8c409329) Thanks [@alecananian](https://github.com/alecananian)! - Added Arbitrum Goerli Arbiscan block explorer\n\n- [#1050](https://github.com/wevm/wagmi/pull/1050) [`73d4d47`](https://github.com/wevm/wagmi/commit/73d4d47bc679f4f9a1cf46010fe2bf858c9d0b5c) Thanks [@jxom](https://github.com/jxom)! - update dependencies\n\n  - `@coinbase/wallet-sdk@3.5.3`\n  - `@tanstack/query-sync-storage-persister@4.10.1`\n  - `@tanstack/react-query@4.10.1`\n  - `@tanstack/react-query-persist-client@4.10.1`\n  - `@walletconnect/ethereum-provider@1.8.0`\n\n- [#1048](https://github.com/wevm/wagmi/pull/1048) [`ed13074`](https://github.com/wevm/wagmi/commit/ed130747c0f28c1d9980a1328883e4000a60455e) Thanks [@Max-3-7](https://github.com/Max-3-7)! - Added support for Avalanche core wallet\n\n- [#1046](https://github.com/wevm/wagmi/pull/1046) [`ab9ecaa`](https://github.com/wevm/wagmi/commit/ab9ecaa74dfa4324279e167dd7e348319ef7d35d) Thanks [@jxom](https://github.com/jxom)! - make ethers block format validator compatible with Celo\n\n- Updated dependencies [[`b6cb8f4`](https://github.com/wevm/wagmi/commit/b6cb8f4cd15eb13073bc7e9ecb4bfa2c261c0663), [`b6cb8f4`](https://github.com/wevm/wagmi/commit/b6cb8f4cd15eb13073bc7e9ecb4bfa2c261c0663), [`a4ffe8b`](https://github.com/wevm/wagmi/commit/a4ffe8b25516d5504685ae94579da4cd8c409329), [`b6cb8f4`](https://github.com/wevm/wagmi/commit/b6cb8f4cd15eb13073bc7e9ecb4bfa2c261c0663), [`0c96009`](https://github.com/wevm/wagmi/commit/0c96009398647a515a57f72ef25c32724f7c978c), [`b6cb8f4`](https://github.com/wevm/wagmi/commit/b6cb8f4cd15eb13073bc7e9ecb4bfa2c261c0663), [`ed13074`](https://github.com/wevm/wagmi/commit/ed130747c0f28c1d9980a1328883e4000a60455e), [`b6cb8f4`](https://github.com/wevm/wagmi/commit/b6cb8f4cd15eb13073bc7e9ecb4bfa2c261c0663), [`ab9ecaa`](https://github.com/wevm/wagmi/commit/ab9ecaa74dfa4324279e167dd7e348319ef7d35d), [`0c96009`](https://github.com/wevm/wagmi/commit/0c96009398647a515a57f72ef25c32724f7c978c), [`0c96009`](https://github.com/wevm/wagmi/commit/0c96009398647a515a57f72ef25c32724f7c978c), [`73d4d47`](https://github.com/wevm/wagmi/commit/73d4d47bc679f4f9a1cf46010fe2bf858c9d0b5c), [`0c96009`](https://github.com/wevm/wagmi/commit/0c96009398647a515a57f72ef25c32724f7c978c), [`0c96009`](https://github.com/wevm/wagmi/commit/0c96009398647a515a57f72ef25c32724f7c978c)]:\n  - @wagmi/core@0.6.0\n\n## 0.6.8\n\n### Patch Changes\n\n- [`0b77286b`](https://github.com/wevm/wagmi/commit/0b77286b89cb8603426cf5081872416c291a6531) Thanks [@jxom](https://github.com/jxom)! - Isolate wagmi's React Query `queryClient` instance.\n\n* [`8cb07462`](https://github.com/wevm/wagmi/commit/8cb07462acc3c5637398d11d2451f8b8e330d553) Thanks [@jxom](https://github.com/jxom)! - Added `chainId` as an argument to `watchBlockNumber`.\n\n- [`53c1a474`](https://github.com/wevm/wagmi/commit/53c1a4747d03b685e8cfbf55361fc2a56777fb06) Thanks [@tmm](https://github.com/tmm)! - Added missing `decimals` option to `Connector` `watchAsset`\n\n* [`4d74dd4f`](https://github.com/wevm/wagmi/commit/4d74dd4ff827ba5c43c3546a218f38cee45ea76a) Thanks [@jxom](https://github.com/jxom)! - Support ERC20 contracts that represent strings as bytes32\n\n* Updated dependencies [[`8cb07462`](https://github.com/wevm/wagmi/commit/8cb07462acc3c5637398d11d2451f8b8e330d553), [`53c1a474`](https://github.com/wevm/wagmi/commit/53c1a4747d03b685e8cfbf55361fc2a56777fb06), [`4d74dd4f`](https://github.com/wevm/wagmi/commit/4d74dd4ff827ba5c43c3546a218f38cee45ea76a)]:\n  - @wagmi/core@0.5.8\n\n## 0.6.7\n\n### Patch Changes\n\n- [`aa51bc4d`](https://github.com/wevm/wagmi/commit/aa51bc4dc5683bf0178597d2fdb8f2e9d82e7970) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue in `CoinbaseWalletConnector` where the browser extension would unintendedly reset the network when the browser is refreshed.\n\n* [#955](https://github.com/wevm/wagmi/pull/955) [`e326cd80`](https://github.com/wevm/wagmi/commit/e326cd80fe65267db623eb6c80ccdd75572914cf) Thanks [@0xFlicker](https://github.com/0xFlicker)! - Added Infura RPC URL for Sepolia\n\n- [`cec14089`](https://github.com/wevm/wagmi/commit/cec14089500c86687226ab272b4c3fcb85ae3d69) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where `useProvider` & `getProvider` were not returning referentially equal providers.\n\n* [`cec14089`](https://github.com/wevm/wagmi/commit/cec14089500c86687226ab272b4c3fcb85ae3d69) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where the `watch` option was not respecting the neighboring `chainId` option in `useBlockNumber`.\n\n- [`cec14089`](https://github.com/wevm/wagmi/commit/cec14089500c86687226ab272b4c3fcb85ae3d69) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where block listeners (via `watch`) were firing excessively on L2 chains.\n\n- Updated dependencies [[`aa51bc4d`](https://github.com/wevm/wagmi/commit/aa51bc4dc5683bf0178597d2fdb8f2e9d82e7970), [`e326cd80`](https://github.com/wevm/wagmi/commit/e326cd80fe65267db623eb6c80ccdd75572914cf), [`cec14089`](https://github.com/wevm/wagmi/commit/cec14089500c86687226ab272b4c3fcb85ae3d69), [`cec14089`](https://github.com/wevm/wagmi/commit/cec14089500c86687226ab272b4c3fcb85ae3d69), [`cec14089`](https://github.com/wevm/wagmi/commit/cec14089500c86687226ab272b4c3fcb85ae3d69)]:\n  - @wagmi/core@0.5.7\n\n## 0.6.6\n\n### Patch Changes\n\n- [#936](https://github.com/wevm/wagmi/pull/936) [`3329d1f`](https://github.com/wevm/wagmi/commit/3329d1f5880431566e14ac1640f48d0975aec4c2) Thanks [@jxom](https://github.com/jxom)! - Added the ability to provide a custom logger to override how logs are broadcasted to the consumer in wagmi.\n\n  A custom logger can be provided to the wagmi client via `logger`.\n\n  ### API\n\n  ```tsx\n  logger?: {\n    warn: typeof console.warn | null\n  }\n  ```\n\n  ### Examples\n\n  **Passing in a custom logger**\n\n  You can pass in a function to define your own custom logger.\n\n  ```diff\n  + import { logWarn } from './logger';\n\n  const client = createClient({\n    ...\n  + logger: {\n  +   warn: message => logWarn(message)\n  + }\n    ...\n  })\n  ```\n\n  **Disabling a logger**\n\n  You can disable a logger by passing `null` as the value.\n\n  ```diff\n  const client = createClient({\n    ...\n  + logger: {\n  +   warn: null\n  + }\n    ...\n  })\n  ```\n\n* [#889](https://github.com/wevm/wagmi/pull/889) [`27788ed`](https://github.com/wevm/wagmi/commit/27788ed989b5dc26849c7945fb91a92e56766018) Thanks [@jxom](https://github.com/jxom)! - Make multicall & readContracts more error robust\n\n* Updated dependencies [[`3329d1f`](https://github.com/wevm/wagmi/commit/3329d1f5880431566e14ac1640f48d0975aec4c2), [`27788ed`](https://github.com/wevm/wagmi/commit/27788ed989b5dc26849c7945fb91a92e56766018)]:\n  - @wagmi/core@0.5.6\n\n## 0.6.5\n\n### Patch Changes\n\n- [#912](https://github.com/wevm/wagmi/pull/912) [`e529e12`](https://github.com/wevm/wagmi/commit/e529e125c713ed3ef24a59c6bf226fe4deee7ac9) Thanks [@zouhangwithsweet](https://github.com/zouhangwithsweet)! - Added BitKeep to injected flags\n\n- [#912](https://github.com/wevm/wagmi/pull/910) Thanks [@mytangying](https://github.com/zouhangwithsweet)! - Added MathWallet to injected flags\n\n- [#904](https://github.com/wevm/wagmi/pull/904) [`c231058`](https://github.com/wevm/wagmi/commit/c23105850f335f8798031e14c7098b7dee8c2975) Thanks [@jxom](https://github.com/jxom)! - Removed `contractInterface` & `signer` from persisted query keys.\n\n- Updated dependencies [[`e529e12`](https://github.com/wevm/wagmi/commit/e529e125c713ed3ef24a59c6bf226fe4deee7ac9), [`c231058`](https://github.com/wevm/wagmi/commit/c23105850f335f8798031e14c7098b7dee8c2975)]:\n  - @wagmi/core@0.5.5\n\n## 0.6.4\n\n### Patch Changes\n\n- [#852](https://github.com/wevm/wagmi/pull/852) [`c3192d0`](https://github.com/wevm/wagmi/commit/c3192d0663aa332ae9edfd9dd49b333454013ab7) Thanks [@skeithc](https://github.com/skeithc)! - Added support for the Sepolia testnet\n\n- Updated dependencies [[`c3192d0`](https://github.com/wevm/wagmi/commit/c3192d0663aa332ae9edfd9dd49b333454013ab7)]:\n  - @wagmi/core@0.5.4\n\n## 0.6.3\n\n### Patch Changes\n\n- [#835](https://github.com/wevm/wagmi/pull/835) [`1b85e54`](https://github.com/wevm/wagmi/commit/1b85e54ae654e2564cf5bc2dae6411fe0a25875c) Thanks [@jxom](https://github.com/jxom)! - Update `@coinbase/wallet-sdk` to `3.4.1`\n\n* [#843](https://github.com/wevm/wagmi/pull/843) [`e77dee6`](https://github.com/wevm/wagmi/commit/e77dee6a606b8aac4279569c54cec8902476fee9) Thanks [@tmm](https://github.com/tmm)! - Fix `MockConnector` entrypoint path\n\n- [#834](https://github.com/wevm/wagmi/pull/834) [`9655879`](https://github.com/wevm/wagmi/commit/96558793b0319df47aefafa6b7b9c959068d491b) Thanks [@jxom](https://github.com/jxom)! - Update zustand to `4.0.0`\n\n* [#833](https://github.com/wevm/wagmi/pull/833) [`3ae6d0f`](https://github.com/wevm/wagmi/commit/3ae6d0f5e2d65432024272b43afe68a8f63bb7ea) Thanks [@jxom](https://github.com/jxom)! - Updated `react-query@4.0.0-beta.23` to `@tanstack/react-query@^4.0.10`\n\n* Updated dependencies [[`1b85e54`](https://github.com/wevm/wagmi/commit/1b85e54ae654e2564cf5bc2dae6411fe0a25875c), [`9655879`](https://github.com/wevm/wagmi/commit/96558793b0319df47aefafa6b7b9c959068d491b)]:\n  - @wagmi/core@0.5.3\n\n## 0.6.2\n\n### Patch Changes\n\n- [#823](https://github.com/wevm/wagmi/pull/823) [`10b8b78`](https://github.com/wevm/wagmi/commit/10b8b78605b7246b2c55b8d69f96663906e5cd20) Thanks [@tmm](https://github.com/tmm)! - Add Optimism Goerli to `chain` lookup.\n\n- Updated dependencies [[`10b8b78`](https://github.com/wevm/wagmi/commit/10b8b78605b7246b2c55b8d69f96663906e5cd20)]:\n  - @wagmi/core@0.5.2\n\n## 0.6.1\n\n### Patch Changes\n\n- [#767](https://github.com/wevm/wagmi/pull/767) [`e9392f3`](https://github.com/wevm/wagmi/commit/e9392f396e48e928bd9d2522e3ad671c589f08cb) Thanks [@klyap](https://github.com/klyap)! - Add Optimism Goerli chain ahead of [Kovan deprecation](https://dev.optimism.io/kovan-to-goerli).\n\n* [#817](https://github.com/wevm/wagmi/pull/817) [`7e5cac7`](https://github.com/wevm/wagmi/commit/7e5cac75815dcd8aa563462342a4853fc5207735) Thanks [@alecananian](https://github.com/alecananian)! - Added custom name mapping for 1inch Wallet injected provider\n\n- [#806](https://github.com/wevm/wagmi/pull/806) [`0b34e56`](https://github.com/wevm/wagmi/commit/0b34e56db97e6dcdb71088e0149b2d55ebc604a5) Thanks [@vmichalik](https://github.com/vmichalik)! - Fix canonical testnet native asset symbols by changing them to ETH\n\n* [#778](https://github.com/wevm/wagmi/pull/778) [`0892908`](https://github.com/wevm/wagmi/commit/08929084eeeba1a3a55aa098fa9d92a243685ad5) Thanks [@0xcadams](https://github.com/0xcadams)! - Add Arbitrum Goerli chain.\n\n* Updated dependencies [[`e9392f3`](https://github.com/wevm/wagmi/commit/e9392f396e48e928bd9d2522e3ad671c589f08cb), [`7e5cac7`](https://github.com/wevm/wagmi/commit/7e5cac75815dcd8aa563462342a4853fc5207735), [`0b34e56`](https://github.com/wevm/wagmi/commit/0b34e56db97e6dcdb71088e0149b2d55ebc604a5), [`0892908`](https://github.com/wevm/wagmi/commit/08929084eeeba1a3a55aa098fa9d92a243685ad5)]:\n  - @wagmi/core@0.5.1\n\n## 0.6.0\n\n### Minor Changes\n\n- [#658](https://github.com/wevm/wagmi/pull/658) [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432) Thanks [@jxom](https://github.com/jxom)! - **Breaking:** The `useSendTransaction` hook's `data` now returns an object only consisting of `hash` & `wait`, and not the full [`TransactionResponse`](https://docs.ethers.io/v5/api/providers/types/#providers-TransactionResponse).\n\n  If you require the full `TransactionResponse`, you can use `useTransaction`:\n\n  ```diff\n  import { useSendTransaction, useTransaction } from 'wagmi'\n\n  const {\n    data: {\n      hash,\n      wait,\n  -   ...transaction\n    }\n  } = useSendTransaction(...)\n\n  +const { data: transaction } = useTransaction({ hash })\n  ```\n\n  > Why? The old implementation of `useSendTransaction` created a long-running async task, causing [UX pitfalls](https://wagmi.sh/docs/prepare-hooks#ux-pitfalls-without-prepare-hooks) when invoked in a click handler.\n\n* [#658](https://github.com/wevm/wagmi/pull/658) [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: The configuration passed to the `useSendTransaction` hook now needs to be either:\n\n  - prepared with the `usePrepareSendTransaction` hook **(new)**, or\n  - recklessly unprepared **(previous functionality)**\n\n  > Why? [Read here](https://wagmi.sh/docs/prepare-hooks)\n\n  ### Prepared usage\n\n  ```diff\n  import { usePrepareSendTransaction, useSendTransaction } from 'wagmi'\n\n  +const { config } = usePrepareSendTransaction({\n  +  request: {\n  +    to: 'moxey.eth',\n  +    value: parseEther('1'),\n  +  }\n  +})\n\n  const { data } = useSendTransaction({\n  - request: {\n  -   to: 'moxey.eth',\n  -   value: parseEther('1')\n  - }\n  + ...config\n  })\n  ```\n\n  ### Recklessly unprepared usage\n\n  If you are not ready to upgrade to `usePrepareSendTransaction`, it is possible to use `useSendTransaction` without preparing the configuration first by passing `mode: 'recklesslyUnprepared'`.\n\n  ```diff\n  import { useSendTransaction } from 'wagmi'\n\n  const { data } = useSendTransaction({\n  + mode: 'recklesslyUnprepared',\n    request: {\n      to: 'moxey.eth',\n      value: parseEther('1'),\n    }\n  })\n  ```\n\n- [#658](https://github.com/wevm/wagmi/pull/658) [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: If a `chainId` is passed to `useContractWrite` or `useSendTransaction`, it will no longer attempt to switch chain before sending the transaction. Instead, it will throw an error if the user is on the wrong chain.\n\n  > Why? Eagerly prompting to switch chain in these actions created a long-running async task that that makes [iOS App Links](https://wagmi.sh/docs/prepare-hooks#ios-app-link-constraints) vulnerable.\n\n* [#760](https://github.com/wevm/wagmi/pull/760) [`d8af6bf`](https://github.com/wevm/wagmi/commit/d8af6bf50885aec110ae4d64716642453aa27896) Thanks [@tmm](https://github.com/tmm)! - **Breaking:** `alchemyProvider` and `infuraProvider` now use a generic `apiKey` configuration option instead of `alchemyId` and `infuraId`.\n\n  ```diff\n  import { alchemyProvider } from '@wagmi/core/providers/alchemy'\n  import { infuraProvider } from '@wagmi/core/providers/infura'\n\n  alchemyProvider({\n  -  alchemyId: 'yourAlchemyApiKey',\n  +  apiKey: 'yourAlchemyApiKey',\n  })\n\n  infuraProvider({\n  -  infuraId: 'yourInfuraApiKey',\n  +  apiKey: 'yourInfuraApiKey',\n  })\n  ```\n\n- [#658](https://github.com/wevm/wagmi/pull/658) [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432) Thanks [@jxom](https://github.com/jxom)! - Added the `usePrepareContractWrite` hook that eagerly fetches the parameters required for sending a contract write transaction such as the gas estimate.\n\n  It returns config to be passed through to `useContractWrite`.\n\n  ```ts\n  const { config } = usePrepareContractWrite({\n    addressOrName: \"0xecb504d39723b0be0e3a9aa33d646642d1051ee1\",\n    contractInterface: wagmigotchiABI,\n    functionName: \"feed\",\n  });\n  const { write } = useContractWrite(config);\n  ```\n\n* [#658](https://github.com/wevm/wagmi/pull/658) [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432) Thanks [@jxom](https://github.com/jxom)! - **Breaking:** When `useSendTransaction` is in \"prepare mode\" (used with `usePrepareSendTransaction`), `sendTransaction`/`sendTransactionAsync` will be `undefined` until the configuration has been prepared. Ensure that your usage reflects this.\n\n  ```tsx\n  const { config } = usePrepareSendTransaction({ ... })\n  const { sendTransaction } = useSendTransaction(config)\n\n  <button\n    disabled={!sendTransaction}\n    onClick={() => sendTransaction?.()}\n  >\n    Send\n  </button>\n  ```\n\n- [#658](https://github.com/wevm/wagmi/pull/658) [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432) Thanks [@jxom](https://github.com/jxom)! - Added the `usePrepareSendTransaction` hook that eagerly fetches the parameters required for sending a transaction such as the gas estimate and resolving an ENS address (if required).\n\n  It returns config to be passed through to `useSendTransaction`.\n\n  ```ts\n  import { usePrepareSendTransaction, useSendTransaction } from \"@wagmi/core\";\n\n  const { config } = usePrepareSendTransaction({\n    request: {\n      to: \"moxey.eth\",\n      value: parseEther(\"1\"),\n    },\n  });\n  const { sendTransaction } = useSendTransaction(config);\n  ```\n\n* [#658](https://github.com/wevm/wagmi/pull/658) [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432) Thanks [@jxom](https://github.com/jxom)! - **Breaking:** The `sendTransaction`/`sendTransactionAsync` configuration object has now been altered to only accept \"reckless\" configuration. If one or more of these values are set, it can lead to [UX pitfalls](https://wagmi.sh/docs/prepare-hooks#ux-pitfalls-without-prepare-hooks).\n\n  ```diff\n  <button\n    onClick={() => {\n      sendTransaction({\n  -     request: {\n  +     recklesslySetUnpreparedRequest:\n          to: 'moxey.eth',\n          value: parseEther('1')\n        }\n      })\n    }}\n  >\n    Send\n  </button>\n  ```\n\n- [#727](https://github.com/wevm/wagmi/pull/727) [`ac3b9b8`](https://github.com/wevm/wagmi/commit/ac3b9b87f80cb45b65d003f09d916d7d1427a62e) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: Moved the `pollingInterval` config option from the chain provider config to `configureChains` config.\n\n  ```diff\n  const { chains, provider } = configureChains(\n    [chain.mainnet, chain.polygon],\n    [\n  -   alchemyProvider({ apiKey, pollingInterval: 5000 }),\n  -   publicProvider({ pollingInterval: 5000 })\n  +   alchemyProvider({ apiKey }),\n  +   publicProvider()\n    ],\n  + { pollingInterval: 5000 }\n  )\n  ```\n\n* [#658](https://github.com/wevm/wagmi/pull/658) [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432) Thanks [@jxom](https://github.com/jxom)! - **Breaking:** When `useContractWrite` is in \"prepare mode\" (used with `usePrepareContractWrite`), `write`/`writeAsync` will be `undefined` until the configuration has been prepared. Ensure that your usage reflects this.\n\n  ```tsx\n  const { config } = usePrepareContractWrite({ ... })\n  const { write } = useContractWrite(config)\n\n  <button\n    disabled={!write}\n    onClick={() => write?.()}\n  >\n    Send\n  </button>\n  ```\n\n- [#658](https://github.com/wevm/wagmi/pull/658) [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: The configuration passed to the `useContractWrite` hook now needs to be either:\n\n  - prepared with the `usePrepareContractWrite` hook **(new)**, or\n  - recklessly unprepared **(previous functionality)**\n\n  > Why? [Read here](https://wagmi.sh/docs/prepare-hooks)\n\n  ### Prepared usage\n\n  ```diff\n  import { usePrepareContractWrite, useContractWrite } from 'wagmi'\n\n  +const { config } = usePrepareContractWrite({\n  + addressOrName: '0x...',\n  + contractInterface: wagmiAbi,\n  + functionName: 'mint',\n  + args: [tokenId]\n  +})\n\n  const { data } = useContractWrite({\n  - addressOrName: '0x...',\n  - contractInterface: wagmiAbi,\n  - functionName: 'mint',\n  - args: [tokenId],\n  + ...config\n  })\n  ```\n\n  ### Recklessly unprepared usage\n\n  If you are not ready to upgrade to `usePrepareContractWrite`, it is possible to use `useContractWrite` without preparing the configuration first by passing `mode: 'recklesslyUnprepared'`.\n\n  ```diff\n  import { useContractWrite } from 'wagmi'\n\n  const { data } = useContractWrite({\n  + mode: 'recklesslyUnprepared',\n    addressOrName: '0x...',\n    contractInterface: wagmiAbi,\n    functionName: 'mint',\n    args: [tokenId],\n  })\n  ```\n\n### Patch Changes\n\n- [#733](https://github.com/wevm/wagmi/pull/733) [`6232487`](https://github.com/wevm/wagmi/commit/623248703bc728d539e28bf8a89b8ab22f0a5703) Thanks [@tmm](https://github.com/tmm)! - Add mock connector entrypoint\n\n* [#762](https://github.com/wevm/wagmi/pull/762) [`ccaeed5`](https://github.com/wevm/wagmi/commit/ccaeed53d731f51879e0cdd5648797a32f7d7a31) Thanks [@jxom](https://github.com/jxom)! - Fix `useContractRead` return value unexpectedly returning null for falsy values\n\n- [#734](https://github.com/wevm/wagmi/pull/734) [`7c2fa04`](https://github.com/wevm/wagmi/commit/7c2fa04e9b695840d6fa088e1f8d069f3c916551) Thanks [@jxom](https://github.com/jxom)! - Fix issue where `useProvider` & `useWebSocketProvider` would not update when `chainId` config changes\n\n* [#739](https://github.com/wevm/wagmi/pull/739) [`c2295a5`](https://github.com/wevm/wagmi/commit/c2295a56cc86d02cc6602e2b4557b8ab9a091a3f) Thanks [@tmm](https://github.com/tmm)! - Fix balance formatting for tokens that do not have 18 decimals.\n\n- [#759](https://github.com/wevm/wagmi/pull/759) [`959953d`](https://github.com/wevm/wagmi/commit/959953d1f5b3e8189bac56de245c62333470d18e) Thanks [@tmm](https://github.com/tmm)! - Added `useTransaction` hook:\n\n  ```ts\n  import { useTransaction } from \"wagmi\";\n\n  const result = useTransaction({\n    hash: \"0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060\",\n  });\n  ```\n\n- Updated dependencies [[`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432), [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432), [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432), [`d8af6bf`](https://github.com/wevm/wagmi/commit/d8af6bf50885aec110ae4d64716642453aa27896), [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432), [`c2295a5`](https://github.com/wevm/wagmi/commit/c2295a56cc86d02cc6602e2b4557b8ab9a091a3f), [`ac3b9b8`](https://github.com/wevm/wagmi/commit/ac3b9b87f80cb45b65d003f09d916d7d1427a62e), [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432), [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432), [`959953d`](https://github.com/wevm/wagmi/commit/959953d1f5b3e8189bac56de245c62333470d18e)]:\n  - @wagmi/core@0.5.0\n\n## 0.5.11\n\n### Patch Changes\n\n- [`4c7d123`](https://github.com/wevm/wagmi/commit/4c7d123c8e74f93e770096857eb8c40ce0a47681) Thanks [@jxom](https://github.com/jxom)! - Fix issue where `useProvider` & `useWebSocketProvider` would not update when `chainId` config changes\n\n## 0.5.10\n\n### Patch Changes\n\n- [#713](https://github.com/tmm/wagmi/pull/713) [`08b0113`](https://github.com/tmm/wagmi/commit/08b0113bef9f32dceab2ecd823b1ee00f9bdc45d) Thanks [@jxom](https://github.com/jxom)! - Fix an issue where the `useContractRead` query function could return `undefined` instead of a serializable `null`.\n\n* [#725](https://github.com/tmm/wagmi/pull/725) [`b976920`](https://github.com/tmm/wagmi/commit/b97692051d778d7e112872663832c97963a8029a) Thanks [@tmm](https://github.com/tmm)! - Lock `react-query` version\n\n- [#721](https://github.com/tmm/wagmi/pull/721) [`abea25f`](https://github.com/tmm/wagmi/commit/abea25fd15d81d1ecaec9d3fbd687042ab29b1e6) Thanks [@tmm](https://github.com/tmm)! - Add `name` to `useToken` `data` value.\n\n- Updated dependencies [[`abea25f`](https://github.com/tmm/wagmi/commit/abea25fd15d81d1ecaec9d3fbd687042ab29b1e6), [`abea25f`](https://github.com/tmm/wagmi/commit/abea25fd15d81d1ecaec9d3fbd687042ab29b1e6)]:\n  - @wagmi/core@0.4.9\n\n## 0.5.9\n\n### Patch Changes\n\n- [#677](https://github.com/tmm/wagmi/pull/677) [`35e4219`](https://github.com/tmm/wagmi/commit/35e42199af9dd346549c1718e144728f55b8d7dd) Thanks [@jxom](https://github.com/jxom)! - Move `parseContractResult` to `@wagmi/core`\n\n* [#677](https://github.com/tmm/wagmi/pull/677) [`35e4219`](https://github.com/tmm/wagmi/commit/35e42199af9dd346549c1718e144728f55b8d7dd) Thanks [@jxom](https://github.com/jxom)! - Parse tuples correctly in `parseContractResult`\n\n* Updated dependencies [[`35e4219`](https://github.com/tmm/wagmi/commit/35e42199af9dd346549c1718e144728f55b8d7dd)]:\n  - @wagmi/core@0.4.7\n\n## 0.5.8\n\n### Patch Changes\n\n- [#670](https://github.com/tmm/wagmi/pull/670) [`29a0d21`](https://github.com/tmm/wagmi/commit/29a0d21ee83995559f63542778dfa805f15e7441) Thanks [@tmm](https://github.com/tmm)! - Fix broken release not containing `deepEqual` from `@wagmi/core`.\n\n- Updated dependencies [[`29a0d21`](https://github.com/tmm/wagmi/commit/29a0d21ee83995559f63542778dfa805f15e7441)]:\n  - @wagmi/core@0.4.6\n\n## 0.5.7\n\n### Patch Changes\n\n- [#659](https://github.com/tmm/wagmi/pull/659) [`be76586`](https://github.com/tmm/wagmi/commit/be76586431238dc5a0970a6f10a3dff9faa8ca2d) Thanks [@jxom](https://github.com/jxom)! - Added an `isDataEqual` config option to `useContractRead`, `useContractReads` & `useContractInfiniteReads` to define whether or not that data has changed. Defaults to `deepEqual`.\n\n* [#659](https://github.com/tmm/wagmi/pull/659) [`be76586`](https://github.com/tmm/wagmi/commit/be76586431238dc5a0970a6f10a3dff9faa8ca2d) Thanks [@jxom](https://github.com/jxom)! - Added `onBlock` config to `useBlockNumber`\n\n- [#659](https://github.com/tmm/wagmi/pull/659) [`be76586`](https://github.com/tmm/wagmi/commit/be76586431238dc5a0970a6f10a3dff9faa8ca2d) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where `useContractRead` & `useContractReads` would return unstable data.\n\n## 0.5.6\n\n### Patch Changes\n\n- [#654](https://github.com/tmm/wagmi/pull/654) [`e66530b`](https://github.com/tmm/wagmi/commit/e66530bf4881b3533c528f8c5a5f41be0eab0a64) Thanks [@jxom](https://github.com/jxom)! - omit `contractInterface` from `useContractRead` & `useContractReads` query key hash\n\n* [#654](https://github.com/tmm/wagmi/pull/654) [`e66530b`](https://github.com/tmm/wagmi/commit/e66530bf4881b3533c528f8c5a5f41be0eab0a64) Thanks [@jxom](https://github.com/jxom)! - fix `multicall` returning nullish data for all calls unexpectedly\n\n* Updated dependencies [[`e66530b`](https://github.com/tmm/wagmi/commit/e66530bf4881b3533c528f8c5a5f41be0eab0a64)]:\n  - @wagmi/core@0.4.5\n\n## 0.5.5\n\n### Patch Changes\n\n- [#629](https://github.com/tmm/wagmi/pull/629) [`199db71`](https://github.com/tmm/wagmi/commit/199db7165eed43d36cb882d373f95e7c49212f23) Thanks [@jxom](https://github.com/jxom)! - Add `wagmi/actions` entrypoint that exports imperative `@wagmi/core` actions\n\n* [#616](https://github.com/tmm/wagmi/pull/616) [`7a7a17a`](https://github.com/tmm/wagmi/commit/7a7a17a46d4c9e6465cc46a111b5fe8a56109f1b) Thanks [@tmm](https://github.com/tmm)! - Adds `UNSTABLE_shimOnConnectSelectAccount` flag. With this flag and \"disconnected\" with `shimDisconnect` enabled, the user is prompted to select a different MetaMask account (than the currently connected account) when trying to connect (e.g. `useConnect`/`connect` action).\n\n* Updated dependencies [[`7a7a17a`](https://github.com/tmm/wagmi/commit/7a7a17a46d4c9e6465cc46a111b5fe8a56109f1b)]:\n  - @wagmi/core@0.4.4\n\n## 0.5.4\n\n### Patch Changes\n\n- [#631](https://github.com/tmm/wagmi/pull/631) [`a780e32`](https://github.com/tmm/wagmi/commit/a780e32e91a0072c795fa0b5a6111302768e2a01) Thanks [@tmm](https://github.com/tmm)! - Fix WalletConnect stale session\n\n- Updated dependencies [[`a780e32`](https://github.com/tmm/wagmi/commit/a780e32e91a0072c795fa0b5a6111302768e2a01)]:\n  - @wagmi/core@0.4.3\n\n## 0.5.3\n\n### Patch Changes\n\n- [#627](https://github.com/tmm/wagmi/pull/627) [`5985530`](https://github.com/tmm/wagmi/commit/59855301d138313e83a607b3f05053e9f46a78a8) Thanks [@jxom](https://github.com/jxom)! - equalityFn in `useSyncExternalStoreWithTracked` should return truthy when there are no tracked keys.\n\n## 0.5.2\n\n### Patch Changes\n\n- [#624](https://github.com/tmm/wagmi/pull/624) [`416fa7e`](https://github.com/tmm/wagmi/commit/416fa7ee1f8019ab86e33fb93783ffddecc02c49) Thanks [@jxom](https://github.com/jxom)! - Fix broken `WebSocketProvider` type defs\n\n- Updated dependencies [[`416fa7e`](https://github.com/tmm/wagmi/commit/416fa7ee1f8019ab86e33fb93783ffddecc02c49)]:\n  - @wagmi/core@0.4.2\n\n## 0.5.1\n\n### Patch Changes\n\n- [#622](https://github.com/tmm/wagmi/pull/622) [`d171581`](https://github.com/tmm/wagmi/commit/d171581464891dd870d97b6232205da0cb152d9b) Thanks [@tmm](https://github.com/tmm)! - Use `domain.chainId` to validate and switch chain before signing in `useSignTypedData`.\n\n* [#618](https://github.com/tmm/wagmi/pull/618) [`a5138e8`](https://github.com/tmm/wagmi/commit/a5138e82a00e4d9469ad78c97b2d34200d7f1fbe) Thanks [@tmm](https://github.com/tmm)! - Fix adding chains when using MetaMask mobile app, add `publicRpcUrls` constant, and default to public endpoint when adding chain.\n\n* Updated dependencies [[`d171581`](https://github.com/tmm/wagmi/commit/d171581464891dd870d97b6232205da0cb152d9b), [`a5138e8`](https://github.com/tmm/wagmi/commit/a5138e82a00e4d9469ad78c97b2d34200d7f1fbe)]:\n  - @wagmi/core@0.4.1\n\n## 0.5.0\n\n### Minor Changes\n\n- [`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: The `useContractWrite` hook parameters have been consolidated into a singular config parameter.\n\n  Before:\n\n  ```tsx\n  useContractWrite(\n    {\n      addressOrName: mlootContractAddress,\n      contractInterface: mlootABI,\n    },\n    \"claim\",\n  );\n  ```\n\n  After:\n\n  ```tsx\n  useContractWrite({\n    addressOrName: mlootContractAddress,\n    contractInterface: mlootABI,\n    functionName: \"claim\",\n  });\n  ```\n\n* [`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: The `useContractEvent` hook parameters have been consolidated into a singular config parameter.\n\n  Before:\n\n  ```tsx\n  useContractEvent(\n    {\n      addressOrName: uniContractAddress,\n      contractInterface: erc20ABI,\n    },\n    'Transfer',\n    listener,\n  ),\n  ```\n\n  After:\n\n  ```tsx\n  useContractEvent({\n    addressOrName: uniContractAddress,\n    contractInterface: erc20ABI,\n    eventName: \"Transfer\",\n    listener,\n  });\n  ```\n\n- [`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: The `client` prop is now required on `WagmiConfig`.\n\n  ````diff\n  ```tsx\n  import {\n    createClient,\n  + configureChains,\n  + defaultChains\n  } from 'wagmi'\n  +import { publicProvider } from 'wagmi/providers/public'\n\n  +const { provider, webSocketProvider } = configureChains(defaultChains, [\n  + publicProvider(),\n  +])\n\n  +const client = createClient({\n  + provider,\n  + webSocketProvider,\n  +})\n\n  function App() {\n    return (\n      <WagmiConfig\n  +     client={client}\n      >\n        <YourRoutes />\n      </WagmiConfig>\n    )\n  }\n  ````\n\n* [`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: The `provider` config option is now required on `createClient`. It is recommended to pass the [`provider` given from `configureChains`](https://wagmi.sh/docs/providers/configuring-chains).\n\n  ```diff\n  import {\n    createClient,\n  + defaultChains,\n  + configureChains\n  } from 'wagmi'\n  +import { publicProvider } from 'wagmi/providers/publicProvider'\n\n  +const { provider } = configureChains(defaultChains, [\n  + publicProvider\n  +])\n\n  const client = createClient({\n  + provider\n  })\n  ```\n\n  If you previously used an ethers.js Provider, you now need to provide your `chains` on the Provider instance:\n\n  ```diff\n  import {\n    createClient,\n  + defaultChains\n  } from 'wagmi'\n  import ethers from 'ethers'\n\n  const client = createClient({\n  - provider: getDefaultProvider()\n  + provider: Object.assign(getDefaultProvider(), { chains: defaultChains })\n  })\n  ```\n\n- [`4f8f3c0`](https://github.com/tmm/wagmi/commit/4f8f3c0d65383bd8bbdfc3f1033adfdb11d80ebb) Thanks [@nachoiacovino](https://github.com/nachoiacovino)! - Use ethereum-lists chains symbols\n\n* [#582](https://github.com/tmm/wagmi/pull/582) [`b03830a`](https://github.com/tmm/wagmi/commit/b03830a54465215c2526f9509543fe2c978bfe70) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: The following changes were made to the `useAccount` return value:\n\n  ### The `data` value is now `address` & `connector`\n\n  ```diff\n  {\n  - data?: {\n  -   address: string\n  -   connector: Connector\n  - }\n  + address?: string\n  + connector?: Connector\n  }\n  ```\n\n  ### Global connection status values have been added\n\n  The following global connection status values have been added:\n\n  ```diff\n  {\n  + isConnecting: boolean\n  + isReconnecting: boolean\n  + isConnected: boolean\n  + isDisconnected: boolean\n  + status: 'connecting' | 'reconnecting' | 'connected' | 'disconnected'\n  }\n  ```\n\n  The `useAccount` hook is now aware of any connection event in your application, so now you can use these connection status values to determine if your user is connected, disconnected or connecting to a wallet on a global scope.\n\n  ### `error`, states & `refetch` values have been removed\n\n  Since the `useAccount` hook never dealt with asynchronous data, all of these values were\n  redundant & unused.\n\n  ```diff\n  {\n  - error?: Error\n  - isIdle: boolean\n  - isLoading: boolean\n  - isFetching: boolean\n  - isSuccess: boolean\n  - isError: boolean\n  - isFetched: boolean\n  - isRefetching: boolean\n  - refetch: (options: {\n  -   throwOnError: boolean\n  -   cancelRefetch: boolean\n  - }) => Promise<{\n  -   address: string\n  -   connector: Connector\n  - }>\n  - status: 'idle' | 'error' | 'loading' | 'success'\n  }\n  ```\n\n  ### Summary of changes\n\n  Below is the whole diff of changes to the `useAccount` return value.\n\n  ```diff\n  {\n  - data?: {\n  -   address: string\n  -   connector: Connector\n  - }\n  + address?: string\n  + connector?: Connector\n  - error?: Error\n  - isIdle: boolean\n  - isLoading: boolean\n  - isFetching: boolean\n  - isSuccess: boolean\n  - isError: boolean\n  - isFetched: boolean\n  - isRefetching: boolean\n  + isConnecting: boolean\n  + isReconnecting: boolean\n  + isConnected: boolean\n  + isDisconnected: boolean\n  - refetch: (options: {\n  -   throwOnError: boolean\n  -   cancelRefetch: boolean\n  - }) => Promise<{\n  -   address: string\n  -   connector: Connector\n  - }>\n  - status: 'idle' | 'error' | 'loading' | 'success'\n  + status: 'connecting' | 'reconnecting' | 'connected' | 'disconnected'\n  }\n  ```\n\n- [`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4) Thanks [@jxom](https://github.com/jxom)! - **Breaking:** Removed the `chainId` parameter from `connectors` function on `createClient`.\n\n  ```diff\n  const client = createClient({\n  - connectors({ chainId }) {\n  + connectors() {\n      ...\n    }\n  })\n  ```\n\n  If you previously derived RPC URLs from the `chainId` on `connectors`, you can now remove that logic as `wagmi` now handles RPC URLs internally when used with `configureChains`.\n\n  ```diff\n  import {\n    chain,\n  +  configureChains,\n    createClient\n  } from 'wagmi';\n\n  +import { publicProvider } from 'wagmi/providers/public'\n\n  import { CoinbaseWalletConnector } from 'wagmi/connectors/coinbaseWallet'\n  import { InjectedConnector } from 'wagmi/connectors/injected'\n  import { MetaMaskConnector } from 'wagmi/connectors/metaMask'\n  import { WalletConnectConnector } from 'wagmi/connectors/walletConnect'\n\n  +const { chains } = configureChains(\n  +  [chain.mainnet],\n  +  [publicProvider()]\n  +);\n\n  const client = createClient({\n  -  connectors({ chainId }) {\n  -    const chain = chains.find((x) => x.id === chainId) ?? defaultChain\n  -    const rpcUrl = chain.rpcUrls.alchemy\n  -      ? `${chain.rpcUrls.alchemy}/${alchemyId}`\n  -      : chain.rpcUrls.default\n  -    return [\n  +  connectors: [\n      new MetaMaskConnector({ chains }),\n      new CoinbaseWalletConnector({\n        chains,\n        options: {\n          appName: 'wagmi',\n  -       chainId: chain.id,\n  -       jsonRpcUrl: rpcUrl,\n        },\n      }),\n      new WalletConnectConnector({\n        chains,\n        options: {\n          qrcode: true,\n  -       rpc: { [chain.id]: rpcUrl },\n        },\n      }),\n      new InjectedConnector({\n        chains,\n        options: { name: 'Injected' },\n      }),\n    ]\n  -  },\n  })\n  ```\n\n* [#596](https://github.com/tmm/wagmi/pull/596) [`a770af7`](https://github.com/tmm/wagmi/commit/a770af7d2cb214b6620d5341115f1e938e1e77ff) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: `TypedDataDomain` and `TypedDataField` types were removed and incorporated into `SignTypedDataArgs`.\n\n- [#582](https://github.com/tmm/wagmi/pull/582) [`b03830a`](https://github.com/tmm/wagmi/commit/b03830a54465215c2526f9509543fe2c978bfe70) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: The following changes were made to the `useAccount` configuration:\n\n  ## `onConnect` has been added\n\n  The `onConnect` callback is invoked when the account connects.\n\n  It provides the connected address & connector, as well as a `isReconnected` flag for if the user reconnected via `autoConnect`.\n\n  ```tsx\n  const account = useAccount({\n    onConnect({ address, connector, isReconnected }) {\n      console.log(\"Connected\");\n    },\n  });\n  ```\n\n  ## `onDisconnect` has been added\n\n  The `onDisconnect` callback is invoked when the account disconnected.\n\n  ```tsx\n  const account = useAccount({\n    onDisconnect() {\n      console.log(\"Disconnected\");\n    },\n  });\n  ```\n\n  ## `suspense` has been removed\n\n  The `useAccount` hook is a synchronous hook – so `suspense` never worked.\n\n  ```diff\n  const account = useAccount({\n  -  suspense: true,\n  })\n  ```\n\n  ## `onError` has been removed\n\n  The `useAccount` hook never had any error definitions – so `onError` was never invoked.\n\n  ```diff\n  const account = useAccount({\n  - onError(error) {\n  -   console.log('Error', error)\n  - },\n  })\n  ```\n\n  ## `onSettled` has been removed\n\n  The `useAccount` hook is a synchronous hook. `onSettled` was always invoked immediately.\n\n  ```diff\n  const account = useAccount({\n  - onSettled(data) {\n  -   console.log('Settled', data)\n  - },\n  })\n  ```\n\n  If you used `onSettled`, you can move the code beneath the `useAccount` hook:\n\n  ```diff\n  const account = useAccount({\n  - onSettled(data) {\n  -   console.log('Address:', data.address)\n  - },\n  })\n  + console.log('Address:', account.address)\n  ```\n\n  ## `onSuccess` has been removed\n\n  The `useAccount` hook is a synchronous hook. `onSuccess` was always invoked immediately.\n\n  ```diff\n  const account = useAccount({\n  - onSuccess(data) {\n  -   console.log('Success', data)\n  - },\n  })\n  ```\n\n  If you used `onSuccess`, you can move the code beneath the `useAccount` hook:\n\n  ```diff\n  const account = useAccount({\n  - onSuccess(data) {\n  -   console.log('Address:', data.address)\n  - },\n  })\n  + console.log('Address:', account.address)\n  ```\n\n* [#582](https://github.com/tmm/wagmi/pull/582) [`b03830a`](https://github.com/tmm/wagmi/commit/b03830a54465215c2526f9509543fe2c978bfe70) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: The following changes were made to the `useConnect` return value:\n\n  ### Connection status flags have been moved\n\n  The `isConnected`, `isConnecting`, `isReconnecting` & `isDisconnected` flags have been moved to the `useAccount` hook.\n\n  ```diff\n  -import { useConnect } from 'wagmi'\n  +import { useAccount } from 'wagmi'\n\n  function App() {\n    const {\n      isConnected,\n      isConnecting,\n      isConnecting,\n      isDisconnected\n  - } = useConnect()\n  + } = useAccount()\n  }\n  ```\n\n  ### New `connect` mutation status flags have been added\n\n  The `isLoading`, `isSuccess` and `isError` flags have been added to `useConnect`.\n\n  These flags represent the **local** async state of `useConnect`.\n\n  ### `activeConnector` has been removed\n\n  The `activeConnector` value has been removed. You can find the active connector on `useAccount`.\n\n  ```diff\n  -import { useConnect } from 'wagmi'\n  +import { useAccount } from 'wagmi'\n\n  function App() {\n  - const { activeConnector } = useConnect()\n  + const { connector } = useAccount()\n  }\n  ```\n\n- [#582](https://github.com/tmm/wagmi/pull/582) [`b03830a`](https://github.com/tmm/wagmi/commit/b03830a54465215c2526f9509543fe2c978bfe70) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: The following changes were made to the `useConnect` configuration:\n\n  ### `onBeforeConnect` has been renamed\n\n  The `onBeforeConnect` callback has been renamed to `onMutate`\n\n  ### `onConnect` has been renamed\n\n  The `onConnect` callback has been renamed to `onSuccess`\n\n* [#582](https://github.com/tmm/wagmi/pull/582) [`b03830a`](https://github.com/tmm/wagmi/commit/b03830a54465215c2526f9509543fe2c978bfe70) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: The `connector` parameter to `connect` & `connectAsync` now has to be in the config object parameter shape.\n\n  ```diff\n  import { useConnect } from 'wagmi'\n\n  function App() {\n    const { connect, connectors } = useConnect()\n\n    return (\n      <button\n  -     onClick={() => connect(connectors[0])}\n  +     onClick={() => connect({ connector: connectors[0] })}\n      >\n        Connect\n      </button>\n    )\n  }\n  ```\n\n- [#582](https://github.com/tmm/wagmi/pull/582) [`b03830a`](https://github.com/tmm/wagmi/commit/b03830a54465215c2526f9509543fe2c978bfe70) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: The \"switch network\" functionality has been moved out of `useNetwork` into a new `useSwitchNetwork` hook.\n\n  The `useNetwork` hook now accepts no configuration and only returns `chain` (renamed from `activeChain`) and `chains`.\n\n  ```diff\n  import {\n    useNetwork\n  + useSwitchNetwork\n  } from 'wagmi'\n\n  const {\n  - activeChain\n  + chain,\n    chains,\n  - data,\n  - error,\n  - isError,\n  - isIdle,\n  - isLoading,\n  - isSuccess,\n  - pendingChainId,\n  - switchNetwork,\n  - switchNetworkAsync,\n  - status,\n  - reset,\n  -} = useNetwork({\n  - chainId: 69,\n  - onError(error) {},\n  - onMutate(args) {},\n  - onSettled(data, error) {},\n  - onSuccess(data) {}\n  -})\n  +} = useNetwork()\n\n  +const {\n  + data,\n  + error,\n  + isError,\n  + isIdle,\n  + isLoading,\n  + isSuccess,\n  + pendingChainId,\n  + switchNetwork,\n  + switchNetworkAsync,\n  + status,\n  + reset,\n  +} = useSwitchNetwork({\n  + chainId: 69,\n  + onError(error) {},\n  + onMutate(args) {},\n  + onSettled(data, error) {},\n  + onSuccess(data) {}\n  +})\n  ```\n\n* [`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: The `useContractRead` hook parameters have been consolidated into a singular config parameter.\n\n  Before:\n\n  ```tsx\n  useContractRead(\n    {\n      addressOrName: wagmigotchiContractAddress,\n      contractInterface: wagmigotchiABI,\n    },\n    \"love\",\n    { args: \"0x27a69ffba1e939ddcfecc8c7e0f967b872bac65c\" },\n  );\n  ```\n\n  After:\n\n  ```tsx\n  useContractRead({\n    addressOrName: wagmigotchiContractAddress,\n    contractInterface: wagmigotchiABI,\n    functionName: \"love\",\n    args: \"0x27a69ffba1e939ddcfecc8c7e0f967b872bac65c\",\n  });\n  ```\n\n### Patch Changes\n\n- [`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4) Thanks [@jxom](https://github.com/jxom)! - Added a `useContractInfiniteReads` hook that provides the ability to call multiple ethers Contract read-only methods with \"infinite scrolling\" (\"fetch more\") support. Useful for rendering a dynamic list of contract data.\n\n  [Learn more](https://wagmi.sh/docs/hooks/useContractInfiniteReads)\n\n* [`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4) Thanks [@jxom](https://github.com/jxom)! - Added a `useContractReads` hook that provides the ability to batch up multiple ethers Contract read-only methods.\n\n  [Learn more](https://wagmi.sh/docs/hooks/useContractReads)\n\n- [#598](https://github.com/tmm/wagmi/pull/598) [`fef26bf`](https://github.com/tmm/wagmi/commit/fef26bf8aef76fc9621e3cd54d4e0ca8f69abb38) Thanks [@markdalgleish](https://github.com/markdalgleish)! - Update `@coinbase/wallet-sdk` to fix errors when connecting with older versions of the Coinbase Wallet extension and mobile app.\n\n* [#611](https://github.com/tmm/wagmi/pull/611) [`3089c34`](https://github.com/tmm/wagmi/commit/3089c34196d4034acabac031e0a2f7ee63ae30cc) Thanks [@tmm](https://github.com/tmm)! - Added `chainId` config parameter for `useContractWrite` and `useSendTransaction`.\n\n  If `chainId` is provided, the connector will validate that `chainId` is the active chain before sending a transaction (and switch to `chainId` if necessary).\n\n* Updated dependencies [[`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4), [`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4), [`4f8f3c0`](https://github.com/tmm/wagmi/commit/4f8f3c0d65383bd8bbdfc3f1033adfdb11d80ebb), [`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4), [`3089c34`](https://github.com/tmm/wagmi/commit/3089c34196d4034acabac031e0a2f7ee63ae30cc), [`a770af7`](https://github.com/tmm/wagmi/commit/a770af7d2cb214b6620d5341115f1e938e1e77ff), [`4f8f3c0`](https://github.com/tmm/wagmi/commit/4f8f3c0d65383bd8bbdfc3f1033adfdb11d80ebb), [`fef26bf`](https://github.com/tmm/wagmi/commit/fef26bf8aef76fc9621e3cd54d4e0ca8f69abb38), [`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4), [`3089c34`](https://github.com/tmm/wagmi/commit/3089c34196d4034acabac031e0a2f7ee63ae30cc), [`b03830a`](https://github.com/tmm/wagmi/commit/b03830a54465215c2526f9509543fe2c978bfe70), [`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4), [`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4)]:\n  - @wagmi/core@0.4.0\n\n## 0.4.12\n\n### Patch Changes\n\n- [#570](https://github.com/tmm/wagmi/pull/570) [`0e3fe15`](https://github.com/tmm/wagmi/commit/0e3fe15445377f35d6f4142b49bf1c96bfeb62cd) Thanks [@tmm](https://github.com/tmm)! - adds chain for [Foundry](https://github.com/foundry-rs)\n\n- Updated dependencies [[`0e3fe15`](https://github.com/tmm/wagmi/commit/0e3fe15445377f35d6f4142b49bf1c96bfeb62cd)]:\n  - @wagmi/core@0.3.8\n\n## 0.4.11\n\n### Patch Changes\n\n- [#566](https://github.com/tmm/wagmi/pull/566) [`8713c00`](https://github.com/tmm/wagmi/commit/8713c00f70fcac3afef4ba183e3c87c6d3cbbf65) Thanks [@jxom](https://github.com/jxom)! - Fixed `parseContractResult` breaking `useContractRead` for more complex contract types\n\n## 0.4.10\n\n### Patch Changes\n\n- [`20a1ab7`](https://github.com/tmm/wagmi/commit/20a1ab7bd02a24c4f1ea02be1bc3ecfbe4abc584) Thanks [@jxom](https://github.com/jxom)! - Updated to `react-query@4.0.0-beta.23`\n\n* [`20a1ab7`](https://github.com/tmm/wagmi/commit/20a1ab7bd02a24c4f1ea02be1bc3ecfbe4abc584) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue in `useContractRead` where contract structs wouldn't be parsed back to an ethers `Result` correctly.\n\n## 0.4.9\n\n### Patch Changes\n\n- [#555](https://github.com/tmm/wagmi/pull/555) [`8bf014d`](https://github.com/tmm/wagmi/commit/8bf014d8167e9f9feb1fd91488aab42dd51c92af) Thanks [@tmm](https://github.com/tmm)! - wire up `useEnsName` `chainId`\n\n## 0.4.8\n\n### Patch Changes\n\n- [#550](https://github.com/tmm/wagmi/pull/550) [`2a5313e`](https://github.com/tmm/wagmi/commit/2a5313e8cbc9ba6335e8e4b85e43862c9b711bd3) Thanks [@tmm](https://github.com/tmm)! - fix `CoinbaseWalletConnector` possible type error\n\n* [#548](https://github.com/tmm/wagmi/pull/548) [`0c48719`](https://github.com/tmm/wagmi/commit/0c487199f2421f042abc1f1d139468ccbbc5646a) Thanks [@dohaki](https://github.com/dohaki)! - add ensAddress to Chain type\n\n- [#549](https://github.com/tmm/wagmi/pull/549) [`89b3a74`](https://github.com/tmm/wagmi/commit/89b3a74ead4234daacd0dcf8506659887ebf0553) Thanks [@tmm](https://github.com/tmm)! - Turns on [`noUncheckedIndexedAccess`](https://www.typescriptlang.org/tsconfig#noUncheckedIndexedAccess=) and [`strictNullChecks`](https://www.typescriptlang.org/tsconfig#strictNullChecks=) for better runtime safety.\n\n- Updated dependencies [[`2a5313e`](https://github.com/tmm/wagmi/commit/2a5313e8cbc9ba6335e8e4b85e43862c9b711bd3), [`0c48719`](https://github.com/tmm/wagmi/commit/0c487199f2421f042abc1f1d139468ccbbc5646a), [`89b3a74`](https://github.com/tmm/wagmi/commit/89b3a74ead4234daacd0dcf8506659887ebf0553)]:\n  - @wagmi/core@0.3.7\n\n## 0.4.7\n\n### Patch Changes\n\n- [#526](https://github.com/tmm/wagmi/pull/526) [`e95c5f9`](https://github.com/tmm/wagmi/commit/e95c5f91859e57d079b962a72d06b93dce004d2f) Thanks [@jxom](https://github.com/jxom)! - Added `shimChainChangedDisconnect` option to `InjectedConnector`. Defaults to `true` for `MetaMaskConnector`.\n\n* [#526](https://github.com/tmm/wagmi/pull/526) [`e95c5f9`](https://github.com/tmm/wagmi/commit/e95c5f91859e57d079b962a72d06b93dce004d2f) Thanks [@jxom](https://github.com/jxom)! - Added `chainId` config option to `useConnect()` & `connect()`. Consumers can now pick what chain they want their user to be connected to.\n\n  Examples:\n\n  ```tsx\n  import { useConnect, chain } from \"wagmi\";\n  import { InjectedConnector } from \"wagmi/connectors/injected\";\n\n  function App() {\n    const connect = useConnect({\n      chainId: chain.polygon.id,\n    });\n  }\n  ```\n\n  ```tsx\n  import { useConnect, chain } from \"wagmi\";\n  import { InjectedConnector } from \"wagmi/connectors/injected\";\n\n  function App() {\n    const connect = useConnect();\n\n    return (\n      <button onClick={() => connect({ chainId: chain.optimism.id })}>\n        Connect to Optimism\n      </button>\n    );\n  }\n  ```\n\n* Updated dependencies [[`e95c5f9`](https://github.com/tmm/wagmi/commit/e95c5f91859e57d079b962a72d06b93dce004d2f), [`e95c5f9`](https://github.com/tmm/wagmi/commit/e95c5f91859e57d079b962a72d06b93dce004d2f), [`e95c5f9`](https://github.com/tmm/wagmi/commit/e95c5f91859e57d079b962a72d06b93dce004d2f)]:\n  - @wagmi/core@0.3.6\n\n## 0.4.6\n\n### Patch Changes\n\n- [#543](https://github.com/tmm/wagmi/pull/543) [`4d489fd`](https://github.com/tmm/wagmi/commit/4d489fd630dd8c00440bdaf4d646de662c41ff52) Thanks [@tmm](https://github.com/tmm)! - fix fee data formatting for null values\n\n- Updated dependencies [[`4d489fd`](https://github.com/tmm/wagmi/commit/4d489fd630dd8c00440bdaf4d646de662c41ff52)]:\n  - @wagmi/core@0.3.5\n\n## 0.4.5\n\n### Patch Changes\n\n- [`01cc47b`](https://github.com/tmm/wagmi/commit/01cc47b2385c78d82bc799c2dedacb2a42457e2f) Thanks [@jxom](https://github.com/jxom)! - Update `react-query` to `4.0.0-beta.19`\n\n## 0.4.4\n\n### Patch Changes\n\n- [`c4deb66`](https://github.com/tmm/wagmi/commit/c4deb6655a52e4cc4e5b3fd82202db11d6106848) Thanks [@jxom](https://github.com/jxom)! - infer `options.chainId` config from `chains` on WalletConnectConnector\n\n- Updated dependencies [[`c4deb66`](https://github.com/tmm/wagmi/commit/c4deb6655a52e4cc4e5b3fd82202db11d6106848)]:\n  - @wagmi/core@0.3.4\n\n## 0.4.3\n\n### Patch Changes\n\n- [#486](https://github.com/tmm/wagmi/pull/486) [`dbfe3dd`](https://github.com/tmm/wagmi/commit/dbfe3dd320d178d6854a8096101200c1508786bb) Thanks [@tmm](https://github.com/tmm)! - add chains entrypoint\n\n- Updated dependencies [[`dbfe3dd`](https://github.com/tmm/wagmi/commit/dbfe3dd320d178d6854a8096101200c1508786bb)]:\n  - @wagmi/core@0.3.3\n\n## 0.4.2\n\n### Patch Changes\n\n- [`b1a2e58`](https://github.com/tmm/wagmi/commit/b1a2e5830e325be448bf865aeccda60217fc8d75) Thanks [@jxom](https://github.com/jxom)! - Made the `defaultChains` type generic in `configureChains`.\n\n## 0.4.1\n\n### Patch Changes\n\n- [#484](https://github.com/tmm/wagmi/pull/484) [`1b9a503`](https://github.com/tmm/wagmi/commit/1b9a5033d51c6655b4f6570c490da6e0e9a29da9) Thanks [@tmm](https://github.com/tmm)! - export React Context\n\n- Updated dependencies [[`1b9a503`](https://github.com/tmm/wagmi/commit/1b9a5033d51c6655b4f6570c490da6e0e9a29da9)]:\n  - @wagmi/core@0.3.1\n\n## 0.4.0\n\n### Minor Changes\n\n- [#468](https://github.com/tmm/wagmi/pull/468) [`44a884b`](https://github.com/tmm/wagmi/commit/44a884b84171c418f57701e80ef8de972948ef0b) Thanks [@tmm](https://github.com/tmm)! - **Breaking:** Duplicate exports with different names and the same functionality were removed to simplify the public API. In addition, confusing exports were renamed to be more descriptive.\n\n  - `createWagmiClient` alias was removed. Use `createClient` instead.\n  - `useWagmiClient` alias was removed. Use `useClient` instead.\n  - `WagmiClient` alias was removed. Use `Client` instead.\n  - `createWagmiStorage` alias was removed. Use `createStorage` instead.\n  - `Provider` was renamed and `WagmiProvider` alias was removed. Use `WagmiConfig` instead.\n\n* [#408](https://github.com/tmm/wagmi/pull/408) [`bfcc3a5`](https://github.com/tmm/wagmi/commit/bfcc3a51bbb1551753e3ccde6af134e9fd4fec9a) Thanks [@jxom](https://github.com/jxom)! - Add `configureChains` API.\n\n  The `configureChains` function allows you to configure your chains with a selected provider (Alchemy, Infura, JSON RPC, Public RPC URLs). This means you don't have to worry about deriving your own RPC URLs for each chain, or instantiating a Ethereum Provider.\n\n  `configureChains` accepts 3 parameters: an array of chains, and an array of providers, and a config object.\n\n  [Learn more about configuring chains & providers.](https://wagmi.sh/docs/providers/configuring-chains)\n\n  ### Before\n\n  ```tsx\n  import { providers } from \"ethers\";\n  import { chain, createClient, defaultChains } from \"wagmi\";\n  import { CoinbaseWalletConnector } from \"wagmi/connectors/coinbaseWallet\";\n  import { InjectedConnector } from \"wagmi/connectors/injected\";\n  import { MetaMaskConnector } from \"wagmi/connectors/metaMask\";\n  import { WalletConnectConnector } from \"wagmi/connectors/walletConnect\";\n\n  const alchemyId = process.env.ALCHEMY_ID;\n\n  const chains = defaultChains;\n  const defaultChain = chain.mainnet;\n\n  const client = createClient({\n    autoConnect: true,\n    connectors({ chainId }) {\n      const chain = chains.find((x) => x.id === chainId) ?? defaultChain;\n      const rpcUrl = chain.rpcUrls.alchemy\n        ? `${chain.rpcUrls.alchemy}/${alchemyId}`\n        : chain.rpcUrls.default;\n      return [\n        new MetaMaskConnector({ chains }),\n        new CoinbaseWalletConnector({\n          chains,\n          options: {\n            appName: \"wagmi\",\n            chainId: chain.id,\n            jsonRpcUrl: rpcUrl,\n          },\n        }),\n        new WalletConnectConnector({\n          chains,\n          options: {\n            qrcode: true,\n            rpc: { [chain.id]: rpcUrl },\n          },\n        }),\n        new InjectedConnector({\n          chains,\n          options: {\n            name: \"Injected\",\n            shimDisconnect: true,\n          },\n        }),\n      ];\n    },\n    provider: ({ chainId }) =>\n      new providers.AlchemyProvider(chainId, alchemyId),\n  });\n  ```\n\n  ### After\n\n  ```tsx\n  import { chain, createClient, defaultChains } from \"wagmi\";\n\n  import { alchemyProvider } from \"wagmi/providers/alchemy\";\n  import { publicProvider } from \"wagmi/providers/public\";\n\n  import { CoinbaseWalletConnector } from \"wagmi/connectors/coinbaseWallet\";\n  import { InjectedConnector } from \"wagmi/connectors/injected\";\n  import { MetaMaskConnector } from \"wagmi/connectors/metaMask\";\n  import { WalletConnectConnector } from \"wagmi/connectors/walletConnect\";\n\n  const alchemyId = process.env.ALCHEMY_ID;\n\n  const { chains, provider, webSocketProvider } = configureChains(\n    defaultChains,\n    [alchemyProvider({ alchemyId }), publicProvider()],\n  );\n\n  const client = createClient({\n    autoConnect: true,\n    connectors: [\n      new MetaMaskConnector({ chains }),\n      new CoinbaseWalletConnector({\n        chains,\n        options: {\n          appName: \"wagmi\",\n        },\n      }),\n      new WalletConnectConnector({\n        chains,\n        options: {\n          qrcode: true,\n        },\n      }),\n      new InjectedConnector({\n        chains,\n        options: {\n          name: \"Injected\",\n          shimDisconnect: true,\n        },\n      }),\n    ],\n    provider,\n    webSocketProvider,\n  });\n  ```\n\n### Patch Changes\n\n- [#404](https://github.com/tmm/wagmi/pull/404) [`f81c156`](https://github.com/tmm/wagmi/commit/f81c15665e2e71534f84ada3fa705f2d78627472) Thanks [@holic](https://github.com/holic)! - Add `ProviderRpcError` and `RpcError` error classes.\n\n  Certain wagmi-standardized errors may wrap `ProviderRpcError` or `RpcError`. For these cases, you can access the original provider rpc or rpc error value using the `internal` property.\n\n* [#459](https://github.com/tmm/wagmi/pull/459) [`72dcf7c`](https://github.com/tmm/wagmi/commit/72dcf7c09e814261b2e43a8fa364c57675c472de) Thanks [@tmm](https://github.com/tmm)! - update dependencies\n\n- [#447](https://github.com/tmm/wagmi/pull/447) [`b9ebf78`](https://github.com/tmm/wagmi/commit/b9ebf782e0900725bcb76483686b30f09d357ebd) Thanks [@tmm](https://github.com/tmm)! - Fix case where connector disconnected while app was closed and stale data was returned when autoconnecting. For example, [MetaMask was locked](https://github.com/tmm/wagmi/issues/444) when page was closed.\n\n- Updated dependencies [[`f81c156`](https://github.com/tmm/wagmi/commit/f81c15665e2e71534f84ada3fa705f2d78627472), [`bfcc3a5`](https://github.com/tmm/wagmi/commit/bfcc3a51bbb1551753e3ccde6af134e9fd4fec9a), [`44a884b`](https://github.com/tmm/wagmi/commit/44a884b84171c418f57701e80ef8de972948ef0b), [`72dcf7c`](https://github.com/tmm/wagmi/commit/72dcf7c09e814261b2e43a8fa364c57675c472de), [`a54f3e2`](https://github.com/tmm/wagmi/commit/a54f3e23ea385ed8aa4ad188128d7089ba20f83e), [`b9ebf78`](https://github.com/tmm/wagmi/commit/b9ebf782e0900725bcb76483686b30f09d357ebd), [`bfcc3a5`](https://github.com/tmm/wagmi/commit/bfcc3a51bbb1551753e3ccde6af134e9fd4fec9a)]:\n  - @wagmi/core@0.3.0\n\n## 0.3.5\n\n### Patch Changes\n\n- [`4e03666`](https://github.com/tmm/wagmi/commit/4e03666428d42fc9186c617001b5eb356229677e) Thanks [@tmm](https://github.com/tmm)! - bump dependencies #429\n  add imToken support for WC switch chains #432\n  fix MetaMask and Brave Wallet collision #436\n- Updated dependencies [[`4e03666`](https://github.com/tmm/wagmi/commit/4e03666428d42fc9186c617001b5eb356229677e)]:\n  - @wagmi/core@0.2.5\n\n## 0.3.4\n\n### Patch Changes\n\n- [#421](https://github.com/tmm/wagmi/pull/421) [`a232b3f`](https://github.com/tmm/wagmi/commit/a232b3ff5cc41e882c4d2a34c599a8cb670edd2b) Thanks [@tmm](https://github.com/tmm)! - fix erc721 abi\n\n- Updated dependencies [[`a232b3f`](https://github.com/tmm/wagmi/commit/a232b3ff5cc41e882c4d2a34c599a8cb670edd2b)]:\n  - @wagmi/core@0.2.4\n\n## 0.3.3\n\n### Patch Changes\n\n- [#412](https://github.com/tmm/wagmi/pull/412) [`80bef4f`](https://github.com/tmm/wagmi/commit/80bef4ff3f714b0b8f896f1b4b658acc7266299b) Thanks [@markdalgleish](https://github.com/markdalgleish)! - Import providers from `ethers` peer dependency rather than `@ethersproject/providers` to avoid multiple conflicting versions being installed\n\n- Updated dependencies [[`80bef4f`](https://github.com/tmm/wagmi/commit/80bef4ff3f714b0b8f896f1b4b658acc7266299b)]:\n  - @wagmi/core@0.2.3\n\n## 0.3.2\n\n### Patch Changes\n\n- [`018c2a1`](https://github.com/tmm/wagmi/commit/018c2a11b22ee513571cc7f83fd63f7eb169ee70) Thanks [@tmm](https://github.com/tmm)! - - warn and fallback to default client #380\n\n  - remove signerOrProvider option from read contract #390\n\n  - MetaMaskConnector #391\n\n- Updated dependencies [[`018c2a1`](https://github.com/tmm/wagmi/commit/018c2a11b22ee513571cc7f83fd63f7eb169ee70)]:\n  - @wagmi/core@0.2.2\n\n## 0.3.1\n\n### Patch Changes\n\n- [`afc4607`](https://github.com/tmm/wagmi/commit/afc46071e91601ab8a2b465524da796cd60b6ad4) Thanks [@tmm](https://github.com/tmm)! - - Fix time scaling e9593df\n  - Use fully-specified path for use-sync-external-store import 7b235c1\n  - Update serialize 236fc17\n- Updated dependencies [[`afc4607`](https://github.com/tmm/wagmi/commit/afc46071e91601ab8a2b465524da796cd60b6ad4)]:\n  - @wagmi/core@0.2.1\n\n## 0.3.0\n\n### Minor Changes\n\n- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - don't persist account data when `autoConnect` is falsy\n\n* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - - fix(@wagmi/core): persist connector chains to local storage\n\n- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - - Favour `message` event over `connecting` event to conform to EIP-1193\n  - Export `useWaitForTransaction`\n\n* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - force address to be required in `useAccount`\n\n- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - Initial 0.3.0 release\n\n* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - Add `cacheOnBlock` config for `useContractRead`\n  Update `react-query` to v4\n  Fix `watchBlockNumber` listener leak\n\n- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - - fix `useContractWrite` mutation fn arguments\n\n* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - Update react-query to 4.0.0-beta.5\n\n### Patch Changes\n\n- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - add chainId to actions and hooks\n\n* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - showtime\n\n- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - improve type support for ethers providers\n\n* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - update zustand\n\n- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - update babel target\n\n* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - update block explorers and rpc urls structure\n\n- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - keep previous data when watching\n\n* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - republish\n\n- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - fix stale connectors when switching chains\n\n* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - last beta\n\n* Updated dependencies [[`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d), [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d), [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d), [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d), [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d), [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d), [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d), [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d), [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d), [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d), [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d), [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d), [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d), [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d), [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d), [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d), [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d), [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d)]:\n  - @wagmi/core@0.2.0\n\n## 0.3.0-next.21\n\n### Patch Changes\n\n- showtime\n\n- Updated dependencies []:\n  - @wagmi/core@0.2.0-next.18\n\n## 0.3.0-next.20\n\n### Patch Changes\n\n- update block explorers and rpc urls structure\n\n- Updated dependencies []:\n  - @wagmi/core@0.2.0-next.17\n\n## 0.3.0-next.19\n\n### Minor Changes\n\n- Update react-query to 4.0.0-beta.5\n\n## 0.3.0-next.18\n\n### Patch Changes\n\n- last beta\n\n- Updated dependencies []:\n  - @wagmi/core@0.2.0-next.16\n\n## 0.3.0-next.17\n\n### Patch Changes\n\n- update zustand\n\n- Updated dependencies []:\n  - @wagmi/core@0.2.0-next.15\n\n## 0.3.0-next.16\n\n### Minor Changes\n\n- Add `cacheOnBlock` config for `useContractRead`\n- Update `react-query` to v4\n- Fix `watchBlockNumber` listener leak\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/core@0.2.0-next.14\n\n## 0.3.0-next.15\n\n### Patch Changes\n\n- keep previous data when watching\n\n- Updated dependencies []:\n  - @wagmi/core@0.2.0-next.13\n\n## 0.3.0-next.14\n\n### Patch Changes\n\n- add chainId to actions and hooks\n\n- Updated dependencies []:\n  - @wagmi/core@0.2.0-next.12\n\n## 0.3.0-next.13\n\n### Patch Changes\n\n- fix stale connectors when switching chains\n\n- Updated dependencies []:\n  - @wagmi/core@0.2.0-next.11\n\n## 0.3.0-next.12\n\n### Patch Changes\n\n- republish\n\n- Updated dependencies []:\n  - @wagmi/core@0.2.0-next.10\n\n## 0.3.0-next.11\n\n### Patch Changes\n\n- improve type support for ethers providers\n\n- Updated dependencies []:\n  - @wagmi/core@0.2.0-next.9\n\n## 0.3.0-next.10\n\n### Patch Changes\n\n- update babel target\n\n- Updated dependencies []:\n  - @wagmi/core@0.2.0-next.8\n\n## 0.3.0-next.9\n\n### Minor Changes\n\n- - Favour `message` event over `connecting` event to conform to EIP-1193\n  - Export `useWaitForTransaction`\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/core@0.2.0-next.7\n\n## 0.3.0-next.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/core@0.2.0-next.6\n\n## 0.3.0-next.7\n\n### Minor Changes\n\n- don't persist account data when `autoConnect` is falsy\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/core@0.2.0-next.5\n\n## 0.3.0-next.6\n\n### Minor Changes\n\n- fix `useContractWrite` mutation fn arguments\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/core@0.2.0-next.4\n\n## 0.3.0-next.5\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/core@0.2.0-next.3\n\n## 0.3.0-next.4\n\n### Minor Changes\n\n- force address to be required in `useAccount`\n\n## 0.3.0-next.3\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/core@0.2.0-next.2\n\n## 0.3.0-next.2\n\n### Minor Changes\n\n- Initial 0.3.0 release\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/core@0.2.0-next.1\n\n## 0.2.28\n\n### Patch Changes\n\n- [`747d895`](https://github.com/tmm/wagmi/commit/747d895a54b562958afde34b1d34e81ab5039e2c) Thanks [@tmm](https://github.com/tmm)! - add warning to WalletLinkConnector\n\n- Updated dependencies [[`747d895`](https://github.com/tmm/wagmi/commit/747d895a54b562958afde34b1d34e81ab5039e2c)]:\n  - wagmi-core@0.1.22\n\n## 0.2.27\n\n### Patch Changes\n\n- [`c858c51`](https://github.com/tmm/wagmi/commit/c858c51b44d9039f1d0db5bcf016639f47d1931f) Thanks [@tmm](https://github.com/tmm)! - update coinbase connector\n\n- Updated dependencies [[`c858c51`](https://github.com/tmm/wagmi/commit/c858c51b44d9039f1d0db5bcf016639f47d1931f)]:\n  - wagmi-core@0.1.21\n\n## 0.2.26\n\n### Patch Changes\n\n- Updated dependencies [[`36e6989`](https://github.com/tmm/wagmi/commit/36e69894f4c27aaad7fb6d678476c8bb870244bb)]:\n  - wagmi-core@0.1.20\n\n## 0.2.25\n\n### Patch Changes\n\n- [`d467df6`](https://github.com/tmm/wagmi/commit/d467df6374210dbc4b016788b4beb4fded54cb4d) Thanks [@tmm](https://github.com/tmm)! - fix global type leaking\n\n- Updated dependencies [[`d467df6`](https://github.com/tmm/wagmi/commit/d467df6374210dbc4b016788b4beb4fded54cb4d)]:\n  - wagmi-core@0.1.19\n\n## 0.2.24\n\n### Patch Changes\n\n- [#294](https://github.com/tmm/wagmi/pull/294) [`1d253f3`](https://github.com/tmm/wagmi/commit/1d253f3a59b61d24c88d25c99decd84a6c734e5d) Thanks [@tmm](https://github.com/tmm)! - change babel target\n\n- Updated dependencies [[`1d253f3`](https://github.com/tmm/wagmi/commit/1d253f3a59b61d24c88d25c99decd84a6c734e5d)]:\n  - wagmi-core@0.1.18\n\n## 0.2.23\n\n### Patch Changes\n\n- [#292](https://github.com/tmm/wagmi/pull/292) [`53c9be1`](https://github.com/tmm/wagmi/commit/53c9be17ee0c2ae6b8f34f2351b8858257b3f5f2) Thanks [@tmm](https://github.com/tmm)! - fix private fields\n\n- Updated dependencies [[`53c9be1`](https://github.com/tmm/wagmi/commit/53c9be17ee0c2ae6b8f34f2351b8858257b3f5f2)]:\n  - wagmi-core@0.1.17\n\n## 0.2.22\n\n### Patch Changes\n\n- [`79a2499`](https://github.com/tmm/wagmi/commit/79a249989029f818c32c0e84c0dd2c75e8aa990a) Thanks [@tmm](https://github.com/tmm)! - update build target to es2021\n\n- Updated dependencies [[`79a2499`](https://github.com/tmm/wagmi/commit/79a249989029f818c32c0e84c0dd2c75e8aa990a)]:\n  - wagmi-core@0.1.16\n\n## 0.2.21\n\n### Patch Changes\n\n- [`f9790b5`](https://github.com/tmm/wagmi/commit/f9790b55600df09c77bb8ca349c5a3457df1b07c) Thanks [@tmm](https://github.com/tmm)! - fix WalletConnect issue\n\n- Updated dependencies [[`f9790b5`](https://github.com/tmm/wagmi/commit/f9790b55600df09c77bb8ca349c5a3457df1b07c)]:\n  - wagmi-core@0.1.15\n\n## 0.2.20\n\n### Patch Changes\n\n- [`fed29fb`](https://github.com/tmm/wagmi/commit/fed29fb4714abe234e2dabb63782cfc4439a10cf) Thanks [@tmm](https://github.com/tmm)! - export useSignTypedData\n\n## 0.2.19\n\n### Patch Changes\n\n- [`6987278`](https://github.com/tmm/wagmi/commit/69872786e0b54b89a20945cc5471c1f4675b0a68) Thanks [@tmm](https://github.com/tmm)! - add useSignedTypeData\n\n## 0.2.18\n\n### Patch Changes\n\n- [#236](https://github.com/tmm/wagmi/pull/236) [`53bad61`](https://github.com/tmm/wagmi/commit/53bad615788764e31121678083c382c1bd042fe8) Thanks [@markdalgleish](https://github.com/markdalgleish)! - Updated `@walletconnect/ethereum-provider` to [v1.7.4](https://github.com/WalletConnect/walletconnect-monorepo/releases/tag/1.7.4)\n\n- Updated dependencies [[`53bad61`](https://github.com/tmm/wagmi/commit/53bad615788764e31121678083c382c1bd042fe8)]:\n  - wagmi-core@0.1.14\n\n## 0.2.17\n\n### Patch Changes\n\n- [`8e9412a`](https://github.com/tmm/wagmi/commit/8e9412af71958301ae2f9748febb936e79900aa0) Thanks [@tmm](https://github.com/tmm)! - bump walletlink\n\n- Updated dependencies [[`8e9412a`](https://github.com/tmm/wagmi/commit/8e9412af71958301ae2f9748febb936e79900aa0)]:\n  - wagmi-core@0.1.13\n\n## 0.2.16\n\n### Patch Changes\n\n- [#210](https://github.com/tmm/wagmi/pull/210) [`684468a`](https://github.com/tmm/wagmi/commit/684468aee3e42a1ce2b4b599f3f17d1819213de8) Thanks [@tmm](https://github.com/tmm)! - update chains to match chainslist.org\n\n- Updated dependencies [[`684468a`](https://github.com/tmm/wagmi/commit/684468aee3e42a1ce2b4b599f3f17d1819213de8)]:\n  - wagmi-core@0.1.12\n\n## 0.2.15\n\n### Patch Changes\n\n- [#195](https://github.com/tmm/wagmi/pull/195) [`25b6083`](https://github.com/tmm/wagmi/commit/25b6083a662a0236794d1765343467691421c14b) Thanks [@tmm](https://github.com/tmm)! - rename wagmi-private to wagmi-core\n\n- Updated dependencies [[`25b6083`](https://github.com/tmm/wagmi/commit/25b6083a662a0236794d1765343467691421c14b)]:\n  - wagmi-core@0.1.11\n\n## 0.2.14\n\n### Patch Changes\n\n- [#192](https://github.com/tmm/wagmi/pull/192) [`428cedb`](https://github.com/tmm/wagmi/commit/428cedb3dec4e3e4b9f4559c8e65932e05f94e05) Thanks [@tmm](https://github.com/tmm)! - rename core and testing packages\n\n- Updated dependencies [[`428cedb`](https://github.com/tmm/wagmi/commit/428cedb3dec4e3e4b9f4559c8e65932e05f94e05)]:\n  - wagmi-core@0.1.10\n\n## 0.2.13\n\n### Patch Changes\n\n- [#190](https://github.com/tmm/wagmi/pull/190) [`7034bb8`](https://github.com/tmm/wagmi/commit/7034bb868412b9f481b206371280e84c2d52706d) Thanks [@tmm](https://github.com/tmm)! - add shim for metamask chain changed to prevent disconnect\n\n- Updated dependencies [[`7034bb8`](https://github.com/tmm/wagmi/commit/7034bb868412b9f481b206371280e84c2d52706d)]:\n  - wagmi-private@0.1.9\n\n## 0.2.12\n\n### Patch Changes\n\n- [`566b47f`](https://github.com/tmm/wagmi/commit/566b47f53c80e1cdcc368d43c53b1772eeb5be20) Thanks [@tmm](https://github.com/tmm)! - fix contract read skip option\n\n## 0.2.11\n\n### Patch Changes\n\n- [`09f0719`](https://github.com/tmm/wagmi/commit/09f071947012e3133362a7eb80c0f39356899190) Thanks [@tmm](https://github.com/tmm)! - - safe state updates h/t @bpierre\n  - add useEnsResolveName hook h/t @shunkakinoki\n\n## 0.2.10\n\n### Patch Changes\n\n- [#159](https://github.com/tmm/wagmi/pull/159) [`981438d`](https://github.com/tmm/wagmi/commit/981438d527fb6b5f025dd9bb405fa9e7a2751597) Thanks [@markdalgleish](https://github.com/markdalgleish)! - add `WagmiProvider` alias for `Provider`\n\n## 0.2.9\n\n### Patch Changes\n\n- [#137](https://github.com/tmm/wagmi/pull/137) [`dceeb43`](https://github.com/tmm/wagmi/commit/dceeb430d9021fbf98366859cb1cd0149e80c55c) Thanks [@tmm](https://github.com/tmm)! - add siwe guide\n\n- Updated dependencies [[`dceeb43`](https://github.com/tmm/wagmi/commit/dceeb430d9021fbf98366859cb1cd0149e80c55c)]:\n  - wagmi-private@0.1.8\n\n## 0.2.8\n\n### Patch Changes\n\n- [`b49cb89`](https://github.com/tmm/wagmi/commit/b49cb89ef59289ee1185eafab427d3ab55c17c25) Thanks [@tmm](https://github.com/tmm)! - refactor contract read/write hook state\n\n## 0.2.7\n\n### Patch Changes\n\n- [`7132631`](https://github.com/tmm/wagmi/commit/713263159899feb257c11614716f0af4f6b06a14) Thanks [@tmm](https://github.com/tmm)! - update contract read and write state\n\n## 0.2.6\n\n### Patch Changes\n\n- [#127](https://github.com/tmm/wagmi/pull/127) [`f05b031`](https://github.com/tmm/wagmi/commit/f05b0310f7f7e6447e9b6c81cedbb27dcf2f3649) Thanks [@tmm](https://github.com/tmm)! - update switch chain return type\n\n- Updated dependencies [[`f05b031`](https://github.com/tmm/wagmi/commit/f05b0310f7f7e6447e9b6c81cedbb27dcf2f3649)]:\n  - wagmi-private@0.1.7\n\n## 0.2.5\n\n### Patch Changes\n\n- [`1412eed`](https://github.com/tmm/wagmi/commit/1412eed0d1494bb4f8c6845a0e890f79e4e68e03) Thanks [@tmm](https://github.com/tmm)! - add frame to injected\n\n- Updated dependencies [[`1412eed`](https://github.com/tmm/wagmi/commit/1412eed0d1494bb4f8c6845a0e890f79e4e68e03)]:\n  - wagmi-private@0.1.6\n\n## 0.2.4\n\n### Patch Changes\n\n- [#122](https://github.com/tmm/wagmi/pull/122) [`94f599c`](https://github.com/tmm/wagmi/commit/94f599cc1de74a977956d4118d85ab0d36915471) Thanks [@tmm](https://github.com/tmm)! - add decimals to useBalance\n\n## 0.2.3\n\n### Patch Changes\n\n- [`e338c3b`](https://github.com/tmm/wagmi/commit/e338c3b6cc255742be6a67593aa5da6c17e90fbd) Thanks [@tmm](https://github.com/tmm)! - checksum connector address on change events\n\n  add shim to injected connector for simulating disconnect\n\n- Updated dependencies [[`e338c3b`](https://github.com/tmm/wagmi/commit/e338c3b6cc255742be6a67593aa5da6c17e90fbd)]:\n  - wagmi-private@0.1.5\n\n## 0.2.2\n\n### Patch Changes\n\n- [`0176c4e`](https://github.com/tmm/wagmi/commit/0176c4e83fb0c5f159c3c802a1da3d6deb2184ae) Thanks [@tmm](https://github.com/tmm)! - added switchChain to WalletConnect and WalletLink connectors\n\n- Updated dependencies [[`0176c4e`](https://github.com/tmm/wagmi/commit/0176c4e83fb0c5f159c3c802a1da3d6deb2184ae)]:\n  - wagmi-private@0.1.4\n\n## 0.2.1\n\n### Patch Changes\n\n- [`f12d9cc`](https://github.com/tmm/wagmi/commit/f12d9ccfdf87a2f75299b53a7dd6b1ad046a49d8) Thanks [@tmm](https://github.com/tmm)! - fixes overrides type\n\n## 0.2.0\n\n### Minor Changes\n\n- [#98](https://github.com/tmm/wagmi/pull/98) [`b2ec758`](https://github.com/tmm/wagmi/commit/b2ec7580436f52fd35005c6dd3f4472650a14d02) Thanks [@oveddan](https://github.com/oveddan)! - Exported Context\n\n## 0.1.7\n\n### Patch Changes\n\n- [`d965757`](https://github.com/tmm/wagmi/commit/d9657578bc17648716c4671b8cc35ad295bc71d2) Thanks [@tmm](https://github.com/tmm)! - use balance eth symbol\n\n## 0.1.6\n\n### Patch Changes\n\n- [`071d7fb`](https://github.com/tmm/wagmi/commit/071d7fbca35ec4832700b5343661ceb2dae20598) Thanks [@tmm](https://github.com/tmm)! - add hardhat chain\n\n- Updated dependencies [[`071d7fb`](https://github.com/tmm/wagmi/commit/071d7fbca35ec4832700b5343661ceb2dae20598)]:\n  - wagmi-private@0.1.3\n\n## 0.1.5\n\n### Patch Changes\n\n- [`db4d869`](https://github.com/tmm/wagmi/commit/db4d869fd9380b26a1f3f96ab34abd14ca73d068) Thanks [@tmm](https://github.com/tmm)! - - add global connecting property for `Provider` `autoConnect` (h/t @sammdec)\n  - fix `useContractEvent` error (h/t @math-marcellino)\n\n## 0.1.4\n\n### Patch Changes\n\n- [#73](https://github.com/tmm/wagmi/pull/73) [`0c78ccc`](https://github.com/tmm/wagmi/commit/0c78ccc4e7f311525d4ea712b79cf532899e2006) Thanks [@tmm](https://github.com/tmm)! - fix module exports\n\n## 0.1.3\n\n### Patch Changes\n\n- [`78bade9`](https://github.com/tmm/wagmi/commit/78bade9d0da97ab38a7e6594c34e3841ec1c8fe6) Thanks [@tmm](https://github.com/tmm)! - add type definitions\n\n- Updated dependencies [[`78bade9`](https://github.com/tmm/wagmi/commit/78bade9d0da97ab38a7e6594c34e3841ec1c8fe6)]:\n  - wagmi-private@0.1.2\n\n## 0.1.2\n\n### Patch Changes\n\n- [#56](https://github.com/tmm/wagmi/pull/56) [`2ebfd8e`](https://github.com/tmm/wagmi/commit/2ebfd8e85b560f25cd46cff04619c84643cab297) Thanks [@tmm](https://github.com/tmm)! - add chain support status\n\n- Updated dependencies [[`2ebfd8e`](https://github.com/tmm/wagmi/commit/2ebfd8e85b560f25cd46cff04619c84643cab297)]:\n  - wagmi-private@0.1.1\n\n## 0.1.1\n\n### Patch Changes\n\n- [#54](https://github.com/tmm/wagmi/pull/54) [`25acd3d`](https://github.com/tmm/wagmi/commit/25acd3dfbb4498af5e1139ae9c892f5013404cbc) Thanks [@tmm](https://github.com/tmm)! - Stale contract object when useContract hook arguments change @zakangelle\n\n## 0.1.0\n\n### Minor Changes\n\n- [#52](https://github.com/tmm/wagmi/pull/52) [`da7a3a6`](https://github.com/tmm/wagmi/commit/da7a3a615def2443f65c041999100ce35e9774cc) Thanks [@tmm](https://github.com/tmm)! - Moves connectors to their own entrypoints to reduce bundle size.\n\n  ```ts\n  // old - WalletLinkConnector unused, but still in final bundle\n  import { InjectedConnector, WalletConnectConnector } from \"wagmi\";\n\n  // new - WalletLinkConnector not in final bundle\n  import { InjectedConnector } from \"wagmi/connectors/injected\";\n  import { WalletConnectConnector } from \"wagmi/connectors/walletConnect\";\n  ```\n\n### Patch Changes\n\n- Updated dependencies [[`da7a3a6`](https://github.com/tmm/wagmi/commit/da7a3a615def2443f65c041999100ce35e9774cc)]:\n  - wagmi-private@0.1.0\n\n## 0.0.17\n\n### Patch Changes\n\n- [#25](https://github.com/tmm/wagmi/pull/25) [`9a7dab7`](https://github.com/tmm/wagmi/commit/9a7dab78b3518658bc7d85dc397990f0d28da175) Thanks [@tmm](https://github.com/tmm)! - update response types\n\n- Updated dependencies [[`9a7dab7`](https://github.com/tmm/wagmi/commit/9a7dab78b3518658bc7d85dc397990f0d28da175)]:\n  - wagmi-private@0.0.17\n\n## 0.0.16\n\n### Patch Changes\n\n- [`d1574cf`](https://github.com/tmm/wagmi/commit/d1574cf5f7a578ccd480889c2e375134145a4aba) Thanks [@tmm](https://github.com/tmm)! - add better type information for contract results\n\n- Updated dependencies [[`d1574cf`](https://github.com/tmm/wagmi/commit/d1574cf5f7a578ccd480889c2e375134145a4aba)]:\n  - wagmi-private@0.0.16\n\n## 0.0.15\n\n### Patch Changes\n\n- [`3909624`](https://github.com/tmm/wagmi/commit/39096249c1fa9516beabb11735beb67c94032879) Thanks [@tmm](https://github.com/tmm)! - make contract read and write execute overrides param optional\n\n- Updated dependencies [[`3909624`](https://github.com/tmm/wagmi/commit/39096249c1fa9516beabb11735beb67c94032879)]:\n  - wagmi-private@0.0.15\n\n## 0.0.14\n\n### Patch Changes\n\n- [`63312e2`](https://github.com/tmm/wagmi/commit/63312e2b06b8d835abc2908cba399d941ca79408) Thanks [@tmm](https://github.com/tmm)! - add once to contract event\n\n- Updated dependencies [[`63312e2`](https://github.com/tmm/wagmi/commit/63312e2b06b8d835abc2908cba399d941ca79408)]:\n  - wagmi-private@0.0.14\n\n## 0.0.13\n\n### Patch Changes\n\n- [`6f890b0`](https://github.com/tmm/wagmi/commit/6f890b0dabbdbea913ec91cb8bfc970c05ed0a93) Thanks [@tmm](https://github.com/tmm)! - update readme\n\n- Updated dependencies [[`6f890b0`](https://github.com/tmm/wagmi/commit/6f890b0dabbdbea913ec91cb8bfc970c05ed0a93)]:\n  - wagmi-private@0.0.13\n\n## 0.0.12\n\n### Patch Changes\n\n- [#19](https://github.com/tmm/wagmi/pull/19) [`7bc1c47`](https://github.com/tmm/wagmi/commit/7bc1c47875e9ef24e9c79cfafc6b23e7a838b5bc) Thanks [@tmm](https://github.com/tmm)! - remove console log from walletlink connector\n\n- Updated dependencies [[`7bc1c47`](https://github.com/tmm/wagmi/commit/7bc1c47875e9ef24e9c79cfafc6b23e7a838b5bc)]:\n  - wagmi-private@0.0.12\n\n## 0.0.11\n\n### Patch Changes\n\n- [#17](https://github.com/tmm/wagmi/pull/17) [`571648b`](https://github.com/tmm/wagmi/commit/571648b754f7f538536bafc9387bd3104657ea49) Thanks [@tmm](https://github.com/tmm)! - standardize connector provider\n\n- Updated dependencies [[`571648b`](https://github.com/tmm/wagmi/commit/571648b754f7f538536bafc9387bd3104657ea49)]:\n  - wagmi-private@0.0.11\n\n## 0.0.10\n\n### Patch Changes\n\n- [#15](https://github.com/tmm/wagmi/pull/15) [`5f7675c`](https://github.com/tmm/wagmi/commit/5f7675c3ffd848522d4117c07c1f62b17dfc6616) Thanks [@tmm](https://github.com/tmm)! - read and write contract functions\n\n- Updated dependencies [[`5f7675c`](https://github.com/tmm/wagmi/commit/5f7675c3ffd848522d4117c07c1f62b17dfc6616)]:\n  - wagmi-private@0.0.10\n\n## 0.0.9\n\n### Patch Changes\n\n- [#13](https://github.com/tmm/wagmi/pull/13) [`e5545f5`](https://github.com/tmm/wagmi/commit/e5545f5565cf0bbf5e62ec7ccab3051705b1d313) Thanks [@tmm](https://github.com/tmm)! - add testing package\n\n- Updated dependencies [[`e5545f5`](https://github.com/tmm/wagmi/commit/e5545f5565cf0bbf5e62ec7ccab3051705b1d313)]:\n  - wagmi-private@0.0.9\n\n## 0.0.8\n\n### Patch Changes\n\n- [`5332500`](https://github.com/tmm/wagmi/commit/5332500918ac240d29ffe4d2aed8566a8ac001e4) Thanks [@tmm](https://github.com/tmm)! - update signing\n\n- Updated dependencies [[`5332500`](https://github.com/tmm/wagmi/commit/5332500918ac240d29ffe4d2aed8566a8ac001e4)]:\n  - wagmi-private@0.0.8\n\n## 0.0.7\n\n### Patch Changes\n\n- [`0bff89a`](https://github.com/tmm/wagmi/commit/0bff89ab2ad28b2cb9b346d1ac870e859d9278bc) Thanks [@tmm](https://github.com/tmm)! - update injected connector\n\n- Updated dependencies [[`0bff89a`](https://github.com/tmm/wagmi/commit/0bff89ab2ad28b2cb9b346d1ac870e859d9278bc)]:\n  - wagmi-private@0.0.7\n\n## 0.0.6\n\n### Patch Changes\n\n- [`37d39d1`](https://github.com/tmm/wagmi/commit/37d39d174ddfa122462bbe2d02141cd61eb9db4a) Thanks [@tmm](https://github.com/tmm)! - add message signing\n\n- Updated dependencies [[`37d39d1`](https://github.com/tmm/wagmi/commit/37d39d174ddfa122462bbe2d02141cd61eb9db4a)]:\n  - wagmi-private@0.0.6\n\n## 0.0.5\n\n### Patch Changes\n\n- [`d7d94f0`](https://github.com/tmm/wagmi/commit/d7d94f06f7d30468e5e39d64db63124c6315cf82) Thanks [@tmm](https://github.com/tmm)! - fix injected connector name\n\n- Updated dependencies [[`d7d94f0`](https://github.com/tmm/wagmi/commit/d7d94f06f7d30468e5e39d64db63124c6315cf82)]:\n  - wagmi-private@0.0.5\n\n## 0.0.4\n\n### Patch Changes\n\n- [`29fbe29`](https://github.com/tmm/wagmi/commit/29fbe2920046b9e87a34faa04500ccf3c4f83748) Thanks [@tmm](https://github.com/tmm)! - fix external deps\n\n- Updated dependencies [[`29fbe29`](https://github.com/tmm/wagmi/commit/29fbe2920046b9e87a34faa04500ccf3c4f83748)]:\n  - wagmi-private@0.0.4\n\n## 0.0.3\n\n### Patch Changes\n\n- [#6](https://github.com/tmm/wagmi/pull/6) [`8dc3a5d`](https://github.com/tmm/wagmi/commit/8dc3a5d5f418813b09663534fe585d9bcf94dbeb) Thanks [@tmm](https://github.com/tmm)! - clean up deps\n\n- Updated dependencies [[`8dc3a5d`](https://github.com/tmm/wagmi/commit/8dc3a5d5f418813b09663534fe585d9bcf94dbeb)]:\n  - wagmi-private@0.0.3\n\n## 0.0.2\n\n### Patch Changes\n\n- [#4](https://github.com/tmm/wagmi/pull/4) [`2fbd821`](https://github.com/tmm/wagmi/commit/2fbd8216379bd03c9cc5c06b10b75637e75cb7d8) Thanks [@tmm](https://github.com/tmm)! - init changesets\n\n- Updated dependencies [[`2fbd821`](https://github.com/tmm/wagmi/commit/2fbd8216379bd03c9cc5c06b10b75637e75cb7d8)]:\n  - wagmi-private@0.0.2\n"
  },
  {
    "path": "packages/react/README.md",
    "content": "# wagmi\n\nReact Hooks for Ethereum\n\n## Installation\n\n```bash\npnpm add wagmi viem @tanstack/react-query\n```\n\n## Documentation\n\nFor documentation and guides, visit [wagmi.sh](https://wagmi.sh).\n"
  },
  {
    "path": "packages/react/package.json",
    "content": "{\n  \"name\": \"wagmi\",\n  \"description\": \"React Hooks for Ethereum\",\n  \"version\": \"3.5.0\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/wevm/wagmi.git\",\n    \"directory\": \"packages/react\"\n  },\n  \"scripts\": {\n    \"build\": \"pnpm run build:esm+types\",\n    \"build:esm+types\": \"tsc --project tsconfig.build.json --outDir ./dist/esm --declaration --declarationMap --declarationDir ./dist/types\",\n    \"check:types\": \"tsc --noEmit\",\n    \"clean\": \"rm -rf dist tsconfig.tsbuildinfo actions chains codegen connectors query tempo\",\n    \"test:build\": \"publint --strict && attw --pack --ignore-rules cjs-resolves-to-esm\"\n  },\n  \"files\": [\n    \"dist/**\",\n    \"!dist/**/*.tsbuildinfo\",\n    \"src/**/*.ts\",\n    \"!src/**/*.test.ts\",\n    \"!src/**/*.test-d.ts\",\n    \"/actions\",\n    \"/chains\",\n    \"/codegen\",\n    \"/connectors\",\n    \"/query\",\n    \"/tempo\"\n  ],\n  \"sideEffects\": false,\n  \"type\": \"module\",\n  \"main\": \"./dist/esm/exports/index.js\",\n  \"types\": \"./dist/types/exports/index.d.ts\",\n  \"typings\": \"./dist/types/exports/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/types/exports/index.d.ts\",\n      \"default\": \"./dist/esm/exports/index.js\"\n    },\n    \"./actions\": {\n      \"types\": \"./dist/types/exports/actions.d.ts\",\n      \"default\": \"./dist/esm/exports/actions.js\"\n    },\n    \"./chains\": {\n      \"types\": \"./dist/types/exports/chains.d.ts\",\n      \"default\": \"./dist/esm/exports/chains.js\"\n    },\n    \"./codegen\": {\n      \"types\": \"./dist/types/exports/codegen.d.ts\",\n      \"default\": \"./dist/esm/exports/codegen.js\"\n    },\n    \"./connectors\": {\n      \"types\": \"./dist/types/exports/connectors.d.ts\",\n      \"default\": \"./dist/esm/exports/connectors.js\"\n    },\n    \"./query\": {\n      \"types\": \"./dist/types/exports/query.d.ts\",\n      \"default\": \"./dist/esm/exports/query.js\"\n    },\n    \"./tempo\": {\n      \"types\": \"./dist/types/exports/tempo.d.ts\",\n      \"default\": \"./dist/esm/exports/tempo.js\"\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"typesVersions\": {\n    \"*\": {\n      \"actions\": [\n        \"./dist/types/exports/actions.d.ts\"\n      ],\n      \"chains\": [\n        \"./dist/types/exports/chains.d.ts\"\n      ],\n      \"codegen\": [\n        \"./dist/types/exports/codegen.d.ts\"\n      ],\n      \"connectors\": [\n        \"./dist/types/exports/connectors.d.ts\"\n      ],\n      \"query\": [\n        \"./dist/types/exports/query.d.ts\"\n      ],\n      \"tempo\": [\n        \"./dist/types/exports/tempo.d.ts\"\n      ]\n    }\n  },\n  \"peerDependencies\": {\n    \"@tanstack/react-query\": \">=5.0.0\",\n    \"react\": \">=18\",\n    \"typescript\": \">=5.7.3\",\n    \"viem\": \"2.x\"\n  },\n  \"peerDependenciesMeta\": {\n    \"typescript\": {\n      \"optional\": true\n    }\n  },\n  \"dependencies\": {\n    \"@wagmi/connectors\": \"workspace:*\",\n    \"@wagmi/core\": \"workspace:*\",\n    \"use-sync-external-store\": \"1.4.0\"\n  },\n  \"devDependencies\": {\n    \"@tanstack/react-query\": \"catalog:\",\n    \"@types/react\": \"catalog:\",\n    \"@types/react-dom\": \"catalog:\",\n    \"@types/use-sync-external-store\": \"^0.0.6\",\n    \"react\": \"catalog:\",\n    \"react-dom\": \"catalog:\"\n  },\n  \"contributors\": [\n    \"awkweb.eth <t@wevm.dev>\",\n    \"jxom.eth <j@wevm.dev>\"\n  ],\n  \"funding\": \"https://github.com/sponsors/wevm\",\n  \"keywords\": [\n    \"wagmi\",\n    \"react\",\n    \"hooks\",\n    \"eth\",\n    \"ethereum\",\n    \"dapps\",\n    \"wallet\",\n    \"web3\"\n  ]\n}\n"
  },
  {
    "path": "packages/react/src/context.test.tsx",
    "content": "import { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { connect, createConfig, http, mock } from '@wagmi/core'\nimport { accounts, addressRegex, config, mainnet } from '@wagmi/test'\nimport { render } from '@wagmi/test/react'\nimport * as React from 'react'\nimport { expect, test } from 'vitest'\n\nimport { WagmiProvider } from './context.js'\nimport { useConnection } from './hooks/useConnection.js'\nimport { useConnectorClient } from './hooks/useConnectorClient.js'\n\nReact\n\ntest('default', async () => {\n  function Component() {\n    const { address } = useConnection()\n    const { data } = useConnectorClient()\n    return (\n      <div>\n        <h1>wevm</h1>\n        <div>useConnection: {address}</div>\n        <div>useConnectorClient: {data?.account?.address}</div>\n      </div>\n    )\n  }\n\n  const queryClient = new QueryClient()\n  const screen = await render(\n    <WagmiProvider config={config} reconnectOnMount>\n      <QueryClientProvider client={queryClient}>\n        <Component />\n      </QueryClientProvider>\n    </WagmiProvider>,\n  )\n  await expect.element(screen.getByRole('heading')).toHaveTextContent('wevm')\n  screen.unmount()\n})\n\ntest('fake ssr config', async () => {\n  const config = createConfig({\n    chains: [mainnet],\n    pollingInterval: 100,\n    ssr: true,\n    transports: {\n      [mainnet.id]: http(),\n    },\n  })\n  const queryClient = new QueryClient()\n\n  const screen = await render(\n    <WagmiProvider config={config} reconnectOnMount>\n      <QueryClientProvider client={queryClient}>\n        <h1>wevm</h1>\n      </QueryClientProvider>\n    </WagmiProvider>,\n  )\n  await expect.element(screen.getByRole('heading')).toHaveTextContent('wevm')\n  screen.unmount()\n})\n\ntest('mock reconnect', async () => {\n  function Component() {\n    const { address } = useConnection()\n    return (\n      <div>\n        <h1>{address}</h1>\n      </div>\n    )\n  }\n\n  const connector = mock({\n    accounts,\n    features: { reconnect: true },\n  })\n  const config = createConfig({\n    chains: [mainnet],\n    connectors: [connector],\n    storage: null,\n    transports: {\n      [mainnet.id]: http(),\n    },\n  })\n  await connect(config, { connector })\n\n  const queryClient = new QueryClient()\n  const screen = await render(\n    <WagmiProvider config={config} reconnectOnMount>\n      <QueryClientProvider client={queryClient}>\n        <Component />\n      </QueryClientProvider>\n    </WagmiProvider>,\n  )\n  await expect\n    .element(screen.getByRole('heading'))\n    .toHaveTextContent(addressRegex)\n  screen.unmount()\n})\n"
  },
  {
    "path": "packages/react/src/context.ts",
    "content": "'use client'\n\nimport type { ResolvedRegister, State } from '@wagmi/core'\nimport { createContext, createElement } from 'react'\nimport { Hydrate } from './hydrate.js'\n\nexport const WagmiContext = createContext<\n  ResolvedRegister['config'] | undefined\n>(undefined)\n\nexport type WagmiProviderProps = {\n  config: ResolvedRegister['config']\n  initialState?: State | undefined\n  reconnectOnMount?: boolean | undefined\n}\n\nexport function WagmiProvider(\n  parameters: React.PropsWithChildren<WagmiProviderProps>,\n) {\n  const { children, config } = parameters\n\n  const props = { value: config }\n  return createElement(\n    Hydrate,\n    parameters,\n    createElement(WagmiContext.Provider, props, children),\n  )\n}\n"
  },
  {
    "path": "packages/react/src/errors/base.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport { BaseError } from './base.js'\n\ntest('BaseError', () => {\n  expect(new BaseError('An error occurred.')).toMatchInlineSnapshot(`\n    [WagmiError: An error occurred.\n\n    Version: wagmi@x.y.z]\n  `)\n\n  expect(\n    new BaseError('An error occurred.', { details: 'details' }),\n  ).toMatchInlineSnapshot(`\n    [WagmiError: An error occurred.\n\n    Details: details\n    Version: wagmi@x.y.z]\n  `)\n\n  expect(new BaseError('', { details: 'details' })).toMatchInlineSnapshot(`\n    [WagmiError: An error occurred.\n\n    Details: details\n    Version: wagmi@x.y.z]\n  `)\n})\n\ntest('BaseError (w/ docsPath)', () => {\n  expect(\n    new BaseError('An error occurred.', {\n      details: 'details',\n      docsPath: '/lol',\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiError: An error occurred.\n\n    Docs: https://wagmi.sh/react/lol.html\n    Details: details\n    Version: wagmi@x.y.z]\n  `)\n  expect(\n    new BaseError('An error occurred.', {\n      cause: new BaseError('error', { docsPath: '/docs' }),\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiError: An error occurred.\n\n    Docs: https://wagmi.sh/react/docs.html\n    Version: wagmi@x.y.z]\n  `)\n  expect(\n    new BaseError('An error occurred.', {\n      cause: new BaseError('error'),\n      docsPath: '/lol',\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiError: An error occurred.\n\n    Docs: https://wagmi.sh/react/lol.html\n    Version: wagmi@x.y.z]\n  `)\n  expect(\n    new BaseError('An error occurred.', {\n      details: 'details',\n      docsPath: '/lol',\n      docsSlug: 'test',\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiError: An error occurred.\n\n    Docs: https://wagmi.sh/react/lol.html#test\n    Details: details\n    Version: wagmi@x.y.z]\n  `)\n})\n\ntest('BaseError (w/ metaMessages)', () => {\n  expect(\n    new BaseError('An error occurred.', {\n      details: 'details',\n      metaMessages: ['Reason: idk', 'Cause: lol'],\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiError: An error occurred.\n\n    Reason: idk\n    Cause: lol\n\n    Details: details\n    Version: wagmi@x.y.z]\n  `)\n})\n\ntest('inherited BaseError', () => {\n  const err = new BaseError('An error occurred.', {\n    details: 'details',\n    docsPath: '/lol',\n  })\n  expect(\n    new BaseError('An internal error occurred.', {\n      cause: err,\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiError: An internal error occurred.\n\n    Docs: https://wagmi.sh/react/lol.html\n    Details: details\n    Version: wagmi@x.y.z]\n  `)\n})\n\ntest('inherited Error', () => {\n  const err = new Error('details')\n  expect(\n    new BaseError('An internal error occurred.', {\n      cause: err,\n      docsPath: '/lol',\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiError: An internal error occurred.\n\n    Docs: https://wagmi.sh/react/lol.html\n    Details: details\n    Version: wagmi@x.y.z]\n  `)\n})\n\ntest('walk: no predicate fn (walks to leaf)', () => {\n  class FooError extends BaseError {}\n  class BarError extends BaseError {}\n\n  const err = new BaseError('test1', {\n    cause: new FooError('test2', { cause: new BarError('test3') }),\n  })\n  expect(err.walk()).toMatchInlineSnapshot(`\n    [WagmiError: test3\n\n    Version: wagmi@x.y.z]\n  `)\n})\n\ntest('walk: predicate fn', () => {\n  class FooError extends BaseError {}\n  class BarError extends BaseError {}\n\n  const err = new BaseError('test1', {\n    cause: new FooError('test2', { cause: new BarError('test3') }),\n  })\n  expect(err.walk((err) => err instanceof FooError)).toMatchInlineSnapshot(`\n    [WagmiError: test2\n\n    Version: wagmi@x.y.z]\n  `)\n})\n"
  },
  {
    "path": "packages/react/src/errors/base.ts",
    "content": "import { BaseError as CoreError } from '@wagmi/core'\n\nimport { getVersion } from '../utils/getVersion.js'\n\nexport type BaseErrorType = BaseError & { name: 'WagmiError' }\nexport class BaseError extends CoreError {\n  override name = 'WagmiError'\n  override get docsBaseUrl() {\n    return 'https://wagmi.sh/react'\n  }\n  override get version() {\n    return getVersion()\n  }\n}\n"
  },
  {
    "path": "packages/react/src/errors/context.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport { WagmiProviderNotFoundError } from './context.js'\n\ntest('WagmiProviderNotFoundError', () => {\n  expect(new WagmiProviderNotFoundError()).toMatchInlineSnapshot(`\n    [WagmiProviderNotFoundError: \\`useConfig\\` must be used within \\`WagmiProvider\\`.\n\n    Docs: https://wagmi.sh/react/api/WagmiProvider.html\n    Version: wagmi@x.y.z]\n  `)\n})\n"
  },
  {
    "path": "packages/react/src/errors/context.ts",
    "content": "import { BaseError } from './base.js'\n\nexport type WagmiProviderNotFoundErrorType = WagmiProviderNotFoundError & {\n  name: 'WagmiProviderNotFoundError'\n}\nexport class WagmiProviderNotFoundError extends BaseError {\n  override name = 'WagmiProviderNotFoundError'\n  constructor() {\n    super('`useConfig` must be used within `WagmiProvider`.', {\n      docsPath: '/api/WagmiProvider',\n    })\n  }\n}\n"
  },
  {
    "path": "packages/react/src/exports/actions.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport * as actions from './actions.js'\n\ntest('exports', () => {\n  expect(Object.keys(actions)).toMatchInlineSnapshot(`\n    [\n      \"call\",\n      \"connect\",\n      \"deployContract\",\n      \"disconnect\",\n      \"estimateFeesPerGas\",\n      \"estimateGas\",\n      \"estimateMaxPriorityFeePerGas\",\n      \"getAccount\",\n      \"getBalance\",\n      \"getBlobBaseFee\",\n      \"getBlock\",\n      \"getBlockNumber\",\n      \"getBlockTransactionCount\",\n      \"getBytecode\",\n      \"getCallsStatus\",\n      \"getCapabilities\",\n      \"getChainId\",\n      \"getChains\",\n      \"getClient\",\n      \"getConnection\",\n      \"getConnections\",\n      \"getConnectorClient\",\n      \"getConnectors\",\n      \"getContractEvents\",\n      \"getEnsAddress\",\n      \"getEnsAvatar\",\n      \"getEnsName\",\n      \"getEnsResolver\",\n      \"getEnsText\",\n      \"getFeeHistory\",\n      \"getGasPrice\",\n      \"getProof\",\n      \"getPublicClient\",\n      \"getStorageAt\",\n      \"getTransaction\",\n      \"getTransactionConfirmations\",\n      \"getTransactionCount\",\n      \"getTransactionReceipt\",\n      \"getWalletClient\",\n      \"multicall\",\n      \"prepareTransactionRequest\",\n      \"readContract\",\n      \"readContracts\",\n      \"reconnect\",\n      \"sendCalls\",\n      \"sendTransaction\",\n      \"showCallsStatus\",\n      \"signMessage\",\n      \"signTransaction\",\n      \"signTypedData\",\n      \"simulateContract\",\n      \"switchAccount\",\n      \"switchChain\",\n      \"switchConnection\",\n      \"verifyMessage\",\n      \"verifyTypedData\",\n      \"waitForCallsStatus\",\n      \"waitForTransactionReceipt\",\n      \"watchAccount\",\n      \"watchAsset\",\n      \"watchBlockNumber\",\n      \"watchBlocks\",\n      \"watchChainId\",\n      \"watchClient\",\n      \"watchConnection\",\n      \"watchConnections\",\n      \"watchConnectors\",\n      \"watchContractEvent\",\n      \"watchPendingTransactions\",\n      \"watchPublicClient\",\n      \"writeContract\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/react/src/exports/actions.ts",
    "content": "////////////////////////////////////////////////////////////////////////////////\n// @wagmi/core/actions\n////////////////////////////////////////////////////////////////////////////////\n\n// biome-ignore lint/performance/noBarrelFile: entrypoint module\n// biome-ignore lint/performance/noReExportAll: entrypoint module\nexport * from '@wagmi/core/actions'\n"
  },
  {
    "path": "packages/react/src/exports/chains.ts",
    "content": "////////////////////////////////////////////////////////////////////////////////\n// viem/chains\n////////////////////////////////////////////////////////////////////////////////\n\n// biome-ignore lint/performance/noBarrelFile: entrypoint module\n// biome-ignore lint/performance/noReExportAll: entrypoint module\nexport * from 'viem/chains'\n"
  },
  {
    "path": "packages/react/src/exports/codegen.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport * as codegen from './codegen.js'\n\ntest('exports', () => {\n  expect(Object.keys(codegen)).toMatchInlineSnapshot(`\n    [\n      \"createReadContract\",\n      \"createSimulateContract\",\n      \"createUseReadContract\",\n      \"createUseSimulateContract\",\n      \"createUseWatchContractEvent\",\n      \"createUseWriteContract\",\n      \"createWatchContractEvent\",\n      \"createWriteContract\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/react/src/exports/codegen.ts",
    "content": "////////////////////////////////////////////////////////////////////////////////\n// @wagmi/core/codegen\n////////////////////////////////////////////////////////////////////////////////\n\n// biome-ignore lint/performance/noBarrelFile: entrypoint module\n// biome-ignore lint/performance/noReExportAll: entrypoint module\nexport * from '@wagmi/core/codegen'\n\n////////////////////////////////////////////////////////////////////////////////\n// Hooks\n////////////////////////////////////////////////////////////////////////////////\n\nexport {\n  type CreateUseReadContractParameters,\n  type CreateUseReadContractReturnType,\n  createUseReadContract,\n} from '../hooks/codegen/createUseReadContract.js'\nexport {\n  type CreateUseSimulateContractParameters,\n  type CreateUseSimulateContractReturnType,\n  createUseSimulateContract,\n} from '../hooks/codegen/createUseSimulateContract.js'\n\nexport {\n  type CreateUseWatchContractEventParameters,\n  type CreateUseWatchContractEventReturnType,\n  createUseWatchContractEvent,\n} from '../hooks/codegen/createUseWatchContractEvent.js'\n\nexport {\n  type CreateUseWriteContractParameters,\n  type CreateUseWriteContractReturnType,\n  createUseWriteContract,\n} from '../hooks/codegen/createUseWriteContract.js'\n"
  },
  {
    "path": "packages/react/src/exports/connectors.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport * as connectors from './connectors.js'\n\ntest('exports', () => {\n  expect(Object.keys(connectors)).toMatchInlineSnapshot(`\n    [\n      \"baseAccount\",\n      \"coinbaseWallet\",\n      \"injected\",\n      \"metaMask\",\n      \"mock\",\n      \"porto\",\n      \"safe\",\n      \"version\",\n      \"walletConnect\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/react/src/exports/connectors.ts",
    "content": "////////////////////////////////////////////////////////////////////////////////\n// @wagmi/connectors\n////////////////////////////////////////////////////////////////////////////////\n\n// biome-ignore lint/performance/noBarrelFile: entrypoint module\n// biome-ignore lint/performance/noReExportAll: entrypoint module\nexport * from '@wagmi/connectors'\n"
  },
  {
    "path": "packages/react/src/exports/index.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport * as react from './index.js'\n\ntest('exports', () => {\n  expect(Object.keys(react)).toMatchInlineSnapshot(`\n    [\n      \"BaseError\",\n      \"ChainNotConfiguredError\",\n      \"ConnectorAccountNotFoundError\",\n      \"ConnectorAlreadyConnectedError\",\n      \"ConnectorChainMismatchError\",\n      \"ConnectorNotFoundError\",\n      \"ConnectorUnavailableReconnectingError\",\n      \"Hydrate\",\n      \"ProviderNotFoundError\",\n      \"SwitchChainNotSupportedError\",\n      \"WagmiContext\",\n      \"WagmiProvider\",\n      \"WagmiProviderNotFoundError\",\n      \"cookieStorage\",\n      \"cookieToInitialState\",\n      \"createConfig\",\n      \"createConnector\",\n      \"createStorage\",\n      \"custom\",\n      \"deepEqual\",\n      \"deserialize\",\n      \"fallback\",\n      \"http\",\n      \"injected\",\n      \"mock\",\n      \"noopStorage\",\n      \"parseCookie\",\n      \"serialize\",\n      \"unstable_connector\",\n      \"useAccount\",\n      \"useAccountEffect\",\n      \"useBalance\",\n      \"useBlobBaseFee\",\n      \"useBlock\",\n      \"useBlockNumber\",\n      \"useBlockTransactionCount\",\n      \"useBytecode\",\n      \"useCall\",\n      \"useCallsStatus\",\n      \"useCapabilities\",\n      \"useChainId\",\n      \"useChains\",\n      \"useClient\",\n      \"useConfig\",\n      \"useConnect\",\n      \"useConnection\",\n      \"useConnectionEffect\",\n      \"useConnections\",\n      \"useConnectorClient\",\n      \"useConnectors\",\n      \"useContractEvents\",\n      \"useDeployContract\",\n      \"useDisconnect\",\n      \"useEnsAddress\",\n      \"useEnsAvatar\",\n      \"useEnsName\",\n      \"useEnsResolver\",\n      \"useEnsText\",\n      \"useEstimateFeesPerGas\",\n      \"useEstimateGas\",\n      \"useEstimateMaxPriorityFeePerGas\",\n      \"useFeeHistory\",\n      \"useGasPrice\",\n      \"useInfiniteReadContracts\",\n      \"usePrepareTransactionRequest\",\n      \"useProof\",\n      \"usePublicClient\",\n      \"useReadContract\",\n      \"useReadContracts\",\n      \"useReconnect\",\n      \"useSendCalls\",\n      \"useSendCallsSync\",\n      \"useSendTransaction\",\n      \"useSendTransactionSync\",\n      \"useShowCallsStatus\",\n      \"useSignMessage\",\n      \"useSignTransaction\",\n      \"useSignTypedData\",\n      \"useSimulateContract\",\n      \"useStorageAt\",\n      \"useSwitchAccount\",\n      \"useSwitchChain\",\n      \"useSwitchConnection\",\n      \"useTransaction\",\n      \"useTransactionConfirmations\",\n      \"useTransactionCount\",\n      \"useTransactionReceipt\",\n      \"useVerifyMessage\",\n      \"useVerifyTypedData\",\n      \"useWaitForCallsStatus\",\n      \"useWaitForTransactionReceipt\",\n      \"useWalletClient\",\n      \"useWatchAsset\",\n      \"useWatchBlockNumber\",\n      \"useWatchBlocks\",\n      \"useWatchContractEvent\",\n      \"useWatchPendingTransactions\",\n      \"useWriteContract\",\n      \"useWriteContractSync\",\n      \"version\",\n      \"webSocket\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/react/src/exports/index.ts",
    "content": "////////////////////////////////////////////////////////////////////////////////\n// Context\n////////////////////////////////////////////////////////////////////////////////\n\n// biome-ignore lint/performance/noBarrelFile: entrypoint module\nexport {\n  WagmiContext,\n  WagmiProvider,\n  type WagmiProviderProps,\n} from '../context.js'\n\n////////////////////////////////////////////////////////////////////////////////\n// Errors\n////////////////////////////////////////////////////////////////////////////////\n\nexport { BaseError, type BaseErrorType } from '../errors/base.js'\n\nexport {\n  WagmiProviderNotFoundError,\n  type WagmiProviderNotFoundErrorType,\n} from '../errors/context.js'\n\n////////////////////////////////////////////////////////////////////////////////\n// Hooks\n////////////////////////////////////////////////////////////////////////////////\n\nexport {\n  type UseBalanceParameters,\n  type UseBalanceReturnType,\n  useBalance,\n} from '../hooks/useBalance.js'\n\nexport {\n  type UseBlobBaseFeeParameters,\n  type UseBlobBaseFeeReturnType,\n  useBlobBaseFee,\n} from '../hooks/useBlobBaseFee.js'\n\nexport {\n  type UseBlockParameters,\n  type UseBlockReturnType,\n  useBlock,\n} from '../hooks/useBlock.js'\n\nexport {\n  type UseBlockNumberParameters,\n  type UseBlockNumberReturnType,\n  useBlockNumber,\n} from '../hooks/useBlockNumber.js'\n\nexport {\n  type UseBlockTransactionCountParameters,\n  type UseBlockTransactionCountReturnType,\n  useBlockTransactionCount,\n} from '../hooks/useBlockTransactionCount.js'\n\nexport {\n  type UseBytecodeParameters,\n  type UseBytecodeReturnType,\n  useBytecode,\n} from '../hooks/useBytecode.js'\n\nexport {\n  type UseCallParameters,\n  type UseCallReturnType,\n  useCall,\n} from '../hooks/useCall.js'\n\nexport {\n  type UseCallsStatusParameters,\n  type UseCallsStatusReturnType,\n  useCallsStatus,\n} from '../hooks/useCallsStatus.js'\n\nexport {\n  type UseCapabilitiesParameters,\n  type UseCapabilitiesReturnType,\n  useCapabilities,\n} from '../hooks/useCapabilities.js'\n\nexport {\n  type UseChainIdParameters,\n  type UseChainIdReturnType,\n  useChainId,\n} from '../hooks/useChainId.js'\n\nexport {\n  type UseChainsParameters,\n  type UseChainsReturnType,\n  useChains,\n} from '../hooks/useChains.js'\n\nexport {\n  type UseClientParameters,\n  type UseClientReturnType,\n  useClient,\n} from '../hooks/useClient.js'\n\nexport {\n  type UseConfigParameters,\n  type UseConfigReturnType,\n  useConfig,\n} from '../hooks/useConfig.js'\n\nexport {\n  type UseConnectParameters,\n  type UseConnectReturnType,\n  useConnect,\n} from '../hooks/useConnect.js'\n\nexport {\n  /** @deprecated use `UseConnectionParameters` instead */\n  type UseConnectionParameters as UseAccountParameters,\n  type UseConnectionParameters,\n  /** @deprecated use `UseConnectionsReturnType` instead */\n  type UseConnectionReturnType as UseAccountReturnType,\n  type UseConnectionReturnType,\n  /** @deprecated use `useConnection` instead */\n  useConnection as useAccount,\n  useConnection,\n} from '../hooks/useConnection.js'\n\nexport {\n  /** @deprecated use `UseConnectionEffectParameters` instead */\n  type UseConnectionEffectParameters as UseAccountEffectParameters,\n  type UseConnectionEffectParameters,\n  /** @deprecated use `useConnectionEffect` instead */\n  useConnectionEffect as useAccountEffect,\n  useConnectionEffect,\n} from '../hooks/useConnectionEffect.js'\n\nexport {\n  type UseConnectionsParameters,\n  type UseConnectionsReturnType,\n  useConnections,\n} from '../hooks/useConnections.js'\n\nexport {\n  type UseConnectorClientParameters,\n  type UseConnectorClientReturnType,\n  useConnectorClient,\n} from '../hooks/useConnectorClient.js'\n\nexport {\n  type UseConnectorsParameters,\n  type UseConnectorsReturnType,\n  useConnectors,\n} from '../hooks/useConnectors.js'\n\nexport {\n  type UseContractEventsParameters,\n  type UseContractEventsReturnType,\n  useContractEvents,\n} from '../hooks/useContractEvents.js'\n\nexport {\n  type UseDeployContractParameters,\n  type UseDeployContractReturnType,\n  useDeployContract,\n} from '../hooks/useDeployContract.js'\n\nexport {\n  type UseDisconnectParameters,\n  type UseDisconnectReturnType,\n  useDisconnect,\n} from '../hooks/useDisconnect.js'\n\nexport {\n  type UseEnsAddressParameters,\n  type UseEnsAddressReturnType,\n  useEnsAddress,\n} from '../hooks/useEnsAddress.js'\n\nexport {\n  type UseEnsAvatarParameters,\n  type UseEnsAvatarReturnType,\n  useEnsAvatar,\n} from '../hooks/useEnsAvatar.js'\n\nexport {\n  type UseEnsNameParameters,\n  type UseEnsNameReturnType,\n  useEnsName,\n} from '../hooks/useEnsName.js'\n\nexport {\n  type UseEnsResolverParameters,\n  type UseEnsResolverReturnType,\n  useEnsResolver,\n} from '../hooks/useEnsResolver.js'\n\nexport {\n  type UseEnsTextParameters,\n  type UseEnsTextReturnType,\n  useEnsText,\n} from '../hooks/useEnsText.js'\n\nexport {\n  type UseEstimateFeesPerGasParameters,\n  type UseEstimateFeesPerGasReturnType,\n  useEstimateFeesPerGas,\n} from '../hooks/useEstimateFeesPerGas.js'\n\nexport {\n  type UseEstimateGasParameters,\n  type UseEstimateGasReturnType,\n  useEstimateGas,\n} from '../hooks/useEstimateGas.js'\n\nexport {\n  type UseEstimateMaxPriorityFeePerGasParameters,\n  type UseEstimateMaxPriorityFeePerGasReturnType,\n  useEstimateMaxPriorityFeePerGas,\n} from '../hooks/useEstimateMaxPriorityFeePerGas.js'\n\nexport {\n  type UseFeeHistoryParameters,\n  type UseFeeHistoryReturnType,\n  useFeeHistory,\n} from '../hooks/useFeeHistory.js'\n\nexport {\n  type UseGasPriceParameters,\n  type UseGasPriceReturnType,\n  useGasPrice,\n} from '../hooks/useGasPrice.js'\n\nexport {\n  type UseInfiniteContractReadsParameters,\n  type UseInfiniteContractReadsReturnType,\n  useInfiniteReadContracts,\n} from '../hooks/useInfiniteReadContracts.js'\n\nexport {\n  type UsePrepareTransactionRequestParameters,\n  type UsePrepareTransactionRequestReturnType,\n  usePrepareTransactionRequest,\n} from '../hooks/usePrepareTransactionRequest.js'\n\nexport {\n  type UseProofParameters,\n  type UseProofReturnType,\n  useProof,\n} from '../hooks/useProof.js'\n\nexport {\n  type UsePublicClientParameters,\n  type UsePublicClientReturnType,\n  usePublicClient,\n} from '../hooks/usePublicClient.js'\n\nexport {\n  type UseReadContractParameters,\n  type UseReadContractReturnType,\n  useReadContract,\n} from '../hooks/useReadContract.js'\n\nexport {\n  type UseReadContractsParameters,\n  type UseReadContractsReturnType,\n  useReadContracts,\n} from '../hooks/useReadContracts.js'\n\nexport {\n  type UseReconnectParameters,\n  type UseReconnectReturnType,\n  useReconnect,\n} from '../hooks/useReconnect.js'\n\nexport {\n  type UseSendCallsParameters,\n  type UseSendCallsReturnType,\n  useSendCalls,\n} from '../hooks/useSendCalls.js'\n\nexport {\n  type UseSendCallsSyncParameters,\n  type UseSendCallsSyncReturnType,\n  useSendCallsSync,\n} from '../hooks/useSendCallsSync.js'\n\nexport {\n  type UseSendTransactionParameters,\n  type UseSendTransactionReturnType,\n  useSendTransaction,\n} from '../hooks/useSendTransaction.js'\n\nexport {\n  type UseSendTransactionSyncParameters,\n  type UseSendTransactionSyncReturnType,\n  useSendTransactionSync,\n} from '../hooks/useSendTransactionSync.js'\n\nexport {\n  type UseShowCallsStatusParameters,\n  type UseShowCallsStatusReturnType,\n  useShowCallsStatus,\n} from '../hooks/useShowCallsStatus.js'\n\nexport {\n  type UseSignMessageParameters,\n  type UseSignMessageReturnType,\n  useSignMessage,\n} from '../hooks/useSignMessage.js'\n\nexport {\n  type UseSignTransactionParameters,\n  type UseSignTransactionReturnType,\n  useSignTransaction,\n} from '../hooks/useSignTransaction.js'\n\nexport {\n  type UseSignTypedDataParameters,\n  type UseSignTypedDataReturnType,\n  useSignTypedData,\n} from '../hooks/useSignTypedData.js'\n\nexport {\n  type UseSimulateContractParameters,\n  type UseSimulateContractReturnType,\n  useSimulateContract,\n} from '../hooks/useSimulateContract.js'\n\nexport {\n  type UseStorageAtParameters,\n  type UseStorageAtReturnType,\n  useStorageAt,\n} from '../hooks/useStorageAt.js'\n\nexport {\n  type UseSwitchChainParameters,\n  type UseSwitchChainReturnType,\n  useSwitchChain,\n} from '../hooks/useSwitchChain.js'\n\nexport {\n  /** @deprecated use `UseSwitchConnectionParameters` instead */\n  type UseSwitchConnectionParameters as UseSwitchAccountParameters,\n  type UseSwitchConnectionParameters,\n  /** @deprecated use `UseSwitchConnectionReturnType` instead */\n  type UseSwitchConnectionReturnType as UseSwitchAccountReturnType,\n  type UseSwitchConnectionReturnType,\n  /** @deprecated use `useSwitchConnection` instead */\n  useSwitchConnection as useSwitchAccount,\n  useSwitchConnection,\n} from '../hooks/useSwitchConnection.js'\n\nexport {\n  type UseTransactionParameters,\n  type UseTransactionReturnType,\n  useTransaction,\n} from '../hooks/useTransaction.js'\n\nexport {\n  type UseTransactionConfirmationsParameters,\n  type UseTransactionConfirmationsReturnType,\n  useTransactionConfirmations,\n} from '../hooks/useTransactionConfirmations.js'\n\nexport {\n  type UseTransactionCountParameters,\n  type UseTransactionCountReturnType,\n  useTransactionCount,\n} from '../hooks/useTransactionCount.js'\n\nexport {\n  type UseTransactionReceiptParameters,\n  type UseTransactionReceiptReturnType,\n  useTransactionReceipt,\n} from '../hooks/useTransactionReceipt.js'\n\nexport {\n  type UseVerifyMessageParameters,\n  type UseVerifyMessageReturnType,\n  useVerifyMessage,\n} from '../hooks/useVerifyMessage.js'\n\nexport {\n  type UseVerifyTypedDataParameters,\n  type UseVerifyTypedDataReturnType,\n  useVerifyTypedData,\n} from '../hooks/useVerifyTypedData.js'\nexport {\n  type UseWaitForCallsStatusParameters,\n  type UseWaitForCallsStatusReturnType,\n  useWaitForCallsStatus,\n} from '../hooks/useWaitForCallsStatus.js'\nexport {\n  type UseWaitForTransactionReceiptParameters,\n  type UseWaitForTransactionReceiptReturnType,\n  useWaitForTransactionReceipt,\n} from '../hooks/useWaitForTransactionReceipt.js'\nexport {\n  type UseWalletClientParameters,\n  type UseWalletClientReturnType,\n  useWalletClient,\n} from '../hooks/useWalletClient.js'\n\nexport {\n  type UseWatchAssetParameters,\n  type UseWatchAssetReturnType,\n  useWatchAsset,\n} from '../hooks/useWatchAsset.js'\nexport {\n  type UseWatchBlockNumberParameters,\n  type UseWatchBlockNumberReturnType,\n  useWatchBlockNumber,\n} from '../hooks/useWatchBlockNumber.js'\nexport {\n  type UseWatchBlocksParameters,\n  type UseWatchBlocksReturnType,\n  useWatchBlocks,\n} from '../hooks/useWatchBlocks.js'\n\nexport {\n  type UseWatchContractEventParameters,\n  type UseWatchContractEventReturnType,\n  useWatchContractEvent,\n} from '../hooks/useWatchContractEvent.js'\n\nexport {\n  type UseWatchPendingTransactionsParameters,\n  type UseWatchPendingTransactionsReturnType,\n  useWatchPendingTransactions,\n} from '../hooks/useWatchPendingTransactions.js'\n\nexport {\n  type UseWriteContractParameters,\n  type UseWriteContractReturnType,\n  useWriteContract,\n} from '../hooks/useWriteContract.js'\n\nexport {\n  type UseWriteContractSyncParameters,\n  type UseWriteContractSyncReturnType,\n  useWriteContractSync,\n} from '../hooks/useWriteContractSync.js'\n\n////////////////////////////////////////////////////////////////////////////////\n// Hydrate\n////////////////////////////////////////////////////////////////////////////////\n\nexport {\n  Hydrate,\n  type HydrateProps,\n} from '../hydrate.js'\n\n////////////////////////////////////////////////////////////////////////////////\n// @wagmi/core\n////////////////////////////////////////////////////////////////////////////////\n\nexport {\n  ChainNotConfiguredError,\n  // Errors\n  type ChainNotConfiguredErrorType,\n  type Config,\n  // Config\n  type Connection,\n  type Connector,\n  ConnectorAccountNotFoundError,\n  type ConnectorAccountNotFoundErrorType,\n  ConnectorAlreadyConnectedError,\n  type ConnectorAlreadyConnectedErrorType,\n  ConnectorChainMismatchError,\n  type ConnectorChainMismatchErrorType,\n  // Connector\n  type ConnectorEventMap,\n  ConnectorNotFoundError,\n  type ConnectorNotFoundErrorType,\n  ConnectorUnavailableReconnectingError,\n  type ConnectorUnavailableReconnectingErrorType,\n  type CreateConfigParameters,\n  type CreateConnectorFn,\n  // Storage\n  type CreateStorageParameters,\n  // Utilities\n  cookieStorage,\n  cookieToInitialState,\n  createConfig,\n  createConnector,\n  createStorage,\n  // Transports\n  custom,\n  deepEqual,\n  deserialize,\n  fallback,\n  http,\n  injected,\n  mock,\n  noopStorage,\n  type PartializedState,\n  ProviderNotFoundError,\n  type ProviderNotFoundErrorType,\n  parseCookie,\n  // Types\n  type Register,\n  type ResolvedRegister,\n  type State,\n  type Storage,\n  SwitchChainNotSupportedError,\n  type SwitchChainNotSupportedErrorType,\n  serialize,\n  type Transport,\n  unstable_connector,\n  webSocket,\n} from '@wagmi/core'\n\n////////////////////////////////////////////////////////////////////////////////\n// Version\n////////////////////////////////////////////////////////////////////////////////\n\nexport { version } from '../version.js'\n"
  },
  {
    "path": "packages/react/src/exports/query.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport * as query from './query.js'\n\ntest('exports', () => {\n  expect(Object.keys(query)).toMatchInlineSnapshot(`\n    [\n      \"callQueryKey\",\n      \"callQueryOptions\",\n      \"connectMutationOptions\",\n      \"deployContractMutationOptions\",\n      \"disconnectMutationOptions\",\n      \"estimateFeesPerGasQueryKey\",\n      \"estimateFeesPerGasQueryOptions\",\n      \"estimateGasQueryKey\",\n      \"estimateGasQueryOptions\",\n      \"estimateMaxPriorityFeePerGasQueryKey\",\n      \"estimateMaxPriorityFeePerGasQueryOptions\",\n      \"getBalanceQueryKey\",\n      \"getBalanceQueryOptions\",\n      \"getBlobBaseFeeQueryKey\",\n      \"getBlobBaseFeeQueryOptions\",\n      \"getBlockNumberQueryKey\",\n      \"getBlockNumberQueryOptions\",\n      \"getBlockQueryKey\",\n      \"getBlockQueryOptions\",\n      \"getBlockTransactionCountQueryKey\",\n      \"getBlockTransactionCountQueryOptions\",\n      \"getBytecodeQueryKey\",\n      \"getBytecodeQueryOptions\",\n      \"getCallsStatusQueryKey\",\n      \"getCallsStatusQueryOptions\",\n      \"getCapabilitiesQueryKey\",\n      \"getCapabilitiesQueryOptions\",\n      \"getConnectorClientQueryKey\",\n      \"getConnectorClientQueryOptions\",\n      \"getContractEventsQueryKey\",\n      \"getContractEventsQueryOptions\",\n      \"getEnsAddressQueryKey\",\n      \"getEnsAddressQueryOptions\",\n      \"getEnsAvatarQueryKey\",\n      \"getEnsAvatarQueryOptions\",\n      \"getEnsNameQueryKey\",\n      \"getEnsNameQueryOptions\",\n      \"getEnsResolverQueryKey\",\n      \"getEnsResolverQueryOptions\",\n      \"getEnsTextQueryKey\",\n      \"getEnsTextQueryOptions\",\n      \"getFeeHistoryQueryKey\",\n      \"getFeeHistoryQueryOptions\",\n      \"getGasPriceQueryKey\",\n      \"getGasPriceQueryOptions\",\n      \"getProofQueryKey\",\n      \"getProofQueryOptions\",\n      \"getStorageAtQueryKey\",\n      \"getStorageAtQueryOptions\",\n      \"getTransactionConfirmationsQueryKey\",\n      \"getTransactionConfirmationsQueryOptions\",\n      \"getTransactionCountQueryKey\",\n      \"getTransactionCountQueryOptions\",\n      \"getTransactionQueryKey\",\n      \"getTransactionQueryOptions\",\n      \"getTransactionReceiptQueryKey\",\n      \"getTransactionReceiptQueryOptions\",\n      \"getWalletClientQueryKey\",\n      \"getWalletClientQueryOptions\",\n      \"hashFn\",\n      \"infiniteReadContractsQueryKey\",\n      \"infiniteReadContractsQueryOptions\",\n      \"prepareTransactionRequestQueryKey\",\n      \"prepareTransactionRequestQueryOptions\",\n      \"readContractQueryKey\",\n      \"readContractQueryOptions\",\n      \"readContractsQueryKey\",\n      \"readContractsQueryOptions\",\n      \"reconnectMutationOptions\",\n      \"sendCallsMutationOptions\",\n      \"sendCallsSyncMutationOptions\",\n      \"sendTransactionMutationOptions\",\n      \"sendTransactionSyncMutationOptions\",\n      \"showCallsStatusMutationOptions\",\n      \"signMessageMutationOptions\",\n      \"signTransactionMutationOptions\",\n      \"signTypedDataMutationOptions\",\n      \"simulateContractQueryKey\",\n      \"simulateContractQueryOptions\",\n      \"structuralSharing\",\n      \"switchAccountMutationOptions\",\n      \"switchChainMutationOptions\",\n      \"switchConnectionMutationOptions\",\n      \"useInfiniteQuery\",\n      \"useMutation\",\n      \"useQuery\",\n      \"verifyMessageQueryKey\",\n      \"verifyMessageQueryOptions\",\n      \"verifyTypedDataQueryKey\",\n      \"verifyTypedDataQueryOptions\",\n      \"waitForCallsStatusQueryKey\",\n      \"waitForCallsStatusQueryOptions\",\n      \"waitForTransactionReceiptQueryKey\",\n      \"waitForTransactionReceiptQueryOptions\",\n      \"watchAssetMutationOptions\",\n      \"writeContractMutationOptions\",\n      \"writeContractSyncMutationOptions\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/react/src/exports/query.ts",
    "content": "////////////////////////////////////////////////////////////////////////////////\n// @wagmi/core/query\n////////////////////////////////////////////////////////////////////////////////\n\n// biome-ignore lint/performance/noBarrelFile: entrypoint module\n// biome-ignore lint/performance/noReExportAll: entrypoint module\nexport * from '@wagmi/core/query'\n\nexport {\n  type UseInfiniteQueryParameters,\n  type UseInfiniteQueryReturnType,\n  type UseMutationParameters,\n  type UseMutationReturnType,\n  type UseQueryParameters,\n  type UseQueryReturnType,\n  useInfiniteQuery,\n  useMutation,\n  useQuery,\n} from '../utils/query.js'\n"
  },
  {
    "path": "packages/react/src/exports/tempo.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport * as tempo from './tempo.js'\n\ntest('exports', () => {\n  expect(Object.keys(tempo)).toMatchInlineSnapshot(`\n    [\n      \"Actions\",\n      \"Hooks\",\n      \"KeyManager\",\n      \"dangerous_secp256k1\",\n      \"webAuthn\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/react/src/exports/tempo.ts",
    "content": "////////////////////////////////////////////////////////////////////////////////\n// Tempo\n////////////////////////////////////////////////////////////////////////////////\n\n/** biome-ignore-all lint/performance/noReExportAll: entrypoint */\n// biome-ignore lint/performance/noBarrelFile: entrypoint module\nexport {\n  Actions,\n  type Dangerous_Secp256k1Parameters,\n  dangerous_secp256k1,\n  KeyManager,\n  type WebAuthnParameters,\n  webAuthn,\n} from '@wagmi/core/tempo'\n\n// Export Hooks\nexport * as Hooks from '../tempo/hooks/index.js'\n"
  },
  {
    "path": "packages/react/src/hooks/AGENTS.md",
    "content": "# Agent Guidelines\n\nAgent guidance for React hooks\n\n> **Communication Style**: Be brief, concise. Maximize information density, minimize tokens. Incomplete sentences acceptable when clear. Remove filler words. Prioritize clarity over grammar.\n\n## Query Hook Format\n\n```ts\n'use client'\nimport type { Config, MyActionErrorType, ResolvedRegister } from '@wagmi/core'\nimport type { Compute } from '@wagmi/core/internal'\nimport {\n  type MyActionData,\n  type MyActionOptions,\n  myActionQueryOptions,\n} from '@wagmi/core/query'\nimport type { ConfigParameter } from '../types/properties.js'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseMyActionParameters<\n  config extends Config = Config,\n  selectData = MyActionData,\n> = Compute<MyActionOptions<config, selectData> & ConfigParameter<config>>\n\nexport type UseMyActionReturnType<selectData = MyActionData> =\n  UseQueryReturnType<selectData, MyActionErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useMyAction */\nexport function useMyAction<\n  config extends Config = ResolvedRegister['config'],\n  selectData = MyActionData,\n>(\n  parameters: UseMyActionParameters<config, selectData> = {},\n): UseMyActionReturnType<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = myActionQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options)\n}\n```\n\n## Key Patterns\n\n### `'use client'` Directive\n\nAll hooks must start with `'use client'` directive.\n\n### `useConfig` and `useChainId`\n\nQuery hooks always call these to get config from React context and current chain:\n\n```ts\nconst config = useConfig(parameters)\nconst chainId = useChainId({ config })\n```\n\n### `ResolvedRegister['config']`\n\nUse `ResolvedRegister['config']` as default for `config` in the **function signature only** (not in type definitions). This allows type inference when config is injected via React context:\n\n```ts\n// Type definition uses Config\nexport type UseMyActionParameters<\n  config extends Config = Config,\n  selectData = MyActionData,\n> = ...\n\n// Function uses ResolvedRegister['config']\nexport function useMyAction<\n  config extends Config = ResolvedRegister['config'],\n  selectData = MyActionData,\n>(...) { ... }\n```\n\n### `enabled` and `structuralSharing`\n\nDo NOT set `enabled` or `structuralSharing` in hooks. These are handled by `queryOptions` from `@wagmi/core/query`.\n\n### Doc Comment\n\nUse a simple link to the docs:\n\n```ts\n/** https://wagmi.sh/react/api/hooks/useMyAction */\n```\n\n## Type Parameter Nuances\n\n### `Compute` vs `UnionCompute`\n\n- **`Compute`**: Use for simple hooks with straightforward parameter types\n- **`UnionCompute`**: Use for complex type inference (e.g., contract-related hooks)\n- **Neither**: Some hooks with very complex inference may not support either\n\n### `const` Modifier\n\nUse `const` for type parameters that need literal type inference (e.g., abi, args):\n\n```ts\nexport function useReadContract<\n  const abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'pure' | 'view'>,\n  const args extends ContractFunctionArgs<abi, 'pure' | 'view', functionName>,\n  config extends Config = ResolvedRegister['config'],\n  selectData = ReadContractData<abi, functionName, args>,\n>\n```\n\n### Default Parameter Value\n\n- **Simple cases**: `parameters: UseMyActionParameters<config, selectData> = {}`\n- **Complex generics**: `parameters: UseMyActionParameters<...> = {} as any`\n"
  },
  {
    "path": "packages/react/src/hooks/codegen/createUseReadContract.test-d.ts",
    "content": "import { abi, mainnet, optimism } from '@wagmi/test'\nimport { assertType, expectTypeOf, test } from 'vitest'\n\nimport { createUseReadContract } from './createUseReadContract.js'\n\ntest('default', () => {\n  const useReadErc20 = createUseReadContract({\n    abi: abi.erc20,\n  })\n\n  const result = useReadErc20({\n    functionName: 'balanceOf',\n    args: ['0x'],\n    chainId: 123,\n  })\n  expectTypeOf(result.data).toEqualTypeOf<bigint | undefined>()\n})\n\ntest('select data', () => {\n  const useReadErc20 = createUseReadContract({\n    abi: abi.erc20,\n  })\n\n  const result = useReadErc20({\n    address: '0x',\n    functionName: 'balanceOf',\n    args: ['0x'],\n    query: {\n      select(data) {\n        expectTypeOf(data).toEqualTypeOf<bigint>()\n        return data?.toString()\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<string | undefined>()\n})\n\ntest('multichain address', () => {\n  const useReadErc20 = createUseReadContract({\n    abi: abi.erc20,\n    address: {\n      [mainnet.id]: '0x',\n      [optimism.id]: '0x',\n    },\n  })\n\n  const result = useReadErc20({\n    functionName: 'balanceOf',\n    args: ['0x'],\n    chainId: mainnet.id,\n    // ^?\n  })\n  assertType<bigint | undefined>(result.data)\n\n  useReadErc20({\n    functionName: 'balanceOf',\n    args: ['0x'],\n    // @ts-expect-error chain id must match address keys\n    chainId: 420,\n  })\n\n  useReadErc20({\n    functionName: 'balanceOf',\n    args: ['0x'],\n    // @ts-expect-error address not allowed\n    address: '0x',\n  })\n})\n\ntest('overloads', () => {\n  const useReadViewOverloads = createUseReadContract({\n    abi: abi.viewOverloads,\n  })\n\n  const result1 = useReadViewOverloads({\n    functionName: 'foo',\n  })\n  assertType<number | undefined>(result1.data)\n\n  const result2 = useReadViewOverloads({\n    functionName: 'foo',\n    args: [],\n  })\n  assertType<number | undefined>(result2.data)\n\n  const result3 = useReadViewOverloads({\n    functionName: 'foo',\n    args: ['0x'],\n  })\n  assertType<string | undefined>(result3.data)\n\n  const result4 = useReadViewOverloads({\n    functionName: 'foo',\n    args: ['0x', '0x'],\n  })\n  assertType<\n    | {\n        foo: `0x${string}`\n        bar: `0x${string}`\n      }\n    | undefined\n  >(result4.data)\n})\n\ntest('functionName', () => {\n  const useReadErc20BalanceOf = createUseReadContract({\n    abi: abi.erc20,\n    address: '0x',\n    functionName: 'balanceOf',\n  })\n\n  const result = useReadErc20BalanceOf({\n    args: ['0x'],\n    chainId: 1,\n  })\n  expectTypeOf(result.data).toEqualTypeOf<bigint | undefined>()\n})\n\ntest('functionName with overloads', () => {\n  const useReadViewOverloads = createUseReadContract({\n    abi: abi.viewOverloads,\n    functionName: 'foo',\n  })\n\n  const result1 = useReadViewOverloads()\n  assertType<number | undefined>(result1.data)\n\n  const result2 = useReadViewOverloads({\n    args: [],\n  })\n  assertType<number | undefined>(result2.data)\n\n  const result3 = useReadViewOverloads({\n    args: ['0x'],\n  })\n  assertType<string | undefined>(result3.data)\n\n  const result4 = useReadViewOverloads({\n    args: ['0x', '0x'],\n  })\n  assertType<\n    | {\n        foo: `0x${string}`\n        bar: `0x${string}`\n      }\n    | undefined\n  >(result4.data)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/codegen/createUseReadContract.test.ts",
    "content": "import {\n  connect,\n  createConfig,\n  disconnect,\n  http,\n  mock,\n  switchChain,\n} from '@wagmi/core'\nimport { abi, accounts, address, chain, config } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\nimport { createUseReadContract } from './createUseReadContract.js'\n\ntest('default', async () => {\n  const useReadWagmiMintExample = createUseReadContract({\n    address: address.wagmiMintExample,\n    abi: abi.wagmiMintExample,\n  })\n\n  const { result } = await renderHook(() =>\n    useReadWagmiMintExample({\n      functionName: 'balanceOf',\n      args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": 10n,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"readContract\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"args\": [\n            \"0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC\",\n          ],\n          \"chainId\": 1,\n          \"functionName\": \"balanceOf\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('multichain', async () => {\n  const useReadWagmiMintExample = createUseReadContract({\n    address: {\n      [chain.mainnet.id]: address.wagmiMintExample,\n      [chain.mainnet2.id]: address.wagmiMintExample,\n    },\n    abi: abi.wagmiMintExample,\n  })\n\n  const { result } = await renderHook(() =>\n    useReadWagmiMintExample({\n      functionName: 'balanceOf',\n      args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n      chainId: chain.mainnet2.id,\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": 10n,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"readContract\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"args\": [\n            \"0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC\",\n          ],\n          \"chainId\": 456,\n          \"functionName\": \"balanceOf\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('functionName', async () => {\n  const useReadWagmiMintExampleBalanceOf = createUseReadContract({\n    address: address.wagmiMintExample,\n    abi: abi.wagmiMintExample,\n    functionName: 'balanceOf',\n  })\n\n  const { result } = await renderHook(() =>\n    useReadWagmiMintExampleBalanceOf({\n      args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": 10n,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"readContract\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"args\": [\n            \"0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC\",\n          ],\n          \"chainId\": 1,\n          \"functionName\": \"balanceOf\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('behavior: syncConnectedChain on', async () => {\n  await disconnect(config)\n  await connect(config, {\n    connector: config.connectors[0]!,\n    chainId: chain.mainnet.id,\n  })\n\n  const useReadWagmiMintExample = createUseReadContract({\n    address: {\n      [chain.mainnet.id]: address.wagmiMintExample,\n      [chain.mainnet2.id]: address.wagmiMintExample,\n    },\n    abi: abi.wagmiMintExample,\n  })\n\n  const { rerender, result } = await renderHook(() =>\n    useReadWagmiMintExample({\n      functionName: 'balanceOf',\n      args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, {\n    timeout: 10_000,\n  })\n\n  expect(result.current.queryKey).toMatchInlineSnapshot(`\n    [\n      \"readContract\",\n      {\n        \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        \"args\": [\n          \"0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC\",\n        ],\n        \"chainId\": 1,\n        \"functionName\": \"balanceOf\",\n      },\n    ]\n  `)\n\n  await switchChain(config, { chainId: chain.mainnet2.id })\n\n  rerender()\n  await vi.waitUntil(() => result.current.isSuccess, {\n    timeout: 10_000,\n  })\n\n  expect(result.current.queryKey).toMatchInlineSnapshot(`\n    [\n      \"readContract\",\n      {\n        \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        \"args\": [\n          \"0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC\",\n        ],\n        \"chainId\": 456,\n        \"functionName\": \"balanceOf\",\n      },\n    ]\n  `)\n\n  await disconnect(config)\n})\n\ntest('behavior: syncConnectedChain off', async () => {\n  const config = createConfig({\n    chains: [chain.mainnet, chain.mainnet2, chain.optimism],\n    connectors: [mock({ accounts })],\n    pollingInterval: 100,\n    storage: null,\n    syncConnectedChain: false,\n    transports: {\n      [chain.mainnet.id]: http(),\n      [chain.mainnet2.id]: http(),\n      [chain.optimism.id]: http(),\n    },\n  })\n\n  await disconnect(config)\n  await connect(config, {\n    connector: config.connectors[0]!,\n    chainId: chain.mainnet.id,\n  })\n\n  const useReadWagmiMintExample = createUseReadContract({\n    address: {\n      [chain.mainnet.id]: address.wagmiMintExample,\n      [chain.mainnet2.id]: address.wagmiMintExample,\n    },\n    abi: abi.wagmiMintExample,\n  })\n\n  const { rerender, result } = await renderHook(() =>\n    useReadWagmiMintExample({\n      functionName: 'balanceOf',\n      args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, {\n    timeout: 10_000,\n  })\n\n  expect(result.current.queryKey).toMatchInlineSnapshot(`\n    [\n      \"readContract\",\n      {\n        \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        \"args\": [\n          \"0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC\",\n        ],\n        \"chainId\": 456,\n        \"functionName\": \"balanceOf\",\n      },\n    ]\n  `)\n\n  await switchChain(config, { chainId: chain.optimism.id })\n\n  rerender()\n  await vi.waitUntil(() => result.current.isSuccess, {\n    timeout: 10_000,\n  })\n\n  expect(result.current.queryKey).toMatchInlineSnapshot(`\n    [\n      \"readContract\",\n      {\n        \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        \"args\": [\n          \"0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC\",\n        ],\n        \"chainId\": 456,\n        \"functionName\": \"balanceOf\",\n      },\n    ]\n  `)\n\n  await disconnect(config)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/codegen/createUseReadContract.ts",
    "content": "import type {\n  Config,\n  ReadContractErrorType,\n  ReadContractParameters,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type {\n  ConfigParameter,\n  QueryParameter,\n  ScopeKeyParameter,\n  UnionCompute,\n  UnionExactPartial,\n} from '@wagmi/core/internal'\nimport type {\n  ReadContractData,\n  ReadContractQueryFnData,\n  ReadContractQueryKey,\n} from '@wagmi/core/query'\nimport type {\n  Abi,\n  Address,\n  ContractFunctionArgs,\n  ContractFunctionName,\n  ExactPartial,\n} from 'viem'\nimport { useChainId } from '../useChainId.js'\nimport { useConfig } from '../useConfig.js'\nimport {\n  type UseReadContractReturnType,\n  useReadContract,\n} from '../useReadContract.js'\n\ntype stateMutability = 'pure' | 'view'\n\nexport type CreateUseReadContractParameters<\n  abi extends Abi | readonly unknown[],\n  address extends Address | Record<number, Address> | undefined = undefined,\n  functionName extends\n    | ContractFunctionName<abi, stateMutability>\n    | undefined = undefined,\n> = {\n  abi: abi | Abi | readonly unknown[]\n  address?: address | Address | Record<number, Address> | undefined\n  functionName?:\n    | functionName\n    | ContractFunctionName<abi, stateMutability>\n    | undefined\n}\n\nexport type CreateUseReadContractReturnType<\n  abi extends Abi | readonly unknown[],\n  address extends Address | Record<number, Address> | undefined,\n  functionName extends ContractFunctionName<abi, stateMutability> | undefined,\n  ///\n  omittedProperties extends 'abi' | 'address' | 'functionName' =\n    | 'abi'\n    | (address extends undefined ? never : 'address')\n    | (functionName extends undefined ? never : 'functionName'),\n> = <\n  name extends functionName extends ContractFunctionName<abi, stateMutability>\n    ? functionName\n    : ContractFunctionName<abi, stateMutability>,\n  const args extends ContractFunctionArgs<abi, stateMutability, name>,\n  config extends Config = ResolvedRegister['config'],\n  selectData = ReadContractData<abi, name, args>,\n>(\n  parameters?: UnionCompute<\n    UnionExactPartial<\n      // TODO: Ideally use UnionStrictOmit with omittedProperties (abi, address, functionName)\n      ReadContractParameters<abi, name, args, config>\n    > &\n      ScopeKeyParameter &\n      ConfigParameter<config> &\n      QueryParameter<\n        ReadContractQueryFnData<abi, name, args>,\n        ReadContractErrorType,\n        selectData,\n        ReadContractQueryKey<abi, name, args, config>\n      >\n  > &\n    (address extends Record<number, Address>\n      ? { chainId?: keyof address | undefined }\n      : unknown) &\n    ExactPartial<Record<omittedProperties, undefined>>,\n) => UseReadContractReturnType<abi, name, args, selectData>\n\nexport function createUseReadContract<\n  const abi extends Abi | readonly unknown[],\n  const address extends\n    | Address\n    | Record<number, Address>\n    | undefined = undefined,\n  functionName extends\n    | ContractFunctionName<abi, stateMutability>\n    | undefined = undefined,\n>(\n  props: CreateUseReadContractParameters<abi, address, functionName>,\n): CreateUseReadContractReturnType<abi, address, functionName> {\n  if (props.address !== undefined && typeof props.address === 'object')\n    return (parameters) => {\n      const config = useConfig(parameters)\n      const configChainId = useChainId({ config })\n      const chainId =\n        (parameters as { chainId?: number })?.chainId ?? configChainId\n      return useReadContract({\n        ...(parameters as any),\n        ...(props.functionName ? { functionName: props.functionName } : {}),\n        address: props.address?.[chainId],\n        abi: props.abi,\n      })\n    }\n\n  return (parameters) => {\n    return useReadContract({\n      ...(parameters as any),\n      ...(props.address ? { address: props.address } : {}),\n      ...(props.functionName ? { functionName: props.functionName } : {}),\n      abi: props.abi,\n    })\n  }\n}\n"
  },
  {
    "path": "packages/react/src/hooks/codegen/createUseSimulateContract.test-d.ts",
    "content": "import { abi, mainnet, optimism } from '@wagmi/test'\nimport type { Address } from 'viem'\nimport { assertType, expectTypeOf, test } from 'vitest'\n\nimport { createUseSimulateContract } from './createUseSimulateContract.js'\n\ntest('default', () => {\n  const useSimulateErc20 = createUseSimulateContract({\n    abi: abi.erc20,\n  })\n\n  const result = useSimulateErc20({\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    chainId: 123,\n  })\n  result.data?.request.chainId\n  expectTypeOf(result.data).toMatchTypeOf<\n    | {\n        result: boolean\n        request: {\n          chainId: 123\n          abi: readonly [\n            {\n              readonly name: 'transferFrom'\n              readonly type: 'function'\n              readonly stateMutability: 'nonpayable'\n              readonly inputs: readonly [\n                { readonly type: 'address'; readonly name: 'sender' },\n                { readonly type: 'address'; readonly name: 'recipient' },\n                { readonly type: 'uint256'; readonly name: 'amount' },\n              ]\n              readonly outputs: readonly [{ type: 'bool' }]\n            },\n          ]\n          functionName: 'transferFrom'\n          args: readonly [Address, Address, bigint]\n        }\n      }\n    | undefined\n  >()\n})\n\ntest('select data', () => {\n  const useSimulateErc20 = createUseSimulateContract({\n    abi: abi.erc20,\n  })\n\n  const result = useSimulateErc20({\n    address: '0x',\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    query: {\n      select(data) {\n        expectTypeOf(data.result).toEqualTypeOf<boolean>()\n        return data?.toString()\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<string | undefined>()\n})\n\ntest('multichain address', () => {\n  const useSimulateErc20 = createUseSimulateContract({\n    abi: abi.erc20,\n    address: {\n      [mainnet.id]: '0x',\n      [optimism.id]: '0x',\n    },\n  })\n\n  const result = useSimulateErc20({\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    chainId: optimism.id,\n  })\n  expectTypeOf(result.data?.result).toEqualTypeOf<boolean | undefined>()\n\n  useSimulateErc20({\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    // @ts-expect-error chain id must match address keys\n    chainId: 420,\n  })\n\n  useSimulateErc20({\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    // @ts-expect-error address not allowed\n    address: '0x',\n  })\n})\n\ntest('overloads', () => {\n  const useSimulateWriteOverloads = createUseSimulateContract({\n    abi: abi.writeOverloads,\n  })\n\n  const result1 = useSimulateWriteOverloads({\n    functionName: 'foo',\n  })\n  assertType<number | undefined>(result1.data?.result)\n\n  const result2 = useSimulateWriteOverloads({\n    functionName: 'foo',\n    args: [],\n  })\n  assertType<number | undefined>(result2.data?.result)\n\n  const result3 = useSimulateWriteOverloads({\n    functionName: 'foo',\n    args: ['0x'],\n  })\n  assertType<string | undefined>(result3.data?.result)\n\n  const result4 = useSimulateWriteOverloads({\n    functionName: 'foo',\n    args: ['0x', '0x'],\n  })\n  assertType<\n    | {\n        foo: `0x${string}`\n        bar: `0x${string}`\n      }\n    | undefined\n  >(result4.data?.result)\n})\n\ntest('functionName', () => {\n  const useSimulateErc20 = createUseSimulateContract({\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n  })\n\n  const result = useSimulateErc20({\n    args: ['0x', '0x', 123n],\n    chainId: 123,\n  })\n  result.data?.request.chainId\n  expectTypeOf(result.data).toMatchTypeOf<\n    | {\n        result: boolean\n        request: {\n          chainId: 123\n          abi: readonly [\n            {\n              readonly name: 'transferFrom'\n              readonly type: 'function'\n              readonly stateMutability: 'nonpayable'\n              readonly inputs: readonly [\n                { readonly type: 'address'; readonly name: 'sender' },\n                { readonly type: 'address'; readonly name: 'recipient' },\n                { readonly type: 'uint256'; readonly name: 'amount' },\n              ]\n              readonly outputs: readonly [{ type: 'bool' }]\n            },\n          ]\n          functionName: 'transferFrom'\n          args: readonly [Address, Address, bigint]\n        }\n      }\n    | undefined\n  >()\n})\n\ntest('functionName with overloads', () => {\n  const useSimulateWriteOverloads = createUseSimulateContract({\n    abi: abi.writeOverloads,\n    functionName: 'foo',\n  })\n\n  const result1 = useSimulateWriteOverloads({})\n  assertType<number | undefined>(result1.data?.result)\n\n  const result2 = useSimulateWriteOverloads({\n    args: [],\n  })\n  assertType<number | undefined>(result2.data?.result)\n\n  const result3 = useSimulateWriteOverloads({\n    args: ['0x'],\n  })\n  assertType<string | undefined>(result3.data?.result)\n\n  const result4 = useSimulateWriteOverloads({\n    args: ['0x', '0x'],\n  })\n  assertType<\n    | {\n        foo: `0x${string}`\n        bar: `0x${string}`\n      }\n    | undefined\n  >(result4.data?.result)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/codegen/createUseSimulateContract.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { abi, address, chain, config } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { beforeEach, expect, test, vi } from 'vitest'\n\nimport { createUseSimulateContract } from './createUseSimulateContract.js'\n\nconst connector = config.connectors[0]!\n\nbeforeEach(async () => {\n  await disconnect(config).catch(() => {})\n})\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const useSimulateWagmiMintExample = createUseSimulateContract({\n    address: address.wagmiMintExample,\n    abi: abi.wagmiMintExample,\n  })\n\n  const { result } = await renderHook(() =>\n    useSimulateWagmiMintExample({\n      functionName: 'mint',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": {\n        \"chainId\": 1,\n        \"request\": {\n          \"abi\": [\n            {\n              \"inputs\": [],\n              \"name\": \"mint\",\n              \"outputs\": [],\n              \"stateMutability\": \"nonpayable\",\n              \"type\": \"function\",\n            },\n          ],\n          \"account\": {\n            \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n            \"type\": \"json-rpc\",\n          },\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"args\": undefined,\n          \"chainId\": 1,\n          \"dataSuffix\": undefined,\n          \"functionName\": \"mint\",\n        },\n        \"result\": undefined,\n      },\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"simulateContract\",\n        {\n          \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"chainId\": 1,\n          \"functionName\": \"mint\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n\n  await disconnect(config, { connector })\n})\n\ntest('multichain', async () => {\n  await connect(config, { connector })\n\n  const useReadWagmiMintExample = createUseSimulateContract({\n    address: {\n      [chain.mainnet.id]: address.wagmiMintExample,\n      [chain.mainnet2.id]: address.wagmiMintExample,\n    },\n    abi: abi.wagmiMintExample,\n  })\n\n  const { result } = await renderHook(() =>\n    useReadWagmiMintExample({\n      functionName: 'mint',\n      chainId: chain.mainnet2.id,\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": {\n        \"chainId\": 456,\n        \"request\": {\n          \"abi\": [\n            {\n              \"inputs\": [],\n              \"name\": \"mint\",\n              \"outputs\": [],\n              \"stateMutability\": \"nonpayable\",\n              \"type\": \"function\",\n            },\n          ],\n          \"account\": {\n            \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n            \"type\": \"json-rpc\",\n          },\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"args\": undefined,\n          \"chainId\": 456,\n          \"dataSuffix\": undefined,\n          \"functionName\": \"mint\",\n        },\n        \"result\": undefined,\n      },\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"simulateContract\",\n        {\n          \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"chainId\": 456,\n          \"functionName\": \"mint\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n\n  await disconnect(config, { connector })\n})\n\ntest('functionName', async () => {\n  await connect(config, { connector })\n\n  const useSimulateWagmiMintExample = createUseSimulateContract({\n    address: address.wagmiMintExample,\n    abi: abi.wagmiMintExample,\n    functionName: 'mint',\n  })\n\n  const { result } = await renderHook(() => useSimulateWagmiMintExample({}))\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": {\n        \"chainId\": 1,\n        \"request\": {\n          \"abi\": [\n            {\n              \"inputs\": [],\n              \"name\": \"mint\",\n              \"outputs\": [],\n              \"stateMutability\": \"nonpayable\",\n              \"type\": \"function\",\n            },\n          ],\n          \"account\": {\n            \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n            \"type\": \"json-rpc\",\n          },\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"args\": undefined,\n          \"chainId\": 1,\n          \"dataSuffix\": undefined,\n          \"functionName\": \"mint\",\n        },\n        \"result\": undefined,\n      },\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"simulateContract\",\n        {\n          \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"chainId\": 1,\n          \"functionName\": \"mint\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/codegen/createUseSimulateContract.ts",
    "content": "import type {\n  Config,\n  ResolvedRegister,\n  SimulateContractErrorType,\n  SimulateContractParameters,\n} from '@wagmi/core'\nimport type {\n  ConfigParameter,\n  QueryParameter,\n  ScopeKeyParameter,\n  UnionExactPartial,\n} from '@wagmi/core/internal'\nimport type {\n  SimulateContractData,\n  SimulateContractQueryFnData,\n} from '@wagmi/core/query'\nimport type {\n  Abi,\n  Address,\n  ContractFunctionArgs,\n  ContractFunctionName,\n} from 'viem'\nimport { useChainId } from '../useChainId.js'\nimport { useConfig } from '../useConfig.js'\nimport {\n  type UseSimulateContractReturnType,\n  useSimulateContract,\n} from '../useSimulateContract.js'\n\ntype stateMutability = 'nonpayable' | 'payable'\n\nexport type CreateUseSimulateContractParameters<\n  abi extends Abi | readonly unknown[],\n  address extends Address | Record<number, Address> | undefined = undefined,\n  functionName extends\n    | ContractFunctionName<abi, stateMutability>\n    | undefined = undefined,\n> = {\n  abi: abi | Abi | readonly unknown[]\n  address?: address | Address | Record<number, Address> | undefined\n  functionName?:\n    | functionName\n    | ContractFunctionName<abi, stateMutability>\n    | undefined\n}\n\nexport type CreateUseSimulateContractReturnType<\n  abi extends Abi | readonly unknown[],\n  address extends Address | Record<number, Address> | undefined,\n  functionName extends ContractFunctionName<abi, stateMutability> | undefined,\n> = <\n  name extends functionName extends ContractFunctionName<abi, stateMutability>\n    ? functionName\n    : ContractFunctionName<abi, stateMutability>,\n  const args extends ContractFunctionArgs<abi, stateMutability, name>,\n  config extends Config = ResolvedRegister['config'],\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  selectData = SimulateContractData<abi, name, args, config, chainId>,\n>(\n  parameters?: {\n    abi?: undefined\n    address?: address extends undefined ? Address : undefined\n    functionName?: functionName extends undefined ? name : undefined\n    chainId?: address extends Record<number, Address>\n      ?\n          | keyof address\n          | (chainId extends keyof address ? chainId : never)\n          | undefined\n      : chainId | number | undefined\n  } & UnionExactPartial<\n    // TODO: Take `abi` and `address` from above and omit from below (currently breaks inference)\n    SimulateContractParameters<abi, name, args, config, chainId>\n  > &\n    ScopeKeyParameter &\n    ConfigParameter<config> &\n    QueryParameter<\n      SimulateContractQueryFnData<abi, name, args, config, chainId>,\n      SimulateContractErrorType,\n      selectData\n      // TODO: Add `SimulateContractQueryKey<abi, name, args, config, chainId>` as 4th type param (currently causes TS2589)\n    >,\n) => UseSimulateContractReturnType<abi, name, args, config, chainId, selectData>\n\nexport function createUseSimulateContract<\n  const abi extends Abi | readonly unknown[],\n  const address extends\n    | Address\n    | Record<number, Address>\n    | undefined = undefined,\n  functionName extends\n    | ContractFunctionName<abi, stateMutability>\n    | undefined = undefined,\n>(\n  props: CreateUseSimulateContractParameters<abi, address, functionName>,\n): CreateUseSimulateContractReturnType<abi, address, functionName> {\n  if (props.address !== undefined && typeof props.address === 'object')\n    return (parameters) => {\n      const config = useConfig(parameters)\n      const configChainId = useChainId({ config })\n      const chainId =\n        (parameters as { chainId?: number })?.chainId ?? configChainId\n      return useSimulateContract({\n        ...(parameters as any),\n        ...(props.functionName ? { functionName: props.functionName } : {}),\n        address: props.address?.[chainId],\n        abi: props.abi,\n      })\n    }\n\n  return (parameters) => {\n    return useSimulateContract({\n      ...(parameters as any),\n      ...(props.address ? { address: props.address } : {}),\n      ...(props.functionName ? { functionName: props.functionName } : {}),\n      abi: props.abi,\n    })\n  }\n}\n"
  },
  {
    "path": "packages/react/src/hooks/codegen/createUseWatchContractEvent.test-d.ts",
    "content": "import { createConfig, http, webSocket } from '@wagmi/core'\nimport { abi, mainnet, optimism } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { createUseWatchContractEvent } from './createUseWatchContractEvent.js'\n\ntest('default', () => {\n  const useWatchErc20Event = createUseWatchContractEvent({\n    abi: abi.erc20,\n  })\n\n  useWatchErc20Event({\n    eventName: 'Transfer',\n    chainId: 123,\n    onLogs(logs) {\n      expectTypeOf(logs[0]!.eventName).toEqualTypeOf<'Transfer'>()\n      expectTypeOf(logs[0]!.args).toEqualTypeOf<{\n        from?: `0x${string}` | undefined\n        to?: `0x${string}` | undefined\n        value?: bigint | undefined\n      }>()\n    },\n  })\n})\n\ntest('multichain address', () => {\n  const useWatchErc20Event = createUseWatchContractEvent({\n    abi: abi.erc20,\n    address: {\n      [mainnet.id]: '0x',\n      [optimism.id]: '0x',\n    },\n  })\n\n  useWatchErc20Event({\n    eventName: 'Transfer',\n    chainId: mainnet.id,\n    // ^?\n  })\n\n  useWatchErc20Event({\n    eventName: 'Transfer',\n    // @ts-expect-error chain id must match address keys\n    chainId: 420,\n  })\n\n  useWatchErc20Event({\n    eventName: 'Transfer',\n    // @ts-expect-error chain id must match address keys\n    address: '0x',\n  })\n})\n\ntest('differing transports', () => {\n  const useWatchErc20Event = createUseWatchContractEvent({\n    abi: abi.erc20,\n  })\n\n  const config = createConfig({\n    chains: [mainnet, optimism],\n    transports: {\n      [mainnet.id]: http(),\n      [optimism.id]: webSocket(),\n    },\n  })\n\n  useWatchErc20Event({\n    config,\n    poll: false,\n    address: '0x',\n    onLogs() {},\n  })\n\n  useWatchErc20Event({\n    config,\n    chainId: mainnet.id,\n    poll: true,\n    address: '0x',\n    onLogs() {},\n  })\n  useWatchErc20Event({\n    config,\n    chainId: mainnet.id,\n    // @ts-expect-error poll required since http transport\n    poll: false,\n    address: '0x',\n    onLogs() {},\n  })\n\n  useWatchErc20Event({\n    config,\n    chainId: optimism.id,\n    poll: true,\n    address: '0x',\n    onLogs() {},\n  })\n  useWatchErc20Event({\n    config,\n    chainId: optimism.id,\n    poll: false,\n    address: '0x',\n    onLogs() {},\n  })\n})\n\ntest('eventName', () => {\n  const useWatchErc20Event = createUseWatchContractEvent({\n    abi: abi.erc20,\n    eventName: 'Transfer',\n  })\n\n  useWatchErc20Event({\n    chainId: 123,\n    onLogs(logs) {\n      expectTypeOf(logs[0]!.eventName).toEqualTypeOf<'Transfer'>()\n      expectTypeOf(logs[0]!.args).toEqualTypeOf<{\n        from?: `0x${string}` | undefined\n        to?: `0x${string}` | undefined\n        value?: bigint | undefined\n      }>()\n    },\n  })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/codegen/createUseWatchContractEvent.test.ts",
    "content": "import { abi, address, chain, wait } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport type { WatchEventOnLogsParameter } from 'viem'\nimport { test } from 'vitest'\n\nimport { createUseWatchContractEvent } from './createUseWatchContractEvent.js'\n\ntest('default', async () => {\n  const useWatchErc20Event = createUseWatchContractEvent({\n    address: address.usdc,\n    abi: abi.wagmiMintExample,\n  })\n\n  let logs: WatchEventOnLogsParameter = []\n  renderHook(() =>\n    useWatchErc20Event({\n      eventName: 'Transfer',\n      onLogs(next) {\n        logs = logs.concat(next)\n      },\n    }),\n  )\n  await wait(500)\n})\n\ntest('multichain', async () => {\n  const useWatchErc20Event = createUseWatchContractEvent({\n    address: {\n      [chain.mainnet.id]: address.usdc,\n      [chain.mainnet2.id]: address.usdc,\n    },\n    abi: abi.wagmiMintExample,\n  })\n\n  let logs: WatchEventOnLogsParameter = []\n  renderHook(() =>\n    useWatchErc20Event({\n      eventName: 'Transfer',\n      chainId: chain.mainnet2.id,\n      onLogs(next) {\n        logs = logs.concat(next)\n      },\n    }),\n  )\n  await wait(500)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/codegen/createUseWatchContractEvent.ts",
    "content": "import type {\n  Config,\n  ResolvedRegister,\n  WatchContractEventParameters,\n} from '@wagmi/core'\nimport type {\n  ConfigParameter,\n  EnabledParameter,\n  UnionCompute,\n  UnionExactPartial,\n  UnionStrictOmit,\n} from '@wagmi/core/internal'\nimport type { Abi, Address, ContractEventName } from 'viem'\nimport { useChainId } from '../useChainId.js'\nimport { useConfig } from '../useConfig.js'\nimport { useWatchContractEvent } from '../useWatchContractEvent.js'\n\nexport type CreateUseWatchContractEventParameters<\n  abi extends Abi | readonly unknown[],\n  address extends Address | Record<number, Address> | undefined = undefined,\n  eventName extends ContractEventName<abi> | undefined = undefined,\n> = {\n  abi: abi | Abi | readonly unknown[]\n  address?: address | Address | Record<number, Address> | undefined\n  eventName?: eventName | ContractEventName<abi> | undefined\n}\n\nexport type CreateUseWatchContractEventReturnType<\n  abi extends Abi | readonly unknown[],\n  address extends Address | Record<number, Address> | undefined,\n  eventName extends ContractEventName<abi> | undefined,\n  ///\n  omittedProperties extends 'abi' | 'address' | 'chainId' | 'eventName' =\n    | 'abi'\n    | (address extends undefined ? never : 'address')\n    | (address extends Record<number, Address> ? 'chainId' : never)\n    | (eventName extends undefined ? never : 'eventName'),\n> = <\n  name extends eventName extends ContractEventName<abi>\n    ? eventName\n    : ContractEventName<abi>,\n  strict extends boolean | undefined = undefined,\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n>(\n  parameters?: UnionCompute<\n    UnionExactPartial<\n      UnionStrictOmit<\n        WatchContractEventParameters<abi, name, strict, config, chainId>,\n        omittedProperties\n      >\n    > &\n      ConfigParameter<config> &\n      EnabledParameter\n  > &\n    (address extends Record<number, Address>\n      ? { chainId?: keyof address | undefined }\n      : unknown),\n) => void\n\nexport function createUseWatchContractEvent<\n  const abi extends Abi | readonly unknown[],\n  const address extends\n    | Address\n    | Record<number, Address>\n    | undefined = undefined,\n  eventName extends ContractEventName<abi> | undefined = undefined,\n>(\n  props: CreateUseWatchContractEventParameters<abi, address, eventName>,\n): CreateUseWatchContractEventReturnType<abi, address, eventName> {\n  if (props.address !== undefined && typeof props.address === 'object')\n    return (parameters) => {\n      const config = useConfig(parameters)\n      const configChainId = useChainId({ config })\n      const chainId =\n        (parameters as { chainId?: number })?.chainId ?? configChainId\n      return useWatchContractEvent({\n        ...(parameters as any),\n        ...(props.eventName ? { eventName: props.eventName } : {}),\n        address: props.address?.[chainId],\n        abi: props.abi,\n      })\n    }\n\n  return (parameters) => {\n    return useWatchContractEvent({\n      ...(parameters as any),\n      ...(props.address ? { address: props.address } : {}),\n      ...(props.eventName ? { eventName: props.eventName } : {}),\n      abi: props.abi,\n    })\n  }\n}\n"
  },
  {
    "path": "packages/react/src/hooks/codegen/createUseWriteContract.test-d.ts",
    "content": "import { abi } from '@wagmi/test'\nimport type { Address, Hash } from 'viem'\nimport { mainnet, optimism } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useSimulateContract } from '../useSimulateContract.js'\nimport { createUseWriteContract } from './createUseWriteContract.js'\n\nconst contextValue = { foo: 'bar' } as const\n\ntest('default', () => {\n  const useWriteErc20 = createUseWriteContract({\n    abi: abi.erc20,\n  })\n\n  const { writeContract } = useWriteErc20()\n  writeContract({\n    address: '0x',\n    functionName: 'transfer',\n    args: ['0x', 123n],\n  })\n})\n\ntest('context', () => {\n  const useWriteErc20 = createUseWriteContract({\n    abi: abi.erc20,\n  })\n\n  const { writeContract } = useWriteErc20({\n    mutation: {\n      onMutate() {\n        return contextValue\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<Hash>()\n        expectTypeOf(variables.functionName).toEqualTypeOf<string>()\n        expectTypeOf(variables.args).toEqualTypeOf<\n          readonly unknown[] | undefined\n        >()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n    },\n  })\n\n  writeContract(\n    {\n      address: '0x',\n      functionName: 'transfer',\n      args: ['0x', 123n],\n    },\n    {\n      onSuccess(data, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<Hash>()\n        expectTypeOf(variables.functionName).toEqualTypeOf<'transfer'>()\n        expectTypeOf(variables.args).toEqualTypeOf<readonly [Address, bigint]>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n    },\n  )\n})\n\ntest('multichain address', () => {\n  const useWriteErc20 = createUseWriteContract({\n    abi: abi.erc20,\n    address: {\n      [mainnet.id]: '0x',\n      [optimism.id]: '0x',\n    },\n  })\n\n  const { writeContract } = useWriteErc20()\n  writeContract({\n    functionName: 'transfer',\n    args: ['0x', 123n],\n    chainId: mainnet.id,\n    // ^?\n  })\n\n  writeContract({\n    functionName: 'transfer',\n    args: ['0x', 123n],\n    // @ts-expect-error chain id must match address keys\n    chainId: 420,\n  })\n\n  writeContract({\n    // @ts-expect-error address not allowed\n    address: '0x',\n    functionName: 'transfer',\n    args: ['0x', 123n],\n  })\n})\n\ntest('overloads', () => {\n  const useWriteOverloads = createUseWriteContract({\n    abi: abi.writeOverloads,\n    address: {\n      [mainnet.id]: '0x',\n      [optimism.id]: '0x',\n    },\n  })\n\n  const { writeContract } = useWriteOverloads()\n  writeContract({\n    functionName: 'foo',\n    args: [],\n  })\n\n  writeContract({\n    functionName: 'foo',\n    args: ['0x'],\n  })\n\n  writeContract({\n    functionName: 'foo',\n    args: ['0x', '0x'],\n  })\n})\n\ntest('useSimulateContract', () => {\n  const useWriteErc20 = createUseWriteContract({\n    abi: abi.erc20,\n    address: {\n      [mainnet.id]: '0x',\n      [optimism.id]: '0x',\n    },\n  })\n\n  const { data } = useSimulateContract({\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    chainId: 1,\n  })\n  const { writeContract } = useWriteErc20()\n\n  const request = data?.request\n  if (request) writeContract(request)\n})\n\ntest('functionName', () => {\n  const useWriteErc20 = createUseWriteContract({\n    abi: abi.erc20,\n    functionName: 'transfer',\n  })\n\n  const { writeContract } = useWriteErc20()\n  writeContract({\n    address: '0x',\n    args: ['0x', 123n],\n  })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/codegen/createUseWriteContract.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { abi, address, chain, config } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\n\nimport { createUseWriteContract } from './createUseWriteContract.js'\n\ntest('default', () => {\n  const useWriteErc20 = createUseWriteContract({\n    abi: abi.erc20,\n  })\n\n  renderHook(() => useWriteErc20())\n})\n\nconst connector = config.connectors[0]!\n\ntest('multichain', async () => {\n  const useWriteWagmiMintExample = createUseWriteContract({\n    address: {\n      [chain.mainnet.id]: address.wagmiMintExample,\n      [chain.mainnet2.id]: address.wagmiMintExample,\n    },\n    abi: abi.wagmiMintExample,\n  })\n\n  await connect(config, { connector })\n\n  const { result } = await renderHook(() => useWriteWagmiMintExample())\n\n  result.current.writeContract({ functionName: 'mint' })\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  console.log(result.current.data)\n  expect(result.current.data).toBeDefined()\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/codegen/createUseWriteContract.ts",
    "content": "import type { MutateOptions } from '@tanstack/react-query'\nimport type {\n  Config,\n  ResolvedRegister,\n  WriteContractErrorType,\n} from '@wagmi/core'\nimport type {\n  ChainIdParameter,\n  Compute,\n  ConnectorParameter,\n  SelectChains,\n  UnionCompute,\n  UnionStrictOmit,\n} from '@wagmi/core/internal'\nimport type {\n  WriteContractData,\n  WriteContractVariables,\n} from '@wagmi/core/query'\nimport { useCallback } from 'react'\nimport type {\n  Abi,\n  Account,\n  Address,\n  Chain,\n  ContractFunctionArgs,\n  ContractFunctionName,\n} from 'viem'\nimport type { WriteContractParameters as viem_WriteContractParameters } from 'viem/actions'\n\nimport { useChainId } from '../useChainId.js'\nimport { useConfig } from '../useConfig.js'\nimport {\n  type UseWriteContractParameters,\n  useWriteContract,\n  type UseWriteContractReturnType as wagmi_UseWriteContractReturnType,\n} from '../useWriteContract.js'\n\ntype stateMutability = 'nonpayable' | 'payable'\n\nexport type CreateUseWriteContractParameters<\n  abi extends Abi | readonly unknown[],\n  address extends Address | Record<number, Address> | undefined = undefined,\n  functionName extends\n    | ContractFunctionName<abi, stateMutability>\n    | undefined = undefined,\n> = {\n  abi: abi | Abi | readonly unknown[]\n  address?: address | Address | Record<number, Address> | undefined\n  functionName?:\n    | functionName\n    | ContractFunctionName<abi, stateMutability>\n    | undefined\n}\n\nexport type CreateUseWriteContractReturnType<\n  abi extends Abi | readonly unknown[],\n  address extends Address | Record<number, Address> | undefined,\n  functionName extends ContractFunctionName<abi, stateMutability> | undefined,\n> = <config extends Config = ResolvedRegister['config'], context = unknown>(\n  parameters?: UseWriteContractParameters<config, context>,\n) => Compute<\n  Omit<\n    wagmi_UseWriteContractReturnType<config, context>,\n    'writeContract' | 'writeContractAsync'\n  > & {\n    mutate: <\n      const abi2 extends abi,\n      name extends functionName extends ContractFunctionName<\n        abi,\n        stateMutability\n      >\n        ? functionName\n        : ContractFunctionName<abi, stateMutability>,\n      args extends ContractFunctionArgs<abi2, stateMutability, name>,\n      chainId extends config['chains'][number]['id'],\n    >(\n      variables: Variables<\n        abi2,\n        functionName,\n        name,\n        args,\n        config,\n        chainId,\n        address\n      >,\n      options?:\n        | MutateOptions<\n            WriteContractData,\n            WriteContractErrorType,\n            WriteContractVariables<\n              abi2,\n              name,\n              args,\n              config,\n              chainId,\n              // use `functionName` to make sure it's not union of all possible function names\n              name\n            >,\n            context\n          >\n        | undefined,\n    ) => void\n    mutateAsync: <\n      const abi2 extends abi,\n      name extends functionName extends ContractFunctionName<\n        abi,\n        stateMutability\n      >\n        ? functionName\n        : ContractFunctionName<abi, stateMutability>,\n      args extends ContractFunctionArgs<abi2, stateMutability, name>,\n      chainId extends config['chains'][number]['id'],\n    >(\n      variables: Variables<\n        abi2,\n        functionName,\n        name,\n        args,\n        config,\n        chainId,\n        address\n      >,\n      options?:\n        | MutateOptions<\n            WriteContractData,\n            WriteContractErrorType,\n            WriteContractVariables<\n              abi2,\n              name,\n              args,\n              config,\n              chainId,\n              // use `functionName` to make sure it's not union of all possible function names\n              name\n            >,\n            context\n          >\n        | undefined,\n    ) => Promise<WriteContractData>\n    /** @deprecated use `mutate` instead */\n    writeContract: <\n      const abi2 extends abi,\n      name extends functionName extends ContractFunctionName<\n        abi,\n        stateMutability\n      >\n        ? functionName\n        : ContractFunctionName<abi, stateMutability>,\n      args extends ContractFunctionArgs<abi2, stateMutability, name>,\n      chainId extends config['chains'][number]['id'],\n    >(\n      variables: Variables<\n        abi2,\n        functionName,\n        name,\n        args,\n        config,\n        chainId,\n        address\n      >,\n      options?:\n        | MutateOptions<\n            WriteContractData,\n            WriteContractErrorType,\n            WriteContractVariables<\n              abi2,\n              name,\n              args,\n              config,\n              chainId,\n              // use `functionName` to make sure it's not union of all possible function names\n              name\n            >,\n            context\n          >\n        | undefined,\n    ) => void\n    /** @deprecated use `mutateAsync` instead */\n    writeContractAsync: <\n      const abi2 extends abi,\n      name extends functionName extends ContractFunctionName<\n        abi,\n        stateMutability\n      >\n        ? functionName\n        : ContractFunctionName<abi, stateMutability>,\n      args extends ContractFunctionArgs<abi2, stateMutability, name>,\n      chainId extends config['chains'][number]['id'],\n    >(\n      variables: Variables<\n        abi2,\n        functionName,\n        name,\n        args,\n        config,\n        chainId,\n        address\n      >,\n      options?:\n        | MutateOptions<\n            WriteContractData,\n            WriteContractErrorType,\n            WriteContractVariables<\n              abi2,\n              name,\n              args,\n              config,\n              chainId,\n              // use `functionName` to make sure it's not union of all possible function names\n              name\n            >,\n            context\n          >\n        | undefined,\n    ) => Promise<WriteContractData>\n  }\n>\n\nexport function createUseWriteContract<\n  const abi extends Abi | readonly unknown[],\n  const address extends\n    | Address\n    | Record<number, Address>\n    | undefined = undefined,\n  functionName extends\n    | ContractFunctionName<abi, stateMutability>\n    | undefined = undefined,\n>(\n  props: CreateUseWriteContractParameters<abi, address, functionName>,\n): CreateUseWriteContractReturnType<abi, address, functionName> {\n  if (props.address !== undefined && typeof props.address === 'object')\n    return (parameters) => {\n      const config = useConfig(parameters)\n      const result = useWriteContract(parameters)\n      const configChainId = useChainId({ config })\n      type Args = Parameters<wagmi_UseWriteContractReturnType['writeContract']>\n      const mutate = useCallback(\n        (...args: Args) => {\n          const chainId = (() => {\n            if (args[0].chainId) return args[0].chainId\n            return configChainId\n          })()\n          const variables = {\n            ...(args[0] as any),\n            address: chainId ? props.address?.[chainId] : undefined,\n            ...(props.functionName ? { functionName: props.functionName } : {}),\n            abi: props.abi,\n          }\n          result.writeContract(variables, args[1] as any)\n        },\n        [props, configChainId, result.writeContract],\n      )\n      const mutateAsync = useCallback(\n        (...args: Args) => {\n          const chainId = (() => {\n            if (args[0].chainId) return args[0].chainId\n            return configChainId\n          })()\n          const variables = {\n            ...(args[0] as any),\n            address: chainId ? props.address?.[chainId] : undefined,\n            ...(props.functionName ? { functionName: props.functionName } : {}),\n            abi: props.abi,\n          }\n          return result.writeContractAsync(variables, args[1] as any)\n        },\n        [props, configChainId, result.writeContractAsync],\n      )\n      return {\n        ...(result as any),\n        mutate,\n        mutateAsync,\n        writeContract: mutate,\n        writeContractAsync: mutateAsync,\n      }\n    }\n\n  return (parameters) => {\n    const result = useWriteContract(parameters)\n    type Args = Parameters<wagmi_UseWriteContractReturnType['writeContract']>\n    const mutate = useCallback(\n      (...args: Args) => {\n        const variables = {\n          ...(args[0] as any),\n          ...(props.address ? { address: props.address } : {}),\n          ...(props.functionName ? { functionName: props.functionName } : {}),\n          abi: props.abi,\n        }\n        result.mutate(variables, args[1] as any)\n      },\n      [props, result.mutate],\n    )\n    const mutateAsync = useCallback(\n      (...args: Args) => {\n        const variables = {\n          ...(args[0] as any),\n          ...(props.address ? { address: props.address } : {}),\n          ...(props.functionName ? { functionName: props.functionName } : {}),\n          abi: props.abi,\n        }\n        return result.mutateAsync(variables, args[1] as any)\n      },\n      [props, result.mutateAsync],\n    )\n    return {\n      ...(result as any),\n      mutate,\n      mutateAsync,\n      writeContract: mutate,\n      writeContractAsync: mutateAsync,\n    }\n  }\n}\n\ntype Variables<\n  abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, stateMutability> | undefined,\n  name extends ContractFunctionName<abi, stateMutability>,\n  args extends ContractFunctionArgs<abi, stateMutability, name>,\n  config extends Config,\n  chainId extends config['chains'][number]['id'],\n  address extends Address | Record<number, Address> | undefined,\n  ///\n  allFunctionNames = ContractFunctionName<abi, stateMutability>,\n  chains extends readonly Chain[] = SelectChains<config, chainId>,\n  omittedProperties extends 'abi' | 'address' | 'functionName' =\n    | 'abi'\n    | (address extends undefined ? never : 'address')\n    | (functionName extends undefined ? never : 'functionName'),\n> = UnionCompute<\n  {\n    [key in keyof chains]: UnionStrictOmit<\n      viem_WriteContractParameters<\n        abi,\n        name,\n        args,\n        chains[key],\n        Account,\n        chains[key],\n        allFunctionNames\n      >,\n      omittedProperties | 'chain'\n    >\n  }[number] &\n    (address extends Record<number, Address>\n      ? {\n          chainId?:\n            | keyof address\n            | (chainId extends keyof address ? chainId : never)\n            | undefined\n        }\n      : Compute<ChainIdParameter<config, chainId>>) &\n    ConnectorParameter\n>\n"
  },
  {
    "path": "packages/react/src/hooks/useBalance.test-d.ts",
    "content": "import { expectTypeOf, test } from 'vitest'\n\nimport { useBalance } from './useBalance.js'\n\ntest('select data', () => {\n  const result = useBalance({\n    query: {\n      select(data) {\n        return data?.value\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<bigint | undefined>()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useBalance.test.ts",
    "content": "import { accounts, chain, testClient, wait } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { type Address, parseEther } from 'viem'\nimport { beforeEach, expect, test, vi } from 'vitest'\n\nimport { useBalance } from './useBalance.js'\n\nconst address = accounts[0]\n\nbeforeEach(async () => {\n  await testClient.mainnet.setBalance({ address, value: parseEther('10000') })\n  await testClient.mainnet.mine({ blocks: 1 })\n  await testClient.mainnet2.setBalance({ address, value: parseEther('69') })\n  await testClient.mainnet2.mine({ blocks: 1 })\n})\n\ntest('default', async () => {\n  const { result } = await renderHook(() => useBalance({ address }))\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, ...rest } = result.current\n  expect(data).toMatchObject(\n    expect.objectContaining({\n      decimals: expect.any(Number),\n      symbol: expect.any(String),\n      value: expect.any(BigInt),\n    }),\n  )\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"balance\",\n        {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: chainId', async () => {\n  const { result } = await renderHook(() =>\n    useBalance({ address, chainId: chain.mainnet2.id }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": {\n        \"decimals\": 18,\n        \"symbol\": \"WAG\",\n        \"value\": 69000000000000000000n,\n      },\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"balance\",\n        {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"chainId\": 456,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('behavior: address: undefined -> defined', async () => {\n  let address: Address | undefined\n\n  const { result, rerender } = await renderHook(() => useBalance({ address }))\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": undefined,\n      \"dataUpdatedAt\": 0,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": false,\n      \"isFetchedAfterMount\": false,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": true,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": false,\n      \"isSuccess\": false,\n      \"queryKey\": [\n        \"balance\",\n        {\n          \"address\": undefined,\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"pending\",\n    }\n  `)\n\n  address = accounts[0]\n  rerender()\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": {\n        \"decimals\": 18,\n        \"symbol\": \"ETH\",\n        \"value\": 10000000000000000000000n,\n      },\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"balance\",\n        {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('behavior: disabled when properties missing', async () => {\n  const { result } = await renderHook(() => useBalance())\n\n  await wait(100)\n  await vi.waitFor(() => expect(result.current.isPending).toBeTruthy())\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useBalance.ts",
    "content": "'use client'\nimport type { Config, GetBalanceErrorType, ResolvedRegister } from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetBalanceData,\n  type GetBalanceOptions,\n  getBalanceQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseBalanceParameters<\n  config extends Config = Config,\n  selectData = GetBalanceData,\n> = Compute<GetBalanceOptions<config, selectData> & ConfigParameter<config>>\n\nexport type UseBalanceReturnType<selectData = GetBalanceData> =\n  UseQueryReturnType<selectData, GetBalanceErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useBalance */\nexport function useBalance<\n  config extends Config = ResolvedRegister['config'],\n  selectData = GetBalanceData,\n>(\n  parameters: UseBalanceParameters<config, selectData> = {},\n): UseBalanceReturnType<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = getBalanceQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options)\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useBlobBaseFee.test.ts",
    "content": "import { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useBlobBaseFee } from './useBlobBaseFee.js'\n\ntest('default', async () => {\n  const { result } = await renderHook(() => useBlobBaseFee())\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current.data).toBeTypeOf('bigint')\n  expect(result.current.queryKey[0]).toBe('blobBaseFee')\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useBlobBaseFee.ts",
    "content": "'use client'\nimport type {\n  Config,\n  GetBlobBaseFeeErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetBlobBaseFeeData,\n  type GetBlobBaseFeeOptions,\n  getBlobBaseFeeQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseBlobBaseFeeParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetBlobBaseFeeData,\n> = Compute<\n  GetBlobBaseFeeOptions<config, chainId, selectData> & ConfigParameter<config>\n>\n\nexport type UseBlobBaseFeeReturnType<selectData = GetBlobBaseFeeData> =\n  UseQueryReturnType<selectData, GetBlobBaseFeeErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useBlobBaseFee */\nexport function useBlobBaseFee<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetBlobBaseFeeData,\n>(\n  parameters: UseBlobBaseFeeParameters<config, chainId, selectData> = {},\n): UseBlobBaseFeeReturnType<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = getBlobBaseFeeQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options)\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useBlock.test-d.ts",
    "content": "import { createConfig, http, webSocket } from '@wagmi/core'\nimport { mainnet, optimism } from '@wagmi/core/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useBlock } from './useBlock.js'\n\ntest('select data', () => {\n  const result = useBlock({\n    query: {\n      select(data) {\n        return data?.number\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<bigint | undefined>()\n})\n\ntest('differing transports', () => {\n  const config = createConfig({\n    chains: [mainnet, optimism],\n    transports: {\n      [mainnet.id]: http(),\n      [optimism.id]: webSocket(),\n    },\n  })\n\n  useBlock({\n    config,\n    watch: {\n      poll: false,\n    },\n  })\n\n  useBlock({\n    config,\n    chainId: mainnet.id,\n    watch: {\n      poll: true,\n    },\n  })\n  useBlock({\n    config,\n    chainId: mainnet.id,\n    watch: {\n      // @ts-expect-error\n      poll: false,\n    },\n  })\n\n  useBlock({\n    config,\n    chainId: optimism.id,\n    watch: {\n      poll: true,\n    },\n  })\n  useBlock({\n    config,\n    chainId: optimism.id,\n    watch: {\n      poll: false,\n    },\n  })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useBlock.test.ts",
    "content": "import { testClient } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useBlock } from './useBlock.js'\n\ntest('mounts', async () => {\n  const { result } = await renderHook(() => useBlock())\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, ...rest } = result.current\n  expect(data).toBeDefined()\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"block\",\n        {\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: watch', async () => {\n  await testClient.mainnet.restart()\n\n  const { result } = await renderHook(() => useBlock({ watch: true }))\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n  const block = result.current.data!\n  expect(block).toBeDefined()\n\n  await testClient.mainnet.mine({ blocks: 1 })\n  await vi.waitFor(() => {\n    expect(result.current.data?.number).toEqual(block.number + 1n)\n  })\n\n  await testClient.mainnet.mine({ blocks: 1 })\n  await vi.waitFor(() => {\n    expect(result.current.data?.number).toEqual(block.number + 2n)\n  })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useBlock.ts",
    "content": "'use client'\nimport { useQueryClient } from '@tanstack/react-query'\nimport type { Config, GetBlockErrorType, ResolvedRegister } from '@wagmi/core'\nimport type {\n  Compute,\n  ConfigParameter,\n  UnionCompute,\n  UnionStrictOmit,\n} from '@wagmi/core/internal'\nimport {\n  type GetBlockData,\n  type GetBlockOptions,\n  getBlockQueryOptions,\n} from '@wagmi/core/query'\nimport type { BlockTag } from 'viem'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\nimport {\n  type UseWatchBlocksParameters,\n  useWatchBlocks,\n} from './useWatchBlocks.js'\n\nexport type UseBlockParameters<\n  includeTransactions extends boolean = false,\n  blockTag extends BlockTag = 'latest',\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetBlockData<includeTransactions, blockTag, config, chainId>,\n> = Compute<\n  GetBlockOptions<includeTransactions, blockTag, config, chainId, selectData> &\n    ConfigParameter<config> & {\n      watch?:\n        | boolean\n        | UnionCompute<\n            UnionStrictOmit<\n              UseWatchBlocksParameters<\n                includeTransactions,\n                blockTag,\n                config,\n                chainId\n              >,\n              'chainId' | 'config' | 'onBlock' | 'onError'\n            >\n          >\n        | undefined\n    }\n>\n\nexport type UseBlockReturnType<\n  includeTransactions extends boolean = false,\n  blockTag extends BlockTag = 'latest',\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetBlockData<includeTransactions, blockTag, config, chainId>,\n> = UseQueryReturnType<selectData, GetBlockErrorType>\n\n/** https://wagmi.sh/react/hooks/useBlock */\nexport function useBlock<\n  includeTransactions extends boolean = false,\n  blockTag extends BlockTag = 'latest',\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetBlockData<includeTransactions, blockTag, config, chainId>,\n>(\n  parameters: UseBlockParameters<\n    includeTransactions,\n    blockTag,\n    config,\n    chainId,\n    selectData\n  > = {},\n): UseBlockReturnType<\n  includeTransactions,\n  blockTag,\n  config,\n  chainId,\n  selectData\n> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = getBlockQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  const queryClient = useQueryClient()\n  useWatchBlocks({\n    ...({\n      config: parameters.config,\n      chainId: parameters.chainId!,\n      ...(typeof parameters.watch === 'object' ? parameters.watch : {}),\n    } as UseWatchBlocksParameters),\n    enabled: Boolean(\n      (options.enabled ?? true) &&\n        (typeof parameters.watch === 'object'\n          ? parameters.watch.enabled\n          : parameters.watch),\n    ),\n    onBlock(block) {\n      queryClient.setQueryData(options.queryKey, block)\n    },\n  })\n  return useQuery(options) as any\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useBlockNumber.test-d.ts",
    "content": "import { createConfig, http, webSocket } from '@wagmi/core'\nimport { mainnet, optimism } from '@wagmi/core/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useBlockNumber } from './useBlockNumber.js'\n\ntest('select data', () => {\n  const result = useBlockNumber({\n    query: {\n      select(data) {\n        expectTypeOf(data).toEqualTypeOf<bigint>()\n        return data?.toString()\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<string | undefined>()\n})\n\ntest('differing transports', () => {\n  const config = createConfig({\n    chains: [mainnet, optimism],\n    transports: {\n      [mainnet.id]: http(),\n      [optimism.id]: webSocket(),\n    },\n  })\n\n  useBlockNumber({\n    config,\n    watch: {\n      poll: false,\n    },\n  })\n\n  useBlockNumber({\n    config,\n    chainId: mainnet.id,\n    watch: {\n      poll: true,\n    },\n  })\n  useBlockNumber({\n    config,\n    chainId: mainnet.id,\n    watch: {\n      // @ts-expect-error\n      poll: false,\n    },\n  })\n\n  useBlockNumber({\n    config,\n    chainId: optimism.id,\n    watch: {\n      poll: true,\n    },\n  })\n  useBlockNumber({\n    config,\n    chainId: optimism.id,\n    watch: {\n      poll: false,\n    },\n  })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useBlockNumber.test.ts",
    "content": "import { testClient } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useBlockNumber } from './useBlockNumber.js'\n\ntest('mounts', async () => {\n  await testClient.mainnet.resetFork()\n\n  const { result } = await renderHook(() => useBlockNumber())\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": 23535880n,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"blockNumber\",\n        {\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: watch', async () => {\n  await testClient.mainnet.restart()\n\n  const { result } = await renderHook(() => useBlockNumber({ watch: true }))\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n  const blockNumber = result.current.data!\n  expect(result.current.data).toBeTypeOf('bigint')\n\n  await testClient.mainnet.mine({ blocks: 1 })\n  await vi.waitFor(() => {\n    expect(result.current.data).toEqual(blockNumber + 1n)\n  })\n\n  await testClient.mainnet.mine({ blocks: 1 })\n  await vi.waitFor(() => {\n    expect(result.current.data).toEqual(blockNumber + 2n)\n  })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useBlockNumber.ts",
    "content": "'use client'\nimport { useQueryClient } from '@tanstack/react-query'\nimport type {\n  Config,\n  GetBlockNumberErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type {\n  Compute,\n  ConfigParameter,\n  UnionCompute,\n  UnionStrictOmit,\n} from '@wagmi/core/internal'\nimport {\n  type GetBlockNumberData,\n  type GetBlockNumberOptions,\n  getBlockNumberQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\nimport {\n  type UseWatchBlockNumberParameters,\n  useWatchBlockNumber,\n} from './useWatchBlockNumber.js'\n\nexport type UseBlockNumberParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetBlockNumberData,\n> = Compute<\n  GetBlockNumberOptions<config, chainId, selectData> &\n    ConfigParameter<config> & {\n      watch?:\n        | boolean\n        | UnionCompute<\n            UnionStrictOmit<\n              UseWatchBlockNumberParameters<config, chainId>,\n              'chainId' | 'config' | 'onBlockNumber' | 'onError'\n            >\n          >\n        | undefined\n    }\n>\n\nexport type UseBlockNumberReturnType<selectData = GetBlockNumberData> =\n  UseQueryReturnType<selectData, GetBlockNumberErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useBlockNumber */\nexport function useBlockNumber<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetBlockNumberData,\n>(\n  parameters: UseBlockNumberParameters<config, chainId, selectData> = {},\n): UseBlockNumberReturnType<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = getBlockNumberQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  const queryClient = useQueryClient()\n  useWatchBlockNumber({\n    ...({\n      config: parameters.config,\n      chainId: parameters.chainId,\n      ...(typeof parameters.watch === 'object' ? parameters.watch : {}),\n    } as UseWatchBlockNumberParameters),\n    enabled: Boolean(\n      (options.enabled ?? true) &&\n        (typeof parameters.watch === 'object'\n          ? parameters.watch.enabled\n          : parameters.watch),\n    ),\n    onBlockNumber(blockNumber) {\n      queryClient.setQueryData(options.queryKey, blockNumber)\n    },\n  })\n  return useQuery(options)\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useBlockTransactionCount.test-d.ts",
    "content": "import { expectTypeOf, test } from 'vitest'\n\nimport { useBlockTransactionCount } from './useBlockTransactionCount.js'\n\ntest('select data', () => {\n  const result = useBlockTransactionCount({\n    query: {\n      select(data) {\n        return data\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<number | undefined>()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useBlockTransactionCount.test.ts",
    "content": "import { chain } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useBlockTransactionCount } from './useBlockTransactionCount.js'\n\ntest('default', async () => {\n  const { result } = await renderHook(() => useBlockTransactionCount({}))\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, ...rest } = result.current\n  expect(data).toBeTypeOf('number')\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"blockTransactionCount\",\n        {\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: chainId', async () => {\n  const { result } = await renderHook(() =>\n    useBlockTransactionCount({ chainId: chain.mainnet2.id }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, ...rest } = result.current\n  expect(data).toBeTypeOf('number')\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"blockTransactionCount\",\n        {\n          \"chainId\": 456,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: blockNumber', async () => {\n  const { result } = await renderHook(() =>\n    useBlockTransactionCount({ blockNumber: 13677382n }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, ...rest } = result.current\n  expect(data).toBeTypeOf('number')\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"blockTransactionCount\",\n        {\n          \"blockNumber\": 13677382n,\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: blockHash', async () => {\n  const { result } = await renderHook(() =>\n    useBlockTransactionCount({\n      blockHash:\n        '0x6201f37a245850d1f11e4be3ac45bc51bd9d43ee4a127192cad550f351cfa575',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, ...rest } = result.current\n  expect(data).toBeTypeOf('number')\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"blockTransactionCount\",\n        {\n          \"blockHash\": \"0x6201f37a245850d1f11e4be3ac45bc51bd9d43ee4a127192cad550f351cfa575\",\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: blockTag', async () => {\n  const { result } = await renderHook(() =>\n    useBlockTransactionCount({\n      blockTag: 'safe',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, ...rest } = result.current\n  expect(data).toBeTypeOf('number')\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"blockTransactionCount\",\n        {\n          \"blockTag\": \"safe\",\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useBlockTransactionCount.ts",
    "content": "'use client'\nimport type {\n  Config,\n  GetBlockTransactionCountErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { ConfigParameter, UnionCompute } from '@wagmi/core/internal'\nimport {\n  type GetBlockTransactionCountData,\n  type GetBlockTransactionCountOptions,\n  getBlockTransactionCountQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseBlockTransactionCountParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetBlockTransactionCountData,\n> = UnionCompute<\n  GetBlockTransactionCountOptions<config, chainId, selectData> &\n    ConfigParameter<config>\n>\n\nexport type UseBlockTransactionCountReturnType<\n  selectData = GetBlockTransactionCountData,\n> = UseQueryReturnType<selectData, GetBlockTransactionCountErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useBlockTransactionCount */\nexport function useBlockTransactionCount<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetBlockTransactionCountData,\n>(\n  parameters: UseBlockTransactionCountParameters<\n    config,\n    chainId,\n    selectData\n  > = {},\n): UseBlockTransactionCountReturnType<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = getBlockTransactionCountQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options)\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useBytecode.test-d.ts",
    "content": "import type { Hex } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport { useBytecode } from './useBytecode.js'\n\ntest('select data', () => {\n  const result = useBytecode({\n    query: {\n      select(data) {\n        return data\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<Hex | undefined>()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useBytecode.test.ts",
    "content": "import { address, chain, wait } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport type { Address } from 'viem'\nimport { expect, test, vi } from 'vitest'\nimport { useBytecode } from './useBytecode.js'\n\ntest('default', async () => {\n  const { result } = await renderHook(() =>\n    useBytecode({\n      address: address.wagmiMintExample,\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, ...rest } = result.current\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"getBytecode\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n  expect(data).toMatch(/^0x.*/)\n})\n\ntest('parameters: blockNumber', async () => {\n  const { result } = await renderHook(() =>\n    useBytecode({\n      address: address.wagmiMintExample,\n      blockNumber: 15564163n,\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": null,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"getBytecode\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"blockNumber\": 15564163n,\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: blockTag', async () => {\n  const { result } = await renderHook(() =>\n    useBytecode({\n      address: address.wagmiMintExample,\n      blockTag: 'earliest',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": null,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"getBytecode\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"blockTag\": \"earliest\",\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: chainId', async () => {\n  const { result } = await renderHook(() =>\n    useBytecode({\n      address: address.wagmiMintExample,\n      chainId: chain.optimism.id,\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": null,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"getBytecode\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"chainId\": 10,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('behavior: address: undefined -> defined', async () => {\n  const { result, rerender } = await renderHook(\n    (props) =>\n      useBytecode({\n        address: props?.address,\n      }),\n    { initialProps: { address: undefined as Address | undefined } },\n  )\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": undefined,\n      \"dataUpdatedAt\": 0,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": false,\n      \"isFetchedAfterMount\": false,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": true,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": false,\n      \"isSuccess\": false,\n      \"queryKey\": [\n        \"getBytecode\",\n        {\n          \"address\": undefined,\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"pending\",\n    }\n  `)\n\n  rerender({ address: address.wagmiMintExample })\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, ...rest } = result.current\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"getBytecode\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n  expect(data).toMatch(/^0x.*/)\n})\n\ntest('behavior: disabled when properties missing', async () => {\n  const { result } = await renderHook(() => useBytecode())\n\n  await wait(100)\n  await vi.waitFor(() => expect(result.current.isPending).toBeTruthy())\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useBytecode.ts",
    "content": "'use client'\nimport type {\n  Config,\n  GetBytecodeErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetBytecodeData,\n  type GetBytecodeOptions,\n  getBytecodeQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseBytecodeParameters<\n  config extends Config = Config,\n  selectData = GetBytecodeData,\n> = Compute<GetBytecodeOptions<config, selectData> & ConfigParameter<config>>\n\nexport type UseBytecodeReturnType<selectData = GetBytecodeData> =\n  UseQueryReturnType<selectData, GetBytecodeErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useBytecode */\nexport function useBytecode<\n  config extends Config = ResolvedRegister['config'],\n  selectData = GetBytecodeData,\n>(\n  parameters: UseBytecodeParameters<config, selectData> = {},\n): UseBytecodeReturnType<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = getBytecodeQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options)\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useCall.test-d.ts",
    "content": "import type { CallReturnType } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport { useCall } from './useCall.js'\n\ntest('select data', () => {\n  const result = useCall({\n    query: {\n      select(data) {\n        return data\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<CallReturnType | undefined>()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useCall.test.ts",
    "content": "import { accounts, address, chain } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useCall } from './useCall.js'\n\nconst name4bytes = '0x06fdde03'\n\nconst account = accounts[0]\n\ntest('default', async () => {\n  const { result } = await renderHook(() =>\n    useCall({\n      account,\n      data: name4bytes,\n      to: address.wagmiMintExample,\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": {\n        \"data\": \"0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000057761676d69000000000000000000000000000000000000000000000000000000\",\n      },\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"call\",\n        {\n          \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"chainId\": 1,\n          \"data\": \"0x06fdde03\",\n          \"to\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: blockTag', async () => {\n  const { result } = await renderHook(() =>\n    useCall({\n      account,\n      data: name4bytes,\n      to: address.wagmiMintExample,\n      blockTag: 'safe',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": {\n        \"data\": \"0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000057761676d69000000000000000000000000000000000000000000000000000000\",\n      },\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"call\",\n        {\n          \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"blockTag\": \"safe\",\n          \"chainId\": 1,\n          \"data\": \"0x06fdde03\",\n          \"to\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: blockNumber', async () => {\n  const { result } = await renderHook(() =>\n    useCall({\n      account,\n      data: name4bytes,\n      to: address.wagmiMintExample,\n      blockNumber: 16280770n,\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": {\n        \"data\": \"0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000057761676d69000000000000000000000000000000000000000000000000000000\",\n      },\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"call\",\n        {\n          \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"blockNumber\": 16280770n,\n          \"chainId\": 1,\n          \"data\": \"0x06fdde03\",\n          \"to\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: chainId', async () => {\n  const { result } = await renderHook(() =>\n    useCall({\n      account,\n      data: name4bytes,\n      to: address.wagmiMintExample,\n      chainId: chain.mainnet2.id,\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": {\n        \"data\": \"0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000057761676d69000000000000000000000000000000000000000000000000000000\",\n      },\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"call\",\n        {\n          \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"chainId\": 456,\n          \"data\": \"0x06fdde03\",\n          \"to\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useCall.ts",
    "content": "'use client'\nimport type { CallErrorType, Config, ResolvedRegister } from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type CallData,\n  type CallOptions,\n  callQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseCallParameters<\n  config extends Config = Config,\n  selectData = CallData,\n> = Compute<CallOptions<config, selectData> & ConfigParameter<config>>\n\nexport type UseCallReturnType<selectData = CallData> = UseQueryReturnType<\n  selectData,\n  CallErrorType\n>\n\n/** https://wagmi.sh/react/api/hooks/useCall */\nexport function useCall<\n  config extends Config = ResolvedRegister['config'],\n  selectData = CallData,\n>(\n  parameters: UseCallParameters<config, selectData> = {},\n): UseCallReturnType<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = callQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options)\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useCallsStatus.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { accounts, config, testClient } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { parseEther } from 'viem'\nimport { expect, test, vi } from 'vitest'\n\nimport { useCallsStatus } from './useCallsStatus.js'\nimport { useSendCalls } from './useSendCalls.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const { result } = await renderHook(() => useSendCalls())\n\n  result.current.mutate({\n    calls: [\n      {\n        data: '0xdeadbeef',\n        to: accounts[1],\n        value: parseEther('1'),\n      },\n      {\n        to: accounts[2],\n        value: parseEther('2'),\n      },\n      {\n        to: accounts[3],\n        value: parseEther('3'),\n      },\n    ],\n  })\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { result: result_2 } = await renderHook(() =>\n    useCallsStatus({ id: result.current.data?.id! }),\n  )\n  await vi.waitFor(() => expect(result_2.current.isSuccess).toBeTruthy(), {\n    timeout: 10_000,\n  })\n\n  expect(result_2.current.data).toMatchInlineSnapshot(\n    `\n    {\n      \"atomic\": false,\n      \"chainId\": 1,\n      \"id\": \"0xb24b52a86aa2b0bae6f1e44868c3a13d2572e766a1f6364afd93d1757839b8a1\",\n      \"receipts\": [],\n      \"status\": \"pending\",\n      \"statusCode\": 100,\n      \"version\": \"2.0.0\",\n    }\n  `,\n  )\n\n  await testClient.mainnet.mine({ blocks: 1 })\n\n  const { result: result_3 } = await renderHook(() =>\n    useCallsStatus({ id: result.current.data?.id! }),\n  )\n  await vi.waitFor(() => expect(result_3.current.isSuccess).toBeTruthy(), {\n    timeout: 10_000,\n  })\n\n  expect(result_3.current.data?.status).toBe('success')\n  expect(result_3.current.data?.statusCode).toBe(200)\n  expect(\n    result_3.current.data?.receipts?.map((x) => ({\n      ...x,\n      blockHash: undefined,\n      transactionHash: undefined,\n    })),\n  ).toMatchInlineSnapshot(\n    `\n    [\n      {\n        \"blockHash\": undefined,\n        \"blockNumber\": 23535881n,\n        \"gasUsed\": 21160n,\n        \"logs\": [],\n        \"status\": \"success\",\n        \"transactionHash\": undefined,\n      },\n      {\n        \"blockHash\": undefined,\n        \"blockNumber\": 23535881n,\n        \"gasUsed\": 21000n,\n        \"logs\": [],\n        \"status\": \"success\",\n        \"transactionHash\": undefined,\n      },\n      {\n        \"blockHash\": undefined,\n        \"blockNumber\": 23535881n,\n        \"gasUsed\": 21000n,\n        \"logs\": [],\n        \"status\": \"success\",\n        \"transactionHash\": undefined,\n      },\n    ]\n  `,\n  )\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useCallsStatus.ts",
    "content": "'use client'\nimport type {\n  Config,\n  GetCallsStatusErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetCallsStatusData,\n  type GetCallsStatusOptions,\n  getCallsStatusQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\nimport { useConnection } from './useConnection.js'\n\nexport type UseCallsStatusParameters<\n  config extends Config = Config,\n  selectData = GetCallsStatusData,\n> = Compute<GetCallsStatusOptions<selectData> & ConfigParameter<config>>\n\nexport type UseCallsStatusReturnType<selectData = GetCallsStatusData> =\n  UseQueryReturnType<selectData, GetCallsStatusErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useCallsStatus */\nexport function useCallsStatus<\n  config extends Config = ResolvedRegister['config'],\n  selectData = GetCallsStatusData,\n>(\n  parameters: UseCallsStatusParameters<config, selectData>,\n): UseCallsStatusReturnType<selectData> {\n  const config = useConfig(parameters)\n  const { connector } = useConnection({ config })\n  const options = getCallsStatusQueryOptions(config, {\n    ...parameters,\n    connector: parameters.connector ?? connector,\n  })\n  return useQuery(options)\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useCapabilities.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { accounts, config } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useCapabilities } from './useCapabilities.js'\n\nconst connector = config.connectors[0]!\n\ntest('mounts', async () => {\n  await connect(config, { connector })\n\n  const { result } = await renderHook(() => useCapabilities())\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { queryKey: _, ...rest } = result.current\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"data\": {\n        \"8453\": {\n          \"paymasterService\": {\n            \"supported\": true,\n          },\n          \"sessionKeys\": {\n            \"supported\": true,\n          },\n        },\n        \"84532\": {\n          \"paymasterService\": {\n            \"supported\": true,\n          },\n        },\n      },\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n\n  await disconnect(config, { connector })\n})\n\ntest('args: account', async () => {\n  await connect(config, { connector })\n\n  const { result } = await renderHook(() =>\n    useCapabilities({ account: accounts[1] }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { queryKey: _, ...rest } = result.current\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"data\": {\n        \"8453\": {\n          \"paymasterService\": {\n            \"supported\": false,\n          },\n          \"sessionKeys\": {\n            \"supported\": true,\n          },\n        },\n        \"84532\": {\n          \"paymasterService\": {\n            \"supported\": false,\n          },\n        },\n      },\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useCapabilities.ts",
    "content": "'use client'\nimport type {\n  Config,\n  GetCapabilitiesErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetCapabilitiesData,\n  type GetCapabilitiesOptions,\n  getCapabilitiesQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\nimport { useConnection } from './useConnection.js'\n\nexport type UseCapabilitiesParameters<\n  config extends Config = Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  selectData = GetCapabilitiesData<config, chainId>,\n> = Compute<\n  GetCapabilitiesOptions<config, chainId, selectData> & ConfigParameter<config>\n>\n\nexport type UseCapabilitiesReturnType<\n  config extends Config = Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  selectData = GetCapabilitiesData<config, chainId>,\n> = UseQueryReturnType<selectData, GetCapabilitiesErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useCapabilities */\nexport function useCapabilities<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  selectData = GetCapabilitiesData<config, chainId>,\n>(\n  parameters: UseCapabilitiesParameters<config, chainId, selectData> = {},\n): UseCapabilitiesReturnType<config, chainId, selectData> {\n  const config = useConfig(parameters)\n  const { address, connector } = useConnection({ config })\n  const options = getCapabilitiesQueryOptions(config, {\n    ...parameters,\n    account: parameters.account ?? address,\n    connector: parameters.connector ?? connector,\n  })\n  return useQuery(options as never) as any\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useChainId.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useChainId } from './useChainId.js'\n\ntest('default', () => {\n  const chainId = useChainId()\n  expectTypeOf(chainId).toEqualTypeOf<number>()\n})\n\ntest('parameters: config', () => {\n  const chainId = useChainId({ config })\n  expectTypeOf(chainId).toEqualTypeOf<1 | 456 | 10>()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useChainId.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { createElement, Fragment } from 'react'\nimport { expect, test } from 'vitest'\n\nimport { useChainId } from './useChainId.js'\n\ntest('default', async () => {\n  const { result, rerender } = await renderHook(() => useChainId())\n\n  expect(result.current).toMatchInlineSnapshot('1')\n\n  config.setState((x) => ({ ...x, chainId: 456 }))\n  rerender()\n\n  expect(result.current).toMatchInlineSnapshot('456')\n})\n\ntest('parameters: config', async () => {\n  const { result } = await renderHook(() => useChainId({ config }), {\n    wrapper: ({ children }) => createElement(Fragment, { children }),\n  })\n  expect(result.current).toBeDefined()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useChainId.ts",
    "content": "'use client'\n\nimport {\n  type Config,\n  type GetChainIdReturnType,\n  getChainId,\n  type ResolvedRegister,\n  watchChainId,\n} from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport { useSyncExternalStore } from 'react'\nimport { useConfig } from './useConfig.js'\n\nexport type UseChainIdParameters<config extends Config = Config> =\n  ConfigParameter<config>\n\nexport type UseChainIdReturnType<config extends Config = Config> =\n  GetChainIdReturnType<config>\n\n/** https://wagmi.sh/react/api/hooks/useChainId */\nexport function useChainId<config extends Config = ResolvedRegister['config']>(\n  parameters: UseChainIdParameters<config> = {},\n): UseChainIdReturnType<config> {\n  const config = useConfig(parameters)\n\n  return useSyncExternalStore(\n    (onChange) => watchChainId(config, { onChange }),\n    () => getChainId(config),\n    () => getChainId(config),\n  )\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useChains.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { createElement, Fragment } from 'react'\nimport { expect, test } from 'vitest'\n\nimport { useChains } from './useChains.js'\n\ntest('default', async () => {\n  const { result } = await renderHook(() => useChains())\n\n  expect(result.current.map((x) => x.id)).toMatchInlineSnapshot(`\n    [\n      1,\n      456,\n      10,\n    ]\n  `)\n})\n\ntest('parameters: config', async () => {\n  const { result } = await renderHook(() => useChains({ config }), {\n    wrapper: ({ children }) => createElement(Fragment, { children }),\n  })\n  expect(result.current.map((x) => x.id)).toMatchInlineSnapshot(`\n    [\n      1,\n      456,\n      10,\n    ]\n  `)\n})\n\ntest('behavior: chains updates', async () => {\n  const { act, result } = await renderHook(() => useChains())\n\n  const chains = result.current\n  expect(\n    result.current.map(({ id, name }) => ({\n      id,\n      name,\n    })),\n  ).toMatchInlineSnapshot(`\n    [\n      {\n        \"id\": 1,\n        \"name\": \"Ethereum\",\n      },\n      {\n        \"id\": 456,\n        \"name\": \"Ethereum\",\n      },\n      {\n        \"id\": 10,\n        \"name\": \"OP Mainnet\",\n      },\n    ]\n  `)\n\n  await act(() =>\n    config._internal.chains.setState([chain.mainnet, chain.mainnet2]),\n  )\n\n  expect(\n    result.current.map(({ id, name }) => ({\n      id,\n      name,\n    })),\n  ).toMatchInlineSnapshot(`\n    [\n      {\n        \"id\": 1,\n        \"name\": \"Ethereum\",\n      },\n      {\n        \"id\": 456,\n        \"name\": \"Ethereum\",\n      },\n    ]\n  `)\n\n  await act(() => config._internal.chains.setState(chains))\n\n  expect(\n    result.current.map(({ id, name }) => ({\n      id,\n      name,\n    })),\n  ).toMatchInlineSnapshot(`\n    [\n      {\n        \"id\": 1,\n        \"name\": \"Ethereum\",\n      },\n      {\n        \"id\": 456,\n        \"name\": \"Ethereum\",\n      },\n      {\n        \"id\": 10,\n        \"name\": \"OP Mainnet\",\n      },\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useChains.ts",
    "content": "'use client'\n\nimport {\n  type Config,\n  type GetChainsReturnType,\n  getChains,\n  type ResolvedRegister,\n} from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport { watchChains } from '@wagmi/core/internal'\nimport { useSyncExternalStore } from 'react'\nimport { useConfig } from './useConfig.js'\n\nexport type UseChainsParameters<config extends Config = Config> =\n  ConfigParameter<config>\n\nexport type UseChainsReturnType<config extends Config = Config> =\n  GetChainsReturnType<config>\n\n/** https://wagmi.sh/react/api/hooks/useChains */\nexport function useChains<config extends Config = ResolvedRegister['config']>(\n  parameters: UseChainsParameters<config> = {},\n): UseChainsReturnType<config> {\n  const config = useConfig(parameters)\n\n  return useSyncExternalStore(\n    (onChange) => watchChains(config, { onChange }),\n    () => getChains(config),\n    () => getChains(config),\n  )\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useClient.test-d.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport type { Chain } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useClient } from './useClient.js'\n\ntest('default', () => {\n  const client = useClient({ config })\n  expectTypeOf(client.chain).toEqualTypeOf<(typeof config)['chains'][number]>()\n  expectTypeOf(client.transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('parameters: chainId', () => {\n  const client = useClient({\n    config,\n    chainId: chain.mainnet.id,\n  })\n  expectTypeOf(client.chain).toEqualTypeOf<typeof chain.mainnet>()\n  expectTypeOf(client.chain).not.toEqualTypeOf<typeof chain.mainnet2>()\n  expectTypeOf(client.transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('behavior: unconfigured chain', () => {\n  {\n    const client = useClient({ chainId: 123456 })\n    if (client) {\n      expectTypeOf(client.chain).toEqualTypeOf<Chain>()\n      expectTypeOf(client.transport.type).toEqualTypeOf<string>()\n    } else {\n      expectTypeOf(client).toEqualTypeOf<undefined>()\n    }\n  }\n\n  const client = useClient({\n    config,\n    // @ts-expect-error\n    chainId: 123456,\n  })\n  expectTypeOf(client).toEqualTypeOf<undefined>()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useClient.test.ts",
    "content": "import { switchChain } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { createElement, Fragment } from 'react'\nimport { expect, test } from 'vitest'\n\nimport { useClient } from './useClient.js'\n\ntest('default', async () => {\n  const { result, rerender } = await renderHook(() => useClient())\n\n  expect(result.current?.chain.id).toEqual(1)\n\n  await switchChain(config, { chainId: 456 })\n  rerender()\n\n  expect(result.current?.chain.id).toEqual(456)\n})\n\ntest('parameters: config', async () => {\n  const { result } = await renderHook(() => useClient({ config }), {\n    wrapper: ({ children }) => createElement(Fragment, { children }),\n  })\n  expect(result.current).toBeDefined()\n})\n\ntest('behavior: unconfigured chain', async () => {\n  const { result } = await renderHook(() => useClient({ chainId: 123456 }))\n  expect(result.current).toBeUndefined()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useClient.ts",
    "content": "'use client'\n\nimport {\n  type Config,\n  type GetClientParameters,\n  type GetClientReturnType,\n  getClient,\n  type ResolvedRegister,\n  watchClient,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/shim/with-selector.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseClientParameters<\n  config extends Config = Config,\n  chainId extends config['chains'][number]['id'] | number | undefined =\n    | config['chains'][number]['id']\n    | undefined,\n> = Compute<GetClientParameters<config, chainId> & ConfigParameter<config>>\n\nexport type UseClientReturnType<\n  config extends Config = Config,\n  chainId extends config['chains'][number]['id'] | number | undefined =\n    | config['chains'][number]['id']\n    | undefined,\n> = GetClientReturnType<config, chainId>\n\n/** https://wagmi.sh/react/api/hooks/useClient */\nexport function useClient<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends config['chains'][number]['id'] | number | undefined =\n    | config['chains'][number]['id']\n    | undefined,\n>(\n  parameters: UseClientParameters<config, chainId> = {},\n): UseClientReturnType<config, chainId> {\n  const config = useConfig(parameters)\n\n  return useSyncExternalStoreWithSelector(\n    (onChange) => watchClient(config, { onChange }),\n    () => getClient(config, parameters),\n    () => getClient(config, parameters),\n    (x) => x,\n    (a, b) => a?.uid === b?.uid,\n  ) as any\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useConfig.test-d.ts",
    "content": "import type { Config } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useConfig } from './useConfig.js'\n\ntest('default', async () => {\n  const result = useConfig()\n  expectTypeOf(result).toEqualTypeOf<Config>()\n})\n\ntest('parameters: config', async () => {\n  const result = useConfig({ config })\n  expectTypeOf(result).not.toEqualTypeOf<Config>()\n  expectTypeOf(result).toEqualTypeOf<typeof config>()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useConfig.test.ts",
    "content": "import { createWrapper, renderHook } from '@wagmi/test/react'\nimport * as React from 'react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useConfig } from './useConfig.js'\n\ntest('mounts', async () => {\n  const { result } = await renderHook(() => useConfig())\n  expect(result.current).toBeDefined()\n})\n\ntest('behavior: throws when not inside Provider', async () => {\n  vi.spyOn(console, 'error').mockImplementation(() => {})\n\n  await expect(\n    renderHook(() => useConfig(), {\n      wrapper: createWrapper(\n        (props) => React.createElement('div', undefined, props.children),\n        undefined,\n      ),\n    }),\n  ).rejects.toThrowErrorMatchingInlineSnapshot(`\n    [WagmiProviderNotFoundError: \\`useConfig\\` must be used within \\`WagmiProvider\\`.\n\n    Docs: https://wagmi.sh/react/api/WagmiProvider.html\n    Version: wagmi@x.y.z]\n  `)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useConfig.ts",
    "content": "'use client'\n\nimport type { Config, ResolvedRegister } from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport { useContext } from 'react'\nimport { WagmiContext } from '../context.js'\nimport { WagmiProviderNotFoundError } from '../errors/context.js'\n\nexport type UseConfigParameters<config extends Config = Config> =\n  ConfigParameter<config>\n\nexport type UseConfigReturnType<config extends Config = Config> = config\n\n/** https://wagmi.sh/react/api/hooks/useConfig */\nexport function useConfig<config extends Config = ResolvedRegister['config']>(\n  parameters: UseConfigParameters<config> = {},\n): UseConfigReturnType<config> {\n  // biome-ignore lint/correctness/useHookAtTopLevel: false alarm\n  const config = parameters.config ?? useContext(WagmiContext)\n  if (!config) throw new WagmiProviderNotFoundError()\n  return config as UseConfigReturnType<config>\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useConnect.test-d.ts",
    "content": "import type {\n  ConnectErrorType,\n  Connector,\n  CreateConnectorFn,\n} from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport type { Address, Hex } from 'viem'\nimport { assertType, expectTypeOf, test } from 'vitest'\nimport { useConnect } from './useConnect.js'\n\nconst connector = config.connectors[0]!\nconst contextValue = { foo: 'bar' } as const\n\ntest('context', () => {\n  const connect = useConnect({\n    mutation: {\n      onMutate(variables) {\n        assertType<{\n          chainId?: number | undefined\n          connector: Connector | CreateConnectorFn\n          withCapabilities?: boolean | undefined\n        }>(variables)\n        return contextValue\n      },\n      onError(error, variables, context) {\n        assertType<{\n          chainId?: number | undefined\n          connector: Connector | CreateConnectorFn\n          withCapabilities?: boolean | undefined\n        }>(variables)\n        expectTypeOf(error).toEqualTypeOf<ConnectErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf<{\n          chainId?: number | undefined\n          connector: Connector | CreateConnectorFn\n          withCapabilities?: boolean | undefined\n        }>(variables)\n        expectTypeOf(data).toEqualTypeOf<{\n          accounts:\n            | readonly [Address, ...Address[]]\n            | readonly [\n                { address: Address; capabilities: Record<string, unknown> },\n                ...{\n                  address: Address\n                  capabilities: Record<string, unknown>\n                }[],\n              ]\n          chainId: number\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<\n          | {\n              accounts:\n                | readonly [Address, ...Address[]]\n                | readonly [\n                    {\n                      address: Address\n                      capabilities: Record<string, unknown>\n                    },\n                    ...{\n                      address: Address\n                      capabilities: Record<string, unknown>\n                    }[],\n                  ]\n              chainId: number\n            }\n          | undefined\n        >()\n        assertType<{\n          chainId?: number | undefined\n          connector: Connector | CreateConnectorFn\n          withCapabilities?: boolean | undefined\n        }>(variables)\n        expectTypeOf(error).toEqualTypeOf<ConnectErrorType | null>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  })\n\n  expectTypeOf(connect.data).toEqualTypeOf<\n    | {\n        accounts:\n          | readonly [Address, ...Address[]]\n          | readonly [\n              { address: Address; capabilities: Record<string, unknown> },\n              ...{ address: Address; capabilities: Record<string, unknown> }[],\n            ]\n        chainId: number\n      }\n    | undefined\n  >()\n  expectTypeOf(connect.error).toEqualTypeOf<ConnectErrorType | null>()\n  expectTypeOf(connect.variables).toMatchTypeOf<\n    | {\n        chainId?: number | undefined\n        connector: CreateConnectorFn | Connector\n      }\n    | undefined\n  >()\n  expectTypeOf(connect.context).toEqualTypeOf<typeof contextValue | undefined>()\n\n  connect.mutate(\n    {\n      connector,\n      foo: 'bar',\n    },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{\n          chainId?: number | undefined\n          connector: typeof connector | CreateConnectorFn\n          foo?: string | undefined\n          withCapabilities?: boolean | undefined\n        }>()\n        expectTypeOf(error).toEqualTypeOf<ConnectErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{\n          chainId?: number | undefined\n          connector: typeof connector | CreateConnectorFn\n          foo?: string | undefined\n          withCapabilities?: boolean | undefined\n        }>()\n        expectTypeOf(data).toEqualTypeOf<{\n          accounts: readonly [Address, ...Address[]]\n          chainId: number\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<\n          | {\n              accounts: readonly [Address, ...Address[]]\n              chainId: number\n            }\n          | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<ConnectErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<{\n          chainId?: number | undefined\n          connector: typeof connector | CreateConnectorFn\n          foo?: string | undefined\n          withCapabilities?: boolean | undefined\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  )\n\n  connect.mutate(\n    {\n      connector,\n      foo: 'bar',\n      withCapabilities: true,\n    },\n    {\n      onSuccess(data, _variables, _context) {\n        expectTypeOf(data).toEqualTypeOf<{\n          accounts: readonly [\n            {\n              address: Address\n              capabilities: {\n                foo: { bar: Hex }\n              }\n            },\n            ...{\n              address: Address\n              capabilities: {\n                foo: { bar: Hex }\n              }\n            }[],\n          ]\n          chainId: number\n        }>()\n      },\n      onSettled(data, _error, _variables, _context) {\n        expectTypeOf(data).toEqualTypeOf<\n          | {\n              accounts: readonly [\n                {\n                  address: Address\n                  capabilities: {\n                    foo: { bar: Hex }\n                  }\n                },\n                ...{\n                  address: Address\n                  capabilities: {\n                    foo: { bar: Hex }\n                  }\n                }[],\n              ]\n              chainId: number\n            }\n          | undefined\n        >()\n      },\n    },\n  )\n\n  ;(async () => {\n    const res = await connect.mutateAsync({\n      connector,\n      foo: 'bar',\n      withCapabilities: true,\n    })\n    expectTypeOf(res).toEqualTypeOf<{\n      accounts: readonly [\n        {\n          address: Address\n          capabilities: {\n            foo: { bar: Hex }\n          }\n        },\n        ...{\n          address: Address\n          capabilities: {\n            foo: { bar: Hex }\n          }\n        }[],\n      ]\n      chainId: number\n    }>()\n  })()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useConnect.test.ts",
    "content": "import { disconnect } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { afterEach, expect, test, vi } from 'vitest'\nimport { useConnect } from './useConnect.js'\nimport { useConnection } from './useConnection.js'\nimport { useConnectors } from './useConnectors.js'\n\nconst connector = config.connectors[0]!\n\nafterEach(async () => {\n  if (config.state.current === connector.uid)\n    await disconnect(config, { connector })\n})\n\ntest('default', async () => {\n  const { result } = await renderHook(() => ({\n    useConnection: useConnection(),\n    useConnect: useConnect(),\n    useConnectors: useConnectors(),\n  }))\n\n  expect(result.current.useConnection.address).not.toBeDefined()\n  expect(result.current.useConnection.status).toEqual('disconnected')\n\n  result.current.useConnect.mutate({\n    connector: result.current.useConnectors[0]!,\n  })\n\n  await vi.waitFor(() =>\n    expect(result.current.useConnection.isConnected).toBeTruthy(),\n  )\n\n  expect(result.current.useConnection.address).toBeDefined()\n  expect(result.current.useConnection.status).toEqual('connected')\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useConnect.ts",
    "content": "'use client'\nimport { useMutation } from '@tanstack/react-query'\nimport type { Config, ConnectErrorType, ResolvedRegister } from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type ConnectData,\n  type ConnectMutate,\n  type ConnectMutateAsync,\n  type ConnectOptions,\n  type ConnectVariables,\n  connectMutationOptions,\n} from '@wagmi/core/query'\nimport { useEffect } from 'react'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\nimport { type UseConnectorsReturnType, useConnectors } from './useConnectors.js'\n\nexport type UseConnectParameters<\n  config extends Config = Config,\n  context = unknown,\n> = Compute<ConfigParameter<config> & ConnectOptions<config, context>>\n\nexport type UseConnectReturnType<\n  config extends Config = Config,\n  context = unknown,\n> = Compute<\n  UseMutationReturnType<\n    ConnectData<config, config['connectors'][number], boolean>,\n    ConnectErrorType,\n    ConnectVariables<config, config['connectors'][number], boolean>,\n    context,\n    ConnectMutate<config, context>,\n    ConnectMutateAsync<config, context>\n  > & {\n    /** @deprecated use `mutate` instead */\n    connect: ConnectMutate<config, context>\n    /** @deprecated use `mutateAsync` instead */\n    connectAsync: ConnectMutateAsync<config, context>\n    /** @deprecated use `useConnectors` instead */\n    connectors: Compute<UseConnectorsReturnType> | config['connectors']\n  }\n>\n\n/** https://wagmi.sh/react/api/hooks/useConnect */\nexport function useConnect<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: UseConnectParameters<config, context> = {},\n): UseConnectReturnType<config, context> {\n  const config = useConfig(parameters)\n  const options = connectMutationOptions(config, parameters)\n  const mutation = useMutation(options)\n\n  // Reset mutation back to an idle state when the connector disconnects.\n  useEffect(() => {\n    return config.subscribe(\n      ({ status }) => status,\n      (status, previousStatus) => {\n        if (previousStatus === 'connected' && status === 'disconnected')\n          mutation.reset()\n      },\n    )\n  }, [config, mutation.reset])\n\n  type Return = UseConnectReturnType<config, context>\n  return {\n    ...(mutation as Return),\n    connect: mutation.mutate as Return['mutate'],\n    connectAsync: mutation.mutateAsync as Return['mutateAsync'],\n    connectors: useConnectors({ config }),\n  }\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useConnection.test-d.ts",
    "content": "import type { Connector } from '@wagmi/core'\nimport type { Address, Chain } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useConnection } from './useConnection.js'\n\ntest('states', () => {\n  const result = useConnection()\n\n  switch (result.status) {\n    case 'reconnecting': {\n      expectTypeOf(result).toMatchTypeOf<{\n        address: Address | undefined\n        chain: Chain | undefined\n        chainId: number | undefined\n        connector: Connector | undefined\n        isConnected: boolean\n        isConnecting: false\n        isDisconnected: false\n        isReconnecting: true\n        status: 'reconnecting'\n      }>()\n      break\n    }\n    case 'connecting': {\n      expectTypeOf(result).toMatchTypeOf<{\n        address: Address | undefined\n        chain: Chain | undefined\n        chainId: number | undefined\n        connector: Connector | undefined\n        isConnected: false\n        isReconnecting: false\n        isConnecting: true\n        isDisconnected: false\n        status: 'connecting'\n      }>()\n      break\n    }\n    case 'connected': {\n      expectTypeOf(result).toMatchTypeOf<{\n        address: Address\n        chain: Chain | undefined\n        chainId: number\n        connector: Connector\n        isConnected: true\n        isConnecting: false\n        isDisconnected: false\n        isReconnecting: false\n        status: 'connected'\n      }>()\n      break\n    }\n    case 'disconnected': {\n      expectTypeOf(result).toMatchTypeOf<{\n        address: undefined\n        chain: undefined\n        chainId: undefined\n        connector: undefined\n        isConnected: false\n        isReconnecting: false\n        isConnecting: false\n        isDisconnected: true\n        status: 'disconnected'\n      }>()\n      break\n    }\n  }\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useConnection.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport * as React from 'react'\nimport { expect, test } from 'vitest'\n\nimport { useConnection } from './useConnection.js'\n\ntest('default', async () => {\n  const { result, rerender } = await renderHook(() => useConnection())\n\n  expect(result.current.address).not.toBeDefined()\n  expect(result.current.status).toEqual('disconnected')\n\n  await connect(config, { connector: config.connectors[0]! })\n  rerender()\n\n  expect(result.current.address).toBeDefined()\n  expect(result.current.status).toEqual('connected')\n\n  await disconnect(config)\n})\n\ntest('parameters: config', async () => {\n  const { result } = await renderHook(() => useConnection({ config }), {\n    wrapper: ({ children }) =>\n      React.createElement(React.Fragment, { children }),\n  })\n  expect(result.current).toBeDefined()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useConnection.ts",
    "content": "'use client'\n\nimport {\n  type Config,\n  type GetConnectionReturnType,\n  getConnection,\n  type ResolvedRegister,\n  watchConnection,\n} from '@wagmi/core'\n\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport { useConfig } from './useConfig.js'\nimport { useSyncExternalStoreWithTracked } from './useSyncExternalStoreWithTracked.js'\n\nexport type UseConnectionParameters<config extends Config = Config> =\n  ConfigParameter<config>\n\nexport type UseConnectionReturnType<config extends Config = Config> =\n  GetConnectionReturnType<config>\n\n/** https://wagmi.sh/react/api/hooks/useConnection */\nexport function useConnection<\n  config extends Config = ResolvedRegister['config'],\n>(\n  parameters: UseConnectionParameters<config> = {},\n): UseConnectionReturnType<config> {\n  const config = useConfig(parameters)\n\n  return useSyncExternalStoreWithTracked(\n    (onChange) => watchConnection(config, { onChange }),\n    () => getConnection(config),\n  )\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useConnectionEffect.test.ts",
    "content": "import { mock } from '@wagmi/connectors'\nimport { connect, createConfig, disconnect, http } from '@wagmi/core'\nimport { accounts, chain, config } from '@wagmi/test'\nimport { createWrapper, renderHook } from '@wagmi/test/react'\nimport { createElement, Fragment } from 'react'\nimport { expect, test, vi } from 'vitest'\n\nimport { WagmiProvider } from '../context.js'\nimport { useConnect } from './useConnect.js'\nimport { useConnectionEffect } from './useConnectionEffect.js'\nimport { useConnectors } from './useConnectors.js'\nimport { useDisconnect } from './useDisconnect.js'\n\ntest('parameters: config', async () => {\n  const { result } = await renderHook(() => useConnectionEffect({ config }), {\n    wrapper: ({ children }) => createElement(Fragment, { children }),\n  })\n  expect(result.current).toBeUndefined()\n})\n\ntest('behavior: connect and disconnect called once', async () => {\n  const onConnect = vi.fn()\n  const onDisconnect = vi.fn()\n\n  const { result } = await renderHook(() => ({\n    useConnectionEffect: useConnectionEffect({ onConnect, onDisconnect }),\n    useConnect: useConnect(),\n    useConnectors: useConnectors(),\n    useDisconnect: useDisconnect(),\n  }))\n\n  result.current.useConnect.mutate({\n    connector: result.current.useConnectors[0]!,\n  })\n  await vi.waitFor(() =>\n    expect(result.current.useConnect.isSuccess).toBeTruthy(),\n  )\n\n  result.current.useConnect.mutate({\n    connector: result.current.useConnectors[0]!,\n  })\n  await vi.waitFor(() =>\n    expect(result.current.useConnect.isSuccess).toBeTruthy(),\n  )\n\n  result.current.useDisconnect.mutate()\n  await vi.waitFor(() =>\n    expect(result.current.useDisconnect.isSuccess).toBeTruthy(),\n  )\n  result.current.useDisconnect.mutate()\n  await vi.waitFor(() =>\n    expect(result.current.useDisconnect.isSuccess).toBeTruthy(),\n  )\n\n  expect(onConnect).toBeCalledTimes(1)\n  expect(onDisconnect).toBeCalledTimes(1)\n})\n\ntest('behavior: connect called on reconnect', async () => {\n  const config = createConfig({\n    chains: [chain.mainnet],\n    connectors: [\n      mock({\n        accounts,\n        features: { reconnect: true },\n      }),\n    ],\n    transports: { [chain.mainnet.id]: http() },\n  })\n\n  await connect(config, { connector: config.connectors[0]! })\n  const onConnect = vi.fn((data) => {\n    expect(data.isReconnected).toBeTruthy()\n  })\n\n  renderHook(() => useConnectionEffect({ onConnect }), {\n    wrapper: createWrapper(WagmiProvider, { config, reconnectOnMount: true }),\n  })\n\n  await vi.waitFor(() => expect(onConnect).toBeCalledTimes(1), {\n    timeout: 10_000,\n  })\n\n  await disconnect(config)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useConnectionEffect.ts",
    "content": "'use client'\n\nimport { type GetConnectionReturnType, watchConnection } from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport { useEffect } from 'react'\nimport { useConfig } from './useConfig.js'\n\nexport type UseConnectionEffectParameters = Compute<\n  {\n    onConnect?(\n      data: Compute<\n        Pick<\n          Extract<GetConnectionReturnType, { status: 'connected' }>,\n          'address' | 'addresses' | 'chain' | 'chainId' | 'connector'\n        > & {\n          isReconnected: boolean\n        }\n      >,\n    ): void\n    onDisconnect?(): void\n  } & ConfigParameter\n>\n\n/** https://wagmi.sh/react/api/hooks/useConnectionEffect */\nexport function useConnectionEffect(\n  parameters: UseConnectionEffectParameters = {},\n) {\n  const { onConnect, onDisconnect } = parameters\n\n  const config = useConfig(parameters)\n\n  useEffect(() => {\n    return watchConnection(config, {\n      onChange(data, prevData) {\n        if (\n          (prevData.status === 'reconnecting' ||\n            (prevData.status === 'connecting' &&\n              prevData.address === undefined)) &&\n          data.status === 'connected'\n        ) {\n          const { address, addresses, chain, chainId, connector } = data\n          const isReconnected =\n            prevData.status === 'reconnecting' ||\n            // if `previousAccount.status` is `undefined`, the connector connected immediately.\n            prevData.status === undefined\n          onConnect?.({\n            address,\n            addresses,\n            chain,\n            chainId,\n            connector,\n            isReconnected,\n          })\n        } else if (\n          prevData.status === 'connected' &&\n          data.status === 'disconnected'\n        )\n          onDisconnect?.()\n      },\n    })\n  }, [config, onConnect, onDisconnect])\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useConnections.test.ts",
    "content": "import { connect } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { createElement, Fragment } from 'react'\nimport { expect, test } from 'vitest'\n\nimport { useConnections } from './useConnections.js'\n\ntest('default', async () => {\n  const { result, rerender } = await renderHook(() => useConnections())\n\n  expect(result.current).toEqual([])\n\n  await connect(config, { connector: config.connectors[0]! })\n  rerender()\n\n  expect(result.current.length).toBe(1)\n})\n\ntest('parameters: config', async () => {\n  const { result } = await renderHook(() => useConnections({ config }), {\n    wrapper: ({ children }) => createElement(Fragment, { children }),\n  })\n  expect(result.current).toBeDefined()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useConnections.ts",
    "content": "'use client'\n\nimport {\n  type GetConnectionsReturnType,\n  getConnections,\n  watchConnections,\n} from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport { useSyncExternalStore } from 'react'\nimport { useConfig } from './useConfig.js'\n\nexport type UseConnectionsParameters = ConfigParameter\n\nexport type UseConnectionsReturnType = GetConnectionsReturnType\n\n/** https://wagmi.sh/react/api/hooks/useConnections */\nexport function useConnections(\n  parameters: UseConnectionsParameters = {},\n): UseConnectionsReturnType {\n  const config = useConfig(parameters)\n\n  return useSyncExternalStore(\n    (onChange) => watchConnections(config, { onChange }),\n    () => getConnections(config),\n    () => getConnections(config),\n  )\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useConnectorClient.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useConnectorClient } from './useConnectorClient.js'\n\ntest('parameters: config', async () => {\n  const client = useConnectorClient({ config })\n  expectTypeOf(client.data?.chain?.id!).toEqualTypeOf<1 | 456 | 10>()\n\n  const client2 = useConnectorClient({ config, chainId: 1 })\n  expectTypeOf(client2.data?.chain?.id!).toEqualTypeOf<1>()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useConnectorClient.test.tsx",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { config, wait } from '@wagmi/test'\nimport { render, renderHook } from '@wagmi/test/react'\nimport * as React from 'react'\nimport { expect, test, vi } from 'vitest'\nimport { useConnect } from './useConnect.js'\nimport { useConnection } from './useConnection.js'\nimport { useConnectorClient } from './useConnectorClient.js'\nimport { useConnectors } from './useConnectors.js'\nimport { useDisconnect } from './useDisconnect.js'\nimport { useSwitchChain } from './useSwitchChain.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  const { result } = await renderHook(() => useConnectorClient())\n\n  await vi.waitFor(() => expect(result.current.isPending).toBeTruthy())\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": undefined,\n      \"dataUpdatedAt\": 0,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": false,\n      \"isFetchedAfterMount\": false,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": true,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": false,\n      \"isSuccess\": false,\n      \"queryKey\": [\n        \"connectorClient\",\n        {\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"pending\",\n    }\n  `)\n})\n\ntest('behavior: connected on mount', async () => {\n  await connect(config, { connector })\n\n  const { result } = await renderHook(() => useConnectorClient())\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, queryKey: _, ...rest } = result.current\n  expect(data).toMatchObject(\n    expect.objectContaining({\n      account: expect.any(Object),\n      chain: expect.any(Object),\n    }),\n  )\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": false,\n      \"isSuccess\": true,\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n\n  await disconnect(config, { connector })\n})\n\ntest('behavior: connect and disconnect', async () => {\n  const { result } = await renderHook(() => ({\n    useConnect: useConnect(),\n    useConnectors: useConnectors(),\n    useConnectorClient: useConnectorClient(),\n    useDisconnect: useDisconnect(),\n  }))\n\n  expect(result.current.useConnectorClient.data).not.toBeDefined()\n\n  result.current.useConnect.connect({\n    connector: result.current.useConnectors[0]!,\n  })\n\n  await vi.waitFor(() =>\n    expect(result.current.useConnectorClient.data).toBeDefined(),\n  )\n\n  result.current.useDisconnect.disconnect()\n\n  await vi.waitFor(() =>\n    expect(result.current.useConnectorClient.data).not.toBeDefined(),\n  )\n})\n\ntest('behavior: switch chains', async () => {\n  await connect(config, { connector })\n\n  const { act, result } = await renderHook(() => ({\n    useConnectorClient: useConnectorClient(),\n    useSwitchChain: useSwitchChain(),\n  }))\n\n  expect(result.current.useConnectorClient.data).not.toBeDefined()\n  await vi.waitFor(() =>\n    expect(result.current.useConnectorClient.data).toBeDefined(),\n  )\n\n  await act(() => result.current.useSwitchChain.switchChain({ chainId: 456 }))\n  await vi.waitUntil(() => result.current.useSwitchChain.isSuccess, {\n    timeout: 10_000,\n  })\n  await act(() => result.current.useSwitchChain.reset())\n  await vi.waitUntil(() => result.current.useConnectorClient.isSuccess, {\n    timeout: 10_000,\n  })\n  expect(result.current.useConnectorClient.data?.chain.id).toEqual(456)\n\n  await act(() => result.current.useSwitchChain.switchChain({ chainId: 1 }))\n  await vi.waitUntil(() => result.current.useSwitchChain.isSuccess, {\n    timeout: 10_000,\n  })\n  await vi.waitUntil(() => result.current.useConnectorClient.isSuccess, {\n    timeout: 10_000,\n  })\n  expect(result.current.useConnectorClient.data?.chain.id).toEqual(1)\n\n  await disconnect(config, { connector })\n})\n\ntest('behavior: disabled when properties missing', async () => {\n  await disconnect(config, { connector })\n\n  const { result } = await renderHook(() => useConnectorClient())\n\n  await wait(0)\n  await vi.waitFor(() => expect(result.current.isPending).toBeTruthy())\n})\n\ntest('behavior: disabled when connecting', async () => {\n  const { result } = await renderHook(() => useConnectorClient())\n\n  config.setState((x) => ({ ...x, status: 'connecting' }))\n\n  await wait(0)\n  expect(result.current.isLoading).not.toBeTruthy()\n})\n\ntest('behavior: re-render does not invalidate query', async () => {\n  await disconnect(config, { connector })\n\n  const screen = await render(<Parent />)\n\n  await screen.getByTestId('connect').click()\n  await vi.waitFor(async () => {\n    await expect\n      .element(screen.getByTestId('address'))\n      .toHaveTextContent('0x95132632579b073D12a6673e18Ab05777a6B86f8')\n    await expect.element(screen.getByTestId('client')).toBeVisible()\n\n    await expect.element(screen.getByTestId('child-client')).toBeVisible()\n    await expect\n      .element(screen.getByTestId('render-count'))\n      .toHaveTextContent('1')\n  })\n\n  const initialClient = screen.getByTestId('child-client')\n\n  await screen.getByTestId('rerender').click()\n  await vi.waitFor(() =>\n    expect.element(screen.getByTestId('render-count')).toHaveTextContent('2'),\n  )\n\n  await expect\n    .element(screen.getByTestId('child-client').element())\n    .toEqual(initialClient.element())\n})\n\ntest('behavior: connector is on a different chain', async () => {\n  await disconnect(config, { connector })\n  await connect(config, { connector })\n  config.setState((state) => {\n    const uid = state.current!\n    const connection = state.connections.get(uid)!\n    return {\n      ...state,\n      connections: new Map(state.connections).set(uid, {\n        ...connection,\n        chainId: 456,\n      }),\n    }\n  })\n\n  const { result } = await renderHook(() => useConnectorClient())\n\n  await vi.waitUntil(() => result.current.isError, 10_000)\n\n  const { error } = result.current\n  expect(error?.message).toMatchInlineSnapshot(`\n    \"The current chain of the connector (id: 1) does not match the connection's chain (id: 456).\n\n    Current Chain ID:  1\n    Expected Chain ID: 456\n\n    Version: @wagmi/core@x.y.z\"\n  `)\n\n  await disconnect(config, { connector })\n})\n\nfunction Parent() {\n  const [renderCount, setRenderCount] = React.useState(1)\n\n  const { connect } = useConnect()\n  const connectors = useConnectors()\n  const { address } = useConnection()\n  const { data } = useConnectorClient()\n\n  return (\n    <>\n      <div data-testid=\"address\">{address}</div>\n      <div data-testid=\"client\">{data?.uid}</div>\n      <Child key={renderCount} renderCount={renderCount} />\n\n      <button\n        type=\"button\"\n        data-testid=\"connect\"\n        onClick={() => connect({ connector: connectors[0]! })}\n      >\n        Connect\n      </button>\n      <button\n        type=\"button\"\n        data-testid=\"rerender\"\n        onClick={() => setRenderCount((prev) => prev + 1)}\n      >\n        Re-render\n      </button>\n    </>\n  )\n}\n\nfunction Child(props: { renderCount: number }) {\n  const { renderCount } = props\n  const { data } = useConnectorClient()\n  return (\n    <div>\n      <span data-testid=\"child-client\">{data?.uid}</span>\n      <span data-testid=\"render-count\">{renderCount}</span>\n    </div>\n  )\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useConnectorClient.ts",
    "content": "'use client'\n\nimport { useQueryClient } from '@tanstack/react-query'\nimport type {\n  Config,\n  GetConnectorClientErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetConnectorClientData,\n  type GetConnectorClientOptions,\n  getConnectorClientQueryOptions,\n} from '@wagmi/core/query'\nimport { useEffect, useRef } from 'react'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\nimport { useConnection } from './useConnection.js'\n\nexport type UseConnectorClientParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetConnectorClientData<config, chainId>,\n> = Compute<\n  GetConnectorClientOptions<config, chainId, selectData> &\n    ConfigParameter<config>\n>\n\nexport type UseConnectorClientReturnType<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetConnectorClientData<config, chainId>,\n> = UseQueryReturnType<selectData, GetConnectorClientErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useConnectorClient */\nexport function useConnectorClient<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetConnectorClientData<config, chainId>,\n>(\n  parameters: UseConnectorClientParameters<config, chainId, selectData> = {},\n): UseConnectorClientReturnType<config, chainId, selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const { address, connector } = useConnection({ config })\n  const options = getConnectorClientQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n    connector: parameters.connector ?? connector,\n    query: parameters.query as any,\n  })\n\n  const addressRef = useRef(address)\n  const queryClient = useQueryClient()\n  // biome-ignore lint/correctness/useExhaustiveDependencies: `queryKey` not required\n  useEffect(() => {\n    const previousAddress = addressRef.current\n    if (!address && previousAddress) {\n      // remove when account is disconnected\n      queryClient.removeQueries({ queryKey: options.queryKey })\n      addressRef.current = undefined\n    } else if (address !== previousAddress) {\n      // invalidate when address changes\n      queryClient.invalidateQueries({ queryKey: options.queryKey })\n      addressRef.current = address\n    }\n  }, [address, queryClient])\n\n  return useQuery(options) as any\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useConnectors.test.ts",
    "content": "import { mock } from '@wagmi/connectors'\nimport { accounts, config } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { createElement, Fragment } from 'react'\nimport { expect, test } from 'vitest'\n\nimport { useConnectors } from './useConnectors.js'\n\ntest('default', async () => {\n  const { result, rerender } = await renderHook(() => useConnectors())\n\n  const count = config.connectors.length\n  expect(result.current.length).toBe(count)\n  expect(result.current).toEqual(config.connectors)\n\n  config._internal.connectors.setState(() => [\n    ...config.connectors,\n    config._internal.connectors.setup(mock({ accounts })),\n  ])\n  rerender()\n\n  expect(result.current.length).toBe(count + 1)\n})\n\ntest('parameters: config', async () => {\n  const { result } = await renderHook(() => useConnectors({ config }), {\n    wrapper: ({ children }) => createElement(Fragment, { children }),\n  })\n  expect(result.current).toBeDefined()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useConnectors.ts",
    "content": "'use client'\n\nimport {\n  type Config,\n  type GetConnectorsReturnType,\n  getConnectors,\n  type ResolvedRegister,\n  watchConnectors,\n} from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport { useSyncExternalStore } from 'react'\nimport { useConfig } from './useConfig.js'\n\nexport type UseConnectorsParameters<config extends Config = Config> =\n  ConfigParameter<config>\n\nexport type UseConnectorsReturnType<config extends Config = Config> =\n  GetConnectorsReturnType<config>\n\n/** https://wagmi.sh/react/api/hooks/useConnectors */\nexport function useConnectors<\n  config extends Config = ResolvedRegister['config'],\n>(\n  parameters: UseConnectorsParameters<config> = {},\n): UseConnectorsReturnType<config> {\n  const config = useConfig(parameters)\n\n  return useSyncExternalStore(\n    (onChange) => watchConnectors(config, { onChange }),\n    () => getConnectors(config),\n    () => getConnectors(config),\n  )\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useContractEvents.test-d.ts",
    "content": "import { abi, type config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\nimport {\n  type UseContractEventsParameters,\n  useContractEvents,\n} from './useContractEvents.js'\n\ntest('default', () => {\n  const result = useContractEvents({\n    address: '0x',\n    abi: abi.erc20,\n    eventName: 'Transfer',\n    args: {\n      from: '0x',\n      to: '0x',\n    },\n  })\n  if (result.data) {\n    expectTypeOf(result.data[0]!.eventName).toEqualTypeOf<'Transfer'>()\n    expectTypeOf(result.data[0]!.args).toEqualTypeOf<{\n      from?: `0x${string}` | undefined\n      to?: `0x${string}` | undefined\n      value?: bigint | undefined\n    }>()\n  }\n\n  useContractEvents({\n    address: '0x',\n    abi: abi.erc20,\n    // @ts-expect-error\n    eventName: 'Foo',\n    args: {\n      from: '0x',\n      to: '0x',\n    },\n  })\n  useContractEvents({\n    address: '0x',\n    abi: abi.erc20,\n    eventName: 'Transfer',\n    args: {\n      // @ts-expect-error\n      foo: '0x',\n      to: '0x',\n    },\n  })\n})\n\ntest('behavior: strict', () => {\n  const result = useContractEvents({\n    address: '0x',\n    abi: abi.erc20,\n    strict: true,\n    eventName: 'Transfer',\n    args: {\n      from: '0x',\n      to: '0x',\n    },\n  })\n  if (result.data) {\n    expectTypeOf(result.data[0]!.eventName).toEqualTypeOf<'Transfer'>()\n    expectTypeOf(result.data[0]!.args).toEqualTypeOf<{\n      from: `0x${string}`\n      to: `0x${string}`\n      value: bigint\n    }>()\n    expectTypeOf(result.data[0]!.args).not.toEqualTypeOf<{\n      from?: `0x${string}` | undefined\n      to?: `0x${string}` | undefined\n      value?: bigint | undefined\n    }>()\n  }\n})\n\ntest('behavior: no eventName', () => {\n  type Result = UseContractEventsParameters<\n    typeof abi.erc20,\n    undefined,\n    true,\n    undefined,\n    undefined,\n    typeof config\n  >\n  expectTypeOf<Result['args']>().toEqualTypeOf<\n    | {\n        from?: `0x${string}` | `0x${string}`[] | null | undefined\n        to?: `0x${string}` | `0x${string}`[] | null | undefined\n      }\n    | {\n        owner?: `0x${string}` | `0x${string}`[] | null | undefined\n        spender?: `0x${string}` | `0x${string}`[] | null | undefined\n      }\n    | undefined\n  >()\n\n  const result = useContractEvents({\n    address: '0x',\n    abi: abi.erc20,\n    args: {\n      from: '0x',\n      to: '0x',\n    },\n  })\n  if (result.data) {\n    expectTypeOf(result.data[0]!.eventName).toEqualTypeOf<\n      'Transfer' | 'Approval'\n    >()\n    expectTypeOf(result.data[0]!.args).toEqualTypeOf<\n      | {\n          from?: `0x${string}` | undefined\n          to?: `0x${string}` | undefined\n          value?: bigint | undefined\n        }\n      | {\n          owner?: `0x${string}` | undefined\n          spender?: `0x${string}` | undefined\n          value?: bigint | undefined\n        }\n    >()\n  }\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useContractEvents.test.ts",
    "content": "import { connect, disconnect, readContract } from '@wagmi/core'\nimport { abi, address, config, testClient } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport {\n  createWalletClient,\n  erc20Abi,\n  getAddress,\n  http,\n  parseEther,\n} from 'viem'\nimport { expect, test, vi } from 'vitest'\nimport { useContractEvents } from './useContractEvents.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  const data = await connect(config, { connector })\n  const connectedAddress = data.accounts[0]\n\n  // impersonate usdc holder account and transfer usdc to connected account\n  await testClient.mainnet.impersonateAccount({ address: address.usdcHolder })\n  await testClient.mainnet.setBalance({\n    address: address.usdcHolder,\n    value: 10000000000000000000000n,\n  })\n\n  const walletClient = createWalletClient({\n    account: address.usdcHolder,\n    chain: testClient.mainnet.chain,\n    transport: http(),\n  })\n\n  await walletClient.writeContract({\n    address: address.usdc,\n    abi: abi.erc20,\n    functionName: 'transfer',\n    args: [connectedAddress, parseEther('100', 'gwei')],\n  })\n  await walletClient.writeContract({\n    address: address.usdc,\n    abi: abi.erc20,\n    functionName: 'approve',\n    args: [connectedAddress, parseEther('10', 'gwei')],\n  })\n  await testClient.mainnet.mine({ blocks: 1 })\n\n  await testClient.mainnet.stopImpersonatingAccount({\n    address: address.usdcHolder,\n  })\n\n  const balance = await readContract(config, {\n    address: address.usdc,\n    abi: erc20Abi,\n    functionName: 'balanceOf',\n    args: [connectedAddress],\n  })\n  expect(balance).toBeGreaterThan(0n)\n\n  const { result } = await renderHook(() =>\n    useContractEvents({\n      address: address.usdc,\n      abi: abi.erc20,\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const logs = result.current.data\n  expect(logs![0]!.eventName).toEqual('Transfer')\n  expect(logs![0]!.args).toEqual({\n    from: getAddress(address.usdcHolder),\n    to: getAddress(connectedAddress),\n    value: parseEther('100', 'gwei'),\n  })\n  expect(logs![1]!.eventName).toEqual('Approval')\n  expect(logs![1]!.args).toEqual({\n    owner: getAddress(address.usdcHolder),\n    spender: getAddress(connectedAddress),\n    value: parseEther('10', 'gwei'),\n  })\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useContractEvents.ts",
    "content": "'use client'\nimport type {\n  Config,\n  GetContractEventsErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { ConfigParameter, UnionCompute } from '@wagmi/core/internal'\nimport {\n  type GetContractEventsData,\n  type GetContractEventsOptions,\n  getContractEventsQueryOptions,\n} from '@wagmi/core/query'\nimport type { Abi, BlockNumber, BlockTag, ContractEventName } from 'viem'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseContractEventsParameters<\n  abi extends Abi | readonly unknown[] = Abi,\n  eventName extends ContractEventName<abi> | undefined =\n    | ContractEventName<abi>\n    | undefined,\n  strict extends boolean | undefined = undefined,\n  fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n  toBlock extends BlockNumber | BlockTag | undefined = undefined,\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetContractEventsData<\n    abi,\n    eventName,\n    strict,\n    fromBlock,\n    toBlock\n  >,\n> = UnionCompute<\n  GetContractEventsOptions<\n    abi,\n    eventName,\n    strict,\n    fromBlock,\n    toBlock,\n    config,\n    chainId,\n    selectData\n  > &\n    ConfigParameter<config>\n>\n\nexport type UseContractEventsReturnType<\n  abi extends Abi | readonly unknown[] = Abi,\n  eventName extends ContractEventName<abi> | undefined =\n    | ContractEventName<abi>\n    | undefined,\n  strict extends boolean | undefined = undefined,\n  fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n  toBlock extends BlockNumber | BlockTag | undefined = undefined,\n  selectData = GetContractEventsData<\n    abi,\n    eventName,\n    strict,\n    fromBlock,\n    toBlock\n  >,\n> = UseQueryReturnType<selectData, GetContractEventsErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useContractEvents */\nexport function useContractEvents<\n  const abi extends Abi | readonly unknown[],\n  eventName extends ContractEventName<abi> | undefined,\n  strict extends boolean | undefined = undefined,\n  fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n  toBlock extends BlockNumber | BlockTag | undefined = undefined,\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetContractEventsData<\n    abi,\n    eventName,\n    strict,\n    fromBlock,\n    toBlock\n  >,\n>(\n  parameters: UseContractEventsParameters<\n    abi,\n    eventName,\n    strict,\n    fromBlock,\n    toBlock,\n    config,\n    chainId,\n    selectData\n  > = {} as any,\n): UseContractEventsReturnType<\n  abi,\n  eventName,\n  strict,\n  fromBlock,\n  toBlock,\n  selectData\n> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = getContractEventsQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options)\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useDeployContract.test-d.ts",
    "content": "import type { DeployContractErrorType } from '@wagmi/core'\nimport { abi, bytecode } from '@wagmi/test'\nimport type { Abi, Hash } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useDeployContract } from './useDeployContract.js'\n\nconst contextValue = { foo: 'bar' } as const\n\ntest('context', () => {\n  const deployContract = useDeployContract({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n          abi: Abi\n          args?: readonly unknown[] | undefined\n        }>()\n        return contextValue\n      },\n      onError(error, variables, context) {\n        expectTypeOf(error).toEqualTypeOf<DeployContractErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n          abi: Abi\n          args?: readonly unknown[] | undefined\n        }>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<Hash>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n          abi: Abi\n          args?: readonly unknown[] | undefined\n        }>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<Hash | undefined>()\n        expectTypeOf(error).toEqualTypeOf<DeployContractErrorType | null>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n          abi: Abi\n          args?: readonly unknown[] | undefined\n        }>()\n      },\n    },\n  })\n\n  expectTypeOf(deployContract.data).toEqualTypeOf<Hash | undefined>()\n  expectTypeOf(\n    deployContract.error,\n  ).toEqualTypeOf<DeployContractErrorType | null>()\n  expectTypeOf(deployContract.variables).toMatchTypeOf<\n    { chainId?: number | undefined } | undefined\n  >()\n  expectTypeOf(deployContract.context).toEqualTypeOf<\n    typeof contextValue | undefined\n  >()\n\n  deployContract.mutate(\n    {\n      abi: abi.bayc,\n      bytecode: bytecode.bayc,\n      args: ['Bored Ape Wagmi Club', 'BAYC', 69420n, 0n],\n      chainId: 1,\n    },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(error).toEqualTypeOf<DeployContractErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n          abi: typeof abi.bayc\n          args: readonly [string, string, bigint, bigint]\n        }>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<Hash>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n          abi: typeof abi.bayc\n          args: readonly [string, string, bigint, bigint]\n        }>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<Hash | undefined>()\n        expectTypeOf(error).toEqualTypeOf<DeployContractErrorType | null>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n          abi: typeof abi.bayc\n          args: readonly [string, string, bigint, bigint]\n        }>()\n      },\n    },\n  )\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useDeployContract.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { abi, bytecode, config, transactionHashRegex } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useDeployContract } from './useDeployContract.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n  const { result } = await renderHook(() => useDeployContract())\n\n  result.current.mutate({\n    abi: abi.bayc,\n    bytecode: bytecode.bayc,\n    args: ['Bored Ape Wagmi Club', 'BAYC', 69420n, 0n],\n  })\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current.data).toMatch(transactionHashRegex)\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useDeployContract.ts",
    "content": "'use client'\nimport { useMutation } from '@tanstack/react-query'\nimport type {\n  Config,\n  DeployContractErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type DeployContractData,\n  type DeployContractMutate,\n  type DeployContractMutateAsync,\n  type DeployContractOptions,\n  type DeployContractVariables,\n  deployContractMutationOptions,\n} from '@wagmi/core/query'\nimport type { Abi } from 'viem'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseDeployContractParameters<\n  config extends Config = Config,\n  context = unknown,\n> = Compute<ConfigParameter<config> & DeployContractOptions<config, context>>\n\nexport type UseDeployContractReturnType<\n  config extends Config = Config,\n  context = unknown,\n> = UseMutationReturnType<\n  DeployContractData,\n  DeployContractErrorType,\n  DeployContractVariables<Abi, config, config['chains'][number]['id']>,\n  context,\n  DeployContractMutate<config, context>,\n  DeployContractMutateAsync<config, context>\n> & {\n  /** @deprecated use `mutate` instead */\n  deployContract: DeployContractMutate<config, context>\n  /** @deprecated use `mutateAsync` instead */\n  deployContractAsync: DeployContractMutateAsync<config, context>\n}\n\n/** https://wagmi.sh/react/api/hooks/useDeployContract */\nexport function useDeployContract<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: UseDeployContractParameters<config, context> = {},\n): UseDeployContractReturnType<config, context> {\n  const config = useConfig(parameters)\n  const options = deployContractMutationOptions(config, parameters)\n  const mutation = useMutation(options)\n  type Return = UseDeployContractReturnType<config, context>\n  return {\n    ...(mutation as Return),\n    deployContract: mutation.mutate as Return['mutate'],\n    deployContractAsync: mutation.mutateAsync as Return['mutateAsync'],\n  }\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useDisconnect.test-d.ts",
    "content": "import type { Connector, DisconnectErrorType } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useDisconnect } from './useDisconnect.js'\n\nconst connector = config.connectors[0]!\nconst contextValue = { foo: 'bar' } as const\n\ntest('parameter', () => {\n  expectTypeOf(useDisconnect().disconnect)\n    .parameter(0)\n    .toEqualTypeOf<{ connector?: Connector | undefined } | undefined>()\n  expectTypeOf(useDisconnect().disconnect)\n    .parameter(0)\n    .toEqualTypeOf<{ connector?: Connector | undefined } | undefined>()\n})\n\ntest('context', () => {\n  const { context, data, disconnect, error, variables } = useDisconnect({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toEqualTypeOf<\n          { connector?: Connector | undefined } | undefined\n        >()\n        return contextValue\n      },\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<\n          { connector?: Connector | undefined } | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<DisconnectErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<\n          { connector?: Connector | undefined } | undefined\n        >()\n        expectTypeOf(data).toEqualTypeOf<void>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<void | undefined>()\n        expectTypeOf(error).toEqualTypeOf<DisconnectErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<\n          { connector?: Connector | undefined } | undefined\n        >()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  })\n\n  expectTypeOf(data).toEqualTypeOf<void | undefined>()\n  expectTypeOf(error).toEqualTypeOf<DisconnectErrorType | null>()\n  expectTypeOf(variables).toEqualTypeOf<\n    { connector?: Connector | undefined } | undefined\n  >()\n  expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n\n  disconnect(\n    { connector },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<\n          { connector?: Connector | undefined } | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<DisconnectErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<\n          { connector?: Connector | undefined } | undefined\n        >()\n        expectTypeOf(data).toEqualTypeOf<void>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<void | undefined>()\n        expectTypeOf(error).toEqualTypeOf<DisconnectErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<\n          { connector?: Connector | undefined } | undefined\n        >()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  )\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useDisconnect.test.ts",
    "content": "import { connect } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { beforeEach, expect, test, vi } from 'vitest'\n\nimport { useConnection } from './useConnection.js'\nimport { useDisconnect } from './useDisconnect.js'\n\nconst connector = config.connectors[0]!\n\nbeforeEach(async () => {\n  await connect(config, { connector })\n})\n\ntest('default', async () => {\n  const { result } = await renderHook(() => ({\n    useConnection: useConnection(),\n    useDisconnect: useDisconnect(),\n  }))\n\n  expect(result.current.useConnection.address).toBeDefined()\n  expect(result.current.useConnection.status).toEqual('connected')\n\n  result.current.useDisconnect.mutate()\n\n  await vi.waitFor(() =>\n    expect(result.current.useConnection.isDisconnected).toBeTruthy(),\n  )\n\n  expect(result.current.useConnection.address).not.toBeDefined()\n  expect(result.current.useConnection.status).toEqual('disconnected')\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useDisconnect.ts",
    "content": "'use client'\nimport { useMutation } from '@tanstack/react-query'\nimport type { Connector, DisconnectErrorType } from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type DisconnectData,\n  type DisconnectMutate,\n  type DisconnectMutateAsync,\n  type DisconnectOptions,\n  type DisconnectVariables,\n  disconnectMutationOptions,\n} from '@wagmi/core/query'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\nimport { useConnections } from './useConnections.js'\n\nexport type UseDisconnectParameters<context = unknown> = Compute<\n  ConfigParameter & DisconnectOptions<context>\n>\n\nexport type UseDisconnectReturnType<context = unknown> = Compute<\n  UseMutationReturnType<\n    DisconnectData,\n    DisconnectErrorType,\n    DisconnectVariables,\n    context,\n    DisconnectMutate<context>,\n    DisconnectMutateAsync<context>\n  > & {\n    /** @deprecated use `useConnections` instead */\n    connectors: readonly Connector[]\n    /** @deprecated use `mutate` instead */\n    disconnect: DisconnectMutate<context>\n    /** @deprecated use `mutateAsync` instead */\n    disconnectAsync: DisconnectMutateAsync<context>\n  }\n>\n\n/** https://wagmi.sh/react/api/hooks/useDisconnect */\nexport function useDisconnect<context = unknown>(\n  parameters: UseDisconnectParameters<context> = {},\n): UseDisconnectReturnType<context> {\n  const config = useConfig(parameters)\n  const options = disconnectMutationOptions(config, parameters)\n  const mutation = useMutation(options)\n  type Return = UseDisconnectReturnType<context>\n  return {\n    ...(mutation as Return),\n    connectors: useConnections({ config }).map(\n      (connection) => connection.connector,\n    ),\n    disconnect: mutation.mutate as Return['mutate'],\n    disconnectAsync: mutation.mutateAsync as Return['mutateAsync'],\n  }\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useEnsAddress.test.ts",
    "content": "import { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useEnsAddress } from './useEnsAddress.js'\n\ntest('default', async () => {\n  const { result } = await renderHook(() =>\n    useEnsAddress({\n      name: 'wevm.eth',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": \"0xd2135CfB216b74109775236E36d4b433F1DF507B\",\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"ensAddress\",\n        {\n          \"chainId\": 1,\n          \"name\": \"wevm.eth\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useEnsAddress.ts",
    "content": "'use client'\nimport type {\n  Config,\n  GetEnsAddressErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetEnsAddressData,\n  type GetEnsAddressOptions,\n  getEnsAddressQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseEnsAddressParameters<\n  config extends Config = Config,\n  selectData = GetEnsAddressData,\n> = Compute<GetEnsAddressOptions<config, selectData> & ConfigParameter<config>>\n\nexport type UseEnsAddressReturnType<selectData = GetEnsAddressData> =\n  UseQueryReturnType<selectData, GetEnsAddressErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useEnsAddress */\nexport function useEnsAddress<\n  config extends Config = ResolvedRegister['config'],\n  selectData = GetEnsAddressData,\n>(\n  parameters: UseEnsAddressParameters<config, selectData> = {},\n): UseEnsAddressReturnType<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = getEnsAddressQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options)\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useEnsAvatar.test.ts",
    "content": "import { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useEnsAvatar } from './useEnsAvatar.js'\n\ntest('default', async () => {\n  const { result } = await renderHook(() =>\n    useEnsAvatar({\n      name: 'wevm.eth',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": \"https://euc.li/wevm.eth\",\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"ensAvatar\",\n        {\n          \"chainId\": 1,\n          \"name\": \"wevm.eth\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useEnsAvatar.ts",
    "content": "'use client'\nimport type {\n  Config,\n  GetEnsAvatarErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetEnsAvatarData,\n  type GetEnsAvatarOptions,\n  getEnsAvatarQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseEnsAvatarParameters<\n  config extends Config = Config,\n  selectData = GetEnsAvatarData,\n> = Compute<GetEnsAvatarOptions<config, selectData> & ConfigParameter<config>>\n\nexport type UseEnsAvatarReturnType<selectData = GetEnsAvatarData> =\n  UseQueryReturnType<selectData, GetEnsAvatarErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useEnsAvatar */\nexport function useEnsAvatar<\n  config extends Config = ResolvedRegister['config'],\n  selectData = GetEnsAvatarData,\n>(\n  parameters: UseEnsAvatarParameters<config, selectData> = {},\n): UseEnsAvatarReturnType<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = getEnsAvatarQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options)\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useEnsName.test.ts",
    "content": "import { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useEnsName } from './useEnsName.js'\n\ntest('default', async () => {\n  const { result } = await renderHook(() =>\n    useEnsName({\n      address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": \"wevm.eth\",\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"ensName\",\n        {\n          \"address\": \"0xd2135CfB216b74109775236E36d4b433F1DF507B\",\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useEnsName.ts",
    "content": "'use client'\nimport type { Config, GetEnsNameErrorType, ResolvedRegister } from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetEnsNameData,\n  type GetEnsNameOptions,\n  getEnsNameQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseEnsNameParameters<\n  config extends Config = Config,\n  selectData = GetEnsNameData,\n> = Compute<GetEnsNameOptions<config, selectData> & ConfigParameter<config>>\n\nexport type UseEnsNameReturnType<selectData = GetEnsNameData> =\n  UseQueryReturnType<selectData, GetEnsNameErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useEnsName */\nexport function useEnsName<\n  config extends Config = ResolvedRegister['config'],\n  selectData = GetEnsNameData,\n>(\n  parameters: UseEnsNameParameters<config, selectData> = {},\n): UseEnsNameReturnType<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = getEnsNameQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options)\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useEnsResolver.test.ts",
    "content": "import { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useEnsResolver } from './useEnsResolver.js'\n\ntest('default', async () => {\n  const { result } = await renderHook(() =>\n    useEnsResolver({\n      name: 'wevm.eth',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": \"0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41\",\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"ensResolver\",\n        {\n          \"chainId\": 1,\n          \"name\": \"wevm.eth\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useEnsResolver.ts",
    "content": "'use client'\nimport type {\n  Config,\n  GetEnsResolverErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetEnsResolverData,\n  type GetEnsResolverOptions,\n  getEnsResolverQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseEnsResolverParameters<\n  config extends Config = Config,\n  selectData = GetEnsResolverData,\n> = Compute<GetEnsResolverOptions<config, selectData> & ConfigParameter<config>>\n\nexport type UseEnsResolverReturnType<selectData = GetEnsResolverData> =\n  UseQueryReturnType<selectData, GetEnsResolverErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useEnsResolver */\nexport function useEnsResolver<\n  config extends Config = ResolvedRegister['config'],\n  selectData = GetEnsResolverData,\n>(\n  parameters: UseEnsResolverParameters<config, selectData> = {},\n): UseEnsResolverReturnType<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = getEnsResolverQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options)\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useEnsText.test.ts",
    "content": "import { wait } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useEnsText } from './useEnsText.js'\n\ntest('default', async () => {\n  const { result } = await renderHook(() =>\n    useEnsText({\n      key: 'com.twitter',\n      name: 'wevm.eth',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": \"wevm_dev\",\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"ensText\",\n        {\n          \"chainId\": 1,\n          \"key\": \"com.twitter\",\n          \"name\": \"wevm.eth\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('behavior: name: undefined -> defined', async () => {\n  const { result, rerender } = await renderHook(\n    (props) =>\n      useEnsText({\n        key: 'com.twitter',\n        name: props?.name,\n      }),\n    { initialProps: { name: undefined as string | undefined } },\n  )\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": undefined,\n      \"dataUpdatedAt\": 0,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": false,\n      \"isFetchedAfterMount\": false,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": true,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": false,\n      \"isSuccess\": false,\n      \"queryKey\": [\n        \"ensText\",\n        {\n          \"chainId\": 1,\n          \"key\": \"com.twitter\",\n          \"name\": undefined,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"pending\",\n    }\n  `)\n\n  rerender({ name: 'wevm.eth' })\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": \"wevm_dev\",\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"ensText\",\n        {\n          \"chainId\": 1,\n          \"key\": \"com.twitter\",\n          \"name\": \"wevm.eth\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('behavior: disabled when properties missing', async () => {\n  const { result } = await renderHook(() => useEnsText())\n\n  await wait(100)\n  await vi.waitFor(() => expect(result.current.isPending).toBeTruthy())\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useEnsText.ts",
    "content": "'use client'\nimport type { Config, GetEnsTextErrorType, ResolvedRegister } from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetEnsTextData,\n  type GetEnsTextOptions,\n  getEnsTextQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseEnsTextParameters<\n  config extends Config = Config,\n  selectData = GetEnsTextData,\n> = Compute<GetEnsTextOptions<config, selectData> & ConfigParameter<config>>\n\nexport type UseEnsTextReturnType<selectData = GetEnsTextData> =\n  UseQueryReturnType<selectData, GetEnsTextErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useEnsText */\nexport function useEnsText<\n  config extends Config = ResolvedRegister['config'],\n  selectData = GetEnsTextData,\n>(\n  parameters: UseEnsTextParameters<config, selectData> = {},\n): UseEnsTextReturnType<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = getEnsTextQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options)\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useEstimateFeesPerGas.test-d.ts",
    "content": "import { expectTypeOf, test } from 'vitest'\nimport { useEstimateFeesPerGas } from './useEstimateFeesPerGas.js'\n\ntest('types', () => {\n  const result = useEstimateFeesPerGas()\n  expectTypeOf(result.data).toMatchTypeOf<\n    | {\n        gasPrice?: undefined\n        maxFeePerGas: bigint\n        maxPriorityFeePerGas: bigint\n      }\n    | undefined\n  >()\n\n  const result2 = useEstimateFeesPerGas({ type: 'legacy' })\n  expectTypeOf(result2.data).toMatchTypeOf<\n    | {\n        gasPrice: bigint\n        maxFeePerGas?: undefined\n        maxPriorityFeePerGas?: undefined\n      }\n    | undefined\n  >()\n\n  const result3 = useEstimateFeesPerGas({ type: 'eip1559' })\n  expectTypeOf(result3.data).toMatchTypeOf<\n    | {\n        gasPrice?: undefined\n        maxFeePerGas: bigint\n        maxPriorityFeePerGas: bigint\n      }\n    | undefined\n  >()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useEstimateFeesPerGas.test.ts",
    "content": "import { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useEstimateFeesPerGas } from './useEstimateFeesPerGas.js'\n\ntest('default', async () => {\n  const { result } = await renderHook(() => useEstimateFeesPerGas())\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(Object.keys(result.current.data!)).toMatchInlineSnapshot(`\n    [\n      \"gasPrice\",\n      \"maxFeePerGas\",\n      \"maxPriorityFeePerGas\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useEstimateFeesPerGas.ts",
    "content": "'use client'\nimport type {\n  Config,\n  EstimateFeesPerGasErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type EstimateFeesPerGasData,\n  type EstimateFeesPerGasOptions,\n  estimateFeesPerGasQueryOptions,\n} from '@wagmi/core/query'\nimport type { FeeValuesType } from 'viem'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseEstimateFeesPerGasParameters<\n  type extends FeeValuesType = FeeValuesType,\n  config extends Config = Config,\n  selectData = EstimateFeesPerGasData<type>,\n> = Compute<\n  EstimateFeesPerGasOptions<type, config, selectData> & ConfigParameter<config>\n>\n\nexport type UseEstimateFeesPerGasReturnType<\n  type extends FeeValuesType = FeeValuesType,\n  selectData = EstimateFeesPerGasData<type>,\n> = UseQueryReturnType<selectData, EstimateFeesPerGasErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useEstimateFeesPerGas */\nexport function useEstimateFeesPerGas<\n  config extends Config = ResolvedRegister['config'],\n  type extends FeeValuesType = 'eip1559',\n  selectData = EstimateFeesPerGasData<type>,\n>(\n  parameters: UseEstimateFeesPerGasParameters<type, config, selectData> = {},\n): UseEstimateFeesPerGasReturnType<type, selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = estimateFeesPerGasQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options)\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useEstimateGas.test-d.ts",
    "content": "import { expectTypeOf, test } from 'vitest'\n\nimport { useEstimateGas } from './useEstimateGas.js'\n\ntest('select data', () => {\n  const result = useEstimateGas({\n    query: {\n      select(data) {\n        return data.toString()\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<string | undefined>()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useEstimateGas.test.ts",
    "content": "import { accounts } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { type Address, parseEther } from 'viem'\nimport { expect, test, vi } from 'vitest'\n\nimport { useEstimateGas } from './useEstimateGas.js'\n\ntest('default', async () => {\n  const { result } = await renderHook(() =>\n    useEstimateGas({\n      account: accounts[0],\n      to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      value: parseEther('0.01'),\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": 21000n,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"estimateGas\",\n        {\n          \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"chainId\": 1,\n          \"to\": \"0xd2135CfB216b74109775236E36d4b433F1DF507B\",\n          \"value\": 10000000000000000n,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('behavior: address: undefined -> defined', async () => {\n  const { result, rerender } = await renderHook(\n    (props) => useEstimateGas({ account: props?.account }),\n    { initialProps: { account: undefined as Address | undefined } },\n  )\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": undefined,\n      \"dataUpdatedAt\": 0,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": false,\n      \"isFetchedAfterMount\": false,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": true,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": false,\n      \"isSuccess\": false,\n      \"queryKey\": [\n        \"estimateGas\",\n        {\n          \"account\": undefined,\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"pending\",\n    }\n  `)\n\n  rerender({ account: accounts[0] })\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": 53001n,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"estimateGas\",\n        {\n          \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useEstimateGas.ts",
    "content": "'use client'\nimport type {\n  Config,\n  EstimateGasErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type EstimateGasData,\n  type EstimateGasOptions,\n  estimateGasQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\nimport { useConnection } from './useConnection.js'\n\nexport type UseEstimateGasParameters<\n  config extends Config = Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  selectData = EstimateGasData,\n> = EstimateGasOptions<config, chainId, selectData> & ConfigParameter<config>\n\nexport type UseEstimateGasReturnType<selectData = EstimateGasData> =\n  UseQueryReturnType<selectData, EstimateGasErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useEstimateGas */\nexport function useEstimateGas<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  selectData = EstimateGasData,\n>(\n  parameters?: UseEstimateGasParameters<config, chainId, selectData>,\n): UseEstimateGasReturnType<selectData>\n\nexport function useEstimateGas(\n  parameters: UseEstimateGasParameters = {},\n): UseEstimateGasReturnType {\n  const config = useConfig(parameters)\n  const { address, connector } = useConnection()\n  const chainId = useChainId({ config })\n  const options = estimateGasQueryOptions(config, {\n    ...parameters,\n    account: parameters.account ?? address,\n    chainId: parameters.chainId ?? chainId,\n    connector: parameters.connector ?? connector,\n  })\n  return useQuery(options)\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useEstimateMaxPriorityFeePerGas.test-d.ts",
    "content": "import { expectTypeOf, test } from 'vitest'\nimport { useEstimateMaxPriorityFeePerGas } from './useEstimateMaxPriorityFeePerGas.js'\n\ntest('select data', () => {\n  const result = useEstimateMaxPriorityFeePerGas({\n    query: {\n      select(data) {\n        return data.toString()\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<string | undefined>()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useEstimateMaxPriorityFeePerGas.test.ts",
    "content": "import { chain, testClient } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useEstimateMaxPriorityFeePerGas } from './useEstimateMaxPriorityFeePerGas.js'\n\ntest('default', async () => {\n  await testClient.mainnet.restart()\n\n  const { result } = await renderHook(() => useEstimateMaxPriorityFeePerGas())\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, ...rest } = result.current\n  expect(data).toBeTypeOf('bigint')\n  expect(rest).toMatchInlineSnapshot(`\n  {\n    \"dataUpdatedAt\": 1675209600000,\n    \"error\": null,\n    \"errorUpdateCount\": 0,\n    \"errorUpdatedAt\": 0,\n    \"failureCount\": 0,\n    \"failureReason\": null,\n    \"fetchStatus\": \"idle\",\n    \"isError\": false,\n    \"isFetched\": true,\n    \"isFetchedAfterMount\": true,\n    \"isFetching\": false,\n    \"isInitialLoading\": false,\n    \"isLoading\": false,\n    \"isLoadingError\": false,\n    \"isPaused\": false,\n    \"isPending\": false,\n    \"isPlaceholderData\": false,\n    \"isRefetchError\": false,\n    \"isRefetching\": false,\n    \"isStale\": true,\n    \"isSuccess\": true,\n    \"queryKey\": [\n      \"estimateMaxPriorityFeePerGas\",\n      {\n        \"chainId\": 1,\n      },\n    ],\n    \"refetch\": [Function],\n    \"status\": \"success\",\n  }\n  `)\n})\n\ntest('parameters: chainId', async () => {\n  await testClient.mainnet2.restart()\n  await testClient.mainnet2.mine({ blocks: 1 })\n\n  const { result } = await renderHook(() =>\n    useEstimateMaxPriorityFeePerGas({ chainId: chain.mainnet2.id }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, ...rest } = result.current\n  expect(data).toBeTypeOf('bigint')\n  expect(rest).toMatchInlineSnapshot(`\n  {\n    \"dataUpdatedAt\": 1675209600000,\n    \"error\": null,\n    \"errorUpdateCount\": 0,\n    \"errorUpdatedAt\": 0,\n    \"failureCount\": 0,\n    \"failureReason\": null,\n    \"fetchStatus\": \"idle\",\n    \"isError\": false,\n    \"isFetched\": true,\n    \"isFetchedAfterMount\": true,\n    \"isFetching\": false,\n    \"isInitialLoading\": false,\n    \"isLoading\": false,\n    \"isLoadingError\": false,\n    \"isPaused\": false,\n    \"isPending\": false,\n    \"isPlaceholderData\": false,\n    \"isRefetchError\": false,\n    \"isRefetching\": false,\n    \"isStale\": true,\n    \"isSuccess\": true,\n    \"queryKey\": [\n      \"estimateMaxPriorityFeePerGas\",\n      {\n        \"chainId\": 456,\n      },\n    ],\n    \"refetch\": [Function],\n    \"status\": \"success\",\n  }\n  `)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useEstimateMaxPriorityFeePerGas.ts",
    "content": "'use client'\nimport type {\n  Config,\n  EstimateMaxPriorityFeePerGasErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type EstimateMaxPriorityFeePerGasData,\n  type EstimateMaxPriorityFeePerGasOptions,\n  estimateMaxPriorityFeePerGasQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseEstimateMaxPriorityFeePerGasParameters<\n  config extends Config = Config,\n  selectData = EstimateMaxPriorityFeePerGasData,\n> = Compute<\n  EstimateMaxPriorityFeePerGasOptions<config, selectData> &\n    ConfigParameter<config>\n>\n\nexport type UseEstimateMaxPriorityFeePerGasReturnType<\n  selectData = EstimateMaxPriorityFeePerGasData,\n> = UseQueryReturnType<selectData, EstimateMaxPriorityFeePerGasErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useEstimateMaxPriorityFeePerGas */\nexport function useEstimateMaxPriorityFeePerGas<\n  config extends Config = ResolvedRegister['config'],\n  selectData = EstimateMaxPriorityFeePerGasData,\n>(\n  parameters: UseEstimateMaxPriorityFeePerGasParameters<\n    config,\n    selectData\n  > = {},\n): UseEstimateMaxPriorityFeePerGasReturnType<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = estimateMaxPriorityFeePerGasQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options)\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useFeeHistory.test-d.ts",
    "content": "import { expectTypeOf, test } from 'vitest'\n\nimport { useFeeHistory } from './useFeeHistory.js'\n\ntest('select data', () => {\n  const result = useFeeHistory({\n    query: {\n      select(data) {\n        return data.gasUsedRatio\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<number[] | undefined>()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useFeeHistory.test.ts",
    "content": "import { chain, wait } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useFeeHistory } from './useFeeHistory.js'\n\ntest('default', async () => {\n  const { result } = await renderHook(() =>\n    useFeeHistory({\n      blockCount: 4,\n      rewardPercentiles: [25, 75],\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, ...rest } = result.current\n  expect(data).toMatchObject({\n    baseFeePerGas: expect.arrayContaining([expect.any(BigInt)]),\n    gasUsedRatio: expect.arrayContaining([expect.any(Number)]),\n    oldestBlock: expect.any(BigInt),\n    reward: expect.any(Array),\n  })\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"feeHistory\",\n        {\n          \"blockCount\": 4,\n          \"chainId\": 1,\n          \"rewardPercentiles\": [\n            25,\n            75,\n          ],\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: chainId', async () => {\n  const { result } = await renderHook(() =>\n    useFeeHistory({\n      blockCount: 4,\n      rewardPercentiles: [25, 75],\n      chainId: chain.mainnet2.id,\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, ...rest } = result.current\n  expect(data).toMatchObject({\n    baseFeePerGas: expect.arrayContaining([expect.any(BigInt)]),\n    gasUsedRatio: expect.arrayContaining([expect.any(Number)]),\n    oldestBlock: expect.any(BigInt),\n    reward: expect.any(Array),\n  })\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"feeHistory\",\n        {\n          \"blockCount\": 4,\n          \"chainId\": 456,\n          \"rewardPercentiles\": [\n            25,\n            75,\n          ],\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: blockNumber', async () => {\n  const { result } = await renderHook(() =>\n    useFeeHistory({\n      blockCount: 4,\n      rewardPercentiles: [25, 75],\n      blockNumber: 18677379n,\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, ...rest } = result.current\n  expect(data).toMatchObject({\n    baseFeePerGas: expect.arrayContaining([expect.any(BigInt)]),\n    gasUsedRatio: expect.arrayContaining([expect.any(Number)]),\n    oldestBlock: expect.any(BigInt),\n    reward: expect.any(Array),\n  })\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"feeHistory\",\n        {\n          \"blockCount\": 4,\n          \"blockNumber\": 18677379n,\n          \"chainId\": 1,\n          \"rewardPercentiles\": [\n            25,\n            75,\n          ],\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: blockTag', async () => {\n  const { result } = await renderHook(() =>\n    useFeeHistory({\n      blockCount: 4,\n      rewardPercentiles: [25, 75],\n      blockTag: 'safe',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, ...rest } = result.current\n  expect(data).toMatchObject({\n    baseFeePerGas: expect.arrayContaining([expect.any(BigInt)]),\n    gasUsedRatio: expect.arrayContaining([expect.any(Number)]),\n    oldestBlock: expect.any(BigInt),\n    reward: expect.any(Array),\n  })\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"feeHistory\",\n        {\n          \"blockCount\": 4,\n          \"blockTag\": \"safe\",\n          \"chainId\": 1,\n          \"rewardPercentiles\": [\n            25,\n            75,\n          ],\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('behavior: blockCount: undefined -> defined', async () => {\n  const { result, rerender } = await renderHook(\n    (props) =>\n      useFeeHistory({\n        blockCount: props?.blockCount,\n        rewardPercentiles: [25, 75],\n      }),\n    { initialProps: { blockCount: undefined as number | undefined } },\n  )\n\n  {\n    const { data, ...rest } = result.current\n    expect(data).toBeTypeOf('undefined')\n    expect(rest).toMatchInlineSnapshot(`\n      {\n        \"dataUpdatedAt\": 0,\n        \"error\": null,\n        \"errorUpdateCount\": 0,\n        \"errorUpdatedAt\": 0,\n        \"failureCount\": 0,\n        \"failureReason\": null,\n        \"fetchStatus\": \"idle\",\n        \"isError\": false,\n        \"isFetched\": false,\n        \"isFetchedAfterMount\": false,\n        \"isFetching\": false,\n        \"isInitialLoading\": false,\n        \"isLoading\": false,\n        \"isLoadingError\": false,\n        \"isPaused\": false,\n        \"isPending\": true,\n        \"isPlaceholderData\": false,\n        \"isRefetchError\": false,\n        \"isRefetching\": false,\n        \"isStale\": false,\n        \"isSuccess\": false,\n        \"queryKey\": [\n          \"feeHistory\",\n          {\n            \"blockCount\": undefined,\n            \"chainId\": 1,\n            \"rewardPercentiles\": [\n              25,\n              75,\n            ],\n          },\n        ],\n        \"refetch\": [Function],\n        \"status\": \"pending\",\n      }\n    `)\n  }\n\n  rerender({ blockCount: 4 })\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, ...rest } = result.current\n  expect(data).toMatchObject({\n    baseFeePerGas: expect.arrayContaining([expect.any(BigInt)]),\n    gasUsedRatio: expect.arrayContaining([expect.any(Number)]),\n    oldestBlock: expect.any(BigInt),\n    reward: expect.any(Array),\n  })\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"feeHistory\",\n        {\n          \"blockCount\": 4,\n          \"chainId\": 1,\n          \"rewardPercentiles\": [\n            25,\n            75,\n          ],\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('behavior: rewardPercentiles: undefined -> defined', async () => {\n  const { result, rerender } = await renderHook(\n    (props) =>\n      useFeeHistory({\n        blockCount: 4,\n        rewardPercentiles: props?.rewardPercentiles,\n      }),\n    { initialProps: { rewardPercentiles: undefined as number[] | undefined } },\n  )\n\n  {\n    const { data, ...rest } = result.current\n    expect(data).toBeTypeOf('undefined')\n    expect(rest).toMatchInlineSnapshot(`\n      {\n        \"dataUpdatedAt\": 0,\n        \"error\": null,\n        \"errorUpdateCount\": 0,\n        \"errorUpdatedAt\": 0,\n        \"failureCount\": 0,\n        \"failureReason\": null,\n        \"fetchStatus\": \"idle\",\n        \"isError\": false,\n        \"isFetched\": false,\n        \"isFetchedAfterMount\": false,\n        \"isFetching\": false,\n        \"isInitialLoading\": false,\n        \"isLoading\": false,\n        \"isLoadingError\": false,\n        \"isPaused\": false,\n        \"isPending\": true,\n        \"isPlaceholderData\": false,\n        \"isRefetchError\": false,\n        \"isRefetching\": false,\n        \"isStale\": false,\n        \"isSuccess\": false,\n        \"queryKey\": [\n          \"feeHistory\",\n          {\n            \"blockCount\": 4,\n            \"chainId\": 1,\n            \"rewardPercentiles\": undefined,\n          },\n        ],\n        \"refetch\": [Function],\n        \"status\": \"pending\",\n      }\n    `)\n  }\n\n  rerender({ rewardPercentiles: [25, 75] })\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, ...rest } = result.current\n  expect(data).toMatchObject({\n    baseFeePerGas: expect.arrayContaining([expect.any(BigInt)]),\n    gasUsedRatio: expect.arrayContaining([expect.any(Number)]),\n    oldestBlock: expect.any(BigInt),\n    reward: expect.any(Array),\n  })\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"feeHistory\",\n        {\n          \"blockCount\": 4,\n          \"chainId\": 1,\n          \"rewardPercentiles\": [\n            25,\n            75,\n          ],\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('behavior: disabled when properties missing', async () => {\n  const { result } = await renderHook(() => useFeeHistory())\n\n  await wait(100)\n  await vi.waitFor(() => expect(result.current.isPending).toBeTruthy())\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useFeeHistory.ts",
    "content": "'use client'\nimport type {\n  Config,\n  GetFeeHistoryErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetFeeHistoryData,\n  type GetFeeHistoryOptions,\n  getFeeHistoryQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseFeeHistoryParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetFeeHistoryData,\n> = Compute<\n  GetFeeHistoryOptions<config, chainId, selectData> & ConfigParameter<config>\n>\n\nexport type UseFeeHistoryReturnType<selectData = GetFeeHistoryData> =\n  UseQueryReturnType<selectData, GetFeeHistoryErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useFeeHistory */\nexport function useFeeHistory<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetFeeHistoryData,\n>(\n  parameters: UseFeeHistoryParameters<config, chainId, selectData> = {},\n): UseFeeHistoryReturnType<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = getFeeHistoryQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options)\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useGasPrice.test-d.ts",
    "content": "import { expectTypeOf, test } from 'vitest'\n\nimport { useGasPrice } from './useGasPrice.js'\n\ntest('select data', () => {\n  const result = useGasPrice({\n    query: {\n      select(data) {\n        return data?.toString()\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<string | undefined>()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useGasPrice.test.ts",
    "content": "import { chain, testClient } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useGasPrice } from './useGasPrice.js'\n\ntest('default', async () => {\n  await testClient.mainnet.restart()\n\n  await testClient.mainnet.setNextBlockBaseFeePerGas({\n    baseFeePerGas: 2_000_000_000n,\n  })\n  await testClient.mainnet.mine({ blocks: 1 })\n\n  const { result } = await renderHook(() => useGasPrice())\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": 2750000000n,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"gasPrice\",\n        {\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest.skip('parameters: chainId', async () => {\n  await testClient.mainnet2.restart()\n\n  await testClient.mainnet2.setNextBlockBaseFeePerGas({\n    baseFeePerGas: 1_000_000_000n,\n  })\n  await testClient.mainnet2.mine({ blocks: 1 })\n\n  const { result } = await renderHook(() =>\n    useGasPrice({ chainId: chain.mainnet2.id }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": 1875000000n,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"gasPrice\",\n        {\n          \"chainId\": 456,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useGasPrice.ts",
    "content": "'use client'\nimport type {\n  Config,\n  GetGasPriceErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetGasPriceData,\n  type GetGasPriceOptions,\n  getGasPriceQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseGasPriceParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetGasPriceData,\n> = Compute<\n  GetGasPriceOptions<config, chainId, selectData> & ConfigParameter<config>\n>\n\nexport type UseGasPriceReturnType<selectData = GetGasPriceData> =\n  UseQueryReturnType<selectData, GetGasPriceErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useGasPrice */\nexport function useGasPrice<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetGasPriceData,\n>(\n  parameters: UseGasPriceParameters<config, chainId, selectData> = {},\n): UseGasPriceReturnType<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = getGasPriceQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options)\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useInfiniteReadContracts.test-d.ts",
    "content": "import { abi } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useInfiniteReadContracts } from './useInfiniteReadContracts.js'\n\ntest('select data', () => {\n  const result = useInfiniteReadContracts({\n    allowFailure: false,\n    cacheKey: 'foo',\n    contracts(pageParam) {\n      expectTypeOf(pageParam).toEqualTypeOf<string>()\n      return [\n        {\n          address: '0x',\n          abi: abi.erc20,\n          functionName: 'balanceOf',\n          args: ['0x'],\n        },\n        {\n          address: '0x',\n          abi: abi.wagmiMintExample,\n          functionName: 'tokenURI',\n          args: [123n],\n        },\n      ]\n    },\n    query: {\n      initialPageParam: '0',\n      getNextPageParam(lastPage, allPages, lastPageParam, allPageParams) {\n        expectTypeOf(lastPage).toEqualTypeOf<[bigint, string]>()\n        expectTypeOf(allPages).toEqualTypeOf<[bigint, string][]>()\n        expectTypeOf(lastPageParam).toEqualTypeOf<string>()\n        expectTypeOf(allPageParams).toEqualTypeOf<string[]>()\n        return lastPageParam + 1\n      },\n      select(data) {\n        expectTypeOf(data.pageParams[0]!).toEqualTypeOf<string>()\n        expectTypeOf(data.pages[0]!).toEqualTypeOf<[bigint, string]>()\n        return data.pages[0]?.[0]!\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<bigint | undefined>()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useInfiniteReadContracts.test.ts",
    "content": "import { abi, address, wait } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useInfiniteReadContracts } from './useInfiniteReadContracts.js'\n\ntest('default', async () => {\n  const limit = 3\n\n  const { result } = await renderHook(() =>\n    useInfiniteReadContracts({\n      cacheKey: 'foo',\n      contracts(pageParam) {\n        return [...new Array(limit)].map(\n          (_, i) =>\n            ({\n              address: address.shields,\n              abi: abi.shields,\n              functionName: 'tokenURI',\n              args: [BigInt(pageParam + i + 1)],\n            }) as const,\n        )\n      },\n      query: {\n        initialPageParam: 0,\n        getNextPageParam(_lastPage, _allPages, lastPageParam) {\n          return lastPageParam + limit\n        },\n        select(data) {\n          const results = []\n          for (const page of data.pages) {\n            for (const response of page) {\n              if (response.status === 'success') {\n                const decoded = atob(\n                  response.result.replace(/(^.*base64,)/, ''),\n                )\n                const json = JSON.parse(decoded) as { name: string }\n                results.push(json.name)\n              } else results.push('Error fetching shield')\n            }\n          }\n          return results\n        },\n      },\n    }),\n  )\n  await wait(0)\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n  expect(result.current.data).toMatchInlineSnapshot(`\n    [\n      \"Three Shields on Pink Perfect\",\n      \"Three Shields on Sky Perfect\",\n      \"Three Shields on Evergreen Perfect\",\n    ]\n  `)\n\n  await result.current.fetchNextPage()\n  await wait(0)\n\n  await vi.waitFor(() => expect(result.current.hasNextPage).toBeTruthy())\n  expect(result.current.data).toMatchInlineSnapshot(`\n    [\n      \"Three Shields on Pink Perfect\",\n      \"Three Shields on Sky Perfect\",\n      \"Three Shields on Evergreen Perfect\",\n      \"Three Shields on Hi-Vis Perfect\",\n      \"Three Shields on Gray Perfect\",\n      \"Everlasting: Tracery on Onyx and Pink Razor Bordure\",\n    ]\n  `)\n\n  await result.current.fetchNextPage()\n  await wait(0)\n\n  await vi.waitFor(() => expect(result.current.hasNextPage).toBeTruthy())\n  expect(result.current.data).toMatchInlineSnapshot(`\n    [\n      \"Three Shields on Pink Perfect\",\n      \"Three Shields on Sky Perfect\",\n      \"Three Shields on Evergreen Perfect\",\n      \"Three Shields on Hi-Vis Perfect\",\n      \"Three Shields on Gray Perfect\",\n      \"Everlasting: Tracery on Onyx and Pink Razor Bordure\",\n      \"The Book of Shields on Pink Perfect\",\n      \"Menacing: Necklace on Evergreen and Hi-Vis Chief Indented\",\n      \"Secured: Telescope and Stars on Ultraviolet and Sky Doppler\",\n    ]\n  `)\n}, 20_000)\n"
  },
  {
    "path": "packages/react/src/hooks/useInfiniteReadContracts.ts",
    "content": "'use client'\nimport type {\n  Config,\n  ReadContractsErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type InfiniteReadContractsQueryFnData,\n  type InfiniteReadContractsQueryKey,\n  infiniteReadContractsQueryOptions,\n  structuralSharing,\n} from '@wagmi/core/query'\nimport type { ContractFunctionParameters } from 'viem'\nimport type {\n  InfiniteReadContractsData,\n  InfiniteReadContractsOptions,\n} from '../exports/query.js'\nimport type { InfiniteQueryParameter } from '../types/properties.js'\nimport {\n  type UseInfiniteQueryParameters,\n  type UseInfiniteQueryReturnType,\n  useInfiniteQuery,\n} from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseInfiniteContractReadsParameters<\n  contracts extends readonly unknown[] = readonly ContractFunctionParameters[],\n  allowFailure extends boolean = true,\n  config extends Config = Config,\n  pageParam = unknown,\n  selectData = InfiniteReadContractsData<contracts, allowFailure>,\n> = InfiniteReadContractsOptions<contracts, allowFailure, pageParam, config> &\n  ConfigParameter<config> &\n  InfiniteQueryParameter<\n    InfiniteReadContractsQueryFnData<contracts, allowFailure>,\n    ReadContractsErrorType,\n    selectData,\n    InfiniteReadContractsData<contracts, allowFailure>,\n    InfiniteReadContractsQueryKey<contracts, allowFailure, pageParam, config>,\n    pageParam\n  >\n\nexport type UseInfiniteContractReadsReturnType<\n  contracts extends readonly unknown[] = readonly ContractFunctionParameters[],\n  allowFailure extends boolean = true,\n  selectData = InfiniteReadContractsData<contracts, allowFailure>,\n> = UseInfiniteQueryReturnType<selectData, ReadContractsErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useInfiniteReadContracts */\nexport function useInfiniteReadContracts<\n  const contracts extends readonly unknown[],\n  allowFailure extends boolean = true,\n  config extends Config = ResolvedRegister['config'],\n  pageParam = unknown,\n  selectData = InfiniteReadContractsData<contracts, allowFailure>,\n>(\n  parameters: UseInfiniteContractReadsParameters<\n    contracts,\n    allowFailure,\n    config,\n    pageParam,\n    selectData\n  >,\n): UseInfiniteContractReadsReturnType<contracts, allowFailure, selectData> {\n  const { contracts = [], query } = parameters\n\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n\n  const options = infiniteReadContractsQueryOptions(config, {\n    ...parameters,\n    chainId,\n    contracts: contracts as UseInfiniteContractReadsParameters['contracts'],\n    query: query as UseInfiniteQueryParameters,\n  })\n\n  return useInfiniteQuery({\n    ...(query as any),\n    ...options,\n    initialPageParam: options.initialPageParam,\n    structuralSharing: query.structuralSharing ?? structuralSharing,\n  })\n}\n"
  },
  {
    "path": "packages/react/src/hooks/usePrepareTransactionRequest.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport type { PrepareTransactionRequestReturnType } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { usePrepareTransactionRequest } from './usePrepareTransactionRequest.js'\n\ntest('select data', () => {\n  const result = usePrepareTransactionRequest({\n    query: {\n      select(data) {\n        return data\n      },\n    },\n  })\n\n  expectTypeOf(result.data).toMatchTypeOf<\n    PrepareTransactionRequestReturnType | undefined\n  >()\n})\n\ntest('parameters: config', () => {\n  const result = usePrepareTransactionRequest({\n    config,\n    chainId: 456,\n  })\n  if (result.data) expectTypeOf(result.data.chainId).toEqualTypeOf<456>()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/usePrepareTransactionRequest.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { parseEther } from 'viem'\nimport { expect, test, vi } from 'vitest'\n\nimport { usePrepareTransactionRequest } from './usePrepareTransactionRequest.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const { result } = await renderHook(() =>\n    usePrepareTransactionRequest({\n      to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n      value: parseEther('1'),\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const {\n    data: {\n      gas: _gas,\n      gasPrice: _gasPrice,\n      maxFeePerGas: _mfpg,\n      maxPriorityFeePerGas: _mpfpg,\n      nonce: _nonce,\n      ...data\n    } = {},\n    ...rest\n  } = result.current\n\n  expect(data).toMatchInlineSnapshot(`\n    {\n      \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n      \"chainId\": 1,\n      \"from\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n      \"to\": \"0x70997970c51812dc3a010c7d01b50e0d17dc79c8\",\n      \"type\": \"eip1559\",\n      \"value\": 1000000000000000000n,\n    }\n  `)\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"prepareTransactionRequest\",\n        {\n          \"chainId\": 1,\n          \"to\": \"0x70997970c51812dc3a010c7d01b50e0d17dc79c8\",\n          \"value\": 1000000000000000000n,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/usePrepareTransactionRequest.ts",
    "content": "'use client'\nimport type {\n  Config,\n  PrepareTransactionRequestErrorType,\n  ResolvedRegister,\n  SelectChains,\n} from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type PrepareTransactionRequestData,\n  type PrepareTransactionRequestOptions,\n  prepareTransactionRequestQueryOptions,\n} from '@wagmi/core/query'\nimport type { PrepareTransactionRequestRequest as viem_PrepareTransactionRequestRequest } from 'viem'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UsePrepareTransactionRequestParameters<\n  config extends Config = Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  request extends viem_PrepareTransactionRequestRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  > = viem_PrepareTransactionRequestRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  >,\n  selectData = PrepareTransactionRequestData<config, chainId, request>,\n> = PrepareTransactionRequestOptions<config, chainId, request, selectData> &\n  ConfigParameter<config>\n\nexport type UsePrepareTransactionRequestReturnType<\n  config extends Config = Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  request extends viem_PrepareTransactionRequestRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  > = viem_PrepareTransactionRequestRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  >,\n  selectData = PrepareTransactionRequestData<config, chainId, request>,\n> = UseQueryReturnType<selectData, PrepareTransactionRequestErrorType>\n\n/** https://wagmi.sh/react/api/hooks/usePrepareTransactionRequest */\nexport function usePrepareTransactionRequest<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  request extends viem_PrepareTransactionRequestRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  > = viem_PrepareTransactionRequestRequest<\n    SelectChains<config, chainId>[0],\n    SelectChains<config, chainId>[0]\n  >,\n  selectData = PrepareTransactionRequestData<config, chainId, request>,\n>(\n  parameters: UsePrepareTransactionRequestParameters<\n    config,\n    chainId,\n    request,\n    selectData\n  > = {} as any,\n): UsePrepareTransactionRequestReturnType<\n  config,\n  chainId,\n  request,\n  selectData\n> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = prepareTransactionRequestQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  } as PrepareTransactionRequestOptions<config, chainId, request>)\n  return useQuery(options) as any\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useProof.test-d.ts",
    "content": "import type { GetProofReturnType } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport { useProof } from './useProof.js'\n\ntest('select data', () => {\n  const result = useProof({\n    query: {\n      select(data) {\n        return data\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<GetProofReturnType | undefined>()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useProof.test.ts",
    "content": "import { chain, wait } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport type { Address } from 'viem'\nimport { expect, test, vi } from 'vitest'\nimport { useProof } from './useProof.js'\n\ntest.skip('default', async () => {\n  const { result } = await renderHook(() =>\n    useProof({\n      address: '0x7F0d15C7FAae65896648C8273B6d7E43f58Fa842',\n      chainId: chain.optimism.id,\n      storageKeys: [\n        '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421',\n      ],\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect({ ...result.current, data: null }).toMatchInlineSnapshot(`\n    {\n      \"data\": null,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"getProof\",\n        {\n          \"address\": \"0x4200000000000000000000000000000000000016\",\n          \"chainId\": 10,\n          \"storageKeys\": [\n            \"0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99\",\n          ],\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest.skip('behavior: address: undefined -> defined', async () => {\n  const { result, rerender } = await renderHook(\n    (props) =>\n      useProof({\n        address: props?.address,\n        chainId: chain.optimism.id,\n        storageKeys: [\n          '0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99',\n        ],\n      }),\n    { initialProps: { address: undefined as Address | undefined } },\n  )\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": undefined,\n      \"dataUpdatedAt\": 0,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": false,\n      \"isFetchedAfterMount\": false,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": true,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": false,\n      \"isSuccess\": false,\n      \"queryKey\": [\n        \"getProof\",\n        {\n          \"address\": undefined,\n          \"chainId\": 10,\n          \"storageKeys\": [\n            \"0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99\",\n          ],\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"pending\",\n    }\n  `)\n\n  rerender({ address: '0x4200000000000000000000000000000000000016' })\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect({ ...result.current, data: null }).toMatchInlineSnapshot(`\n    {\n      \"data\": null,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"getProof\",\n        {\n          \"address\": \"0x4200000000000000000000000000000000000016\",\n          \"chainId\": 10,\n          \"storageKeys\": [\n            \"0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99\",\n          ],\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('behavior: disabled when properties missing', async () => {\n  const { result } = await renderHook(() => useProof())\n\n  await wait(100)\n  await vi.waitFor(() => expect(result.current.isPending).toBeTruthy())\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useProof.ts",
    "content": "'use client'\nimport type { Config, GetProofErrorType, ResolvedRegister } from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetProofData,\n  type GetProofOptions,\n  getProofQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseProofParameters<\n  config extends Config = Config,\n  selectData = GetProofData,\n> = Compute<GetProofOptions<config, selectData> & ConfigParameter<config>>\n\nexport type UseProofReturnType<selectData = GetProofData> = UseQueryReturnType<\n  selectData,\n  GetProofErrorType\n>\n\n/** https://wagmi.sh/react/api/hooks/useProof */\nexport function useProof<\n  config extends Config = ResolvedRegister['config'],\n  selectData = GetProofData,\n>(\n  parameters: UseProofParameters<config, selectData> = {},\n): UseProofReturnType<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = getProofQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options)\n}\n"
  },
  {
    "path": "packages/react/src/hooks/usePublicClient.test-d.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport type { Chain } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { usePublicClient } from './usePublicClient.js'\n\ntest('default', () => {\n  const client = usePublicClient({ config })\n  expectTypeOf(client.chain).toEqualTypeOf<(typeof config)['chains'][number]>()\n  expectTypeOf(client.transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('parameters: chainId', () => {\n  const client = usePublicClient({\n    config,\n    chainId: chain.mainnet.id,\n  })\n  expectTypeOf(client.chain).toEqualTypeOf<typeof chain.mainnet>()\n  expectTypeOf(client.chain).not.toEqualTypeOf<typeof chain.mainnet2>()\n  expectTypeOf(client.transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('behavior: unconfigured chain', () => {\n  {\n    const client = usePublicClient({ chainId: 123456 })\n    if (client) {\n      expectTypeOf(client.chain).toEqualTypeOf<Chain>()\n      expectTypeOf(client.transport.type).toEqualTypeOf<string>()\n    } else {\n      expectTypeOf(client).toEqualTypeOf<undefined>()\n    }\n  }\n\n  const client = usePublicClient({\n    config,\n    // @ts-expect-error\n    chainId: 123456,\n  })\n  expectTypeOf(client).toEqualTypeOf<undefined>()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/usePublicClient.test.ts",
    "content": "import { switchChain } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { createElement, Fragment } from 'react'\nimport { expect, test } from 'vitest'\n\nimport { usePublicClient } from './usePublicClient.js'\n\ntest('default', async () => {\n  const { result, rerender } = await renderHook(() => usePublicClient())\n\n  expect(result.current?.chain.id).toEqual(1)\n\n  await switchChain(config, { chainId: 456 })\n  rerender()\n\n  expect(result.current?.chain.id).toEqual(456)\n})\n\ntest('parameters: config', async () => {\n  const { result } = await renderHook(() => usePublicClient({ config }), {\n    wrapper: ({ children }) => createElement(Fragment, { children }),\n  })\n  expect(result.current).toBeDefined()\n})\n\ntest('behavior: unconfigured chain', async () => {\n  const { result } = await renderHook(() =>\n    usePublicClient({ chainId: 123456 }),\n  )\n  expect(result.current).toBeUndefined()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/usePublicClient.ts",
    "content": "'use client'\n\nimport {\n  type Config,\n  type GetPublicClientParameters,\n  type GetPublicClientReturnType,\n  getPublicClient,\n  type ResolvedRegister,\n  watchPublicClient,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/shim/with-selector.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UsePublicClientParameters<\n  config extends Config = Config,\n  chainId extends config['chains'][number]['id'] | number | undefined =\n    | config['chains'][number]['id']\n    | undefined,\n> = Compute<\n  GetPublicClientParameters<config, chainId> & ConfigParameter<config>\n>\n\nexport type UsePublicClientReturnType<\n  config extends Config = Config,\n  chainId extends config['chains'][number]['id'] | number | undefined =\n    | config['chains'][number]['id']\n    | undefined,\n> = GetPublicClientReturnType<config, chainId>\n\n/** https://wagmi.sh/react/api/hooks/usePublicClient */\nexport function usePublicClient<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends config['chains'][number]['id'] | number | undefined =\n    | config['chains'][number]['id']\n    | undefined,\n>(\n  parameters: UsePublicClientParameters<config, chainId> = {},\n): UsePublicClientReturnType<config, chainId> {\n  const config = useConfig(parameters)\n\n  return useSyncExternalStoreWithSelector(\n    (onChange) => watchPublicClient(config, { onChange }),\n    () => getPublicClient(config, parameters),\n    () => getPublicClient(config, parameters),\n    (x) => x,\n    (a, b) => a?.uid === b?.uid,\n  ) as any\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useReadContract.test-d.ts",
    "content": "import { abi } from '@wagmi/test'\nimport type { Address } from 'viem'\nimport { assertType, expectTypeOf, test } from 'vitest'\n\nimport {\n  type UseReadContractParameters,\n  type UseReadContractReturnType,\n  useReadContract,\n} from './useReadContract.js'\n\ntest('select data', () => {\n  const result = useReadContract({\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'balanceOf',\n    args: ['0x'],\n    query: {\n      select(data) {\n        expectTypeOf(data).toEqualTypeOf<bigint>()\n        return data?.toString()\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<string | undefined>()\n})\n\ntest('UseReadContractParameters', () => {\n  type Result = UseReadContractParameters<typeof abi.erc20, 'balanceOf'>\n  expectTypeOf<Pick<Result, 'args' | 'functionName'>>().toEqualTypeOf<{\n    functionName?:\n      | 'symbol'\n      | 'name'\n      | 'allowance'\n      | 'balanceOf'\n      | 'decimals'\n      | 'totalSupply'\n      | undefined\n    args?: readonly [Address] | undefined\n  }>()\n})\n\ntest('UseReadContractReturnType', () => {\n  type Result = UseReadContractReturnType<typeof abi.erc20, 'balanceOf'>\n  expectTypeOf<Result['data']>().toEqualTypeOf<bigint | undefined>()\n})\n\ntest('overloads', () => {\n  const result1 = useReadContract({\n    address: '0x',\n    abi: abi.viewOverloads,\n    functionName: 'foo',\n  })\n  assertType<number | undefined>(result1.data)\n\n  const result2 = useReadContract({\n    address: '0x',\n    abi: abi.viewOverloads,\n    functionName: 'foo',\n    args: [],\n  })\n  assertType<number | undefined>(result2.data)\n\n  const result3 = useReadContract({\n    address: '0x',\n    abi: abi.viewOverloads,\n    functionName: 'foo',\n    args: ['0x'],\n  })\n  assertType<string | undefined>(result3.data)\n\n  const result4 = useReadContract({\n    address: '0x',\n    abi: abi.viewOverloads,\n    functionName: 'foo',\n    args: ['0x', '0x'],\n  })\n  assertType<\n    | {\n        foo: `0x${string}`\n        bar: `0x${string}`\n      }\n    | undefined\n  >(result4.data)\n})\n\ntest('deployless read (bytecode)', () => {\n  const result = useReadContract({\n    code: '0x',\n    abi: abi.erc20,\n    functionName: 'balanceOf',\n    args: ['0x'],\n  })\n  expectTypeOf(result.data).toEqualTypeOf<bigint | undefined>()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useReadContract.test.ts",
    "content": "import { QueryClientProvider } from '@tanstack/react-query'\nimport { abi, address, bytecode, chain, config, wait } from '@wagmi/test'\nimport { queryClient, renderHook } from '@wagmi/test/react'\nimport { createElement } from 'react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useReadContract } from './useReadContract.js'\n\ntest('default', async () => {\n  const { result } = await renderHook(() =>\n    useReadContract({\n      address: address.wagmiMintExample,\n      abi: abi.wagmiMintExample,\n      functionName: 'balanceOf',\n      args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": 10n,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"readContract\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"args\": [\n            \"0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC\",\n          ],\n          \"chainId\": 1,\n          \"functionName\": \"balanceOf\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: chainId', async () => {\n  const { result } = await renderHook(() =>\n    useReadContract({\n      address: address.wagmiMintExample,\n      abi: abi.wagmiMintExample,\n      functionName: 'balanceOf',\n      args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n      chainId: chain.mainnet2.id,\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": 10n,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"readContract\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"args\": [\n            \"0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC\",\n          ],\n          \"chainId\": 456,\n          \"functionName\": \"balanceOf\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: config', async () => {\n  const { result } = await renderHook(\n    () =>\n      useReadContract({\n        address: address.wagmiMintExample,\n        abi: abi.wagmiMintExample,\n        functionName: 'balanceOf',\n        args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n        config,\n      }),\n    {\n      wrapper: ({ children }) =>\n        createElement(QueryClientProvider, { client: queryClient }, children),\n    },\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": 10n,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"readContract\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"args\": [\n            \"0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC\",\n          ],\n          \"chainId\": 1,\n          \"functionName\": \"balanceOf\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: deployless read (bytecode)', async () => {\n  const { result } = await renderHook(() =>\n    useReadContract({\n      abi: abi.wagmiMintExample,\n      functionName: 'name',\n      code: bytecode.wagmiMintExample,\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current.data).toMatchInlineSnapshot(`\"wagmi\"`)\n})\n\ntest('behavior: disabled when properties missing', async () => {\n  const { result } = await renderHook(() => useReadContract())\n\n  await wait(100)\n  await vi.waitFor(() => expect(result.current.isPending).toBeTruthy())\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useReadContract.ts",
    "content": "'use client'\nimport type {\n  Config,\n  ReadContractErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { ConfigParameter, UnionCompute } from '@wagmi/core/internal'\nimport {\n  type ReadContractData,\n  type ReadContractOptions,\n  readContractQueryOptions,\n} from '@wagmi/core/query'\nimport type { Abi, ContractFunctionArgs, ContractFunctionName } from 'viem'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseReadContractParameters<\n  abi extends Abi | readonly unknown[] = Abi,\n  functionName extends ContractFunctionName<\n    abi,\n    'pure' | 'view'\n  > = ContractFunctionName<abi, 'pure' | 'view'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'pure' | 'view',\n    functionName\n  > = ContractFunctionArgs<abi, 'pure' | 'view', functionName>,\n  config extends Config = Config,\n  selectData = ReadContractData<abi, functionName, args>,\n> = UnionCompute<\n  ReadContractOptions<abi, functionName, args, config, selectData> &\n    ConfigParameter<config>\n>\n\nexport type UseReadContractReturnType<\n  abi extends Abi | readonly unknown[] = Abi,\n  functionName extends ContractFunctionName<\n    abi,\n    'pure' | 'view'\n  > = ContractFunctionName<abi, 'pure' | 'view'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'pure' | 'view',\n    functionName\n  > = ContractFunctionArgs<abi, 'pure' | 'view', functionName>,\n  selectData = ReadContractData<abi, functionName, args>,\n> = UseQueryReturnType<selectData, ReadContractErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useReadContract */\nexport function useReadContract<\n  const abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'pure' | 'view'>,\n  const args extends ContractFunctionArgs<abi, 'pure' | 'view', functionName>,\n  config extends Config = ResolvedRegister['config'],\n  selectData = ReadContractData<abi, functionName, args>,\n>(\n  parameters: UseReadContractParameters<\n    abi,\n    functionName,\n    args,\n    config,\n    selectData\n  > = {} as any,\n): UseReadContractReturnType<abi, functionName, args, selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = readContractQueryOptions(config, {\n    ...(parameters as any),\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options) as any\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useReadContracts.test-d.ts",
    "content": "import { abi } from '@wagmi/test'\nimport { assertType, expectTypeOf, test } from 'vitest'\n\nimport { useReadContracts } from './useReadContracts.js'\n\ntest('select data', () => {\n  const result = useReadContracts({\n    allowFailure: false,\n    contracts: [\n      {\n        address: '0x',\n        abi: abi.erc20,\n        functionName: 'balanceOf',\n        chainId: 1,\n        args: ['0x'],\n      },\n      {\n        address: '0x',\n        abi: abi.wagmiMintExample,\n        functionName: 'tokenURI',\n        args: [123n],\n      },\n    ],\n    query: {\n      select(data) {\n        expectTypeOf(data).toEqualTypeOf<[bigint, string]>()\n        return data[0]\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<bigint | undefined>()\n})\n\ntest('overloads', async () => {\n  const result1 = useReadContracts({\n    allowFailure: false,\n    contracts: [\n      {\n        address: '0x',\n        abi: abi.viewOverloads,\n        functionName: 'foo',\n      },\n    ],\n  })\n  assertType<[number] | undefined>(result1.data)\n\n  const result2 = useReadContracts({\n    allowFailure: false,\n    contracts: [\n      {\n        address: '0x',\n        abi: abi.viewOverloads,\n        functionName: 'foo',\n        args: [],\n      },\n    ],\n  })\n  assertType<[number] | undefined>(result2.data)\n\n  const result3 = useReadContracts({\n    allowFailure: false,\n    contracts: [\n      {\n        address: '0x',\n        abi: abi.viewOverloads,\n        functionName: 'foo',\n        args: ['0x'],\n      },\n    ],\n  })\n  assertType<[string] | undefined>(result3.data)\n\n  const result4 = useReadContracts({\n    allowFailure: false,\n    contracts: [\n      {\n        address: '0x',\n        abi: abi.viewOverloads,\n        functionName: 'foo',\n        args: ['0x', '0x'],\n      },\n    ],\n  })\n  assertType<\n    | [\n        {\n          foo: `0x${string}`\n          bar: `0x${string}`\n        },\n      ]\n    | undefined\n  >(result4.data)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useReadContracts.test.ts",
    "content": "import { switchChain } from '@wagmi/core'\nimport { abi, address, chain, config } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\nimport { useReadContracts } from './useReadContracts.js'\n\ntest('default', async () => {\n  const { result } = await renderHook(() =>\n    useReadContracts({\n      contracts: [\n        {\n          address: address.wagmiMintExample,\n          abi: abi.wagmiMintExample,\n          functionName: 'balanceOf',\n          args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n        },\n        {\n          address: address.wagmiMintExample,\n          abi: abi.wagmiMintExample,\n          functionName: 'symbol',\n        },\n      ],\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": [\n        {\n          \"result\": 10n,\n          \"status\": \"success\",\n        },\n        {\n          \"result\": \"WAGMI\",\n          \"status\": \"success\",\n        },\n      ],\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"readContracts\",\n        {\n          \"chainId\": 1,\n          \"contracts\": [\n            {\n              \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n              \"args\": [\n                \"0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC\",\n              ],\n              \"chainId\": 1,\n              \"functionName\": \"balanceOf\",\n            },\n            {\n              \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n              \"chainId\": 1,\n              \"functionName\": \"symbol\",\n            },\n          ],\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('multichain', async () => {\n  const { mainnet, mainnet2 } = chain\n  const { result } = await renderHook(() =>\n    useReadContracts({\n      contracts: [\n        {\n          abi: abi.wagmigotchi,\n          address: address.wagmigotchi,\n          chainId: mainnet.id,\n          functionName: 'love',\n          args: ['0x27a69ffba1e939ddcfecc8c7e0f967b872bac65c'],\n        },\n        {\n          abi: abi.wagmigotchi,\n          address: address.wagmigotchi,\n          chainId: mainnet.id,\n          functionName: 'love',\n          args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n        },\n        {\n          abi: abi.wagmigotchi,\n          address: address.wagmigotchi,\n          chainId: mainnet.id,\n          functionName: 'love',\n          args: ['0xd2135CfB216b74109775236E36d4b433F1DF507B'],\n        },\n        {\n          abi: abi.wagmigotchi,\n          address: address.wagmigotchi,\n          chainId: mainnet2.id,\n          functionName: 'getAlive',\n        },\n        {\n          abi: abi.mloot,\n          address: address.mloot,\n          chainId: mainnet2.id,\n          functionName: 'tokenOfOwnerByIndex',\n          args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', 0n],\n        },\n        // {\n        //   abi: abi.erc20,\n        //   address: address.optimism.usdc,\n        //   chainId: optimism.id,\n        //   functionName: 'symbol',\n        // },\n        // {\n        //   abi: abi.erc20,\n        //   address: address.optimism.usdc,\n        //   chainId: optimism.id,\n        //   functionName: 'balanceOf',\n        //   args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n        // },\n      ],\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 60_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": [\n        {\n          \"result\": 2n,\n          \"status\": \"success\",\n        },\n        {\n          \"result\": 1n,\n          \"status\": \"success\",\n        },\n        {\n          \"result\": 0n,\n          \"status\": \"success\",\n        },\n        {\n          \"result\": false,\n          \"status\": \"success\",\n        },\n        {\n          \"result\": 370395n,\n          \"status\": \"success\",\n        },\n      ],\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"readContracts\",\n        {\n          \"contracts\": [\n            {\n              \"address\": \"0xecb504d39723b0be0e3a9aa33d646642d1051ee1\",\n              \"args\": [\n                \"0x27a69ffba1e939ddcfecc8c7e0f967b872bac65c\",\n              ],\n              \"chainId\": 1,\n              \"functionName\": \"love\",\n            },\n            {\n              \"address\": \"0xecb504d39723b0be0e3a9aa33d646642d1051ee1\",\n              \"args\": [\n                \"0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC\",\n              ],\n              \"chainId\": 1,\n              \"functionName\": \"love\",\n            },\n            {\n              \"address\": \"0xecb504d39723b0be0e3a9aa33d646642d1051ee1\",\n              \"args\": [\n                \"0xd2135CfB216b74109775236E36d4b433F1DF507B\",\n              ],\n              \"chainId\": 1,\n              \"functionName\": \"love\",\n            },\n            {\n              \"address\": \"0xecb504d39723b0be0e3a9aa33d646642d1051ee1\",\n              \"chainId\": 456,\n              \"functionName\": \"getAlive\",\n            },\n            {\n              \"address\": \"0x1dfe7ca09e99d10835bf73044a23b73fc20623df\",\n              \"args\": [\n                \"0xA0Cf798816D4b9b9866b5330EEa46a18382f251e\",\n                0n,\n              ],\n              \"chainId\": 456,\n              \"functionName\": \"tokenOfOwnerByIndex\",\n            },\n          ],\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n}, 60_000)\n\ntest('behavior: all same chainId', async () => {\n  const { mainnet, mainnet2 } = chain\n  await switchChain(config, { chainId: mainnet2.id })\n  const { result } = await renderHook(() =>\n    useReadContracts({\n      contracts: [\n        {\n          abi: abi.wagmigotchi,\n          address: address.wagmigotchi,\n          chainId: mainnet.id,\n          functionName: 'love',\n          args: ['0x27a69ffba1e939ddcfecc8c7e0f967b872bac65c'],\n        },\n        {\n          abi: abi.wagmigotchi,\n          address: address.wagmigotchi,\n          chainId: mainnet.id,\n          functionName: 'love',\n          args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n        },\n        {\n          abi: abi.wagmigotchi,\n          address: address.wagmigotchi,\n          chainId: mainnet.id,\n          functionName: 'love',\n          args: ['0xd2135CfB216b74109775236E36d4b433F1DF507B'],\n        },\n      ],\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": [\n        {\n          \"result\": 2n,\n          \"status\": \"success\",\n        },\n        {\n          \"result\": 1n,\n          \"status\": \"success\",\n        },\n        {\n          \"result\": 0n,\n          \"status\": \"success\",\n        },\n      ],\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"readContracts\",\n        {\n          \"contracts\": [\n            {\n              \"address\": \"0xecb504d39723b0be0e3a9aa33d646642d1051ee1\",\n              \"args\": [\n                \"0x27a69ffba1e939ddcfecc8c7e0f967b872bac65c\",\n              ],\n              \"chainId\": 1,\n              \"functionName\": \"love\",\n            },\n            {\n              \"address\": \"0xecb504d39723b0be0e3a9aa33d646642d1051ee1\",\n              \"args\": [\n                \"0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC\",\n              ],\n              \"chainId\": 1,\n              \"functionName\": \"love\",\n            },\n            {\n              \"address\": \"0xecb504d39723b0be0e3a9aa33d646642d1051ee1\",\n              \"args\": [\n                \"0xd2135CfB216b74109775236E36d4b433F1DF507B\",\n              ],\n              \"chainId\": 1,\n              \"functionName\": \"love\",\n            },\n          ],\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useReadContracts.ts",
    "content": "'use client'\nimport type {\n  Config,\n  ReadContractsErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type ReadContractsData,\n  type ReadContractsOptions,\n  readContractsQueryOptions,\n} from '@wagmi/core/query'\nimport { useMemo } from 'react'\nimport type { ContractFunctionParameters } from 'viem'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseReadContractsParameters<\n  contracts extends readonly unknown[] = readonly ContractFunctionParameters[],\n  allowFailure extends boolean = true,\n  config extends Config = Config,\n  selectData = ReadContractsData<contracts, allowFailure>,\n> = Compute<\n  ReadContractsOptions<contracts, allowFailure, config, selectData> &\n    ConfigParameter<config>\n>\n\nexport type UseReadContractsReturnType<\n  contracts extends readonly unknown[] = readonly ContractFunctionParameters[],\n  allowFailure extends boolean = true,\n  selectData = ReadContractsData<contracts, allowFailure>,\n> = UseQueryReturnType<selectData, ReadContractsErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useReadContracts */\nexport function useReadContracts<\n  const contracts extends readonly unknown[],\n  allowFailure extends boolean = true,\n  config extends Config = ResolvedRegister['config'],\n  selectData = ReadContractsData<contracts, allowFailure>,\n>(\n  parameters: UseReadContractsParameters<\n    contracts,\n    allowFailure,\n    config,\n    selectData\n  > = {},\n): UseReadContractsReturnType<contracts, allowFailure, selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const contractsChainId = useMemo(() => {\n    const firstChainId = (\n      parameters.contracts?.[0] as { chainId?: number } | undefined\n    )?.chainId\n    if (\n      ((parameters.contracts ?? []) as { chainId?: number }[]).every(\n        (contract) => contract.chainId === firstChainId,\n      )\n    )\n      return firstChainId\n    return undefined\n  }, [parameters.contracts])\n  const options = readContractsQueryOptions(config, {\n    ...parameters,\n    chainId: contractsChainId ?? chainId,\n  })\n  return useQuery(options) as any\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useReconnect.test-d.ts",
    "content": "import type {\n  Connector,\n  CreateConnectorFn,\n  ReconnectErrorType,\n} from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport type { Address } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport { useReconnect } from './useReconnect.js'\n\nconst connectors = [config.connectors[0]!]\nconst contextValue = { foo: 'bar' } as const\n\ntest('context', () => {\n  const reconnect = useReconnect({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toEqualTypeOf<\n          | {\n              connectors?:\n                | readonly (CreateConnectorFn | Connector)[]\n                | undefined\n            }\n          | undefined\n        >()\n        return contextValue\n      },\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<\n          | {\n              connectors?:\n                | readonly (CreateConnectorFn | Connector)[]\n                | undefined\n            }\n          | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<ReconnectErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<\n          | {\n              connectors?:\n                | readonly (CreateConnectorFn | Connector)[]\n                | undefined\n            }\n          | undefined\n        >()\n        expectTypeOf(data).toEqualTypeOf<\n          {\n            accounts: readonly [Address, ...Address[]]\n            chainId: number\n            connector: Connector\n          }[]\n        >()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<\n          | {\n              accounts: readonly [Address, ...Address[]]\n              chainId: number\n              connector: Connector\n            }[]\n          | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<ReconnectErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<\n          | {\n              connectors?:\n                | readonly (CreateConnectorFn | Connector)[]\n                | undefined\n            }\n          | undefined\n        >()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  })\n\n  expectTypeOf(reconnect.data).toEqualTypeOf<\n    | {\n        accounts: readonly [Address, ...Address[]]\n        chainId: number\n        connector: Connector\n      }[]\n    | undefined\n  >()\n  expectTypeOf(reconnect.error).toEqualTypeOf<ReconnectErrorType | null>()\n  expectTypeOf(reconnect.variables).toEqualTypeOf<\n    | {\n        connectors?: readonly (CreateConnectorFn | Connector)[] | undefined\n      }\n    | undefined\n  >()\n  expectTypeOf(reconnect.context).toEqualTypeOf<\n    typeof contextValue | undefined\n  >()\n\n  reconnect.mutate(\n    { connectors },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<\n          | {\n              connectors?:\n                | readonly (CreateConnectorFn | Connector)[]\n                | undefined\n            }\n          | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<ReconnectErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<\n          | {\n              connectors?:\n                | readonly (CreateConnectorFn | Connector)[]\n                | undefined\n            }\n          | undefined\n        >()\n        expectTypeOf(data).toEqualTypeOf<\n          {\n            accounts: readonly [Address, ...Address[]]\n            chainId: number\n            connector: Connector\n          }[]\n        >()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<\n          | {\n              accounts: readonly [Address, ...Address[]]\n              chainId: number\n              connector: Connector\n            }[]\n          | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<ReconnectErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<\n          | {\n              connectors?:\n                | readonly (CreateConnectorFn | Connector)[]\n                | undefined\n            }\n          | undefined\n        >()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  )\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useReconnect.test.ts",
    "content": "import { mock } from '@wagmi/connectors'\nimport { connect, disconnect } from '@wagmi/core'\nimport { accounts, config } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { afterEach, expect, test, vi } from 'vitest'\n\nimport { useReconnect } from './useReconnect.js'\n\nconst connector = config._internal.connectors.setup(\n  mock({\n    accounts,\n    features: { reconnect: true },\n  }),\n)\n\nafterEach(async () => {\n  if (config.state.current) await disconnect(config)\n})\n\ntest('default', async () => {\n  const { result } = await renderHook(() => useReconnect())\n\n  result.current.mutate()\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current.data).toStrictEqual([])\n})\n\ntest('parameters: connectors (Connector)', async () => {\n  await connect(config, { connector })\n\n  const { result } = await renderHook(() => useReconnect())\n\n  result.current.mutate({ connectors: [connector] })\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current.data).toMatchObject(\n    expect.arrayContaining([\n      expect.objectContaining({\n        accounts: expect.any(Array),\n        chainId: expect.any(Number),\n      }),\n    ]),\n  )\n})\n\ntest('parameters: connectors (CreateConnectorFn)', async () => {\n  const connector = mock({\n    accounts,\n    features: { reconnect: true },\n  })\n  await connect(config, { connector })\n\n  const { result } = await renderHook(() => useReconnect())\n\n  result.current.mutate({ connectors: [connector] })\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current.data).toMatchObject(\n    expect.arrayContaining([\n      expect.objectContaining({\n        accounts: expect.any(Array),\n        chainId: expect.any(Number),\n      }),\n    ]),\n  )\n})\n\ntest(\"behavior: doesn't reconnect if already reconnecting\", async () => {\n  const previousStatus = config.state.status\n  config.setState((x) => ({ ...x, status: 'reconnecting' }))\n  const { result } = await renderHook(() => useReconnect())\n  await expect(\n    result.current.mutateAsync({ connectors: [connector] }),\n  ).resolves.toStrictEqual([])\n  config.setState((x) => ({ ...x, status: previousStatus }))\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useReconnect.ts",
    "content": "'use client'\nimport { useMutation } from '@tanstack/react-query'\nimport type { Connector, ReconnectErrorType } from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type ReconnectData,\n  type ReconnectMutate,\n  type ReconnectMutateAsync,\n  type ReconnectOptions,\n  type ReconnectVariables,\n  reconnectMutationOptions,\n} from '@wagmi/core/query'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseReconnectParameters<context = unknown> = Compute<\n  ConfigParameter & ReconnectOptions<context>\n>\n\nexport type UseReconnectReturnType<context = unknown> = Compute<\n  UseMutationReturnType<\n    ReconnectData,\n    ReconnectErrorType,\n    ReconnectVariables,\n    context,\n    ReconnectMutate<context>,\n    ReconnectMutateAsync<context>\n  > & {\n    /** @deprecated use `useConnectors` instead */\n    connectors: readonly Connector[]\n    /** @deprecated use `mutate` instead */\n    reconnect: ReconnectMutate<context>\n    /** @deprecated use `mutateAsync` instead */\n    reconnectAsync: ReconnectMutateAsync<context>\n  }\n>\n\n/** https://wagmi.sh/react/api/hooks/useReconnect */\nexport function useReconnect<context = unknown>(\n  parameters: UseReconnectParameters<context> = {},\n): UseReconnectReturnType<context> {\n  const config = useConfig(parameters)\n  const options = reconnectMutationOptions(config, parameters)\n  const mutation = useMutation(options)\n  type Return = UseReconnectReturnType<context>\n  return {\n    ...(mutation as Return),\n    connectors: config.connectors,\n    reconnect: mutation.mutate as Return['mutate'],\n    reconnectAsync: mutation.mutateAsync as Return['mutateAsync'],\n  }\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useSendCalls.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { accounts, config } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { parseEther } from 'viem'\nimport { expect, test, vi } from 'vitest'\n\nimport { useSendCalls } from './useSendCalls.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const { result } = await renderHook(() => useSendCalls())\n\n  result.current.mutate({\n    calls: [\n      {\n        data: '0xdeadbeef',\n        to: accounts[1],\n        value: parseEther('1'),\n      },\n      {\n        to: accounts[2],\n        value: parseEther('2'),\n      },\n      {\n        to: accounts[3],\n        value: parseEther('3'),\n      },\n    ],\n  })\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current.data).toMatchInlineSnapshot(\n    `\n    {\n      \"id\": \"0xb24b52a86aa2b0bae6f1e44868c3a13d2572e766a1f6364afd93d1757839b8a1\",\n    }\n  `,\n  )\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useSendCalls.ts",
    "content": "'use client'\nimport { useMutation } from '@tanstack/react-query'\nimport type { Config, ResolvedRegister, SendCallsErrorType } from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type SendCallsData,\n  type SendCallsMutate,\n  type SendCallsMutateAsync,\n  type SendCallsOptions,\n  type SendCallsVariables,\n  sendCallsMutationOptions,\n} from '@wagmi/core/query'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseSendCallsParameters<\n  config extends Config = Config,\n  context = unknown,\n> = Compute<ConfigParameter<config> & SendCallsOptions<config, context>>\n\nexport type UseSendCallsReturnType<\n  config extends Config = Config,\n  context = unknown,\n> = Compute<\n  UseMutationReturnType<\n    SendCallsData,\n    SendCallsErrorType,\n    SendCallsVariables<config, config['chains'][number]['id']>,\n    context,\n    SendCallsMutate<config, context>,\n    SendCallsMutateAsync<config, context>\n  > & {\n    /** @deprecated use `mutate` instead */\n    sendCalls: SendCallsMutate<config, context>\n    /** @deprecated use `mutateAsync` instead */\n    sendCallsAsync: SendCallsMutateAsync<config, context>\n  }\n>\n\n/** https://wagmi.sh/react/api/hooks/useSendCalls */\nexport function useSendCalls<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: UseSendCallsParameters<config, context> = {},\n): UseSendCallsReturnType<config, context> {\n  const config = useConfig(parameters)\n  const options = sendCallsMutationOptions(config, parameters)\n  const mutation = useMutation(options)\n  type Return = UseSendCallsReturnType<config, context>\n  return {\n    ...(mutation as Return),\n    sendCalls: mutation.mutate as Return['mutate'],\n    sendCallsAsync: mutation.mutateAsync as Return['mutateAsync'],\n  }\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useSendCallsSync.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { accounts, config, testClient, wait } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { parseEther } from 'viem'\nimport { expect, test, vi } from 'vitest'\n\nimport { useSendCallsSync } from './useSendCallsSync.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const { result } = await renderHook(() => useSendCallsSync())\n\n  result.current.mutate({\n    calls: [\n      {\n        data: '0xdeadbeef',\n        to: accounts[1],\n        value: parseEther('1'),\n      },\n      {\n        to: accounts[2],\n        value: parseEther('2'),\n      },\n      {\n        to: accounts[3],\n        value: parseEther('3'),\n      },\n    ],\n  })\n  await wait(4_000)\n  await testClient.mainnet.mine({ blocks: 1 })\n  await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy(), {\n    timeout: 10_000,\n  })\n\n  expect(result.current.data).toBeDefined()\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useSendCallsSync.ts",
    "content": "'use client'\nimport { useMutation } from '@tanstack/react-query'\nimport type {\n  Config,\n  ResolvedRegister,\n  SendCallsSyncErrorType,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type SendCallsSyncData,\n  type SendCallsSyncMutate,\n  type SendCallsSyncMutateAsync,\n  type SendCallsSyncOptions,\n  type SendCallsSyncVariables,\n  sendCallsSyncMutationOptions,\n} from '@wagmi/core/query'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseSendCallsSyncParameters<\n  config extends Config = Config,\n  context = unknown,\n> = Compute<ConfigParameter<config> & SendCallsSyncOptions<config, context>>\n\nexport type UseSendCallsSyncReturnType<\n  config extends Config = Config,\n  context = unknown,\n> = Compute<\n  UseMutationReturnType<\n    SendCallsSyncData,\n    SendCallsSyncErrorType,\n    SendCallsSyncVariables<config, config['chains'][number]['id']>,\n    context,\n    SendCallsSyncMutate<config, context>,\n    SendCallsSyncMutateAsync<config, context>\n  > & {\n    /** @deprecated use `mutate` instead */\n    sendCallsSync: SendCallsSyncMutate<config, context>\n    /** @deprecated use `mutateAsync` instead */\n    sendCallsSyncAsync: SendCallsSyncMutateAsync<config, context>\n  }\n>\n\n/** https://wagmi.sh/react/api/hooks/useSendCallsSync */\nexport function useSendCallsSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: UseSendCallsSyncParameters<config, context> = {},\n): UseSendCallsSyncReturnType<config, context> {\n  const config = useConfig(parameters)\n  const options = sendCallsSyncMutationOptions(config, parameters)\n  const mutation = useMutation(options)\n  type Return = UseSendCallsSyncReturnType<config, context>\n  return {\n    ...(mutation as Return),\n    sendCallsSync: mutation.mutate as Return['mutate'],\n    sendCallsSyncAsync: mutation.mutateAsync as Return['mutateAsync'],\n  }\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useSendTransaction.test-d.ts",
    "content": "import type { SendTransactionErrorType } from '@wagmi/core'\nimport type { Hash } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useSendTransaction } from './useSendTransaction.js'\n\nconst contextValue = { foo: 'bar' } as const\n\ntest('context', () => {\n  const sendTransaction = useSendTransaction({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toMatchTypeOf<\n          { chainId?: number | undefined } | undefined\n        >()\n        return contextValue\n      },\n      onError(error, variables, context) {\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n        }>()\n        expectTypeOf(error).toEqualTypeOf<SendTransactionErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n        }>()\n        expectTypeOf(data).toEqualTypeOf<Hash>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<Hash | undefined>()\n        expectTypeOf(error).toEqualTypeOf<SendTransactionErrorType | null>()\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  })\n\n  expectTypeOf(sendTransaction.data).toEqualTypeOf<Hash | undefined>()\n  expectTypeOf(\n    sendTransaction.error,\n  ).toEqualTypeOf<SendTransactionErrorType | null>()\n  expectTypeOf(sendTransaction.variables).toMatchTypeOf<\n    { chainId?: number | undefined } | undefined\n  >()\n  expectTypeOf(sendTransaction.context).toEqualTypeOf<\n    typeof contextValue | undefined\n  >()\n\n  sendTransaction.mutate(\n    { to: '0x' },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n        }>()\n        expectTypeOf(error).toEqualTypeOf<SendTransactionErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n        }>()\n        expectTypeOf(data).toEqualTypeOf<Hash>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<Hash | undefined>()\n        expectTypeOf(error).toEqualTypeOf<SendTransactionErrorType | null>()\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  )\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useSendTransaction.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { config, transactionHashRegex } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { parseEther } from 'viem'\nimport { expect, test, vi } from 'vitest'\n\nimport { useSendTransaction } from './useSendTransaction.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const { result } = await renderHook(() => useSendTransaction())\n\n  result.current.mutate({\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n  })\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current.data).toMatch(transactionHashRegex)\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useSendTransaction.ts",
    "content": "'use client'\nimport { useMutation } from '@tanstack/react-query'\nimport type {\n  Config,\n  ResolvedRegister,\n  SendTransactionErrorType,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type SendTransactionData,\n  type SendTransactionMutate,\n  type SendTransactionMutateAsync,\n  type SendTransactionOptions,\n  type SendTransactionVariables,\n  sendTransactionMutationOptions,\n} from '@wagmi/core/query'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseSendTransactionParameters<\n  config extends Config = Config,\n  context = unknown,\n> = Compute<ConfigParameter<config> & SendTransactionOptions<config, context>>\n\nexport type UseSendTransactionReturnType<\n  config extends Config = Config,\n  context = unknown,\n> = Compute<\n  UseMutationReturnType<\n    SendTransactionData,\n    SendTransactionErrorType,\n    SendTransactionVariables<config, config['chains'][number]['id']>,\n    context,\n    SendTransactionMutate<config, context>,\n    SendTransactionMutateAsync<config, context>\n  > & {\n    /** @deprecated use `mutate` instead */\n    sendTransaction: SendTransactionMutate<config, context>\n    /** @deprecated use `mutateAsync` instead */\n    sendTransactionAsync: SendTransactionMutateAsync<config, context>\n  }\n>\n\n/** https://wagmi.sh/react/api/hooks/useSendTransaction */\nexport function useSendTransaction<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: UseSendTransactionParameters<config, context> = {},\n): UseSendTransactionReturnType<config, context> {\n  const config = useConfig(parameters)\n  const options = sendTransactionMutationOptions(config, parameters)\n  const mutation = useMutation(options)\n  type Return = UseSendTransactionReturnType<config, context>\n  return {\n    ...(mutation as Return),\n    sendTransaction: mutation.mutate as Return['mutate'],\n    sendTransactionAsync: mutation.mutateAsync as Return['mutateAsync'],\n  }\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useSendTransactionSync.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { config, testClient, wait } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { parseEther } from 'viem'\nimport { beforeEach, expect, test, vi } from 'vitest'\n\nimport { useSendTransactionSync } from './useSendTransactionSync.js'\n\nconst connector = config.connectors[0]!\n\nbeforeEach(async () => {\n  await disconnect(config).catch(() => {})\n})\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const { result } = await renderHook(() => useSendTransactionSync())\n\n  result.current.mutate({\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n  })\n  await wait(2_000)\n  await testClient.mainnet.mine({ blocks: 1 })\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 15_000 })\n\n  expect(result.current.data).toBeDefined()\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useSendTransactionSync.ts",
    "content": "'use client'\nimport { useMutation } from '@tanstack/react-query'\nimport type {\n  Config,\n  ResolvedRegister,\n  SendTransactionSyncErrorType,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type SendTransactionSyncData,\n  type SendTransactionSyncMutate,\n  type SendTransactionSyncMutateAsync,\n  type SendTransactionSyncOptions,\n  type SendTransactionSyncVariables,\n  sendTransactionSyncMutationOptions,\n} from '@wagmi/core/query'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseSendTransactionSyncParameters<\n  config extends Config = Config,\n  context = unknown,\n> = Compute<\n  ConfigParameter<config> & SendTransactionSyncOptions<config, context>\n>\n\nexport type UseSendTransactionSyncReturnType<\n  config extends Config = Config,\n  context = unknown,\n> = Compute<\n  UseMutationReturnType<\n    SendTransactionSyncData,\n    SendTransactionSyncErrorType,\n    SendTransactionSyncVariables<config, config['chains'][number]['id']>,\n    context,\n    SendTransactionSyncMutate<config, context>,\n    SendTransactionSyncMutateAsync<config, context>\n  > & {\n    /** @deprecated use `mutate` instead */\n    sendTransactionSync: SendTransactionSyncMutate<config, context>\n    /** @deprecated use `mutateAsync` instead */\n    sendTransactionSyncAsync: SendTransactionSyncMutateAsync<config, context>\n  }\n>\n\n/** https://wagmi.sh/react/api/hooks/useSendTransactionSync */\nexport function useSendTransactionSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: UseSendTransactionSyncParameters<config, context> = {},\n): UseSendTransactionSyncReturnType<config, context> {\n  const config = useConfig(parameters)\n  const options = sendTransactionSyncMutationOptions(config, parameters)\n  const mutation = useMutation(options)\n  type Return = UseSendTransactionSyncReturnType<config, context>\n  return {\n    ...(mutation as Return),\n    sendTransactionSync: mutation.mutate as Return['mutate'],\n    sendTransactionSyncAsync: mutation.mutateAsync as Return['mutateAsync'],\n  }\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useShowCallsStatus.test.ts",
    "content": "import { connect, disconnect, sendCalls } from '@wagmi/core'\nimport { accounts, config } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { parseEther } from 'viem'\nimport { test, vi } from 'vitest'\n\nimport { useShowCallsStatus } from './useShowCallsStatus.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n  const { id } = await sendCalls(config, {\n    calls: [\n      {\n        data: '0xdeadbeef',\n        to: accounts[1],\n        value: parseEther('1'),\n      },\n      {\n        to: accounts[2],\n        value: parseEther('2'),\n      },\n      {\n        to: accounts[3],\n        value: parseEther('3'),\n      },\n    ],\n  })\n\n  const { result } = await renderHook(() => useShowCallsStatus())\n\n  result.current.mutate({ id })\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useShowCallsStatus.ts",
    "content": "'use client'\nimport { useMutation } from '@tanstack/react-query'\nimport type {\n  Config,\n  ResolvedRegister,\n  ShowCallsStatusErrorType,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type ShowCallsStatusData,\n  type ShowCallsStatusMutate,\n  type ShowCallsStatusMutateAsync,\n  type ShowCallsStatusOptions,\n  type ShowCallsStatusVariables,\n  showCallsStatusMutationOptions,\n} from '@wagmi/core/query'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseShowCallsStatusParameters<\n  config extends Config = Config,\n  context = unknown,\n> = Compute<ConfigParameter<config> & ShowCallsStatusOptions<context>>\n\nexport type UseShowCallsStatusReturnType<context = unknown> = Compute<\n  UseMutationReturnType<\n    ShowCallsStatusData,\n    ShowCallsStatusErrorType,\n    ShowCallsStatusVariables,\n    context,\n    ShowCallsStatusMutate,\n    ShowCallsStatusMutateAsync\n  > & {\n    /** @deprecated use `mutate` instead */\n    showCallsStatus: ShowCallsStatusMutate\n    /** @deprecated use `mutateAsync` instead */\n    showCallsStatusAsync: ShowCallsStatusMutateAsync\n  }\n>\n\n/** https://wagmi.sh/react/api/hooks/useShowCallsStatus */\nexport function useShowCallsStatus<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: UseShowCallsStatusParameters<config, context> = {},\n): UseShowCallsStatusReturnType<context> {\n  const config = useConfig(parameters)\n  const options = showCallsStatusMutationOptions(config, parameters)\n  const mutation = useMutation(options)\n  type Return = UseShowCallsStatusReturnType<context>\n  return {\n    ...(mutation as Return),\n    showCallsStatus: mutation.mutate as Return['mutate'],\n    showCallsStatusAsync: mutation.mutateAsync as Return['mutateAsync'],\n  }\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useSignMessage.test-d.ts",
    "content": "import type { SignMessageErrorType } from '@wagmi/core'\nimport type { SignMessageVariables } from '@wagmi/core/query'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useSignMessage } from './useSignMessage.js'\n\nconst message = 'hello world'\nconst contextValue = { foo: 'bar' } as const\n\ntest('context', () => {\n  const signMessage = useSignMessage({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toEqualTypeOf<SignMessageVariables>()\n        return contextValue\n      },\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<SignMessageVariables>()\n        expectTypeOf(error).toEqualTypeOf<SignMessageErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<SignMessageVariables>()\n        expectTypeOf(data).toEqualTypeOf<`0x${string}`>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<`0x${string}` | undefined>()\n        expectTypeOf(error).toEqualTypeOf<SignMessageErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<SignMessageVariables>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  })\n\n  expectTypeOf(signMessage.data).toEqualTypeOf<`0x${string}` | undefined>()\n  expectTypeOf(signMessage.error).toEqualTypeOf<SignMessageErrorType | null>()\n  expectTypeOf(signMessage.variables).toEqualTypeOf<\n    SignMessageVariables | undefined\n  >()\n  expectTypeOf(signMessage.context).toEqualTypeOf<\n    typeof contextValue | undefined\n  >()\n\n  signMessage.mutate(\n    { message },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<SignMessageVariables>()\n        expectTypeOf(error).toEqualTypeOf<SignMessageErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<SignMessageVariables>()\n        expectTypeOf(data).toEqualTypeOf<`0x${string}`>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<`0x${string}` | undefined>()\n        expectTypeOf(error).toEqualTypeOf<SignMessageErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<SignMessageVariables>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  )\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useSignMessage.test.ts",
    "content": "import { connect, disconnect, getConnection } from '@wagmi/core'\nimport { config, privateKey } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { recoverMessageAddress } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { expect, test, vi } from 'vitest'\nimport { useSignMessage } from './useSignMessage.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const { result } = await renderHook(() => useSignMessage())\n\n  result.current.mutate({ message: 'foo bar baz' })\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  await expect(\n    recoverMessageAddress({\n      message: 'foo bar baz',\n      signature: result.current.data!,\n    }),\n  ).resolves.toEqual(getConnection(config).address)\n\n  await disconnect(config, { connector })\n})\n\ntest('behavior: local account', async () => {\n  const { result } = await renderHook(() => useSignMessage())\n\n  const account = privateKeyToAccount(privateKey)\n  result.current.mutate({ account, message: 'foo bar baz' })\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  await expect(\n    recoverMessageAddress({\n      message: 'foo bar baz',\n      signature: result.current.data!,\n    }),\n  ).resolves.toEqual(account.address)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useSignMessage.ts",
    "content": "'use client'\nimport { useMutation } from '@tanstack/react-query'\nimport type { SignMessageErrorType } from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type SignMessageData,\n  type SignMessageMutate,\n  type SignMessageMutateAsync,\n  type SignMessageOptions,\n  type SignMessageVariables,\n  signMessageMutationOptions,\n} from '@wagmi/core/query'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseSignMessageParameters<context = unknown> = Compute<\n  ConfigParameter & SignMessageOptions<context>\n>\n\nexport type UseSignMessageReturnType<context = unknown> = Compute<\n  UseMutationReturnType<\n    SignMessageData,\n    SignMessageErrorType,\n    SignMessageVariables,\n    context,\n    SignMessageMutate<context>,\n    SignMessageMutateAsync<context>\n  > & {\n    /** @deprecated use `mutate` instead */\n    signMessage: SignMessageMutate<context>\n    /** @deprecated use `mutateAsync` instead */\n    signMessageAsync: SignMessageMutateAsync<context>\n  }\n>\n\n/** https://wagmi.sh/react/api/hooks/useSignMessage */\nexport function useSignMessage<context = unknown>(\n  parameters: UseSignMessageParameters<context> = {},\n): UseSignMessageReturnType<context> {\n  const config = useConfig(parameters)\n  const options = signMessageMutationOptions(config, parameters)\n  const mutation = useMutation(options)\n  type Return = UseSignMessageReturnType<context>\n  return {\n    ...(mutation as Return),\n    signMessage: mutation.mutate as Return['mutate'],\n    signMessageAsync: mutation.mutateAsync as Return['mutateAsync'],\n  }\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useSignTransaction.test-d.ts",
    "content": "import type { SignTransactionErrorType } from '@wagmi/core'\nimport type {\n  Hash,\n  TransactionSerializedEIP1559,\n  TransactionSerializedEIP2930,\n  TransactionSerializedEIP4844,\n  TransactionSerializedEIP7702,\n  TransactionSerializedLegacy,\n} from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport { useSignTransaction } from './useSignTransaction.js'\n\nconst contextValue = { foo: 'bar' } as const\n\ntest('context', () => {\n  const signTransaction = useSignTransaction({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toMatchTypeOf<\n          { chainId?: number | undefined } | undefined\n        >()\n        return contextValue\n      },\n      onError(error, variables, context) {\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n        }>()\n        expectTypeOf(error).toEqualTypeOf<SignTransactionErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n        }>()\n        expectTypeOf(data).toMatchTypeOf<Hash>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toMatchTypeOf<Hash | undefined>()\n        expectTypeOf(error).toEqualTypeOf<SignTransactionErrorType | null>()\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  })\n\n  expectTypeOf(signTransaction.data).toMatchTypeOf<Hash | undefined>()\n  expectTypeOf(\n    signTransaction.error,\n  ).toEqualTypeOf<SignTransactionErrorType | null>()\n  expectTypeOf(signTransaction.variables).toMatchTypeOf<\n    { chainId?: number | undefined } | undefined\n  >()\n  expectTypeOf(signTransaction.context).toEqualTypeOf<\n    typeof contextValue | undefined\n  >()\n\n  signTransaction.mutate(\n    { to: '0x' },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n        }>()\n        expectTypeOf(error).toEqualTypeOf<SignTransactionErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n        }>()\n        expectTypeOf(data).toMatchTypeOf<Hash>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toMatchTypeOf<Hash | undefined>()\n        expectTypeOf(error).toEqualTypeOf<SignTransactionErrorType | null>()\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  )\n})\n\ntest('legacy', () => {\n  const { mutateAsync } = useSignTransaction()\n\n  const result1 = mutateAsync({ gasPrice: 0n })\n  const result2 = mutateAsync({ type: 'legacy' })\n\n  expectTypeOf(result1).toEqualTypeOf<Promise<TransactionSerializedLegacy>>()\n  expectTypeOf(result2).toEqualTypeOf<Promise<TransactionSerializedLegacy>>()\n\n  // @ts-expect-error\n  mutateAsync({\n    gasPrice: 0n,\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n  })\n\n  // @ts-expect-error\n  mutateAsync({\n    gasPrice: 0n,\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n    type: 'legacy',\n  })\n  // @ts-expect-error\n  mutateAsync({\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n    type: 'legacy',\n  })\n})\n\ntest('eip7702', () => {\n  const { mutateAsync } = useSignTransaction()\n\n  const result1 = mutateAsync({\n    authorizationList: [],\n  })\n  const result2 = mutateAsync({\n    authorizationList: [],\n    type: 'eip7702',\n  })\n\n  expectTypeOf(result1).toEqualTypeOf<Promise<TransactionSerializedEIP7702>>()\n  expectTypeOf(result2).toEqualTypeOf<Promise<TransactionSerializedEIP7702>>()\n})\n\ntest('eip4844', () => {\n  const { mutateAsync } = useSignTransaction()\n\n  const result1 = mutateAsync({\n    blobVersionedHashes: [],\n    maxFeePerBlobGas: 0n,\n    to: '0x0000000000000000000000000000000000000000',\n  })\n  const result2 = mutateAsync({\n    blobVersionedHashes: [],\n    maxFeePerBlobGas: 0n,\n    to: '0x0000000000000000000000000000000000000000',\n    type: 'eip4844',\n  })\n\n  expectTypeOf(result1).toEqualTypeOf<Promise<TransactionSerializedEIP4844>>()\n  expectTypeOf(result2).toEqualTypeOf<Promise<TransactionSerializedEIP4844>>()\n})\n\ntest('eip1559', () => {\n  const { mutateAsync } = useSignTransaction()\n\n  const result1 = mutateAsync({\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n  })\n  const result2 = mutateAsync({\n    type: 'eip1559',\n  })\n\n  expectTypeOf(result1).toEqualTypeOf<Promise<TransactionSerializedEIP1559>>()\n  expectTypeOf(result2).toEqualTypeOf<Promise<TransactionSerializedEIP1559>>()\n\n  // @ts-expect-error\n  mutateAsync({\n    gasPrice: 0n,\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n  })\n\n  // @ts-expect-error\n  mutateAsync({\n    gasPrice: 0n,\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n    type: 'eip1559',\n  })\n  // @ts-expect-error\n  mutateAsync({\n    gasPrice: 0n,\n    type: 'eip1559',\n  })\n})\n\ntest('eip2930', () => {\n  const { mutateAsync } = useSignTransaction()\n\n  const result1 = mutateAsync({\n    accessList: [],\n    gasPrice: 0n,\n  })\n  const result2 = mutateAsync({\n    type: 'eip2930',\n  })\n\n  expectTypeOf(result1).toEqualTypeOf<Promise<TransactionSerializedEIP2930>>()\n  expectTypeOf(result2).toEqualTypeOf<Promise<TransactionSerializedEIP2930>>()\n\n  // @ts-expect-error\n  mutateAsync({\n    accessList: [],\n    gasPrice: 0n,\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n  })\n\n  // @ts-expect-error\n  mutateAsync({\n    accessList: [],\n    gasPrice: 0n,\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n    type: 'eip2930',\n  })\n  // @ts-expect-error\n  mutateAsync({\n    accessList: [],\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n    type: 'eip2930',\n  })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useSignTransaction.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { config, signedTransactionRegex } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { parseEther } from 'viem'\nimport { expect, test, vi } from 'vitest'\n\nimport { useSignTransaction } from './useSignTransaction.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const { result } = await renderHook(() => useSignTransaction())\n\n  result.current.mutate({\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n  })\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 5_000 })\n\n  expect(result.current.data).toMatch(signedTransactionRegex)\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useSignTransaction.ts",
    "content": "'use client'\nimport { useMutation } from '@tanstack/react-query'\nimport type {\n  Config,\n  ResolvedRegister,\n  SelectChains,\n  SignTransactionErrorType,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type SignTransactionData,\n  type SignTransactionMutate,\n  type SignTransactionMutateAsync,\n  type SignTransactionOptions,\n  type SignTransactionVariables,\n  signTransactionMutationOptions,\n} from '@wagmi/core/query'\nimport type { SignTransactionRequest as viem_SignTransactionRequest } from 'viem'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseSignTransactionParameters<\n  config extends Config = Config,\n  request extends viem_SignTransactionRequest<\n    SelectChains<config, config['chains'][number]['id']>[0],\n    SelectChains<config, config['chains'][number]['id']>[0]\n  > = viem_SignTransactionRequest<\n    SelectChains<config, config['chains'][number]['id']>[0],\n    SelectChains<config, config['chains'][number]['id']>[0]\n  >,\n  context = unknown,\n> = Compute<\n  ConfigParameter<config> &\n    SignTransactionOptions<\n      config,\n      config['chains'][number]['id'],\n      request,\n      context\n    >\n>\n\nexport type UseSignTransactionReturnType<\n  config extends Config = Config,\n  request extends viem_SignTransactionRequest<\n    SelectChains<config, config['chains'][number]['id']>[0],\n    SelectChains<config, config['chains'][number]['id']>[0]\n  > = viem_SignTransactionRequest<\n    SelectChains<config, config['chains'][number]['id']>[0],\n    SelectChains<config, config['chains'][number]['id']>[0]\n  >,\n  context = unknown,\n> = Compute<\n  UseMutationReturnType<\n    SignTransactionData<config, config['chains'][number]['id'], request>,\n    SignTransactionErrorType,\n    SignTransactionVariables<config, config['chains'][number]['id'], request>,\n    context,\n    SignTransactionMutate<config, context>,\n    SignTransactionMutateAsync<config, context>\n  > & {\n    /** @deprecated use `mutate` instead */\n    signTransaction: SignTransactionMutate<config, context>\n    /** @deprecated use `mutateAsync` instead */\n    signTransactionAsync: SignTransactionMutateAsync<config, context>\n  }\n>\n\n/** https://wagmi.sh/react/api/hooks/useSignTransaction */\nexport function useSignTransaction<\n  config extends Config = ResolvedRegister['config'],\n  request extends viem_SignTransactionRequest<\n    SelectChains<config, config['chains'][number]['id']>[0],\n    SelectChains<config, config['chains'][number]['id']>[0]\n  > = viem_SignTransactionRequest<\n    SelectChains<config, config['chains'][number]['id']>[0],\n    SelectChains<config, config['chains'][number]['id']>[0]\n  >,\n  context = unknown,\n>(\n  parameters: UseSignTransactionParameters<config, request, context> = {},\n): UseSignTransactionReturnType<config, request, context> {\n  const config = useConfig(parameters)\n  const options = signTransactionMutationOptions(config, parameters)\n  const mutation = useMutation(options)\n  type Return = UseSignTransactionReturnType<config, request, context>\n  return {\n    ...(mutation as unknown as Return),\n    signTransaction: mutation.mutate as Return['mutate'],\n    signTransactionAsync:\n      mutation.mutateAsync as unknown as Return['mutateAsync'],\n  }\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useSignTypedData.test-d.ts",
    "content": "import type {\n  SignTypedDataErrorType,\n  SignTypedDataReturnType,\n} from '@wagmi/core'\nimport type { SignTypedDataVariables } from '@wagmi/core/query'\nimport { typedData } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useSignTypedData } from './useSignTypedData.js'\n\nconst contextValue = { foo: 'bar' } as const\n\ntest('context', () => {\n  const signTypedData = useSignTypedData({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toMatchTypeOf<SignTypedDataVariables>()\n        return contextValue\n      },\n      onError(error, variables, context) {\n        expectTypeOf(variables).toMatchTypeOf<SignTypedDataVariables>()\n        expectTypeOf(error).toEqualTypeOf<SignTypedDataErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toMatchTypeOf<SignTypedDataVariables>()\n        expectTypeOf(data).toEqualTypeOf<SignTypedDataReturnType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<SignTypedDataReturnType | undefined>()\n        expectTypeOf(error).toEqualTypeOf<SignTypedDataErrorType | null>()\n        expectTypeOf(variables).toMatchTypeOf<SignTypedDataVariables>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  })\n\n  expectTypeOf(signTypedData.data).toEqualTypeOf<\n    SignTypedDataReturnType | undefined\n  >()\n  expectTypeOf(\n    signTypedData.error,\n  ).toEqualTypeOf<SignTypedDataErrorType | null>()\n  expectTypeOf(signTypedData.variables).toMatchTypeOf<\n    SignTypedDataVariables | undefined\n  >()\n  expectTypeOf(signTypedData.context).toEqualTypeOf<\n    typeof contextValue | undefined\n  >()\n\n  signTypedData.mutate(\n    {\n      types: typedData.basic.types,\n      primaryType: 'Person',\n      message: {\n        name: 'Bob',\n        wallet: '0x',\n      },\n    },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(error).toEqualTypeOf<SignTypedDataErrorType>()\n        expectTypeOf(variables).toMatchTypeOf<{\n          types: typeof typedData.basic.types\n          primaryType: 'Person'\n          message: {\n            name: string\n            wallet: `0x${string}`\n          }\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<SignTypedDataReturnType>()\n        expectTypeOf(variables).toMatchTypeOf<{\n          types: typeof typedData.basic.types\n          primaryType: 'Person'\n          message: {\n            name: string\n            wallet: `0x${string}`\n          }\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<SignTypedDataReturnType | undefined>()\n        expectTypeOf(error).toEqualTypeOf<SignTypedDataErrorType | null>()\n        expectTypeOf(variables).toMatchTypeOf<{\n          types: typeof typedData.basic.types\n          primaryType: 'Person'\n          message: {\n            name: string\n            wallet: `0x${string}`\n          }\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  )\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useSignTypedData.test.ts",
    "content": "import { connect, disconnect, getConnection } from '@wagmi/core'\nimport { config, privateKey, typedData } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { recoverTypedDataAddress } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { expect, test, vi } from 'vitest'\nimport { useSignTypedData } from './useSignTypedData.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const { result } = await renderHook(() => useSignTypedData())\n\n  result.current.mutate({\n    types: typedData.basic.types,\n    primaryType: 'Mail',\n    message: typedData.basic.message,\n  })\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  await expect(\n    recoverTypedDataAddress({\n      types: typedData.basic.types,\n      primaryType: 'Mail',\n      message: typedData.basic.message,\n      signature: result.current.data!,\n    }),\n  ).resolves.toEqual(getConnection(config).address)\n\n  await disconnect(config, { connector })\n})\n\ntest('behavior: local account', async () => {\n  const { result } = await renderHook(() => useSignTypedData())\n\n  const account = privateKeyToAccount(privateKey)\n  result.current.mutate({\n    account,\n    types: typedData.basic.types,\n    primaryType: 'Mail',\n    message: typedData.basic.message,\n  })\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  await expect(\n    recoverTypedDataAddress({\n      types: typedData.basic.types,\n      primaryType: 'Mail',\n      message: typedData.basic.message,\n      signature: result.current.data!,\n    }),\n  ).resolves.toEqual(account.address)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useSignTypedData.ts",
    "content": "'use client'\nimport { useMutation } from '@tanstack/react-query'\nimport type { SignTypedDataErrorType } from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type SignTypedDataData,\n  type SignTypedDataMutate,\n  type SignTypedDataMutateAsync,\n  type SignTypedDataOptions,\n  type SignTypedDataVariables,\n  signTypedDataMutationOptions,\n} from '@wagmi/core/query'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseSignTypedDataParameters<context = unknown> = Compute<\n  ConfigParameter & SignTypedDataOptions<context>\n>\n\nexport type UseSignTypedDataReturnType<context = unknown> = Compute<\n  UseMutationReturnType<\n    SignTypedDataData,\n    SignTypedDataErrorType,\n    SignTypedDataVariables,\n    context,\n    SignTypedDataMutate<context>,\n    SignTypedDataMutateAsync<context>\n  > & {\n    /** @deprecated use `mutate` instead */\n    signTypedData: SignTypedDataMutate<context>\n    /** @deprecated use `mutateAsync` instead */\n    signTypedDataAsync: SignTypedDataMutateAsync<context>\n  }\n>\n\n/** https://wagmi.sh/react/api/hooks/useSignTypedData */\nexport function useSignTypedData<context = unknown>(\n  parameters: UseSignTypedDataParameters<context> = {},\n): UseSignTypedDataReturnType<context> {\n  const config = useConfig(parameters)\n  const options = signTypedDataMutationOptions(config, parameters)\n  const mutation = useMutation(options)\n  type Return = UseSignTypedDataReturnType<context>\n  return {\n    ...(mutation as Return),\n    signTypedData: mutation.mutate as Return['mutate'],\n    signTypedDataAsync: mutation.mutateAsync as Return['mutateAsync'],\n  }\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useSimulateContract.test-d.ts",
    "content": "import { abi, type config } from '@wagmi/test'\nimport type { Address } from 'viem'\nimport { assertType, expectTypeOf, test } from 'vitest'\n\nimport {\n  type UseSimulateContractParameters,\n  type UseSimulateContractReturnType,\n  useSimulateContract,\n} from './useSimulateContract.js'\n\ntest('default', () => {\n  const result = useSimulateContract({\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n  })\n\n  expectTypeOf(result.data).toMatchTypeOf<\n    | {\n        result: boolean\n        request: {\n          chainId?: undefined\n          abi: readonly [\n            {\n              readonly name: 'transferFrom'\n              readonly type: 'function'\n              readonly stateMutability: 'nonpayable'\n              readonly inputs: readonly [\n                { readonly type: 'address'; readonly name: 'sender' },\n                { readonly type: 'address'; readonly name: 'recipient' },\n                { readonly type: 'uint256'; readonly name: 'amount' },\n              ]\n              readonly outputs: readonly [{ type: 'bool' }]\n            },\n          ]\n          functionName: 'transferFrom'\n          args: readonly [Address, Address, bigint]\n        }\n      }\n    | undefined\n  >()\n})\n\ntest('select data', () => {\n  const result = useSimulateContract({\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    chainId: 1,\n    query: {\n      select(data) {\n        expectTypeOf(data.result).toEqualTypeOf<boolean>()\n        return data.request.args\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<\n    readonly [Address, Address, bigint] | undefined\n  >()\n})\n\ntest('UseSimulateContractParameters', () => {\n  type Result = UseSimulateContractParameters<typeof abi.erc20, 'transferFrom'>\n  expectTypeOf<Result>().toMatchTypeOf<{\n    functionName?: 'approve' | 'transfer' | 'transferFrom' | undefined\n    args?: readonly [Address, Address, bigint] | undefined\n  }>()\n})\n\ntest('UseSimulateContractReturnType', () => {\n  type Result = UseSimulateContractReturnType<\n    typeof abi.erc20,\n    'transferFrom',\n    ['0x', '0x', 123n],\n    typeof config,\n    1\n  >\n  expectTypeOf<Result['data']>().toMatchTypeOf<\n    | {\n        result: boolean\n        request: {\n          chainId: number\n          abi: readonly [\n            {\n              readonly name: 'transferFrom'\n              readonly type: 'function'\n              readonly stateMutability: 'nonpayable'\n              readonly inputs: readonly [\n                { readonly type: 'address'; readonly name: 'sender' },\n                { readonly type: 'address'; readonly name: 'recipient' },\n                { readonly type: 'uint256'; readonly name: 'amount' },\n              ]\n              readonly outputs: readonly [{ type: 'bool' }]\n            },\n          ]\n          functionName: 'approve' | 'transfer' | 'transferFrom'\n          args: readonly [Address, Address, bigint]\n        }\n      }\n    | undefined\n  >()\n})\n\ntest('overloads', () => {\n  const result1 = useSimulateContract({\n    address: '0x',\n    abi: abi.writeOverloads,\n    functionName: 'foo',\n  })\n  assertType<number | undefined>(result1.data?.result)\n\n  const result2 = useSimulateContract({\n    address: '0x',\n    abi: abi.writeOverloads,\n    functionName: 'foo',\n    args: [],\n  })\n  assertType<number | undefined>(result2.data?.result)\n\n  const result3 = useSimulateContract({\n    address: '0x',\n    abi: abi.writeOverloads,\n    functionName: 'foo',\n    args: ['0x'],\n  })\n  assertType<string | undefined>(result3.data?.result)\n\n  const result4 = useSimulateContract({\n    address: '0x',\n    abi: abi.writeOverloads,\n    functionName: 'foo',\n    args: ['0x', '0x'],\n  })\n  assertType<\n    | {\n        foo: `0x${string}`\n        bar: `0x${string}`\n      }\n    | undefined\n  >(result4.data?.result)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useSimulateContract.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { abi, address, config, wait } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useSimulateContract } from './useSimulateContract.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const { result } = await renderHook(() =>\n    useSimulateContract({\n      address: address.wagmiMintExample,\n      abi: abi.wagmiMintExample,\n      functionName: 'mint',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": {\n        \"chainId\": 1,\n        \"request\": {\n          \"abi\": [\n            {\n              \"inputs\": [],\n              \"name\": \"mint\",\n              \"outputs\": [],\n              \"stateMutability\": \"nonpayable\",\n              \"type\": \"function\",\n            },\n          ],\n          \"account\": {\n            \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n            \"type\": \"json-rpc\",\n          },\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"args\": undefined,\n          \"chainId\": 1,\n          \"dataSuffix\": undefined,\n          \"functionName\": \"mint\",\n        },\n        \"result\": undefined,\n      },\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"simulateContract\",\n        {\n          \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"chainId\": 1,\n          \"functionName\": \"mint\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n\n  await disconnect(config, { connector })\n})\n\ntest('behavior: disabled when properties missing', async () => {\n  const { result } = await renderHook(() => useSimulateContract())\n\n  await wait(100)\n  await vi.waitFor(() => expect(result.current.isPending).toBeTruthy())\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useSimulateContract.ts",
    "content": "'use client'\nimport type {\n  Config,\n  ResolvedRegister,\n  SimulateContractErrorType,\n} from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type SimulateContractData,\n  type SimulateContractOptions,\n  simulateContractQueryOptions,\n} from '@wagmi/core/query'\nimport type { Abi, ContractFunctionArgs, ContractFunctionName } from 'viem'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\nimport { useConnection } from './useConnection.js'\n\nexport type UseSimulateContractParameters<\n  abi extends Abi | readonly unknown[] = Abi,\n  functionName extends ContractFunctionName<\n    abi,\n    'nonpayable' | 'payable'\n  > = ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  > = ContractFunctionArgs<abi, 'nonpayable' | 'payable', functionName>,\n  config extends Config = Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  selectData = SimulateContractData<abi, functionName, args, config, chainId>,\n> = SimulateContractOptions<\n  abi,\n  functionName,\n  args,\n  config,\n  chainId,\n  selectData\n> &\n  ConfigParameter<config>\n\nexport type UseSimulateContractReturnType<\n  abi extends Abi | readonly unknown[] = Abi,\n  functionName extends ContractFunctionName<\n    abi,\n    'nonpayable' | 'payable'\n  > = ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  > = ContractFunctionArgs<abi, 'nonpayable' | 'payable', functionName>,\n  config extends Config = Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  selectData = SimulateContractData<abi, functionName, args, config, chainId>,\n> = UseQueryReturnType<selectData, SimulateContractErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useSimulateContract */\nexport function useSimulateContract<\n  const abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  const args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  >,\n  config extends Config = ResolvedRegister['config'],\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  selectData = SimulateContractData<abi, functionName, args, config, chainId>,\n>(\n  parameters: UseSimulateContractParameters<\n    abi,\n    functionName,\n    args,\n    config,\n    chainId,\n    selectData\n  > = {} as any,\n): UseSimulateContractReturnType<\n  abi,\n  functionName,\n  args,\n  config,\n  chainId,\n  selectData\n> {\n  const config = useConfig(parameters)\n  const { address, connector } = useConnection()\n  const chainId = useChainId({ config })\n  const options = simulateContractQueryOptions(config, {\n    ...(parameters as any),\n    account: parameters.account ?? address,\n    chainId: parameters.chainId ?? chainId,\n    connector: parameters.connector ?? connector,\n  })\n  return useQuery(options) as any\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useStorageAt.test-d.ts",
    "content": "import type { Hex } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport { useStorageAt } from './useStorageAt.js'\n\ntest('select data', () => {\n  const result = useStorageAt({\n    query: {\n      select(data) {\n        return data\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<Hex | undefined>()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useStorageAt.test.ts",
    "content": "import { address, chain, wait } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport type { Address } from 'viem'\nimport { expect, test, vi } from 'vitest'\nimport { useStorageAt } from './useStorageAt.js'\n\ntest('default', async () => {\n  const { result } = await renderHook(() =>\n    useStorageAt({\n      address: address.wagmiMintExample,\n      slot: '0x0',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": \"0x7761676d6900000000000000000000000000000000000000000000000000000a\",\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"getStorageAt\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"chainId\": 1,\n          \"slot\": \"0x0\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: blockNumber', async () => {\n  const { result } = await renderHook(() =>\n    useStorageAt({\n      address: address.wagmiMintExample,\n      blockNumber: 16280770n,\n      slot: '0x0',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": \"0x7761676d6900000000000000000000000000000000000000000000000000000a\",\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"getStorageAt\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"blockNumber\": 16280770n,\n          \"chainId\": 1,\n          \"slot\": \"0x0\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: blockTag', async () => {\n  const { result } = await renderHook(() =>\n    useStorageAt({\n      address: address.wagmiMintExample,\n      blockTag: 'safe',\n      slot: '0x0',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": \"0x7761676d6900000000000000000000000000000000000000000000000000000a\",\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"getStorageAt\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"blockTag\": \"safe\",\n          \"chainId\": 1,\n          \"slot\": \"0x0\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: chainId', async () => {\n  const { result } = await renderHook(() =>\n    useStorageAt({\n      address: address.wagmiMintExample,\n      chainId: chain.optimism.id,\n      slot: '0x0',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": \"0x0000000000000000000000000000000000000000000000000000000000000000\",\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"getStorageAt\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"chainId\": 10,\n          \"slot\": \"0x0\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('behavior: address: undefined -> defined', async () => {\n  const { result, rerender } = await renderHook(\n    (props) =>\n      useStorageAt({\n        address: props?.address,\n        slot: '0x0',\n      }),\n    { initialProps: { address: undefined as Address | undefined } },\n  )\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": undefined,\n      \"dataUpdatedAt\": 0,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": false,\n      \"isFetchedAfterMount\": false,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": true,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": false,\n      \"isSuccess\": false,\n      \"queryKey\": [\n        \"getStorageAt\",\n        {\n          \"address\": undefined,\n          \"chainId\": 1,\n          \"slot\": \"0x0\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"pending\",\n    }\n  `)\n\n  rerender({ address: address.wagmiMintExample })\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": \"0x7761676d6900000000000000000000000000000000000000000000000000000a\",\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"getStorageAt\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"chainId\": 1,\n          \"slot\": \"0x0\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('behavior: disabled when properties missing', async () => {\n  const { result } = await renderHook(() => useStorageAt())\n\n  await wait(100)\n  await vi.waitFor(() => expect(result.current.isPending).toBeTruthy())\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useStorageAt.ts",
    "content": "'use client'\nimport type {\n  Config,\n  GetStorageAtErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetStorageAtData,\n  type GetStorageAtOptions,\n  getStorageAtQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseStorageAtParameters<\n  config extends Config = Config,\n  selectData = GetStorageAtData,\n> = Compute<GetStorageAtOptions<config, selectData> & ConfigParameter<config>>\n\nexport type UseStorageAtReturnType<selectData = GetStorageAtData> =\n  UseQueryReturnType<selectData, GetStorageAtErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useStorageAt */\nexport function useStorageAt<\n  config extends Config = ResolvedRegister['config'],\n  selectData = GetStorageAtData,\n>(\n  parameters: UseStorageAtParameters<config, selectData> = {},\n): UseStorageAtReturnType<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = getStorageAtQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options)\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useSwitchChain.test-d.ts",
    "content": "import type { Connector, SwitchChainErrorType } from '@wagmi/core'\nimport type { Chain } from '@wagmi/core/chains'\nimport type { Compute, ExactPartial } from '@wagmi/core/internal'\nimport { chain } from '@wagmi/test'\nimport type { AddEthereumChainParameter } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport { useSwitchChain } from './useSwitchChain.js'\n\nconst chainId = chain.mainnet.id\nconst contextValue = { foo: 'bar' } as const\n\ntest('context', () => {\n  const switchChain = useSwitchChain({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toEqualTypeOf<{\n          addEthereumChainParameter?:\n            | ExactPartial<Omit<AddEthereumChainParameter, 'chainId'>>\n            | undefined\n          chainId: number\n          connector?: Connector | undefined\n        }>()\n        return contextValue\n      },\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{\n          addEthereumChainParameter?:\n            | ExactPartial<Omit<AddEthereumChainParameter, 'chainId'>>\n            | undefined\n          chainId: number\n          connector?: Connector | undefined\n        }>()\n        expectTypeOf(error).toEqualTypeOf<SwitchChainErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{\n          addEthereumChainParameter?:\n            | ExactPartial<Omit<AddEthereumChainParameter, 'chainId'>>\n            | undefined\n          chainId: number\n          connector?: Connector | undefined\n        }>()\n        expectTypeOf(data).toEqualTypeOf<Compute<Chain>>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<Compute<Chain> | undefined>()\n        expectTypeOf(error).toEqualTypeOf<SwitchChainErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<{\n          addEthereumChainParameter?:\n            | ExactPartial<Omit<AddEthereumChainParameter, 'chainId'>>\n            | undefined\n          chainId: number\n          connector?: Connector | undefined\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  })\n\n  expectTypeOf(switchChain.data).toEqualTypeOf<Compute<Chain> | undefined>()\n  expectTypeOf(switchChain.error).toEqualTypeOf<SwitchChainErrorType | null>()\n  expectTypeOf(switchChain.variables).toEqualTypeOf<\n    | {\n        addEthereumChainParameter?:\n          | ExactPartial<Omit<AddEthereumChainParameter, 'chainId'>>\n          | undefined\n        chainId: number\n        connector?: Connector | undefined\n      }\n    | undefined\n  >()\n  expectTypeOf(switchChain.context).toEqualTypeOf<\n    typeof contextValue | undefined\n  >()\n\n  switchChain.mutate(\n    { chainId },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{\n          addEthereumChainParameter?:\n            | ExactPartial<Omit<AddEthereumChainParameter, 'chainId'>>\n            | undefined\n          chainId: number\n          connector?: Connector | undefined\n        }>()\n        expectTypeOf(error).toEqualTypeOf<SwitchChainErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{\n          addEthereumChainParameter?:\n            | ExactPartial<Omit<AddEthereumChainParameter, 'chainId'>>\n            | undefined\n          chainId: number\n          connector?: Connector | undefined\n        }>()\n        expectTypeOf(data).toEqualTypeOf<Compute<Chain>>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<Compute<Chain> | undefined>()\n        expectTypeOf(error).toEqualTypeOf<SwitchChainErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<{\n          addEthereumChainParameter?:\n            | ExactPartial<Omit<AddEthereumChainParameter, 'chainId'>>\n            | undefined\n          chainId: number\n          connector?: Connector | undefined\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  )\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useSwitchChain.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { chain, config } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useConnection } from './useConnection.js'\nimport { useSwitchChain } from './useSwitchChain.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const { result, act } = await renderHook(() => ({\n    useConnection: useConnection(),\n    useSwitchChain: useSwitchChain(),\n  }))\n\n  const chainId1 = result.current.useConnection.chainId\n  expect(chainId1).toBeDefined()\n\n  await act(() =>\n    result.current.useSwitchChain.mutate({ chainId: chain.mainnet2.id }),\n  )\n  await vi.waitFor(() =>\n    expect(result.current.useSwitchChain.isSuccess).toBeTruthy(),\n  )\n\n  const chainId2 = result.current.useConnection.chainId\n  expect(chainId2).toBeDefined()\n  expect(chainId1).not.toBe(chainId2)\n\n  await act(() =>\n    result.current.useSwitchChain.mutate({ chainId: chain.mainnet.id }),\n  )\n  await vi.waitFor(() =>\n    expect(result.current.useSwitchChain.isSuccess).toBeTruthy(),\n  )\n\n  const chainId3 = result.current.useConnection.chainId\n  expect(chainId3).toBeDefined()\n  expect(chainId1).toBe(chainId3)\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useSwitchChain.ts",
    "content": "'use client'\nimport { useMutation } from '@tanstack/react-query'\nimport type {\n  Config,\n  ResolvedRegister,\n  SwitchChainErrorType,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type SwitchChainData,\n  type SwitchChainMutate,\n  type SwitchChainMutateAsync,\n  type SwitchChainOptions,\n  type SwitchChainVariables,\n  switchChainMutationOptions,\n} from '@wagmi/core/query'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useChains } from './useChains.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseSwitchChainParameters<\n  config extends Config = Config,\n  context = unknown,\n> = Compute<ConfigParameter<config> & SwitchChainOptions<config, context>>\n\nexport type UseSwitchChainReturnType<\n  config extends Config = Config,\n  context = unknown,\n> = Compute<\n  UseMutationReturnType<\n    SwitchChainData<config, config['chains'][number]['id']>,\n    SwitchChainErrorType,\n    SwitchChainVariables<config, config['chains'][number]['id']>,\n    context,\n    SwitchChainMutate<config, context>,\n    SwitchChainMutateAsync<config, context>\n  > & {\n    /** @deprecated use `useChains` instead */\n    chains: config['chains']\n    /** @deprecated use `mutate` instead */\n    switchChain: SwitchChainMutate<config, context>\n    /** @deprecated use `mutateAsync` instead */\n    switchChainAsync: SwitchChainMutateAsync<config, context>\n  }\n>\n\n/** https://wagmi.sh/react/api/hooks/useSwitchChain */\nexport function useSwitchChain<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: UseSwitchChainParameters<config, context> = {},\n): UseSwitchChainReturnType<config, context> {\n  const config = useConfig(parameters)\n  const options = switchChainMutationOptions(config, parameters)\n  const mutation = useMutation(options)\n  type Return = UseSwitchChainReturnType<config, context>\n  return {\n    ...(mutation as Return),\n    chains: useChains({ config }) as unknown as config['chains'],\n    switchChain: mutation.mutate as Return['mutate'],\n    switchChainAsync: mutation.mutateAsync as Return['mutateAsync'],\n  }\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useSwitchConnection.test-d.ts",
    "content": "import type { Connector, SwitchAccountErrorType } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport type { Address } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport { useSwitchConnection } from './useSwitchConnection.js'\n\nconst connector = config.connectors[0]!\nconst contextValue = { foo: 'bar' } as const\n\ntest('context', () => {\n  const switchConnection = useSwitchConnection({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toEqualTypeOf<{ connector: Connector }>()\n        return contextValue\n      },\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{ connector: Connector }>()\n        expectTypeOf(error).toEqualTypeOf<SwitchAccountErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{ connector: Connector }>()\n        expectTypeOf(data).toEqualTypeOf<{\n          accounts: readonly [Address, ...Address[]]\n          chainId: number\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<\n          | {\n              accounts: readonly [Address, ...Address[]]\n              chainId: number\n            }\n          | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<SwitchAccountErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<{ connector: Connector }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  })\n\n  expectTypeOf(switchConnection.data).toEqualTypeOf<\n    | {\n        accounts: readonly [Address, ...Address[]]\n        chainId: number\n      }\n    | undefined\n  >()\n  expectTypeOf(\n    switchConnection.error,\n  ).toEqualTypeOf<SwitchAccountErrorType | null>()\n  expectTypeOf(switchConnection.variables).toEqualTypeOf<\n    { connector: Connector } | undefined\n  >()\n  expectTypeOf(switchConnection.context).toEqualTypeOf<\n    typeof contextValue | undefined\n  >()\n\n  switchConnection.mutate(\n    { connector },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{ connector: Connector }>()\n        expectTypeOf(error).toEqualTypeOf<SwitchAccountErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{ connector: Connector }>()\n        expectTypeOf(data).toEqualTypeOf<{\n          accounts: readonly [Address, ...Address[]]\n          chainId: number\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<\n          | {\n              accounts: readonly [Address, ...Address[]]\n              chainId: number\n            }\n          | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<SwitchAccountErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<{ connector: Connector }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  )\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useSwitchConnection.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { config, wait } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useConnection } from './useConnection.js'\nimport { useSwitchConnection } from './useSwitchConnection.js'\n\nconst connector1 = config.connectors[0]!\nconst connector2 = config.connectors[1]!\n\ntest('default', async () => {\n  await connect(config, { connector: connector2 })\n  await connect(config, { connector: connector1 })\n\n  const { result } = await renderHook(() => ({\n    useConnection: useConnection(),\n    useSwitchConnection: useSwitchConnection(),\n  }))\n\n  const address1 = result.current.useConnection.address\n  expect(address1).toBeDefined()\n\n  result.current.useSwitchConnection.mutate({ connector: connector2 })\n  await vi.waitFor(() =>\n    expect(result.current.useSwitchConnection.isSuccess).toBeTruthy(),\n  )\n  await wait(0)\n\n  const address2 = result.current.useConnection.address\n  expect(address2).toBeDefined()\n  expect(address1).not.toBe(address2)\n\n  result.current.useSwitchConnection.mutate({ connector: connector1 })\n  await vi.waitFor(() =>\n    expect(result.current.useSwitchConnection.isSuccess).toBeTruthy(),\n  )\n  await wait(0)\n\n  const address3 = result.current.useConnection.address\n  expect(address3).toBeDefined()\n  expect(address1).toBe(address3)\n\n  await disconnect(config, { connector: connector1 })\n  await disconnect(config, { connector: connector2 })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useSwitchConnection.ts",
    "content": "'use client'\nimport { useMutation } from '@tanstack/react-query'\nimport type {\n  Config,\n  Connector,\n  ResolvedRegister,\n  SwitchConnectionErrorType,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type SwitchConnectionData,\n  type SwitchConnectionMutate,\n  type SwitchConnectionMutateAsync,\n  type SwitchConnectionOptions,\n  type SwitchConnectionVariables,\n  switchConnectionMutationOptions,\n} from '@wagmi/core/query'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\nimport { useConnections } from './useConnections.js'\n\nexport type UseSwitchConnectionParameters<\n  config extends Config = Config,\n  context = unknown,\n> = Compute<ConfigParameter<config> & SwitchConnectionOptions<config, context>>\n\nexport type UseSwitchConnectionReturnType<\n  config extends Config = Config,\n  context = unknown,\n> = Compute<\n  UseMutationReturnType<\n    SwitchConnectionData<config>,\n    SwitchConnectionErrorType,\n    SwitchConnectionVariables,\n    context,\n    SwitchConnectionMutate<config, context>,\n    SwitchConnectionMutateAsync<config, context>\n  > & {\n    /** @deprecated use `useConnections` instead */\n    connectors: readonly Connector[]\n    /** @deprecated use `mutate` instead */\n    switchAccount: SwitchConnectionMutate<config, context>\n    /** @deprecated use `mutateAsync` instead */\n    switchAccountAsync: SwitchConnectionMutateAsync<config, context>\n    /** @deprecated use `mutate` instead */\n    switchConnection: SwitchConnectionMutate<config, context>\n    /** @deprecated use `mutateAsync` instead */\n    switchConnectionAsync: SwitchConnectionMutateAsync<config, context>\n  }\n>\n\n/** https://wagmi.sh/react/api/hooks/useSwitchConnection */\nexport function useSwitchConnection<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: UseSwitchConnectionParameters<config, context> = {},\n): UseSwitchConnectionReturnType<config, context> {\n  const config = useConfig(parameters)\n  const options = switchConnectionMutationOptions(config, parameters)\n  const mutation = useMutation(options)\n  type Return = UseSwitchConnectionReturnType<config, context>\n  return {\n    ...(mutation as Return),\n    connectors: useConnections({ config }).map(\n      (connection) => connection.connector,\n    ),\n    switchAccount: mutation.mutate as Return['mutate'],\n    switchAccountAsync: mutation.mutateAsync as Return['mutateAsync'],\n    switchConnection: mutation.mutate as Return['mutate'],\n    switchConnectionAsync: mutation.mutateAsync as Return['mutateAsync'],\n  }\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useSyncExternalStoreWithTracked.test.tsx",
    "content": "import { render, renderHook } from '@wagmi/test/react'\nimport React from 'react'\nimport * as ReactDOM from 'react-dom'\nimport { expect, test } from 'vitest'\n\nimport { useSyncExternalStoreWithTracked } from './useSyncExternalStoreWithTracked.js'\n\nfunction createExternalStore<state>(initialState: state) {\n  const listeners = new Set<() => void>()\n  let currentState = initialState\n  return {\n    set(updater: (state: state) => state) {\n      currentState = updater(currentState)\n      ReactDOM.unstable_batchedUpdates(() => {\n        for (const listener of listeners) {\n          listener()\n        }\n      })\n    },\n    subscribe(listener: () => void) {\n      listeners.add(listener)\n      return () => listeners.delete(listener)\n    },\n    getState() {\n      return currentState\n    },\n  }\n}\n\nfunction useExternalStore(\n  store: ReturnType<typeof createExternalStore>,\n  cb: (state: any) => void,\n) {\n  const state = useSyncExternalStoreWithTracked(\n    store.subscribe,\n    store.getState,\n    store.getState,\n  )\n  cb(state)\n  return state as any\n}\n\ntest('rerenders only when the tracked value changes', async () => {\n  const externalStore = createExternalStore({\n    foo: 'bar',\n    gm: 'wagmi',\n    isGonnaMakeIt: false,\n  })\n\n  const renders: any[] = []\n\n  const { act } = await renderHook(() => {\n    const { gm } = useExternalStore(externalStore, (state) => {\n      renders.push(state)\n    })\n    return gm\n  })\n\n  act(() => {\n    externalStore.set((x) => ({ ...x, foo: 'baz', isGonnaMakeIt: true }))\n  })\n\n  expect(renders).toMatchInlineSnapshot(`\n      [\n        {\n          \"foo\": \"bar\",\n          \"gm\": \"wagmi\",\n          \"isGonnaMakeIt\": false,\n        },\n      ]\n    `)\n\n  act(() => {\n    externalStore.set((x) => ({ ...x, gm: 'ngmi' }))\n  })\n\n  expect(renders).toMatchInlineSnapshot(`\n      [\n        {\n          \"foo\": \"bar\",\n          \"gm\": \"wagmi\",\n          \"isGonnaMakeIt\": false,\n        },\n        {\n          \"foo\": \"baz\",\n          \"gm\": \"ngmi\",\n          \"isGonnaMakeIt\": true,\n        },\n      ]\n    `)\n})\n\ntest('rerenders when all values are being tracked', async () => {\n  const externalStore = createExternalStore({\n    foo: 'bar',\n    gm: 'wagmi',\n    isGonnaMakeIt: false,\n  })\n\n  const renders: any[] = []\n\n  const { act } = await renderHook(() => {\n    const { foo, gm, isGonnaMakeIt } = useExternalStore(\n      externalStore,\n      (state) => {\n        renders.push(state)\n      },\n    )\n\n    return {\n      foo,\n      gm,\n      isGonnaMakeIt,\n    }\n  })\n\n  act(() => {\n    externalStore.set((x) => ({ ...x, isGonnaMakeIt: true }))\n  })\n\n  expect(renders).toMatchInlineSnapshot(`\n      [\n        {\n          \"foo\": \"bar\",\n          \"gm\": \"wagmi\",\n          \"isGonnaMakeIt\": false,\n        },\n        {\n          \"foo\": \"bar\",\n          \"gm\": \"wagmi\",\n          \"isGonnaMakeIt\": true,\n        },\n      ]\n    `)\n})\n\ntest('rerenders when no values are being tracked', async () => {\n  const externalStore = createExternalStore({\n    foo: 'bar',\n    gm: 'wagmi',\n    isGonnaMakeIt: false,\n  })\n\n  const renders: any[] = []\n\n  const { act } = await renderHook(() => {\n    useExternalStore(externalStore, (state) => {\n      renders.push(state)\n    })\n  })\n\n  act(() => {\n    externalStore.set((x) => ({ ...x, isGonnaMakeIt: true }))\n  })\n\n  expect(renders).toMatchInlineSnapshot(`\n      [\n        {\n          \"foo\": \"bar\",\n          \"gm\": \"wagmi\",\n          \"isGonnaMakeIt\": false,\n        },\n        {\n          \"foo\": \"bar\",\n          \"gm\": \"wagmi\",\n          \"isGonnaMakeIt\": true,\n        },\n      ]\n    `)\n})\n\ntest('store object reference is stable across rerenders', async () => {\n  const externalStore = createExternalStore({\n    foo: 'bar',\n    gm: 'wagmi',\n    isGonnaMakeIt: false,\n  })\n\n  let childRenderCount = 0\n  const MemoComponent = React.memo((props: { store: any }) => {\n    childRenderCount++\n    return <div>{props.store.isGonnaMakeIt}</div>\n  })\n\n  const renders: any[] = []\n\n  function Test() {\n    const store = useExternalStore(externalStore, (state) => {\n      renders.push(state)\n    })\n    const [, rerender] = React.useState(0)\n\n    return (\n      <>\n        <MemoComponent store={store} />\n        <button onClick={() => rerender((prev) => prev + 1)}>rerender</button>\n        <button\n          onClick={() =>\n            externalStore.set((x) => ({ ...x, isGonnaMakeIt: true }))\n          }\n        >\n          update external store\n        </button>\n      </>\n    )\n  }\n\n  const screen = await render(<Test />)\n\n  const forceRerenderButton = screen.getByText('rerender')\n  expect(childRenderCount).toBe(1)\n  expect(renders.length).toBe(1)\n\n  // updating parent state, child should not rerender\n  await forceRerenderButton.click()\n  expect(childRenderCount).toBe(1)\n  expect(renders.length).toBe(2)\n\n  // child and parent both rerender when store changes\n  const updateExternalStoreButton = screen.getByText('update')\n  await updateExternalStoreButton.click()\n  expect(childRenderCount).toBe(2)\n  expect(renders.length).toBe(3)\n})\n\ntest('array', async () => {\n  const externalStore = createExternalStore(['foo'])\n\n  const renders: any[] = []\n\n  const { act } = await renderHook(() => {\n    const array = useExternalStore(externalStore, (state) => {\n      renders.push(state)\n    })\n\n    return array\n  })\n\n  act(() => {\n    externalStore.set((x) => [...x, 'bar'])\n  })\n\n  expect(renders).toMatchInlineSnapshot(`\n    [\n      [\n        \"foo\",\n      ],\n      [\n        \"foo\",\n        \"bar\",\n      ],\n    ]\n  `)\n\n  act(() => {\n    externalStore.set((x) => [...x, 'baz'])\n  })\n\n  expect(renders).toMatchInlineSnapshot(`\n    [\n      [\n        \"foo\",\n      ],\n      [\n        \"foo\",\n        \"bar\",\n      ],\n      [\n        \"foo\",\n        \"bar\",\n        \"baz\",\n      ],\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useSyncExternalStoreWithTracked.ts",
    "content": "'use client'\n\nimport { deepEqual } from '@wagmi/core/internal'\nimport { useMemo, useRef } from 'react'\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/shim/with-selector.js'\n\nconst isPlainObject = (obj: unknown) =>\n  typeof obj === 'object' && !Array.isArray(obj)\n\nexport function useSyncExternalStoreWithTracked<\n  snapshot extends selection,\n  selection = snapshot,\n>(\n  subscribe: (onStoreChange: () => void) => () => void,\n  getSnapshot: () => snapshot,\n  getServerSnapshot: undefined | null | (() => snapshot) = getSnapshot,\n  isEqual: (a: selection, b: selection) => boolean = deepEqual,\n) {\n  const trackedKeys = useRef<string[]>([])\n  const result = useSyncExternalStoreWithSelector(\n    subscribe,\n    getSnapshot,\n    getServerSnapshot,\n    (x) => x,\n    (a, b) => {\n      if (isPlainObject(a) && isPlainObject(b) && trackedKeys.current.length) {\n        for (const key of trackedKeys.current) {\n          const equal = isEqual(\n            (a as { [_a: string]: any })[key],\n            (b as { [_b: string]: any })[key],\n          )\n          if (!equal) return false\n        }\n        return true\n      }\n      return isEqual(a, b)\n    },\n  )\n\n  return useMemo(() => {\n    if (isPlainObject(result)) {\n      const trackedResult = { ...result }\n      let properties = {}\n      for (const [key, value] of Object.entries(\n        trackedResult as { [key: string]: any },\n      )) {\n        properties = {\n          ...properties,\n          [key]: {\n            configurable: false,\n            enumerable: true,\n            get: () => {\n              if (!trackedKeys.current.includes(key)) {\n                trackedKeys.current.push(key)\n              }\n              return value\n            },\n          },\n        }\n      }\n      Object.defineProperties(trackedResult, properties)\n      return trackedResult\n    }\n\n    return result\n  }, [result])\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useTransaction.test-d.ts",
    "content": "import { expectTypeOf, test } from 'vitest'\n\nimport { useTransaction } from './useTransaction.js'\n\ntest('select data', () => {\n  const result = useTransaction({\n    query: {\n      select(data) {\n        return data?.nonce\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<number | undefined>()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useTransaction.test.ts",
    "content": "import { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useTransaction } from './useTransaction.js'\n\ntest('default', async () => {\n  const { result } = await renderHook(() =>\n    useTransaction({\n      hash: '0x60668ed8c2dc110d61d945a936fcd45b8f13654e5c78481c8c825d1148c7ef30',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": {\n        \"accessList\": [],\n        \"blockHash\": \"0xd725a38b51e5ceec8c5f6c9ccfdb2cc423af993bb650af5eedca5e4be7156ba7\",\n        \"blockNumber\": 15189204n,\n        \"chainId\": 1,\n        \"from\": \"0xa0cf798816d4b9b9866b5330eea46a18382f251e\",\n        \"gas\": 21000n,\n        \"gasPrice\": 9371645552n,\n        \"hash\": \"0x60668ed8c2dc110d61d945a936fcd45b8f13654e5c78481c8c825d1148c7ef30\",\n        \"input\": \"0x\",\n        \"maxFeePerGas\": 13644824566n,\n        \"maxPriorityFeePerGas\": 1500000000n,\n        \"nonce\": 86,\n        \"r\": \"0x40174f9a38df876c1a7ce2587848819d4082ccd6d67a88aa5cabe59bf594e14f\",\n        \"s\": \"0x7c0c82f62a8a5a9b0e9cf30a54a72fdae8fc54b5b79ddafef0acd30e94e83872\",\n        \"to\": \"0xd2135cfb216b74109775236e36d4b433f1df507b\",\n        \"transactionIndex\": 144,\n        \"type\": \"eip1559\",\n        \"typeHex\": \"0x2\",\n        \"v\": 0n,\n        \"value\": 100000000000000000n,\n        \"yParity\": 0,\n      },\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"transaction\",\n        {\n          \"chainId\": 1,\n          \"hash\": \"0x60668ed8c2dc110d61d945a936fcd45b8f13654e5c78481c8c825d1148c7ef30\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useTransaction.ts",
    "content": "'use client'\nimport type {\n  Config,\n  GetTransactionErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetTransactionData,\n  type GetTransactionOptions,\n  getTransactionQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseTransactionParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetTransactionData<config, chainId>,\n> = Compute<\n  GetTransactionOptions<config, chainId, selectData> & ConfigParameter<config>\n>\n\nexport type UseTransactionReturnType<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetTransactionData<config, chainId>,\n> = UseQueryReturnType<selectData, GetTransactionErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useTransaction */\nexport function useTransaction<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetTransactionData<config, chainId>,\n>(\n  parameters: UseTransactionParameters<config, chainId, selectData> = {},\n): UseTransactionReturnType<config, chainId, selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = getTransactionQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options) as any\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useTransactionConfirmations.test-d.ts",
    "content": "import { expectTypeOf, test } from 'vitest'\n\nimport { useTransactionConfirmations } from './useTransactionConfirmations.js'\n\ntest('select data', () => {\n  const result = useTransactionConfirmations({\n    query: {\n      select(data) {\n        return data\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<bigint | undefined>()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useTransactionConfirmations.test.ts",
    "content": "import { getTransactionReceipt } from '@wagmi/core'\nimport { config, wait } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport type { Hash } from 'viem'\nimport { expect, test, vi } from 'vitest'\nimport { useTransactionConfirmations } from './useTransactionConfirmations.js'\n\ntest('default', async () => {\n  const { result } = await renderHook(() =>\n    useTransactionConfirmations({\n      hash: '0x60668ed8c2dc110d61d945a936fcd45b8f13654e5c78481c8c825d1148c7ef30',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, ...rest } = result.current\n  expect(data).toBeTypeOf('bigint')\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"transactionConfirmations\",\n        {\n          \"chainId\": 1,\n          \"hash\": \"0x60668ed8c2dc110d61d945a936fcd45b8f13654e5c78481c8c825d1148c7ef30\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: transactionReceipt', async () => {\n  const transactionReceipt = await getTransactionReceipt(config, {\n    hash: '0x60668ed8c2dc110d61d945a936fcd45b8f13654e5c78481c8c825d1148c7ef30',\n  })\n\n  const { result } = await renderHook(() =>\n    useTransactionConfirmations({\n      transactionReceipt,\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, ...rest } = result.current\n  expect(data).toBeTypeOf('bigint')\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"transactionConfirmations\",\n        {\n          \"chainId\": 1,\n          \"transactionReceipt\": {\n            \"blockHash\": \"0xd725a38b51e5ceec8c5f6c9ccfdb2cc423af993bb650af5eedca5e4be7156ba7\",\n            \"blockNumber\": 15189204n,\n            \"contractAddress\": null,\n            \"cumulativeGasUsed\": 12949744n,\n            \"effectiveGasPrice\": 9371645552n,\n            \"from\": \"0xa0cf798816d4b9b9866b5330eea46a18382f251e\",\n            \"gasUsed\": 21000n,\n            \"logs\": [],\n            \"logsBloom\": \"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\n            \"status\": \"success\",\n            \"to\": \"0xd2135cfb216b74109775236e36d4b433f1df507b\",\n            \"transactionHash\": \"0x60668ed8c2dc110d61d945a936fcd45b8f13654e5c78481c8c825d1148c7ef30\",\n            \"transactionIndex\": 144,\n            \"type\": \"eip1559\",\n          },\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('behavior: hash: undefined -> defined', async () => {\n  const { result, rerender } = await renderHook(\n    (props) =>\n      useTransactionConfirmations({\n        hash: props?.hash,\n      }),\n    { initialProps: { hash: undefined as Hash | undefined } },\n  )\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": undefined,\n      \"dataUpdatedAt\": 0,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": false,\n      \"isFetchedAfterMount\": false,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": true,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": false,\n      \"isSuccess\": false,\n      \"queryKey\": [\n        \"transactionConfirmations\",\n        {\n          \"chainId\": 1,\n          \"hash\": undefined,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"pending\",\n    }\n  `)\n\n  rerender({\n    hash: '0x60668ed8c2dc110d61d945a936fcd45b8f13654e5c78481c8c825d1148c7ef30',\n  })\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, ...rest } = result.current\n  expect(data).toBeTypeOf('bigint')\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"transactionConfirmations\",\n        {\n          \"chainId\": 1,\n          \"hash\": \"0x60668ed8c2dc110d61d945a936fcd45b8f13654e5c78481c8c825d1148c7ef30\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('behavior: disabled when properties missing', async () => {\n  const { result } = await renderHook(() => useTransactionConfirmations())\n\n  await wait(100)\n  await vi.waitFor(() => expect(result.current.isPending).toBeTruthy())\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useTransactionConfirmations.ts",
    "content": "'use client'\nimport type {\n  Config,\n  GetTransactionConfirmationsErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetTransactionConfirmationsData,\n  type GetTransactionConfirmationsOptions,\n  getTransactionConfirmationsQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseTransactionConfirmationsParameters<\n  config extends Config = Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  selectData = GetTransactionConfirmationsData,\n> = GetTransactionConfirmationsOptions<config, chainId, selectData> &\n  ConfigParameter<config>\n\nexport type UseTransactionConfirmationsReturnType<\n  selectData = GetTransactionConfirmationsData,\n> = UseQueryReturnType<selectData, GetTransactionConfirmationsErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useTransactionConfirmations */\nexport function useTransactionConfirmations<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  selectData = GetTransactionConfirmationsData,\n>(\n  parameters: UseTransactionConfirmationsParameters<\n    config,\n    chainId,\n    selectData\n  > = {} as any,\n): UseTransactionConfirmationsReturnType<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = getTransactionConfirmationsQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options) as any\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useTransactionCount.test-d.ts",
    "content": "import { expectTypeOf, test } from 'vitest'\n\nimport { useTransactionCount } from './useTransactionCount.js'\n\ntest('select data', () => {\n  const result = useTransactionCount({\n    query: {\n      select(data) {\n        return data\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<number | undefined>()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useTransactionCount.test.ts",
    "content": "import { accounts, chain, wait } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport type { Address } from 'viem'\nimport { expect, test, vi } from 'vitest'\n\nimport { useTransactionCount } from './useTransactionCount.js'\n\nconst address = accounts[0]\n\ntest('default', async () => {\n  const { result } = await renderHook(() => useTransactionCount({ address }))\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, ...rest } = result.current\n  expect(data).toBeTypeOf('number')\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"transactionCount\",\n        {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: chainId', async () => {\n  const { result } = await renderHook(() =>\n    useTransactionCount({ address, chainId: chain.mainnet2.id }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, ...rest } = result.current\n  expect(data).toBeTypeOf('number')\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"transactionCount\",\n        {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"chainId\": 456,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: blockNumber', async () => {\n  const { result } = await renderHook(() =>\n    useTransactionCount({ address, blockNumber: 13677382n }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, ...rest } = result.current\n  expect(data).toBeTypeOf('number')\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"transactionCount\",\n        {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"blockNumber\": 13677382n,\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('behavior: address: undefined -> defined', async () => {\n  let address: Address | undefined\n\n  const { result, rerender } = await renderHook(() =>\n    useTransactionCount({ address }),\n  )\n\n  {\n    const { data, ...rest } = result.current\n    expect(data).toBeTypeOf('undefined')\n    expect(rest).toMatchInlineSnapshot(`\n      {\n        \"dataUpdatedAt\": 0,\n        \"error\": null,\n        \"errorUpdateCount\": 0,\n        \"errorUpdatedAt\": 0,\n        \"failureCount\": 0,\n        \"failureReason\": null,\n        \"fetchStatus\": \"idle\",\n        \"isError\": false,\n        \"isFetched\": false,\n        \"isFetchedAfterMount\": false,\n        \"isFetching\": false,\n        \"isInitialLoading\": false,\n        \"isLoading\": false,\n        \"isLoadingError\": false,\n        \"isPaused\": false,\n        \"isPending\": true,\n        \"isPlaceholderData\": false,\n        \"isRefetchError\": false,\n        \"isRefetching\": false,\n        \"isStale\": false,\n        \"isSuccess\": false,\n        \"queryKey\": [\n          \"transactionCount\",\n          {\n            \"address\": undefined,\n            \"chainId\": 1,\n          },\n        ],\n        \"refetch\": [Function],\n        \"status\": \"pending\",\n      }\n    `)\n  }\n\n  address = accounts[0]\n  rerender()\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, ...rest } = result.current\n  expect(data).toBeTypeOf('number')\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"transactionCount\",\n        {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('behavior: disabled when properties missing', async () => {\n  const { result } = await renderHook(() => useTransactionCount())\n\n  await wait(100)\n  await vi.waitFor(() => expect(result.current.isPending).toBeTruthy())\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useTransactionCount.ts",
    "content": "'use client'\nimport type {\n  Config,\n  GetTransactionCountErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetTransactionCountData,\n  type GetTransactionCountOptions,\n  getTransactionCountQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseTransactionCountParameters<\n  config extends Config = Config,\n  selectData = GetTransactionCountData,\n> = Compute<\n  GetTransactionCountOptions<config, selectData> & ConfigParameter<config>\n>\n\nexport type UseTransactionCountReturnType<\n  selectData = GetTransactionCountData,\n> = UseQueryReturnType<selectData, GetTransactionCountErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useTransactionCount */\nexport function useTransactionCount<\n  config extends Config = ResolvedRegister['config'],\n  selectData = GetTransactionCountData,\n>(\n  parameters: UseTransactionCountParameters<config, selectData> = {},\n): UseTransactionCountReturnType<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = getTransactionCountQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options)\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useTransactionReceipt.test-d.ts",
    "content": "import { expectTypeOf, test } from 'vitest'\n\nimport { useTransactionReceipt } from './useTransactionReceipt.js'\n\ntest('select data', () => {\n  const result = useTransactionReceipt({\n    query: {\n      select(data) {\n        return data?.blockNumber\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<bigint | undefined>()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useTransactionReceipt.test.ts",
    "content": "import { chain, wait } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport type { Hash } from 'viem'\nimport { expect, test, vi } from 'vitest'\nimport { useTransactionReceipt } from './useTransactionReceipt.js'\n\ntest('default', async () => {\n  const { result } = await renderHook(() =>\n    useTransactionReceipt({\n      hash: '0xbf7d27700d053765c9638d3b9d39eb3c56bfc48377583e8be483d61f9f18a871',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": {\n        \"blockHash\": \"0xb932f77cf770d1d1c8f861153eec1e990f5d56b6ffdb4ac06aef3cca51ef37d4\",\n        \"blockNumber\": 16280769n,\n        \"contractAddress\": null,\n        \"cumulativeGasUsed\": 21000n,\n        \"effectiveGasPrice\": 33427926161n,\n        \"from\": \"0x043022ef9fca1066024d19d681e2ccf44ff90de3\",\n        \"gasUsed\": 21000n,\n        \"logs\": [],\n        \"logsBloom\": \"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\n        \"status\": \"success\",\n        \"to\": \"0x318a5fb4f1604fc46375a1db9a9018b6e423b345\",\n        \"transactionHash\": \"0xbf7d27700d053765c9638d3b9d39eb3c56bfc48377583e8be483d61f9f18a871\",\n        \"transactionIndex\": 0,\n        \"type\": \"legacy\",\n      },\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"getTransactionReceipt\",\n        {\n          \"chainId\": 1,\n          \"hash\": \"0xbf7d27700d053765c9638d3b9d39eb3c56bfc48377583e8be483d61f9f18a871\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: chainId', async () => {\n  const { result } = await renderHook(() =>\n    useTransactionReceipt({\n      chainId: chain.mainnet2.id,\n      hash: '0xbf7d27700d053765c9638d3b9d39eb3c56bfc48377583e8be483d61f9f18a871',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": {\n        \"blockHash\": \"0xb932f77cf770d1d1c8f861153eec1e990f5d56b6ffdb4ac06aef3cca51ef37d4\",\n        \"blockNumber\": 16280769n,\n        \"contractAddress\": null,\n        \"cumulativeGasUsed\": 21000n,\n        \"effectiveGasPrice\": 33427926161n,\n        \"from\": \"0x043022ef9fca1066024d19d681e2ccf44ff90de3\",\n        \"gasUsed\": 21000n,\n        \"logs\": [],\n        \"logsBloom\": \"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\n        \"status\": \"success\",\n        \"to\": \"0x318a5fb4f1604fc46375a1db9a9018b6e423b345\",\n        \"transactionHash\": \"0xbf7d27700d053765c9638d3b9d39eb3c56bfc48377583e8be483d61f9f18a871\",\n        \"transactionIndex\": 0,\n        \"type\": \"legacy\",\n      },\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"getTransactionReceipt\",\n        {\n          \"chainId\": 456,\n          \"hash\": \"0xbf7d27700d053765c9638d3b9d39eb3c56bfc48377583e8be483d61f9f18a871\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('behavior: hash: undefined -> defined', async () => {\n  const { result, rerender } = await renderHook(\n    (props) =>\n      useTransactionReceipt({\n        hash: props?.hash,\n      }),\n    { initialProps: { hash: undefined as Hash | undefined } },\n  )\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": undefined,\n      \"dataUpdatedAt\": 0,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": false,\n      \"isFetchedAfterMount\": false,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": true,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": false,\n      \"isSuccess\": false,\n      \"queryKey\": [\n        \"getTransactionReceipt\",\n        {\n          \"chainId\": 1,\n          \"hash\": undefined,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"pending\",\n    }\n  `)\n\n  rerender({\n    hash: '0xbf7d27700d053765c9638d3b9d39eb3c56bfc48377583e8be483d61f9f18a871',\n  })\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": {\n        \"blockHash\": \"0xb932f77cf770d1d1c8f861153eec1e990f5d56b6ffdb4ac06aef3cca51ef37d4\",\n        \"blockNumber\": 16280769n,\n        \"contractAddress\": null,\n        \"cumulativeGasUsed\": 21000n,\n        \"effectiveGasPrice\": 33427926161n,\n        \"from\": \"0x043022ef9fca1066024d19d681e2ccf44ff90de3\",\n        \"gasUsed\": 21000n,\n        \"logs\": [],\n        \"logsBloom\": \"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\n        \"status\": \"success\",\n        \"to\": \"0x318a5fb4f1604fc46375a1db9a9018b6e423b345\",\n        \"transactionHash\": \"0xbf7d27700d053765c9638d3b9d39eb3c56bfc48377583e8be483d61f9f18a871\",\n        \"transactionIndex\": 0,\n        \"type\": \"legacy\",\n      },\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"getTransactionReceipt\",\n        {\n          \"chainId\": 1,\n          \"hash\": \"0xbf7d27700d053765c9638d3b9d39eb3c56bfc48377583e8be483d61f9f18a871\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('behavior: disabled when properties missing', async () => {\n  const { result } = await renderHook(() => useTransactionReceipt())\n\n  await wait(100)\n  await vi.waitFor(() => expect(result.current.isPending).toBeTruthy())\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useTransactionReceipt.ts",
    "content": "'use client'\nimport type {\n  Config,\n  GetTransactionReceiptErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetTransactionReceiptData,\n  type GetTransactionReceiptOptions,\n  getTransactionReceiptQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseTransactionReceiptParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetTransactionReceiptData<config, chainId>,\n> = Compute<\n  GetTransactionReceiptOptions<config, chainId, selectData> &\n    ConfigParameter<config>\n>\n\nexport type UseTransactionReceiptReturnType<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetTransactionReceiptData<config, chainId>,\n> = UseQueryReturnType<selectData, GetTransactionReceiptErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useTransactionReceipt */\nexport function useTransactionReceipt<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetTransactionReceiptData<config, chainId>,\n>(\n  parameters: UseTransactionReceiptParameters<config, chainId, selectData> = {},\n): UseTransactionReceiptReturnType<config, chainId, selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = getTransactionReceiptQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options) as any\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useVerifyMessage.test-d.ts",
    "content": "import { expectTypeOf, test } from 'vitest'\n\nimport { useVerifyMessage } from './useVerifyMessage.js'\n\ntest('select data', () => {\n  const result = useVerifyMessage({\n    query: {\n      select(data) {\n        return data\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<boolean | undefined>()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useVerifyMessage.test.ts",
    "content": "import { chain, wait } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport type { Hex } from 'viem'\nimport { expect, test, vi } from 'vitest'\nimport { useVerifyMessage } from './useVerifyMessage.js'\n\nconst address = '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266'\n\ntest('default', async () => {\n  const { result } = await renderHook(() =>\n    useVerifyMessage({\n      address,\n      message: 'This is a test message for viem!',\n      signature:\n        '0xc4c7f2820177020d66d5fd00d084cdd3f575a868c059c29a2d7f23398d04819709a14f83d98b446dda539ca5dcb87d75aa3340eb15e66d67606850622a3420f61b',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": true,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"verifyMessage\",\n        {\n          \"address\": \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\",\n          \"chainId\": 1,\n          \"message\": \"This is a test message for viem!\",\n          \"signature\": \"0xc4c7f2820177020d66d5fd00d084cdd3f575a868c059c29a2d7f23398d04819709a14f83d98b446dda539ca5dcb87d75aa3340eb15e66d67606850622a3420f61b\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: chainId', async () => {\n  const { result } = await renderHook(() =>\n    useVerifyMessage({\n      chainId: chain.mainnet2.id,\n      address,\n      message: 'This is a test message for viem!',\n      signature:\n        '0xc4c7f2820177020d66d5fd00d084cdd3f575a868c059c29a2d7f23398d04819709a14f83d98b446dda539ca5dcb87d75aa3340eb15e66d67606850622a3420f61b',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": true,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"verifyMessage\",\n        {\n          \"address\": \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\",\n          \"chainId\": 456,\n          \"message\": \"This is a test message for viem!\",\n          \"signature\": \"0xc4c7f2820177020d66d5fd00d084cdd3f575a868c059c29a2d7f23398d04819709a14f83d98b446dda539ca5dcb87d75aa3340eb15e66d67606850622a3420f61b\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: blockNumber', async () => {\n  const { result } = await renderHook(() =>\n    useVerifyMessage({\n      blockNumber: 12345678n,\n      address,\n      message: 'This is a test message for viem!',\n      signature:\n        '0xc4c7f2820177020d66d5fd00d084cdd3f575a868c059c29a2d7f23398d04819709a14f83d98b446dda539ca5dcb87d75aa3340eb15e66d67606850622a3420f61b',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": true,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"verifyMessage\",\n        {\n          \"address\": \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\",\n          \"blockNumber\": 12345678n,\n          \"chainId\": 1,\n          \"message\": \"This is a test message for viem!\",\n          \"signature\": \"0xc4c7f2820177020d66d5fd00d084cdd3f575a868c059c29a2d7f23398d04819709a14f83d98b446dda539ca5dcb87d75aa3340eb15e66d67606850622a3420f61b\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: blockTag', async () => {\n  const { result } = await renderHook(() =>\n    useVerifyMessage({\n      blockTag: 'pending',\n      address,\n      message: 'This is a test message for viem!',\n      signature:\n        '0xc4c7f2820177020d66d5fd00d084cdd3f575a868c059c29a2d7f23398d04819709a14f83d98b446dda539ca5dcb87d75aa3340eb15e66d67606850622a3420f61b',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": true,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"verifyMessage\",\n        {\n          \"address\": \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\",\n          \"blockTag\": \"pending\",\n          \"chainId\": 1,\n          \"message\": \"This is a test message for viem!\",\n          \"signature\": \"0xc4c7f2820177020d66d5fd00d084cdd3f575a868c059c29a2d7f23398d04819709a14f83d98b446dda539ca5dcb87d75aa3340eb15e66d67606850622a3420f61b\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('behavior: signature: undefined -> defined', async () => {\n  const { result, rerender } = await renderHook(\n    (props) =>\n      useVerifyMessage({\n        address,\n        message: 'This is a test message for viem!',\n        signature: props?.signature,\n      }),\n    { initialProps: { signature: undefined as Hex | undefined } },\n  )\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": undefined,\n      \"dataUpdatedAt\": 0,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": false,\n      \"isFetchedAfterMount\": false,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": true,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": false,\n      \"isSuccess\": false,\n      \"queryKey\": [\n        \"verifyMessage\",\n        {\n          \"address\": \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\",\n          \"chainId\": 1,\n          \"message\": \"This is a test message for viem!\",\n          \"signature\": undefined,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"pending\",\n    }\n  `)\n\n  rerender({\n    signature:\n      '0xc4c7f2820177020d66d5fd00d084cdd3f575a868c059c29a2d7f23398d04819709a14f83d98b446dda539ca5dcb87d75aa3340eb15e66d67606850622a3420f61b',\n  })\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": true,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"verifyMessage\",\n        {\n          \"address\": \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\",\n          \"chainId\": 1,\n          \"message\": \"This is a test message for viem!\",\n          \"signature\": \"0xc4c7f2820177020d66d5fd00d084cdd3f575a868c059c29a2d7f23398d04819709a14f83d98b446dda539ca5dcb87d75aa3340eb15e66d67606850622a3420f61b\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('behavior: disabled when properties missing', async () => {\n  const { result } = await renderHook(() => useVerifyMessage())\n\n  await wait(100)\n  await vi.waitFor(() => expect(result.current.isPending).toBeTruthy())\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useVerifyMessage.ts",
    "content": "'use client'\nimport type {\n  Config,\n  ResolvedRegister,\n  VerifyMessageErrorType,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type VerifyMessageData,\n  type VerifyMessageOptions,\n  verifyMessageQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseVerifyMessageParameters<\n  config extends Config = Config,\n  selectData = VerifyMessageData,\n> = Compute<VerifyMessageOptions<config, selectData> & ConfigParameter<config>>\n\nexport type UseVerifyMessageReturnType<selectData = VerifyMessageData> =\n  UseQueryReturnType<selectData, VerifyMessageErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useVerifyMessage */\nexport function useVerifyMessage<\n  config extends Config = ResolvedRegister['config'],\n  selectData = VerifyMessageData,\n>(\n  parameters: UseVerifyMessageParameters<config, selectData> = {},\n): UseVerifyMessageReturnType<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = verifyMessageQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options)\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useVerifyTypedData.test-d.ts",
    "content": "import { typedData } from '@wagmi/test'\nimport type { Address } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport {\n  type UseVerifyTypedDataParameters,\n  useVerifyTypedData,\n} from './useVerifyTypedData.js'\n\ntest('select data', () => {\n  const result = useVerifyTypedData({\n    query: {\n      select(data) {\n        return data\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<boolean | undefined>()\n})\n\ntest('UseReadContractParameters', () => {\n  type Result = UseVerifyTypedDataParameters<\n    typeof typedData.basic.types,\n    'Mail'\n  >\n  expectTypeOf<Pick<Result, 'message' | 'primaryType'>>().toEqualTypeOf<{\n    primaryType?: 'Mail' | 'Person'\n    message?: {\n      from: {\n        name: string\n        wallet: Address\n      }\n      to: {\n        name: string\n        wallet: Address\n      }\n      contents: string\n    }\n  }>()\n})\n\ntest('primaryType', async () => {\n  useVerifyTypedData({\n    address: '0x',\n    ...typedData.basic,\n    primaryType: 'Mail',\n    signature: '0x',\n  })\n  useVerifyTypedData({\n    address: '0x',\n    ...typedData.basic,\n    // @ts-expect-error\n    primaryType: 'foobarbaz',\n    signature: '0x',\n  })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useVerifyTypedData.test.ts",
    "content": "import { typedData, wait } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport type { Hex } from 'viem'\nimport { expect, test, vi } from 'vitest'\n\nimport { useVerifyTypedData } from './useVerifyTypedData.js'\n\nconst smartAccountAddress = '0x3FCf42e10CC70Fe75A62EB3aDD6D305Aa840d145'\nconst notDeployedAddress = '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef'\n\ntest('valid signature', async () => {\n  const { result } = await renderHook(() =>\n    useVerifyTypedData({\n      ...typedData.basic,\n      primaryType: 'Mail',\n      address: smartAccountAddress,\n      signature:\n        '0x79d756d805073dc97b7bc885b0d56ddf319a2599530fe1e178c2a7de5be88980068d24f20a79b318ea0a84d33ae06f93db77e4235e5d9eeb8b1d7a63922ada3e1c',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": true,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"verifyTypedData\",\n        {\n          \"address\": \"0x3FCf42e10CC70Fe75A62EB3aDD6D305Aa840d145\",\n          \"chainId\": 1,\n          \"domain\": {\n            \"chainId\": 1,\n            \"name\": \"Ether Mail\",\n            \"verifyingContract\": \"0x0000000000000000000000000000000000000000\",\n            \"version\": \"1\",\n          },\n          \"message\": {\n            \"contents\": \"Hello, Bob!\",\n            \"from\": {\n              \"name\": \"Cow\",\n              \"wallet\": \"0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826\",\n            },\n            \"to\": {\n              \"name\": \"Bob\",\n              \"wallet\": \"0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB\",\n            },\n          },\n          \"primaryType\": \"Mail\",\n          \"signature\": \"0x79d756d805073dc97b7bc885b0d56ddf319a2599530fe1e178c2a7de5be88980068d24f20a79b318ea0a84d33ae06f93db77e4235e5d9eeb8b1d7a63922ada3e1c\",\n          \"types\": {\n            \"Mail\": [\n              {\n                \"name\": \"from\",\n                \"type\": \"Person\",\n              },\n              {\n                \"name\": \"to\",\n                \"type\": \"Person\",\n              },\n              {\n                \"name\": \"contents\",\n                \"type\": \"string\",\n              },\n            ],\n            \"Person\": [\n              {\n                \"name\": \"name\",\n                \"type\": \"string\",\n              },\n              {\n                \"name\": \"wallet\",\n                \"type\": \"address\",\n              },\n            ],\n          },\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('invalid signature', async () => {\n  const { result } = await renderHook(() =>\n    useVerifyTypedData({\n      ...typedData.basic,\n      primaryType: 'Mail',\n      address: smartAccountAddress,\n      signature: '0xdead',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": false,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"verifyTypedData\",\n        {\n          \"address\": \"0x3FCf42e10CC70Fe75A62EB3aDD6D305Aa840d145\",\n          \"chainId\": 1,\n          \"domain\": {\n            \"chainId\": 1,\n            \"name\": \"Ether Mail\",\n            \"verifyingContract\": \"0x0000000000000000000000000000000000000000\",\n            \"version\": \"1\",\n          },\n          \"message\": {\n            \"contents\": \"Hello, Bob!\",\n            \"from\": {\n              \"name\": \"Cow\",\n              \"wallet\": \"0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826\",\n            },\n            \"to\": {\n              \"name\": \"Bob\",\n              \"wallet\": \"0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB\",\n            },\n          },\n          \"primaryType\": \"Mail\",\n          \"signature\": \"0xdead\",\n          \"types\": {\n            \"Mail\": [\n              {\n                \"name\": \"from\",\n                \"type\": \"Person\",\n              },\n              {\n                \"name\": \"to\",\n                \"type\": \"Person\",\n              },\n              {\n                \"name\": \"contents\",\n                \"type\": \"string\",\n              },\n            ],\n            \"Person\": [\n              {\n                \"name\": \"name\",\n                \"type\": \"string\",\n              },\n              {\n                \"name\": \"wallet\",\n                \"type\": \"address\",\n              },\n            ],\n          },\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('account not deployed', async () => {\n  const { result } = await renderHook(() =>\n    useVerifyTypedData({\n      ...typedData.basic,\n      primaryType: 'Mail',\n      address: notDeployedAddress,\n      signature:\n        '0x79d756d805073dc97b7bc885b0d56ddf319a2599530fe1e178c2a7de5be88980068d24f20a79b318ea0a84d33ae06f93db77e4235e5d9eeb8b1d7a63922ada3e1c',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": false,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"verifyTypedData\",\n        {\n          \"address\": \"0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef\",\n          \"chainId\": 1,\n          \"domain\": {\n            \"chainId\": 1,\n            \"name\": \"Ether Mail\",\n            \"verifyingContract\": \"0x0000000000000000000000000000000000000000\",\n            \"version\": \"1\",\n          },\n          \"message\": {\n            \"contents\": \"Hello, Bob!\",\n            \"from\": {\n              \"name\": \"Cow\",\n              \"wallet\": \"0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826\",\n            },\n            \"to\": {\n              \"name\": \"Bob\",\n              \"wallet\": \"0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB\",\n            },\n          },\n          \"primaryType\": \"Mail\",\n          \"signature\": \"0x79d756d805073dc97b7bc885b0d56ddf319a2599530fe1e178c2a7de5be88980068d24f20a79b318ea0a84d33ae06f93db77e4235e5d9eeb8b1d7a63922ada3e1c\",\n          \"types\": {\n            \"Mail\": [\n              {\n                \"name\": \"from\",\n                \"type\": \"Person\",\n              },\n              {\n                \"name\": \"to\",\n                \"type\": \"Person\",\n              },\n              {\n                \"name\": \"contents\",\n                \"type\": \"string\",\n              },\n            ],\n            \"Person\": [\n              {\n                \"name\": \"name\",\n                \"type\": \"string\",\n              },\n              {\n                \"name\": \"wallet\",\n                \"type\": \"address\",\n              },\n            ],\n          },\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('behavior: signature: undefined -> defined', async () => {\n  const { result, rerender } = await renderHook(\n    (props) =>\n      useVerifyTypedData({\n        ...typedData.basic,\n        primaryType: 'Mail',\n        address: smartAccountAddress,\n        signature: props?.signature,\n      }),\n    { initialProps: { signature: undefined as Hex | undefined } },\n  )\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": undefined,\n      \"dataUpdatedAt\": 0,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": false,\n      \"isFetchedAfterMount\": false,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": true,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": false,\n      \"isSuccess\": false,\n      \"queryKey\": [\n        \"verifyTypedData\",\n        {\n          \"address\": \"0x3FCf42e10CC70Fe75A62EB3aDD6D305Aa840d145\",\n          \"chainId\": 1,\n          \"domain\": {\n            \"chainId\": 1,\n            \"name\": \"Ether Mail\",\n            \"verifyingContract\": \"0x0000000000000000000000000000000000000000\",\n            \"version\": \"1\",\n          },\n          \"message\": {\n            \"contents\": \"Hello, Bob!\",\n            \"from\": {\n              \"name\": \"Cow\",\n              \"wallet\": \"0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826\",\n            },\n            \"to\": {\n              \"name\": \"Bob\",\n              \"wallet\": \"0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB\",\n            },\n          },\n          \"primaryType\": \"Mail\",\n          \"signature\": undefined,\n          \"types\": {\n            \"Mail\": [\n              {\n                \"name\": \"from\",\n                \"type\": \"Person\",\n              },\n              {\n                \"name\": \"to\",\n                \"type\": \"Person\",\n              },\n              {\n                \"name\": \"contents\",\n                \"type\": \"string\",\n              },\n            ],\n            \"Person\": [\n              {\n                \"name\": \"name\",\n                \"type\": \"string\",\n              },\n              {\n                \"name\": \"wallet\",\n                \"type\": \"address\",\n              },\n            ],\n          },\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"pending\",\n    }\n  `)\n\n  rerender({\n    signature:\n      '0x79d756d805073dc97b7bc885b0d56ddf319a2599530fe1e178c2a7de5be88980068d24f20a79b318ea0a84d33ae06f93db77e4235e5d9eeb8b1d7a63922ada3e1c',\n  })\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": true,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"verifyTypedData\",\n        {\n          \"address\": \"0x3FCf42e10CC70Fe75A62EB3aDD6D305Aa840d145\",\n          \"chainId\": 1,\n          \"domain\": {\n            \"chainId\": 1,\n            \"name\": \"Ether Mail\",\n            \"verifyingContract\": \"0x0000000000000000000000000000000000000000\",\n            \"version\": \"1\",\n          },\n          \"message\": {\n            \"contents\": \"Hello, Bob!\",\n            \"from\": {\n              \"name\": \"Cow\",\n              \"wallet\": \"0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826\",\n            },\n            \"to\": {\n              \"name\": \"Bob\",\n              \"wallet\": \"0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB\",\n            },\n          },\n          \"primaryType\": \"Mail\",\n          \"signature\": \"0x79d756d805073dc97b7bc885b0d56ddf319a2599530fe1e178c2a7de5be88980068d24f20a79b318ea0a84d33ae06f93db77e4235e5d9eeb8b1d7a63922ada3e1c\",\n          \"types\": {\n            \"Mail\": [\n              {\n                \"name\": \"from\",\n                \"type\": \"Person\",\n              },\n              {\n                \"name\": \"to\",\n                \"type\": \"Person\",\n              },\n              {\n                \"name\": \"contents\",\n                \"type\": \"string\",\n              },\n            ],\n            \"Person\": [\n              {\n                \"name\": \"name\",\n                \"type\": \"string\",\n              },\n              {\n                \"name\": \"wallet\",\n                \"type\": \"address\",\n              },\n            ],\n          },\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('behavior: disabled when properties missing', async () => {\n  const { result } = await renderHook(() => useVerifyTypedData())\n\n  await wait(100)\n  await vi.waitFor(() => expect(result.current.isPending).toBeTruthy())\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useVerifyTypedData.ts",
    "content": "'use client'\nimport type {\n  Config,\n  ResolvedRegister,\n  VerifyTypedDataErrorType,\n} from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type VerifyTypedDataData,\n  type VerifyTypedDataOptions,\n  verifyTypedDataQueryOptions,\n} from '@wagmi/core/query'\nimport type { TypedData } from 'viem'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseVerifyTypedDataParameters<\n  typedData extends TypedData | Record<string, unknown> = TypedData,\n  primaryType extends keyof typedData | 'EIP712Domain' = keyof typedData,\n  config extends Config = Config,\n  selectData = VerifyTypedDataData,\n> = VerifyTypedDataOptions<typedData, primaryType, config, selectData> &\n  ConfigParameter<config>\n\nexport type UseVerifyTypedDataReturnType<selectData = VerifyTypedDataData> =\n  UseQueryReturnType<selectData, VerifyTypedDataErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useVerifyTypedData */\nexport function useVerifyTypedData<\n  const typedData extends TypedData | Record<string, unknown>,\n  primaryType extends keyof typedData | 'EIP712Domain',\n  config extends Config = ResolvedRegister['config'],\n  selectData = VerifyTypedDataData,\n>(\n  parameters: UseVerifyTypedDataParameters<\n    typedData,\n    primaryType,\n    config,\n    selectData\n  > = {} as any,\n): UseVerifyTypedDataReturnType<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = verifyTypedDataQueryOptions(config, {\n    ...(parameters as any),\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options) as any\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useWaitForCallsStatus.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { accounts, config, testClient, wait } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { parseEther } from 'viem'\nimport { expect, test, vi } from 'vitest'\n\nimport { useSendCalls } from './useSendCalls.js'\nimport { useWaitForCallsStatus } from './useWaitForCallsStatus.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await disconnect(config, { connector }).catch(() => {})\n  await connect(config, { connector })\n\n  const useSendCalls_render = await renderHook(() => useSendCalls())\n  const useWaitForCallsStatus_render = await renderHook(() =>\n    useWaitForCallsStatus({ id: useSendCalls_render.result.current.data?.id }),\n  )\n\n  useSendCalls_render.result.current.mutate({\n    calls: [\n      {\n        data: '0xdeadbeef',\n        to: accounts[1],\n        value: parseEther('1'),\n      },\n      {\n        to: accounts[2],\n        value: parseEther('2'),\n      },\n      {\n        to: accounts[3],\n        value: parseEther('3'),\n      },\n    ],\n  })\n\n  await vi.waitUntil(() => useSendCalls_render.result.current.isSuccess, {\n    timeout: 10_000,\n  })\n\n  expect(useWaitForCallsStatus_render.result.current.fetchStatus).toBe('idle')\n  useWaitForCallsStatus_render.rerender()\n  expect(useWaitForCallsStatus_render.result.current.fetchStatus).toBe(\n    'fetching',\n  )\n\n  await wait(1_000)\n  await testClient.mainnet.mine({ blocks: 1 })\n\n  await vi.waitUntil(\n    () => useWaitForCallsStatus_render.result.current.isSuccess,\n    { timeout: 10_000 },\n  )\n\n  expect(useWaitForCallsStatus_render.result.current.data?.status).toBe(\n    'success',\n  )\n  expect(\n    useWaitForCallsStatus_render.result.current.data?.receipts?.map((x) => ({\n      ...x,\n      blockHash: undefined,\n      transactionHash: undefined,\n    })),\n  ).toMatchInlineSnapshot(\n    `\n    [\n      {\n        \"blockHash\": undefined,\n        \"blockNumber\": 23535881n,\n        \"gasUsed\": 21160n,\n        \"logs\": [],\n        \"status\": \"success\",\n        \"transactionHash\": undefined,\n      },\n      {\n        \"blockHash\": undefined,\n        \"blockNumber\": 23535881n,\n        \"gasUsed\": 21000n,\n        \"logs\": [],\n        \"status\": \"success\",\n        \"transactionHash\": undefined,\n      },\n      {\n        \"blockHash\": undefined,\n        \"blockNumber\": 23535881n,\n        \"gasUsed\": 21000n,\n        \"logs\": [],\n        \"status\": \"success\",\n        \"transactionHash\": undefined,\n      },\n    ]\n  `,\n  )\n\n  await testClient.mainnet.mine({ blocks: 1 })\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useWaitForCallsStatus.ts",
    "content": "'use client'\nimport type {\n  Config,\n  ResolvedRegister,\n  WaitForCallsStatusErrorType,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type WaitForCallsStatusData,\n  type WaitForCallsStatusOptions,\n  waitForCallsStatusQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\nimport { useConnection } from './useConnection.js'\n\nexport type UseWaitForCallsStatusParameters<\n  config extends Config = Config,\n  selectData = WaitForCallsStatusData,\n> = Compute<WaitForCallsStatusOptions<selectData> & ConfigParameter<config>>\n\nexport type UseWaitForCallsStatusReturnType<\n  selectData = WaitForCallsStatusData,\n> = UseQueryReturnType<selectData, WaitForCallsStatusErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useWaitForCallsStatus */\nexport function useWaitForCallsStatus<\n  config extends Config = ResolvedRegister['config'],\n  selectData = WaitForCallsStatusData,\n>(\n  parameters: UseWaitForCallsStatusParameters<config, selectData>,\n): UseWaitForCallsStatusReturnType<selectData> {\n  const config = useConfig(parameters)\n  const { connector } = useConnection({ config })\n  const options = waitForCallsStatusQueryOptions(config, {\n    ...parameters,\n    connector: parameters.connector ?? connector,\n  })\n  return useQuery(options)\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useWaitForTransactionReceipt.test-d.ts",
    "content": "import { expectTypeOf, test } from 'vitest'\n\nimport { useWaitForTransactionReceipt } from './useWaitForTransactionReceipt.js'\n\ntest('select data', () => {\n  const result = useWaitForTransactionReceipt({\n    query: {\n      select(data) {\n        return data?.blockNumber\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<bigint | undefined>()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useWaitForTransactionReceipt.test.ts",
    "content": "import { wait } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\nimport { useWaitForTransactionReceipt } from './useWaitForTransactionReceipt.js'\n\ntest('default', async () => {\n  const { result } = await renderHook(() =>\n    useWaitForTransactionReceipt({\n      hash: '0x60668ed8c2dc110d61d945a936fcd45b8f13654e5c78481c8c825d1148c7ef30',\n    }),\n  )\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result).toMatchInlineSnapshot(`\n    {\n      \"current\": {\n        \"data\": {\n          \"blockHash\": \"0xd725a38b51e5ceec8c5f6c9ccfdb2cc423af993bb650af5eedca5e4be7156ba7\",\n          \"blockNumber\": 15189204n,\n          \"chainId\": 1,\n          \"contractAddress\": null,\n          \"cumulativeGasUsed\": 12949744n,\n          \"effectiveGasPrice\": 9371645552n,\n          \"from\": \"0xa0cf798816d4b9b9866b5330eea46a18382f251e\",\n          \"gasUsed\": 21000n,\n          \"logs\": [],\n          \"logsBloom\": \"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\n          \"status\": \"success\",\n          \"to\": \"0xd2135cfb216b74109775236e36d4b433f1df507b\",\n          \"transactionHash\": \"0x60668ed8c2dc110d61d945a936fcd45b8f13654e5c78481c8c825d1148c7ef30\",\n          \"transactionIndex\": 144,\n          \"type\": \"eip1559\",\n        },\n        \"dataUpdatedAt\": 1675209600000,\n        \"error\": null,\n        \"errorUpdateCount\": 0,\n        \"errorUpdatedAt\": 0,\n        \"failureCount\": 0,\n        \"failureReason\": null,\n        \"fetchStatus\": \"idle\",\n        \"isError\": false,\n        \"isFetched\": true,\n        \"isFetchedAfterMount\": true,\n        \"isFetching\": false,\n        \"isInitialLoading\": false,\n        \"isLoading\": false,\n        \"isLoadingError\": false,\n        \"isPaused\": false,\n        \"isPending\": false,\n        \"isPlaceholderData\": false,\n        \"isRefetchError\": false,\n        \"isRefetching\": false,\n        \"isStale\": true,\n        \"isSuccess\": true,\n        \"queryKey\": [\n          \"waitForTransactionReceipt\",\n          {\n            \"chainId\": 1,\n            \"hash\": \"0x60668ed8c2dc110d61d945a936fcd45b8f13654e5c78481c8c825d1148c7ef30\",\n          },\n        ],\n        \"refetch\": [Function],\n        \"status\": \"success\",\n      },\n    }\n  `)\n})\n\ntest('disabled when hash is undefined', async () => {\n  const { result } = await renderHook(() =>\n    useWaitForTransactionReceipt({ hash: undefined }),\n  )\n\n  await wait(100)\n  await vi.waitFor(() => expect(result.current.isPending).toBeTruthy())\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useWaitForTransactionReceipt.ts",
    "content": "'use client'\nimport type {\n  Config,\n  ResolvedRegister,\n  WaitForTransactionReceiptErrorType,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type WaitForTransactionReceiptData,\n  type WaitForTransactionReceiptOptions,\n  waitForTransactionReceiptQueryOptions,\n} from '@wagmi/core/query'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseWaitForTransactionReceiptParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = WaitForTransactionReceiptData<config, chainId>,\n> = Compute<\n  WaitForTransactionReceiptOptions<config, chainId, selectData> &\n    ConfigParameter<config>\n>\n\nexport type UseWaitForTransactionReceiptReturnType<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = WaitForTransactionReceiptData<config, chainId>,\n> = UseQueryReturnType<selectData, WaitForTransactionReceiptErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useWaitForTransactionReceipt */\nexport function useWaitForTransactionReceipt<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = WaitForTransactionReceiptData<config, chainId>,\n>(\n  parameters: UseWaitForTransactionReceiptParameters<\n    config,\n    chainId,\n    selectData\n  > = {},\n): UseWaitForTransactionReceiptReturnType<config, chainId, selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = waitForTransactionReceiptQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  })\n  return useQuery(options) as any\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useWalletClient.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useWalletClient } from './useWalletClient.js'\n\ntest('parameters: config', async () => {\n  const client = useWalletClient({ config })\n  expectTypeOf(client.data?.chain?.id!).toEqualTypeOf<1 | 456 | 10>()\n\n  const client2 = useWalletClient({ config, chainId: 1 })\n  expectTypeOf(client2.data?.chain?.id!).toEqualTypeOf<1>()\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useWalletClient.test.tsx",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { render, renderHook } from '@wagmi/test/react'\nimport * as React from 'react'\nimport { expect, test, vi } from 'vitest'\nimport { useConnect } from './useConnect.js'\nimport { useConnection } from './useConnection.js'\nimport { useConnectors } from './useConnectors.js'\nimport { useDisconnect } from './useDisconnect.js'\nimport { useSwitchChain } from './useSwitchChain.js'\nimport { useWalletClient } from './useWalletClient.js'\n\n// Almost identical implementation to `useConnectorClient` (except for return type)\n// Should update both in tandem\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  const { result } = await renderHook(() => useWalletClient())\n\n  await vi.waitFor(() => expect(result.current.isPending).toBeTruthy())\n\n  expect(result.current).toMatchInlineSnapshot(`\n    {\n      \"data\": undefined,\n      \"dataUpdatedAt\": 0,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": false,\n      \"isFetchedAfterMount\": false,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": true,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": false,\n      \"isSuccess\": false,\n      \"queryKey\": [\n        \"walletClient\",\n        {\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"pending\",\n    }\n  `)\n})\n\ntest('behavior: connected on mount', async () => {\n  await connect(config, { connector })\n\n  const { result } = await renderHook(() => useWalletClient())\n\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  const { data, queryKey: _, ...rest } = result.current\n  expect(data).toMatchObject(\n    expect.objectContaining({\n      account: expect.any(Object),\n      chain: expect.any(Object),\n    }),\n  )\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": false,\n      \"isSuccess\": true,\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n\n  await disconnect(config, { connector })\n})\n\ntest('behavior: connect and disconnect', async () => {\n  const { result } = await renderHook(() => ({\n    useConnect: useConnect(),\n    useConnectors: useConnectors(),\n    useWalletClient: useWalletClient(),\n    useDisconnect: useDisconnect(),\n  }))\n\n  expect(result.current.useWalletClient.data).not.toBeDefined()\n\n  result.current.useConnect.connect({\n    connector: result.current.useConnectors[0]!,\n  })\n\n  await vi.waitFor(() =>\n    expect(result.current.useWalletClient.data).toBeDefined(),\n  )\n\n  result.current.useDisconnect.disconnect()\n\n  await vi.waitFor(() =>\n    expect(result.current.useWalletClient.data).not.toBeDefined(),\n  )\n})\n\ntest('behavior: switch chains', async () => {\n  await connect(config, { connector })\n\n  const { act, result } = await renderHook(() => ({\n    useWalletClient: useWalletClient(),\n    useSwitchChain: useSwitchChain(),\n  }))\n\n  expect(result.current.useWalletClient.data).not.toBeDefined()\n  await vi.waitFor(() =>\n    expect(result.current.useWalletClient.data).toBeDefined(),\n  )\n\n  await act(() => result.current.useSwitchChain.switchChain({ chainId: 456 }))\n  await vi.waitUntil(() => result.current.useSwitchChain.isSuccess, {\n    timeout: 10_000,\n  })\n  await act(() => result.current.useSwitchChain.reset())\n  await vi.waitUntil(() => result.current.useWalletClient.isSuccess, {\n    timeout: 10_000,\n  })\n  expect(result.current.useWalletClient.data?.chain.id).toEqual(456)\n\n  await act(() => result.current.useSwitchChain.switchChain({ chainId: 1 }))\n  await vi.waitUntil(() => result.current.useSwitchChain.isSuccess, {\n    timeout: 10_000,\n  })\n  await vi.waitUntil(() => result.current.useWalletClient.isSuccess, {\n    timeout: 10_000,\n  })\n  expect(result.current.useWalletClient.data?.chain.id).toEqual(1)\n\n  await disconnect(config, { connector })\n})\n\ntest('behavior: re-render does not invalidate query', async () => {\n  await disconnect(config, { connector })\n\n  const screen = await render(<Parent />)\n\n  await screen.getByTestId('connect').click()\n  await vi.waitFor(async () => {\n    await expect\n      .element(screen.getByTestId('address'))\n      .toHaveTextContent('0x95132632579b073D12a6673e18Ab05777a6B86f8')\n    await expect.element(screen.getByTestId('client')).toBeVisible()\n\n    await expect.element(screen.getByTestId('child-client')).toBeVisible()\n    await expect\n      .element(screen.getByTestId('render-count'))\n      .toHaveTextContent('1')\n  })\n\n  const initialClient = screen.getByTestId('child-client')\n\n  await screen.getByTestId('rerender').click()\n  await vi.waitFor(() =>\n    expect.element(screen.getByTestId('render-count')).toHaveTextContent('2'),\n  )\n\n  await expect\n    .element(screen.getByTestId('child-client').element())\n    .toEqual(initialClient.element())\n})\n\nfunction Parent() {\n  const [renderCount, setRenderCount] = React.useState(1)\n\n  const { connect } = useConnect()\n  const connectors = useConnectors()\n  const { address } = useConnection()\n  const { data } = useWalletClient()\n\n  return (\n    <>\n      <div data-testid=\"address\">{address}</div>\n      <div data-testid=\"client\">{data?.uid}</div>\n      <Child key={renderCount} renderCount={renderCount} />\n\n      <button\n        type=\"button\"\n        data-testid=\"connect\"\n        onClick={() => connect({ connector: connectors[0]! })}\n      >\n        Connect\n      </button>\n      <button\n        type=\"button\"\n        data-testid=\"rerender\"\n        onClick={() => setRenderCount((prev) => prev + 1)}\n      >\n        Re-render\n      </button>\n    </>\n  )\n}\n\nfunction Child(props: { renderCount: number }) {\n  const { renderCount } = props\n  const { data } = useWalletClient()\n  return (\n    <div>\n      <span data-testid=\"child-client\">{data?.uid}</span>\n      <span data-testid=\"render-count\">{renderCount}</span>\n    </div>\n  )\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useWalletClient.ts",
    "content": "'use client'\n// Almost identical implementation to `useConnectorClient` (except for return type)\n// Should update both in tandem\nimport { useQueryClient } from '@tanstack/react-query'\nimport type {\n  Config,\n  GetWalletClientErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetWalletClientData,\n  type GetWalletClientOptions,\n  getWalletClientQueryOptions,\n} from '@wagmi/core/query'\nimport { useEffect, useRef } from 'react'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\nimport { useConnection } from './useConnection.js'\n\nexport type UseWalletClientParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetWalletClientData<config, chainId>,\n> = Compute<\n  GetWalletClientOptions<config, chainId, selectData> & ConfigParameter<config>\n>\n\nexport type UseWalletClientReturnType<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetWalletClientData<config, chainId>,\n> = UseQueryReturnType<selectData, GetWalletClientErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useWalletClient */\nexport function useWalletClient<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetWalletClientData<config, chainId>,\n>(\n  parameters: UseWalletClientParameters<config, chainId, selectData> = {},\n): UseWalletClientReturnType<config, chainId, selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const { address, connector } = useConnection({ config })\n  const options = getWalletClientQueryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n    connector: parameters.connector ?? connector,\n    query: parameters.query as any,\n  })\n\n  const addressRef = useRef(address)\n  const queryClient = useQueryClient()\n  // biome-ignore lint/correctness/useExhaustiveDependencies: `queryKey` not required\n  useEffect(() => {\n    const previousAddress = addressRef.current\n    if (!address && previousAddress) {\n      // remove when account is disconnected\n      queryClient.removeQueries({ queryKey: options.queryKey })\n      addressRef.current = undefined\n    } else if (address !== previousAddress) {\n      // invalidate when address changes\n      queryClient.invalidateQueries({ queryKey: options.queryKey })\n      addressRef.current = address\n    }\n  }, [address, queryClient])\n\n  return useQuery(options) as any\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useWatchAsset.test-d.ts",
    "content": "import type { WatchAssetErrorType } from '@wagmi/core'\nimport type { WatchAssetVariables } from '@wagmi/core/query'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useWatchAsset } from './useWatchAsset.js'\n\nconst tokenInfo = {\n  address: '0x0000000000000000000000000000000000000000',\n  symbol: 'NULL',\n  decimals: 18,\n}\nconst contextValue = { foo: 'bar' } as const\n\ntest('context', () => {\n  const watchAsset = useWatchAsset({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toEqualTypeOf<WatchAssetVariables>()\n        return contextValue\n      },\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<WatchAssetVariables>()\n        expectTypeOf(error).toEqualTypeOf<WatchAssetErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<WatchAssetVariables>()\n        expectTypeOf(data).toEqualTypeOf<boolean>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<boolean | undefined>()\n        expectTypeOf(error).toEqualTypeOf<WatchAssetErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<WatchAssetVariables>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  })\n\n  expectTypeOf(watchAsset.data).toEqualTypeOf<boolean | undefined>()\n  expectTypeOf(watchAsset.error).toEqualTypeOf<WatchAssetErrorType | null>()\n  expectTypeOf(watchAsset.variables).toEqualTypeOf<\n    WatchAssetVariables | undefined\n  >()\n  expectTypeOf(watchAsset.context).toEqualTypeOf<\n    typeof contextValue | undefined\n  >()\n\n  watchAsset.mutate(\n    { type: 'ERC20', options: tokenInfo },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<WatchAssetVariables>()\n        expectTypeOf(error).toEqualTypeOf<WatchAssetErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<WatchAssetVariables>()\n        expectTypeOf(data).toEqualTypeOf<boolean>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<boolean | undefined>()\n        expectTypeOf(error).toEqualTypeOf<WatchAssetErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<WatchAssetVariables>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  )\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useWatchAsset.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useWatchAsset } from './useWatchAsset.js'\n\nconst connector = config.connectors[0]!\n\nconst tokenInfo = {\n  address: '0x0000000000000000000000000000000000000000',\n  symbol: 'NULL',\n  decimals: 18,\n}\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const { result } = await renderHook(() => useWatchAsset())\n\n  result.current.mutate({ type: 'ERC20', options: tokenInfo })\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current.data).toEqual(true)\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useWatchAsset.ts",
    "content": "'use client'\nimport { useMutation } from '@tanstack/react-query'\nimport type { WatchAssetErrorType } from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type WatchAssetData,\n  type WatchAssetMutate,\n  type WatchAssetMutateAsync,\n  type WatchAssetOptions,\n  type WatchAssetVariables,\n  watchAssetMutationOptions,\n} from '@wagmi/core/query'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseWatchAssetParameters<context = unknown> = Compute<\n  ConfigParameter & WatchAssetOptions<context>\n>\n\nexport type UseWatchAssetReturnType<context = unknown> = Compute<\n  UseMutationReturnType<\n    WatchAssetData,\n    WatchAssetErrorType,\n    WatchAssetVariables,\n    context,\n    WatchAssetMutate<context>,\n    WatchAssetMutateAsync<context>\n  > & {\n    /** @deprecated use `mutate` instead */\n    watchAsset: WatchAssetMutate<context>\n    /** @deprecated use `mutateAsync` instead */\n    watchAssetAsync: WatchAssetMutateAsync<context>\n  }\n>\n\n/** https://wagmi.sh/react/api/hooks/useWatchAsset */\nexport function useWatchAsset<context = unknown>(\n  parameters: UseWatchAssetParameters<context> = {},\n): UseWatchAssetReturnType<context> {\n  const config = useConfig(parameters)\n  const options = watchAssetMutationOptions(config, parameters)\n  const mutation = useMutation(options)\n  type Return = UseWatchAssetReturnType<context>\n  return {\n    ...(mutation as Return),\n    watchAsset: mutation.mutate as Return['mutate'],\n    watchAssetAsync: mutation.mutateAsync as Return['mutateAsync'],\n  }\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useWatchBlockNumber.test-d.ts",
    "content": "import { createConfig } from '@wagmi/core'\nimport { http, webSocket } from 'viem'\nimport { mainnet, optimism } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport {\n  type UseWatchBlockNumberParameters,\n  useWatchBlockNumber,\n} from './useWatchBlockNumber.js'\n\ntest('default', () => {\n  useWatchBlockNumber({\n    poll: false,\n    onBlockNumber() {},\n  })\n})\n\ntest('differing transports', () => {\n  const config = createConfig({\n    chains: [mainnet, optimism],\n    transports: {\n      [mainnet.id]: http(),\n      [optimism.id]: webSocket(),\n    },\n  })\n\n  type Result = UseWatchBlockNumberParameters<\n    typeof config,\n    typeof mainnet.id | typeof optimism.id\n  >\n  expectTypeOf<Result['poll']>().toEqualTypeOf<boolean | undefined>()\n  useWatchBlockNumber({\n    config,\n    poll: false,\n    onBlockNumber() {},\n  })\n\n  type Result2 = UseWatchBlockNumberParameters<typeof config, typeof mainnet.id>\n  expectTypeOf<Result2['poll']>().toEqualTypeOf<true | undefined>()\n  useWatchBlockNumber({\n    config,\n    chainId: mainnet.id,\n    poll: true,\n    onBlockNumber() {},\n  })\n  useWatchBlockNumber({\n    config,\n    chainId: mainnet.id,\n    // @ts-expect-error\n    poll: false,\n    onBlockNumber() {},\n  })\n\n  type Result3 = UseWatchBlockNumberParameters<\n    typeof config,\n    typeof optimism.id\n  >\n  expectTypeOf<Result3['poll']>().toEqualTypeOf<boolean | undefined>()\n  useWatchBlockNumber({\n    config,\n    chainId: optimism.id,\n    poll: true,\n    onBlockNumber() {},\n  })\n  useWatchBlockNumber({\n    config,\n    chainId: optimism.id,\n    poll: false,\n    onBlockNumber() {},\n  })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useWatchBlockNumber.test.ts",
    "content": "import { testClient, wait } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useWatchBlockNumber } from './useWatchBlockNumber.js'\n\ntest('default', async () => {\n  const blockNumbers: bigint[] = []\n  renderHook(() =>\n    useWatchBlockNumber({\n      onBlockNumber(blockNumber) {\n        blockNumbers.push(blockNumber)\n      },\n    }),\n  )\n\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(100)\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(100)\n  await testClient.mainnet.mine({ blocks: 1 })\n\n  await vi.waitUntil(() => blockNumbers.length === 3, { timeout: 10_000 })\n  expect(blockNumbers.length).toBe(3)\n})\n\ntest('behavior: does not resubscribe when onBlockNumber changes', async () => {\n  const blockNumbers: bigint[] = []\n  let callbackCallCount = 0\n\n  const { rerender } = await renderHook(\n    (props) =>\n      useWatchBlockNumber({\n        onBlockNumber: props?.callback,\n      }),\n    {\n      initialProps: {\n        callback: (blockNumber: bigint) => {\n          callbackCallCount++\n          blockNumbers.push(blockNumber)\n        },\n      },\n    },\n  )\n\n  await testClient.mainnet.mine({ blocks: 1 })\n  await vi.waitUntil(() => blockNumbers.length >= 1, { timeout: 10_000 })\n\n  // Rerender with new callback references multiple times\n  rerender({\n    callback: (blockNumber: bigint) => {\n      callbackCallCount++\n      blockNumbers.push(blockNumber)\n    },\n  })\n  rerender({\n    callback: (blockNumber: bigint) => {\n      callbackCallCount++\n      blockNumbers.push(blockNumber)\n    },\n  })\n  rerender({\n    callback: (blockNumber: bigint) => {\n      callbackCallCount++\n      blockNumbers.push(blockNumber)\n    },\n  })\n\n  await testClient.mainnet.mine({ blocks: 1 })\n  await vi.waitUntil(() => blockNumbers.length >= 2, { timeout: 10_000 })\n\n  rerender({\n    callback: (blockNumber: bigint) => {\n      callbackCallCount++\n      blockNumbers.push(blockNumber)\n    },\n  })\n\n  // If resubscribing happened, we'd see duplicate block numbers or\n  // emitOnBegin behavior. We should only have 2 blocks total.\n  expect(blockNumbers.length).toBe(2)\n  expect(callbackCallCount).toBe(2)\n})\n\ntest('behavior: uses latest callback after rerender', async () => {\n  const blockNumbers1: bigint[] = []\n  const blockNumbers2: bigint[] = []\n\n  const { rerender } = await renderHook(\n    (props) =>\n      useWatchBlockNumber({\n        onBlockNumber: props?.callback,\n      }),\n    {\n      initialProps: {\n        callback: (blockNumber: bigint) => blockNumbers1.push(blockNumber),\n      },\n    },\n  )\n\n  await testClient.mainnet.mine({ blocks: 1 })\n  await vi.waitUntil(() => blockNumbers1.length >= 1, { timeout: 10_000 })\n\n  rerender({\n    callback: (blockNumber) => blockNumbers2.push(blockNumber),\n  })\n\n  await testClient.mainnet.mine({ blocks: 1 })\n  await vi.waitUntil(() => blockNumbers2.length >= 1, { timeout: 10_000 })\n\n  expect(blockNumbers1.length).toBe(1)\n  expect(blockNumbers2.length).toBeGreaterThanOrEqual(1)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useWatchBlockNumber.ts",
    "content": "'use client'\nimport {\n  type Config,\n  type ResolvedRegister,\n  type WatchBlockNumberParameters,\n  watchBlockNumber,\n} from '@wagmi/core'\nimport type {\n  ConfigParameter,\n  EnabledParameter,\n  UnionCompute,\n  UnionExactPartial,\n} from '@wagmi/core/internal'\nimport { useEffect, useRef } from 'react'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseWatchBlockNumberParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n> = UnionCompute<\n  UnionExactPartial<WatchBlockNumberParameters<config, chainId>> &\n    ConfigParameter<config> &\n    EnabledParameter\n>\n\nexport type UseWatchBlockNumberReturnType = void\n\n/** https://wagmi.sh/react/api/hooks/useWatchBlockNumber */\nexport function useWatchBlockNumber<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n>(\n  parameters: UseWatchBlockNumberParameters<config, chainId> = {} as any,\n): UseWatchBlockNumberReturnType {\n  const { enabled = true, onBlockNumber, config: _, ...rest } = parameters\n\n  const config = useConfig(parameters)\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  const onBlockNumberRef = useRef(onBlockNumber)\n  const onErrorRef = useRef(rest.onError)\n  onBlockNumberRef.current = onBlockNumber\n  onErrorRef.current = rest.onError\n\n  // TODO(react@19): cleanup\n  // biome-ignore lint/correctness/useExhaustiveDependencies: `rest` changes every render so only including properties in dependency array\n  useEffect(() => {\n    if (!enabled) return\n    if (!onBlockNumberRef.current) return\n    return watchBlockNumber(config, {\n      ...(rest as any),\n      chainId,\n      onBlockNumber: (blockNumber, prevBlockNumber) =>\n        onBlockNumberRef.current?.(blockNumber, prevBlockNumber),\n      onError: (error) => onErrorRef.current?.(error),\n    })\n  }, [\n    chainId,\n    config,\n    enabled,\n    ///\n    rest.emitMissed,\n    rest.emitOnBegin,\n    rest.poll,\n    rest.pollingInterval,\n    rest.syncConnectedChain,\n  ])\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useWatchBlocks.test-d.ts",
    "content": "import { createConfig } from '@wagmi/core'\nimport { http, webSocket } from 'viem'\nimport { mainnet, optimism } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport {\n  type UseWatchBlocksParameters,\n  useWatchBlocks,\n} from './useWatchBlocks.js'\n\ntest('default', () => {\n  useWatchBlocks({\n    poll: false,\n    onBlock() {},\n  })\n})\n\ntest('differing transports', () => {\n  const config = createConfig({\n    chains: [mainnet, optimism],\n    transports: {\n      [mainnet.id]: http(),\n      [optimism.id]: webSocket(),\n    },\n  })\n\n  type Result = UseWatchBlocksParameters<\n    false,\n    'latest',\n    typeof config,\n    typeof mainnet.id | typeof optimism.id\n  >\n  expectTypeOf<Result['poll']>().toEqualTypeOf<boolean | undefined>()\n  useWatchBlocks({\n    config,\n    poll: false,\n    onBlock() {},\n  })\n\n  type Result2 = UseWatchBlocksParameters<\n    false,\n    'latest',\n    typeof config,\n    typeof mainnet.id\n  >\n  expectTypeOf<Result2['poll']>().toEqualTypeOf<true | undefined>()\n  useWatchBlocks({\n    config,\n    chainId: mainnet.id,\n    poll: true,\n    onBlock() {},\n  })\n\n  type Result3 = UseWatchBlocksParameters<\n    false,\n    'latest',\n    typeof config,\n    typeof optimism.id\n  >\n  expectTypeOf<Result3['poll']>().toEqualTypeOf<boolean | undefined>()\n  useWatchBlocks({\n    config,\n    chainId: optimism.id,\n    poll: true,\n    onBlock() {},\n  })\n  useWatchBlocks({\n    config,\n    chainId: optimism.id,\n    poll: false,\n    onBlock() {},\n  })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useWatchBlocks.test.ts",
    "content": "import { testClient, wait } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport type { Block } from 'viem'\nimport { expect, test, vi } from 'vitest'\n\nimport { useWatchBlocks } from './useWatchBlocks.js'\n\ntest('default', async () => {\n  const blocks: Block[] = []\n  await renderHook(() =>\n    useWatchBlocks({\n      onBlock(block) {\n        blocks.push(block)\n      },\n    }),\n  )\n\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(500)\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(500)\n  await testClient.mainnet.mine({ blocks: 1 })\n\n  await vi.waitUntil(() => blocks.length === 3, { timeout: 10_000 })\n  expect(blocks.length).toBe(3)\n})\n\ntest('behavior: uses latest callback after rerender', async () => {\n  const blocks1: Block[] = []\n  const blocks2: Block[] = []\n\n  const { rerender } = await renderHook(\n    (props) =>\n      useWatchBlocks({\n        onBlock: props?.callback,\n      }),\n    {\n      initialProps: {\n        callback: (block: Block) => blocks1.push(block),\n      },\n    },\n  )\n\n  await testClient.mainnet.mine({ blocks: 1 })\n  await vi.waitUntil(() => blocks1.length >= 1, { timeout: 10_000 })\n\n  rerender({\n    callback: (block) => blocks2.push(block),\n  })\n\n  await testClient.mainnet.mine({ blocks: 1 })\n  await vi.waitUntil(() => blocks2.length >= 1, { timeout: 10_000 })\n\n  expect(blocks1.length).toBe(1)\n  expect(blocks2.length).toBeGreaterThanOrEqual(1)\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useWatchBlocks.ts",
    "content": "'use client'\nimport {\n  type Config,\n  type ResolvedRegister,\n  type WatchBlocksParameters,\n  watchBlocks,\n} from '@wagmi/core'\nimport type {\n  ConfigParameter,\n  EnabledParameter,\n  UnionCompute,\n  UnionExactPartial,\n} from '@wagmi/core/internal'\nimport { useEffect, useRef } from 'react'\nimport type { BlockTag } from 'viem'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseWatchBlocksParameters<\n  includeTransactions extends boolean = false,\n  blockTag extends BlockTag = 'latest',\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n> = UnionCompute<\n  UnionExactPartial<\n    WatchBlocksParameters<includeTransactions, blockTag, config, chainId>\n  > &\n    ConfigParameter<config> &\n    EnabledParameter\n>\n\nexport type UseWatchBlocksReturnType = void\n\n/** https://wagmi.sh/react/hooks/useWatchBlocks */\nexport function useWatchBlocks<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  includeTransactions extends boolean = false,\n  blockTag extends BlockTag = 'latest',\n>(\n  parameters: UseWatchBlocksParameters<\n    includeTransactions,\n    blockTag,\n    config,\n    chainId\n  > = {} as any,\n): UseWatchBlocksReturnType {\n  const { enabled = true, onBlock, config: _, ...rest } = parameters\n\n  const config = useConfig(parameters)\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  const onBlockRef = useRef(onBlock)\n  const onErrorRef = useRef(rest.onError)\n  onBlockRef.current = onBlock\n  onErrorRef.current = rest.onError\n\n  // TODO(react@19): cleanup\n  // biome-ignore lint/correctness/useExhaustiveDependencies: `rest` changes every render so only including properties in dependency array\n  useEffect(() => {\n    if (!enabled) return\n    if (!onBlockRef.current) return\n    return watchBlocks(config, {\n      ...(rest as any),\n      chainId,\n      onBlock: (block, prevBlock) =>\n        onBlockRef.current?.(block as any, prevBlock as any),\n      onError: (error) => onErrorRef.current?.(error),\n    })\n  }, [\n    chainId,\n    config,\n    enabled,\n    ///\n    rest.blockTag,\n    rest.emitMissed,\n    rest.emitOnBegin,\n    rest.includeTransactions,\n    rest.poll,\n    rest.pollingInterval,\n    rest.syncConnectedChain,\n  ])\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useWatchContractEvent.test-d.ts",
    "content": "import { createConfig, http, webSocket } from '@wagmi/core'\nimport { mainnet, optimism } from '@wagmi/core/chains'\nimport { abi } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport {\n  type UseWatchContractEventParameters,\n  useWatchContractEvent,\n} from './useWatchContractEvent.js'\n\ntest('default', () => {\n  useWatchContractEvent({\n    address: '0x',\n    abi: abi.erc20,\n    eventName: 'Transfer',\n    poll: false,\n    args: {\n      from: '0x',\n      to: '0x',\n    },\n    onLogs(logs) {\n      expectTypeOf(logs[0]!.eventName).toEqualTypeOf<'Transfer'>()\n      expectTypeOf(logs[0]!.args).toEqualTypeOf<{\n        from?: `0x${string}` | undefined\n        to?: `0x${string}` | undefined\n        value?: bigint | undefined\n      }>()\n    },\n  })\n})\n\ntest('behavior: no eventName', () => {\n  useWatchContractEvent({\n    address: '0x',\n    abi: abi.erc20,\n    args: {\n      // TODO: Figure out why this is not working\n      // @ts-ignore\n      from: '0x',\n      to: '0x',\n    },\n    onLogs(logs) {\n      expectTypeOf(logs[0]!.eventName).toEqualTypeOf<'Transfer' | 'Approval'>()\n      expectTypeOf(logs[0]!.args).toEqualTypeOf<\n        | {\n            from?: `0x${string}` | undefined\n            to?: `0x${string}` | undefined\n            value?: bigint | undefined\n          }\n        | {\n            owner?: `0x${string}` | undefined\n            spender?: `0x${string}` | undefined\n            value?: bigint | undefined\n          }\n      >()\n    },\n  })\n})\n\ntest('differing transports', () => {\n  const config = createConfig({\n    chains: [mainnet, optimism],\n    transports: {\n      [mainnet.id]: http(),\n      [optimism.id]: webSocket(),\n    },\n  })\n\n  type Result = UseWatchContractEventParameters<\n    typeof abi.erc20,\n    'Transfer' | 'Approval',\n    true,\n    typeof config,\n    typeof mainnet.id | typeof optimism.id\n  >\n  expectTypeOf<Result['poll']>().toEqualTypeOf<boolean | undefined>()\n  useWatchContractEvent({\n    config,\n    poll: false,\n    address: '0x',\n    abi: abi.erc20,\n    onLogs() {},\n  })\n\n  type Result2 = UseWatchContractEventParameters<\n    typeof abi.erc20,\n    'Transfer' | 'Approval',\n    true,\n    typeof config,\n    typeof mainnet.id\n  >\n  expectTypeOf<Result2['poll']>().toEqualTypeOf<true | undefined>()\n  useWatchContractEvent({\n    config,\n    chainId: mainnet.id,\n    poll: true,\n    address: '0x',\n    abi: abi.erc20,\n    onLogs() {},\n  })\n\n  type Result3 = UseWatchContractEventParameters<\n    typeof abi.erc20,\n    'Transfer' | 'Approval',\n    true,\n    typeof config,\n    typeof optimism.id\n  >\n  expectTypeOf<Result3['poll']>().toEqualTypeOf<boolean | undefined>()\n  useWatchContractEvent({\n    config,\n    chainId: optimism.id,\n    poll: true,\n    address: '0x',\n    abi: abi.erc20,\n    onLogs() {},\n  })\n  useWatchContractEvent({\n    config,\n    chainId: optimism.id,\n    poll: false,\n    address: '0x',\n    abi: abi.erc20,\n    onLogs() {},\n  })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useWatchContractEvent.test.ts",
    "content": "import { connect, disconnect, readContract, writeContract } from '@wagmi/core'\nimport {\n  abi,\n  accounts,\n  address,\n  config,\n  testClient,\n  transactionHashRegex,\n  wait,\n} from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { createWalletClient, erc20Abi, http, parseEther } from 'viem'\nimport type { WatchEventOnLogsParameter } from 'viem/actions'\nimport { expect, test, vi } from 'vitest'\n\nimport { useWatchContractEvent } from './useWatchContractEvent.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  const data = await connect(config, { connector })\n  const connectedAddress = data.accounts[0]\n\n  // impersonate usdc holder account and transfer usdc to connected account\n  await testClient.mainnet.impersonateAccount({ address: address.usdcHolder })\n  await testClient.mainnet.setBalance({\n    address: address.usdcHolder,\n    value: 10000000000000000000000n,\n  })\n  await createWalletClient({\n    account: address.usdcHolder,\n    chain: testClient.mainnet.chain,\n    transport: http(),\n  }).writeContract({\n    address: address.usdc,\n    abi: abi.erc20,\n    functionName: 'transfer',\n    args: [connectedAddress, parseEther('10', 'gwei')],\n  })\n  await testClient.mainnet.mine({ blocks: 1 })\n  await testClient.mainnet.stopImpersonatingAccount({\n    address: address.usdcHolder,\n  })\n\n  const balance = await readContract(config, {\n    address: address.usdc,\n    abi: erc20Abi,\n    functionName: 'balanceOf',\n    args: [connectedAddress],\n  })\n  expect(balance).toBeGreaterThan(0n)\n\n  // start watching transfer events\n  let logs: WatchEventOnLogsParameter = []\n  renderHook(() =>\n    useWatchContractEvent({\n      address: address.usdc,\n      abi: abi.erc20,\n      eventName: 'Transfer',\n      onLogs(next) {\n        logs = logs.concat(next)\n      },\n    }),\n  )\n\n  await writeContract(config, {\n    address: address.usdc,\n    abi: abi.erc20,\n    functionName: 'transfer',\n    args: [accounts[1], parseEther('1', 'gwei')],\n  })\n\n  await writeContract(config, {\n    address: address.usdc,\n    abi: abi.erc20,\n    functionName: 'transfer',\n    args: [accounts[3], parseEther('1', 'gwei')],\n  })\n\n  await testClient.mainnet.mine({ blocks: 1 })\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(1000) // wait for events to be emitted\n\n  expect(logs.length).toBe(2)\n  expect(logs[0]?.transactionHash).toMatch(transactionHashRegex)\n\n  await disconnect(config, { connector })\n  await wait(500)\n})\n\ntest('behavior: uses latest callback after rerender', async () => {\n  await connect(config, { connector })\n\n  let logs1: WatchEventOnLogsParameter = []\n  let logs2: WatchEventOnLogsParameter = []\n\n  const { rerender } = await renderHook(\n    (props) =>\n      useWatchContractEvent({\n        address: address.usdc,\n        abi: abi.erc20,\n        eventName: 'Transfer',\n        onLogs: props?.callback,\n      }),\n    {\n      initialProps: {\n        callback: (next: WatchEventOnLogsParameter) => {\n          logs1 = logs1.concat(next)\n        },\n      },\n    },\n  )\n\n  await writeContract(config, {\n    address: address.usdc,\n    abi: abi.erc20,\n    functionName: 'transfer',\n    args: [accounts[1], parseEther('0.001', 'gwei')],\n  })\n  await testClient.mainnet.mine({ blocks: 1 })\n  await vi.waitUntil(() => logs1.length >= 1, { timeout: 10_000 })\n\n  rerender({\n    callback: (next) => {\n      logs2 = logs2.concat(next)\n    },\n  })\n\n  await writeContract(config, {\n    address: address.usdc,\n    abi: abi.erc20,\n    functionName: 'transfer',\n    args: [accounts[1], parseEther('0.001', 'gwei')],\n  })\n  await testClient.mainnet.mine({ blocks: 1 })\n  await vi.waitUntil(() => logs2.length >= 1, { timeout: 10_000 })\n\n  expect(logs1.length).toBe(1)\n  expect(logs2.length).toBeGreaterThanOrEqual(1)\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useWatchContractEvent.ts",
    "content": "'use client'\nimport {\n  type Config,\n  deepEqual,\n  type ResolvedRegister,\n  type WatchContractEventParameters,\n  watchContractEvent,\n} from '@wagmi/core'\nimport type {\n  ConfigParameter,\n  EnabledParameter,\n  UnionCompute,\n  UnionExactPartial,\n} from '@wagmi/core/internal'\nimport { useEffect, useRef } from 'react'\nimport type { Abi, ContractEventName } from 'viem'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseWatchContractEventParameters<\n  abi extends Abi | readonly unknown[] = Abi,\n  eventName extends ContractEventName<abi> = ContractEventName<abi>,\n  strict extends boolean | undefined = undefined,\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n> = UnionCompute<\n  UnionExactPartial<\n    WatchContractEventParameters<abi, eventName, strict, config, chainId>\n  > &\n    ConfigParameter<config> &\n    EnabledParameter\n>\n\nexport type UseWatchContractEventReturnType = void\n\n/** https://wagmi.sh/react/api/hooks/useWatchContractEvent */\nexport function useWatchContractEvent<\n  const abi extends Abi | readonly unknown[],\n  eventName extends ContractEventName<abi>,\n  strict extends boolean | undefined = undefined,\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n>(\n  parameters: UseWatchContractEventParameters<\n    abi,\n    eventName,\n    strict,\n    config,\n    chainId\n  > = {} as any,\n): UseWatchContractEventReturnType {\n  const { enabled = true, onLogs, config: _, ...rest } = parameters\n\n  const config = useConfig(parameters)\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  const onLogsRef = useRef(onLogs)\n  const onErrorRef = useRef(rest.onError)\n  onLogsRef.current = onLogs\n  onErrorRef.current = rest.onError\n\n  const abiRef = useRef(rest.abi)\n  const addressRef = useRef(rest.address)\n  const argsRef = useRef(rest.args)\n  if (!abiRef.current || !deepEqual(abiRef.current, rest.abi))\n    abiRef.current = rest.abi\n  if (!addressRef.current || !deepEqual(addressRef.current, rest.address))\n    addressRef.current = rest.address\n  if (!argsRef.current || !deepEqual(argsRef.current, rest.args))\n    argsRef.current = rest.args\n\n  // TODO(react@19): cleanup\n  // biome-ignore lint/correctness/useExhaustiveDependencies: `rest` changes every render so only including properties in dependency array\n  useEffect(() => {\n    if (!enabled) return\n    if (!onLogsRef.current) return\n    return watchContractEvent(config, {\n      ...(rest as any),\n      chainId,\n      onLogs: (logs) => onLogsRef.current?.(logs as any),\n      onError: (error) => onErrorRef.current?.(error),\n    })\n  }, [\n    chainId,\n    config,\n    enabled,\n    ///\n    abiRef.current,\n    addressRef.current,\n    argsRef.current,\n    rest.batch,\n    rest.eventName,\n    rest.fromBlock,\n    rest.poll,\n    rest.pollingInterval,\n    rest.strict,\n    rest.syncConnectedChain,\n  ])\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useWatchPendingTransactions.test-d.ts",
    "content": "import { createConfig } from '@wagmi/core'\nimport { http, webSocket } from 'viem'\nimport { mainnet, optimism } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport {\n  type UseWatchPendingTransactionsParameters,\n  useWatchPendingTransactions,\n} from './useWatchPendingTransactions.js'\n\ntest('default', () => {\n  useWatchPendingTransactions({\n    poll: false,\n    onTransactions() {},\n  })\n})\n\ntest('differing transports', () => {\n  const config = createConfig({\n    chains: [mainnet, optimism],\n    transports: {\n      [mainnet.id]: http(),\n      [optimism.id]: webSocket(),\n    },\n  })\n\n  type Result = UseWatchPendingTransactionsParameters<\n    typeof config,\n    typeof mainnet.id | typeof optimism.id\n  >\n  expectTypeOf<Result['poll']>().toEqualTypeOf<boolean | undefined>()\n  useWatchPendingTransactions({\n    config,\n    poll: false,\n    onTransactions() {},\n  })\n\n  type Result2 = UseWatchPendingTransactionsParameters<\n    typeof config,\n    typeof mainnet.id\n  >\n  expectTypeOf<Result2['poll']>().toEqualTypeOf<true | undefined>()\n  useWatchPendingTransactions({\n    config,\n    chainId: mainnet.id,\n    poll: true,\n    onTransactions() {},\n  })\n\n  type Result3 = UseWatchPendingTransactionsParameters<\n    typeof config,\n    typeof optimism.id\n  >\n  expectTypeOf<Result3['poll']>().toEqualTypeOf<boolean | undefined>()\n  useWatchPendingTransactions({\n    config,\n    chainId: optimism.id,\n    poll: true,\n    onTransactions() {},\n  })\n  useWatchPendingTransactions({\n    config,\n    chainId: optimism.id,\n    poll: false,\n    onTransactions() {},\n  })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useWatchPendingTransactions.test.ts",
    "content": "import { connect, disconnect, sendTransaction } from '@wagmi/core'\nimport {\n  accounts,\n  config,\n  testClient,\n  transactionHashRegex,\n  wait,\n} from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { parseEther } from 'viem'\nimport type { OnTransactionsParameter } from 'viem/actions'\nimport { expect, test, vi } from 'vitest'\n\nimport { useWatchPendingTransactions } from './useWatchPendingTransactions.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  let transactions: OnTransactionsParameter = []\n  renderHook(() =>\n    useWatchPendingTransactions({\n      onTransactions(next) {\n        transactions = [...transactions, ...next]\n      },\n    }),\n  )\n  await wait(1000)\n\n  await sendTransaction(config, {\n    to: accounts[1],\n    value: parseEther('1'),\n  })\n  await wait(200)\n\n  await sendTransaction(config, {\n    to: accounts[3],\n    value: parseEther('1'),\n  })\n  await wait(200)\n\n  await testClient.mainnet.mine({ blocks: 1 })\n\n  expect(transactions.length).toBe(2)\n  expect(transactions[0]).toMatch(transactionHashRegex)\n\n  await disconnect(config, { connector })\n})\n\ntest('behavior: uses latest callback after rerender', async () => {\n  await connect(config, { connector })\n\n  let transactions1: OnTransactionsParameter = []\n  let transactions2: OnTransactionsParameter = []\n\n  const { rerender } = await renderHook(\n    (props) =>\n      useWatchPendingTransactions({\n        onTransactions: props?.callback,\n      }),\n    {\n      initialProps: {\n        callback: (next: OnTransactionsParameter) => {\n          transactions1 = [...transactions1, ...next]\n        },\n      },\n    },\n  )\n  await wait(1000)\n\n  await sendTransaction(config, {\n    to: accounts[1],\n    value: parseEther('0.001'),\n  })\n  await vi.waitUntil(() => transactions1.length >= 1, { timeout: 10_000 })\n  await testClient.mainnet.mine({ blocks: 1 })\n\n  rerender({\n    callback: (next) => {\n      transactions2 = [...transactions2, ...next]\n    },\n  })\n\n  await sendTransaction(config, {\n    to: accounts[1],\n    value: parseEther('0.001'),\n  })\n  await vi.waitUntil(() => transactions2.length >= 1, { timeout: 10_000 })\n  await testClient.mainnet.mine({ blocks: 1 })\n\n  expect(transactions1.length).toBe(1)\n  expect(transactions2.length).toBeGreaterThanOrEqual(1)\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useWatchPendingTransactions.ts",
    "content": "'use client'\nimport {\n  type Config,\n  type ResolvedRegister,\n  type WatchPendingTransactionsParameters,\n  watchPendingTransactions,\n} from '@wagmi/core'\nimport type {\n  ConfigParameter,\n  EnabledParameter,\n  UnionCompute,\n  UnionExactPartial,\n} from '@wagmi/core/internal'\nimport { useEffect, useRef } from 'react'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseWatchPendingTransactionsParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n> = UnionCompute<\n  UnionExactPartial<WatchPendingTransactionsParameters<config, chainId>> &\n    ConfigParameter<config> &\n    EnabledParameter\n>\n\nexport type UseWatchPendingTransactionsReturnType = void\n\n/** https://wagmi.sh/react/api/hooks/useWatchPendingTransactions */\nexport function useWatchPendingTransactions<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n>(\n  parameters: UseWatchPendingTransactionsParameters<\n    config,\n    chainId\n  > = {} as any,\n): UseWatchPendingTransactionsReturnType {\n  const { enabled = true, onTransactions, config: _, ...rest } = parameters\n\n  const config = useConfig(parameters)\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  const onTransactionsRef = useRef(onTransactions)\n  const onErrorRef = useRef(rest.onError)\n  onTransactionsRef.current = onTransactions\n  onErrorRef.current = rest.onError\n\n  // TODO(react@19): cleanup\n  // biome-ignore lint/correctness/useExhaustiveDependencies: `rest` changes every render so only including properties in dependency array\n  useEffect(() => {\n    if (!enabled) return\n    if (!onTransactionsRef.current) return\n    return watchPendingTransactions(config, {\n      ...(rest as any),\n      chainId,\n      onTransactions: (transactions) =>\n        onTransactionsRef.current?.(transactions),\n      onError: (error) => onErrorRef.current?.(error),\n    })\n  }, [\n    chainId,\n    config,\n    enabled,\n    ///\n    rest.batch,\n    rest.poll,\n    rest.pollingInterval,\n    rest.syncConnectedChain,\n  ])\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useWriteContract.test-d.ts",
    "content": "import { createConfig, http, type WriteContractErrorType } from '@wagmi/core'\nimport { base } from '@wagmi/core/chains'\nimport { abi } from '@wagmi/test'\nimport type { Abi, Address, Hash } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useSimulateContract } from './useSimulateContract.js'\nimport { useWriteContract } from './useWriteContract.js'\n\nconst contextValue = { foo: 'bar' } as const\n\ntest('context', () => {\n  const writeContract = useWriteContract({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n          abi: Abi\n          functionName: string\n          args?: readonly unknown[] | undefined\n        }>()\n        return contextValue\n      },\n      onError(error, variables, context) {\n        expectTypeOf(error).toEqualTypeOf<WriteContractErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n          abi: Abi\n          functionName: string\n          args?: readonly unknown[] | undefined\n        }>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<Hash>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n          abi: Abi\n          functionName: string\n          args?: readonly unknown[] | undefined\n        }>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<Hash | undefined>()\n        expectTypeOf(error).toEqualTypeOf<WriteContractErrorType | null>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n          abi: Abi\n          functionName: string\n          args?: readonly unknown[] | undefined\n        }>()\n      },\n    },\n  })\n\n  expectTypeOf(writeContract.data).toEqualTypeOf<Hash | undefined>()\n  expectTypeOf(\n    writeContract.error,\n  ).toEqualTypeOf<WriteContractErrorType | null>()\n  expectTypeOf(writeContract.variables).toMatchTypeOf<\n    { chainId?: number | undefined } | undefined\n  >()\n  expectTypeOf(writeContract.context).toEqualTypeOf<\n    typeof contextValue | undefined\n  >()\n\n  writeContract.mutate(\n    {\n      address: '0x',\n      abi: abi.erc20,\n      functionName: 'transferFrom',\n      args: ['0x', '0x', 123n],\n      chainId: 1,\n    },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(error).toEqualTypeOf<WriteContractErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n          abi: typeof abi.erc20\n          functionName: 'transferFrom'\n          args: readonly [Address, Address, bigint]\n        }>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<Hash>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n\n        expectTypeOf(variables.functionName).toEqualTypeOf<'transferFrom'>()\n        expectTypeOf(variables.args).toEqualTypeOf<\n          readonly [Address, Address, bigint]\n        >()\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n          abi: typeof abi.erc20\n          functionName: 'transferFrom'\n          args: readonly [Address, Address, bigint]\n        }>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<Hash | undefined>()\n        expectTypeOf(error).toEqualTypeOf<WriteContractErrorType | null>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n          abi: typeof abi.erc20\n          functionName: 'transferFrom'\n          args: readonly [Address, Address, bigint]\n        }>()\n      },\n    },\n  )\n})\n\ntest('useSimulateContract', () => {\n  const { data } = useSimulateContract({\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    chainId: 1,\n  })\n  const { writeContract } = useWriteContract()\n\n  const request = data?.request\n  if (request) writeContract(request)\n})\n\n// https://github.com/wevm/wagmi/issues/3981\ntest('gh#3981', () => {\n  const config = createConfig({\n    chains: [base],\n    transports: {\n      [base.id]: http(),\n    },\n  })\n\n  const abi = [\n    {\n      type: 'function',\n      name: 'example1',\n      inputs: [\n        { name: 'exampleName', type: 'address', internalType: 'address' },\n      ],\n      outputs: [],\n      stateMutability: 'payable',\n    },\n    {\n      type: 'function',\n      name: 'example2',\n      inputs: [\n        { name: 'exampleName', type: 'address', internalType: 'address' },\n      ],\n      outputs: [],\n      stateMutability: 'nonpayable',\n    },\n  ] as const\n\n  const { writeContract } = useWriteContract({ config })\n  writeContract({\n    abi,\n    address: '0x...',\n    functionName: 'example1',\n    args: ['0x...'],\n    value: 123n,\n  })\n  writeContract({\n    abi,\n    address: '0x...',\n    functionName: 'example2',\n    args: ['0x...'],\n    // @ts-expect-error\n    value: 123n,\n  })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useWriteContract.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { abi, address, config } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { expect, test, vi } from 'vitest'\n\nimport { useWriteContract } from './useWriteContract.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const { result } = await renderHook(() => useWriteContract())\n\n  result.current.mutate({\n    abi: abi.wagmiMintExample,\n    address: address.wagmiMintExample,\n    functionName: 'mint',\n  })\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 10_000 })\n\n  expect(result.current.data).toBeDefined()\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useWriteContract.ts",
    "content": "'use client'\nimport { useMutation } from '@tanstack/react-query'\nimport type {\n  Config,\n  ResolvedRegister,\n  WriteContractErrorType,\n} from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type WriteContractData,\n  type WriteContractMutate,\n  type WriteContractMutateAsync,\n  type WriteContractOptions,\n  type WriteContractVariables,\n  writeContractMutationOptions,\n} from '@wagmi/core/query'\nimport type { Abi } from 'viem'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseWriteContractParameters<\n  config extends Config = Config,\n  context = unknown,\n> = ConfigParameter<config> & WriteContractOptions<config, context>\n\nexport type UseWriteContractReturnType<\n  config extends Config = Config,\n  context = unknown,\n> = UseMutationReturnType<\n  WriteContractData,\n  WriteContractErrorType,\n  WriteContractVariables<\n    Abi,\n    string,\n    readonly unknown[],\n    config,\n    config['chains'][number]['id']\n  >,\n  context,\n  WriteContractMutate<config, context>,\n  WriteContractMutateAsync<config, context>\n> & {\n  /** @deprecated use `mutate` instead */\n  writeContract: WriteContractMutate<config, context>\n  /** @deprecated use `mutateAsync` instead */\n  writeContractAsync: WriteContractMutateAsync<config, context>\n}\n\n/** https://wagmi.sh/react/api/hooks/useWriteContract */\nexport function useWriteContract<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: UseWriteContractParameters<config, context> = {},\n): UseWriteContractReturnType<config, context> {\n  const config = useConfig(parameters)\n  const options = writeContractMutationOptions(config, parameters)\n  const mutation = useMutation(options)\n  type Return = UseWriteContractReturnType<config, context>\n  return {\n    ...(mutation as Return),\n    writeContract: mutation.mutate as Return['mutate'],\n    writeContractAsync: mutation.mutateAsync as Return['mutateAsync'],\n  }\n}\n"
  },
  {
    "path": "packages/react/src/hooks/useWriteContractSync.test-d.ts",
    "content": "import type { WriteContractSyncErrorType } from '@wagmi/core'\nimport { abi } from '@wagmi/test'\nimport type { Abi, TransactionReceipt } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useWriteContractSync } from './useWriteContractSync.js'\n\nconst contextValue = { foo: 'bar' } as const\n\ntest('context', () => {\n  const writeContractSync = useWriteContractSync({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n          abi: Abi\n          functionName: string\n          args?: readonly unknown[] | undefined\n        }>()\n        return contextValue\n      },\n      onError(error, _variables, context) {\n        expectTypeOf(error).toEqualTypeOf<WriteContractSyncErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, _variables, context) {\n        expectTypeOf(data).toEqualTypeOf<TransactionReceipt>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, _variables, context) {\n        expectTypeOf(data).toEqualTypeOf<TransactionReceipt | undefined>()\n        expectTypeOf(error).toEqualTypeOf<WriteContractSyncErrorType | null>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  })\n\n  expectTypeOf(writeContractSync.data).toEqualTypeOf<\n    TransactionReceipt | undefined\n  >()\n  expectTypeOf(\n    writeContractSync.error,\n  ).toEqualTypeOf<WriteContractSyncErrorType | null>()\n  expectTypeOf(writeContractSync.context).toEqualTypeOf<\n    typeof contextValue | undefined\n  >()\n\n  writeContractSync.mutate({\n    address: '0x',\n    abi: abi.wagmiMintExample,\n    functionName: 'mint',\n    chainId: 1,\n  })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useWriteContractSync.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { abi, address, config, testClient, wait } from '@wagmi/test'\nimport { renderHook } from '@wagmi/test/react'\nimport { beforeEach, expect, test, vi } from 'vitest'\n\nimport { useWriteContractSync } from './useWriteContractSync.js'\n\nconst connector = config.connectors[0]!\n\nbeforeEach(async () => {\n  await disconnect(config).catch(() => {})\n})\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const { result } = await renderHook(() => useWriteContractSync())\n\n  result.current.mutate({\n    abi: abi.wagmiMintExample,\n    address: address.wagmiMintExample,\n    functionName: 'mint',\n  })\n  await wait(4_000)\n  await testClient.mainnet.mine({ blocks: 1 })\n  await vi.waitUntil(() => result.current.isSuccess, { timeout: 15_000 })\n\n  expect(result.current.data).toBeDefined()\n  expect(result.current.data?.status).toBe('success')\n  expect(result.current.data?.blockNumber).toBeDefined()\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/react/src/hooks/useWriteContractSync.ts",
    "content": "'use client'\nimport { useMutation } from '@tanstack/react-query'\nimport type {\n  Config,\n  ResolvedRegister,\n  WriteContractSyncErrorType,\n} from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type WriteContractSyncData,\n  type WriteContractSyncMutate,\n  type WriteContractSyncMutateAsync,\n  type WriteContractSyncOptions,\n  type WriteContractSyncVariables,\n  writeContractSyncMutationOptions,\n} from '@wagmi/core/query'\nimport type { Abi } from 'viem'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseWriteContractSyncParameters<\n  config extends Config = Config,\n  context = unknown,\n> = ConfigParameter<config> & WriteContractSyncOptions<config, context>\n\nexport type UseWriteContractSyncReturnType<\n  config extends Config = Config,\n  context = unknown,\n> = UseMutationReturnType<\n  WriteContractSyncData,\n  WriteContractSyncErrorType,\n  WriteContractSyncVariables<\n    Abi,\n    string,\n    readonly unknown[],\n    config,\n    config['chains'][number]['id']\n  >,\n  context,\n  WriteContractSyncMutate<config, context>,\n  WriteContractSyncMutateAsync<config, context>\n> & {\n  /** @deprecated use `mutate` instead */\n  writeContractSync: WriteContractSyncMutate<config, context>\n  /** @deprecated use `mutateAsync` instead */\n  writeContractSyncAsync: WriteContractSyncMutateAsync<config, context>\n}\n\n/** https://wagmi.sh/react/api/hooks/useWriteContractSync */\nexport function useWriteContractSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: UseWriteContractSyncParameters<config, context> = {},\n): UseWriteContractSyncReturnType<config, context> {\n  const config = useConfig(parameters)\n  const options = writeContractSyncMutationOptions(config, parameters)\n  const mutation = useMutation(options)\n  type Return = UseWriteContractSyncReturnType<config, context>\n  return {\n    ...(mutation as Return),\n    writeContractSync: mutation.mutate as Return['mutate'],\n    writeContractSyncAsync: mutation.mutateAsync as Return['mutateAsync'],\n  }\n}\n"
  },
  {
    "path": "packages/react/src/hydrate.ts",
    "content": "'use client'\n\nimport { hydrate, type ResolvedRegister, type State } from '@wagmi/core'\nimport { type ReactElement, useEffect, useRef } from 'react'\n\nexport type HydrateProps = {\n  config: ResolvedRegister['config']\n  initialState?: State | undefined\n  reconnectOnMount?: boolean | undefined\n}\n\nexport function Hydrate(parameters: React.PropsWithChildren<HydrateProps>) {\n  const { children, config, initialState, reconnectOnMount = true } = parameters\n\n  const { onMount } = hydrate(config, {\n    initialState,\n    reconnectOnMount,\n  })\n\n  // Hydrate for non-SSR\n  if (!config._internal.ssr) onMount()\n\n  // Hydrate for SSR\n  const active = useRef(true)\n  // biome-ignore lint/correctness/useExhaustiveDependencies: `queryKey` not required\n  useEffect(() => {\n    if (!active.current) return\n    if (!config._internal.ssr) return\n    onMount()\n    return () => {\n      active.current = false\n    }\n  }, [])\n\n  return children as ReactElement\n}\n"
  },
  {
    "path": "packages/react/src/tempo/AGENTS.md",
    "content": "# Agent Guidelines\n\nAgent guidance for `wagmi/tempo` Hooks.\n\n> **Communication Style**: Be brief, concise. Maximize information density, minimize tokens. Incomplete sentences acceptable when clear. Remove filler words. Prioritize clarity over grammar.\n\n## Wagmi Hooks\n\nWhen generating Wagmi hooks (in `hooks/`), follow these guidelines.\n\nAn example of a generated hook set can be found in `hooks/fee.ts`.\n\n### Source of Truth\n\n- **All hooks must be based on their corresponding Wagmi actions** from `@wagmi/core/tempo` (`packages/core/src/tempo/`)\n- Wagmi hooks are React hooks that wrap Wagmi actions with TanStack Query's `useQuery` and `useMutation`\n- If the Wagmi action is unclear or missing, implement the Wagmi action first\n\n### Documentation Requirements\n\nAll hooks **must include comprehensive TSDoc** with:\n\n1. **Function description** - What the hook does\n2. **`@example` block** - Complete working example showing:\n   - Required imports (hook imports)\n   - React component usage\n   - Hook usage with realistic parameters\n   - Expected return value handling (if applicable)\n3. **@param parameters** - Parameters description\n4. **`@returns` tag** - Description of the return value\n\nExample:\n\n```typescript\n/**\n * Hook for getting the user's default fee token.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { data, isLoading } = Hooks.fee.useUserToken({\n *     account: '0x20c...0055',\n *   })\n *   if (isLoading) return <div>Loading...</div>\n *   return <div>Token: {data?.address}</div>\n * }\n * ```\n * \n * @param parameters - Parameters.\n * @returns Query result with token address and ID.\n */\n```\n\n### Query Hooks\n\nFor read-only hooks that fetch data:\n\n- Use `useQuery` from `../../utils/query.js`\n- Use `useConfig` and `useChainId` from `../../hooks/(useChainId|useConfig).js`\n- Call the corresponding action's `queryOptions` function\n- All parameters should be optional. Use `ExactPartial` to make all query parameters optional\n- Support optional `query` parameter for TanStack Query options\n- Default `parameters` to `{}` only if all parameters are truly optional (no required non-reactive parameters like `token`, `role`, etc.)\n\n```typescript\nexport function useMyAction<\n  config extends Config = ResolvedRegister['config'],\n  selectData = myAction.ReturnValue,\n>(parameters: useMyAction.Parameters<config, selectData> = {}): useMyAction.ReturnValue<config, selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = myAction.queryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  } as never)\n  return useQuery(options)\n}\n```\n\n### Mutation Hooks\n\nFor state-changing hooks, both variants must be implemented:\n\n**1. Standard Variant**\n\n```typescript\nexport function useMyAction<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useMyAction.Parameters<config, context> = {},\n): useMyAction.ReturnValue<config, context> {\n  const { mutation = {} } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return myAction(config, variables)\n    },\n    mutationKey: ['myAction'],\n  })\n}\n```\n\n**2. Sync Variant (`use*Sync`)**\n\n```typescript\nexport function useMyActionSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useMyActionSync.Parameters<config, context> = {},\n): useMyActionSync.ReturnValue<config, context> {\n  const { mutation = {} } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return myActionSync(config, variables)\n    },\n    mutationKey: ['myActionSync'],\n  })\n}\n```\n\n### Watch Hooks\n\nFor event watching hooks:\n\n- Call the corresponding action's watch function inside `useEffect`\n- All parameters should be optional using `ExactPartial`\n- Include an `enabled` parameter (defaults to `true`) to control whether the watcher is active\n- Check if all required properties (like the callback) are defined before setting up the watcher\n- Include all optional properties for `rest` in the dependency array (e.g. `rest.foo`, `rest.bar`, `rest.baz`)\n- Return the unwatch function from the `useEffect` for cleanup\n\nAll watch hooks must include comprehensive JSDoc with:\n1. **Function description** - What events the hook watches for\n2. **`@example` block** - Complete working example showing hook usage in a React component\n3. **`@param` tag** - Parameters description\n\n```typescript\n/**\n * Hook for watching TIP20 token mint events.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   Hooks.token.useWatchMint({\n *     onMint(args) {\n *       console.log('Mint:', args)\n *     },\n *   })\n *   return <div>Watching for mints...</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n */\nexport function useWatchMyEvent<\n  config extends Config = ResolvedRegister['config'],\n>(parameters: useWatchMyEvent.Parameters<config> = {}) {\n  const { enabled = true, onMyEvent, ...rest } = parameters\n\n  const config = useConfig({ config: parameters.config })\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  useEffect(() => {\n    if (!enabled) return\n    if (!onMyEvent) return\n    return Actions.watchMyEvent(config, {\n      ...rest,\n      chainId,\n      onMyEvent,\n    })\n  }, [config, enabled, onMyEvent, rest.foo, rest.bar, rest.baz])\n}\n\nexport declare namespace useWatchMyEvent {\n  type Parameters<config extends Config = Config> = UnionCompute<\n    ExactPartial<Actions.watchMyEvent.Parameters<config>> &\n      ConfigParameter<config> & { enabled?: boolean | undefined }\n  >\n}\n```\n\n### Namespace Properties\n\n#### Query Hooks\n\nAll query hooks must include the following components:\n\n```typescript\nexport function useMyAction<\n  config extends Config = ResolvedRegister['config'],\n  selectData = myAction.ReturnValue,\n>(parameters: useMyAction.Parameters<config, selectData> = {}): useMyAction.ReturnValue<selectData> { ... }\n\nexport declare namespace useMyAction {\n  export type Parameters<\n    config extends Config = ResolvedRegister['config'],\n    selectData = myAction.ReturnValue,\n  > = ConfigParameter<config> &\n    QueryParameter<\n      myAction.ReturnValue,\n      myAction.ErrorType,\n      selectData,\n      myAction.QueryKey<config>\n    > &\n    ExactPartial<myAction.Parameters<config>>\n\n  export type ReturnValue<selectData = myAction.ReturnValue> =\n    UseQueryReturnType<selectData, Error>\n}\n```\n\n**Note:** Use `ExactPartial<T>` to make all query parameters optional. This ensures that reactive parameters can be undefined initially and populated later for proper reactivity.\n\n#### Watch Hooks\n\nAll watch hooks must include the following components:\n\n```typescript\nexport function useWatchMyEvent<\n  config extends Config = ResolvedRegister['config'],\n>(parameters: useWatchMyEvent.Parameters<config> = {}) { ... }\n\nexport declare namespace useWatchMyEvent {\n  type Parameters<config extends Config = Config> = UnionCompute<\n    ExactPartial<Actions.watchMyEvent.Parameters<config>> &\n      ConfigParameter<config> & { enabled?: boolean | undefined }\n  >\n}\n```\n\n**Note:** Watch hooks don't have a return value - they set up event listeners in a `useEffect` and automatically clean up when the component unmounts or dependencies change.\n\n#### Mutation Hooks\n\nAll mutation hooks must include the following components:\n\n```typescript\nexport function useMyAction<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useMyAction.Parameters<config, context> = {},\n): useMyAction.ReturnValue<config, context> { ... }\n\nexport declare namespace useMyAction {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          myAction.ReturnValue,\n          myAction.ErrorType,\n          myAction.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnValue<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    myAction.ReturnValue,\n    myAction.ErrorType,\n    myAction.Parameters<config>,\n    context\n  >\n}\n\nexport declare namespace useMyActionSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          myActionSync.ReturnValue,\n          myActionSync.ErrorType,\n          myActionSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnValue<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    myActionSync.ReturnValue,\n    myActionSync.ErrorType,\n    myActionSync.Parameters<config>,\n    context\n  >\n}\n```\n\n### Testing\n\nTests should be co-located with hooks in `myNamespace.test.ts` files.\n\n**Important**: Wagmi hook tests should follow the same test flows as the corresponding Wagmi action tests in `@wagmi/core/tempo`. This includes:\n- Setting up the same initial state (creating tokens, granting roles, minting tokens, etc.)\n- Testing the same behaviors and edge cases\n- Using the same test data and assertions where applicable\n\nThe main difference is that hooks use React rendering patterns with `renderHook`, and mutation hooks don't require explicit `account` parameters in `mutateAsync` calls since they use the connector's account.\n\nSee `hooks/fee.test.ts` for a comprehensive example of test patterns and structure.\n\n#### Test Structure\n\nOrganize tests by hook name with a default test case. Use namespace imports for cleaner code when importing hooks:\n\n```typescript\nimport { type Address } from 'viem'\nimport { describe, expect, test, vi } from 'vitest'\nimport { useConnect } from 'wagmi'\nimport { accounts, config, renderHook } from '@wagmi/test/tempo'\nimport * as myNamespace from './myNamespace.js'\n\n// Query hooks\ndescribe('useMyAction', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() =>\n      myNamespace.useMyAction({ account: account.address }),\n    )\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    expect(result.current.data).toBeDefined()\n    // Additional assertions...\n  })\n\n  test('reactivity: account parameter', async () => {\n    const { result, rerender } = await renderHook(\n      (props) =>\n        myNamespace.useMyAction({ account: props?.account }),\n      { initialProps: { account: undefined as Address | undefined } },\n    )\n\n    await vi.waitFor(() => result.current.fetchStatus === 'fetching')\n\n    // Should be disabled when account is undefined\n    expect(result.current.data).toBeUndefined()\n    expect(result.current.isPending).toBe(true)\n    // expect(result.current.isEnabled).toBe(false) // TODO: Disabled until @tanstack/react-query bumped to latest\n\n    // Set account\n    rerender({ account: account.address })\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    // Should now be enabled and have data\n    expect(result.current.isEnabled).toBe(true)\n    expect(result.current.data).toBeDefined()\n    // Additional assertions...\n  })\n})\n\n// Mutation hooks\ndescribe('useMyAction', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      myAction: myNamespace.useMyAction(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Include any necessary setup from the corresponding Wagmi action test\n    // e.g., create tokens, grant roles, etc. using the action's mutateAsync\n\n    const hash = await result.current.myAction.mutateAsync({\n      // ... mutation parameters (no account parameter needed)\n    })\n    expect(hash).toBeDefined()\n\n    await vi.waitFor(() =>\n      expect(result.current.myAction.isSuccess).toBeTruthy(),\n    )\n  })\n})\n\ndescribe('useMyActionSync', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      myAction: myNamespace.useMyActionSync(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Include any necessary setup from the corresponding Wagmi action test\n\n    const data = await result.current.myAction.mutateAsync({\n      // ... mutation parameters (no account parameter needed)\n    })\n    expect(data).toBeDefined()\n\n    await vi.waitFor(() =>\n      expect(result.current.myAction.isSuccess).toBeTruthy(),\n    )\n  })\n})\n\n// Watch hooks\ndescribe('useWatchMyEvent', () => {\n  test('default', async () => {\n    const { result: connectResult } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: myNamespace.useCreateSync(),\n      // ... any other setup hooks needed\n    }))\n\n    await connectResult.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Include any necessary setup (e.g., create token, grant roles)\n\n    const events: any[] = []\n    await renderHook(() =>\n      myNamespace.useWatchMyEvent({\n        // ... parameters\n        onMyEvent(args) {\n          events.push(args)\n        },\n      }),\n    )\n\n    // Trigger the event by calling a sync action\n    // e.g., await connectResult.current.myActionSync.mutateAsync({ ... })\n\n    await vi.waitUntil(() => events.length >= 1)\n\n    expect(events.length).toBeGreaterThanOrEqual(1)\n    expect(events[0]?.someField).toBe(expectedValue)\n  })\n})\n```\n"
  },
  {
    "path": "packages/react/src/tempo/Connectors.test.ts",
    "content": "import { KeyManager, webAuthn } from '@wagmi/core/tempo'\nimport { renderHook } from '@wagmi/test/tempo'\nimport { describe, expect, test, vi } from 'vitest'\nimport { cdp } from 'vitest/browser'\nimport { useConnect, useConnection, useDisconnect } from 'wagmi'\n\nasync function setupWebAuthn() {\n  const client = cdp()\n  await client.send('WebAuthn.enable')\n  const result = await client.send('WebAuthn.addVirtualAuthenticator', {\n    options: {\n      protocol: 'ctap2',\n      transport: 'internal',\n      hasResidentKey: true,\n      hasUserVerification: true,\n      isUserVerified: true,\n      automaticPresenceSimulation: true,\n    },\n  })\n  return async () => {\n    const client = cdp()\n    await client.send('WebAuthn.removeVirtualAuthenticator', {\n      authenticatorId: result.authenticatorId,\n    })\n    await client.send('WebAuthn.disable')\n  }\n}\n\ntest('connect', async (context) => {\n  const cleanup = await setupWebAuthn()\n  context.onTestFinished(async () => await cleanup())\n\n  const { result } = await renderHook(() => ({\n    useConnection: useConnection(),\n    useConnect: useConnect(),\n  }))\n\n  expect(result.current.useConnection.address).not.toBeDefined()\n  expect(result.current.useConnection.status).toEqual('disconnected')\n\n  result.current.useConnect.mutate({\n    capabilities: { type: 'sign-up', label: 'Test Account' },\n    connector: webAuthn({\n      keyManager: KeyManager.localStorage(),\n    }),\n  })\n\n  await vi.waitFor(() =>\n    expect(result.current.useConnection.isConnected).toBeTruthy(),\n  )\n\n  expect(result.current.useConnection.address).toBeDefined()\n  expect(result.current.useConnection.address).toMatch(/^0x[a-fA-F0-9]{40}$/)\n  expect(result.current.useConnection.status).toEqual('connected')\n})\n\ndescribe('capabilities.sign', () => {\n  test('sign-up + sign (create path)', async (context) => {\n    const cleanup = await setupWebAuthn()\n    context.onTestFinished(async () => await cleanup())\n\n    const connector = webAuthn({\n      keyManager: KeyManager.localStorage(),\n    })\n\n    const { result } = await renderHook(() => ({\n      useConnection: useConnection(),\n      useConnect: useConnect(),\n    }))\n\n    const hash =\n      '0x0000000000000000000000000000000000000000000000000000000000000001'\n    const connectResult = await result.current.useConnect.mutateAsync({\n      capabilities: { type: 'sign-up', label: 'Create+Sign', sign: { hash } },\n      connector,\n      withCapabilities: true,\n    })\n\n    await vi.waitFor(() =>\n      expect(result.current.useConnection.isConnected).toBeTruthy(),\n    )\n    expect(result.current.useConnection.address).toBeDefined()\n    expect(result.current.useConnection.address).toMatch(/^0x[a-fA-F0-9]{40}$/)\n\n    expect(connectResult.accounts[0]?.capabilities.signature).toBeDefined()\n    expect(connectResult.accounts[0]?.capabilities.signature).toMatch(/^0x/)\n  })\n\n  test('discover path: disconnect then reconnect with sign', async (context) => {\n    const cleanup = await setupWebAuthn()\n    context.onTestFinished(async () => await cleanup())\n\n    const connector = webAuthn({\n      keyManager: KeyManager.localStorage(),\n    })\n\n    const { result } = await renderHook(() => ({\n      useConnection: useConnection(),\n      useConnect: useConnect(),\n      useDisconnect: useDisconnect(),\n    }))\n\n    await result.current.useConnect.mutateAsync({\n      capabilities: { type: 'sign-up', label: 'Discover Test' },\n      connector,\n    })\n    await vi.waitFor(() =>\n      expect(result.current.useConnection.isConnected).toBeTruthy(),\n    )\n    const address = result.current.useConnection.address\n    expect(address).toBeDefined()\n\n    await result.current.useDisconnect.mutateAsync({})\n    await vi.waitFor(() =>\n      expect(result.current.useConnection.isConnected).toBeFalsy(),\n    )\n\n    const hash =\n      '0x0000000000000000000000000000000000000000000000000000000000000001'\n    const connectResult = await result.current.useConnect.mutateAsync({\n      capabilities: {\n        sign: { hash },\n      },\n      connector,\n      withCapabilities: true,\n    })\n\n    await vi.waitFor(() =>\n      expect(result.current.useConnection.isConnected).toBeTruthy(),\n    )\n    expect(result.current.useConnection.address).toBeDefined()\n    expect(result.current.useConnection.address).toMatch(/^0x[a-fA-F0-9]{40}$/)\n\n    expect(connectResult.accounts[0]?.capabilities.signature).toBeDefined()\n    expect(connectResult.accounts[0]?.capabilities.signature).toMatch(/^0x/)\n  })\n\n  test('sign skips access key provisioning (with grantAccessKey)', async (context) => {\n    const cleanup = await setupWebAuthn()\n    context.onTestFinished(async () => await cleanup())\n\n    const connector = webAuthn({\n      grantAccessKey: true,\n      keyManager: KeyManager.localStorage(),\n    })\n\n    const { result } = await renderHook(() => ({\n      useConnection: useConnection(),\n      useConnect: useConnect(),\n      useDisconnect: useDisconnect(),\n    }))\n\n    await result.current.useConnect.mutateAsync({\n      capabilities: { type: 'sign-up', label: 'Grant Test' },\n      connector,\n    })\n    await vi.waitFor(() =>\n      expect(result.current.useConnection.isConnected).toBeTruthy(),\n    )\n\n    await result.current.useDisconnect.mutateAsync({})\n    await vi.waitFor(() =>\n      expect(result.current.useConnection.isConnected).toBeFalsy(),\n    )\n\n    const hash =\n      '0x0000000000000000000000000000000000000000000000000000000000000002'\n    const connectResult = await result.current.useConnect.mutateAsync({\n      capabilities: {\n        sign: { hash },\n      },\n      connector,\n      withCapabilities: true,\n    })\n\n    await vi.waitFor(() =>\n      expect(result.current.useConnection.isConnected).toBeTruthy(),\n    )\n    expect(result.current.useConnection.address).toBeDefined()\n\n    expect(connectResult.accounts[0]?.capabilities.signature).toBeDefined()\n    expect(connectResult.accounts[0]?.capabilities.signature).toMatch(/^0x/)\n  })\n})\n"
  },
  {
    "path": "packages/react/src/tempo/hooks/amm.test.ts",
    "content": "import { accounts, addresses, config, renderHook } from '@wagmi/test/tempo'\nimport { type Address, parseUnits } from 'viem'\nimport { describe, expect, test, vi } from 'vitest'\n\nimport { useConnect } from '../../hooks/useConnect.js'\nimport * as hooks from './amm.js'\nimport * as tokenHooks from './token.js'\n\nconst account = accounts[0]\n\ndescribe('usePool', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() =>\n      hooks.usePool({\n        userToken: addresses.alphaUsd,\n        validatorToken: '0x20c0000000000000000000000000000000000001',\n      }),\n    )\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy(), {\n      timeout: 10_000,\n    })\n\n    expect(result.current.data).toMatchInlineSnapshot(`\n      {\n        \"reserveUserToken\": 0n,\n        \"reserveValidatorToken\": 0n,\n        \"totalSupply\": 0n,\n      }\n    `)\n  })\n\n  test('reactivity: token parameters', async () => {\n    const { result, rerender } = await renderHook(\n      (props) =>\n        hooks.usePool({\n          userToken: props?.userToken,\n          validatorToken: props?.validatorToken,\n        }),\n      {\n        initialProps: {\n          userToken: undefined as Address | undefined,\n          validatorToken: undefined as Address | undefined,\n        },\n      },\n    )\n\n    await vi.waitFor(() => expect(result.current.fetchStatus).toBe('idle'))\n\n    // Should be disabled when tokens are undefined\n    expect(result.current.data).toBeUndefined()\n    expect(result.current.isPending).toBe(true)\n    // expect(result.current.isEnabled).toBe(false)\n\n    // Set tokens\n    rerender({\n      userToken: addresses.alphaUsd,\n      validatorToken: '0x20c0000000000000000000000000000000000001',\n    })\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    // Should now be enabled and have data\n    // expect(result.current.isEnabled).toBe(true)\n    expect(result.current.data).toBeDefined()\n  })\n})\n\ndescribe('useLiquidityBalance', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() =>\n      hooks.useLiquidityBalance({\n        address: account.address,\n        userToken: addresses.alphaUsd,\n        validatorToken: '0x20c0000000000000000000000000000000000001',\n      }),\n    )\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy(), {\n      timeout: 10_000,\n    })\n\n    expect(result.current.data).toMatchInlineSnapshot('0n')\n  })\n\n  test('reactivity: poolId and address parameters', async () => {\n    const { result, rerender } = await renderHook(\n      (props) =>\n        hooks.useLiquidityBalance({\n          userToken: props?.userToken,\n          validatorToken: props?.validatorToken,\n          address: props?.address,\n        }),\n      {\n        initialProps: {\n          userToken: undefined as Address | undefined,\n          validatorToken: undefined as Address | undefined,\n          address: undefined as Address | undefined,\n        },\n      },\n    )\n\n    await vi.waitFor(() => expect(result.current.fetchStatus).toBe('idle'))\n\n    // Should be disabled when parameters are undefined\n    expect(result.current.data).toBeUndefined()\n    expect(result.current.isPending).toBe(true)\n    // expect(result.current.isEnabled).toBe(false)\n\n    // Set parameters\n    rerender({\n      userToken: addresses.alphaUsd,\n      validatorToken: '0x20c0000000000000000000000000000000000001',\n      address: account.address,\n    })\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    // Should now be enabled and have data\n    // expect(result.current.isEnabled).toBe(true)\n    expect(result.current.data).toBeDefined()\n  })\n})\n\ndescribe('useMintSync', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: tokenHooks.useCreateSync(),\n      grantRolesSync: tokenHooks.useGrantRolesSync(),\n      mintTokenSync: tokenHooks.useMintSync(),\n      mintSync: hooks.useMintSync(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token for testing\n    const { token } = await result.current.createSync.mutateAsync({\n      name: 'Test Token',\n      symbol: 'TEST',\n      currency: 'USD',\n    })\n\n    // Grant issuer role to mint tokens\n    await result.current.grantRolesSync.mutateAsync({\n      token,\n      roles: ['issuer'],\n      to: account.address,\n    })\n\n    // Mint some tokens to account\n    await result.current.mintTokenSync.mutateAsync({\n      to: account.address,\n      amount: parseUnits('1000', 6),\n      token,\n    })\n\n    // Add liquidity to pool\n    const data = await result.current.mintSync.mutateAsync({\n      userTokenAddress: token,\n      validatorTokenAddress: addresses.alphaUsd,\n      validatorTokenAmount: parseUnits('100', 6),\n      to: account.address,\n    })\n\n    await vi.waitFor(() =>\n      expect(result.current.mintSync.isSuccess).toBeTruthy(),\n    )\n\n    expect(data.receipt).toBeDefined()\n    expect(data.amountValidatorToken).toBe(parseUnits('100', 6))\n  })\n})\n\ndescribe.skip('useBurnSync', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: tokenHooks.useCreateSync(),\n      grantRolesSync: tokenHooks.useGrantRolesSync(),\n      mintTokenSync: tokenHooks.useMintSync(),\n      mintSync: hooks.useMintSync(),\n      burnSync: hooks.useBurnSync(),\n      transferSync: tokenHooks.useTransferSync(),\n      getLiquidityBalance: hooks.useLiquidityBalance,\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token for testing\n    const { token } = await result.current.createSync.mutateAsync({\n      name: 'Test Token 5',\n      symbol: 'TEST5',\n      currency: 'USD',\n    })\n\n    // Grant issuer role to mint tokens\n    await result.current.grantRolesSync.mutateAsync({\n      token,\n      roles: ['issuer'],\n      to: account.address,\n    })\n\n    // Mint some tokens to account\n    await result.current.mintTokenSync.mutateAsync({\n      to: account.address,\n      amount: parseUnits('1000', 6),\n      token,\n    })\n\n    // Add liquidity to pool\n    await result.current.mintSync.mutateAsync({\n      userTokenAddress: token,\n      validatorTokenAddress: addresses.alphaUsd,\n      validatorTokenAmount: parseUnits('100', 6),\n      to: account.address,\n    })\n\n    // TODO(TEMPO-1183): Remove this janky fix to get some user token in the pool\n    await result.current.transferSync.mutateAsync({\n      to: '0x30D861999070Ae03B9548501DBd573E11A9f59Ee',\n      amount: 600n,\n      token: token,\n      feeToken: token,\n    })\n\n    // Get LP balance before burn\n    const { result: balanceResult } = await renderHook(() =>\n      result.current.getLiquidityBalance({\n        userToken: token,\n        validatorToken: addresses.alphaUsd,\n        address: account.address,\n      }),\n    )\n\n    await vi.waitFor(() => expect(balanceResult.current.isSuccess).toBeTruthy())\n\n    const lpBalanceBefore = balanceResult.current.data!\n\n    // Burn half of LP tokens\n    const data = await result.current.burnSync.mutateAsync({\n      userToken: token,\n      validatorToken: addresses.alphaUsd,\n      liquidity: lpBalanceBefore / 2n,\n      to: account.address,\n    })\n\n    await vi.waitFor(() =>\n      expect(result.current.burnSync.isSuccess).toBeTruthy(),\n    )\n\n    expect(data.receipt).toBeDefined()\n    expect(data.liquidity).toBe(lpBalanceBefore / 2n)\n  })\n})\n\ndescribe.skip('useRebalanceSwapSync', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: tokenHooks.useCreateSync(),\n      grantRolesSync: tokenHooks.useGrantRolesSync(),\n      mintTokenSync: tokenHooks.useMintSync(),\n      mintSync: hooks.useMintSync(),\n      transferSync: tokenHooks.useTransferSync(),\n      rebalanceSwapSync: hooks.useRebalanceSwapSync(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token for testing\n    const { token } = await result.current.createSync.mutateAsync({\n      name: 'Test Token 6',\n      symbol: 'TEST6',\n      currency: 'USD',\n    })\n\n    // Grant issuer role to mint tokens\n    await result.current.grantRolesSync.mutateAsync({\n      token,\n      roles: ['issuer'],\n      to: account.address,\n    })\n\n    // Mint some tokens to account\n    await result.current.mintTokenSync.mutateAsync({\n      to: account.address,\n      amount: parseUnits('1000', 6),\n      token,\n    })\n\n    // Add liquidity to pool\n    await result.current.mintSync.mutateAsync({\n      userTokenAddress: token,\n      validatorTokenAddress: addresses.alphaUsd,\n      validatorTokenAmount: parseUnits('100', 6),\n      to: account.address,\n    })\n\n    // TODO(TEMPO-1183): Remove this janky fix to get some user token in the pool\n    await result.current.transferSync.mutateAsync({\n      to: '0x30D861999070Ae03B9548501DBd573E11A9f59Ee',\n      amount: 600n,\n      token: token,\n      feeToken: token,\n    })\n\n    const account2 = accounts[1]\n\n    // Perform rebalance swap\n    const data = await result.current.rebalanceSwapSync.mutateAsync({\n      userToken: token,\n      validatorToken: addresses.alphaUsd,\n      amountOut: 100n,\n      to: account2.address,\n    })\n\n    await vi.waitFor(() =>\n      expect(result.current.rebalanceSwapSync.isSuccess).toBeTruthy(),\n    )\n\n    expect(data.receipt).toBeDefined()\n    expect(data.amountOut).toBe(100n)\n    expect(data.swapper).toBe(account.address)\n  })\n})\n\ndescribe.skip('useWatchRebalanceSwap', () => {\n  test('default', async () => {\n    const { result: connectResult } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: tokenHooks.useCreateSync(),\n      grantRolesSync: tokenHooks.useGrantRolesSync(),\n      mintTokenSync: tokenHooks.useMintSync(),\n      mintSync: hooks.useMintSync(),\n      transferSync: tokenHooks.useTransferSync(),\n      rebalanceSwapSync: hooks.useRebalanceSwapSync(),\n    }))\n\n    await connectResult.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token for testing\n    const { token } = await connectResult.current.createSync.mutateAsync({\n      name: 'Test Token 3',\n      symbol: 'TEST3',\n      currency: 'USD',\n    })\n\n    // Grant issuer role to mint tokens\n    await connectResult.current.grantRolesSync.mutateAsync({\n      token,\n      roles: ['issuer'],\n      to: account.address,\n    })\n\n    // Mint some tokens to account\n    await connectResult.current.mintTokenSync.mutateAsync({\n      to: account.address,\n      amount: parseUnits('1000', 6),\n      token,\n    })\n\n    // Add liquidity to pool\n    await connectResult.current.mintSync.mutateAsync({\n      userTokenAddress: token,\n      validatorTokenAddress: addresses.alphaUsd,\n      validatorTokenAmount: parseUnits('100', 6),\n      to: account.address,\n    })\n\n    // TODO(TEMPO-1183): Remove this janky fix to get some user token in the pool\n    await connectResult.current.transferSync.mutateAsync({\n      to: '0x30D861999070Ae03B9548501DBd573E11A9f59Ee',\n      amount: 600n,\n      token: token,\n      feeToken: token,\n    })\n\n    const events: any[] = []\n    await renderHook(() =>\n      hooks.useWatchRebalanceSwap({\n        onRebalanceSwap(args) {\n          events.push(args)\n        },\n      }),\n    )\n\n    const account2 = accounts[1]\n\n    // Perform rebalance swap\n    await connectResult.current.rebalanceSwapSync.mutateAsync({\n      userToken: token,\n      validatorToken: addresses.alphaUsd,\n      amountOut: 100n,\n      to: account2.address,\n    })\n\n    await vi.waitUntil(() => events.length >= 1)\n\n    expect(events.length).toBeGreaterThanOrEqual(1)\n    expect(events[0]?.userToken.toLowerCase()).toBe(token.toLowerCase())\n    expect(events[0]?.validatorToken.toLowerCase()).toBe(\n      addresses.alphaUsd.toLowerCase(),\n    )\n    expect(events[0]?.amountOut).toBe(100n)\n  })\n})\n\ndescribe('useWatchMint', () => {\n  test('default', async () => {\n    const { result: connectResult } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: tokenHooks.useCreateSync(),\n      grantRolesSync: tokenHooks.useGrantRolesSync(),\n      mintTokenSync: tokenHooks.useMintSync(),\n      mintSync: hooks.useMintSync(),\n    }))\n\n    await connectResult.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token for testing\n    const { token } = await connectResult.current.createSync.mutateAsync({\n      name: 'Test Token 2',\n      symbol: 'TEST2',\n      currency: 'USD',\n    })\n\n    // Grant issuer role to mint tokens\n    await connectResult.current.grantRolesSync.mutateAsync({\n      token,\n      roles: ['issuer'],\n      to: account.address,\n    })\n\n    // Mint some tokens to account\n    await connectResult.current.mintTokenSync.mutateAsync({\n      to: account.address,\n      amount: parseUnits('1000', 6),\n      token,\n    })\n\n    const events: any[] = []\n    await renderHook(() =>\n      hooks.useWatchMint({\n        onMint(args) {\n          events.push(args)\n        },\n      }),\n    )\n\n    // Add liquidity to pool\n    await connectResult.current.mintSync.mutateAsync({\n      userTokenAddress: token,\n      validatorTokenAddress: addresses.alphaUsd,\n      validatorTokenAmount: parseUnits('100', 6),\n      to: account.address,\n    })\n\n    await vi.waitUntil(() => events.length >= 1)\n\n    expect(events.length).toBeGreaterThanOrEqual(1)\n    expect(events[0]?.userToken.toLowerCase()).toBe(token.toLowerCase())\n    expect(events[0]?.validatorToken.toLowerCase()).toBe(\n      addresses.alphaUsd.toLowerCase(),\n    )\n    expect(events[0]?.amountValidatorToken).toBe(parseUnits('100', 6))\n  })\n})\n\ndescribe.skip('useWatchBurn', () => {\n  test('default', async () => {\n    const { result: connectResult } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: tokenHooks.useCreateSync(),\n      grantRolesSync: tokenHooks.useGrantRolesSync(),\n      mintTokenSync: tokenHooks.useMintSync(),\n      mintSync: hooks.useMintSync(),\n      burnSync: hooks.useBurnSync(),\n      transferSync: tokenHooks.useTransferSync(),\n      getLiquidityBalance: hooks.useLiquidityBalance,\n    }))\n\n    await connectResult.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token for testing\n    const { token } = await connectResult.current.createSync.mutateAsync({\n      name: 'Test Token 4',\n      symbol: 'TEST4',\n      currency: 'USD',\n    })\n\n    // Grant issuer role to mint tokens\n    await connectResult.current.grantRolesSync.mutateAsync({\n      token,\n      roles: ['issuer'],\n      to: account.address,\n    })\n\n    // Mint some tokens to account\n    await connectResult.current.mintTokenSync.mutateAsync({\n      to: account.address,\n      amount: parseUnits('1000', 6),\n      token,\n    })\n\n    // Add liquidity to pool\n    await connectResult.current.mintSync.mutateAsync({\n      userTokenAddress: token,\n      validatorTokenAddress: addresses.alphaUsd,\n      validatorTokenAmount: parseUnits('100', 6),\n      to: account.address,\n    })\n\n    // TODO(TEMPO-1183): Remove this janky fix to get some user token in the pool\n    await connectResult.current.transferSync.mutateAsync({\n      to: '0x30D861999070Ae03B9548501DBd573E11A9f59Ee',\n      amount: 600n,\n      token: token,\n      feeToken: token,\n    })\n\n    // Get LP balance\n    const { result: balanceResult } = await renderHook(() =>\n      connectResult.current.getLiquidityBalance({\n        userToken: token,\n        validatorToken: addresses.alphaUsd,\n        address: account.address,\n      }),\n    )\n\n    await vi.waitFor(() => expect(balanceResult.current.isSuccess).toBeTruthy())\n\n    const lpBalance = balanceResult.current.data!\n\n    const events: any[] = []\n    await renderHook(() =>\n      hooks.useWatchBurn({\n        onBurn(args) {\n          events.push(args)\n        },\n      }),\n    )\n\n    // Burn LP tokens\n    await connectResult.current.burnSync.mutateAsync({\n      userToken: token,\n      validatorToken: addresses.alphaUsd,\n      liquidity: lpBalance / 2n,\n      to: account.address,\n    })\n\n    await vi.waitUntil(() => events.length >= 1)\n\n    expect(events.length).toBeGreaterThanOrEqual(1)\n    expect(events[0]?.userToken.toLowerCase()).toBe(token.toLowerCase())\n    expect(events[0]?.validatorToken.toLowerCase()).toBe(\n      addresses.alphaUsd.toLowerCase(),\n    )\n    expect(events[0]?.liquidity).toBe(lpBalance / 2n)\n  })\n})\n"
  },
  {
    "path": "packages/react/src/tempo/hooks/amm.ts",
    "content": "import type { UseMutationResult } from '@tanstack/react-query'\nimport type { Config, ResolvedRegister } from '@wagmi/core'\nimport type {\n  ConfigParameter,\n  ExactPartial,\n  UnionCompute,\n} from '@wagmi/core/internal'\nimport { Actions } from '@wagmi/core/tempo'\nimport { useEffect } from 'react'\nimport { useChainId } from '../../hooks/useChainId.js'\nimport { useConfig } from '../../hooks/useConfig.js'\nimport {\n  type UseMutationParameters,\n  type UseQueryReturnType,\n  useMutation,\n  useQuery,\n} from '../../utils/query.js'\nimport type { QueryParameter } from '../utils.js'\n\n/**\n * Hook for getting the reserves for a liquidity pool.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { data, isLoading } = Hooks.amm.usePool({\n *     userToken: '0x...',\n *     validatorToken: '0x...',\n *   })\n *\n *   if (isLoading) return <div>Loading...</div>\n *   return (\n *     <div>\n *       User Token Reserve: {data?.reserveUserToken.toString()}\n *       Validator Token Reserve: {data?.reserveValidatorToken.toString()}\n *     </div>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Query result with the pool reserves.\n */\nexport function usePool<\n  config extends Config = ResolvedRegister['config'],\n  selectData = Actions.amm.getPool.ReturnValue,\n>(\n  parameters: usePool.Parameters<config, selectData> = {},\n): usePool.ReturnValue<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = Actions.amm.getPool.queryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  } as never)\n  return useQuery(options) as never\n}\n\nexport declare namespace usePool {\n  export type Parameters<\n    config extends Config = ResolvedRegister['config'],\n    selectData = Actions.amm.getPool.ReturnValue,\n  > = ConfigParameter<config> &\n    QueryParameter<\n      Actions.amm.getPool.ReturnValue,\n      Actions.amm.getPool.ErrorType,\n      selectData,\n      Actions.amm.getPool.QueryKey<config>\n    > &\n    ExactPartial<Actions.amm.getPool.Parameters<config>>\n\n  export type ReturnValue<selectData = Actions.amm.getPool.ReturnValue> =\n    UseQueryReturnType<selectData, Error>\n}\n\n/**\n * Hook for getting the LP token balance for an account in a specific pool.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { data: poolId } = Hooks.amm.usePoolId({\n *     userToken: '0x...',\n *     validatorToken: '0x...',\n *   })\n *\n *   const { data, isLoading } = Hooks.amm.useLiquidityBalance({\n *     poolId,\n *     address: '0x20c...0055',\n *   })\n *\n *   if (isLoading) return <div>Loading...</div>\n *   return <div>LP Balance: {data?.toString()}</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Query result with the LP token balance.\n */\nexport function useLiquidityBalance<\n  config extends Config = ResolvedRegister['config'],\n  selectData = Actions.amm.getLiquidityBalance.ReturnValue,\n>(\n  parameters: useLiquidityBalance.Parameters<config, selectData> = {},\n): useLiquidityBalance.ReturnValue<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = Actions.amm.getLiquidityBalance.queryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  } as never)\n  return useQuery(options) as never\n}\n\nexport declare namespace useLiquidityBalance {\n  export type Parameters<\n    config extends Config = ResolvedRegister['config'],\n    selectData = Actions.amm.getLiquidityBalance.ReturnValue,\n  > = ConfigParameter<config> &\n    QueryParameter<\n      Actions.amm.getLiquidityBalance.ReturnValue,\n      Actions.amm.getLiquidityBalance.ErrorType,\n      selectData,\n      Actions.amm.getLiquidityBalance.QueryKey<config>\n    > &\n    ExactPartial<Actions.amm.getLiquidityBalance.Parameters<config>>\n\n  export type ReturnValue<\n    selectData = Actions.amm.getLiquidityBalance.ReturnValue,\n  > = UseQueryReturnType<selectData, Error>\n}\n\n/**\n * Hook for performing a rebalance swap from validator token to user token.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.amm.useRebalanceSwap()\n *\n *   return (\n *     <button\n *       onClick={() =>\n *         mutate({\n *           userToken: '0x...',\n *           validatorToken: '0x...',\n *           amountOut: 100n,\n *           to: '0x...',\n *         })\n *       }\n *       disabled={isPending}\n *     >\n *       Rebalance Swap\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useRebalanceSwap<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useRebalanceSwap.Parameters<config, context> = {},\n): useRebalanceSwap.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.amm.rebalanceSwap(config, variables as never)\n    },\n    mutationKey: ['rebalanceSwap'],\n  }) as never\n}\n\nexport declare namespace useRebalanceSwap {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.amm.rebalanceSwap.ReturnValue,\n          Actions.amm.rebalanceSwap.ErrorType,\n          Actions.amm.rebalanceSwap.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.amm.rebalanceSwap.ReturnValue,\n    Actions.amm.rebalanceSwap.ErrorType,\n    Actions.amm.rebalanceSwap.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for performing a rebalance swap from validator token to user token.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.amm.useRebalanceSwapSync()\n *\n *   return (\n *     <button\n *       onClick={() =>\n *         mutate({\n *           userToken: '0x...',\n *           validatorToken: '0x...',\n *           amountOut: 100n,\n *           to: '0x...',\n *         })\n *       }\n *       disabled={isPending}\n *     >\n *       Rebalance Swap\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useRebalanceSwapSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useRebalanceSwapSync.Parameters<config, context> = {},\n): useRebalanceSwapSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.amm.rebalanceSwapSync(config, variables as never)\n    },\n    mutationKey: ['rebalanceSwapSync'],\n  }) as never\n}\n\nexport declare namespace useRebalanceSwapSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.amm.rebalanceSwapSync.ReturnValue,\n          Actions.amm.rebalanceSwapSync.ErrorType,\n          Actions.amm.rebalanceSwapSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.amm.rebalanceSwapSync.ReturnValue,\n    Actions.amm.rebalanceSwapSync.ErrorType,\n    Actions.amm.rebalanceSwapSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for adding liquidity to a pool.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.amm.useMint()\n *\n *   return (\n *     <button\n *       onClick={() =>\n *         mutate({\n *           userTokenAddress: '0x20c0...beef',\n *           validatorTokenAddress: '0x20c0...babe',\n *           validatorTokenAmount: 100n,\n *           to: '0xfeed...fede',\n *         })\n *       }\n *       disabled={isPending}\n *     >\n *       Add Liquidity\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useMint<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useMint.Parameters<config, context> = {},\n): useMint.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.amm.mint(config, variables as never)\n    },\n    mutationKey: ['mint'],\n  }) as never\n}\n\nexport declare namespace useMint {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.amm.mint.ReturnValue,\n          Actions.amm.mint.ErrorType,\n          Actions.amm.mint.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.amm.mint.ReturnValue,\n    Actions.amm.mint.ErrorType,\n    Actions.amm.mint.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for adding liquidity to a pool.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.amm.useMintSync()\n *\n *   return (\n *     <button\n *       onClick={() =>\n *         mutate({\n *           userTokenAddress: '0x20c0...beef',\n *           validatorTokenAddress: '0x20c0...babe',\n *           validatorTokenAmount: 100n,\n *           to: '0xfeed...fede',\n *         })\n *       }\n *       disabled={isPending}\n *     >\n *       Add Liquidity\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useMintSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useMintSync.Parameters<config, context> = {},\n): useMintSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.amm.mintSync(config, variables as never)\n    },\n    mutationKey: ['mintSync'],\n  }) as never\n}\n\nexport declare namespace useMintSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.amm.mintSync.ReturnValue,\n          Actions.amm.mintSync.ErrorType,\n          Actions.amm.mintSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.amm.mintSync.ReturnValue,\n    Actions.amm.mintSync.ErrorType,\n    Actions.amm.mintSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for removing liquidity from a pool.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.amm.useBurn()\n *\n *   return (\n *     <button\n *       onClick={() =>\n *         mutate({\n *           userToken: '0x20c0...beef',\n *           validatorToken: '0x20c0...babe',\n *           liquidity: 50n,\n *           to: '0xfeed...fede',\n *         })\n *       }\n *       disabled={isPending}\n *     >\n *       Remove Liquidity\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useBurn<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useBurn.Parameters<config, context> = {},\n): useBurn.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.amm.burn(config, variables as never)\n    },\n    mutationKey: ['burn'],\n  }) as never\n}\n\nexport declare namespace useBurn {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.amm.burn.ReturnValue,\n          Actions.amm.burn.ErrorType,\n          Actions.amm.burn.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.amm.burn.ReturnValue,\n    Actions.amm.burn.ErrorType,\n    Actions.amm.burn.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for removing liquidity from a pool.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.amm.useBurnSync()\n *\n *   return (\n *     <button\n *       onClick={() =>\n *         mutate({\n *           userToken: '0x20c0...beef',\n *           validatorToken: '0x20c0...babe',\n *           liquidity: 50n,\n *           to: '0xfeed...fede',\n *         })\n *       }\n *       disabled={isPending}\n *     >\n *       Remove Liquidity\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useBurnSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useBurnSync.Parameters<config, context> = {},\n): useBurnSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.amm.burnSync(config, variables as never)\n    },\n    mutationKey: ['burnSync'],\n  }) as never\n}\n\nexport declare namespace useBurnSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.amm.burnSync.ReturnValue,\n          Actions.amm.burnSync.ErrorType,\n          Actions.amm.burnSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.amm.burnSync.ReturnValue,\n    Actions.amm.burnSync.ErrorType,\n    Actions.amm.burnSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for watching rebalance swap events.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   Hooks.amm.useWatchRebalanceSwap({\n *     onRebalanceSwap(args) {\n *       console.log('Rebalance swap:', args)\n *     },\n *   })\n *\n *   return <div>Watching for rebalance swaps...</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n */\nexport function useWatchRebalanceSwap<\n  config extends Config = ResolvedRegister['config'],\n>(parameters: useWatchRebalanceSwap.Parameters<config> = {}) {\n  const { enabled = true, onRebalanceSwap, ...rest } = parameters\n\n  const config = useConfig({ config: parameters.config })\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  // biome-ignore lint/correctness/useExhaustiveDependencies: rest.x is explicitly listed\n  useEffect(() => {\n    if (!enabled) return\n    if (!onRebalanceSwap) return\n    return Actions.amm.watchRebalanceSwap(config, {\n      ...rest,\n      chainId,\n      onRebalanceSwap,\n    })\n  }, [\n    config,\n    enabled,\n    chainId,\n    onRebalanceSwap,\n    rest.fromBlock,\n    rest.onError,\n    rest.poll,\n    rest.pollingInterval,\n    rest.userToken,\n    rest.validatorToken,\n  ])\n}\n\nexport declare namespace useWatchRebalanceSwap {\n  type Parameters<config extends Config = Config> = UnionCompute<\n    ExactPartial<Actions.amm.watchRebalanceSwap.Parameters<config>> &\n      ConfigParameter<config> & { enabled?: boolean | undefined }\n  >\n}\n\n/**\n * Hook for watching liquidity mint events.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   Hooks.amm.useWatchMint({\n *     onMint(args) {\n *       console.log('Liquidity added:', args)\n *     },\n *   })\n *\n *   return <div>Watching for liquidity additions...</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n */\nexport function useWatchMint<\n  config extends Config = ResolvedRegister['config'],\n>(parameters: useWatchMint.Parameters<config> = {}) {\n  const { enabled = true, onMint, ...rest } = parameters\n\n  const config = useConfig({ config: parameters.config })\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  // biome-ignore lint/correctness/useExhaustiveDependencies: rest.x is explicitly listed\n  useEffect(() => {\n    if (!enabled) return\n    if (!onMint) return\n    return Actions.amm.watchMint(config, {\n      ...rest,\n      chainId,\n      onMint,\n    })\n  }, [\n    config,\n    enabled,\n    chainId,\n    onMint,\n    rest.fromBlock,\n    rest.onError,\n    rest.poll,\n    rest.pollingInterval,\n    rest.sender,\n    rest.userToken,\n    rest.validatorToken,\n  ])\n}\n\nexport declare namespace useWatchMint {\n  type Parameters<config extends Config = Config> = UnionCompute<\n    ExactPartial<Actions.amm.watchMint.Parameters<config>> &\n      ConfigParameter<config> & { enabled?: boolean | undefined }\n  >\n}\n\n/**\n * Hook for watching liquidity burn events.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   Hooks.amm.useWatchBurn({\n *     onBurn(args) {\n *       console.log('Liquidity removed:', args)\n *     },\n *   })\n *\n *   return <div>Watching for liquidity removals...</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n */\nexport function useWatchBurn<\n  config extends Config = ResolvedRegister['config'],\n>(parameters: useWatchBurn.Parameters<config> = {}) {\n  const { enabled = true, onBurn, ...rest } = parameters\n\n  const config = useConfig({ config: parameters.config })\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  // biome-ignore lint/correctness/useExhaustiveDependencies: rest.x is explicitly listed\n  useEffect(() => {\n    if (!enabled) return\n    if (!onBurn) return\n    return Actions.amm.watchBurn(config, {\n      ...rest,\n      chainId,\n      onBurn,\n    })\n  }, [\n    config,\n    enabled,\n    chainId,\n    onBurn,\n    rest.fromBlock,\n    rest.onError,\n    rest.poll,\n    rest.pollingInterval,\n    rest.userToken,\n    rest.validatorToken,\n  ])\n}\n\nexport declare namespace useWatchBurn {\n  type Parameters<config extends Config = Config> = UnionCompute<\n    ExactPartial<Actions.amm.watchBurn.Parameters<config>> &\n      ConfigParameter<config> & { enabled?: boolean | undefined }\n  >\n}\n"
  },
  {
    "path": "packages/react/src/tempo/hooks/dex.test.ts",
    "content": "import { Actions } from '@wagmi/core/tempo'\nimport {\n  accounts,\n  addresses,\n  config,\n  renderHook,\n  setupTokenPair,\n} from '@wagmi/test/tempo'\nimport { type Address, isAddress, parseUnits } from 'viem'\nimport { Tick } from 'viem/tempo'\nimport { describe, expect, test, vi } from 'vitest'\n\nimport { useConnect } from '../../hooks/useConnect.js'\nimport * as dex from './dex.js'\n\nconst account = accounts[0]\nconst account2 = accounts[1]\n\ndescribe('useBuy', () => {\n  test('default', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    const { result } = await renderHook(() => dex.useBuySync())\n\n    // Place ask order to create liquidity\n    await Actions.dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('500', 6),\n      type: 'sell',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    // Buy base tokens with quote tokens\n    const { receipt } = await result.current.mutateAsync({\n      tokenIn: quote,\n      tokenOut: base,\n      amountOut: parseUnits('100', 6),\n      maxAmountIn: parseUnits('150', 6),\n    })\n\n    expect(receipt).toBeDefined()\n    expect(receipt.status).toBe('success')\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n  })\n\n  test('behavior: respects maxAmountIn', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    const { result } = await renderHook(() => dex.useBuySync())\n\n    // Place ask order at high price\n    await Actions.dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('500', 6),\n      type: 'sell',\n      tick: Tick.fromPrice('1.01'), // 1% above peg\n    })\n\n    // Try to buy with insufficient maxAmountIn - should fail\n    await expect(\n      result.current.mutateAsync({\n        tokenIn: quote,\n        tokenOut: base,\n        amountOut: parseUnits('100', 6),\n        maxAmountIn: parseUnits('50', 6), // Way too low for 1% premium\n      }),\n    ).rejects.toThrow('The contract function \"swapExactAmountOut\" reverted')\n  })\n\n  test('behavior: fails with insufficient liquidity', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    const { result } = await renderHook(() => dex.useBuySync())\n\n    // Don't place any orders - no liquidity\n\n    // Try to buy - should fail due to no liquidity\n    await expect(\n      result.current.mutateAsync({\n        tokenIn: quote,\n        tokenOut: base,\n        amountOut: parseUnits('100', 6),\n        maxAmountIn: parseUnits('150', 6),\n      }),\n    ).rejects.toThrow('The contract function \"swapExactAmountOut\" reverted')\n  })\n})\n\ndescribe('useCancel', () => {\n  test('default', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    const { result } = await renderHook(() => ({\n      place: dex.usePlaceSync(),\n      cancel: dex.useCancelSync(),\n    }))\n\n    // Place a bid order\n    const { orderId } = await result.current.place.mutateAsync({\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    // Check initial DEX balance (should be 0)\n    const dexBalanceBefore = await Actions.dex.getBalance(config, {\n      account: account.address,\n      token: quote,\n    })\n    expect(dexBalanceBefore).toBe(0n)\n\n    // Cancel the order\n    const { receipt, orderId: returnedOrderId } =\n      await result.current.cancel.mutateAsync({\n        orderId,\n      })\n\n    expect(receipt).toBeDefined()\n    expect(receipt.status).toBe('success')\n    expect(returnedOrderId).toBe(orderId)\n\n    await vi.waitFor(() => expect(result.current.cancel.isSuccess).toBeTruthy())\n\n    // Check DEX balance after cancel - tokens should be refunded to internal balance\n    const dexBalanceAfter = await Actions.dex.getBalance(config, {\n      account: account.address,\n      token: quote,\n    })\n    expect(dexBalanceAfter).toBeGreaterThan(0n)\n  })\n\n  test('behavior: only maker can cancel', async () => {\n    const { base } = await setupTokenPair()\n\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      place: dex.usePlaceSync(),\n      cancel: dex.useCancelSync(),\n    }))\n\n    // Account places order\n    const { orderId } = await result.current.place.mutateAsync({\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    // Transfer gas to account2\n    await Actions.token.transferSync(config, {\n      to: account2.address,\n      amount: parseUnits('1', 6),\n      token: addresses.alphaUsd,\n    })\n\n    // Use a different account via the connector\n    await result.current.connect.connectAsync({\n      connector: config.connectors[1]!,\n    })\n\n    // Account2 tries to cancel - should fail\n    await expect(\n      result.current.cancel.mutateAsync({\n        orderId,\n      }),\n    ).rejects.toThrow('The contract function \"cancel\" reverted')\n  })\n\n  test('behavior: cannot cancel non-existent order', async () => {\n    await setupTokenPair()\n\n    const { result } = await renderHook(() => dex.useCancelSync())\n\n    // Try to cancel an order that doesn't exist\n    await expect(\n      result.current.mutateAsync({\n        orderId: 999n,\n      }),\n    ).rejects.toThrow('The contract function \"cancel\" reverted')\n  })\n})\n\ndescribe('useCreatePair', () => {\n  test('default', async () => {\n    await setupTokenPair() // This ensures connection\n\n    const { result } = await renderHook(() => dex.useCreatePairSync())\n\n    const { token: baseToken } = await Actions.token.createSync(config, {\n      name: 'Test Base Token',\n      symbol: 'BASE',\n      currency: 'USD',\n      admin: account,\n    })\n\n    const { receipt, ...resultData } = await result.current.mutateAsync({\n      base: baseToken,\n    })\n\n    expect(receipt).toBeDefined()\n    expect(receipt.status).toBe('success')\n\n    const { key, ...rest } = resultData\n    expect(key).toBeDefined()\n    expect(rest).toEqual(\n      expect.objectContaining({\n        base: expect.toSatisfy(isAddress),\n        quote: expect.toSatisfy(isAddress),\n      }),\n    )\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n  })\n})\n\ndescribe('useBalance', () => {\n  test('default', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    const { result, rerender } = await renderHook(\n      (props) => dex.useBalance({ account: props?.account, token: quote }),\n      { initialProps: { account: undefined as Address | undefined } },\n    )\n\n    await vi.waitFor(() => expect(result.current.fetchStatus).toBe('idle'))\n\n    // Verify initial state (disabled/pending when account missing)\n    expect(result.current.status).toBe('pending')\n\n    // Set account and rerender\n    rerender({ account: accounts[0].address })\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    // Initial balance should be 0\n    expect(result.current.data).toBe(0n)\n\n    // Place and cancel order to create internal balance\n    const { orderId } = await Actions.dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.0005'),\n    })\n\n    await Actions.dex.cancelSync(config, {\n      orderId,\n    })\n\n    // Trigger refetch and verify updated balance\n    const { data } = await result.current.refetch()\n    expect(data).toBeGreaterThan(0n)\n  })\n\n  test('behavior: check different account', async () => {\n    const { quote } = await setupTokenPair()\n\n    const { result } = await renderHook(() =>\n      dex.useBalance({ account: account2.address, token: quote }),\n    )\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    // Check account2's balance (should be 0)\n    expect(result.current.data).toBe(0n)\n  })\n\n  test('behavior: balances are per-token', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // Create balance in quote token\n    const { orderId } = await Actions.dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.001'),\n    })\n    await Actions.dex.cancelSync(config, { orderId })\n\n    const { result } = await renderHook(() => ({\n      quote: dex.useBalance({ account: account.address, token: quote }),\n      base: dex.useBalance({ account: account.address, token: base }),\n    }))\n\n    await vi.waitUntil(\n      () => result.current.base.isSuccess && result.current.quote.isSuccess,\n      {\n        timeout: 50_000,\n      },\n    )\n\n    // Check quote balance (should have refunded tokens)\n    expect(result.current.quote.data).toBeGreaterThan(0n)\n    // Check base balance (should still be 0)\n    expect(result.current.base.data).toBe(0n)\n  })\n})\n\ndescribe('useBuyQuote', () => {\n  test('default', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // Place ask orders to create liquidity\n    await Actions.dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('500', 6),\n      type: 'sell',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    const { result } = await renderHook(() =>\n      dex.useBuyQuote({\n        tokenIn: quote,\n        tokenOut: base,\n        amountOut: parseUnits('100', 6),\n      }),\n    )\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    expect(result.current.data).toBeGreaterThan(0n)\n    // Should be approximately 100 * 1.001 = 100.1\n    expect(result.current.data).toBeGreaterThan(parseUnits('100', 6))\n  })\n\n  test('behavior: fails with no liquidity', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // No orders placed - no liquidity\n\n    const { result } = await renderHook(() =>\n      dex.useBuyQuote({\n        tokenIn: quote,\n        tokenOut: base,\n        amountOut: parseUnits('100', 6),\n      }),\n    )\n\n    await vi.waitUntil(() => result.current.isError, {\n      timeout: 50_000,\n    })\n\n    expect(result.current.error?.message).toContain('InsufficientLiquidity')\n  })\n})\n\ndescribe('useOrder', () => {\n  test('default', async () => {\n    const { base } = await setupTokenPair()\n\n    // Place an order to get an order ID\n    const { orderId } = await Actions.dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    const { result } = await renderHook(() =>\n      dex.useOrder({\n        orderId,\n      }),\n    )\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    const order = result.current.data!\n    expect(order.maker).toBe(account.address)\n    expect(order.isBid).toBe(true)\n    expect(order.tick).toBe(Tick.fromPrice('1.001'))\n    expect(order.amount).toBe(parseUnits('100', 6))\n    expect(order.remaining).toBe(parseUnits('100', 6))\n    expect(order.isFlip).toBe(false)\n  })\n\n  test('behavior: returns flip order details', async () => {\n    const { base } = await setupTokenPair()\n\n    // Place a flip order\n    const { orderId } = await Actions.dex.placeFlipSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.001'),\n      flipTick: Tick.fromPrice('1.002'),\n    })\n\n    const { result } = await renderHook(() =>\n      dex.useOrder({\n        orderId,\n      }),\n    )\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    const order = result.current.data!\n    expect(order.maker).toBe(account.address)\n    expect(order.isBid).toBe(true)\n    expect(order.tick).toBe(Tick.fromPrice('1.001'))\n    expect(order.amount).toBe(parseUnits('100', 6))\n    expect(order.isFlip).toBe(true)\n    expect(order.flipTick).toBe(Tick.fromPrice('1.002'))\n  })\n\n  test('behavior: fails for non-existent order', async () => {\n    await setupTokenPair()\n\n    const { result } = await renderHook(() =>\n      dex.useOrder({\n        orderId: 999n,\n      }),\n    )\n\n    await vi.waitUntil(() => result.current.isError, {\n      timeout: 50_000,\n    })\n\n    expect(result.current.error?.message).toContain('OrderDoesNotExist')\n  })\n})\n\ndescribe('useOrderbook', () => {\n  test('default', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    const { result } = await renderHook(() =>\n      dex.useOrderbook({\n        base,\n        quote,\n      }),\n    )\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    const book = result.current.data!\n    expect(book.base).toBe(base)\n    expect(book.quote).toBe(quote)\n    expect(book.bestBidTick).toBeDefined()\n    expect(book.bestAskTick).toBeDefined()\n  })\n\n  test('behavior: shows best bid and ask after orders placed', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    const bidTick = Tick.fromPrice('0.999')\n    const askTick = Tick.fromPrice('1.001')\n\n    // Place a bid order\n    await Actions.dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: bidTick,\n    })\n\n    // Place an ask order\n    await Actions.dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'sell',\n      tick: askTick,\n    })\n\n    const { result } = await renderHook(() =>\n      dex.useOrderbook({\n        base,\n        quote,\n      }),\n    )\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    const book = result.current.data!\n    expect(book.bestBidTick).toBe(bidTick)\n    expect(book.bestAskTick).toBe(askTick)\n  })\n})\n\ndescribe('useTickLevel', () => {\n  test('default', async () => {\n    const { base } = await setupTokenPair()\n\n    const tick = Tick.fromPrice('1.001')\n\n    // Place an order to create liquidity at this tick\n    const { orderId } = await Actions.dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick,\n    })\n\n    const { result } = await renderHook(() =>\n      dex.useTickLevel({\n        base,\n        tick,\n        isBid: true,\n      }),\n    )\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    const level = result.current.data!\n    expect(level.head).toBe(orderId) // head should be our order\n    expect(level.tail).toBe(orderId) // tail should also be our order (only one)\n    expect(level.totalLiquidity).toBeGreaterThan(0n)\n  })\n\n  test('behavior: empty price level', async () => {\n    const { base } = await setupTokenPair()\n\n    const tick = Tick.fromPrice('1.001')\n\n    // Query a tick with no orders\n    const { result } = await renderHook(() =>\n      dex.useTickLevel({\n        base,\n        tick,\n        isBid: true,\n      }),\n    )\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    const level = result.current.data!\n    expect(level.head).toBe(0n)\n    expect(level.tail).toBe(0n)\n    expect(level.totalLiquidity).toBe(0n)\n  })\n})\n\ndescribe('useSellQuote', () => {\n  test('default', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // Place bid orders to create liquidity\n    await Actions.dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('500', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('0.999'),\n    })\n\n    const { result } = await renderHook(() =>\n      dex.useSellQuote({\n        tokenIn: base,\n        tokenOut: quote,\n        amountIn: parseUnits('100', 6),\n      }),\n    )\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    expect(result.current.data).toBeGreaterThan(0n)\n    // Should be approximately 100 * 0.999 = 99.9\n    expect(result.current.data).toBeLessThan(parseUnits('100', 6))\n  })\n\n  test('behavior: fails with no liquidity', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // Quote should fail with no liquidity\n    const { result } = await renderHook(() =>\n      dex.useSellQuote({\n        tokenIn: base,\n        tokenOut: quote,\n        amountIn: parseUnits('100', 6),\n      }),\n    )\n\n    await vi.waitUntil(() => result.current.isError, {\n      timeout: 50_000,\n    })\n\n    expect(result.current.error?.message).toContain('InsufficientLiquidity')\n  })\n})\n\ndescribe('usePlace', () => {\n  test('default', async () => {\n    const { base } = await setupTokenPair()\n\n    const { result } = await renderHook(() => dex.usePlaceSync())\n\n    // Place a sell order\n    const { receipt, orderId, token, ...resultData } =\n      await result.current.mutateAsync({\n        token: base,\n        amount: parseUnits('100', 6),\n        type: 'sell',\n        tick: Tick.fromPrice('1.001'),\n      })\n\n    expect(receipt).toBeDefined()\n    expect(receipt.status).toBe('success')\n    expect(orderId).toBeGreaterThan(0n)\n    expect(token).toBe(base)\n    expect(resultData).toMatchInlineSnapshot(`\n      {\n        \"amount\": 100000000n,\n        \"flipTick\": 0,\n        \"isBid\": false,\n        \"isFlipOrder\": false,\n        \"maker\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        \"tick\": 100,\n      }\n    `)\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    // Place a buy order\n    const {\n      receipt: receipt2,\n      orderId: orderId2,\n      token: token2,\n      ...result2\n    } = await result.current.mutateAsync({\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.001'),\n    })\n    expect(receipt2.status).toBe('success')\n    expect(orderId2).toBeGreaterThan(0n)\n    expect(token2).toBe(base)\n    expect(result2).toMatchInlineSnapshot(`\n      {\n        \"amount\": 100000000n,\n        \"flipTick\": 0,\n        \"isBid\": true,\n        \"isFlipOrder\": false,\n        \"maker\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        \"tick\": 100,\n      }\n    `)\n  })\n})\n\ndescribe('usePlaceFlip', () => {\n  test('default', async () => {\n    const { base } = await setupTokenPair()\n\n    const { result } = await renderHook(() => dex.usePlaceFlipSync())\n\n    // Place a flip bid order\n    const { receipt, orderId, token, ...resultData } =\n      await result.current.mutateAsync({\n        token: base,\n        amount: parseUnits('100', 6),\n        type: 'buy',\n        tick: Tick.fromPrice('1.001'),\n        flipTick: Tick.fromPrice('1.002'),\n      })\n\n    expect(receipt).toBeDefined()\n    expect(receipt.status).toBe('success')\n    expect(orderId).toBeGreaterThan(0n)\n    expect(token).toBe(base)\n    expect(resultData.flipTick).toBe(Tick.fromPrice('1.002'))\n    expect(resultData).toMatchInlineSnapshot(`\n      {\n        \"amount\": 100000000n,\n        \"flipTick\": 200,\n        \"isBid\": true,\n        \"isFlipOrder\": true,\n        \"maker\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n        \"tick\": 100,\n      }\n    `)\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n  })\n})\n\ndescribe('useSell', () => {\n  test('default', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    const { result } = await renderHook(() => dex.useSellSync())\n\n    // Place bid order to create liquidity\n    await Actions.dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('500', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('0.999'),\n    })\n\n    // Sell base tokens\n    const { receipt } = await result.current.mutateAsync({\n      tokenIn: base,\n      tokenOut: quote,\n      amountIn: parseUnits('100', 6),\n      minAmountOut: parseUnits('50', 6),\n    })\n\n    expect(receipt).toBeDefined()\n    expect(receipt.status).toBe('success')\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n  })\n\n  test('behavior: respects minAmountOut', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    const { result } = await renderHook(() => dex.useSellSync())\n\n    // Place bid order at low price\n    await Actions.dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('500', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('0.99'), // 1% below peg\n    })\n\n    // Try to sell with too high minAmountOut - should fail\n    await expect(\n      result.current.mutateAsync({\n        tokenIn: base,\n        tokenOut: quote,\n        amountIn: parseUnits('100', 6),\n        minAmountOut: parseUnits('150', 6), // Way too high\n      }),\n    ).rejects.toThrow('The contract function \"swapExactAmountIn\" reverted')\n  })\n\n  test('behavior: fails with insufficient liquidity', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    const { result } = await renderHook(() => dex.useSellSync())\n\n    // No orders - no liquidity\n\n    // Try to sell - should fail\n    await expect(\n      result.current.mutateAsync({\n        tokenIn: base,\n        tokenOut: quote,\n        amountIn: parseUnits('100', 6),\n        minAmountOut: parseUnits('50', 6),\n      }),\n    ).rejects.toThrow('The contract function \"swapExactAmountIn\" reverted')\n  })\n})\n\ndescribe('useWatchFlipOrderPlaced', () => {\n  test('default', async () => {\n    const { base } = await setupTokenPair()\n\n    const { result } = await renderHook(() => dex.usePlaceFlipSync())\n\n    const events: any[] = []\n    await renderHook(() =>\n      dex.useWatchFlipOrderPlaced({\n        onFlipOrderPlaced(args) {\n          events.push(args)\n        },\n      }),\n    )\n\n    // Place flip order to trigger event\n    await result.current.mutateAsync({\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.001'),\n      flipTick: Tick.fromPrice('1.002'),\n    })\n\n    await vi.waitUntil(() => events.length >= 1)\n\n    expect(events.length).toBeGreaterThanOrEqual(1)\n    expect(events[0]?.flipTick).toBe(Tick.fromPrice('1.002'))\n    expect(events[0]?.tick).toBe(Tick.fromPrice('1.001'))\n    expect(events[0]?.isBid).toBe(true)\n    expect(events[0]?.amount).toBe(parseUnits('100', 6))\n  })\n})\n\ndescribe('useWatchOrderCancelled', () => {\n  test('default', async () => {\n    const { base } = await setupTokenPair()\n\n    // Place order first\n    const { orderId } = await Actions.dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    const events: any[] = []\n    await renderHook(() =>\n      dex.useWatchOrderCancelled({\n        onOrderCancelled(args) {\n          events.push(args)\n        },\n      }),\n    )\n\n    // Cancel order to trigger event\n    await Actions.dex.cancelSync(config, {\n      orderId,\n    })\n\n    await vi.waitUntil(() => events.length >= 1)\n\n    expect(events.length).toBeGreaterThanOrEqual(1)\n    expect(events[0]?.orderId).toBe(orderId)\n  })\n\n  test('behavior: filter by orderId', async () => {\n    const { base } = await setupTokenPair()\n\n    // Place two orders\n    const { orderId: orderId1 } = await Actions.dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    const { orderId: orderId2 } = await Actions.dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    const events: any[] = []\n    await renderHook(() =>\n      dex.useWatchOrderCancelled({\n        orderId: orderId1, // Filter for only orderId1\n        onOrderCancelled(args) {\n          events.push(args)\n        },\n      }),\n    )\n\n    // Cancel orderId1 (should be captured)\n    await Actions.dex.cancelSync(config, {\n      orderId: orderId1,\n    })\n\n    // Cancel orderId2 (should NOT be captured due to filter)\n    await Actions.dex.cancelSync(config, {\n      orderId: orderId2,\n    })\n\n    await vi.waitUntil(() => events.length >= 1, { timeout: 2000 })\n\n    // Should only receive 1 event (for orderId1)\n    expect(events.length).toBe(1)\n    expect(events[0]?.orderId).toBe(orderId1)\n  })\n})\n\ndescribe('useWatchOrderFilled', () => {\n  test('default', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // Place a sell order to create liquidity\n    const { orderId } = await Actions.dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'sell',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    const events: any[] = []\n    await renderHook(() =>\n      dex.useWatchOrderFilled({\n        onOrderFilled(args) {\n          events.push(args)\n        },\n      }),\n    )\n\n    // Buy from the order to trigger a fill\n    await Actions.dex.buySync(config, {\n      tokenIn: quote,\n      tokenOut: base,\n      amountOut: parseUnits('50', 6),\n      maxAmountIn: parseUnits('100', 6),\n    })\n\n    await vi.waitUntil(() => events.length >= 1)\n\n    expect(events.length).toBeGreaterThanOrEqual(1)\n    expect(events[0]?.orderId).toBe(orderId)\n    expect(events[0]?.maker).toBe(accounts[0].address)\n    expect(events[0]?.taker).toBe(accounts[0].address)\n    expect(events[0]?.amountFilled).toBeGreaterThan(0n)\n  })\n\n  test('behavior: filter by orderId', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    // Place two sell orders\n    const { orderId: orderId1 } = await Actions.dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'sell',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    const { orderId: orderId2 } = await Actions.dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'sell',\n      tick: Tick.fromPrice('1.002'),\n    })\n\n    const events: any[] = []\n    await renderHook(() =>\n      dex.useWatchOrderFilled({\n        orderId: orderId1, // Filter for only orderId1\n        onOrderFilled(args) {\n          events.push(args)\n        },\n      }),\n    )\n\n    // Buy enough to fill orderId1 only (cheaper price first)\n    await Actions.dex.buySync(config, {\n      tokenIn: quote,\n      tokenOut: base,\n      amountOut: parseUnits('50', 6),\n      maxAmountIn: parseUnits('100', 6),\n    })\n\n    await vi.waitUntil(() => events.length >= 1, { timeout: 2000 })\n\n    // Should only receive 1 event (for orderId1)\n    expect(events.length).toBe(1)\n    expect(events[0]?.orderId).toBe(orderId1)\n\n    // Suppress unused variable warning\n    void orderId2\n  })\n})\n\ndescribe('useWatchOrderPlaced', () => {\n  test('default', async () => {\n    const { base } = await setupTokenPair()\n\n    const events: any[] = []\n    await renderHook(() =>\n      dex.useWatchOrderPlaced({\n        onOrderPlaced(args) {\n          events.push(args)\n        },\n      }),\n    )\n\n    // Place first order\n    await Actions.dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    // Place second order\n    await Actions.dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'sell',\n      tick: Tick.fromPrice('0.999'),\n    })\n\n    await vi.waitUntil(() => events.length >= 2)\n\n    expect(events.length).toBeGreaterThanOrEqual(2)\n    expect(events[0]?.isBid).toBe(true)\n    expect(events[0]?.amount).toBe(parseUnits('100', 6))\n    expect(events[1]?.isBid).toBe(false)\n    expect(events[1]?.amount).toBe(parseUnits('100', 6))\n  })\n\n  test('behavior: filter by token', async () => {\n    const { base } = await setupTokenPair()\n    const { base: base2 } = await setupTokenPair()\n\n    const events: any[] = []\n    await renderHook(() =>\n      dex.useWatchOrderPlaced({\n        token: base, // Filter for only base token\n        onOrderPlaced(args) {\n          events.push(args)\n        },\n      }),\n    )\n\n    // Place order on base (should be captured)\n    await Actions.dex.placeSync(config, {\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    // Place order on base2 (should NOT be captured due to filter)\n    await Actions.dex.placeSync(config, {\n      token: base2,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    await vi.waitUntil(() => events.length >= 1, { timeout: 2000 })\n\n    // Should only receive 1 event (for base token)\n    expect(events.length).toBe(1)\n    expect(events[0]?.token.toLowerCase()).toBe(base.toLowerCase())\n  })\n})\n\ndescribe('useWithdraw', () => {\n  test('default', async () => {\n    const { base, quote } = await setupTokenPair()\n\n    const { result } = await renderHook(() => ({\n      place: dex.usePlaceSync(),\n      cancel: dex.useCancelSync(),\n      withdraw: dex.useWithdrawSync(),\n    }))\n\n    // Create internal balance\n    const { orderId } = await result.current.place.mutateAsync({\n      token: base,\n      amount: parseUnits('100', 6),\n      type: 'buy',\n      tick: Tick.fromPrice('1.001'),\n    })\n\n    await result.current.cancel.mutateAsync({ orderId })\n\n    // Get DEX balance\n    const dexBalance = await Actions.dex.getBalance(config, {\n      account: account.address,\n      token: quote,\n    })\n    expect(dexBalance).toBeGreaterThan(0n)\n\n    // Get wallet balance before withdraw\n    const walletBalanceBefore = await Actions.token.getBalance(config, {\n      token: quote,\n      account: account.address,\n    })\n\n    // Withdraw from DEX\n    const { receipt } = await result.current.withdraw.mutateAsync({\n      token: quote,\n      amount: dexBalance,\n    })\n\n    expect(receipt).toBeDefined()\n    expect(receipt.status).toBe('success')\n\n    await vi.waitFor(() =>\n      expect(result.current.withdraw.isSuccess).toBeTruthy(),\n    )\n\n    // Check DEX balance is now 0\n    const dexBalanceAfter = await Actions.dex.getBalance(config, {\n      account: account.address,\n      token: quote,\n    })\n    expect(dexBalanceAfter).toBe(0n)\n\n    // Check wallet balance increased\n    const walletBalanceAfter = await Actions.token.getBalance(config, {\n      token: quote,\n      account: account.address,\n    })\n    expect(walletBalanceAfter).toBeGreaterThan(walletBalanceBefore)\n  })\n})\n"
  },
  {
    "path": "packages/react/src/tempo/hooks/dex.ts",
    "content": "import type { UseMutationResult } from '@tanstack/react-query'\nimport type { Config, ResolvedRegister } from '@wagmi/core'\nimport type {\n  ConfigParameter,\n  ExactPartial,\n  UnionCompute,\n} from '@wagmi/core/internal'\nimport { Actions } from '@wagmi/core/tempo'\nimport { useEffect } from 'react'\nimport { useChainId } from '../../hooks/useChainId.js'\nimport { useConfig } from '../../hooks/useConfig.js'\nimport {\n  type UseMutationParameters,\n  type UseQueryReturnType,\n  useMutation,\n  useQuery,\n} from '../../utils/query.js'\nimport type { QueryParameter } from '../utils.js'\n\n/**\n * Hook for buying a specific amount of tokens.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.dex.useBuy()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({\n *         tokenIn: '0x20c...11',\n *         tokenOut: '0x20c...20',\n *         amountOut: parseUnits('100', 6),\n *         maxAmountIn: parseUnits('105', 6),\n *       })}\n *       disabled={isPending}\n *     >\n *       Buy Tokens\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useBuy<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useBuy.Parameters<config, context> = {},\n): useBuy.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.dex.buy(config, variables as never)\n    },\n    mutationKey: ['buy'],\n  }) as never\n}\n\nexport declare namespace useBuy {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.dex.buy.ReturnValue,\n          Actions.dex.buy.ErrorType,\n          Actions.dex.buy.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.dex.buy.ReturnValue,\n    Actions.dex.buy.ErrorType,\n    Actions.dex.buy.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for buying a specific amount of tokens.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.dex.useBuySync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({\n *         tokenIn: '0x20c...11',\n *         tokenOut: '0x20c...20',\n *         amountOut: parseUnits('100', 6),\n *         maxAmountIn: parseUnits('105', 6),\n *       })}\n *       disabled={isPending}\n *     >\n *       Buy Tokens\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useBuySync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useBuySync.Parameters<config, context> = {},\n): useBuySync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.dex.buySync(config, variables as never)\n    },\n    mutationKey: ['buySync'],\n  }) as never\n}\n\nexport declare namespace useBuySync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.dex.buySync.ReturnValue,\n          Actions.dex.buySync.ErrorType,\n          Actions.dex.buySync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.dex.buySync.ReturnValue,\n    Actions.dex.buySync.ErrorType,\n    Actions.dex.buySync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for canceling an order from the orderbook.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.dex.useCancel()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ orderId: 123n })}\n *       disabled={isPending}\n *     >\n *       Cancel Order\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useCancel<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useCancel.Parameters<config, context> = {},\n): useCancel.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.dex.cancel(config, variables as never)\n    },\n    mutationKey: ['cancel'],\n  }) as never\n}\n\nexport declare namespace useCancel {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.dex.cancel.ReturnValue,\n          Actions.dex.cancel.ErrorType,\n          Actions.dex.cancel.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.dex.cancel.ReturnValue,\n    Actions.dex.cancel.ErrorType,\n    Actions.dex.cancel.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for canceling an order from the orderbook.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.dex.useCancelSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ orderId: 123n })}\n *       disabled={isPending}\n *     >\n *       Cancel Order\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useCancelSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useCancelSync.Parameters<config, context> = {},\n): useCancelSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.dex.cancelSync(config, variables as never)\n    },\n    mutationKey: ['cancelSync'],\n  }) as never\n}\n\nexport declare namespace useCancelSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.dex.cancelSync.ReturnValue,\n          Actions.dex.cancelSync.ErrorType,\n          Actions.dex.cancelSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.dex.cancelSync.ReturnValue,\n    Actions.dex.cancelSync.ErrorType,\n    Actions.dex.cancelSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for cancelling a stale order from the orderbook.\n *\n * A stale order is one where the owner's balance or allowance has dropped\n * below the order amount.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.dex.useCancelStale()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ orderId: 123n })}\n *       disabled={isPending}\n *     >\n *       Cancel Stale Order\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useCancelStale<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useCancelStale.Parameters<config, context> = {},\n): useCancelStale.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.dex.cancelStale(config, variables as never)\n    },\n    mutationKey: ['cancelStale'],\n  }) as never\n}\n\nexport declare namespace useCancelStale {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.dex.cancelStale.ReturnValue,\n          Actions.dex.cancelStale.ErrorType,\n          Actions.dex.cancelStale.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.dex.cancelStale.ReturnValue,\n    Actions.dex.cancelStale.ErrorType,\n    Actions.dex.cancelStale.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for cancelling a stale order and waiting for confirmation.\n *\n * A stale order is one where the owner's balance or allowance has dropped\n * below the order amount.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.dex.useCancelStaleSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ orderId: 123n })}\n *       disabled={isPending}\n *     >\n *       Cancel Stale Order\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useCancelStaleSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useCancelStaleSync.Parameters<config, context> = {},\n): useCancelStaleSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.dex.cancelStaleSync(config, variables as never)\n    },\n    mutationKey: ['cancelStaleSync'],\n  }) as never\n}\n\nexport declare namespace useCancelStaleSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.dex.cancelStaleSync.ReturnValue,\n          Actions.dex.cancelStaleSync.ErrorType,\n          Actions.dex.cancelStaleSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.dex.cancelStaleSync.ReturnValue,\n    Actions.dex.cancelStaleSync.ErrorType,\n    Actions.dex.cancelStaleSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for creating a new trading pair on the DEX.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.dex.useCreatePair()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ base: '0x20c...11' })}\n *       disabled={isPending}\n *     >\n *       Create Pair\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useCreatePair<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useCreatePair.Parameters<config, context> = {},\n): useCreatePair.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.dex.createPair(config, variables as never)\n    },\n    mutationKey: ['createPair'],\n  }) as never\n}\n\nexport declare namespace useCreatePair {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.dex.createPair.ReturnValue,\n          Actions.dex.createPair.ErrorType,\n          Actions.dex.createPair.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.dex.createPair.ReturnValue,\n    Actions.dex.createPair.ErrorType,\n    Actions.dex.createPair.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for creating a new trading pair on the DEX.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.dex.useCreatePairSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ base: '0x20c...11' })}\n *       disabled={isPending}\n *     >\n *       Create Pair\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useCreatePairSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useCreatePairSync.Parameters<config, context> = {},\n): useCreatePairSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.dex.createPairSync(config, variables as never)\n    },\n    mutationKey: ['createPairSync'],\n  }) as never\n}\n\nexport declare namespace useCreatePairSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.dex.createPairSync.ReturnValue,\n          Actions.dex.createPairSync.ErrorType,\n          Actions.dex.createPairSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.dex.createPairSync.ReturnValue,\n    Actions.dex.createPairSync.ErrorType,\n    Actions.dex.createPairSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for getting a user's token balance on the DEX.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { data, isLoading } = Hooks.dex.useBalance({\n *     account: '0x...',\n *     token: '0x20c...11',\n *   })\n *\n *   if (isLoading) return <div>Loading...</div>\n *   return <div>Balance: {data}</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Query result with the user's token balance on the DEX.\n */\nexport function useBalance<\n  config extends Config = ResolvedRegister['config'],\n  selectData = Actions.dex.getBalance.ReturnValue,\n>(\n  parameters: useBalance.Parameters<config, selectData>,\n): useBalance.ReturnValue<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = Actions.dex.getBalance.queryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  } as never)\n  return useQuery(options) as never\n}\n\nexport declare namespace useBalance {\n  export type Parameters<\n    config extends Config = ResolvedRegister['config'],\n    selectData = Actions.dex.getBalance.ReturnValue,\n  > = ConfigParameter<config> &\n    QueryParameter<\n      Actions.dex.getBalance.ReturnValue,\n      Actions.dex.getBalance.ErrorType,\n      selectData,\n      Actions.dex.getBalance.QueryKey<config>\n    > &\n    ExactPartial<Actions.dex.getBalance.Parameters<config>>\n\n  export type ReturnValue<selectData = Actions.dex.getBalance.ReturnValue> =\n    UseQueryReturnType<selectData, Error>\n}\n\n/**\n * Hook for getting the quote for buying a specific amount of tokens.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { data, isLoading } = Hooks.dex.useBuyQuote({\n *     amountOut: parseUnits('100', 6),\n *     tokenIn: '0x20c...11',\n *     tokenOut: '0x20c...20',\n *   })\n *\n *   if (isLoading) return <div>Loading...</div>\n *   return <div>Required Input: {data}</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Query result with the amount of tokenIn needed.\n */\nexport function useBuyQuote<\n  config extends Config = ResolvedRegister['config'],\n  selectData = Actions.dex.getBuyQuote.ReturnValue,\n>(\n  parameters: useBuyQuote.Parameters<config, selectData>,\n): useBuyQuote.ReturnValue<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = Actions.dex.getBuyQuote.queryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  } as never)\n  return useQuery(options) as never\n}\n\nexport declare namespace useBuyQuote {\n  export type Parameters<\n    config extends Config = ResolvedRegister['config'],\n    selectData = Actions.dex.getBuyQuote.ReturnValue,\n  > = ConfigParameter<config> &\n    QueryParameter<\n      Actions.dex.getBuyQuote.ReturnValue,\n      Actions.dex.getBuyQuote.ErrorType,\n      selectData,\n      Actions.dex.getBuyQuote.QueryKey<config>\n    > &\n    ExactPartial<Actions.dex.getBuyQuote.Parameters<config>>\n\n  export type ReturnValue<selectData = Actions.dex.getBuyQuote.ReturnValue> =\n    UseQueryReturnType<selectData, Error>\n}\n\n/**\n * Hook for getting an order's details from the orderbook.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { data, isLoading } = Hooks.dex.useOrder({\n *     orderId: 123n,\n *   })\n *\n *   if (isLoading) return <div>Loading...</div>\n *   return <div>Order: {JSON.stringify(data)}</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Query result with the order details.\n */\nexport function useOrder<\n  config extends Config = ResolvedRegister['config'],\n  selectData = Actions.dex.getOrder.ReturnValue,\n>(\n  parameters: useOrder.Parameters<config, selectData>,\n): useOrder.ReturnValue<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = Actions.dex.getOrder.queryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  } as never)\n  return useQuery(options) as never\n}\n\nexport declare namespace useOrder {\n  export type Parameters<\n    config extends Config = ResolvedRegister['config'],\n    selectData = Actions.dex.getOrder.ReturnValue,\n  > = ConfigParameter<config> &\n    QueryParameter<\n      Actions.dex.getOrder.ReturnValue,\n      Actions.dex.getOrder.ErrorType,\n      selectData,\n      Actions.dex.getOrder.QueryKey<config>\n    > &\n    ExactPartial<Actions.dex.getOrder.Parameters<config>>\n\n  export type ReturnValue<selectData = Actions.dex.getOrder.ReturnValue> =\n    UseQueryReturnType<selectData, Error>\n}\n\n/**\n * Hook for getting orderbook information for a trading pair.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { data, isLoading } = Hooks.dex.useOrderbook({\n *     base: '0x20c...11',\n *     quote: '0x20c...20',\n *   })\n *\n *   if (isLoading) return <div>Loading...</div>\n *   return <div>Orderbook: {JSON.stringify(data)}</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Query result with the orderbook information.\n */\nexport function useOrderbook<\n  config extends Config = ResolvedRegister['config'],\n  selectData = Actions.dex.getOrderbook.ReturnValue,\n>(\n  parameters: useOrderbook.Parameters<config, selectData>,\n): useOrderbook.ReturnValue<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = Actions.dex.getOrderbook.queryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  } as never)\n  return useQuery(options) as never\n}\n\nexport declare namespace useOrderbook {\n  export type Parameters<\n    config extends Config = ResolvedRegister['config'],\n    selectData = Actions.dex.getOrderbook.ReturnValue,\n  > = ConfigParameter<config> &\n    QueryParameter<\n      Actions.dex.getOrderbook.ReturnValue,\n      Actions.dex.getOrderbook.ErrorType,\n      selectData,\n      Actions.dex.getOrderbook.QueryKey<config>\n    > &\n    ExactPartial<Actions.dex.getOrderbook.Parameters<config>>\n\n  export type ReturnValue<selectData = Actions.dex.getOrderbook.ReturnValue> =\n    UseQueryReturnType<selectData, Error>\n}\n\n/**\n * Hook for getting the tick level information at a specific tick.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n * import { Tick } from 'viem/tempo'\n *\n * function App() {\n *   const { data, isLoading } = Hooks.dex.useTickLevel({\n *     base: '0x20c...11',\n *     tick: Tick.fromPrice('1.001'),\n *     isBid: true,\n *   })\n *\n *   if (isLoading) return <div>Loading...</div>\n *   return <div>Tick Level: {JSON.stringify(data)}</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Query result with the tick level information.\n */\nexport function useTickLevel<\n  config extends Config = ResolvedRegister['config'],\n  selectData = Actions.dex.getTickLevel.ReturnValue,\n>(\n  parameters: useTickLevel.Parameters<config, selectData>,\n): useTickLevel.ReturnValue<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = Actions.dex.getTickLevel.queryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  } as never)\n  return useQuery(options) as never\n}\n\nexport declare namespace useTickLevel {\n  export type Parameters<\n    config extends Config = ResolvedRegister['config'],\n    selectData = Actions.dex.getTickLevel.ReturnValue,\n  > = ConfigParameter<config> &\n    QueryParameter<\n      Actions.dex.getTickLevel.ReturnValue,\n      Actions.dex.getTickLevel.ErrorType,\n      selectData,\n      Actions.dex.getTickLevel.QueryKey<config>\n    > &\n    ExactPartial<Actions.dex.getTickLevel.Parameters<config>>\n\n  export type ReturnValue<selectData = Actions.dex.getTickLevel.ReturnValue> =\n    UseQueryReturnType<selectData, Error>\n}\n\n/**\n * Hook for getting the quote for selling a specific amount of tokens.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { data, isLoading } = Hooks.dex.useSellQuote({\n *     amountIn: parseUnits('100', 6),\n *     tokenIn: '0x20c...11',\n *     tokenOut: '0x20c...20',\n *   })\n *\n *   if (isLoading) return <div>Loading...</div>\n *   return <div>Expected Output: {data}</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Query result with the amount of tokenOut received.\n */\nexport function useSellQuote<\n  config extends Config = ResolvedRegister['config'],\n  selectData = Actions.dex.getSellQuote.ReturnValue,\n>(\n  parameters: useSellQuote.Parameters<config, selectData>,\n): useSellQuote.ReturnValue<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = Actions.dex.getSellQuote.queryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  } as never)\n  return useQuery(options) as never\n}\n\nexport declare namespace useSellQuote {\n  export type Parameters<\n    config extends Config = ResolvedRegister['config'],\n    selectData = Actions.dex.getSellQuote.ReturnValue,\n  > = ConfigParameter<config> &\n    QueryParameter<\n      Actions.dex.getSellQuote.ReturnValue,\n      Actions.dex.getSellQuote.ErrorType,\n      selectData,\n      Actions.dex.getSellQuote.QueryKey<config>\n    > &\n    ExactPartial<Actions.dex.getSellQuote.Parameters<config>>\n\n  export type ReturnValue<selectData = Actions.dex.getSellQuote.ReturnValue> =\n    UseQueryReturnType<selectData, Error>\n}\n\n/**\n * Hook for placing a limit order on the orderbook.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.dex.usePlace()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({\n *         amount: parseUnits('100', 6),\n *         tick: Tick.fromPrice('0.99'),\n *         token: '0x20c...11',\n *         type: 'buy',\n *       })}\n *       disabled={isPending}\n *     >\n *       Place Order\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function usePlace<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: usePlace.Parameters<config, context> = {},\n): usePlace.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.dex.place(config, variables as never)\n    },\n    mutationKey: ['place'],\n  }) as never\n}\n\nexport declare namespace usePlace {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.dex.place.ReturnValue,\n          Actions.dex.place.ErrorType,\n          Actions.dex.place.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.dex.place.ReturnValue,\n    Actions.dex.place.ErrorType,\n    Actions.dex.place.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for placing a flip order that automatically flips when filled.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.dex.usePlaceFlip()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({\n *         amount: parseUnits('100', 6),\n *         flipTick: Tick.fromPrice('1.01'),\n *         tick: Tick.fromPrice('0.99'),\n *         token: '0x20c...11',\n *         type: 'buy',\n *       })}\n *       disabled={isPending}\n *     >\n *       Place Flip Order\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function usePlaceFlip<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: usePlaceFlip.Parameters<config, context> = {},\n): usePlaceFlip.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.dex.placeFlip(config, variables as never)\n    },\n    mutationKey: ['placeFlip'],\n  }) as never\n}\n\nexport declare namespace usePlaceFlip {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.dex.placeFlip.ReturnValue,\n          Actions.dex.placeFlip.ErrorType,\n          Actions.dex.placeFlip.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.dex.placeFlip.ReturnValue,\n    Actions.dex.placeFlip.ErrorType,\n    Actions.dex.placeFlip.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for placing a flip order that automatically flips when filled.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.dex.usePlaceFlipSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({\n *         amount: parseUnits('100', 6),\n *         flipTick: Tick.fromPrice('1.01'),\n *         tick: Tick.fromPrice('0.99'),\n *         token: '0x20c...11',\n *         type: 'buy',\n *       })}\n *       disabled={isPending}\n *     >\n *       Place Flip Order\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function usePlaceFlipSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: usePlaceFlipSync.Parameters<config, context> = {},\n): usePlaceFlipSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.dex.placeFlipSync(config, variables as never)\n    },\n    mutationKey: ['placeFlipSync'],\n  }) as never\n}\n\nexport declare namespace usePlaceFlipSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.dex.placeFlipSync.ReturnValue,\n          Actions.dex.placeFlipSync.ErrorType,\n          Actions.dex.placeFlipSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.dex.placeFlipSync.ReturnValue,\n    Actions.dex.placeFlipSync.ErrorType,\n    Actions.dex.placeFlipSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for placing a limit order on the orderbook.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.dex.usePlaceSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({\n *         amount: parseUnits('100', 6),\n *         tick: Tick.fromPrice('0.99'),\n *         token: '0x20c...11',\n *         type: 'buy',\n *       })}\n *       disabled={isPending}\n *     >\n *       Place Order\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function usePlaceSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: usePlaceSync.Parameters<config, context> = {},\n): usePlaceSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.dex.placeSync(config, variables as never)\n    },\n    mutationKey: ['placeSync'],\n  }) as never\n}\n\nexport declare namespace usePlaceSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.dex.placeSync.ReturnValue,\n          Actions.dex.placeSync.ErrorType,\n          Actions.dex.placeSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.dex.placeSync.ReturnValue,\n    Actions.dex.placeSync.ErrorType,\n    Actions.dex.placeSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for selling a specific amount of tokens.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.dex.useSell()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({\n *         amountIn: parseUnits('100', 6),\n *         minAmountOut: parseUnits('95', 6),\n *         tokenIn: '0x20c...11',\n *         tokenOut: '0x20c...20',\n *       })}\n *       disabled={isPending}\n *     >\n *       Sell Tokens\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useSell<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useSell.Parameters<config, context> = {},\n): useSell.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.dex.sell(config, variables as never)\n    },\n    mutationKey: ['sell'],\n  }) as never\n}\n\nexport declare namespace useSell {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.dex.sell.ReturnValue,\n          Actions.dex.sell.ErrorType,\n          Actions.dex.sell.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.dex.sell.ReturnValue,\n    Actions.dex.sell.ErrorType,\n    Actions.dex.sell.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for selling a specific amount of tokens.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.dex.useSellSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({\n *         amountIn: parseUnits('100', 6),\n *         minAmountOut: parseUnits('95', 6),\n *         tokenIn: '0x20c...11',\n *         tokenOut: '0x20c...20',\n *       })}\n *       disabled={isPending}\n *     >\n *       Sell Tokens\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useSellSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useSellSync.Parameters<config, context> = {},\n): useSellSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.dex.sellSync(config, variables as never)\n    },\n    mutationKey: ['sellSync'],\n  }) as never\n}\n\nexport declare namespace useSellSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.dex.sellSync.ReturnValue,\n          Actions.dex.sellSync.ErrorType,\n          Actions.dex.sellSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.dex.sellSync.ReturnValue,\n    Actions.dex.sellSync.ErrorType,\n    Actions.dex.sellSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for withdrawing tokens from the DEX to the caller's wallet.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.dex.useWithdraw()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({\n *         amount: 100n,\n *         token: '0x20c...11',\n *       })}\n *       disabled={isPending}\n *     >\n *       Withdraw\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useWithdraw<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useWithdraw.Parameters<config, context> = {},\n): useWithdraw.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.dex.withdraw(config, variables as never)\n    },\n    mutationKey: ['withdraw'],\n  }) as never\n}\n\nexport declare namespace useWithdraw {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.dex.withdraw.ReturnValue,\n          Actions.dex.withdraw.ErrorType,\n          Actions.dex.withdraw.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.dex.withdraw.ReturnValue,\n    Actions.dex.withdraw.ErrorType,\n    Actions.dex.withdraw.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for withdrawing tokens from the DEX to the caller's wallet.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.dex.useWithdrawSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({\n *         amount: 100n,\n *         token: '0x20c...11',\n *       })}\n *       disabled={isPending}\n *     >\n *       Withdraw\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useWithdrawSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useWithdrawSync.Parameters<config, context> = {},\n): useWithdrawSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.dex.withdrawSync(config, variables as never)\n    },\n    mutationKey: ['withdrawSync'],\n  }) as never\n}\n\nexport declare namespace useWithdrawSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.dex.withdrawSync.ReturnValue,\n          Actions.dex.withdrawSync.ErrorType,\n          Actions.dex.withdrawSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.dex.withdrawSync.ReturnValue,\n    Actions.dex.withdrawSync.ErrorType,\n    Actions.dex.withdrawSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for watching flip order placement events on the DEX.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   Hooks.dex.useWatchFlipOrderPlaced({\n *     onFlipOrderPlaced(args) {\n *       console.log('Flip order placed:', args)\n *     },\n *   })\n *\n *   return <div>Watching for flip order placements...</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n */\nexport function useWatchFlipOrderPlaced<\n  config extends Config = ResolvedRegister['config'],\n>(parameters: useWatchFlipOrderPlaced.Parameters<config> = {}) {\n  const { enabled = true, onFlipOrderPlaced, ...rest } = parameters\n\n  const config = useConfig({ config: parameters.config })\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  // biome-ignore lint/correctness/useExhaustiveDependencies: rest.x is explicitly listed\n  useEffect(() => {\n    if (!enabled) return\n    if (!onFlipOrderPlaced) return\n    return Actions.dex.watchFlipOrderPlaced(config, {\n      ...rest,\n      chainId,\n      onFlipOrderPlaced,\n    })\n  }, [\n    config,\n    enabled,\n    chainId,\n    onFlipOrderPlaced,\n    rest.fromBlock,\n    rest.maker,\n    rest.onError,\n    rest.poll,\n    rest.pollingInterval,\n    rest.token,\n  ])\n}\n\nexport declare namespace useWatchFlipOrderPlaced {\n  type Parameters<config extends Config = Config> = UnionCompute<\n    ExactPartial<Actions.dex.watchFlipOrderPlaced.Parameters<config>> &\n      ConfigParameter<config> & { enabled?: boolean | undefined }\n  >\n}\n\n/**\n * Hook for watching order cancellation events on the DEX.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   Hooks.dex.useWatchOrderCancelled({\n *     onOrderCancelled(args) {\n *       console.log('Order cancelled:', args)\n *     },\n *   })\n *\n *   return <div>Watching for order cancellations...</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n */\nexport function useWatchOrderCancelled<\n  config extends Config = ResolvedRegister['config'],\n>(parameters: useWatchOrderCancelled.Parameters<config> = {}) {\n  const { enabled = true, onOrderCancelled, ...rest } = parameters\n\n  const config = useConfig({ config: parameters.config })\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  // biome-ignore lint/correctness/useExhaustiveDependencies: rest.x is explicitly listed\n  useEffect(() => {\n    if (!enabled) return\n    if (!onOrderCancelled) return\n    return Actions.dex.watchOrderCancelled(config, {\n      ...rest,\n      chainId,\n      onOrderCancelled,\n    })\n  }, [\n    config,\n    enabled,\n    chainId,\n    onOrderCancelled,\n    rest.fromBlock,\n    rest.onError,\n    rest.orderId,\n    rest.poll,\n    rest.pollingInterval,\n  ])\n}\n\nexport declare namespace useWatchOrderCancelled {\n  type Parameters<config extends Config = Config> = UnionCompute<\n    ExactPartial<Actions.dex.watchOrderCancelled.Parameters<config>> &\n      ConfigParameter<config> & { enabled?: boolean | undefined }\n  >\n}\n\n/**\n * Hook for watching order filled events on the DEX.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   Hooks.dex.useWatchOrderFilled({\n *     onOrderFilled(args) {\n *       console.log('Order filled:', args)\n *     },\n *   })\n *\n *   return <div>Watching for order fills...</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n */\nexport function useWatchOrderFilled<\n  config extends Config = ResolvedRegister['config'],\n>(parameters: useWatchOrderFilled.Parameters<config> = {}) {\n  const { enabled = true, onOrderFilled, ...rest } = parameters\n\n  const config = useConfig({ config: parameters.config })\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  // biome-ignore lint/correctness/useExhaustiveDependencies: rest.x is explicitly listed\n  useEffect(() => {\n    if (!enabled) return\n    if (!onOrderFilled) return\n    return Actions.dex.watchOrderFilled(config, {\n      ...rest,\n      chainId,\n      onOrderFilled,\n    })\n  }, [\n    config,\n    enabled,\n    chainId,\n    onOrderFilled,\n    rest.fromBlock,\n    rest.maker,\n    rest.onError,\n    rest.orderId,\n    rest.poll,\n    rest.pollingInterval,\n    rest.taker,\n  ])\n}\n\nexport declare namespace useWatchOrderFilled {\n  type Parameters<config extends Config = Config> = UnionCompute<\n    ExactPartial<Actions.dex.watchOrderFilled.Parameters<config>> &\n      ConfigParameter<config> & { enabled?: boolean | undefined }\n  >\n}\n\n/**\n * Hook for watching order placement events on the DEX.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   Hooks.dex.useWatchOrderPlaced({\n *     onOrderPlaced(args) {\n *       console.log('Order placed:', args)\n *     },\n *   })\n *\n *   return <div>Watching for order placements...</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n */\nexport function useWatchOrderPlaced<\n  config extends Config = ResolvedRegister['config'],\n>(parameters: useWatchOrderPlaced.Parameters<config> = {}) {\n  const { enabled = true, onOrderPlaced, ...rest } = parameters\n\n  const config = useConfig({ config: parameters.config })\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  // biome-ignore lint/correctness/useExhaustiveDependencies: rest.x is explicitly listed\n  useEffect(() => {\n    if (!enabled) return\n    if (!onOrderPlaced) return\n    return Actions.dex.watchOrderPlaced(config, {\n      ...rest,\n      chainId,\n      onOrderPlaced,\n    })\n  }, [\n    config,\n    enabled,\n    chainId,\n    onOrderPlaced,\n    rest.fromBlock,\n    rest.maker,\n    rest.onError,\n    rest.poll,\n    rest.pollingInterval,\n    rest.token,\n  ])\n}\n\nexport declare namespace useWatchOrderPlaced {\n  type Parameters<config extends Config = Config> = UnionCompute<\n    ExactPartial<Actions.dex.watchOrderPlaced.Parameters<config>> &\n      ConfigParameter<config> & { enabled?: boolean | undefined }\n  >\n}\n"
  },
  {
    "path": "packages/react/src/tempo/hooks/faucet.ts",
    "content": "import type { UseMutationResult } from '@tanstack/react-query'\nimport type { Config, ResolvedRegister } from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport { Actions } from '@wagmi/core/tempo'\nimport { useConfig } from '../../hooks/useConfig.js'\nimport { type UseMutationParameters, useMutation } from '../../utils/query.js'\n\n/**\n * Hook for funding an account with an initial amount of set token(s)\n * on Tempo's testnet.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.faucet.useFund()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ account: '0xdeadbeef...' })}\n *       disabled={isPending}\n *     >\n *       Fund Account\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useFund<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useFund.Parameters<config, context> = {},\n): useFund.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.faucet.fund(config, variables)\n    },\n    mutationKey: ['fund'],\n  })\n}\n\nexport declare namespace useFund {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.faucet.fund.ReturnValue,\n          Actions.faucet.fund.ErrorType,\n          Actions.faucet.fund.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.faucet.fund.ReturnValue,\n    Actions.faucet.fund.ErrorType,\n    Actions.faucet.fund.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for funding an account with an initial amount of set token(s)\n * on Tempo's testnet. Returns the transaction receipts.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.faucet.useFundSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ account: '0xdeadbeef...' })}\n *       disabled={isPending}\n *     >\n *       Fund Account\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useFundSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useFundSync.Parameters<config, context> = {},\n): useFundSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.faucet.fundSync(config, variables)\n    },\n    mutationKey: ['fundSync'],\n  })\n}\n\nexport declare namespace useFundSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.faucet.fundSync.ReturnValue,\n          Actions.faucet.fundSync.ErrorType,\n          Actions.faucet.fundSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.faucet.fundSync.ReturnValue,\n    Actions.faucet.fundSync.ErrorType,\n    Actions.faucet.fundSync.Parameters<config>,\n    context\n  >\n}\n"
  },
  {
    "path": "packages/react/src/tempo/hooks/fee.test.ts",
    "content": "import { accounts, config, renderHook } from '@wagmi/test/tempo'\nimport type { Address } from 'viem'\nimport { describe, expect, test, vi } from 'vitest'\n\nimport { useConnect } from '../../hooks/useConnect.js'\nimport { useSetUserToken, useSetUserTokenSync, useUserToken } from './fee.js'\n\ndescribe('useUserToken', () => {\n  test('default', async () => {\n    const { result, rerender } = await renderHook(\n      (props) => useUserToken({ account: props?.account }),\n      { initialProps: { account: undefined as Address | undefined } },\n    )\n\n    await vi.waitFor(() => expect(result.current.fetchStatus).toBe('idle'))\n\n    expect(result.current).toMatchInlineSnapshot(`\n      {\n        \"data\": undefined,\n        \"dataUpdatedAt\": 0,\n        \"error\": null,\n        \"errorUpdateCount\": 0,\n        \"errorUpdatedAt\": 0,\n        \"failureCount\": 0,\n        \"failureReason\": null,\n        \"fetchStatus\": \"idle\",\n        \"isError\": false,\n        \"isFetched\": false,\n        \"isFetchedAfterMount\": false,\n        \"isFetching\": false,\n        \"isInitialLoading\": false,\n        \"isLoading\": false,\n        \"isLoadingError\": false,\n        \"isPaused\": false,\n        \"isPending\": true,\n        \"isPlaceholderData\": false,\n        \"isRefetchError\": false,\n        \"isRefetching\": false,\n        \"isStale\": false,\n        \"isSuccess\": false,\n        \"queryKey\": [\n          \"getUserToken\",\n          {\n            \"account\": undefined,\n            \"chainId\": 1337,\n          },\n        ],\n        \"refetch\": [Function],\n        \"status\": \"pending\",\n      }\n    `)\n\n    rerender({ account: accounts[0].address })\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy(), {\n      timeout: 10_000,\n    })\n\n    expect(result.current).toMatchInlineSnapshot(`\n      {\n        \"data\": {\n          \"address\": \"0x20C0000000000000000000000000000000000001\",\n          \"id\": 1n,\n        },\n        \"dataUpdatedAt\": 1675209600000,\n        \"error\": null,\n        \"errorUpdateCount\": 0,\n        \"errorUpdatedAt\": 0,\n        \"failureCount\": 0,\n        \"failureReason\": null,\n        \"fetchStatus\": \"idle\",\n        \"isError\": false,\n        \"isFetched\": true,\n        \"isFetchedAfterMount\": true,\n        \"isFetching\": false,\n        \"isInitialLoading\": false,\n        \"isLoading\": false,\n        \"isLoadingError\": false,\n        \"isPaused\": false,\n        \"isPending\": false,\n        \"isPlaceholderData\": false,\n        \"isRefetchError\": false,\n        \"isRefetching\": false,\n        \"isStale\": true,\n        \"isSuccess\": true,\n        \"queryKey\": [\n          \"getUserToken\",\n          {\n            \"account\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n            \"chainId\": 1337,\n          },\n        ],\n        \"refetch\": [Function],\n        \"status\": \"success\",\n      }\n    `)\n  })\n})\n\ndescribe('useSetUserToken', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      setUserToken: useSetUserToken(),\n    }))\n\n    await result.current.connect.connectAsync({\n      connector: config.connectors[0]!,\n    })\n\n    const hash = await result.current.setUserToken.mutateAsync({\n      token: '0x20C0000000000000000000000000000000000001',\n    })\n    expect(hash).toBeDefined()\n\n    await vi.waitFor(() =>\n      expect(result.current.setUserToken.isSuccess).toBeTruthy(),\n    )\n  })\n})\n\ndescribe('useSetUserTokenSync', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      setUserToken: useSetUserTokenSync(),\n    }))\n\n    await result.current.connect.connectAsync({\n      connector: config.connectors[0]!,\n    })\n\n    const data = await result.current.setUserToken.mutateAsync({\n      token: '0x20C0000000000000000000000000000000000001',\n    })\n    expect(data).toBeDefined()\n\n    await vi.waitFor(() =>\n      expect(result.current.setUserToken.isSuccess).toBeTruthy(),\n    )\n  })\n})\n"
  },
  {
    "path": "packages/react/src/tempo/hooks/fee.ts",
    "content": "import type { UseMutationResult } from '@tanstack/react-query'\nimport type { Config, ResolvedRegister } from '@wagmi/core'\nimport type {\n  ConfigParameter,\n  ExactPartial,\n  UnionCompute,\n} from '@wagmi/core/internal'\nimport { Actions } from '@wagmi/core/tempo'\nimport { useEffect } from 'react'\nimport { useChainId } from '../../hooks/useChainId.js'\nimport { useConfig } from '../../hooks/useConfig.js'\nimport {\n  type UseMutationParameters,\n  type UseQueryReturnType,\n  useMutation,\n  useQuery,\n} from '../../utils/query.js'\nimport type { QueryParameter } from '../utils.js'\n\n/**\n * Hook for getting the user's default fee token.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { data, isLoading } = Hooks.fee.useUserToken({\n *     account: '0x20c...0055',\n *   })\n *\n *   if (isLoading) return <div>Loading...</div>\n *   return <div>Token: {data?.address}</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Query result with token address and ID.\n */\nexport function useUserToken<\n  config extends Config = ResolvedRegister['config'],\n  selectData = Actions.fee.getUserToken.ReturnValue,\n>(\n  parameters: useUserToken.Parameters<config, selectData>,\n): useUserToken.ReturnValue<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = Actions.fee.getUserToken.queryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  } as never)\n  return useQuery(options) as never\n}\n\nexport declare namespace useUserToken {\n  export type Parameters<\n    config extends Config = ResolvedRegister['config'],\n    selectData = Actions.fee.getUserToken.ReturnValue,\n  > = ConfigParameter<config> &\n    QueryParameter<\n      Actions.fee.getUserToken.ReturnValue,\n      Actions.fee.getUserToken.ErrorType,\n      selectData,\n      Actions.fee.getUserToken.QueryKey<config>\n    > &\n    ExactPartial<Actions.fee.getUserToken.Parameters<config>>\n\n  export type ReturnValue<selectData = Actions.fee.getUserToken.ReturnValue> =\n    UseQueryReturnType<selectData, Error>\n}\n\n/**\n * Hook for setting the user's default fee token.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.fee.useSetUserToken()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ token: '0x20c...0055' })}\n *       disabled={isPending}\n *     >\n *       Set Token\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useSetUserToken<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useSetUserToken.Parameters<config, context> = {},\n): useSetUserToken.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.fee.setUserToken(config, variables as never)\n    },\n    mutationKey: ['setUserToken'],\n  }) as never\n}\n\nexport declare namespace useSetUserToken {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.fee.setUserToken.ReturnValue,\n          Actions.fee.setUserToken.ErrorType,\n          Actions.fee.setUserToken.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.fee.setUserToken.ReturnValue,\n    Actions.fee.setUserToken.ErrorType,\n    Actions.fee.setUserToken.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for setting the user's default fee token.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.fee.useSetUserTokenSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ token: '0x20c...0055' })}\n *       disabled={isPending}\n *     >\n *       Set Token\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useSetUserTokenSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useSetUserTokenSync.Parameters<config, context> = {},\n): useSetUserTokenSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.fee.setUserTokenSync(config, variables as never)\n    },\n    mutationKey: ['setUserTokenSync'],\n  }) as never\n}\n\nexport declare namespace useSetUserTokenSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.fee.setUserTokenSync.ReturnValue,\n          Actions.fee.setUserTokenSync.ErrorType,\n          Actions.fee.setUserTokenSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.fee.setUserTokenSync.ReturnValue,\n    Actions.fee.setUserTokenSync.ErrorType,\n    Actions.fee.setUserTokenSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for watching user token set events.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   Hooks.fee.useWatchSetUserToken({\n *     onUserTokenSet(args) {\n *       console.log('User token set:', args)\n *     },\n *   })\n *\n *   return <div>Watching for user token changes...</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n */\nexport function useWatchSetUserToken<\n  config extends Config = ResolvedRegister['config'],\n>(parameters: useWatchSetUserToken.Parameters<config> = {}) {\n  const { enabled = true, onUserTokenSet, ...rest } = parameters\n\n  const config = useConfig({ config: parameters.config })\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  // biome-ignore lint/correctness/useExhaustiveDependencies: rest.x is explicitly listed\n  useEffect(() => {\n    if (!enabled) return\n    if (!onUserTokenSet) return\n    return Actions.fee.watchSetUserToken(config, {\n      ...rest,\n      chainId,\n      onUserTokenSet,\n    })\n  }, [\n    config,\n    enabled,\n    chainId,\n    onUserTokenSet,\n    rest.fromBlock,\n    rest.onError,\n    rest.poll,\n    rest.pollingInterval,\n  ])\n}\n\nexport declare namespace useWatchSetUserToken {\n  type Parameters<config extends Config = Config> = UnionCompute<\n    ExactPartial<Actions.fee.watchSetUserToken.Parameters<config>> &\n      ConfigParameter<config> & { enabled?: boolean | undefined }\n  >\n}\n"
  },
  {
    "path": "packages/react/src/tempo/hooks/index.ts",
    "content": "/** biome-ignore-all lint/performance/noReExportAll: entrypoint */\n// biome-ignore lint/performance/noBarrelFile: stable\nexport * as amm from './amm.js'\nexport * as dex from './dex.js'\nexport * as faucet from './faucet.js'\nexport * as fee from './fee.js'\nexport * as nonce from './nonce.js'\nexport * as policy from './policy.js'\nexport * as reward from './reward.js'\nexport * as token from './token.js'\n"
  },
  {
    "path": "packages/react/src/tempo/hooks/nonce.test.ts",
    "content": "import { accounts, renderHook, restart } from '@wagmi/test/tempo'\nimport type { Address } from 'viem'\nimport { beforeEach, describe, expect, test, vi } from 'vitest'\n\nimport * as nonce from './nonce.js'\nimport * as token from './token.js'\n\nconst account = accounts[0]\nconst account2 = accounts[1]\n\nbeforeEach(async () => {\n  await restart()\n})\n\ndescribe('useNonce', () => {\n  test('default', async () => {\n    const { result, rerender } = await renderHook(\n      (props) =>\n        nonce.useNonce({\n          account: props?.account,\n          nonceKey: props?.nonceKey,\n        }),\n      {\n        initialProps: {\n          account: undefined as Address | undefined,\n          nonceKey: undefined as bigint | undefined,\n        },\n      },\n    )\n\n    await vi.waitFor(() => expect(result.current.fetchStatus).toBe('idle'))\n\n    // Should be disabled when account is undefined\n    expect(result.current.data).toBeUndefined()\n    expect(result.current.isPending).toBe(true)\n    // expect(result.current.isEnabled).toBe(false)\n\n    // Set account and nonceKey\n    rerender({ account: account.address, nonceKey: 1n })\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy(), {\n      timeout: 10_000,\n    })\n\n    // Should now be enabled and have data\n    // expect(result.current.isEnabled).toBe(true)\n    expect(result.current.data).toBe(0n)\n  })\n\n  test('reactivity: account parameter', async () => {\n    const { result, rerender } = await renderHook(\n      (props) => nonce.useNonce({ account: props?.account, nonceKey: 1n }),\n      { initialProps: { account: undefined as Address | undefined } },\n    )\n\n    await vi.waitFor(() => expect(result.current.fetchStatus).toBe('idle'))\n\n    // Should be disabled when account is undefined\n    // expect(result.current.isEnabled).toBe(false)\n\n    // Set account\n    rerender({ account: account.address })\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy(), {\n      timeout: 10_000,\n    })\n\n    // expect(result.current.isEnabled).toBe(true)\n    expect(result.current.data).toBe(0n)\n  })\n\n  test('reactivity: nonceKey parameter', async () => {\n    const { result, rerender } = await renderHook(\n      (props) =>\n        nonce.useNonce({\n          account: account.address,\n          nonceKey: props?.nonceKey,\n        }),\n      { initialProps: { nonceKey: undefined as bigint | undefined } },\n    )\n\n    await vi.waitFor(() => expect(result.current.fetchStatus).toBe('idle'))\n\n    // Should be disabled when nonceKey is undefined\n    // expect(result.current.isEnabled).toBe(false)\n\n    // Set nonceKey\n    rerender({ nonceKey: 1n })\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy(), {\n      timeout: 10_000,\n    })\n\n    // expect(result.current.isEnabled).toBe(true)\n    expect(result.current.data).toBe(0n)\n  })\n})\n\ndescribe('useWatchNonceIncremented', () => {\n  test('default', async () => {\n    const { result: connectResult } = await renderHook(() => ({\n      transferSync: token.useTransferSync(),\n    }))\n\n    const events: any[] = []\n    await renderHook(() =>\n      nonce.useWatchNonceIncremented({\n        onNonceIncremented(args) {\n          events.push(args)\n        },\n        args: {\n          account: account.address,\n          nonceKey: 5n,\n        },\n      }),\n    )\n\n    // Have to manually set nonce because eth_FillTransaction does not support nonce keys\n    await connectResult.current.transferSync.mutateAsync({\n      to: account2.address,\n      amount: 1n,\n      token: 1n,\n      nonceKey: 5n,\n      nonce: 0,\n    })\n\n    await connectResult.current.transferSync.mutateAsync({\n      to: account2.address,\n      amount: 1n,\n      token: 1n,\n      nonceKey: 5n,\n      nonce: 1,\n    })\n\n    await vi.waitUntil(() => events.length >= 2)\n\n    expect(events).toHaveLength(2)\n    expect(events[0]?.account).toBe(account.address)\n    expect(events[0]?.nonceKey).toBe(5n)\n    expect(events[0]?.newNonce).toBe(1n)\n    expect(events[1]?.newNonce).toBe(2n)\n  })\n})\n"
  },
  {
    "path": "packages/react/src/tempo/hooks/nonce.ts",
    "content": "import type { Config, ResolvedRegister } from '@wagmi/core'\nimport type {\n  ConfigParameter,\n  ExactPartial,\n  UnionCompute,\n} from '@wagmi/core/internal'\nimport { Actions } from '@wagmi/core/tempo'\nimport { useEffect } from 'react'\nimport { useChainId } from '../../hooks/useChainId.js'\nimport { useConfig } from '../../hooks/useConfig.js'\nimport { type UseQueryReturnType, useQuery } from '../../utils/query.js'\nimport type { QueryParameter } from '../utils.js'\n\n/**\n * Hook for getting the nonce for an account and nonce key.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { data, isLoading } = Hooks.nonce.useNonce({\n *     account: '0x...',\n *     nonceKey: 1n,\n *   })\n *\n *   if (isLoading) return <div>Loading...</div>\n *   return <div>Nonce: {data?.toString()}</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Query result with nonce value.\n */\nexport function useNonce<\n  config extends Config = ResolvedRegister['config'],\n  selectData = Actions.nonce.getNonce.ReturnValue,\n>(\n  parameters: useNonce.Parameters<config, selectData> = {},\n): useNonce.ReturnValue<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = Actions.nonce.getNonce.queryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  } as never)\n  return useQuery(options) as never\n}\n\nexport declare namespace useNonce {\n  export type Parameters<\n    config extends Config = ResolvedRegister['config'],\n    selectData = Actions.nonce.getNonce.ReturnValue,\n  > = ConfigParameter<config> &\n    QueryParameter<\n      Actions.nonce.getNonce.ReturnValue,\n      Actions.nonce.getNonce.ErrorType,\n      selectData,\n      Actions.nonce.getNonce.QueryKey<config>\n    > &\n    ExactPartial<Actions.nonce.getNonce.Parameters<config>>\n\n  export type ReturnValue<selectData = Actions.nonce.getNonce.ReturnValue> =\n    UseQueryReturnType<selectData, Error>\n}\n\n/**\n * Hook for watching nonce incremented events.\n *\n * @deprecated This function has been deprecated post-AllegroModerato. It will be removed in a future version.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   Hooks.nonce.useWatchNonceIncremented({\n *     onNonceIncremented(args, log) {\n *       console.log('Nonce incremented:', args)\n *     },\n *   })\n *\n *   return <div>Watching for nonce increments...</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n */\nexport function useWatchNonceIncremented<\n  config extends Config = ResolvedRegister['config'],\n>(parameters: useWatchNonceIncremented.Parameters<config> = {}) {\n  const { enabled = true, onNonceIncremented, ...rest } = parameters\n\n  const config = useConfig({ config: parameters.config })\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  // biome-ignore lint/correctness/useExhaustiveDependencies: rest.x is explicitly listed\n  useEffect(() => {\n    if (!enabled) return\n    if (!onNonceIncremented) return\n    return Actions.nonce.watchNonceIncremented(config, {\n      ...rest,\n      chainId,\n      onNonceIncremented,\n    })\n  }, [\n    config,\n    enabled,\n    chainId,\n    onNonceIncremented,\n    rest.fromBlock,\n    rest.onError,\n    rest.poll,\n    rest.pollingInterval,\n  ])\n}\n\nexport declare namespace useWatchNonceIncremented {\n  type Parameters<config extends Config = Config> = UnionCompute<\n    ExactPartial<Actions.nonce.watchNonceIncremented.Parameters<config>> &\n      ConfigParameter<config> & { enabled?: boolean | undefined }\n  >\n}\n"
  },
  {
    "path": "packages/react/src/tempo/hooks/policy.test.ts",
    "content": "import { Actions } from '@wagmi/core/tempo'\nimport { accounts, config, queryClient, renderHook } from '@wagmi/test/tempo'\nimport type { Address } from 'viem'\nimport { describe, expect, test, vi } from 'vitest'\n\nimport { useConnect } from '../../hooks/useConnect.js'\nimport * as policy from './policy.js'\n\nconst account = accounts[0]\nconst account2 = accounts[1]\n\ndescribe('useCreate', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: policy.useCreateSync(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // create whitelist policy\n    const { receipt, ...createResult } =\n      await result.current.createSync.mutateAsync({\n        type: 'whitelist',\n      })\n    expect(receipt).toBeDefined()\n    expect(createResult).toMatchInlineSnapshot(`\n      {\n        \"policyId\": 2n,\n        \"policyType\": 0,\n        \"updater\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n      }\n    `)\n\n    const { policyId } = createResult\n\n    // verify policy was created\n    const data = await Actions.policy.getData(config, {\n      policyId,\n    })\n    expect(data.admin).toBe(account.address)\n    expect(data.type).toBe('whitelist')\n  })\n\n  test('behavior: blacklist', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: policy.useCreateSync(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // create blacklist policy\n    const { receipt: blacklistReceipt, ...blacklistResult } =\n      await result.current.createSync.mutateAsync({\n        type: 'blacklist',\n      })\n    expect(blacklistReceipt).toBeDefined()\n    expect(blacklistResult).toMatchInlineSnapshot(`\n      {\n        \"policyId\": 3n,\n        \"policyType\": 1,\n        \"updater\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n      }\n    `)\n\n    const { policyId } = blacklistResult\n\n    // verify policy was created\n    const data = await Actions.policy.getData(config, {\n      policyId,\n    })\n    expect(data.admin).toBe(account.address)\n    expect(data.type).toBe('blacklist')\n  })\n})\n\ndescribe('useSetAdmin', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: policy.useCreateSync(),\n      setAdminSync: policy.useSetAdminSync(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // create policy\n    const { policyId } = await result.current.createSync.mutateAsync({\n      type: 'whitelist',\n    })\n\n    // set new admin\n    const { receipt: setAdminReceipt, ...setAdminResult } =\n      await result.current.setAdminSync.mutateAsync({\n        policyId,\n        admin: account2.address,\n      })\n    expect(setAdminReceipt).toBeDefined()\n    expect(setAdminResult).toMatchInlineSnapshot(`\n      {\n        \"admin\": \"0x8C8d35429F74ec245F8Ef2f4Fd1e551cFF97d650\",\n        \"policyId\": 4n,\n        \"updater\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n      }\n    `)\n\n    {\n      // verify new admin\n      const data = await Actions.policy.getData(config, { policyId })\n      expect(data.admin).toBe(account2.address)\n    }\n  })\n})\n\ndescribe('useModifyWhitelist', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: policy.useCreateSync(),\n      modifyWhitelistSync: policy.useModifyWhitelistSync(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // create whitelist policy\n    const { policyId } = await result.current.createSync.mutateAsync({\n      type: 'whitelist',\n    })\n\n    // verify account2 is not authorized\n    {\n      const isAuthorized = await Actions.policy.isAuthorized(config, {\n        policyId,\n        user: account2.address,\n      })\n      expect(isAuthorized).toBe(false)\n    }\n\n    // add account2 to whitelist\n    const { receipt: addReceipt, ...addResult } =\n      await result.current.modifyWhitelistSync.mutateAsync({\n        policyId,\n        address: account2.address,\n        allowed: true,\n      })\n    expect(addReceipt).toBeDefined()\n    expect(addResult).toMatchInlineSnapshot(`\n      {\n        \"account\": \"0x8C8d35429F74ec245F8Ef2f4Fd1e551cFF97d650\",\n        \"allowed\": true,\n        \"policyId\": 5n,\n        \"updater\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n      }\n    `)\n\n    // verify account2 is authorized\n    {\n      const isAuthorized = await Actions.policy.isAuthorized(config, {\n        policyId,\n        user: account2.address,\n      })\n      expect(isAuthorized).toBe(true)\n    }\n\n    // remove account2 from whitelist\n    const { receipt: removeReceipt, ...removeResult } =\n      await result.current.modifyWhitelistSync.mutateAsync({\n        policyId,\n        address: account2.address,\n        allowed: false,\n      })\n    expect(removeReceipt).toBeDefined()\n    expect(removeResult).toMatchInlineSnapshot(`\n      {\n        \"account\": \"0x8C8d35429F74ec245F8Ef2f4Fd1e551cFF97d650\",\n        \"allowed\": false,\n        \"policyId\": 5n,\n        \"updater\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n      }\n    `)\n\n    // verify account2 is no longer authorized\n    {\n      const isAuthorized = await Actions.policy.isAuthorized(config, {\n        policyId,\n        user: account2.address,\n      })\n      expect(isAuthorized).toBe(false)\n    }\n  })\n})\n\ndescribe('useModifyBlacklist', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: policy.useCreateSync(),\n      modifyBlacklistSync: policy.useModifyBlacklistSync(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // create blacklist policy\n    const { policyId } = await result.current.createSync.mutateAsync({\n      type: 'blacklist',\n    })\n\n    // verify account2 is authorized (not blacklisted)\n    {\n      const isAuthorized = await Actions.policy.isAuthorized(config, {\n        policyId,\n        user: account2.address,\n      })\n      expect(isAuthorized).toBe(true)\n    }\n\n    // add account2 to blacklist\n    const { receipt: addBlacklistReceipt, ...addBlacklistResult } =\n      await result.current.modifyBlacklistSync.mutateAsync({\n        policyId,\n        address: account2.address,\n        restricted: true,\n      })\n    expect(addBlacklistReceipt).toBeDefined()\n    expect(addBlacklistResult).toMatchInlineSnapshot(`\n      {\n        \"account\": \"0x8C8d35429F74ec245F8Ef2f4Fd1e551cFF97d650\",\n        \"policyId\": 6n,\n        \"restricted\": true,\n        \"updater\": \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\",\n      }\n    `)\n\n    // verify account2 is not authorized (blacklisted)\n    {\n      const isAuthorized = await Actions.policy.isAuthorized(config, {\n        policyId,\n        user: account2.address,\n      })\n      expect(isAuthorized).toBe(false)\n    }\n\n    // remove account2 from blacklist\n    const removeResult = await result.current.modifyBlacklistSync.mutateAsync({\n      policyId,\n      address: account2.address,\n      restricted: false,\n    })\n\n    expect(removeResult.receipt).toBeDefined()\n    expect(removeResult.policyId).toBe(policyId)\n    expect(removeResult.account).toBe(account2.address)\n    expect(removeResult.restricted).toBe(false)\n    expect(removeResult.updater).toBe(account.address)\n\n    // verify account2 is authorized again\n    {\n      const isAuthorized = await Actions.policy.isAuthorized(config, {\n        policyId,\n        user: account2.address,\n      })\n      expect(isAuthorized).toBe(true)\n    }\n  })\n})\n\ndescribe('useData', () => {\n  test('default', async () => {\n    const { result: setupResult } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: policy.useCreateSync(),\n    }))\n\n    await setupResult.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // create policy\n    const { policyId } = await setupResult.current.createSync.mutateAsync({\n      type: 'whitelist',\n    })\n\n    {\n      // get policy data\n      const { result } = await renderHook(() => policy.useData({ policyId }))\n\n      await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n      expect(result.current.data?.admin).toBe(account.address)\n      expect(result.current.data?.type).toBe('whitelist')\n    }\n  })\n\n  test('behavior: blacklist', async () => {\n    const { result: setupResult } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: policy.useCreateSync(),\n    }))\n\n    await setupResult.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // create blacklist policy\n    const { policyId } = await setupResult.current.createSync.mutateAsync({\n      type: 'blacklist',\n    })\n\n    {\n      // get policy data\n      const { result } = await renderHook(() => policy.useData({ policyId }))\n\n      await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n      expect(result.current.data?.admin).toBe(account.address)\n      expect(result.current.data?.type).toBe('blacklist')\n    }\n  })\n\n  test('reactivity: policyId parameter', async () => {\n    const { result: setupResult } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: policy.useCreateSync(),\n    }))\n\n    await setupResult.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create policy\n    const { policyId } = await setupResult.current.createSync.mutateAsync({\n      type: 'whitelist',\n    })\n\n    // Query with undefined policyId initially\n    const { result, rerender } = await renderHook(\n      (props) => policy.useData({ policyId: props?.policyId }),\n      { initialProps: { policyId: undefined as bigint | undefined } },\n    )\n\n    await vi.waitFor(() => expect(result.current.fetchStatus).toBe('idle'))\n\n    // Should be disabled when policyId is undefined\n    expect(result.current.data).toBeUndefined()\n    expect(result.current.isPending).toBe(true)\n    // expect(result.current.isEnabled).toBe(false)\n\n    // Set policyId\n    rerender({ policyId })\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    // Should now be enabled and have data\n    // expect(result.current.isEnabled).toBe(true)\n    expect(result.current.data?.admin).toBe(account.address)\n    expect(result.current.data?.type).toBe('whitelist')\n  })\n\n  describe('queryOptions', () => {\n    test('default', async () => {\n      const { result: setupResult } = await renderHook(() => ({\n        connect: useConnect(),\n        createSync: policy.useCreateSync(),\n      }))\n\n      await setupResult.current.connect.mutateAsync({\n        connector: config.connectors[0]!,\n      })\n\n      // create policy\n      const { policyId } = await setupResult.current.createSync.mutateAsync({\n        type: 'whitelist',\n      })\n\n      const options = Actions.policy.getData.queryOptions(config, { policyId })\n      const data = await queryClient.fetchQuery(options)\n\n      expect(data.admin).toBe(account.address)\n      expect(data.type).toBe('whitelist')\n    })\n  })\n})\n\ndescribe('useIsAuthorized', () => {\n  test('special policy: always-reject (policyId 0)', async () => {\n    const { result } = await renderHook(() =>\n      policy.useIsAuthorized({\n        policyId: 0n,\n        user: account.address,\n      }),\n    )\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    expect(result.current.data).toBe(false)\n  })\n\n  test('special policy: always-allow (policyId 1)', async () => {\n    const { result } = await renderHook(() =>\n      policy.useIsAuthorized({\n        policyId: 1n,\n        user: account.address,\n      }),\n    )\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    expect(result.current.data).toBe(true)\n  })\n\n  test('reactivity: policyId and user parameters', async () => {\n    const { result: setupResult } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: policy.useCreateSync(),\n      modifyWhitelistSync: policy.useModifyWhitelistSync(),\n    }))\n\n    await setupResult.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create whitelist policy\n    const { policyId } = await setupResult.current.createSync.mutateAsync({\n      type: 'whitelist',\n    })\n\n    // Add account2 to whitelist\n    await setupResult.current.modifyWhitelistSync.mutateAsync({\n      policyId,\n      address: account2.address,\n      allowed: true,\n    })\n\n    // Query with undefined parameters initially\n    const { result, rerender } = await renderHook(\n      (props) =>\n        policy.useIsAuthorized({\n          policyId: props?.policyId,\n          user: props?.user,\n        }),\n      {\n        initialProps: {\n          policyId: undefined as bigint | undefined,\n          user: undefined as Address | undefined,\n        },\n      },\n    )\n\n    await vi.waitFor(() => expect(result.current.fetchStatus).toBe('idle'))\n\n    // Should be disabled when parameters are undefined\n    expect(result.current.data).toBeUndefined()\n    expect(result.current.isPending).toBe(true)\n    // expect(result.current.isEnabled).toBe(false)\n\n    // Set parameters\n    rerender({ policyId, user: account2.address })\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    // Should now be enabled and have data\n    // expect(result.current.isEnabled).toBe(true)\n    expect(result.current.data).toBe(true)\n  })\n\n  describe('queryOptions', () => {\n    test('default', async () => {\n      const options = Actions.policy.isAuthorized.queryOptions(config, {\n        policyId: 1n,\n        user: account.address,\n      })\n      const isAuthorized = await queryClient.fetchQuery(options)\n\n      expect(isAuthorized).toBe(true)\n    })\n  })\n})\n\ndescribe('useWatchCreate', () => {\n  test('default', async () => {\n    const { result: connectResult } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: policy.useCreateSync(),\n    }))\n\n    await connectResult.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    const events: any[] = []\n    await renderHook(() =>\n      policy.useWatchCreate({\n        onPolicyCreated(args) {\n          events.push(args)\n        },\n      }),\n    )\n\n    // Create policy\n    await connectResult.current.createSync.mutateAsync({\n      type: 'whitelist',\n    })\n\n    await vi.waitUntil(() => events.length >= 1)\n\n    expect(events.length).toBeGreaterThanOrEqual(1)\n    expect(events[0]?.policyId).toBeDefined()\n    expect(events[0]?.updater).toBe(account.address)\n    expect(events[0]?.type).toBe('whitelist')\n  })\n})\n\ndescribe('useWatchAdminUpdated', () => {\n  test('default', async () => {\n    const { result: connectResult } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: policy.useCreateSync(),\n      setAdminSync: policy.useSetAdminSync(),\n    }))\n\n    await connectResult.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create policy\n    const { policyId } = await connectResult.current.createSync.mutateAsync({\n      type: 'whitelist',\n    })\n\n    const events: any[] = []\n    await renderHook(() =>\n      policy.useWatchAdminUpdated({\n        onAdminUpdated(args) {\n          events.push(args)\n        },\n      }),\n    )\n\n    // Set new admin\n    await connectResult.current.setAdminSync.mutateAsync({\n      policyId,\n      admin: account2.address,\n    })\n\n    await vi.waitUntil(() => events.some((e) => e.admin === account2.address))\n\n    const event = events.find((e) => e.admin === account2.address)\n    expect(event).toBeDefined()\n    expect(event?.policyId).toBe(policyId)\n    expect(event?.updater).toBe(account.address)\n  })\n})\n\ndescribe('useWatchWhitelistUpdated', () => {\n  test('default', async () => {\n    const { result: connectResult } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: policy.useCreateSync(),\n      modifyWhitelistSync: policy.useModifyWhitelistSync(),\n    }))\n\n    await connectResult.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create whitelist policy\n    const { policyId } = await connectResult.current.createSync.mutateAsync({\n      type: 'whitelist',\n    })\n\n    const events: any[] = []\n    await renderHook(() =>\n      policy.useWatchWhitelistUpdated({\n        onWhitelistUpdated(args) {\n          events.push(args)\n        },\n      }),\n    )\n\n    // Add address to whitelist\n    await connectResult.current.modifyWhitelistSync.mutateAsync({\n      policyId,\n      address: account2.address,\n      allowed: true,\n    })\n\n    // Remove address from whitelist\n    await connectResult.current.modifyWhitelistSync.mutateAsync({\n      policyId,\n      address: account2.address,\n      allowed: false,\n    })\n\n    await vi.waitUntil(() => events.length >= 2)\n\n    expect(events.length).toBeGreaterThanOrEqual(2)\n    expect(events[0]?.policyId).toBe(policyId)\n    expect(events[0]?.updater).toBe(account.address)\n    expect(events[0]?.account).toBe(account2.address)\n    expect(events[0]?.allowed).toBe(true)\n    expect(events[1]?.allowed).toBe(false)\n  })\n})\n\ndescribe('useWatchBlacklistUpdated', () => {\n  test('default', async () => {\n    const { result: connectResult } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: policy.useCreateSync(),\n      modifyBlacklistSync: policy.useModifyBlacklistSync(),\n    }))\n\n    await connectResult.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create blacklist policy\n    const { policyId } = await connectResult.current.createSync.mutateAsync({\n      type: 'blacklist',\n    })\n\n    const events: any[] = []\n    await renderHook(() =>\n      policy.useWatchBlacklistUpdated({\n        onBlacklistUpdated(args) {\n          events.push(args)\n        },\n      }),\n    )\n\n    // Add address to blacklist\n    await connectResult.current.modifyBlacklistSync.mutateAsync({\n      policyId,\n      address: account2.address,\n      restricted: true,\n    })\n\n    // Remove address from blacklist\n    await connectResult.current.modifyBlacklistSync.mutateAsync({\n      policyId,\n      address: account2.address,\n      restricted: false,\n    })\n\n    await vi.waitUntil(() => events.length >= 2)\n\n    expect(events.length).toBeGreaterThanOrEqual(2)\n    expect(events[0]?.policyId).toBe(policyId)\n    expect(events[0]?.updater).toBe(account.address)\n    expect(events[0]?.account).toBe(account2.address)\n    expect(events[0]?.restricted).toBe(true)\n    expect(events[1]?.restricted).toBe(false)\n  })\n})\n"
  },
  {
    "path": "packages/react/src/tempo/hooks/policy.ts",
    "content": "import type { UseMutationResult } from '@tanstack/react-query'\nimport type { Config, ResolvedRegister } from '@wagmi/core'\nimport type {\n  ConfigParameter,\n  ExactPartial,\n  UnionCompute,\n} from '@wagmi/core/internal'\nimport { Actions } from '@wagmi/core/tempo'\nimport { useEffect } from 'react'\nimport { useChainId } from '../../hooks/useChainId.js'\nimport { useConfig } from '../../hooks/useConfig.js'\nimport {\n  type UseMutationParameters,\n  type UseQueryReturnType,\n  useMutation,\n  useQuery,\n} from '../../utils/query.js'\nimport type { QueryParameter } from '../utils.js'\n\n/**\n * Hook for creating a new policy.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.policy.useCreate()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ type: 'whitelist' })}\n *       disabled={isPending}\n *     >\n *       Create Policy\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useCreate<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useCreate.Parameters<config, context> = {},\n): useCreate.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.policy.create(config, variables as never)\n    },\n    mutationKey: ['create'],\n  }) as never\n}\n\nexport declare namespace useCreate {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.policy.create.ReturnValue,\n          Actions.policy.create.ErrorType,\n          Actions.policy.create.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.policy.create.ReturnValue,\n    Actions.policy.create.ErrorType,\n    Actions.policy.create.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for creating a new policy.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.policy.useCreateSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ type: 'whitelist' })}\n *       disabled={isPending}\n *     >\n *       Create Policy\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useCreateSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useCreateSync.Parameters<config, context> = {},\n): useCreateSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.policy.createSync(config, variables as never)\n    },\n    mutationKey: ['createSync'],\n  }) as never\n}\n\nexport declare namespace useCreateSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.policy.createSync.ReturnValue,\n          Actions.policy.createSync.ErrorType,\n          Actions.policy.createSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.policy.createSync.ReturnValue,\n    Actions.policy.createSync.ErrorType,\n    Actions.policy.createSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for setting the admin for a policy.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.policy.useSetAdmin()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ policyId: 2n, admin: '0x...' })}\n *       disabled={isPending}\n *     >\n *       Set Admin\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useSetAdmin<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useSetAdmin.Parameters<config, context> = {},\n): useSetAdmin.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.policy.setAdmin(config, variables as never)\n    },\n    mutationKey: ['setAdmin'],\n  }) as never\n}\n\nexport declare namespace useSetAdmin {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.policy.setAdmin.ReturnValue,\n          Actions.policy.setAdmin.ErrorType,\n          Actions.policy.setAdmin.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.policy.setAdmin.ReturnValue,\n    Actions.policy.setAdmin.ErrorType,\n    Actions.policy.setAdmin.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for setting the admin for a policy.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.policy.useSetAdminSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ policyId: 2n, admin: '0x...' })}\n *       disabled={isPending}\n *     >\n *       Set Admin\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useSetAdminSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useSetAdminSync.Parameters<config, context> = {},\n): useSetAdminSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.policy.setAdminSync(config, variables as never)\n    },\n    mutationKey: ['setAdminSync'],\n  }) as never\n}\n\nexport declare namespace useSetAdminSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.policy.setAdminSync.ReturnValue,\n          Actions.policy.setAdminSync.ErrorType,\n          Actions.policy.setAdminSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.policy.setAdminSync.ReturnValue,\n    Actions.policy.setAdminSync.ErrorType,\n    Actions.policy.setAdminSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for modifying a policy whitelist.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.policy.useModifyWhitelist()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ policyId: 2n, address: '0x...', allowed: true })}\n *       disabled={isPending}\n *     >\n *       Add to Whitelist\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useModifyWhitelist<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useModifyWhitelist.Parameters<config, context> = {},\n): useModifyWhitelist.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.policy.modifyWhitelist(config, variables as never)\n    },\n    mutationKey: ['modifyWhitelist'],\n  }) as never\n}\n\nexport declare namespace useModifyWhitelist {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.policy.modifyWhitelist.ReturnValue,\n          Actions.policy.modifyWhitelist.ErrorType,\n          Actions.policy.modifyWhitelist.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.policy.modifyWhitelist.ReturnValue,\n    Actions.policy.modifyWhitelist.ErrorType,\n    Actions.policy.modifyWhitelist.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for modifying a policy whitelist.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.policy.useModifyWhitelistSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ policyId: 2n, address: '0x...', allowed: true })}\n *       disabled={isPending}\n *     >\n *       Add to Whitelist\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useModifyWhitelistSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useModifyWhitelistSync.Parameters<config, context> = {},\n): useModifyWhitelistSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.policy.modifyWhitelistSync(config, variables as never)\n    },\n    mutationKey: ['modifyWhitelistSync'],\n  }) as never\n}\n\nexport declare namespace useModifyWhitelistSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.policy.modifyWhitelistSync.ReturnValue,\n          Actions.policy.modifyWhitelistSync.ErrorType,\n          Actions.policy.modifyWhitelistSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.policy.modifyWhitelistSync.ReturnValue,\n    Actions.policy.modifyWhitelistSync.ErrorType,\n    Actions.policy.modifyWhitelistSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for modifying a policy blacklist.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.policy.useModifyBlacklist()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ policyId: 2n, address: '0x...', restricted: true })}\n *       disabled={isPending}\n *     >\n *       Add to Blacklist\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useModifyBlacklist<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useModifyBlacklist.Parameters<config, context> = {},\n): useModifyBlacklist.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.policy.modifyBlacklist(config, variables as never)\n    },\n    mutationKey: ['modifyBlacklist'],\n  }) as never\n}\n\nexport declare namespace useModifyBlacklist {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.policy.modifyBlacklist.ReturnValue,\n          Actions.policy.modifyBlacklist.ErrorType,\n          Actions.policy.modifyBlacklist.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.policy.modifyBlacklist.ReturnValue,\n    Actions.policy.modifyBlacklist.ErrorType,\n    Actions.policy.modifyBlacklist.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for modifying a policy blacklist.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.policy.useModifyBlacklistSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ policyId: 2n, address: '0x...', restricted: true })}\n *       disabled={isPending}\n *     >\n *       Add to Blacklist\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useModifyBlacklistSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useModifyBlacklistSync.Parameters<config, context> = {},\n): useModifyBlacklistSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.policy.modifyBlacklistSync(config, variables as never)\n    },\n    mutationKey: ['modifyBlacklistSync'],\n  }) as never\n}\n\nexport declare namespace useModifyBlacklistSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.policy.modifyBlacklistSync.ReturnValue,\n          Actions.policy.modifyBlacklistSync.ErrorType,\n          Actions.policy.modifyBlacklistSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.policy.modifyBlacklistSync.ReturnValue,\n    Actions.policy.modifyBlacklistSync.ErrorType,\n    Actions.policy.modifyBlacklistSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for getting policy data.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { data, isLoading } = Hooks.policy.useData({\n *     policyId: 2n,\n *   })\n *\n *   if (isLoading) return <div>Loading...</div>\n *   return <div>Admin: {data?.admin}</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Query result with policy data.\n */\nexport function useData<\n  config extends Config = ResolvedRegister['config'],\n  selectData = Actions.policy.getData.ReturnValue,\n>(\n  parameters: useData.Parameters<config, selectData> = {},\n): useData.ReturnValue<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = Actions.policy.getData.queryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  } as never)\n  return useQuery(options) as never\n}\n\nexport declare namespace useData {\n  export type Parameters<\n    config extends Config = ResolvedRegister['config'],\n    selectData = Actions.policy.getData.ReturnValue,\n  > = ConfigParameter<config> &\n    QueryParameter<\n      Actions.policy.getData.ReturnValue,\n      Actions.policy.getData.ErrorType,\n      selectData,\n      Actions.policy.getData.QueryKey<config>\n    > &\n    ExactPartial<Actions.policy.getData.Parameters<config>>\n\n  export type ReturnValue<selectData = Actions.policy.getData.ReturnValue> =\n    UseQueryReturnType<selectData, Error>\n}\n\n/**\n * Hook for checking if a user is authorized by a policy.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { data, isLoading } = Hooks.policy.useIsAuthorized({\n *     policyId: 2n,\n *     user: '0x...',\n *   })\n *\n *   if (isLoading) return <div>Loading...</div>\n *   return <div>Authorized: {data ? 'Yes' : 'No'}</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Query result with authorization status.\n */\nexport function useIsAuthorized<\n  config extends Config = ResolvedRegister['config'],\n  selectData = Actions.policy.isAuthorized.ReturnValue,\n>(\n  parameters: useIsAuthorized.Parameters<config, selectData> = {},\n): useIsAuthorized.ReturnValue<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = Actions.policy.isAuthorized.queryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  } as never)\n  return useQuery(options) as never\n}\n\nexport declare namespace useIsAuthorized {\n  export type Parameters<\n    config extends Config = ResolvedRegister['config'],\n    selectData = Actions.policy.isAuthorized.ReturnValue,\n  > = ConfigParameter<config> &\n    QueryParameter<\n      Actions.policy.isAuthorized.ReturnValue,\n      Actions.policy.isAuthorized.ErrorType,\n      selectData,\n      Actions.policy.isAuthorized.QueryKey<config>\n    > &\n    ExactPartial<Actions.policy.isAuthorized.Parameters<config>>\n\n  export type ReturnValue<\n    selectData = Actions.policy.isAuthorized.ReturnValue,\n  > = UseQueryReturnType<selectData, Error>\n}\n\n/**\n * Hook for watching policy creation events.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   Hooks.policy.useWatchCreate({\n *     onPolicyCreated(args) {\n *       console.log('Policy created:', args)\n *     },\n *   })\n *\n *   return <div>Watching for policy creation...</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n */\nexport function useWatchCreate<\n  config extends Config = ResolvedRegister['config'],\n>(parameters: useWatchCreate.Parameters<config> = {}) {\n  const { enabled = true, onPolicyCreated, ...rest } = parameters\n\n  const config = useConfig({ config: parameters.config })\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  // biome-ignore lint/correctness/useExhaustiveDependencies: rest.x is explicitly listed\n  useEffect(() => {\n    if (!enabled) return\n    if (!onPolicyCreated) return\n    return Actions.policy.watchCreate(config, {\n      ...rest,\n      chainId,\n      onPolicyCreated,\n    })\n  }, [\n    config,\n    enabled,\n    chainId,\n    onPolicyCreated,\n    rest.fromBlock,\n    rest.onError,\n    rest.poll,\n    rest.pollingInterval,\n  ])\n}\n\nexport declare namespace useWatchCreate {\n  type Parameters<config extends Config = Config> = UnionCompute<\n    ExactPartial<Actions.policy.watchCreate.Parameters<config>> &\n      ConfigParameter<config> & { enabled?: boolean | undefined }\n  >\n}\n\n/**\n * Hook for watching policy admin update events.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   Hooks.policy.useWatchAdminUpdated({\n *     onAdminUpdated(args) {\n *       console.log('Policy admin updated:', args)\n *     },\n *   })\n *\n *   return <div>Watching for admin updates...</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n */\nexport function useWatchAdminUpdated<\n  config extends Config = ResolvedRegister['config'],\n>(parameters: useWatchAdminUpdated.Parameters<config> = {}) {\n  const { enabled = true, onAdminUpdated, ...rest } = parameters\n\n  const config = useConfig({ config: parameters.config })\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  // biome-ignore lint/correctness/useExhaustiveDependencies: rest.x is explicitly listed\n  useEffect(() => {\n    if (!enabled) return\n    if (!onAdminUpdated) return\n    return Actions.policy.watchAdminUpdated(config, {\n      ...rest,\n      chainId,\n      onAdminUpdated,\n    })\n  }, [\n    config,\n    enabled,\n    chainId,\n    onAdminUpdated,\n    rest.fromBlock,\n    rest.onError,\n    rest.poll,\n    rest.pollingInterval,\n  ])\n}\n\nexport declare namespace useWatchAdminUpdated {\n  type Parameters<config extends Config = Config> = UnionCompute<\n    ExactPartial<Actions.policy.watchAdminUpdated.Parameters<config>> &\n      ConfigParameter<config> & { enabled?: boolean | undefined }\n  >\n}\n\n/**\n * Hook for watching whitelist update events.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   Hooks.policy.useWatchWhitelistUpdated({\n *     onWhitelistUpdated(args) {\n *       console.log('Whitelist updated:', args)\n *     },\n *   })\n *\n *   return <div>Watching for whitelist updates...</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n */\nexport function useWatchWhitelistUpdated<\n  config extends Config = ResolvedRegister['config'],\n>(parameters: useWatchWhitelistUpdated.Parameters<config> = {}) {\n  const { enabled = true, onWhitelistUpdated, ...rest } = parameters\n\n  const config = useConfig({ config: parameters.config })\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  // biome-ignore lint/correctness/useExhaustiveDependencies: rest.x is explicitly listed\n  useEffect(() => {\n    if (!enabled) return\n    if (!onWhitelistUpdated) return\n    return Actions.policy.watchWhitelistUpdated(config, {\n      ...rest,\n      chainId,\n      onWhitelistUpdated,\n    })\n  }, [\n    config,\n    enabled,\n    chainId,\n    onWhitelistUpdated,\n    rest.fromBlock,\n    rest.onError,\n    rest.poll,\n    rest.pollingInterval,\n  ])\n}\n\nexport declare namespace useWatchWhitelistUpdated {\n  type Parameters<config extends Config = Config> = UnionCompute<\n    ExactPartial<Actions.policy.watchWhitelistUpdated.Parameters<config>> &\n      ConfigParameter<config> & { enabled?: boolean | undefined }\n  >\n}\n\n/**\n * Hook for watching blacklist update events.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   Hooks.policy.useWatchBlacklistUpdated({\n *     onBlacklistUpdated(args) {\n *       console.log('Blacklist updated:', args)\n *     },\n *   })\n *\n *   return <div>Watching for blacklist updates...</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n */\nexport function useWatchBlacklistUpdated<\n  config extends Config = ResolvedRegister['config'],\n>(parameters: useWatchBlacklistUpdated.Parameters<config> = {}) {\n  const { enabled = true, onBlacklistUpdated, ...rest } = parameters\n\n  const config = useConfig({ config: parameters.config })\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  // biome-ignore lint/correctness/useExhaustiveDependencies: rest.x is explicitly listed\n  useEffect(() => {\n    if (!enabled) return\n    if (!onBlacklistUpdated) return\n    return Actions.policy.watchBlacklistUpdated(config, {\n      ...rest,\n      chainId,\n      onBlacklistUpdated,\n    })\n  }, [\n    config,\n    enabled,\n    chainId,\n    onBlacklistUpdated,\n    rest.fromBlock,\n    rest.onError,\n    rest.poll,\n    rest.pollingInterval,\n  ])\n}\n\nexport declare namespace useWatchBlacklistUpdated {\n  type Parameters<config extends Config = Config> = UnionCompute<\n    ExactPartial<Actions.policy.watchBlacklistUpdated.Parameters<config>> &\n      ConfigParameter<config> & { enabled?: boolean | undefined }\n  >\n}\n"
  },
  {
    "path": "packages/react/src/tempo/hooks/reward.test.ts",
    "content": "import { getConnection } from '@wagmi/core'\nimport { config, renderHook, setupToken } from '@wagmi/test/tempo'\nimport type { Address } from 'viem'\nimport { parseUnits } from 'viem'\nimport { describe, expect, test, vi } from 'vitest'\n\nimport { useConnect } from '../../hooks/useConnect.js'\nimport * as rewardHooks from './reward.js'\nimport * as tokenHooks from './token.js'\n\ndescribe('useGetGlobalRewardPerToken', () => {\n  test('default', async () => {\n    const { token } = await setupToken()\n\n    const { result } = await renderHook(() =>\n      rewardHooks.useGetGlobalRewardPerToken({\n        token,\n      }),\n    )\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    expect(result.current.data).toBe(0n)\n  })\n\n  test('reactivity: token parameter', async () => {\n    const { result, rerender } = await renderHook(\n      (props) =>\n        rewardHooks.useGetGlobalRewardPerToken({\n          token: props?.token,\n        }),\n      {\n        initialProps: {\n          token: undefined as Address | undefined,\n        },\n      },\n    )\n\n    await vi.waitFor(() => expect(result.current.fetchStatus).toBe('idle'))\n\n    // Should be disabled when token is undefined\n    expect(result.current.data).toBeUndefined()\n    expect(result.current.isPending).toBe(true)\n    // expect(result.current.isEnabled).toBe(false)\n\n    // Setup token\n    const { token } = await setupToken()\n\n    // Set token\n    rerender({ token })\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    // Should now be enabled and have data\n    // expect(result.current.isEnabled).toBe(true)\n    expect(result.current.data).toBe(0n)\n  })\n})\n\ndescribe('useUserRewardInfo', () => {\n  test('default', async () => {\n    const { token } = await setupToken()\n\n    const account = getConnection(config).address\n\n    const { result } = await renderHook(() =>\n      rewardHooks.useUserRewardInfo({\n        token,\n        account,\n      }),\n    )\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    expect(result.current.data?.rewardRecipient).toBeDefined()\n    expect(result.current.data?.rewardPerToken).toBeDefined()\n    expect(result.current.data?.rewardBalance).toBeDefined()\n  })\n\n  test('reactivity: account and token parameters', async () => {\n    const { result, rerender } = await renderHook(\n      (props) =>\n        rewardHooks.useUserRewardInfo({\n          token: props?.token,\n          account: props?.account,\n        }),\n      {\n        initialProps: {\n          token: undefined as Address | undefined,\n          account: undefined as Address | undefined,\n        },\n      },\n    )\n\n    await vi.waitFor(() => expect(result.current.fetchStatus).toBe('idle'))\n\n    // Should be disabled when both token and account are undefined\n    expect(result.current.data).toBeUndefined()\n    expect(result.current.isPending).toBe(true)\n    // expect(result.current.isEnabled).toBe(false)\n\n    // Setup token (this also connects the account)\n    const { token } = await setupToken()\n\n    // Set token only (account still undefined)\n    rerender({ token, account: undefined })\n\n    await vi.waitFor(() => expect(result.current.fetchStatus).toBe('idle'))\n\n    // Should still be disabled when account is undefined\n    expect(result.current.data).toBeUndefined()\n    expect(result.current.isPending).toBe(true)\n    // expect(result.current.isEnabled).toBe(false)\n\n    // Get account from config (already connected by setupToken)\n    const account = getConnection(config).address\n\n    // Set both token and account\n    rerender({ token, account })\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    // Should now be enabled and have data\n    // expect(result.current.isEnabled).toBe(true)\n    expect(result.current.data?.rewardRecipient).toBeDefined()\n    expect(result.current.data?.rewardPerToken).toBeDefined()\n    expect(result.current.data?.rewardBalance).toBeDefined()\n  })\n})\n\ndescribe('useSetRecipientSync', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      setRecipient: rewardHooks.useSetRecipientSync(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    const { token } = await setupToken()\n\n    await result.current.setRecipient.mutateAsync({\n      recipient: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n      token,\n    })\n\n    await vi.waitFor(() =>\n      expect(result.current.setRecipient.isSuccess).toBeTruthy(),\n    )\n  })\n})\n\ndescribe('useWatchRewardDistributed', () => {\n  test('default', async () => {\n    const { result: connectResult } = await renderHook(() => ({\n      connect: useConnect(),\n      grantRolesSync: tokenHooks.useGrantRolesSync(),\n      mintSync: tokenHooks.useMintSync(),\n      setRecipientSync: rewardHooks.useSetRecipientSync(),\n      distributeSync: rewardHooks.useDistributeSync(),\n    }))\n\n    await connectResult.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    const { token: tokenAddr } = await setupToken()\n\n    const account = getConnection(config).address\n\n    await connectResult.current.grantRolesSync.mutateAsync({\n      token: tokenAddr,\n      roles: ['issuer'],\n      to: account!,\n    })\n\n    const rewardAmount = parseUnits('100', 6)\n    await connectResult.current.mintSync.mutateAsync({\n      token: tokenAddr,\n      to: account!,\n      amount: rewardAmount,\n    })\n\n    await connectResult.current.setRecipientSync.mutateAsync({\n      token: tokenAddr,\n      recipient: account!,\n    })\n\n    const events: any[] = []\n    await renderHook(() =>\n      rewardHooks.useWatchRewardDistributed({\n        token: tokenAddr,\n        onRewardDistributed(args) {\n          events.push(args)\n        },\n      }),\n    )\n\n    await connectResult.current.distributeSync.mutateAsync({\n      token: tokenAddr,\n      amount: rewardAmount,\n    })\n\n    await vi.waitUntil(() => events.length >= 1)\n\n    expect(events.length).toBeGreaterThanOrEqual(1)\n    expect(events[0]?.amount).toBe(rewardAmount)\n    expect(events[0]?.funder).toBe(account)\n  })\n})\n\ndescribe('useWatchRewardRecipientSet', () => {\n  test('default', async () => {\n    const { result: connectResult } = await renderHook(() => ({\n      connect: useConnect(),\n      setRecipientSync: rewardHooks.useSetRecipientSync(),\n    }))\n\n    await connectResult.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    const { token: tokenAddr } = await setupToken()\n\n    const account = getConnection(config).address\n\n    const events: any[] = []\n    await renderHook(() =>\n      rewardHooks.useWatchRewardRecipientSet({\n        token: tokenAddr,\n        onRewardRecipientSet(args) {\n          events.push(args)\n        },\n      }),\n    )\n\n    await connectResult.current.setRecipientSync.mutateAsync({\n      token: tokenAddr,\n      recipient: account!,\n    })\n\n    await vi.waitUntil(() => events.length >= 1)\n\n    expect(events.length).toBeGreaterThanOrEqual(1)\n    expect(events[0]?.holder).toBe(account)\n    expect(events[0]?.recipient).toBe(account)\n  })\n})\n"
  },
  {
    "path": "packages/react/src/tempo/hooks/reward.ts",
    "content": "import type { UseMutationResult } from '@tanstack/react-query'\nimport type { Config, ResolvedRegister } from '@wagmi/core'\nimport type {\n  ConfigParameter,\n  ExactPartial,\n  UnionCompute,\n} from '@wagmi/core/internal'\nimport { Actions } from '@wagmi/core/tempo'\nimport { useEffect } from 'react'\nimport { useChainId } from '../../hooks/useChainId.js'\nimport { useConfig } from '../../hooks/useConfig.js'\nimport {\n  type UseMutationParameters,\n  type UseQueryReturnType,\n  useMutation,\n  useQuery,\n} from '../../utils/query.js'\nimport type { QueryParameter } from '../utils.js'\n\n/**\n * Hook for claiming accumulated rewards.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate: claim } = Hooks.reward.useClaim()\n *\n *   return (\n *     <button onClick={() => claim({\n *       token: '0x20c0000000000000000000000000000000000001'\n *     })}>\n *       Claim Rewards\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useClaim<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useClaim.Parameters<config, context> = {},\n): useClaim.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.reward.claim(config, variables as never)\n    },\n    mutationKey: ['claim'],\n  }) as never\n}\n\nexport declare namespace useClaim {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.reward.claim.ReturnValue,\n          Actions.reward.claim.ErrorType,\n          Actions.reward.claim.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.reward.claim.ReturnValue,\n    Actions.reward.claim.ErrorType,\n    Actions.reward.claim.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for claiming accumulated rewards and waiting for confirmation.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate: claimSync } = Hooks.reward.useClaimSync()\n *\n *   return (\n *     <button onClick={() => claimSync({\n *       token: '0x20c0000000000000000000000000000000000001'\n *     })}>\n *       Claim Rewards\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useClaimSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useClaimSync.Parameters<config, context> = {},\n): useClaimSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.reward.claimSync(config, variables as never)\n    },\n    mutationKey: ['claimSync'],\n  }) as never\n}\n\nexport declare namespace useClaimSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.reward.claimSync.ReturnValue,\n          Actions.reward.claimSync.ErrorType,\n          Actions.reward.claimSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.reward.claimSync.ReturnValue,\n    Actions.reward.claimSync.ErrorType,\n    Actions.reward.claimSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for getting the global reward per token value.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { data, isLoading } = Hooks.reward.useGetGlobalRewardPerToken({\n *     token: '0x20c0000000000000000000000000000000000001',\n *   })\n *\n *   if (isLoading) return <div>Loading...</div>\n *   return <div>Value: {data?.toString()}</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Query result with global reward per token value.\n */\nexport function useGetGlobalRewardPerToken<\n  config extends Config = ResolvedRegister['config'],\n  selectData = Actions.reward.getGlobalRewardPerToken.ReturnValue,\n>(\n  parameters: useGetGlobalRewardPerToken.Parameters<config, selectData> = {},\n): useGetGlobalRewardPerToken.ReturnValue<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = Actions.reward.getGlobalRewardPerToken.queryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  } as never)\n  return useQuery(options) as never\n}\n\nexport declare namespace useGetGlobalRewardPerToken {\n  export type Parameters<\n    config extends Config = ResolvedRegister['config'],\n    selectData = Actions.reward.getGlobalRewardPerToken.ReturnValue,\n  > = ConfigParameter<config> &\n    QueryParameter<\n      Actions.reward.getGlobalRewardPerToken.ReturnValue,\n      Actions.reward.getGlobalRewardPerToken.ErrorType,\n      selectData,\n      Actions.reward.getGlobalRewardPerToken.QueryKey<config>\n    > &\n    ExactPartial<Actions.reward.getGlobalRewardPerToken.Parameters<config>>\n\n  export type ReturnValue<\n    selectData = Actions.reward.getGlobalRewardPerToken.ReturnValue,\n  > = UseQueryReturnType<selectData, Error>\n}\n\n/**\n * Hook for getting the reward information for a specific account.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { data, isLoading } = Hooks.reward.useUserRewardInfo({\n *     token: '0x20c0000000000000000000000000000000000001',\n *     account: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n *   })\n *\n *   if (isLoading) return <div>Loading...</div>\n *   return (\n *     <div>\n *       <div>Recipient: {data?.rewardRecipient}</div>\n *       <div>Reward per token: {data?.rewardPerToken.toString()}</div>\n *       <div>Reward balance: {data?.rewardBalance.toString()}</div>\n *     </div>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Query result with reward information (recipient, rewardPerToken, rewardBalance).\n */\nexport function useUserRewardInfo<\n  config extends Config = ResolvedRegister['config'],\n  selectData = Actions.reward.getUserRewardInfo.ReturnValue,\n>(\n  parameters: useUserRewardInfo.Parameters<config, selectData> = {},\n): useUserRewardInfo.ReturnValue<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = Actions.reward.getUserRewardInfo.queryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  } as never)\n  return useQuery(options) as never\n}\n\nexport declare namespace useUserRewardInfo {\n  export type Parameters<\n    config extends Config = ResolvedRegister['config'],\n    selectData = Actions.reward.getUserRewardInfo.ReturnValue,\n  > = ConfigParameter<config> &\n    QueryParameter<\n      Actions.reward.getUserRewardInfo.ReturnValue,\n      Actions.reward.getUserRewardInfo.ErrorType,\n      selectData,\n      Actions.reward.getUserRewardInfo.QueryKey<config>\n    > &\n    ExactPartial<Actions.reward.getUserRewardInfo.Parameters<config>>\n\n  export type ReturnValue<\n    selectData = Actions.reward.getUserRewardInfo.ReturnValue,\n  > = UseQueryReturnType<selectData, Error>\n}\n\n/**\n * Hook for setting the reward recipient for a token holder.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate: setRecipient } = Hooks.reward.useSetRecipient()\n *\n *   return (\n *     <button onClick={() => setRecipient({\n *       recipient: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n *       token: '0x20c0000000000000000000000000000000000001',\n *     })}>\n *       Set Recipient\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useSetRecipient<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useSetRecipient.Parameters<config, context> = {},\n): useSetRecipient.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.reward.setRecipient(config, variables as never)\n    },\n    mutationKey: ['setRecipient'],\n  }) as never\n}\n\nexport declare namespace useSetRecipient {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.reward.setRecipient.ReturnValue,\n          Actions.reward.setRecipient.ErrorType,\n          Actions.reward.setRecipient.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.reward.setRecipient.ReturnValue,\n    Actions.reward.setRecipient.ErrorType,\n    Actions.reward.setRecipient.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for setting the reward recipient and waiting for confirmation.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate: setRecipientSync } = Hooks.reward.useSetRecipientSync()\n *\n *   return (\n *     <button onClick={() => setRecipientSync({\n *       recipient: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n *       token: '0x20c0000000000000000000000000000000000001',\n *     })}>\n *       Set Recipient\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useSetRecipientSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useSetRecipientSync.Parameters<config, context> = {},\n): useSetRecipientSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.reward.setRecipientSync(config, variables as never)\n    },\n    mutationKey: ['setRecipientSync'],\n  }) as never\n}\n\nexport declare namespace useSetRecipientSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.reward.setRecipientSync.ReturnValue,\n          Actions.reward.setRecipientSync.ErrorType,\n          Actions.reward.setRecipientSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.reward.setRecipientSync.ReturnValue,\n    Actions.reward.setRecipientSync.ErrorType,\n    Actions.reward.setRecipientSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for distributing rewards.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate: distribute } = Hooks.reward.useDistribute()\n *\n *   return (\n *     <button onClick={() => distribute({\n *       amount: 100000000000000000000n,\n *       seconds: 86400,\n *       token: '0x20c0000000000000000000000000000000000001',\n *     })}>\n *       Start Reward\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useDistribute<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useDistribute.Parameters<config, context> = {},\n): useDistribute.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.reward.distribute(config, variables as never)\n    },\n    mutationKey: ['distribute'],\n  }) as never\n}\n\nexport declare namespace useDistribute {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.reward.distribute.ReturnValue,\n          Actions.reward.distribute.ErrorType,\n          Actions.reward.distribute.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.reward.distribute.ReturnValue,\n    Actions.reward.distribute.ErrorType,\n    Actions.reward.distribute.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for distributing rewards and waiting for confirmation.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate: distributeSync } = Hooks.reward.useDistributeSync()\n *\n *   return (\n *     <button onClick={() => distributeSync({\n *       amount: 100000000000000000000n,\n *       seconds: 86400,\n *       token: '0x20c0000000000000000000000000000000000001',\n *     })}>\n *       Start Reward\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useDistributeSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useDistributeSync.Parameters<config, context> = {},\n): useDistributeSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.reward.distributeSync(config, variables as never)\n    },\n    mutationKey: ['distributeSync'],\n  }) as never\n}\n\nexport declare namespace useDistributeSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.reward.distributeSync.ReturnValue,\n          Actions.reward.distributeSync.ErrorType,\n          Actions.reward.distributeSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.reward.distributeSync.ReturnValue,\n    Actions.reward.distributeSync.ErrorType,\n    Actions.reward.distributeSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for watching reward distributed events.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   Hooks.reward.useWatchRewardDistributed({\n *     token: '0x20c0000000000000000000000000000000000001',\n *     onRewardDistributed(args) {\n *       console.log('Reward distributed:', args)\n *     },\n *   })\n *\n *   return <div>Watching for reward distributed events...</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n */\nexport function useWatchRewardDistributed<\n  config extends Config = ResolvedRegister['config'],\n>(parameters: useWatchRewardDistributed.Parameters<config> = {}) {\n  const { enabled = true, onRewardDistributed, token, ...rest } = parameters\n\n  const config = useConfig({ config: parameters.config })\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  // biome-ignore lint/correctness/useExhaustiveDependencies: rest.x is explicitly listed\n  useEffect(() => {\n    if (!enabled) return\n    if (!onRewardDistributed) return\n    if (!token) return\n    return Actions.reward.watchRewardDistributed(config, {\n      ...rest,\n      chainId,\n      onRewardDistributed,\n      token,\n    })\n  }, [\n    config,\n    enabled,\n    chainId,\n    token,\n    onRewardDistributed,\n    rest.fromBlock,\n    rest.onError,\n    rest.poll,\n    rest.pollingInterval,\n  ])\n}\n\nexport declare namespace useWatchRewardDistributed {\n  type Parameters<config extends Config = Config> = UnionCompute<\n    ExactPartial<Actions.reward.watchRewardDistributed.Parameters<config>> &\n      ConfigParameter<config> & { enabled?: boolean | undefined }\n  >\n}\n\n/**\n * Hook for watching reward recipient set events.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   Hooks.reward.useWatchRewardRecipientSet({\n *     token: '0x20c0000000000000000000000000000000000001',\n *     onRewardRecipientSet(args) {\n *       console.log('Reward recipient set:', args)\n *     },\n *   })\n *\n *   return <div>Watching for reward recipient set events...</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n */\nexport function useWatchRewardRecipientSet<\n  config extends Config = ResolvedRegister['config'],\n>(parameters: useWatchRewardRecipientSet.Parameters<config> = {}) {\n  const { enabled = true, onRewardRecipientSet, token, ...rest } = parameters\n\n  const config = useConfig({ config: parameters.config })\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  // biome-ignore lint/correctness/useExhaustiveDependencies: rest.x is explicitly listed\n  useEffect(() => {\n    if (!enabled) return\n    if (!onRewardRecipientSet) return\n    if (!token) return\n    return Actions.reward.watchRewardRecipientSet(config, {\n      ...rest,\n      chainId,\n      onRewardRecipientSet,\n      token,\n    })\n  }, [\n    config,\n    enabled,\n    chainId,\n    token,\n    onRewardRecipientSet,\n    rest.fromBlock,\n    rest.onError,\n    rest.poll,\n    rest.pollingInterval,\n  ])\n}\n\nexport declare namespace useWatchRewardRecipientSet {\n  type Parameters<config extends Config = Config> = UnionCompute<\n    ExactPartial<Actions.reward.watchRewardRecipientSet.Parameters<config>> &\n      ConfigParameter<config> & { enabled?: boolean | undefined }\n  >\n}\n"
  },
  {
    "path": "packages/react/src/tempo/hooks/token.test.ts",
    "content": "import { accounts, addresses, config, renderHook } from '@wagmi/test/tempo'\nimport { type Address, parseUnits } from 'viem'\nimport { describe, expect, test, vi } from 'vitest'\n\nimport { useConnect } from '../../hooks/useConnect.js'\nimport * as hooks from './token.js'\n\nconst account = accounts[0]\nconst account2 = accounts[1]\n\ndescribe('useGetAllowance', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() =>\n      hooks.useGetAllowance({\n        account: account.address,\n        spender: account2.address,\n        token: addresses.alphaUsd,\n      }),\n    )\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy(), {\n      timeout: 5000,\n    })\n\n    expect(result.current.data).toBeDefined()\n    expect(typeof result.current.data).toBe('bigint')\n  })\n\n  test('reactivity: account parameter', async () => {\n    const { result, rerender } = await renderHook(\n      (props) =>\n        hooks.useGetAllowance({\n          account: props?.account,\n          spender: props?.spender,\n          token: addresses.alphaUsd,\n        }),\n      {\n        initialProps: {\n          account: undefined as Address | undefined,\n          spender: undefined as Address | undefined,\n        },\n      },\n    )\n\n    await vi.waitFor(() => expect(result.current.fetchStatus).toBe('idle'))\n\n    // Should be disabled when account or spender is undefined\n    expect(result.current.data).toBeUndefined()\n    expect(result.current.isPending).toBe(true)\n    // expect(result.current.isEnabled).toBe(false)\n\n    // Set account but not spender\n    rerender({ account: account.address, spender: undefined })\n\n    await vi.waitFor(() => expect(result.current.fetchStatus).toBe('idle'))\n\n    // Still disabled when spender is undefined\n    // expect(result.current.isEnabled).toBe(false)\n\n    // Set spender\n    rerender({ account: account.address, spender: account2.address })\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    // Should now be enabled and have data\n    // expect(result.current.isEnabled).toBe(true)\n    expect(result.current.data).toBeDefined()\n    expect(typeof result.current.data).toBe('bigint')\n  })\n})\n\ndescribe('useGetBalance', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() =>\n      hooks.useGetBalance({\n        account: account.address,\n        token: addresses.alphaUsd,\n      }),\n    )\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    expect(result.current.data).toBeDefined()\n    expect(typeof result.current.data).toBe('bigint')\n    expect(result.current.data).toBeGreaterThan(0n)\n  })\n\n  test('reactivity: account parameter', async () => {\n    const { result, rerender } = await renderHook(\n      (props) =>\n        hooks.useGetBalance({\n          account: props?.account,\n          token: addresses.alphaUsd,\n        }),\n      {\n        initialProps: {\n          account: undefined as Address | undefined,\n        },\n      },\n    )\n\n    await vi.waitFor(() => expect(result.current.fetchStatus).toBe('idle'))\n\n    // Should be disabled when account is undefined\n    expect(result.current.data).toBeUndefined()\n    expect(result.current.isPending).toBe(true)\n    // expect(result.current.isEnabled).toBe(false)\n\n    // Set account\n    rerender({ account: account.address })\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    // Should now be enabled and have data\n    // expect(result.current.isEnabled).toBe(true)\n    expect(result.current.data).toBeDefined()\n    expect(typeof result.current.data).toBe('bigint')\n    expect(result.current.data).toBeGreaterThan(0n)\n  })\n})\n\ndescribe('useGetMetadata', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() =>\n      hooks.useGetMetadata({\n        token: addresses.alphaUsd,\n      }),\n    )\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    expect(result.current.data).toBeDefined()\n    expect(result.current.data?.name).toBeDefined()\n    expect(result.current.data?.symbol).toBeDefined()\n    expect(result.current.data?.decimals).toBeDefined()\n  })\n})\n\ndescribe('useGetRoleAdmin', () => {\n  test('default', async () => {\n    const { result: connectResult } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: hooks.useCreateSync(),\n    }))\n\n    await connectResult.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create a token where we're the admin\n    const createData = await connectResult.current.createSync.mutateAsync({\n      currency: 'USD',\n      name: 'GetRoleAdmin Hook Test',\n      symbol: 'GRAHTEST',\n    })\n\n    const { result } = await renderHook(() =>\n      hooks.useGetRoleAdmin({\n        token: createData.token,\n        role: 'issuer',\n      }),\n    )\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    expect(result.current.data).toBeDefined()\n    expect(typeof result.current.data).toBe('string')\n  })\n})\n\ndescribe('useHasRole', () => {\n  test('default', async () => {\n    const { result: connectResult } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: hooks.useCreateSync(),\n    }))\n\n    await connectResult.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create a token where we're the admin\n    const createData = await connectResult.current.createSync.mutateAsync({\n      currency: 'USD',\n      name: 'HasRole Hook Test',\n      symbol: 'HRHTEST',\n    })\n\n    const { result } = await renderHook(() =>\n      hooks.useHasRole({\n        account: account.address,\n        token: createData.token,\n        role: 'defaultAdmin',\n      }),\n    )\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    expect(result.current.data).toBe(true)\n  })\n\n  test('reactivity: account parameter', async () => {\n    const { result: connectResult } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: hooks.useCreateSync(),\n    }))\n\n    await connectResult.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create a token where we're the admin\n    const createData = await connectResult.current.createSync.mutateAsync({\n      currency: 'USD',\n      name: 'HasRole Hook Reactivity Test',\n      symbol: 'HRHRTEST',\n    })\n\n    const { result, rerender } = await renderHook(\n      (props) =>\n        hooks.useHasRole({\n          account: props?.account,\n          token: createData.token,\n          role: 'defaultAdmin',\n        }),\n      {\n        initialProps: {\n          account: undefined as Address | undefined,\n        },\n      },\n    )\n\n    await vi.waitFor(() => expect(result.current.fetchStatus).toBe('idle'))\n\n    // Should be disabled when account is undefined\n    expect(result.current.data).toBeUndefined()\n    expect(result.current.isPending).toBe(true)\n    // expect(result.current.isEnabled).toBe(false)\n\n    // Set account\n    rerender({ account: account.address })\n\n    await vi.waitFor(() => expect(result.current.isSuccess).toBeTruthy())\n\n    // Should now be enabled and have data\n    // expect(result.current.isEnabled).toBe(true)\n    expect(result.current.data).toBe(true)\n  })\n})\n\ndescribe('useApproveSync', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      approve: hooks.useApproveSync(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    const data = await result.current.approve.mutateAsync({\n      spender: account2.address,\n      amount: parseUnits('100', 6),\n      token: addresses.alphaUsd,\n    })\n    expect(data).toBeDefined()\n    expect(data.receipt).toBeDefined()\n\n    await vi.waitFor(() =>\n      expect(result.current.approve.isSuccess).toBeTruthy(),\n    )\n  })\n})\n\ndescribe('useBurnSync', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: hooks.useCreateSync(),\n      grantRolesSync: hooks.useGrantRolesSync(),\n      mintSync: hooks.useMintSync(),\n      burn: hooks.useBurnSync(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await result.current.createSync.mutateAsync({\n      currency: 'USD',\n      name: 'Burnable Hook Token Sync',\n      symbol: 'BURNHOOKSYNC',\n    })\n\n    // Grant issuer role\n    await result.current.grantRolesSync.mutateAsync({\n      token: tokenAddr,\n      roles: ['issuer'],\n      to: account.address,\n    })\n\n    // Mint some tokens\n    await result.current.mintSync.mutateAsync({\n      token: tokenAddr,\n      to: account.address,\n      amount: parseUnits('1000', 6),\n    })\n\n    const data = await result.current.burn.mutateAsync({\n      token: tokenAddr,\n      amount: parseUnits('1', 6),\n    })\n    expect(data).toBeDefined()\n    expect(data.receipt).toBeDefined()\n\n    await vi.waitFor(() => expect(result.current.burn.isSuccess).toBeTruthy())\n  })\n})\n\ndescribe('useChangeTransferPolicySync', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: hooks.useCreateSync(),\n      changeTransferPolicy: hooks.useChangeTransferPolicySync(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await result.current.createSync.mutateAsync({\n      currency: 'USD',\n      name: 'Policy Hook Token Sync',\n      symbol: 'POLICYHOOKSYNC',\n    })\n\n    const data = await result.current.changeTransferPolicy.mutateAsync({\n      token: tokenAddr,\n      policyId: 0n,\n    })\n    expect(data).toBeDefined()\n    expect(data.receipt).toBeDefined()\n\n    await vi.waitFor(() =>\n      expect(result.current.changeTransferPolicy.isSuccess).toBeTruthy(),\n    )\n  })\n})\n\ndescribe('useCreateSync', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      create: hooks.useCreateSync(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    const data = await result.current.create.mutateAsync({\n      name: 'Hook Test Token Sync',\n      symbol: 'HOOKTESTSYNC',\n      currency: 'USD',\n    })\n    expect(data).toBeDefined()\n    expect(data.receipt).toBeDefined()\n    expect(data.token).toBeDefined()\n    expect(data.name).toBe('Hook Test Token Sync')\n\n    await vi.waitFor(() => expect(result.current.create.isSuccess).toBeTruthy())\n  })\n})\n\ndescribe('useUpdateQuoteTokenSync', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: hooks.useCreateSync(),\n      prepareUpdateQuoteTokenSync: hooks.usePrepareUpdateQuoteTokenSync(),\n      updateQuoteToken: hooks.useUpdateQuoteTokenSync(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create quote token\n    const { token: quoteToken } = await result.current.createSync.mutateAsync({\n      currency: 'USD',\n      name: 'Finalize Quote Hook Sync',\n      symbol: 'FQHOOKSYNC',\n    })\n\n    // Create main token\n    const { token: tokenAddr } = await result.current.createSync.mutateAsync({\n      currency: 'USD',\n      name: 'Finalize Main Hook Sync',\n      symbol: 'FMHOOKSYNC',\n    })\n\n    // Prepare quote token update first\n    await result.current.prepareUpdateQuoteTokenSync.mutateAsync({\n      token: tokenAddr,\n      quoteToken,\n    })\n\n    const data = await result.current.updateQuoteToken.mutateAsync({\n      token: tokenAddr,\n    })\n    expect(data).toBeDefined()\n    expect(data.receipt).toBeDefined()\n\n    await vi.waitFor(() =>\n      expect(result.current.updateQuoteToken.isSuccess).toBeTruthy(),\n    )\n  })\n})\n\ndescribe('useGrantRoles', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: hooks.useCreateSync(),\n      grantRoles: hooks.useGrantRoles(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await result.current.createSync.mutateAsync({\n      currency: 'USD',\n      name: 'Grant Hook Token',\n      symbol: 'GRANTHOOK',\n    })\n\n    const hash = await result.current.grantRoles.mutateAsync({\n      token: tokenAddr,\n      roles: ['issuer'],\n      to: account2.address,\n    })\n    expect(hash).toBeDefined()\n\n    await vi.waitFor(() =>\n      expect(result.current.grantRoles.isSuccess).toBeTruthy(),\n    )\n  })\n})\n\ndescribe('useGrantRolesSync', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: hooks.useCreateSync(),\n      grantRoles: hooks.useGrantRolesSync(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await result.current.createSync.mutateAsync({\n      currency: 'USD',\n      name: 'Grant Hook Token Sync',\n      symbol: 'GRANTHOOKSYNC',\n    })\n\n    const data = await result.current.grantRoles.mutateAsync({\n      token: tokenAddr,\n      roles: ['issuer'],\n      to: account2.address,\n    })\n    expect(data).toBeDefined()\n    expect(data.receipt).toBeDefined()\n    expect(data.value).toBeDefined()\n\n    await vi.waitFor(() =>\n      expect(result.current.grantRoles.isSuccess).toBeTruthy(),\n    )\n  })\n})\n\ndescribe('useMintSync', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: hooks.useCreateSync(),\n      grantRolesSync: hooks.useGrantRolesSync(),\n      mint: hooks.useMintSync(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await result.current.createSync.mutateAsync({\n      currency: 'USD',\n      name: 'Mint Hook Token Sync',\n      symbol: 'MINTHOOKSYNC',\n    })\n\n    // Grant issuer role\n    await result.current.grantRolesSync.mutateAsync({\n      token: tokenAddr,\n      roles: ['issuer'],\n      to: account.address,\n    })\n\n    const data = await result.current.mint.mutateAsync({\n      token: tokenAddr,\n      to: account.address,\n      amount: parseUnits('100', 6),\n    })\n    expect(data).toBeDefined()\n    expect(data.receipt).toBeDefined()\n\n    await vi.waitFor(() => expect(result.current.mint.isSuccess).toBeTruthy())\n  })\n})\n\ndescribe('usePauseSync', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: hooks.useCreateSync(),\n      grantRolesSync: hooks.useGrantRolesSync(),\n      pause: hooks.usePauseSync(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await result.current.createSync.mutateAsync({\n      currency: 'USD',\n      name: 'Pause Hook Token Sync',\n      symbol: 'PAUSEHOOKSYNC',\n    })\n\n    // Grant pause role\n    await result.current.grantRolesSync.mutateAsync({\n      token: tokenAddr,\n      roles: ['pause'],\n      to: account.address,\n    })\n\n    const data = await result.current.pause.mutateAsync({\n      token: tokenAddr,\n    })\n    expect(data).toBeDefined()\n    expect(data.receipt).toBeDefined()\n\n    await vi.waitFor(() => expect(result.current.pause.isSuccess).toBeTruthy())\n  })\n})\n\ndescribe('useRenounceRolesSync', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: hooks.useCreateSync(),\n      grantRolesSync: hooks.useGrantRolesSync(),\n      renounceRoles: hooks.useRenounceRolesSync(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await result.current.createSync.mutateAsync({\n      currency: 'USD',\n      name: 'Renounce Hook Token Sync',\n      symbol: 'RENOUNCEHOOKSYNC',\n    })\n\n    // Grant issuer role to ourselves\n    await result.current.grantRolesSync.mutateAsync({\n      token: tokenAddr,\n      roles: ['issuer'],\n      to: account.address,\n    })\n\n    const data = await result.current.renounceRoles.mutateAsync({\n      token: tokenAddr,\n      roles: ['issuer'],\n    })\n    expect(data).toBeDefined()\n    expect(data.receipt).toBeDefined()\n    expect(data.value).toBeDefined()\n\n    await vi.waitFor(() =>\n      expect(result.current.renounceRoles.isSuccess).toBeTruthy(),\n    )\n  })\n})\n\ndescribe('useRevokeRolesSync', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: hooks.useCreateSync(),\n      grantRolesSync: hooks.useGrantRolesSync(),\n      revokeRoles: hooks.useRevokeRolesSync(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await result.current.createSync.mutateAsync({\n      currency: 'USD',\n      name: 'Revoke Hook Token Sync',\n      symbol: 'REVOKEHOOKSYNC',\n    })\n\n    // Grant issuer role to account2\n    await result.current.grantRolesSync.mutateAsync({\n      token: tokenAddr,\n      roles: ['issuer'],\n      to: account2.address,\n    })\n\n    const data = await result.current.revokeRoles.mutateAsync({\n      token: tokenAddr,\n      roles: ['issuer'],\n      from: account2.address,\n    })\n    expect(data).toBeDefined()\n    expect(data.receipt).toBeDefined()\n    expect(data.value).toBeDefined()\n\n    await vi.waitFor(() =>\n      expect(result.current.revokeRoles.isSuccess).toBeTruthy(),\n    )\n  })\n})\n\ndescribe('useSetRoleAdminSync', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: hooks.useCreateSync(),\n      setRoleAdmin: hooks.useSetRoleAdminSync(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await result.current.createSync.mutateAsync({\n      currency: 'USD',\n      name: 'Role Admin Hook Token Sync',\n      symbol: 'ROLEADMINHOOKSYNC',\n    })\n\n    const data = await result.current.setRoleAdmin.mutateAsync({\n      token: tokenAddr,\n      role: 'issuer',\n      adminRole: 'pause',\n    })\n    expect(data).toBeDefined()\n    expect(data.receipt).toBeDefined()\n\n    await vi.waitFor(() =>\n      expect(result.current.setRoleAdmin.isSuccess).toBeTruthy(),\n    )\n  })\n})\n\ndescribe('useSetSupplyCapSync', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: hooks.useCreateSync(),\n      setSupplyCap: hooks.useSetSupplyCapSync(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await result.current.createSync.mutateAsync({\n      currency: 'USD',\n      name: 'Supply Cap Hook Token Sync',\n      symbol: 'SUPPLYCAPHOOKSYNC',\n    })\n\n    const data = await result.current.setSupplyCap.mutateAsync({\n      token: tokenAddr,\n      supplyCap: parseUnits('1000000', 6),\n    })\n    expect(data).toBeDefined()\n    expect(data.receipt).toBeDefined()\n\n    await vi.waitFor(() =>\n      expect(result.current.setSupplyCap.isSuccess).toBeTruthy(),\n    )\n  })\n})\n\ndescribe('useTransferSync', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      transfer: hooks.useTransferSync(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    const data = await result.current.transfer.mutateAsync({\n      to: account2.address,\n      amount: parseUnits('1', 6),\n      token: addresses.alphaUsd,\n    })\n    expect(data).toBeDefined()\n    expect(data.receipt).toBeDefined()\n\n    await vi.waitFor(() =>\n      expect(result.current.transfer.isSuccess).toBeTruthy(),\n    )\n  })\n})\n\ndescribe('useUnpauseSync', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: hooks.useCreateSync(),\n      grantRolesSync: hooks.useGrantRolesSync(),\n      pauseSync: hooks.usePauseSync(),\n      unpause: hooks.useUnpauseSync(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } = await result.current.createSync.mutateAsync({\n      currency: 'USD',\n      name: 'Unpause Hook Token Sync',\n      symbol: 'UNPAUSEHOOKSYNC',\n    })\n\n    // Grant pause and unpause roles\n    await result.current.grantRolesSync.mutateAsync({\n      token: tokenAddr,\n      roles: ['pause', 'unpause'],\n      to: account.address,\n    })\n\n    // First pause it\n    await result.current.pauseSync.mutateAsync({\n      token: tokenAddr,\n    })\n\n    const data = await result.current.unpause.mutateAsync({\n      token: tokenAddr,\n    })\n    expect(data).toBeDefined()\n    expect(data.receipt).toBeDefined()\n\n    await vi.waitFor(() =>\n      expect(result.current.unpause.isSuccess).toBeTruthy(),\n    )\n  })\n})\n\ndescribe('usePrepareUpdateQuoteTokenSync', () => {\n  test('default', async () => {\n    const { result } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: hooks.useCreateSync(),\n      prepareUpdateQuoteToken: hooks.usePrepareUpdateQuoteTokenSync(),\n    }))\n\n    await result.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create quote token\n    const { token: quoteToken } = await result.current.createSync.mutateAsync({\n      currency: 'USD',\n      name: 'Update Quote Hook Sync',\n      symbol: 'UQHOOKSYNC',\n    })\n\n    // Create main token\n    const { token: tokenAddr } = await result.current.createSync.mutateAsync({\n      currency: 'USD',\n      name: 'Update Main Hook Sync',\n      symbol: 'UMHOOKSYNC',\n    })\n\n    const data = await result.current.prepareUpdateQuoteToken.mutateAsync({\n      token: tokenAddr,\n      quoteToken,\n    })\n    expect(data).toBeDefined()\n    expect(data.receipt).toBeDefined()\n\n    await vi.waitFor(() =>\n      expect(result.current.prepareUpdateQuoteToken.isSuccess).toBeTruthy(),\n    )\n  })\n})\n\ndescribe('useWatchAdminRole', () => {\n  test('default', async () => {\n    const { result: connectResult } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: hooks.useCreateSync(),\n      setRoleAdminSync: hooks.useSetRoleAdminSync(),\n    }))\n\n    await connectResult.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } =\n      await connectResult.current.createSync.mutateAsync({\n        currency: 'USD',\n        name: 'Watch Admin Role Hook Token',\n        symbol: 'WATCHADMINHOOK',\n      })\n\n    const events: any[] = []\n    await renderHook(() =>\n      hooks.useWatchAdminRole({\n        token: tokenAddr,\n        onRoleAdminUpdated(args) {\n          events.push(args)\n        },\n      }),\n    )\n\n    // Trigger event by setting a role admin\n    await connectResult.current.setRoleAdminSync.mutateAsync({\n      token: tokenAddr,\n      role: 'issuer',\n      adminRole: 'pause',\n    })\n\n    await vi.waitUntil(() => events.length >= 1)\n\n    expect(events.length).toBeGreaterThanOrEqual(1)\n    expect(events[0]).toBeDefined()\n  })\n})\n\ndescribe('useWatchApprove', () => {\n  test('default', async () => {\n    const { result: connectResult } = await renderHook(() => ({\n      connect: useConnect(),\n      approveSync: hooks.useApproveSync(),\n    }))\n\n    await connectResult.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    const events: any[] = []\n    await renderHook(() =>\n      hooks.useWatchApprove({\n        onApproval(args) {\n          events.push(args)\n        },\n        token: addresses.alphaUsd,\n      }),\n    )\n\n    // Trigger approval event\n    await connectResult.current.approveSync.mutateAsync({\n      spender: account2.address,\n      amount: parseUnits('50', 6),\n      token: addresses.alphaUsd,\n    })\n\n    await vi.waitUntil(() => events.length >= 1)\n\n    expect(events.length).toBeGreaterThanOrEqual(1)\n    expect(events[0]?.owner).toBe(account.address)\n    expect(events[0]?.spender).toBe(account2.address)\n    expect(events[0]?.amount).toBe(parseUnits('50', 6))\n  })\n})\n\ndescribe('useWatchBurn', () => {\n  test('default', async () => {\n    const { result: connectResult } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: hooks.useCreateSync(),\n      grantRolesSync: hooks.useGrantRolesSync(),\n      mintSync: hooks.useMintSync(),\n      burnSync: hooks.useBurnSync(),\n    }))\n\n    await connectResult.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } =\n      await connectResult.current.createSync.mutateAsync({\n        currency: 'USD',\n        name: 'Watch Burn Hook Token',\n        symbol: 'WATCHBURNHOOK',\n      })\n\n    // Grant issuer role and mint tokens\n    await connectResult.current.grantRolesSync.mutateAsync({\n      token: tokenAddr,\n      roles: ['issuer'],\n      to: account.address,\n    })\n    await connectResult.current.mintSync.mutateAsync({\n      token: tokenAddr,\n      to: account.address,\n      amount: parseUnits('1000', 6),\n    })\n\n    const events: any[] = []\n    await renderHook(() =>\n      hooks.useWatchBurn({\n        token: tokenAddr,\n        onBurn(args) {\n          events.push(args)\n        },\n      }),\n    )\n\n    // Trigger burn event\n    await connectResult.current.burnSync.mutateAsync({\n      token: tokenAddr,\n      amount: parseUnits('10', 6),\n    })\n\n    await vi.waitUntil(() => events.length >= 1)\n\n    expect(events.length).toBeGreaterThanOrEqual(1)\n    expect(events[0]?.from).toBe(account.address)\n    expect(events[0]?.amount).toBe(parseUnits('10', 6))\n  })\n})\n\ndescribe('useWatchCreate', () => {\n  test('default', async () => {\n    const { result: connectResult } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: hooks.useCreateSync(),\n    }))\n\n    await connectResult.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    const events: any[] = []\n    await renderHook(() =>\n      hooks.useWatchCreate({\n        onTokenCreated(args) {\n          events.push(args)\n        },\n      }),\n    )\n\n    // Trigger token creation event\n    await connectResult.current.createSync.mutateAsync({\n      name: 'Watch Create Hook Token',\n      symbol: 'WATCHCREATEHOOK',\n      currency: 'USD',\n    })\n\n    await vi.waitUntil(() => events.length >= 1)\n\n    expect(events.length).toBeGreaterThanOrEqual(1)\n    expect(events[0]?.name).toBe('Watch Create Hook Token')\n    expect(events[0]?.symbol).toBe('WATCHCREATEHOOK')\n    expect(events[0]?.currency).toBe('USD')\n    expect(events[0]?.admin).toBe(account.address)\n  })\n})\n\ndescribe('useWatchMint', () => {\n  test('default', async () => {\n    const { result: connectResult } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: hooks.useCreateSync(),\n      grantRolesSync: hooks.useGrantRolesSync(),\n      mintSync: hooks.useMintSync(),\n    }))\n\n    await connectResult.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } =\n      await connectResult.current.createSync.mutateAsync({\n        currency: 'USD',\n        name: 'Watch Mint Hook Token',\n        symbol: 'WATCHMINTHOOK',\n      })\n\n    // Grant issuer role\n    await connectResult.current.grantRolesSync.mutateAsync({\n      token: tokenAddr,\n      roles: ['issuer'],\n      to: account.address,\n    })\n\n    const events: any[] = []\n    await renderHook(() =>\n      hooks.useWatchMint({\n        token: tokenAddr,\n        onMint(args) {\n          events.push(args)\n        },\n      }),\n    )\n\n    // Trigger mint event\n    await connectResult.current.mintSync.mutateAsync({\n      token: tokenAddr,\n      to: account.address,\n      amount: parseUnits('100', 6),\n    })\n\n    await vi.waitUntil(() => events.length >= 1)\n\n    expect(events.length).toBeGreaterThanOrEqual(1)\n    expect(events[0]?.to).toBe(account.address)\n    expect(events[0]?.amount).toBe(parseUnits('100', 6))\n  })\n})\n\ndescribe('useWatchRole', () => {\n  test('default', async () => {\n    const { result: connectResult } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: hooks.useCreateSync(),\n      grantRolesSync: hooks.useGrantRolesSync(),\n    }))\n\n    await connectResult.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create a new token\n    const { token: tokenAddr } =\n      await connectResult.current.createSync.mutateAsync({\n        currency: 'USD',\n        name: 'Watch Role Hook Token',\n        symbol: 'WATCHROLEHOOK',\n      })\n\n    const events: any[] = []\n    await renderHook(() =>\n      hooks.useWatchRole({\n        token: tokenAddr,\n        onRoleUpdated(args) {\n          events.push(args)\n        },\n      }),\n    )\n\n    // Trigger role update event by granting a role\n    await connectResult.current.grantRolesSync.mutateAsync({\n      token: tokenAddr,\n      roles: ['issuer'],\n      to: account2.address,\n    })\n\n    await vi.waitUntil(() => events.some((e) => e.account === account2.address))\n\n    const event = events.find((e) => e.account === account2.address)\n    expect(event).toBeDefined()\n    expect(event?.hasRole).toBe(true)\n    expect(event?.type).toBe('granted')\n  })\n})\n\ndescribe('useWatchTransfer', () => {\n  test('default', async () => {\n    const { result: connectResult } = await renderHook(() => ({\n      connect: useConnect(),\n      transferSync: hooks.useTransferSync(),\n    }))\n\n    await connectResult.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    const events: any[] = []\n    await renderHook(() =>\n      hooks.useWatchTransfer({\n        onTransfer(args) {\n          events.push(args)\n        },\n        token: addresses.alphaUsd,\n      }),\n    )\n\n    // Trigger transfer event\n    await connectResult.current.transferSync.mutateAsync({\n      to: account2.address,\n      amount: parseUnits('5', 6),\n      token: addresses.alphaUsd,\n    })\n\n    await vi.waitUntil(() => events.length >= 1)\n\n    expect(events.length).toBeGreaterThanOrEqual(1)\n    expect(events[0]?.from).toBe(account.address)\n    expect(events[0]?.to).toBe(account2.address)\n    expect(events[0]?.amount).toBe(parseUnits('5', 6))\n  })\n})\n\ndescribe('useWatchUpdateQuoteToken', () => {\n  test('default', async () => {\n    const { result: connectResult } = await renderHook(() => ({\n      connect: useConnect(),\n      createSync: hooks.useCreateSync(),\n      prepareUpdateQuoteTokenSync: hooks.usePrepareUpdateQuoteTokenSync(),\n    }))\n\n    await connectResult.current.connect.mutateAsync({\n      connector: config.connectors[0]!,\n    })\n\n    // Create quote token\n    const { token: quoteToken } =\n      await connectResult.current.createSync.mutateAsync({\n        currency: 'USD',\n        name: 'Watch Quote Hook Token',\n        symbol: 'WATCHQUOTEHOOK',\n      })\n\n    // Create main token\n    const { token: tokenAddr } =\n      await connectResult.current.createSync.mutateAsync({\n        currency: 'USD',\n        name: 'Watch Main Hook Token',\n        symbol: 'WATCHMAINHOOK',\n      })\n\n    const events: any[] = []\n    await renderHook(() =>\n      hooks.useWatchUpdateQuoteToken({\n        token: tokenAddr,\n        onUpdateQuoteToken(args) {\n          events.push(args)\n        },\n      }),\n    )\n\n    // Trigger prepare update quote token event\n    await connectResult.current.prepareUpdateQuoteTokenSync.mutateAsync({\n      token: tokenAddr,\n      quoteToken,\n    })\n\n    await vi.waitUntil(() => events.length >= 1)\n\n    expect(events.length).toBeGreaterThanOrEqual(1)\n    expect(events[0]?.nextQuoteToken).toBe(quoteToken)\n    expect(events[0]?.updater).toBe(account.address)\n    expect(events[0]?.completed).toBe(false)\n  })\n})\n\ndescribe.todo('useBurnBlocked')\n\ndescribe.todo('useBurnBlockedSync')\n"
  },
  {
    "path": "packages/react/src/tempo/hooks/token.ts",
    "content": "import type { UseMutationResult } from '@tanstack/react-query'\nimport type { Config, ResolvedRegister } from '@wagmi/core'\nimport type {\n  ConfigParameter,\n  ExactPartial,\n  UnionCompute,\n} from '@wagmi/core/internal'\nimport { Actions } from '@wagmi/core/tempo'\nimport { useEffect } from 'react'\nimport { useChainId } from '../../hooks/useChainId.js'\nimport { useConfig } from '../../hooks/useConfig.js'\nimport {\n  type UseMutationParameters,\n  type UseQueryReturnType,\n  useMutation,\n  useQuery,\n} from '../../utils/query.js'\nimport type { QueryParameter } from '../utils.js'\n\n/**\n * Hook for approving a spender to transfer TIP20 tokens.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useApprove()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ spender: '0x...', amount: 100n })}\n *       disabled={isPending}\n *     >\n *       Approve\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useApprove<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useApprove.Parameters<config, context> = {},\n): useApprove.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.approve(config, variables as never)\n    },\n    mutationKey: ['approve'],\n  }) as never\n}\n\nexport declare namespace useApprove {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.approve.ReturnValue,\n          Actions.token.approve.ErrorType,\n          Actions.token.approve.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.approve.ReturnValue,\n    Actions.token.approve.ErrorType,\n    Actions.token.approve.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for approving a spender to transfer TIP20 tokens.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useApproveSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ spender: '0x...', amount: 100n })}\n *       disabled={isPending}\n *     >\n *       Approve\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useApproveSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useApproveSync.Parameters<config, context> = {},\n): useApproveSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.approveSync(config, variables as never)\n    },\n    mutationKey: ['approveSync'],\n  }) as never\n}\n\nexport declare namespace useApproveSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.approveSync.ReturnValue,\n          Actions.token.approveSync.ErrorType,\n          Actions.token.approveSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.approveSync.ReturnValue,\n    Actions.token.approveSync.ErrorType,\n    Actions.token.approveSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for burning TIP20 tokens from the caller's balance.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useBurn()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ amount: 100n, token: '0x...' })}\n *       disabled={isPending}\n *     >\n *       Burn\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useBurn<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useBurn.Parameters<config, context> = {},\n): useBurn.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.burn(config, variables as never)\n    },\n    mutationKey: ['burn'],\n  }) as never\n}\n\nexport declare namespace useBurn {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.burn.ReturnValue,\n          Actions.token.burn.ErrorType,\n          Actions.token.burn.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.burn.ReturnValue,\n    Actions.token.burn.ErrorType,\n    Actions.token.burn.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for burning TIP20 tokens from the caller's balance.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useBurnSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ amount: 100n, token: '0x...' })}\n *       disabled={isPending}\n *     >\n *       Burn\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useBurnSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useBurnSync.Parameters<config, context> = {},\n): useBurnSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.burnSync(config, variables as never)\n    },\n    mutationKey: ['burnSync'],\n  }) as never\n}\n\nexport declare namespace useBurnSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.burnSync.ReturnValue,\n          Actions.token.burnSync.ErrorType,\n          Actions.token.burnSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.burnSync.ReturnValue,\n    Actions.token.burnSync.ErrorType,\n    Actions.token.burnSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for burning TIP20 tokens from a blocked address.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useBurnBlocked()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ from: '0x...', amount: 100n, token: '0x...' })}\n *       disabled={isPending}\n *     >\n *       Burn Blocked\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useBurnBlocked<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useBurnBlocked.Parameters<config, context> = {},\n): useBurnBlocked.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.burnBlocked(config, variables as never)\n    },\n    mutationKey: ['burnBlocked'],\n  }) as never\n}\n\nexport declare namespace useBurnBlocked {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.burnBlocked.ReturnValue,\n          Actions.token.burnBlocked.ErrorType,\n          Actions.token.burnBlocked.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.burnBlocked.ReturnValue,\n    Actions.token.burnBlocked.ErrorType,\n    Actions.token.burnBlocked.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for burning TIP20 tokens from a blocked address.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useBurnBlockedSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ from: '0x...', amount: 100n, token: '0x...' })}\n *       disabled={isPending}\n *     >\n *       Burn Blocked\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useBurnBlockedSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useBurnBlockedSync.Parameters<config, context> = {},\n): useBurnBlockedSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.burnBlockedSync(config, variables as never)\n    },\n    mutationKey: ['burnBlockedSync'],\n  }) as never\n}\n\nexport declare namespace useBurnBlockedSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.burnBlockedSync.ReturnValue,\n          Actions.token.burnBlockedSync.ErrorType,\n          Actions.token.burnBlockedSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.burnBlockedSync.ReturnValue,\n    Actions.token.burnBlockedSync.ErrorType,\n    Actions.token.burnBlockedSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for changing the transfer policy ID for a TIP20 token.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useChangeTransferPolicy()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ token: '0x...', policyId: 1n })}\n *       disabled={isPending}\n *     >\n *       Change Policy\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useChangeTransferPolicy<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useChangeTransferPolicy.Parameters<config, context> = {},\n): useChangeTransferPolicy.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.changeTransferPolicy(config, variables as never)\n    },\n    mutationKey: ['changeTransferPolicy'],\n  }) as never\n}\n\nexport declare namespace useChangeTransferPolicy {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.changeTransferPolicy.ReturnValue,\n          Actions.token.changeTransferPolicy.ErrorType,\n          Actions.token.changeTransferPolicy.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.changeTransferPolicy.ReturnValue,\n    Actions.token.changeTransferPolicy.ErrorType,\n    Actions.token.changeTransferPolicy.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for changing the transfer policy ID for a TIP20 token.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useChangeTransferPolicySync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ token: '0x...', policyId: 1n })}\n *       disabled={isPending}\n *     >\n *       Change Policy\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useChangeTransferPolicySync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useChangeTransferPolicySync.Parameters<config, context> = {},\n): useChangeTransferPolicySync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.changeTransferPolicySync(config, variables as never)\n    },\n    mutationKey: ['changeTransferPolicySync'],\n  }) as never\n}\n\nexport declare namespace useChangeTransferPolicySync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.changeTransferPolicySync.ReturnValue,\n          Actions.token.changeTransferPolicySync.ErrorType,\n          Actions.token.changeTransferPolicySync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.changeTransferPolicySync.ReturnValue,\n    Actions.token.changeTransferPolicySync.ErrorType,\n    Actions.token.changeTransferPolicySync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for creating a new TIP20 token.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useCreate()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ name: 'My Token', symbol: 'MTK', currency: 'USD' })}\n *       disabled={isPending}\n *     >\n *       Create Token\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useCreate<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useCreate.Parameters<config, context> = {},\n): useCreate.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.create(config, variables as never)\n    },\n    mutationKey: ['create'],\n  }) as never\n}\n\nexport declare namespace useCreate {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.create.ReturnValue,\n          Actions.token.create.ErrorType,\n          Actions.token.create.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.create.ReturnValue,\n    Actions.token.create.ErrorType,\n    Actions.token.create.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for creating a new TIP20 token.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useCreateSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ name: 'My Token', symbol: 'MTK', currency: 'USD' })}\n *       disabled={isPending}\n *     >\n *       Create Token\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useCreateSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useCreateSync.Parameters<config, context> = {},\n): useCreateSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.createSync(config, variables as never)\n    },\n    mutationKey: ['createSync'],\n  }) as never\n}\n\nexport declare namespace useCreateSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.createSync.ReturnValue,\n          Actions.token.createSync.ErrorType,\n          Actions.token.createSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.createSync.ReturnValue,\n    Actions.token.createSync.ErrorType,\n    Actions.token.createSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for updating the quote token for a TIP20 token.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useUpdateQuoteToken()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ token: '0x...' })}\n *       disabled={isPending}\n *     >\n *       Update Quote Token\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useUpdateQuoteToken<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useUpdateQuoteToken.Parameters<config, context> = {},\n): useUpdateQuoteToken.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.updateQuoteToken(config, variables as never)\n    },\n    mutationKey: ['updateQuoteToken'],\n  }) as never\n}\n\nexport declare namespace useUpdateQuoteToken {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.updateQuoteToken.ReturnValue,\n          Actions.token.updateQuoteToken.ErrorType,\n          Actions.token.updateQuoteToken.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.updateQuoteToken.ReturnValue,\n    Actions.token.updateQuoteToken.ErrorType,\n    Actions.token.updateQuoteToken.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for updating the quote token for a TIP20 token.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useUpdateQuoteTokenSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ token: '0x...' })}\n *       disabled={isPending}\n *     >\n *       Update Quote Token\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useUpdateQuoteTokenSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useUpdateQuoteTokenSync.Parameters<config, context> = {},\n): useUpdateQuoteTokenSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.updateQuoteTokenSync(config, variables as never)\n    },\n    mutationKey: ['updateQuoteTokenSync'],\n  }) as never\n}\n\nexport declare namespace useUpdateQuoteTokenSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.updateQuoteTokenSync.ReturnValue,\n          Actions.token.updateQuoteTokenSync.ErrorType,\n          Actions.token.updateQuoteTokenSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.updateQuoteTokenSync.ReturnValue,\n    Actions.token.updateQuoteTokenSync.ErrorType,\n    Actions.token.updateQuoteTokenSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for getting TIP20 token allowance.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { data, isLoading } = Hooks.token.useGetAllowance({\n *     account: '0x...',\n *     spender: '0x...',\n *   })\n *\n *   if (isLoading) return <div>Loading...</div>\n *   return <div>Allowance: {data?.toString()}</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Query result with token allowance.\n */\nexport function useGetAllowance<\n  config extends Config = ResolvedRegister['config'],\n  selectData = Actions.token.getAllowance.ReturnValue,\n>(\n  parameters: useGetAllowance.Parameters<config, selectData> = {},\n): useGetAllowance.ReturnValue<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = Actions.token.getAllowance.queryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  } as never)\n  return useQuery(options) as never\n}\n\nexport declare namespace useGetAllowance {\n  export type Parameters<\n    config extends Config = ResolvedRegister['config'],\n    selectData = Actions.token.getAllowance.ReturnValue,\n  > = ConfigParameter<config> &\n    QueryParameter<\n      Actions.token.getAllowance.ReturnValue,\n      Actions.token.getAllowance.ErrorType,\n      selectData,\n      Actions.token.getAllowance.QueryKey<config>\n    > &\n    ExactPartial<Actions.token.getAllowance.Parameters<config>>\n\n  export type ReturnValue<selectData = Actions.token.getAllowance.ReturnValue> =\n    UseQueryReturnType<selectData, Error>\n}\n\n/**\n * Hook for getting TIP20 token balance for an address.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { data, isLoading } = Hooks.token.useGetBalance({\n *     account: '0x...',\n *   })\n *\n *   if (isLoading) return <div>Loading...</div>\n *   return <div>Balance: {data?.toString()}</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Query result with token balance.\n */\nexport function useGetBalance<\n  config extends Config = ResolvedRegister['config'],\n  selectData = Actions.token.getBalance.ReturnValue,\n>(\n  parameters: useGetBalance.Parameters<config, selectData> = {},\n): useGetBalance.ReturnValue<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = Actions.token.getBalance.queryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  } as never)\n  return useQuery(options) as never\n}\n\nexport declare namespace useGetBalance {\n  export type Parameters<\n    config extends Config = ResolvedRegister['config'],\n    selectData = Actions.token.getBalance.ReturnValue,\n  > = ConfigParameter<config> &\n    QueryParameter<\n      Actions.token.getBalance.ReturnValue,\n      Actions.token.getBalance.ErrorType,\n      selectData,\n      Actions.token.getBalance.QueryKey<config>\n    > &\n    ExactPartial<Actions.token.getBalance.Parameters<config>>\n\n  export type ReturnValue<selectData = Actions.token.getBalance.ReturnValue> =\n    UseQueryReturnType<selectData, Error>\n}\n\n/**\n * Hook for getting TIP20 token metadata.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { data, isLoading } = Hooks.token.useGetMetadata({\n *     token: '0x...',\n *   })\n *\n *   if (isLoading) return <div>Loading...</div>\n *   return <div>{data?.name} ({data?.symbol})</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Query result with token metadata.\n */\nexport function useGetMetadata<\n  config extends Config = ResolvedRegister['config'],\n  selectData = Actions.token.getMetadata.ReturnValue,\n>(\n  parameters: useGetMetadata.Parameters<config, selectData> = {},\n): useGetMetadata.ReturnValue<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = Actions.token.getMetadata.queryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  } as never)\n  return useQuery(options) as never\n}\n\nexport declare namespace useGetMetadata {\n  export type Parameters<\n    config extends Config = ResolvedRegister['config'],\n    selectData = Actions.token.getMetadata.ReturnValue,\n  > = ConfigParameter<config> &\n    QueryParameter<\n      Actions.token.getMetadata.ReturnValue,\n      Actions.token.getMetadata.ErrorType,\n      selectData,\n      Actions.token.getMetadata.QueryKey<config>\n    > &\n    ExactPartial<Actions.token.getMetadata.Parameters<config>>\n\n  export type ReturnValue<selectData = Actions.token.getMetadata.ReturnValue> =\n    UseQueryReturnType<selectData, Error>\n}\n\n/**\n * Hook for getting the admin role for a specific role in a TIP20 token.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { data, isLoading } = Hooks.token.useGetRoleAdmin({\n *     role: 'issuer',\n *     token: '0x...',\n *   })\n *\n *   if (isLoading) return <div>Loading...</div>\n *   return <div>Admin Role: {data}</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Query result with admin role hash.\n */\nexport function useGetRoleAdmin<\n  config extends Config = ResolvedRegister['config'],\n  selectData = Actions.token.getRoleAdmin.ReturnValue,\n>(\n  parameters: useGetRoleAdmin.Parameters<config, selectData>,\n): useGetRoleAdmin.ReturnValue<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = Actions.token.getRoleAdmin.queryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  } as never)\n  return useQuery(options) as never\n}\n\nexport declare namespace useGetRoleAdmin {\n  export type Parameters<\n    config extends Config = ResolvedRegister['config'],\n    selectData = Actions.token.getRoleAdmin.ReturnValue,\n  > = ConfigParameter<config> &\n    QueryParameter<\n      Actions.token.getRoleAdmin.ReturnValue,\n      Actions.token.getRoleAdmin.ErrorType,\n      selectData,\n      Actions.token.getRoleAdmin.QueryKey<config>\n    > &\n    ExactPartial<Actions.token.getRoleAdmin.Parameters<config>>\n\n  export type ReturnValue<selectData = Actions.token.getRoleAdmin.ReturnValue> =\n    UseQueryReturnType<selectData, Error>\n}\n\n/**\n * Hook for granting roles for a TIP20 token.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useGrantRoles()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ token: '0x...', to: '0x...', roles: ['issuer'] })}\n *       disabled={isPending}\n *     >\n *       Grant Roles\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useGrantRoles<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useGrantRoles.Parameters<config, context> = {},\n): useGrantRoles.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.grantRoles(config, variables as never)\n    },\n    mutationKey: ['grantRoles'],\n  }) as never\n}\n\nexport declare namespace useGrantRoles {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.grantRoles.ReturnValue,\n          Actions.token.grantRoles.ErrorType,\n          Actions.token.grantRoles.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.grantRoles.ReturnValue,\n    Actions.token.grantRoles.ErrorType,\n    Actions.token.grantRoles.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for granting roles for a TIP20 token.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useGrantRolesSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ token: '0x...', to: '0x...', roles: ['issuer'] })}\n *       disabled={isPending}\n *     >\n *       Grant Roles\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useGrantRolesSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useGrantRolesSync.Parameters<config, context> = {},\n): useGrantRolesSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.grantRolesSync(config, variables as never)\n    },\n    mutationKey: ['grantRolesSync'],\n  }) as never\n}\n\nexport declare namespace useGrantRolesSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.grantRolesSync.ReturnValue,\n          Actions.token.grantRolesSync.ErrorType,\n          Actions.token.grantRolesSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.grantRolesSync.ReturnValue,\n    Actions.token.grantRolesSync.ErrorType,\n    Actions.token.grantRolesSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for checking if an account has a specific role for a TIP20 token.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { data, isLoading } = Hooks.token.useHasRole({\n *     account: '0x...',\n *     role: 'issuer',\n *     token: '0x...',\n *   })\n *\n *   if (isLoading) return <div>Loading...</div>\n *   return <div>Has Role: {data ? 'Yes' : 'No'}</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Query result with boolean indicating if account has role.\n */\nexport function useHasRole<\n  config extends Config = ResolvedRegister['config'],\n  selectData = Actions.token.hasRole.ReturnValue,\n>(\n  parameters: useHasRole.Parameters<config, selectData>,\n): useHasRole.ReturnValue<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId({ config })\n  const options = Actions.token.hasRole.queryOptions(config, {\n    ...parameters,\n    chainId: parameters.chainId ?? chainId,\n  } as never)\n  return useQuery(options) as never\n}\n\nexport declare namespace useHasRole {\n  export type Parameters<\n    config extends Config = ResolvedRegister['config'],\n    selectData = Actions.token.hasRole.ReturnValue,\n  > = ConfigParameter<config> &\n    QueryParameter<\n      Actions.token.hasRole.ReturnValue,\n      Actions.token.hasRole.ErrorType,\n      selectData,\n      Actions.token.hasRole.QueryKey<config>\n    > &\n    ExactPartial<Actions.token.hasRole.Parameters<config>>\n\n  export type ReturnValue<selectData = Actions.token.hasRole.ReturnValue> =\n    UseQueryReturnType<selectData, Error>\n}\n\n/**\n * Hook for minting TIP20 tokens to an address.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useMint()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ to: '0x...', amount: 100n, token: '0x...' })}\n *       disabled={isPending}\n *     >\n *       Mint\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useMint<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useMint.Parameters<config, context> = {},\n): useMint.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.mint(config, variables as never)\n    },\n    mutationKey: ['mint'],\n  }) as never\n}\n\nexport declare namespace useMint {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.mint.ReturnValue,\n          Actions.token.mint.ErrorType,\n          Actions.token.mint.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.mint.ReturnValue,\n    Actions.token.mint.ErrorType,\n    Actions.token.mint.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for minting TIP20 tokens to an address.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useMintSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ to: '0x...', amount: 100n, token: '0x...' })}\n *       disabled={isPending}\n *     >\n *       Mint\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useMintSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useMintSync.Parameters<config, context> = {},\n): useMintSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.mintSync(config, variables as never)\n    },\n    mutationKey: ['mintSync'],\n  }) as never\n}\n\nexport declare namespace useMintSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.mintSync.ReturnValue,\n          Actions.token.mintSync.ErrorType,\n          Actions.token.mintSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.mintSync.ReturnValue,\n    Actions.token.mintSync.ErrorType,\n    Actions.token.mintSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for pausing a TIP20 token.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.usePause()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ token: '0x...' })}\n *       disabled={isPending}\n *     >\n *       Pause\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function usePause<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: usePause.Parameters<config, context> = {},\n): usePause.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.pause(config, variables as never)\n    },\n    mutationKey: ['pause'],\n  }) as never\n}\n\nexport declare namespace usePause {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.pause.ReturnValue,\n          Actions.token.pause.ErrorType,\n          Actions.token.pause.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.pause.ReturnValue,\n    Actions.token.pause.ErrorType,\n    Actions.token.pause.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for pausing a TIP20 token.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.usePauseSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ token: '0x...' })}\n *       disabled={isPending}\n *     >\n *       Pause\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function usePauseSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: usePauseSync.Parameters<config, context> = {},\n): usePauseSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.pauseSync(config, variables as never)\n    },\n    mutationKey: ['pauseSync'],\n  }) as never\n}\n\nexport declare namespace usePauseSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.pauseSync.ReturnValue,\n          Actions.token.pauseSync.ErrorType,\n          Actions.token.pauseSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.pauseSync.ReturnValue,\n    Actions.token.pauseSync.ErrorType,\n    Actions.token.pauseSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for renouncing roles for a TIP20 token.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useRenounceRoles()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ token: '0x...', roles: ['issuer'] })}\n *       disabled={isPending}\n *     >\n *       Renounce Roles\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useRenounceRoles<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useRenounceRoles.Parameters<config, context> = {},\n): useRenounceRoles.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.renounceRoles(config, variables as never)\n    },\n    mutationKey: ['renounceRoles'],\n  }) as never\n}\n\nexport declare namespace useRenounceRoles {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.renounceRoles.ReturnValue,\n          Actions.token.renounceRoles.ErrorType,\n          Actions.token.renounceRoles.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.renounceRoles.ReturnValue,\n    Actions.token.renounceRoles.ErrorType,\n    Actions.token.renounceRoles.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for renouncing roles for a TIP20 token.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useRenounceRolesSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ token: '0x...', roles: ['issuer'] })}\n *       disabled={isPending}\n *     >\n *       Renounce Roles\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useRenounceRolesSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useRenounceRolesSync.Parameters<config, context> = {},\n): useRenounceRolesSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.renounceRolesSync(config, variables as never)\n    },\n    mutationKey: ['renounceRolesSync'],\n  }) as never\n}\n\nexport declare namespace useRenounceRolesSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.renounceRolesSync.ReturnValue,\n          Actions.token.renounceRolesSync.ErrorType,\n          Actions.token.renounceRolesSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.renounceRolesSync.ReturnValue,\n    Actions.token.renounceRolesSync.ErrorType,\n    Actions.token.renounceRolesSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for revoking roles for a TIP20 token.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useRevokeRoles()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ token: '0x...', from: '0x...', roles: ['issuer'] })}\n *       disabled={isPending}\n *     >\n *       Revoke Roles\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useRevokeRoles<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useRevokeRoles.Parameters<config, context> = {},\n): useRevokeRoles.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.revokeRoles(config, variables as never)\n    },\n    mutationKey: ['revokeRoles'],\n  }) as never\n}\n\nexport declare namespace useRevokeRoles {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.revokeRoles.ReturnValue,\n          Actions.token.revokeRoles.ErrorType,\n          Actions.token.revokeRoles.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.revokeRoles.ReturnValue,\n    Actions.token.revokeRoles.ErrorType,\n    Actions.token.revokeRoles.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for revoking roles for a TIP20 token.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useRevokeRolesSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ token: '0x...', from: '0x...', roles: ['issuer'] })}\n *       disabled={isPending}\n *     >\n *       Revoke Roles\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useRevokeRolesSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useRevokeRolesSync.Parameters<config, context> = {},\n): useRevokeRolesSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.revokeRolesSync(config, variables as never)\n    },\n    mutationKey: ['revokeRolesSync'],\n  }) as never\n}\n\nexport declare namespace useRevokeRolesSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.revokeRolesSync.ReturnValue,\n          Actions.token.revokeRolesSync.ErrorType,\n          Actions.token.revokeRolesSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.revokeRolesSync.ReturnValue,\n    Actions.token.revokeRolesSync.ErrorType,\n    Actions.token.revokeRolesSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for setting the admin role for a specific role in a TIP20 token.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useSetRoleAdmin()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ token: '0x...', role: 'issuer', adminRole: 'pause' })}\n *       disabled={isPending}\n *     >\n *       Set Role Admin\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useSetRoleAdmin<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useSetRoleAdmin.Parameters<config, context> = {},\n): useSetRoleAdmin.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.setRoleAdmin(config, variables as never)\n    },\n    mutationKey: ['setRoleAdmin'],\n  }) as never\n}\n\nexport declare namespace useSetRoleAdmin {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.setRoleAdmin.ReturnValue,\n          Actions.token.setRoleAdmin.ErrorType,\n          Actions.token.setRoleAdmin.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.setRoleAdmin.ReturnValue,\n    Actions.token.setRoleAdmin.ErrorType,\n    Actions.token.setRoleAdmin.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for setting the admin role for a specific role in a TIP20 token.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useSetRoleAdminSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ token: '0x...', role: 'issuer', adminRole: 'pause' })}\n *       disabled={isPending}\n *     >\n *       Set Role Admin\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useSetRoleAdminSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useSetRoleAdminSync.Parameters<config, context> = {},\n): useSetRoleAdminSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.setRoleAdminSync(config, variables as never)\n    },\n    mutationKey: ['setRoleAdminSync'],\n  }) as never\n}\n\nexport declare namespace useSetRoleAdminSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.setRoleAdminSync.ReturnValue,\n          Actions.token.setRoleAdminSync.ErrorType,\n          Actions.token.setRoleAdminSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.setRoleAdminSync.ReturnValue,\n    Actions.token.setRoleAdminSync.ErrorType,\n    Actions.token.setRoleAdminSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for setting the supply cap for a TIP20 token.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useSetSupplyCap()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ token: '0x...', supplyCap: 1000000n })}\n *       disabled={isPending}\n *     >\n *       Set Supply Cap\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useSetSupplyCap<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useSetSupplyCap.Parameters<config, context> = {},\n): useSetSupplyCap.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.setSupplyCap(config, variables as never)\n    },\n    mutationKey: ['setSupplyCap'],\n  }) as never\n}\n\nexport declare namespace useSetSupplyCap {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.setSupplyCap.ReturnValue,\n          Actions.token.setSupplyCap.ErrorType,\n          Actions.token.setSupplyCap.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.setSupplyCap.ReturnValue,\n    Actions.token.setSupplyCap.ErrorType,\n    Actions.token.setSupplyCap.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for setting the supply cap for a TIP20 token.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useSetSupplyCapSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ token: '0x...', supplyCap: 1000000n })}\n *       disabled={isPending}\n *     >\n *       Set Supply Cap\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useSetSupplyCapSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useSetSupplyCapSync.Parameters<config, context> = {},\n): useSetSupplyCapSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.setSupplyCapSync(config, variables as never)\n    },\n    mutationKey: ['setSupplyCapSync'],\n  }) as never\n}\n\nexport declare namespace useSetSupplyCapSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.setSupplyCapSync.ReturnValue,\n          Actions.token.setSupplyCapSync.ErrorType,\n          Actions.token.setSupplyCapSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.setSupplyCapSync.ReturnValue,\n    Actions.token.setSupplyCapSync.ErrorType,\n    Actions.token.setSupplyCapSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for transferring TIP20 tokens to another address.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useTransfer()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ to: '0x...', amount: 100n })}\n *       disabled={isPending}\n *     >\n *       Transfer\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useTransfer<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useTransfer.Parameters<config, context> = {},\n): useTransfer.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.transfer(config, variables as never)\n    },\n    mutationKey: ['transfer'],\n  }) as never\n}\n\nexport declare namespace useTransfer {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.transfer.ReturnValue,\n          Actions.token.transfer.ErrorType,\n          Actions.token.transfer.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.transfer.ReturnValue,\n    Actions.token.transfer.ErrorType,\n    Actions.token.transfer.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for transferring TIP20 tokens to another address.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useTransferSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ to: '0x...', amount: 100n })}\n *       disabled={isPending}\n *     >\n *       Transfer\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useTransferSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useTransferSync.Parameters<config, context> = {},\n): useTransferSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.transferSync(config, variables as never)\n    },\n    mutationKey: ['transferSync'],\n  }) as never\n}\n\nexport declare namespace useTransferSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.transferSync.ReturnValue,\n          Actions.token.transferSync.ErrorType,\n          Actions.token.transferSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.transferSync.ReturnValue,\n    Actions.token.transferSync.ErrorType,\n    Actions.token.transferSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for unpausing a TIP20 token.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useUnpause()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ token: '0x...' })}\n *       disabled={isPending}\n *     >\n *       Unpause\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useUnpause<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useUnpause.Parameters<config, context> = {},\n): useUnpause.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.unpause(config, variables as never)\n    },\n    mutationKey: ['unpause'],\n  }) as never\n}\n\nexport declare namespace useUnpause {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.unpause.ReturnValue,\n          Actions.token.unpause.ErrorType,\n          Actions.token.unpause.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.unpause.ReturnValue,\n    Actions.token.unpause.ErrorType,\n    Actions.token.unpause.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for unpausing a TIP20 token.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.useUnpauseSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ token: '0x...' })}\n *       disabled={isPending}\n *     >\n *       Unpause\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function useUnpauseSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useUnpauseSync.Parameters<config, context> = {},\n): useUnpauseSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.unpauseSync(config, variables as never)\n    },\n    mutationKey: ['unpauseSync'],\n  }) as never\n}\n\nexport declare namespace useUnpauseSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.unpauseSync.ReturnValue,\n          Actions.token.unpauseSync.ErrorType,\n          Actions.token.unpauseSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.unpauseSync.ReturnValue,\n    Actions.token.unpauseSync.ErrorType,\n    Actions.token.unpauseSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for preparing the quote token update for a TIP20 token.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.usePrepareUpdateQuoteToken()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ token: '0x...', quoteToken: '0x...' })}\n *       disabled={isPending}\n *     >\n *       Prepare Update Quote Token\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function usePrepareUpdateQuoteToken<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: usePrepareUpdateQuoteToken.Parameters<config, context> = {},\n): usePrepareUpdateQuoteToken.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.prepareUpdateQuoteToken(config, variables as never)\n    },\n    mutationKey: ['prepareUpdateQuoteToken'],\n  }) as never\n}\n\nexport declare namespace usePrepareUpdateQuoteToken {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.prepareUpdateQuoteToken.ReturnValue,\n          Actions.token.prepareUpdateQuoteToken.ErrorType,\n          Actions.token.prepareUpdateQuoteToken.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.prepareUpdateQuoteToken.ReturnValue,\n    Actions.token.prepareUpdateQuoteToken.ErrorType,\n    Actions.token.prepareUpdateQuoteToken.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for preparing the quote token update for a TIP20 token.\n *\n * Note: This is a synchronous hook that waits for the transaction\n * to be included on a block before returning a response.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   const { mutate, isPending } = Hooks.token.usePrepareUpdateQuoteTokenSync()\n *\n *   return (\n *     <button\n *       onClick={() => mutate({ token: '0x...', quoteToken: '0x...' })}\n *       disabled={isPending}\n *     >\n *       Prepare Update Quote Token\n *     </button>\n *   )\n * }\n * ```\n *\n * @param parameters - Parameters.\n * @returns Mutation result.\n */\nexport function usePrepareUpdateQuoteTokenSync<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: usePrepareUpdateQuoteTokenSync.Parameters<config, context> = {},\n): usePrepareUpdateQuoteTokenSync.ReturnType<config, context> {\n  const { mutation } = parameters\n  const config = useConfig(parameters)\n  return useMutation({\n    ...mutation,\n    async mutationFn(variables) {\n      return Actions.token.prepareUpdateQuoteTokenSync(\n        config,\n        variables as never,\n      )\n    },\n    mutationKey: ['prepareUpdateQuoteTokenSync'],\n  }) as never\n}\n\nexport declare namespace usePrepareUpdateQuoteTokenSync {\n  type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = ConfigParameter<config> & {\n    mutation?:\n      | UseMutationParameters<\n          Actions.token.prepareUpdateQuoteTokenSync.ReturnValue,\n          Actions.token.prepareUpdateQuoteTokenSync.ErrorType,\n          Actions.token.prepareUpdateQuoteTokenSync.Parameters<config>,\n          context\n        >\n      | undefined\n  }\n\n  type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = UseMutationResult<\n    Actions.token.prepareUpdateQuoteTokenSync.ReturnValue,\n    Actions.token.prepareUpdateQuoteTokenSync.ErrorType,\n    Actions.token.prepareUpdateQuoteTokenSync.Parameters<config>,\n    context\n  >\n}\n\n/**\n * Hook for watching TIP20 token role admin updates.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   Hooks.token.useWatchAdminRole({\n *     onRoleAdminUpdated(args) {\n *       console.log('Role admin updated:', args)\n *     },\n *   })\n *\n *   return <div>Watching for role admin updates...</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n */\nexport function useWatchAdminRole<\n  config extends Config = ResolvedRegister['config'],\n>(parameters: useWatchAdminRole.Parameters<config> = {}) {\n  const { enabled = true, onRoleAdminUpdated, token, ...rest } = parameters\n\n  const config = useConfig({ config: parameters.config })\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  // biome-ignore lint/correctness/useExhaustiveDependencies: rest.x is explicitly listed\n  useEffect(() => {\n    if (!enabled) return\n    if (!onRoleAdminUpdated) return\n    if (!token) return\n    return Actions.token.watchAdminRole(config, {\n      ...rest,\n      chainId,\n      onRoleAdminUpdated,\n      token,\n    })\n  }, [\n    config,\n    enabled,\n    chainId,\n    token,\n    onRoleAdminUpdated,\n    rest.fromBlock,\n    rest.onError,\n    rest.poll,\n    rest.pollingInterval,\n  ])\n}\n\nexport declare namespace useWatchAdminRole {\n  type Parameters<config extends Config = Config> = UnionCompute<\n    ExactPartial<Actions.token.watchAdminRole.Parameters<config>> &\n      ConfigParameter<config> & { enabled?: boolean | undefined }\n  >\n}\n\n/**\n * Hook for watching TIP20 token approval events.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   Hooks.token.useWatchApprove({\n *     onApproval(args) {\n *       console.log('Approval:', args)\n *     },\n *   })\n *\n *   return <div>Watching for approvals...</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n */\nexport function useWatchApprove<\n  config extends Config = ResolvedRegister['config'],\n>(parameters: useWatchApprove.Parameters<config> = {}) {\n  const { enabled = true, onApproval, token, ...rest } = parameters\n\n  const config = useConfig({ config: parameters.config })\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  // biome-ignore lint/correctness/useExhaustiveDependencies: rest.x is explicitly listed\n  useEffect(() => {\n    if (!enabled) return\n    if (!onApproval) return\n    if (!token) return\n    return Actions.token.watchApprove(config, {\n      ...rest,\n      chainId,\n      onApproval,\n      token,\n    })\n  }, [\n    config,\n    enabled,\n    chainId,\n    token,\n    onApproval,\n    rest.fromBlock,\n    rest.onError,\n    rest.poll,\n    rest.pollingInterval,\n  ])\n}\n\nexport declare namespace useWatchApprove {\n  type Parameters<config extends Config = Config> = UnionCompute<\n    ExactPartial<Actions.token.watchApprove.Parameters<config>> &\n      ConfigParameter<config> & { enabled?: boolean | undefined }\n  >\n}\n\n/**\n * Hook for watching TIP20 token burn events.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   Hooks.token.useWatchBurn({\n *     onBurn(args) {\n *       console.log('Burn:', args)\n *     },\n *   })\n *\n *   return <div>Watching for burns...</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n */\nexport function useWatchBurn<\n  config extends Config = ResolvedRegister['config'],\n>(parameters: useWatchBurn.Parameters<config> = {}) {\n  const { enabled = true, onBurn, token, ...rest } = parameters\n\n  const config = useConfig({ config: parameters.config })\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  // biome-ignore lint/correctness/useExhaustiveDependencies: rest.x is explicitly listed\n  useEffect(() => {\n    if (!enabled) return\n    if (!onBurn) return\n    if (!token) return\n    return Actions.token.watchBurn(config, {\n      ...rest,\n      chainId,\n      onBurn,\n      token,\n    })\n  }, [\n    config,\n    enabled,\n    chainId,\n    token,\n    onBurn,\n    rest.fromBlock,\n    rest.onError,\n    rest.poll,\n    rest.pollingInterval,\n  ])\n}\n\nexport declare namespace useWatchBurn {\n  type Parameters<config extends Config = Config> = UnionCompute<\n    ExactPartial<Actions.token.watchBurn.Parameters<config>> &\n      ConfigParameter<config> & { enabled?: boolean | undefined }\n  >\n}\n\n/**\n * Hook for watching new TIP20 tokens created.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   Hooks.token.useWatchCreate({\n *     onTokenCreated(args) {\n *       console.log('Token created:', args)\n *     },\n *   })\n *\n *   return <div>Watching for token creations...</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n */\nexport function useWatchCreate<\n  config extends Config = ResolvedRegister['config'],\n>(parameters: useWatchCreate.Parameters<config> = {}) {\n  const { enabled = true, onTokenCreated, ...rest } = parameters\n\n  const config = useConfig({ config: parameters.config })\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  // biome-ignore lint/correctness/useExhaustiveDependencies: rest.x is explicitly listed\n  useEffect(() => {\n    if (!enabled) return\n    if (!onTokenCreated) return\n    return Actions.token.watchCreate(config, {\n      ...rest,\n      chainId,\n      onTokenCreated,\n    })\n  }, [\n    config,\n    enabled,\n    chainId,\n    onTokenCreated,\n    rest.fromBlock,\n    rest.onError,\n    rest.poll,\n    rest.pollingInterval,\n  ])\n}\n\nexport declare namespace useWatchCreate {\n  type Parameters<config extends Config = Config> = UnionCompute<\n    ExactPartial<Actions.token.watchCreate.Parameters<config>> &\n      ConfigParameter<config> & { enabled?: boolean | undefined }\n  >\n}\n\n/**\n * Hook for watching TIP20 token mint events.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   Hooks.token.useWatchMint({\n *     onMint(args) {\n *       console.log('Mint:', args)\n *     },\n *   })\n *\n *   return <div>Watching for mints...</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n */\nexport function useWatchMint<\n  config extends Config = ResolvedRegister['config'],\n>(parameters: useWatchMint.Parameters<config> = {}) {\n  const { enabled = true, onMint, token, ...rest } = parameters\n\n  const config = useConfig({ config: parameters.config })\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  // biome-ignore lint/correctness/useExhaustiveDependencies: rest.x is explicitly listed\n  useEffect(() => {\n    if (!enabled) return\n    if (!onMint) return\n    if (!token) return\n    return Actions.token.watchMint(config, {\n      ...rest,\n      chainId,\n      onMint,\n      token,\n    })\n  }, [\n    config,\n    enabled,\n    chainId,\n    token,\n    onMint,\n    rest.fromBlock,\n    rest.onError,\n    rest.poll,\n    rest.pollingInterval,\n  ])\n}\n\nexport declare namespace useWatchMint {\n  type Parameters<config extends Config = Config> = UnionCompute<\n    ExactPartial<Actions.token.watchMint.Parameters<config>> &\n      ConfigParameter<config> & { enabled?: boolean | undefined }\n  >\n}\n\n/**\n * Hook for watching TIP20 token role membership updates.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   Hooks.token.useWatchRole({\n *     onRoleUpdated(args) {\n *       console.log('Role updated:', args)\n *     },\n *   })\n *\n *   return <div>Watching for role updates...</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n */\nexport function useWatchRole<\n  config extends Config = ResolvedRegister['config'],\n>(parameters: useWatchRole.Parameters<config> = {}) {\n  const { enabled = true, onRoleUpdated, token, ...rest } = parameters\n\n  const config = useConfig({ config: parameters.config })\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  // biome-ignore lint/correctness/useExhaustiveDependencies: rest.x is explicitly listed\n  useEffect(() => {\n    if (!enabled) return\n    if (!onRoleUpdated) return\n    if (!token) return\n    return Actions.token.watchRole(config, {\n      ...rest,\n      chainId,\n      onRoleUpdated,\n      token,\n    })\n  }, [\n    config,\n    enabled,\n    chainId,\n    token,\n    onRoleUpdated,\n    rest.fromBlock,\n    rest.onError,\n    rest.poll,\n    rest.pollingInterval,\n  ])\n}\n\nexport declare namespace useWatchRole {\n  type Parameters<config extends Config = Config> = UnionCompute<\n    ExactPartial<Actions.token.watchRole.Parameters<config>> &\n      ConfigParameter<config> & { enabled?: boolean | undefined }\n  >\n}\n\n/**\n * Hook for watching TIP20 token transfer events.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   Hooks.token.useWatchTransfer({\n *     onTransfer(args) {\n *       console.log('Transfer:', args)\n *     },\n *   })\n *\n *   return <div>Watching for transfers...</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n */\nexport function useWatchTransfer<\n  config extends Config = ResolvedRegister['config'],\n>(parameters: useWatchTransfer.Parameters<config> = {}) {\n  const { enabled = true, onTransfer, token, ...rest } = parameters\n\n  const config = useConfig({ config: parameters.config })\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  // biome-ignore lint/correctness/useExhaustiveDependencies: rest.x is explicitly listed\n  useEffect(() => {\n    if (!enabled) return\n    if (!onTransfer) return\n    if (!token) return\n    return Actions.token.watchTransfer(config, {\n      ...rest,\n      chainId,\n      onTransfer,\n      token,\n    })\n  }, [\n    config,\n    enabled,\n    chainId,\n    token,\n    onTransfer,\n    rest.fromBlock,\n    rest.onError,\n    rest.poll,\n    rest.pollingInterval,\n  ])\n}\n\nexport declare namespace useWatchTransfer {\n  type Parameters<config extends Config = Config> = UnionCompute<\n    ExactPartial<Actions.token.watchTransfer.Parameters<config>> &\n      ConfigParameter<config> & { enabled?: boolean | undefined }\n  >\n}\n\n/**\n * Hook for watching TIP20 token quote token update events.\n *\n * @example\n * ```tsx\n * import { Hooks } from 'wagmi/tempo'\n *\n * function App() {\n *   Hooks.token.useWatchUpdateQuoteToken({\n *     onUpdateQuoteToken(args) {\n *       if (args.completed)\n *         console.log('quote token update completed:', args.newQuoteToken)\n *       else\n *         console.log('quote token update proposed:', args.newQuoteToken)\n *     },\n *   })\n *\n *   return <div>Watching for quote token updates...</div>\n * }\n * ```\n *\n * @param parameters - Parameters.\n */\nexport function useWatchUpdateQuoteToken<\n  config extends Config = ResolvedRegister['config'],\n>(parameters: useWatchUpdateQuoteToken.Parameters<config> = {}) {\n  const { enabled = true, onUpdateQuoteToken, token, ...rest } = parameters\n\n  const config = useConfig({ config: parameters.config })\n  const configChainId = useChainId({ config })\n  const chainId = parameters.chainId ?? configChainId\n\n  // biome-ignore lint/correctness/useExhaustiveDependencies: rest.x is explicitly listed\n  useEffect(() => {\n    if (!enabled) return\n    if (!onUpdateQuoteToken) return\n    if (!token) return\n    return Actions.token.watchUpdateQuoteToken(config, {\n      ...rest,\n      chainId,\n      onUpdateQuoteToken,\n      token,\n    })\n  }, [\n    config,\n    enabled,\n    chainId,\n    token,\n    onUpdateQuoteToken,\n    rest.fromBlock,\n    rest.onError,\n    rest.poll,\n    rest.pollingInterval,\n  ])\n}\n\nexport declare namespace useWatchUpdateQuoteToken {\n  type Parameters<config extends Config = Config> = UnionCompute<\n    ExactPartial<Actions.token.watchUpdateQuoteToken.Parameters<config>> &\n      ConfigParameter<config> & { enabled?: boolean | undefined }\n  >\n}\n"
  },
  {
    "path": "packages/react/src/tempo/utils.ts",
    "content": "import type * as Query from '@tanstack/react-query'\nimport type { UnionLooseOmit } from '@wagmi/core/internal'\n\nexport type QueryParameter<\n  queryFnData = unknown,\n  error = Query.DefaultError,\n  data = queryFnData,\n  queryKey extends Query.QueryKey = Query.QueryKey,\n> = {\n  query?:\n    | UnionLooseOmit<\n        Query.UseQueryOptions<queryFnData, error, data, queryKey>,\n        'queryKey' | 'queryFn'\n      >\n    | undefined\n}\n"
  },
  {
    "path": "packages/react/src/types/properties.ts",
    "content": "import type { DefaultError, QueryKey } from '@tanstack/react-query'\nimport type { Omit } from '@wagmi/core/internal'\nimport type { UseInfiniteQueryParameters } from '../utils/query.js'\n\nexport type InfiniteQueryParameter<\n  queryFnData = unknown,\n  error = DefaultError,\n  data = queryFnData,\n  queryData = queryFnData,\n  queryKey extends QueryKey = QueryKey,\n  pageParam = unknown,\n> = {\n  query: Omit<\n    UseInfiniteQueryParameters<\n      queryFnData,\n      error,\n      data,\n      queryData,\n      queryKey,\n      pageParam\n    >,\n    'queryFn' | 'queryHash' | 'queryKey' | 'queryKeyHashFn' | 'throwOnError'\n  >\n}\n"
  },
  {
    "path": "packages/react/src/utils/getVersion.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport { getVersion } from './getVersion.js'\n\ntest('default', () => {\n  expect(getVersion()).toMatchInlineSnapshot(`\"wagmi@x.y.z\"`)\n})\n"
  },
  {
    "path": "packages/react/src/utils/getVersion.ts",
    "content": "import { version } from '../version.js'\n\nexport const getVersion = () => `wagmi@${version}`\n"
  },
  {
    "path": "packages/react/src/utils/query.ts",
    "content": "import {\n  type DefaultError,\n  type MutateFunction,\n  type QueryKey,\n  useInfiniteQuery as tanstack_useInfiniteQuery,\n  useQuery as tanstack_useQuery,\n  type UseInfiniteQueryOptions,\n  type UseInfiniteQueryResult,\n  type UseMutationOptions,\n  type UseMutationResult,\n  type UseQueryOptions,\n  type UseQueryResult,\n  useMutation,\n} from '@tanstack/react-query'\nimport type {\n  Compute,\n  ExactPartial,\n  Omit,\n  UnionStrictOmit,\n} from '@wagmi/core/internal'\nimport { hashFn } from '@wagmi/core/query'\n\nexport { useMutation }\n\nexport type UseMutationParameters<\n  data = unknown,\n  error = Error,\n  variables = void,\n  context = unknown,\n> = Compute<\n  Omit<\n    UseMutationOptions<data, error, Compute<variables>, context>,\n    'mutationFn' | 'mutationKey' | 'throwOnError'\n  >\n>\n\nexport type UseMutationReturnType<\n  data = unknown,\n  error = Error,\n  variables = void,\n  context = unknown,\n  mutate = MutateFunction,\n  mutateAsync = MutateFunction,\n> = Compute<\n  UnionStrictOmit<\n    UseMutationResult<data, error, variables, context>,\n    'mutate' | 'mutateAsync'\n  > & {\n    mutate: mutate\n    mutateAsync: mutateAsync\n  }\n>\n\n////////////////////////////////////////////////////////////////////////////////\n\n// Adding some basic customization.\n// Ideally we don't have this function, but `import('@tanstack/react-query').useQuery` currently has some quirks where it is super hard to\n// pass down the inferred `initialData` type because of it's discriminated overload in the on `useQuery`.\nexport function useQuery<queryFnData, error, data, queryKey extends QueryKey>(\n  parameters: UseQueryParameters<queryFnData, error, data, queryKey> & {\n    queryKey: QueryKey\n  },\n): UseQueryReturnType<data, error> {\n  const result = tanstack_useQuery({\n    ...(parameters as any),\n    queryKeyHashFn: hashFn, // for bigint support\n  }) as UseQueryReturnType<data, error>\n  result.queryKey = parameters.queryKey\n  return result\n}\n\nexport type UseQueryParameters<\n  queryFnData = unknown,\n  error = DefaultError,\n  data = queryFnData,\n  queryKey extends QueryKey = QueryKey,\n> = Compute<\n  ExactPartial<\n    Omit<UseQueryOptions<queryFnData, error, data, queryKey>, 'initialData'>\n  > & {\n    // Fix `initialData` type\n    initialData?:\n      | UseQueryOptions<queryFnData, error, data, queryKey>['initialData']\n      | undefined\n  }\n>\n\nexport type UseQueryReturnType<data = unknown, error = DefaultError> = Compute<\n  UseQueryResult<data, error> & {\n    queryKey: QueryKey\n  }\n>\n\n////////////////////////////////////////////////////////////////////////////////\n\n// Adding some basic customization.\nexport function useInfiniteQuery<\n  queryFnData,\n  error,\n  data,\n  queryKey extends QueryKey,\n>(\n  parameters: UseInfiniteQueryParameters<queryFnData, error, data, queryKey> & {\n    queryKey: QueryKey\n  },\n): UseInfiniteQueryReturnType<data, error> {\n  const result = tanstack_useInfiniteQuery({\n    ...(parameters as any),\n    queryKeyHashFn: hashFn, // for bigint support\n  }) as UseInfiniteQueryReturnType<data, error>\n  result.queryKey = parameters.queryKey\n  return result\n}\n\nexport type UseInfiniteQueryParameters<\n  queryFnData = unknown,\n  error = DefaultError,\n  data = queryFnData,\n  queryData = queryFnData,\n  queryKey extends QueryKey = QueryKey,\n  pageParam = unknown,\n> = Compute<\n  Omit<\n    UseInfiniteQueryOptions<\n      queryFnData,\n      error,\n      data,\n      queryData,\n      queryKey,\n      pageParam\n    >,\n    'initialData'\n  > & {\n    // Fix `initialData` type\n    initialData?:\n      | UseInfiniteQueryOptions<\n          queryFnData,\n          error,\n          data,\n          queryKey\n        >['initialData']\n      | undefined\n  }\n>\n\nexport type UseInfiniteQueryReturnType<\n  data = unknown,\n  error = DefaultError,\n> = UseInfiniteQueryResult<data, error> & {\n  queryKey: QueryKey\n}\n"
  },
  {
    "path": "packages/react/src/version.ts",
    "content": "export const version = '3.5.0'\n"
  },
  {
    "path": "packages/react/test/setup.ts",
    "content": "import { vi } from 'vitest'\n\n// Make dates stable across runs\nDate.now = vi.fn(() => new Date(Date.UTC(2023, 1, 1)).valueOf())\n\nvi.mock('../src/version.ts', () => {\n  return { version: 'x.y.z' }\n})\n\nvi.mock('../../core/src/version.ts', () => {\n  return { version: 'x.y.z' }\n})\n"
  },
  {
    "path": "packages/react/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"include\": [\"src/**/*.ts\"],\n  \"exclude\": [\"src/**/*.test.ts\", \"src/**/*.test-d.ts\"],\n  \"compilerOptions\": {\n    \"sourceMap\": true\n  }\n}\n"
  },
  {
    "path": "packages/react/tsconfig.json",
    "content": "{\n  \"extends\": \"./tsconfig.build.json\",\n  \"compilerOptions\": {\n    \"jsx\": \"preserve\",\n    \"types\": [\"@vitest/browser-playwright\"]\n  },\n  \"include\": [\"src/**/*.ts\", \"src/**/*.tsx\", \"test/**/*.ts\", \"test/**/*.tsx\"],\n  \"exclude\": []\n}\n"
  },
  {
    "path": "packages/register-tests/react/package.json",
    "content": "{\n  \"name\": \"react-register\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"check:types\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@tanstack/react-query\": \"catalog:\",\n    \"react\": \"catalog:\",\n    \"wagmi\": \"workspace:*\"\n  },\n  \"devDependencies\": {\n    \"@types/react\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "packages/register-tests/react/src/config.ts",
    "content": "import { type Address, http } from 'viem'\nimport { createConfig, createConnector, mock } from 'wagmi'\nimport { celo, mainnet, optimism, zkSync } from 'wagmi/chains'\n\nexport const config = createConfig({\n  chains: [celo, mainnet, optimism, zkSync],\n  connectors: [mock({ accounts: ['0x'] }), foo()],\n  transports: {\n    [celo.id]: http(),\n    [mainnet.id]: http(),\n    [optimism.id]: http(),\n    [zkSync.id]: http(),\n  },\n})\n\nexport type ChainId =\n  | typeof celo.id\n  | typeof mainnet.id\n  | typeof optimism.id\n  | typeof zkSync.id\n\ndeclare module 'wagmi' {\n  interface Register {\n    config: typeof config\n  }\n}\n\nexport function foo() {\n  type Properties = {\n    // TODO(v3): Make `withCapabilities: true` default behavior\n    connect<withCapabilities extends boolean = false>(parameters?: {\n      chainId?: number | undefined\n      isReconnecting?: boolean | undefined\n      capabilities?: {\n        signInWithEthereum?: { nonce: string } | undefined\n      }\n      withCapabilities?: withCapabilities | boolean | undefined\n    }): Promise<{\n      accounts: withCapabilities extends true\n        ? readonly {\n            capabilities: {\n              signInWithEthereum: {\n                message: string\n                signature: string\n              }\n            }\n          }[]\n        : readonly Address[]\n      chainId: number\n    }>\n  }\n\n  return createConnector<unknown, Properties>((_config) => ({}) as never)\n}\n"
  },
  {
    "path": "packages/register-tests/react/src/createUseSimulateContract.test-d.ts",
    "content": "import { abi, config as testConfig } from '@wagmi/test'\nimport { test } from 'vitest'\nimport { celo, mainnet, optimism } from 'wagmi/chains'\nimport { createUseSimulateContract } from 'wagmi/codegen'\n\nconst useSimulateErc20 = createUseSimulateContract({\n  abi: abi.erc20,\n})\n\ntest('chain formatters', () => {\n  useSimulateErc20({\n    feeCurrency: '0x',\n  })\n\n  useSimulateErc20({\n    chainId: celo.id,\n    feeCurrency: '0x',\n  })\n\n  useSimulateErc20({\n    chainId: mainnet.id,\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n\n  useSimulateErc20({\n    chainId: optimism.id,\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n})\n\ntest('parameters: config', async () => {\n  useSimulateErc20({\n    config: testConfig,\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n})\n"
  },
  {
    "path": "packages/register-tests/react/src/createUseWriteContract.test-d.ts",
    "content": "import { abi, config } from '@wagmi/test'\nimport type { Address } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport { celo, mainnet, optimism } from 'wagmi/chains'\nimport { createUseWriteContract } from 'wagmi/codegen'\n\nconst useWriteErc20 = createUseWriteContract({\n  abi: abi.erc20,\n})\n\ntest('chain formatters', () => {\n  const { mutate } = useWriteErc20()\n  const shared = {\n    address: '0x',\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n  } as const\n\n  mutate({\n    ...shared,\n    feeCurrency: '0x',\n  })\n\n  type Result = Parameters<\n    typeof mutate<\n      typeof abi.erc20,\n      'transferFrom',\n      [Address, Address, bigint],\n      typeof celo.id\n    >\n  >[0]\n  expectTypeOf<Result['feeCurrency']>().toEqualTypeOf<\n    `0x${string}` | undefined\n  >()\n  mutate({\n    ...shared,\n    chainId: celo.id,\n    feeCurrency: '0x',\n  })\n\n  mutate({\n    ...shared,\n    chainId: mainnet.id,\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n\n  mutate({\n    ...shared,\n    chainId: optimism.id,\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n})\n\ntest('parameters: config', async () => {\n  const { mutate } = useWriteErc20({ config })\n\n  mutate({\n    address: '0x',\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n})\n"
  },
  {
    "path": "packages/register-tests/react/src/useBlock.test-d.ts",
    "content": "import type { Hex } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport { useBlock } from 'wagmi'\nimport { celo } from 'wagmi/chains'\n\ntest('chain formatters', () => {\n  const result = useBlock()\n\n  if (result.data) expectTypeOf(result.data.difficulty).toEqualTypeOf<bigint>()\n\n  if (result.data?.chainId === celo.id) {\n    expectTypeOf(result.data.difficulty).toEqualTypeOf<bigint>()\n    expectTypeOf(result.data.gasLimit).toEqualTypeOf<bigint>()\n    expectTypeOf(result.data.mixHash).toEqualTypeOf<Hex>()\n    expectTypeOf(result.data.nonce).toEqualTypeOf<`0x${string}`>()\n    expectTypeOf(result.data.uncles).toEqualTypeOf<Hex[]>()\n  }\n\n  const result2 = useBlock({ chainId: celo.id })\n  if (result2.data) {\n    expectTypeOf(result2.data.difficulty).toEqualTypeOf<bigint>()\n    expectTypeOf(result2.data.gasLimit).toEqualTypeOf<bigint>()\n    expectTypeOf(result2.data.mixHash).toEqualTypeOf<Hex>()\n    expectTypeOf(result2.data.nonce).toEqualTypeOf<`0x${string}`>()\n    expectTypeOf(result2.data.uncles).toEqualTypeOf<Hex[]>()\n  }\n})\n"
  },
  {
    "path": "packages/register-tests/react/src/useChainId.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\nimport { useChainId } from 'wagmi'\n\nimport type { ChainId } from './config.js'\n\ntest('default', async () => {\n  const chainId = useChainId()\n  expectTypeOf(chainId).toEqualTypeOf<ChainId>()\n})\n\ntest('parameters: config', async () => {\n  const chainId = useChainId({ config })\n  expectTypeOf(chainId).toEqualTypeOf<1 | 456 | 10>()\n})\n"
  },
  {
    "path": "packages/register-tests/react/src/useChains.test-d.ts",
    "content": "import { expectTypeOf, test } from 'vitest'\nimport { useChains } from 'wagmi'\nimport type { celo, optimism, zkSync } from 'wagmi/chains'\n\ntest('default', () => {\n  const chains = useChains()\n\n  expectTypeOf(chains[0]).toEqualTypeOf<typeof celo>()\n  expectTypeOf(chains[2]).toEqualTypeOf<typeof optimism>()\n  expectTypeOf(chains[3]).toEqualTypeOf<typeof zkSync>()\n})\n"
  },
  {
    "path": "packages/register-tests/react/src/useClient.test-d.ts",
    "content": "import { type chain, config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\nimport { useClient } from 'wagmi'\nimport { mainnet } from 'wagmi/chains'\n\nimport type { ChainId } from './config.js'\n\ntest('default', () => {\n  const client = useClient()\n  expectTypeOf(client.chain.id).toEqualTypeOf<ChainId>()\n  expectTypeOf(client.transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('parameters: config', () => {\n  const client = useClient({ config })\n  expectTypeOf(client.chain.id).toEqualTypeOf<\n    (typeof config)['chains'][number]['id']\n  >()\n  expectTypeOf(client.transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('parameters: chainId', () => {\n  const client = useClient({\n    config,\n    chainId: mainnet.id,\n  })\n  expectTypeOf(client.chain).toEqualTypeOf<typeof chain.mainnet>()\n  expectTypeOf(client.transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('behavior: unconfigured chain', () => {\n  const client = useClient({\n    config,\n    // @ts-expect-error\n    chainId: 123456,\n  })\n  expectTypeOf(client).toEqualTypeOf<undefined>()\n})\n"
  },
  {
    "path": "packages/register-tests/react/src/useConfig.test-d.ts",
    "content": "import { config as testConfig } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\nimport { type Config, useConfig } from 'wagmi'\n\nimport type { config } from './config.js'\n\ntest('default', async () => {\n  const result = useConfig()\n  expectTypeOf(result).not.toEqualTypeOf<Config>()\n  expectTypeOf(result).toEqualTypeOf<typeof config>()\n})\n\ntest('parameters: config', async () => {\n  const result = useConfig({ config: testConfig })\n  expectTypeOf(result).not.toEqualTypeOf<Config>()\n  expectTypeOf(result).toEqualTypeOf<typeof testConfig>()\n})\n"
  },
  {
    "path": "packages/register-tests/react/src/useConnect.test-d.ts",
    "content": "import type { Address, Hex } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport { useConnect, useConnectors } from 'wagmi'\n\ntest('infers connect parameters', () => {\n  const connect = useConnect()\n  const connectors = useConnectors()\n  const connector = connectors[0]! as (typeof connectors)[number]\n\n  connect.mutate({\n    connector,\n    foo: 'bar',\n  })\n  connect.mutate({\n    connector: connectors[1],\n    // @ts-expect-error\n    foo: 'bar',\n  })\n  connect.mutate({\n    connector,\n    capabilities: {\n      signInWithEthereum: {\n        nonce: 'foobarbaz',\n      },\n    },\n  })\n  connect.mutate({\n    connector: connectors[0],\n    // @ts-expect-error\n    capabilities: {\n      signInWithEthereum: {\n        nonce: 'foobarbaz',\n      },\n    },\n  })\n\n  if (connect.variables && 'foo' in connect.variables)\n    expectTypeOf(connect.variables?.foo).toEqualTypeOf<string | undefined>()\n  if (connect.variables && 'capabilities' in connect.variables)\n    expectTypeOf(\n      connect.variables?.capabilities?.signInWithEthereum,\n    ).toEqualTypeOf<{ nonce: string } | undefined>()\n\n  connect.mutate(\n    {\n      connector,\n      foo: 'bar',\n      withCapabilities: true,\n    },\n    {\n      onSuccess(data, _variables, _context) {\n        expectTypeOf(data.accounts).toEqualTypeOf<\n          readonly [\n            {\n              address: Address\n              capabilities:\n                | {\n                    foo: { bar: Hex }\n                  }\n                | {\n                    signInWithEthereum: {\n                      message: string\n                      signature: string\n                    }\n                  }\n            },\n            ...{\n              address: Address\n              capabilities:\n                | {\n                    foo: { bar: Hex }\n                  }\n                | {\n                    signInWithEthereum: {\n                      message: string\n                      signature: string\n                    }\n                  }\n            }[],\n          ]\n        >()\n      },\n      onSettled(data, _error, _variables, _context) {\n        expectTypeOf(data?.accounts).toEqualTypeOf<\n          | readonly [\n              {\n                address: Address\n                capabilities:\n                  | {\n                      foo: { bar: Hex }\n                    }\n                  | {\n                      signInWithEthereum: {\n                        message: string\n                        signature: string\n                      }\n                    }\n              },\n              ...{\n                address: Address\n                capabilities:\n                  | {\n                      foo: { bar: Hex }\n                    }\n                  | {\n                      signInWithEthereum: {\n                        message: string\n                        signature: string\n                      }\n                    }\n              }[],\n            ]\n          | undefined\n        >()\n      },\n    },\n  )\n\n  ;(async () => {\n    await connect.mutateAsync({\n      connector,\n      foo: 'bar',\n      withCapabilities: true,\n    })\n    const res = await connect.mutateAsync({\n      connector,\n      capabilities: {\n        signInWithEthereum: {\n          nonce: 'foobarbaz',\n        },\n      },\n      withCapabilities: true,\n    })\n    expectTypeOf(res.accounts).toEqualTypeOf<\n      readonly [\n        {\n          address: Address\n          capabilities:\n            | {\n                foo: { bar: Hex }\n              }\n            | {\n                signInWithEthereum: {\n                  message: string\n                  signature: string\n                }\n              }\n        },\n        ...{\n          address: Address\n          capabilities:\n            | {\n                foo: { bar: Hex }\n              }\n            | {\n                signInWithEthereum: {\n                  message: string\n                  signature: string\n                }\n              }\n        }[],\n      ]\n    >()\n  })()\n})\n"
  },
  {
    "path": "packages/register-tests/react/src/useConnection.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\nimport { useConnection } from 'wagmi'\n\nimport type { ChainId } from './config.js'\n\ntest('default', () => {\n  const result = useConnection()\n  if (result.chain) expectTypeOf(result.chain.id).toEqualTypeOf<ChainId>()\n})\n\ntest('parameters: config', () => {\n  const result = useConnection({ config })\n  if (result.chain) expectTypeOf(result.chain.id).toEqualTypeOf<1 | 10 | 456>()\n})\n"
  },
  {
    "path": "packages/register-tests/react/src/usePrepareTransactionRequest.test-d.ts",
    "content": "import { config as testConfig } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\nimport { usePrepareTransactionRequest } from 'wagmi'\nimport { celo, mainnet, optimism } from 'wagmi/chains'\n\ntest('chain formatters', () => {\n  const { data } = usePrepareTransactionRequest({\n    feeCurrency: '0x',\n  })\n  if (data && data.chainId === celo.id) {\n    expectTypeOf(data.feeCurrency).toEqualTypeOf<`0x${string}` | undefined>()\n  }\n\n  const { data: data2 } = usePrepareTransactionRequest({\n    chainId: celo.id,\n    feeCurrency: '0x',\n  })\n  if (data2) {\n    expectTypeOf(data2.chainId).toEqualTypeOf(celo.id)\n    expectTypeOf(data2.feeCurrency).toEqualTypeOf<`0x${string}` | undefined>()\n  }\n\n  usePrepareTransactionRequest({\n    chainId: mainnet.id,\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n\n  usePrepareTransactionRequest({\n    chainId: optimism.id,\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n})\n\ntest('parameters: config', async () => {\n  usePrepareTransactionRequest({\n    config: testConfig,\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n})\n"
  },
  {
    "path": "packages/register-tests/react/src/usePublicClient.ts",
    "content": "import { type chain, config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\nimport { usePublicClient } from 'wagmi'\nimport { mainnet } from 'wagmi/chains'\n\nimport type { ChainId } from './config.js'\n\ntest('default', () => {\n  const client = usePublicClient()\n  expectTypeOf(client.chain.id).toEqualTypeOf<ChainId>()\n  expectTypeOf(client.transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('parameters: config', () => {\n  const client = usePublicClient({ config })\n  expectTypeOf(client.chain.id).toEqualTypeOf<\n    (typeof config)['chains'][number]['id']\n  >()\n  expectTypeOf(client.transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('parameters: chainId', () => {\n  const client = usePublicClient({\n    config,\n    chainId: mainnet.id,\n  })\n  expectTypeOf(client.chain).toEqualTypeOf<typeof chain.mainnet>()\n  expectTypeOf(client.transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('behavior: unconfigured chain', () => {\n  const client = usePublicClient({\n    config,\n    // @ts-expect-error\n    chainId: 123456,\n  })\n  expectTypeOf(client).toEqualTypeOf<undefined>()\n})\n"
  },
  {
    "path": "packages/register-tests/react/src/useReadContract.test-d.ts",
    "content": "import { abi } from '@wagmi/test'\nimport type { Address } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport { useReadContract } from 'wagmi'\n\nimport type { ChainId } from './config.js'\n\ntest('UseReadContractParameters', () => {\n  type Result = NonNullable<\n    Parameters<typeof useReadContract<typeof abi.erc20, 'balanceOf', ['0x']>>[0]\n  >\n  expectTypeOf<Result>().toMatchTypeOf<{\n    functionName?:\n      | 'symbol'\n      | 'name'\n      | 'allowance'\n      | 'balanceOf'\n      | 'decimals'\n      | 'totalSupply'\n      | undefined\n    args?: readonly [Address] | undefined\n    chainId?: ChainId | undefined\n  }>()\n\n  const result = useReadContract({\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'balanceOf',\n    args: ['0x'],\n    query: {\n      select(data) {\n        expectTypeOf(data).toEqualTypeOf<bigint>()\n        return data?.toString()\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<string | undefined>()\n})\n"
  },
  {
    "path": "packages/register-tests/react/src/useReadContracts.test-d.ts",
    "content": "import type { abi } from '@wagmi/test'\nimport type { Address } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport type { useReadContracts } from 'wagmi'\n\nimport type { ChainId } from './config.js'\n\ntest('UseReadContractsParameters', () => {\n  type Result = NonNullable<\n    Parameters<\n      typeof useReadContracts<\n        [\n          {\n            abi: typeof abi.erc20\n            functionName: 'balanceOf'\n            address: Address\n            args: readonly [Address]\n          },\n        ]\n      >\n    >[0]\n  >['contracts']\n  expectTypeOf<Result>().toMatchTypeOf<\n    | readonly [\n        {\n          abi?: typeof abi.erc20 | undefined\n          functionName?:\n            | 'approve'\n            | 'symbol'\n            | 'name'\n            | 'allowance'\n            | 'balanceOf'\n            | 'decimals'\n            | 'totalSupply'\n            | 'transfer'\n            | 'transferFrom'\n            | undefined\n          address?: Address | undefined\n          args?: readonly [Address] | undefined\n          chainId?: ChainId | undefined\n        },\n      ]\n    | undefined\n  >()\n})\n"
  },
  {
    "path": "packages/register-tests/react/src/useSendTransaction.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\nimport { useSendTransaction } from 'wagmi'\nimport { celo, mainnet, optimism } from 'wagmi/chains'\nimport type { ChainId } from './config.js'\n\ntest('chain formatters', () => {\n  const { mutate } = useSendTransaction()\n\n  mutate(\n    {\n      to: '0x',\n      feeCurrency: '0x',\n    },\n    {\n      onSuccess(_data, variables) {\n        expectTypeOf(variables.chainId).toEqualTypeOf<ChainId | undefined>()\n      },\n    },\n  )\n\n  type Result = Parameters<typeof mutate<typeof celo.id>>[0]\n  expectTypeOf<Result['feeCurrency']>().toEqualTypeOf<\n    `0x${string}` | undefined\n  >()\n  mutate({\n    chainId: celo.id,\n    to: '0x',\n    feeCurrency: '0x',\n  })\n\n  mutate({\n    chainId: mainnet.id,\n    to: '0x',\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n\n  mutate({\n    chainId: optimism.id,\n    to: '0x',\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n})\n\ntest('parameters: config', async () => {\n  const { mutate } = useSendTransaction({ config })\n\n  mutate({\n    to: '0x',\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n})\n"
  },
  {
    "path": "packages/register-tests/react/src/useSimulateContract.test-d.ts",
    "content": "import { type abi, config as testConfig } from '@wagmi/test'\nimport type { Address } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport { type UseSimulateContractParameters, useSimulateContract } from 'wagmi'\nimport { celo, mainnet, optimism } from 'wagmi/chains'\nimport type { SimulateContractOptions } from 'wagmi/query'\nimport type { ChainId, config } from './config.js'\n\ntest('chain formatters', () => {\n  const { data } = useSimulateContract({\n    feeCurrency: '0x',\n  })\n  if (data && data.chainId === celo.id) {\n    expectTypeOf(data.request.feeCurrency).toEqualTypeOf<\n      `0x${string}` | undefined\n    >()\n  }\n\n  const { data: data2 } = useSimulateContract({\n    chainId: celo.id,\n    feeCurrency: '0x',\n  })\n  if (data2) {\n    expectTypeOf(data2.request.feeCurrency).toEqualTypeOf<\n      `0x${string}` | undefined\n    >()\n  }\n\n  useSimulateContract({\n    chainId: mainnet.id,\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n\n  useSimulateContract({\n    chainId: optimism.id,\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n})\n\ntest('UseSimulateContractParameters', () => {\n  type Result = UseSimulateContractParameters<\n    typeof abi.erc20,\n    'transferFrom',\n    [Address, Address, bigint],\n    typeof config\n  >\n  const res = {} as Result\n  expectTypeOf(res.functionName).toEqualTypeOf<\n    'approve' | 'transfer' | 'transferFrom' | undefined\n  >()\n  if (res.args) {\n    expectTypeOf(res.args[0]).toEqualTypeOf<Address>()\n    expectTypeOf(res.args[1]).toEqualTypeOf<Address>()\n    expectTypeOf(res.args[2]).toEqualTypeOf<bigint>()\n  }\n  expectTypeOf(res.chainId).toEqualTypeOf<ChainId | undefined>()\n\n  type Result2 = UseSimulateContractParameters<\n    typeof abi.erc20,\n    'transferFrom',\n    [Address, Address, bigint],\n    typeof config,\n    typeof celo.id\n  >\n  const res2 = {} as Result2\n  expectTypeOf(res2.chainId).toEqualTypeOf<ChainId | undefined>()\n  expectTypeOf(res2.feeCurrency).toEqualTypeOf<`0x${string}` | undefined>()\n\n  type Result3 = UseSimulateContractParameters<\n    typeof abi.erc20,\n    'transferFrom',\n    [Address, Address, bigint],\n    typeof config,\n    typeof celo.id\n  >\n  expectTypeOf(({} as Result3).chainId).toEqualTypeOf<ChainId | undefined>()\n\n  type Result4 = SimulateContractOptions<\n    typeof abi.erc20,\n    'transferFrom',\n    [Address, Address, bigint],\n    typeof config,\n    typeof celo.id\n  >\n  expectTypeOf<Result4['chainId']>().toEqualTypeOf<ChainId | undefined>()\n})\n\ntest('parameters: config', async () => {\n  useSimulateContract({\n    config: testConfig,\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n})\n"
  },
  {
    "path": "packages/register-tests/react/src/useSwitchChain.test-d.ts",
    "content": "import { expectTypeOf, test } from 'vitest'\nimport { useSwitchChain } from 'wagmi'\nimport { mainnet } from 'wagmi/chains'\nimport type { ChainId } from './config.js'\n\ntest('default', () => {\n  const { mutate } = useSwitchChain()\n\n  mutate(\n    { chainId: 1 },\n    {\n      onSuccess(data) {\n        expectTypeOf(data).toEqualTypeOf(mainnet)\n      },\n    },\n  )\n\n  type Result = Parameters<typeof mutate>[0]\n  expectTypeOf<Result['chainId']>().toEqualTypeOf<ChainId>()\n})\n"
  },
  {
    "path": "packages/register-tests/react/src/useTransaction.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\nimport { useTransaction } from 'wagmi'\nimport { celo } from 'wagmi/chains'\n\ntest('chain formatters', () => {\n  const result = useTransaction()\n  if (result.data?.chainId === celo.id) {\n    expectTypeOf(result.data.feeCurrency).toEqualTypeOf<`0x${string}` | null>()\n  }\n\n  const result2 = useTransaction({ chainId: celo.id })\n  expectTypeOf(result2.data?.feeCurrency).toEqualTypeOf<\n    `0x${string}` | null | undefined\n  >()\n})\n\ntest('parameters: config', async () => {\n  const result = useTransaction({ config })\n\n  if (result.data && 'feeCurrency' in result.data)\n    expectTypeOf(result.data.feeCurrency).toEqualTypeOf<unknown>()\n})\n"
  },
  {
    "path": "packages/register-tests/react/src/useTransactionConfirmations.test-d.ts",
    "content": "import { config as testConfig } from '@wagmi/test'\nimport { test } from 'vitest'\nimport { useTransactionConfirmations } from 'wagmi'\nimport { mainnet, zkSync } from 'wagmi/chains'\n\nconst transactionReceipt = {\n  blockHash: '0x',\n  blockNumber: 1n,\n  contractAddress: '0x',\n  cumulativeGasUsed: 1n,\n  effectiveGasPrice: 1n,\n  from: '0x',\n  gasUsed: 1n,\n  logsBloom: '0x',\n  status: 'success',\n  to: '0x',\n  transactionHash: '0x',\n  transactionIndex: 1,\n  type: 'eip1559',\n} as const\n\ntest('chain formatters', async () => {\n  useTransactionConfirmations({\n    transactionReceipt: {\n      ...transactionReceipt,\n      l1BatchNumber: 1n,\n      l1BatchTxIndex: 1n,\n      logs: [],\n      l2ToL1Logs: [],\n    },\n  })\n\n  useTransactionConfirmations({\n    chainId: zkSync.id,\n    transactionReceipt: {\n      ...transactionReceipt,\n      l1BatchNumber: 1n,\n      l1BatchTxIndex: 1n,\n      logs: [],\n      l2ToL1Logs: [],\n    },\n  })\n\n  useTransactionConfirmations({\n    chainId: mainnet.id,\n    transactionReceipt: {\n      ...transactionReceipt,\n      // @ts-expect-error\n      l1BatchNumber: 1n,\n      l1BatchTxIndex: 1n,\n      logs: [],\n      l2ToL1Logs: [],\n    },\n  })\n})\n\ntest('parameters: config', async () => {\n  useTransactionConfirmations({\n    config: testConfig,\n    transactionReceipt: {\n      ...transactionReceipt,\n      // @ts-expect-error\n      l1BatchNumber: 1n,\n    },\n  })\n})\n"
  },
  {
    "path": "packages/register-tests/react/src/useTransactionReceipt.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport type { ZkSyncL2ToL1Log, ZkSyncLog } from 'viem/zksync'\nimport { expectTypeOf, test } from 'vitest'\nimport { useTransactionReceipt } from 'wagmi'\nimport { zkSync } from 'wagmi/chains'\n\ntest('chain formatters', () => {\n  const result = useTransactionReceipt()\n\n  if (result.data?.chainId === zkSync.id) {\n    expectTypeOf(result.data.l1BatchNumber).toEqualTypeOf<bigint | null>()\n    expectTypeOf(result.data.l1BatchTxIndex).toEqualTypeOf<bigint | null>()\n    expectTypeOf(result.data.logs).toEqualTypeOf<ZkSyncLog[]>()\n    expectTypeOf(result.data.l2ToL1Logs).toEqualTypeOf<ZkSyncL2ToL1Log[]>()\n  }\n\n  const result2 = useTransactionReceipt({ chainId: zkSync.id })\n  if (result2.data) {\n    expectTypeOf(result2.data.l1BatchNumber).toEqualTypeOf<bigint | null>()\n    expectTypeOf(result2.data.l1BatchTxIndex).toEqualTypeOf<bigint | null>()\n    expectTypeOf(result2.data.logs).toEqualTypeOf<ZkSyncLog[]>()\n    expectTypeOf(result2.data.l2ToL1Logs).toEqualTypeOf<ZkSyncL2ToL1Log[]>()\n  }\n})\n\ntest('parameters: config', async () => {\n  const result = useTransactionReceipt({ config })\n\n  if (result.data && 'l1BatchNumber' in result.data)\n    expectTypeOf(result.data.l1BatchNumber).toEqualTypeOf<unknown>()\n})\n"
  },
  {
    "path": "packages/register-tests/react/src/useWaitForTransactionReceipt.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport type { ZkSyncL2ToL1Log, ZkSyncLog } from 'viem/zksync'\nimport { expectTypeOf, test } from 'vitest'\nimport { useWaitForTransactionReceipt } from 'wagmi'\nimport { zkSync } from 'wagmi/chains'\n\ntest('chain formatters', () => {\n  const result = useWaitForTransactionReceipt()\n\n  if (result.data?.chainId === zkSync.id) {\n    expectTypeOf(result.data.l1BatchNumber).toEqualTypeOf<bigint | null>()\n    expectTypeOf(result.data.l1BatchTxIndex).toEqualTypeOf<bigint | null>()\n    expectTypeOf(result.data.logs).toEqualTypeOf<ZkSyncLog[]>()\n    expectTypeOf(result.data.l2ToL1Logs).toEqualTypeOf<ZkSyncL2ToL1Log[]>()\n  }\n\n  const result2 = useWaitForTransactionReceipt({ chainId: zkSync.id })\n  if (result2.data) {\n    expectTypeOf(result2.data.l1BatchNumber).toEqualTypeOf<bigint | null>()\n    expectTypeOf(result2.data.l1BatchTxIndex).toEqualTypeOf<bigint | null>()\n    expectTypeOf(result2.data.logs).toEqualTypeOf<ZkSyncLog[]>()\n    expectTypeOf(result2.data.l2ToL1Logs).toEqualTypeOf<ZkSyncL2ToL1Log[]>()\n  }\n})\n\ntest('parameters: config', async () => {\n  const result = useWaitForTransactionReceipt({ config })\n\n  if (result.data && 'l1BatchNumber' in result.data)\n    expectTypeOf(result.data.l1BatchNumber).toEqualTypeOf<unknown>()\n})\n"
  },
  {
    "path": "packages/register-tests/react/src/useWriteContract.test-d.ts",
    "content": "import { abi, config } from '@wagmi/test'\nimport type { Address } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport { useWriteContract } from 'wagmi'\nimport { celo, mainnet, optimism } from 'wagmi/chains'\n\ntest('chain formatters', () => {\n  const { mutate } = useWriteContract()\n\n  const shared = {\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n  } as const\n\n  mutate({\n    ...shared,\n    feeCurrency: '0x',\n  })\n\n  type Result = Parameters<\n    typeof mutate<\n      typeof abi.erc20,\n      'transferFrom',\n      [Address, Address, bigint],\n      typeof celo.id\n    >\n  >[0]\n  expectTypeOf<Result['feeCurrency']>().toEqualTypeOf<\n    `0x${string}` | undefined\n  >()\n  mutate({\n    ...shared,\n    chainId: celo.id,\n    feeCurrency: '0x',\n  })\n\n  mutate({\n    ...shared,\n    chainId: mainnet.id,\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n\n  mutate({\n    ...shared,\n    chainId: optimism.id,\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n})\n\ntest('parameters: config', async () => {\n  const { mutate } = useWriteContract({ config })\n\n  mutate({\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n})\n"
  },
  {
    "path": "packages/register-tests/react/tsconfig.json",
    "content": "{\n  \"extends\": \"../../../tsconfig.base.json\",\n  \"include\": [\"src/**/*.ts\"],\n  \"exclude\": []\n}\n"
  },
  {
    "path": "packages/register-tests/solid/package.json",
    "content": "{\n  \"name\": \"solid-register\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"check:types\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@tanstack/solid-query\": \"catalog:\",\n    \"@wagmi/solid\": \"workspace:*\",\n    \"solid-js\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "packages/register-tests/solid/src/config.ts",
    "content": "import { createConfig, createConnector, mock } from '@wagmi/solid'\nimport { celo, mainnet, optimism, zkSync } from '@wagmi/solid/chains'\nimport { type Address, http } from 'viem'\n\nexport const config = createConfig({\n  chains: [celo, mainnet, optimism, zkSync],\n  connectors: [mock({ accounts: ['0x'] }), foo()],\n  transports: {\n    [celo.id]: http(),\n    [mainnet.id]: http(),\n    [optimism.id]: http(),\n    [zkSync.id]: http(),\n  },\n})\n\nexport type ChainId =\n  | typeof celo.id\n  | typeof mainnet.id\n  | typeof optimism.id\n  | typeof zkSync.id\n\ndeclare module '@wagmi/solid' {\n  interface Register {\n    config: typeof config\n  }\n}\n\nexport function foo() {\n  type Properties = {\n    // TODO(v3): Make `withCapabilities: true` default behavior\n    connect<withCapabilities extends boolean = false>(parameters?: {\n      chainId?: number | undefined\n      isReconnecting?: boolean | undefined\n      capabilities?: {\n        signInWithEthereum?: { nonce: string } | undefined\n      }\n      withCapabilities?: withCapabilities | boolean | undefined\n    }): Promise<{\n      accounts: withCapabilities extends true\n        ? readonly {\n            capabilities: {\n              signInWithEthereum: {\n                message: string\n                signature: string\n              }\n            }\n          }[]\n        : readonly Address[]\n      chainId: number\n    }>\n  }\n\n  return createConnector<unknown, Properties>((_config) => ({}) as never)\n}\n"
  },
  {
    "path": "packages/register-tests/solid/src/useChainId.test-d.ts",
    "content": "import { useChainId } from '@wagmi/solid'\nimport { config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\nimport type { ChainId } from './config.js'\n\ntest('default', async () => {\n  const chainId = useChainId()\n  expectTypeOf(chainId()).toEqualTypeOf<ChainId>()\n})\n\ntest('parameters: config', async () => {\n  const chainId = useChainId(() => ({ config }))\n  expectTypeOf(chainId()).toEqualTypeOf<1 | 456 | 10>()\n})\n"
  },
  {
    "path": "packages/register-tests/solid/src/useChains.test-d.ts",
    "content": "import { useChains } from '@wagmi/solid'\nimport type { celo, mainnet, optimism, zkSync } from '@wagmi/solid/chains'\nimport { config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\ntest('default', () => {\n  const chains = useChains()\n  expectTypeOf(chains()).toEqualTypeOf<\n    readonly [typeof celo, typeof mainnet, typeof optimism, typeof zkSync]\n  >()\n})\n\ntest('parameters: config', () => {\n  const chains = useChains(() => ({ config }))\n  expectTypeOf(chains()).toEqualTypeOf<(typeof config)['chains']>()\n})\n"
  },
  {
    "path": "packages/register-tests/solid/src/useClient.test-d.ts",
    "content": "import { useClient } from '@wagmi/solid'\nimport { mainnet } from '@wagmi/solid/chains'\nimport { type chain, config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\nimport type { ChainId } from './config.js'\n\ntest('default', () => {\n  const client = useClient()\n  expectTypeOf(client().chain.id).toEqualTypeOf<ChainId>()\n  expectTypeOf(client().transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('parameters: config', () => {\n  const client = useClient(() => ({ config }))\n  expectTypeOf(client().chain.id).toEqualTypeOf<\n    (typeof config)['chains'][number]['id']\n  >()\n  expectTypeOf(client().transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('parameters: chainId', () => {\n  const client = useClient(() => ({\n    config,\n    chainId: mainnet.id,\n  }))\n  expectTypeOf(client().chain).toEqualTypeOf<typeof chain.mainnet>()\n  expectTypeOf(client().transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('behavior: unconfigured chain', () => {\n  const client = useClient(\n    // @ts-expect-error chainId 123456 is not configured\n    () => ({\n      config,\n      chainId: 123456,\n    }),\n  )\n  expectTypeOf(client()).toEqualTypeOf<undefined>()\n})\n"
  },
  {
    "path": "packages/register-tests/solid/src/useConfig.test-d.ts",
    "content": "import { type Config, useConfig } from '@wagmi/solid'\nimport { config as testConfig } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\nimport type { config } from './config.js'\n\ntest('default', async () => {\n  const result = useConfig()\n  expectTypeOf(result()).not.toEqualTypeOf<Config>()\n  expectTypeOf(result()).toEqualTypeOf<typeof config>()\n})\n\ntest('parameters: config', async () => {\n  const result = useConfig(() => ({ config: testConfig }))\n  expectTypeOf(result()).not.toEqualTypeOf<Config>()\n  expectTypeOf(result()).toEqualTypeOf<typeof testConfig>()\n})\n"
  },
  {
    "path": "packages/register-tests/solid/src/useConnect.test-d.ts",
    "content": "import { useConnect, useConnectors } from '@wagmi/solid'\nimport type { Address, Hex } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\n\ntest('infers connect parameters', () => {\n  const connect = useConnect()\n  const connectors = useConnectors()\n  const connector = connectors()[0]! as ReturnType<typeof connectors>[number]\n\n  connect.mutate({\n    connector,\n    foo: 'bar',\n  })\n  connect.mutate({\n    connector: connectors()[1],\n    // @ts-expect-error\n    foo: 'bar',\n  })\n  connect.mutate({\n    connector,\n    capabilities: {\n      signInWithEthereum: {\n        nonce: 'foobarbaz',\n      },\n    },\n  })\n  connect.mutate({\n    connector: connectors()[0],\n    // @ts-expect-error\n    capabilities: {\n      signInWithEthereum: {\n        nonce: 'foobarbaz',\n      },\n    },\n  })\n\n  connect.mutate(\n    {\n      connector,\n      foo: 'bar',\n      withCapabilities: true,\n    },\n    {\n      onSuccess(data, _variables, _context) {\n        expectTypeOf(data.accounts).toEqualTypeOf<\n          readonly [\n            {\n              address: Address\n              capabilities:\n                | {\n                    foo: { bar: Hex }\n                  }\n                | {\n                    signInWithEthereum: {\n                      message: string\n                      signature: string\n                    }\n                  }\n            },\n            ...{\n              address: Address\n              capabilities:\n                | {\n                    foo: { bar: Hex }\n                  }\n                | {\n                    signInWithEthereum: {\n                      message: string\n                      signature: string\n                    }\n                  }\n            }[],\n          ]\n        >()\n      },\n      onSettled(data, _error, _variables, _context) {\n        expectTypeOf(data?.accounts).toEqualTypeOf<\n          | readonly [\n              {\n                address: Address\n                capabilities:\n                  | {\n                      foo: { bar: Hex }\n                    }\n                  | {\n                      signInWithEthereum: {\n                        message: string\n                        signature: string\n                      }\n                    }\n              },\n              ...{\n                address: Address\n                capabilities:\n                  | {\n                      foo: { bar: Hex }\n                    }\n                  | {\n                      signInWithEthereum: {\n                        message: string\n                        signature: string\n                      }\n                    }\n              }[],\n            ]\n          | undefined\n        >()\n      },\n    },\n  )\n\n  ;(async () => {\n    await connect.mutateAsync({\n      connector,\n      foo: 'bar',\n      withCapabilities: true,\n    })\n    const res = await connect.mutateAsync({\n      connector,\n      capabilities: {\n        signInWithEthereum: {\n          nonce: 'foobarbaz',\n        },\n      },\n      withCapabilities: true,\n    })\n    expectTypeOf(res.accounts).toEqualTypeOf<\n      readonly [\n        {\n          address: Address\n          capabilities:\n            | {\n                foo: { bar: Hex }\n              }\n            | {\n                signInWithEthereum: {\n                  message: string\n                  signature: string\n                }\n              }\n        },\n        ...{\n          address: Address\n          capabilities:\n            | {\n                foo: { bar: Hex }\n              }\n            | {\n                signInWithEthereum: {\n                  message: string\n                  signature: string\n                }\n              }\n        }[],\n      ]\n    >()\n  })()\n})\n"
  },
  {
    "path": "packages/register-tests/solid/src/useConnection.test-d.ts",
    "content": "import { useConnection } from '@wagmi/solid'\nimport { config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\nimport type { ChainId } from './config.js'\n\ntest('default', () => {\n  const result = useConnection()\n  const connection = result()\n  if (connection.chain)\n    expectTypeOf(connection.chain.id).toEqualTypeOf<ChainId>()\n})\n\ntest('parameters: config', async () => {\n  const result = useConnection(() => ({ config }))\n  const connection = result()\n  if (connection.chain)\n    expectTypeOf(connection.chain.id).toEqualTypeOf<1 | 10 | 456>()\n})\n"
  },
  {
    "path": "packages/register-tests/solid/src/useSwitchChain.test-d.ts",
    "content": "import { useSwitchChain } from '@wagmi/solid'\nimport { mainnet } from '@wagmi/solid/chains'\nimport { expectTypeOf, test } from 'vitest'\nimport type { ChainId } from './config.js'\n\ntest('default', () => {\n  const switchChain = useSwitchChain()\n\n  switchChain.mutate(\n    { chainId: 1 },\n    {\n      onSuccess(data) {\n        expectTypeOf(data).toEqualTypeOf(mainnet)\n      },\n    },\n  )\n\n  type Result = Parameters<(typeof switchChain)['mutate']>[0]\n  expectTypeOf<Result['chainId']>().toEqualTypeOf<ChainId>()\n})\n"
  },
  {
    "path": "packages/register-tests/solid/tsconfig.json",
    "content": "{\n  \"extends\": \"../../../tsconfig.base.json\",\n  \"include\": [\"src/**/*.ts\"],\n  \"exclude\": []\n}\n"
  },
  {
    "path": "packages/register-tests/vue/package.json",
    "content": "{\n  \"name\": \"vue-register\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"check:types\": \"tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@tanstack/vue-query\": \"catalog:\",\n    \"@wagmi/vue\": \"workspace:*\",\n    \"vue\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "packages/register-tests/vue/src/config.ts",
    "content": "import { createConfig, mock } from '@wagmi/vue'\nimport { celo, mainnet, optimism, zkSync } from '@wagmi/vue/chains'\nimport { http } from 'viem'\n\nexport const config = createConfig({\n  chains: [celo, mainnet, optimism, zkSync],\n  connectors: [mock({ accounts: ['0x'] })],\n  transports: {\n    [celo.id]: http(),\n    [mainnet.id]: http(),\n    [optimism.id]: http(),\n    [zkSync.id]: http(),\n  },\n})\n\nexport type ChainId =\n  | typeof celo.id\n  | typeof mainnet.id\n  | typeof optimism.id\n  | typeof zkSync.id\n\ndeclare module '@wagmi/vue' {\n  interface Register {\n    config: typeof config\n  }\n}\n"
  },
  {
    "path": "packages/register-tests/vue/src/useChainId.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport { useChainId } from '@wagmi/vue'\nimport { expectTypeOf, test } from 'vitest'\n\nimport type { ChainId } from './config.js'\n\ntest('default', async () => {\n  const chainId = useChainId()\n  expectTypeOf(chainId.value).toEqualTypeOf<ChainId>()\n})\n\ntest('parameters: config', async () => {\n  const chainId = useChainId({ config })\n  expectTypeOf(chainId.value).toEqualTypeOf<1 | 456 | 10>()\n})\n"
  },
  {
    "path": "packages/register-tests/vue/src/useChains.test-d.ts",
    "content": "import { useChains } from '@wagmi/vue'\nimport type { celo, optimism, zkSync } from '@wagmi/vue/chains'\nimport { expectTypeOf, test } from 'vitest'\n\ntest('default', () => {\n  const chains = useChains()\n\n  expectTypeOf(chains.value[0]).toEqualTypeOf<typeof celo>()\n  expectTypeOf(chains.value[2]).toEqualTypeOf<typeof optimism>()\n  expectTypeOf(chains.value[3]).toEqualTypeOf<typeof zkSync>()\n})\n"
  },
  {
    "path": "packages/register-tests/vue/src/useClient.test-d.ts",
    "content": "import { type chain, config } from '@wagmi/test'\nimport { useClient } from '@wagmi/vue'\nimport { mainnet } from '@wagmi/vue/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport type { ChainId } from './config.js'\n\ntest('default', () => {\n  const client = useClient()\n  expectTypeOf(client.value.chain.id).toEqualTypeOf<ChainId>()\n  expectTypeOf(client.value.transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('parameters: config', () => {\n  const client = useClient({ config })\n  expectTypeOf(client.value.chain.id).toEqualTypeOf<\n    (typeof config)['chains'][number]['id']\n  >()\n  expectTypeOf(client.value.transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('parameters: chainId', () => {\n  const client = useClient({\n    config,\n    chainId: mainnet.id,\n  })\n  expectTypeOf(client.value.chain).toEqualTypeOf<typeof chain.mainnet>()\n  expectTypeOf(client.value.transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('behavior: unconfigured chain', () => {\n  const client = useClient({\n    config,\n    // @ts-expect-error\n    chainId: 123456,\n  })\n  expectTypeOf(client.value).toEqualTypeOf<undefined>()\n})\n"
  },
  {
    "path": "packages/register-tests/vue/src/useConfig.test-d.ts",
    "content": "import { config as testConfig } from '@wagmi/test'\nimport { type Config, useConfig } from '@wagmi/vue'\nimport { expectTypeOf, test } from 'vitest'\n\nimport type { config } from './config.js'\n\ntest('default', async () => {\n  const result = useConfig()\n  expectTypeOf(result).not.toEqualTypeOf<Config>()\n  expectTypeOf(result).toEqualTypeOf<typeof config>()\n})\n\ntest('parameters: config', async () => {\n  const result = useConfig({ config: testConfig })\n  expectTypeOf(result).not.toEqualTypeOf<Config>()\n  expectTypeOf(result).toEqualTypeOf<typeof testConfig>()\n})\n"
  },
  {
    "path": "packages/register-tests/vue/src/useConnect.test-d.ts",
    "content": "import { useConnect, useConnectors } from '@wagmi/vue'\nimport type { Address, Hex } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\n\ntest('infers connect parameters', () => {\n  const connect = useConnect()\n  const connectors = useConnectors()\n  const connector = connectors.value[0]!\n\n  expectTypeOf(connect.variables.value?.foo).toEqualTypeOf<string | undefined>()\n  connect.mutate({\n    connector,\n    foo: 'bar',\n  })\n\n  connect.mutate(\n    {\n      connector,\n      foo: 'bar',\n      withCapabilities: true,\n    },\n    {\n      onSuccess(data, _variables, _context) {\n        expectTypeOf(data.accounts).toEqualTypeOf<\n          readonly [\n            {\n              address: Address\n              capabilities: {\n                foo: { bar: Hex }\n              }\n            },\n            ...{\n              address: Address\n              capabilities: {\n                foo: { bar: Hex }\n              }\n            }[],\n          ]\n        >()\n      },\n      onSettled(data, _error, _variables, _context) {\n        expectTypeOf(data?.accounts).toEqualTypeOf<\n          | readonly [\n              {\n                address: Address\n                capabilities: {\n                  foo: { bar: Hex }\n                }\n              },\n              ...{\n                address: Address\n                capabilities: {\n                  foo: { bar: Hex }\n                }\n              }[],\n            ]\n          | undefined\n        >()\n      },\n    },\n  )\n\n  ;(async () => {\n    const res = await connect.mutateAsync({\n      connector,\n      foo: 'bar',\n      withCapabilities: true,\n    })\n    expectTypeOf(res.accounts).toEqualTypeOf<\n      readonly [\n        {\n          address: Address\n          capabilities: {\n            foo: { bar: Hex }\n          }\n        },\n        ...{\n          address: Address\n          capabilities: {\n            foo: { bar: Hex }\n          }\n        }[],\n      ]\n    >()\n  })()\n})\n"
  },
  {
    "path": "packages/register-tests/vue/src/useConnection.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport { useConnection } from '@wagmi/vue'\nimport { expectTypeOf, test } from 'vitest'\n\nimport type { ChainId } from './config.js'\n\ntest('default', () => {\n  const result = useConnection()\n  if (result.chain.value)\n    expectTypeOf(result.chain.value.id).toEqualTypeOf<ChainId>()\n})\n\ntest('parameters: config', async () => {\n  const result = useConnection({ config })\n  if (result.chain.value)\n    expectTypeOf(result.chain.value.id).toEqualTypeOf<1 | 10 | 456>()\n})\n"
  },
  {
    "path": "packages/register-tests/vue/src/useReadContract.test-d.ts",
    "content": "import type { abi } from '@wagmi/test'\nimport type { useReadContract } from '@wagmi/vue'\nimport type { Address } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\n\nimport type { DeepUnwrapRef } from '../../../vue/src/types/ref.js'\nimport type { ChainId } from './config.js'\n\ntest('UseReadContractParameters', () => {\n  type Result = DeepUnwrapRef<\n    NonNullable<\n      Parameters<\n        typeof useReadContract<typeof abi.erc20, 'balanceOf', ['0x']>\n      >[0]\n    >\n  >\n\n  expectTypeOf<Result>().toMatchTypeOf<{\n    functionName?:\n      | 'symbol'\n      | 'name'\n      | 'allowance'\n      | 'balanceOf'\n      | 'decimals'\n      | 'totalSupply'\n      | undefined\n    args?: readonly [Address] | undefined\n    chainId?: ChainId | undefined\n  }>()\n})\n"
  },
  {
    "path": "packages/register-tests/vue/src/useSendTransaction.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport { useSendTransaction } from '@wagmi/vue'\nimport { celo, mainnet, optimism } from '@wagmi/vue/chains'\nimport { expectTypeOf, test } from 'vitest'\nimport type { ChainId } from './config.js'\n\ntest('chain formatters', () => {\n  const { mutate } = useSendTransaction()\n\n  mutate(\n    {\n      to: '0x',\n      feeCurrency: '0x',\n    },\n    {\n      onSuccess(_data, variables) {\n        expectTypeOf(variables.chainId).toEqualTypeOf<ChainId | undefined>()\n      },\n    },\n  )\n\n  type Result = Parameters<typeof mutate<typeof celo.id>>[0]\n  expectTypeOf<Result['feeCurrency']>().toEqualTypeOf<\n    `0x${string}` | undefined\n  >()\n  mutate({\n    chainId: celo.id,\n    to: '0x',\n    feeCurrency: '0x',\n  })\n\n  mutate({\n    chainId: mainnet.id,\n    to: '0x',\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n\n  mutate({\n    chainId: optimism.id,\n    to: '0x',\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n})\n\ntest('parameters: config', async () => {\n  const { mutate } = useSendTransaction({ config })\n\n  mutate({\n    to: '0x',\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n})\n"
  },
  {
    "path": "packages/register-tests/vue/src/useSimulateContract.test-d.ts",
    "content": "import type { abi } from '@wagmi/test'\nimport {\n  type UseSimulateContractParameters,\n  useSimulateContract,\n} from '@wagmi/vue'\nimport { celo, mainnet, optimism } from '@wagmi/vue/chains'\nimport type { SimulateContractOptions } from '@wagmi/vue/query'\nimport type { Address } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport type { ChainId, config } from './config.js'\n\ntest('chain formatters', () => {\n  const { data } = useSimulateContract({\n    feeCurrency: '0x',\n  })\n  if (data.value && data.value.chainId === celo.id) {\n    expectTypeOf(data.value.request.feeCurrency).toEqualTypeOf<\n      `0x${string}` | undefined\n    >()\n  }\n\n  const { data: data2 } = useSimulateContract({\n    chainId: celo.id,\n    feeCurrency: '0x',\n  })\n  if (data2.value) {\n    expectTypeOf(data2.value.request.feeCurrency).toEqualTypeOf<\n      `0x${string}` | undefined\n    >()\n  }\n\n  useSimulateContract({\n    chainId: mainnet.id,\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n\n  useSimulateContract({\n    chainId: optimism.id,\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n})\n\ntest('UseSimulateContractParameters', () => {\n  type Result = UseSimulateContractParameters<\n    typeof abi.erc20,\n    'transferFrom',\n    [Address, Address, bigint],\n    typeof config\n  >\n  const res = {} as Result\n  expectTypeOf(res.value?.functionName).toEqualTypeOf<\n    'approve' | 'transfer' | 'transferFrom' | undefined\n  >()\n  if (res.value?.args) {\n    expectTypeOf(res.value.args[0]).toEqualTypeOf<Address>()\n    expectTypeOf(res.value.args[1]).toEqualTypeOf<Address>()\n    expectTypeOf(res.value.args[2]).toEqualTypeOf<bigint>()\n  }\n  expectTypeOf(res.value?.chainId).toEqualTypeOf<ChainId | undefined>()\n\n  type Result2 = UseSimulateContractParameters<\n    typeof abi.erc20,\n    'transferFrom',\n    [Address, Address, bigint],\n    typeof config,\n    typeof celo.id\n  >\n  expectTypeOf(({} as Result2).value?.chainId).toEqualTypeOf<\n    ChainId | undefined\n  >()\n\n  type Result3 = UseSimulateContractParameters<\n    typeof abi.erc20,\n    'transferFrom',\n    [Address, Address, bigint],\n    typeof config,\n    typeof celo.id\n  >\n  expectTypeOf(({} as Result3).value?.chainId).toEqualTypeOf<\n    ChainId | undefined\n  >()\n\n  type Result4 = SimulateContractOptions<\n    typeof abi.erc20,\n    'transferFrom',\n    [Address, Address, bigint],\n    typeof config,\n    typeof celo.id\n  >\n  expectTypeOf<Result4['chainId']>().toEqualTypeOf<ChainId | undefined>()\n})\n"
  },
  {
    "path": "packages/register-tests/vue/src/useSwitchChain.test-d.ts",
    "content": "import { useSwitchChain } from '@wagmi/vue'\nimport { mainnet } from '@wagmi/vue/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport type { ChainId } from './config.js'\n\ntest('default', () => {\n  const switchChain = useSwitchChain()\n\n  switchChain.switchChain(\n    { chainId: 1 },\n    {\n      onSuccess(data) {\n        expectTypeOf(data).toEqualTypeOf(mainnet)\n      },\n    },\n  )\n\n  type Result = Parameters<(typeof switchChain)['switchChain']>[0]\n  expectTypeOf<Result['chainId']>().toEqualTypeOf<ChainId>()\n})\n"
  },
  {
    "path": "packages/register-tests/vue/src/useTransaction.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport { useTransaction } from '@wagmi/vue'\nimport { celo } from '@wagmi/vue/chains'\nimport { expectTypeOf, test } from 'vitest'\n\ntest('chain formatters', () => {\n  const result = useTransaction()\n  if (result.data?.value?.chainId === celo.id) {\n    expectTypeOf(result.data.value.feeCurrency).toEqualTypeOf<\n      `0x${string}` | null\n    >()\n  }\n\n  const result2 = useTransaction({ chainId: celo.id })\n  expectTypeOf(result2.data?.value?.feeCurrency).toEqualTypeOf<\n    `0x${string}` | null | undefined\n  >()\n})\n\ntest('parameters: config', async () => {\n  const result = useTransaction({ config })\n\n  if (result.data && 'feeCurrency' in result.data)\n    expectTypeOf(result.data.feeCurrency).toEqualTypeOf<unknown>()\n})\n"
  },
  {
    "path": "packages/register-tests/vue/src/useTransactionReceipt.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport { useTransactionReceipt } from '@wagmi/vue'\nimport { zkSync } from '@wagmi/vue/chains'\nimport type { ZkSyncL2ToL1Log, ZkSyncLog } from 'viem/zksync'\nimport { expectTypeOf, test } from 'vitest'\n\ntest('chain formatters', () => {\n  const result = useTransactionReceipt()\n\n  if (result.data?.value?.chainId === zkSync.id) {\n    expectTypeOf(result.data.value.l1BatchNumber).toEqualTypeOf<bigint | null>()\n    expectTypeOf(result.data.value.l1BatchTxIndex).toEqualTypeOf<\n      bigint | null\n    >()\n    expectTypeOf(result.data.value.logs).toEqualTypeOf<ZkSyncLog[]>()\n    expectTypeOf(result.data.value.l2ToL1Logs).toEqualTypeOf<\n      ZkSyncL2ToL1Log[]\n    >()\n  }\n\n  const result2 = useTransactionReceipt({ chainId: zkSync.id })\n  if (result2.data.value) {\n    expectTypeOf(result2.data.value.l1BatchNumber).toEqualTypeOf<\n      bigint | null\n    >()\n    expectTypeOf(result2.data.value.l1BatchTxIndex).toEqualTypeOf<\n      bigint | null\n    >()\n    expectTypeOf(result2.data.value.logs).toEqualTypeOf<ZkSyncLog[]>()\n    expectTypeOf(result2.data.value.l2ToL1Logs).toEqualTypeOf<\n      ZkSyncL2ToL1Log[]\n    >()\n  }\n})\n\ntest('parameters: config', async () => {\n  const result = useTransactionReceipt({ config })\n\n  if (result.data && 'l1BatchNumber' in result.data)\n    expectTypeOf(result.data.l1BatchNumber).toEqualTypeOf<unknown>()\n})\n"
  },
  {
    "path": "packages/register-tests/vue/src/useWaitForTransaction.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport { useWaitForTransactionReceipt } from '@wagmi/vue'\nimport { zkSync } from '@wagmi/vue/chains'\nimport type { ZkSyncL2ToL1Log, ZkSyncLog } from 'viem/zksync'\nimport { expectTypeOf, test } from 'vitest'\n\ntest('chain formatters', () => {\n  const result = useWaitForTransactionReceipt()\n\n  if (result.data?.value?.chainId === zkSync.id) {\n    expectTypeOf(result.data.value.l1BatchNumber).toEqualTypeOf<bigint | null>()\n    expectTypeOf(result.data.value.l1BatchTxIndex).toEqualTypeOf<\n      bigint | null\n    >()\n    expectTypeOf(result.data.value.logs).toEqualTypeOf<ZkSyncLog[]>()\n    expectTypeOf(result.data.value.l2ToL1Logs).toEqualTypeOf<\n      ZkSyncL2ToL1Log[]\n    >()\n  }\n\n  const result2 = useWaitForTransactionReceipt({ chainId: zkSync.id })\n  if (result2.data.value) {\n    expectTypeOf(result2.data.value.l1BatchNumber).toEqualTypeOf<\n      bigint | null\n    >()\n    expectTypeOf(result2.data.value.l1BatchTxIndex).toEqualTypeOf<\n      bigint | null\n    >()\n    expectTypeOf(result2.data.value.logs).toEqualTypeOf<ZkSyncLog[]>()\n    expectTypeOf(result2.data.value.l2ToL1Logs).toEqualTypeOf<\n      ZkSyncL2ToL1Log[]\n    >()\n  }\n})\n\ntest('parameters: config', async () => {\n  const result = useWaitForTransactionReceipt({ config })\n\n  if (result.data && 'l1BatchNumber' in result.data)\n    expectTypeOf(result.data.l1BatchNumber).toEqualTypeOf<unknown>()\n})\n"
  },
  {
    "path": "packages/register-tests/vue/src/useWriteContract.test-d.ts",
    "content": "import { abi, config } from '@wagmi/test'\nimport { useWriteContract } from '@wagmi/vue'\nimport { celo, mainnet, optimism } from '@wagmi/vue/chains'\nimport type { Address } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\n\ntest('chain formatters', () => {\n  const { mutate } = useWriteContract()\n\n  const shared = {\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n  } as const\n\n  mutate({\n    ...shared,\n    feeCurrency: '0x',\n  })\n\n  type Result = Parameters<\n    typeof mutate<\n      typeof abi.erc20,\n      'transferFrom',\n      [Address, Address, bigint],\n      typeof celo.id\n    >\n  >[0]\n  expectTypeOf<Result['feeCurrency']>().toEqualTypeOf<\n    `0x${string}` | undefined\n  >()\n  mutate({\n    ...shared,\n    chainId: celo.id,\n    feeCurrency: '0x',\n  })\n\n  mutate({\n    ...shared,\n    chainId: mainnet.id,\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n\n  mutate({\n    ...shared,\n    chainId: optimism.id,\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n})\n\ntest('parameters: config', async () => {\n  const { mutate } = useWriteContract({ config })\n\n  mutate({\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    // @ts-expect-error\n    feeCurrency: '0x',\n  })\n})\n"
  },
  {
    "path": "packages/register-tests/vue/tsconfig.json",
    "content": "{\n  \"extends\": \"../../../tsconfig.base.json\",\n  \"include\": [\"src/**/*.ts\"],\n  \"exclude\": []\n}\n"
  },
  {
    "path": "packages/solid/CHANGELOG.md",
    "content": "# @wagmi/solid\n\n## 0.0.4\n\n### Patch Changes\n\n- Updated query entrypoint exports ([#4995](https://github.com/wevm/wagmi/pull/4995))\n\n- Updated dependencies [[`8b96e2f`](https://github.com/wevm/wagmi/commit/8b96e2f46d9b3441d3b499b03924700ac0629be6)]:\n  - @wagmi/core@3.4.0\n  - @wagmi/connectors@7.2.1\n\n## 0.0.3\n\n### Patch Changes\n\n- Updated dependencies [[`c1dedd9`](https://github.com/wevm/wagmi/commit/c1dedd99c0a1878d7cd48476946868636ac81dd8), [`9dbdd82`](https://github.com/wevm/wagmi/commit/9dbdd8277808eb361fe7fe01ea34e4c6bb85c7a5)]:\n  - @wagmi/core@3.3.4\n  - @wagmi/connectors@7.2.0\n\n## 0.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`4b3f5a3`](https://github.com/wevm/wagmi/commit/4b3f5a3f7b3f242e8fbc1f08ae2f81ae13c5e09f)]:\n  - @wagmi/core@3.3.3\n  - @wagmi/connectors@7.1.7\n\n## 0.0.1\n\n### Patch Changes\n\n- Initial release ([`68e17db`](https://github.com/wevm/wagmi/commit/68e17db7ff84982db8f52f54e6f047c5efab62ab))\n\n- Updated dependencies [[`68e17db`](https://github.com/wevm/wagmi/commit/68e17db7ff84982db8f52f54e6f047c5efab62ab)]:\n  - @wagmi/core@3.3.2\n  - @wagmi/connectors@7.1.6\n"
  },
  {
    "path": "packages/solid/README.md",
    "content": "# @wagmi/solid\n\nSolid Primitives for Ethereum\n\n## Installation\n\n```bash\npnpm add @wagmi/solid viem @tanstack/solid-query\n```\n\n## Documentation\n\nFor documentation and guides, visit [wagmi.sh](https://wagmi.sh).\n\n"
  },
  {
    "path": "packages/solid/package.json",
    "content": "{\n  \"name\": \"@wagmi/solid\",\n  \"description\": \"Solid Primitives for Ethereum\",\n  \"version\": \"0.0.4\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/wevm/wagmi.git\",\n    \"directory\": \"packages/solid\"\n  },\n  \"scripts\": {\n    \"build\": \"pnpm run clean && pnpm run build:esm+types\",\n    \"build:esm+types\": \"tsc --project tsconfig.build.json --outDir ./dist/esm --declaration --declarationMap --declarationDir ./dist/types\",\n    \"check:types\": \"tsc --noEmit\",\n    \"clean\": \"rm -rf dist tsconfig.tsbuildinfo actions chains connectors query\",\n    \"test:build\": \"publint --strict && attw --pack --ignore-rules cjs-resolves-to-esm\"\n  },\n  \"files\": [\n    \"dist/**\",\n    \"!dist/**/*.tsbuildinfo\",\n    \"src/**/*.ts\",\n    \"!src/**/*.test.ts\",\n    \"!src/**/*.test-d.ts\",\n    \"/actions\",\n    \"/chains\",\n    \"/connectors\",\n    \"/query\"\n  ],\n  \"sideEffects\": false,\n  \"type\": \"module\",\n  \"main\": \"./dist/esm/exports/index.js\",\n  \"types\": \"./dist/types/exports/index.d.ts\",\n  \"typings\": \"./dist/types/exports/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/types/exports/index.d.ts\",\n      \"default\": \"./dist/esm/exports/index.js\"\n    },\n    \"./actions\": {\n      \"types\": \"./dist/types/exports/actions.d.ts\",\n      \"default\": \"./dist/esm/exports/actions.js\"\n    },\n    \"./chains\": {\n      \"types\": \"./dist/types/exports/chains.d.ts\",\n      \"default\": \"./dist/esm/exports/chains.js\"\n    },\n    \"./connectors\": {\n      \"types\": \"./dist/types/exports/connectors.d.ts\",\n      \"default\": \"./dist/esm/exports/connectors.js\"\n    },\n    \"./query\": {\n      \"types\": \"./dist/types/exports/query.d.ts\",\n      \"default\": \"./dist/esm/exports/query.js\"\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"typesVersions\": {\n    \"*\": {\n      \"actions\": [\n        \"./dist/types/exports/actions.d.ts\"\n      ],\n      \"chains\": [\n        \"./dist/types/exports/chains.d.ts\"\n      ],\n      \"connectors\": [\n        \"./dist/types/exports/connectors.d.ts\"\n      ],\n      \"query\": [\n        \"./dist/types/exports/query.d.ts\"\n      ]\n    }\n  },\n  \"peerDependencies\": {\n    \"@tanstack/solid-query\": \">=5.0.0\",\n    \"solid-js\": \"1.x\",\n    \"typescript\": \">=5.7.3\",\n    \"viem\": \"2.x\"\n  },\n  \"peerDependenciesMeta\": {\n    \"typescript\": {\n      \"optional\": true\n    }\n  },\n  \"dependencies\": {\n    \"@wagmi/connectors\": \"workspace:*\",\n    \"@wagmi/core\": \"workspace:*\"\n  },\n  \"devDependencies\": {\n    \"@tanstack/solid-query\": \"catalog:\",\n    \"solid-js\": \"catalog:\"\n  },\n  \"contributors\": [\n    \"awkweb.eth <t@wevm.dev>\",\n    \"jxom.eth <j@wevm.dev>\"\n  ],\n  \"funding\": \"https://github.com/sponsors/wevm\",\n  \"keywords\": [\n    \"wagmi\",\n    \"solid\",\n    \"primitives\",\n    \"eth\",\n    \"ethereum\",\n    \"dapps\",\n    \"wallet\",\n    \"web3\"\n  ]\n}\n"
  },
  {
    "path": "packages/solid/src/context.ts",
    "content": "import type { ResolvedRegister, State } from '@wagmi/core'\nimport {\n  createComponent,\n  createContext,\n  mergeProps,\n  type ParentProps,\n} from 'solid-js'\nimport { Hydrate } from './hydrate.js'\n\nexport const WagmiContext = createContext<\n  ResolvedRegister['config'] | undefined\n>(undefined)\n\nexport type WagmiProviderProps = {\n  config: ResolvedRegister['config']\n  initialState?: State | undefined\n  reconnectOnMount?: boolean | undefined\n}\n\nexport function WagmiProvider(parameters: ParentProps<WagmiProviderProps>) {\n  const props = mergeProps({ reconnectOnMount: true }, parameters)\n  return createComponent(Hydrate, {\n    get config() {\n      return props.config\n    },\n    get initialState() {\n      return props.initialState\n    },\n    get reconnectOnMount() {\n      return props.reconnectOnMount\n    },\n    get children() {\n      return createComponent(WagmiContext.Provider, {\n        get value() {\n          return props.config\n        },\n        get children() {\n          return props.children\n        },\n      })\n    },\n  })\n}\n"
  },
  {
    "path": "packages/solid/src/errors/base.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport { BaseError } from './base.js'\n\ntest('BaseError', () => {\n  expect(new BaseError('An error occurred.')).toMatchInlineSnapshot(`\n    [WagmiError: An error occurred.\n\n    Version: @wagmi/solid@x.y.z]\n  `)\n\n  expect(\n    new BaseError('An error occurred.', { details: 'details' }),\n  ).toMatchInlineSnapshot(`\n    [WagmiError: An error occurred.\n\n    Details: details\n    Version: @wagmi/solid@x.y.z]\n  `)\n\n  expect(new BaseError('', { details: 'details' })).toMatchInlineSnapshot(`\n    [WagmiError: An error occurred.\n\n    Details: details\n    Version: @wagmi/solid@x.y.z]\n  `)\n})\n\ntest('BaseError (w/ docsPath)', () => {\n  expect(\n    new BaseError('An error occurred.', {\n      details: 'details',\n      docsPath: '/lol',\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiError: An error occurred.\n\n    Docs: https://wagmi.sh/solid/lol.html\n    Details: details\n    Version: @wagmi/solid@x.y.z]\n  `)\n  expect(\n    new BaseError('An error occurred.', {\n      cause: new BaseError('error', { docsPath: '/docs' }),\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiError: An error occurred.\n\n    Docs: https://wagmi.sh/solid/docs.html\n    Version: @wagmi/solid@x.y.z]\n  `)\n  expect(\n    new BaseError('An error occurred.', {\n      cause: new BaseError('error'),\n      docsPath: '/lol',\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiError: An error occurred.\n\n    Docs: https://wagmi.sh/solid/lol.html\n    Version: @wagmi/solid@x.y.z]\n  `)\n  expect(\n    new BaseError('An error occurred.', {\n      details: 'details',\n      docsPath: '/lol',\n      docsSlug: 'test',\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiError: An error occurred.\n\n    Docs: https://wagmi.sh/solid/lol.html#test\n    Details: details\n    Version: @wagmi/solid@x.y.z]\n  `)\n})\n\ntest('BaseError (w/ metaMessages)', () => {\n  expect(\n    new BaseError('An error occurred.', {\n      details: 'details',\n      metaMessages: ['Reason: idk', 'Cause: lol'],\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiError: An error occurred.\n\n    Reason: idk\n    Cause: lol\n\n    Details: details\n    Version: @wagmi/solid@x.y.z]\n  `)\n})\n\ntest('inherited BaseError', () => {\n  const err = new BaseError('An error occurred.', {\n    details: 'details',\n    docsPath: '/lol',\n  })\n  expect(\n    new BaseError('An internal error occurred.', {\n      cause: err,\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiError: An internal error occurred.\n\n    Docs: https://wagmi.sh/solid/lol.html\n    Details: details\n    Version: @wagmi/solid@x.y.z]\n  `)\n})\n\ntest('inherited Error', () => {\n  const err = new Error('details')\n  expect(\n    new BaseError('An internal error occurred.', {\n      cause: err,\n      docsPath: '/lol',\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiError: An internal error occurred.\n\n    Docs: https://wagmi.sh/solid/lol.html\n    Details: details\n    Version: @wagmi/solid@x.y.z]\n  `)\n})\n\ntest('walk: no predicate fn (walks to leaf)', () => {\n  class FooError extends BaseError {}\n  class BarError extends BaseError {}\n\n  const err = new BaseError('test1', {\n    cause: new FooError('test2', { cause: new BarError('test3') }),\n  })\n  expect(err.walk()).toMatchInlineSnapshot(`\n    [WagmiError: test3\n\n    Version: @wagmi/solid@x.y.z]\n  `)\n})\n\ntest('walk: predicate fn', () => {\n  class FooError extends BaseError {}\n  class BarError extends BaseError {}\n\n  const err = new BaseError('test1', {\n    cause: new FooError('test2', { cause: new BarError('test3') }),\n  })\n  expect(err.walk((err) => err instanceof FooError)).toMatchInlineSnapshot(`\n    [WagmiError: test2\n\n    Version: @wagmi/solid@x.y.z]\n  `)\n})\n"
  },
  {
    "path": "packages/solid/src/errors/base.ts",
    "content": "import { BaseError as CoreError } from '@wagmi/core'\n\nimport { getVersion } from '../utils/getVersion.js'\n\nexport type BaseErrorType = BaseError & { name: 'WagmiError' }\nexport class BaseError extends CoreError {\n  override name = 'WagmiError'\n  override get docsBaseUrl() {\n    return 'https://wagmi.sh/solid' // TODO: add solid docs\n  }\n  override get version() {\n    return getVersion()\n  }\n}\n"
  },
  {
    "path": "packages/solid/src/errors/context.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport { WagmiProviderNotFoundError } from './context.js'\n\ntest('WagmiProviderNotFoundError', () => {\n  expect(new WagmiProviderNotFoundError()).toMatchInlineSnapshot(`\n    [WagmiProviderNotFoundError: \\`useConfig\\` must be used within \\`WagmiProvider\\`.\n\n    Docs: https://wagmi.sh/solid/api/WagmiProvider.html\n    Version: @wagmi/solid@x.y.z]\n  `)\n})\n"
  },
  {
    "path": "packages/solid/src/errors/context.ts",
    "content": "import { BaseError } from './base.js'\n\nexport type WagmiProviderNotFoundErrorType = WagmiProviderNotFoundError & {\n  name: 'WagmiProviderNotFoundError'\n}\nexport class WagmiProviderNotFoundError extends BaseError {\n  override name = 'WagmiProviderNotFoundError'\n  constructor() {\n    super('`useConfig` must be used within `WagmiProvider`.', {\n      docsPath: '/api/WagmiProvider',\n    })\n  }\n}\n"
  },
  {
    "path": "packages/solid/src/exports/actions.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport * as actions from './actions.js'\n\ntest('exports', () => {\n  expect(Object.keys(actions)).toMatchInlineSnapshot(`\n    [\n      \"call\",\n      \"connect\",\n      \"deployContract\",\n      \"disconnect\",\n      \"estimateFeesPerGas\",\n      \"estimateGas\",\n      \"estimateMaxPriorityFeePerGas\",\n      \"getAccount\",\n      \"getBalance\",\n      \"getBlobBaseFee\",\n      \"getBlock\",\n      \"getBlockNumber\",\n      \"getBlockTransactionCount\",\n      \"getBytecode\",\n      \"getCallsStatus\",\n      \"getCapabilities\",\n      \"getChainId\",\n      \"getChains\",\n      \"getClient\",\n      \"getConnection\",\n      \"getConnections\",\n      \"getConnectorClient\",\n      \"getConnectors\",\n      \"getContractEvents\",\n      \"getEnsAddress\",\n      \"getEnsAvatar\",\n      \"getEnsName\",\n      \"getEnsResolver\",\n      \"getEnsText\",\n      \"getFeeHistory\",\n      \"getGasPrice\",\n      \"getProof\",\n      \"getPublicClient\",\n      \"getStorageAt\",\n      \"getTransaction\",\n      \"getTransactionConfirmations\",\n      \"getTransactionCount\",\n      \"getTransactionReceipt\",\n      \"getWalletClient\",\n      \"multicall\",\n      \"prepareTransactionRequest\",\n      \"readContract\",\n      \"readContracts\",\n      \"reconnect\",\n      \"sendCalls\",\n      \"sendTransaction\",\n      \"showCallsStatus\",\n      \"signMessage\",\n      \"signTransaction\",\n      \"signTypedData\",\n      \"simulateContract\",\n      \"switchAccount\",\n      \"switchChain\",\n      \"switchConnection\",\n      \"verifyMessage\",\n      \"verifyTypedData\",\n      \"waitForCallsStatus\",\n      \"waitForTransactionReceipt\",\n      \"watchAccount\",\n      \"watchAsset\",\n      \"watchBlockNumber\",\n      \"watchBlocks\",\n      \"watchChainId\",\n      \"watchClient\",\n      \"watchConnection\",\n      \"watchConnections\",\n      \"watchConnectors\",\n      \"watchContractEvent\",\n      \"watchPendingTransactions\",\n      \"watchPublicClient\",\n      \"writeContract\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/solid/src/exports/actions.ts",
    "content": "////////////////////////////////////////////////////////////////////////////////\n// @wagmi/core/actions\n////////////////////////////////////////////////////////////////////////////////\n\n// biome-ignore lint/performance/noBarrelFile: entrypoint module\n// biome-ignore lint/performance/noReExportAll: entrypoint module\nexport * from '@wagmi/core/actions'\n"
  },
  {
    "path": "packages/solid/src/exports/chains.ts",
    "content": "////////////////////////////////////////////////////////////////////////////////\n// viem/chains\n////////////////////////////////////////////////////////////////////////////////\n\n// biome-ignore lint/performance/noBarrelFile: entrypoint module\n// biome-ignore lint/performance/noReExportAll: entrypoint module\nexport * from 'viem/chains'\n"
  },
  {
    "path": "packages/solid/src/exports/connectors.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport * as connectors from './connectors.js'\n\ntest('exports', () => {\n  expect(Object.keys(connectors)).toMatchInlineSnapshot(`\n    [\n      \"baseAccount\",\n      \"coinbaseWallet\",\n      \"injected\",\n      \"metaMask\",\n      \"mock\",\n      \"porto\",\n      \"safe\",\n      \"version\",\n      \"walletConnect\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/solid/src/exports/connectors.ts",
    "content": "////////////////////////////////////////////////////////////////////////////////\n// @wagmi/connectors\n////////////////////////////////////////////////////////////////////////////////\n\n// biome-ignore lint/performance/noBarrelFile: entrypoint module\n// biome-ignore lint/performance/noReExportAll: entrypoint module\nexport * from '@wagmi/connectors'\n"
  },
  {
    "path": "packages/solid/src/exports/index.ts",
    "content": "////////////////////////////////////////////////////////////////////////////////\n// Context\n////////////////////////////////////////////////////////////////////////////////\n\n// biome-ignore lint/performance/noBarrelFile: entrypoint module\nexport {\n  WagmiContext,\n  WagmiProvider,\n  type WagmiProviderProps,\n} from '../context.js'\n\n////////////////////////////////////////////////////////////////////////////////\n// Errors\n////////////////////////////////////////////////////////////////////////////////\n\nexport { BaseError, type BaseErrorType } from '../errors/base.js'\n\nexport {\n  WagmiProviderNotFoundError,\n  type WagmiProviderNotFoundErrorType,\n} from '../errors/context.js'\n\n////////////////////////////////////////////////////////////////////////////////\n// Primitives\n////////////////////////////////////////////////////////////////////////////////\n\nexport { useBalance } from '../primitives/useBalance.js'\n\nexport { useBlockNumber } from '../primitives/useBlockNumber.js'\n\nexport { useChainId } from '../primitives/useChainId.js'\n\nexport { useChains } from '../primitives/useChains.js'\n\nexport { useClient } from '../primitives/useClient.js'\n\nexport { useConfig } from '../primitives/useConfig.js'\n\nexport { useConnect } from '../primitives/useConnect.js'\n\nexport { useConnection } from '../primitives/useConnection.js'\n\nexport { useConnectionEffect } from '../primitives/useConnectionEffect.js'\n\nexport { useConnections } from '../primitives/useConnections.js'\n\nexport { useConnectorClient } from '../primitives/useConnectorClient.js'\n\nexport { useConnectors } from '../primitives/useConnectors.js'\n\nexport { useDisconnect } from '../primitives/useDisconnect.js'\n\nexport { useReconnect } from '../primitives/useReconnect.js'\n\nexport { useSwitchChain } from '../primitives/useSwitchChain.js'\n\nexport { useSwitchConnection } from '../primitives/useSwitchConnection.js'\n\nexport { useWatchBlockNumber } from '../primitives/useWatchBlockNumber.js'\n\n////////////////////////////////////////////////////////////////////////////////\n// Hydrate\n////////////////////////////////////////////////////////////////////////////////\n\nexport {\n  Hydrate,\n  type HydrateProps,\n} from '../hydrate.js'\n\n////////////////////////////////////////////////////////////////////////////////\n// @wagmi/core\n////////////////////////////////////////////////////////////////////////////////\n\nexport {\n  ChainNotConfiguredError,\n  // Errors\n  type ChainNotConfiguredErrorType,\n  type Config,\n  // Config\n  type Connection,\n  type Connector,\n  ConnectorAccountNotFoundError,\n  type ConnectorAccountNotFoundErrorType,\n  ConnectorAlreadyConnectedError,\n  type ConnectorAlreadyConnectedErrorType,\n  ConnectorChainMismatchError,\n  type ConnectorChainMismatchErrorType,\n  // Connector\n  type ConnectorEventMap,\n  ConnectorNotFoundError,\n  type ConnectorNotFoundErrorType,\n  ConnectorUnavailableReconnectingError,\n  type ConnectorUnavailableReconnectingErrorType,\n  type CreateConfigParameters,\n  type CreateConnectorFn,\n  // Storage\n  type CreateStorageParameters,\n  // Utilities\n  cookieStorage,\n  cookieToInitialState,\n  createConfig,\n  createConnector,\n  createStorage,\n  // Transports\n  custom,\n  deepEqual,\n  deserialize,\n  fallback,\n  http,\n  injected,\n  mock,\n  noopStorage,\n  type PartializedState,\n  ProviderNotFoundError,\n  type ProviderNotFoundErrorType,\n  parseCookie,\n  // Types\n  type Register,\n  type ResolvedRegister,\n  type State,\n  type Storage,\n  SwitchChainNotSupportedError,\n  type SwitchChainNotSupportedErrorType,\n  serialize,\n  type Transport,\n  unstable_connector,\n  webSocket,\n} from '@wagmi/core'\n\n////////////////////////////////////////////////////////////////////////////////\n// Version\n////////////////////////////////////////////////////////////////////////////////\n\nexport { version } from '../version.js'\n"
  },
  {
    "path": "packages/solid/src/exports/query.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport * as query from './query.js'\n\ntest('exports', () => {\n  expect(Object.keys(query)).toMatchInlineSnapshot(`\n    [\n      \"callQueryKey\",\n      \"callQueryOptions\",\n      \"connectMutationOptions\",\n      \"deployContractMutationOptions\",\n      \"disconnectMutationOptions\",\n      \"estimateFeesPerGasQueryKey\",\n      \"estimateFeesPerGasQueryOptions\",\n      \"estimateGasQueryKey\",\n      \"estimateGasQueryOptions\",\n      \"estimateMaxPriorityFeePerGasQueryKey\",\n      \"estimateMaxPriorityFeePerGasQueryOptions\",\n      \"getBalanceQueryKey\",\n      \"getBalanceQueryOptions\",\n      \"getBlobBaseFeeQueryKey\",\n      \"getBlobBaseFeeQueryOptions\",\n      \"getBlockNumberQueryKey\",\n      \"getBlockNumberQueryOptions\",\n      \"getBlockQueryKey\",\n      \"getBlockQueryOptions\",\n      \"getBlockTransactionCountQueryKey\",\n      \"getBlockTransactionCountQueryOptions\",\n      \"getBytecodeQueryKey\",\n      \"getBytecodeQueryOptions\",\n      \"getCallsStatusQueryKey\",\n      \"getCallsStatusQueryOptions\",\n      \"getCapabilitiesQueryKey\",\n      \"getCapabilitiesQueryOptions\",\n      \"getConnectorClientQueryKey\",\n      \"getConnectorClientQueryOptions\",\n      \"getContractEventsQueryKey\",\n      \"getContractEventsQueryOptions\",\n      \"getEnsAddressQueryKey\",\n      \"getEnsAddressQueryOptions\",\n      \"getEnsAvatarQueryKey\",\n      \"getEnsAvatarQueryOptions\",\n      \"getEnsNameQueryKey\",\n      \"getEnsNameQueryOptions\",\n      \"getEnsResolverQueryKey\",\n      \"getEnsResolverQueryOptions\",\n      \"getEnsTextQueryKey\",\n      \"getEnsTextQueryOptions\",\n      \"getFeeHistoryQueryKey\",\n      \"getFeeHistoryQueryOptions\",\n      \"getGasPriceQueryKey\",\n      \"getGasPriceQueryOptions\",\n      \"getProofQueryKey\",\n      \"getProofQueryOptions\",\n      \"getStorageAtQueryKey\",\n      \"getStorageAtQueryOptions\",\n      \"getTransactionConfirmationsQueryKey\",\n      \"getTransactionConfirmationsQueryOptions\",\n      \"getTransactionCountQueryKey\",\n      \"getTransactionCountQueryOptions\",\n      \"getTransactionQueryKey\",\n      \"getTransactionQueryOptions\",\n      \"getTransactionReceiptQueryKey\",\n      \"getTransactionReceiptQueryOptions\",\n      \"getWalletClientQueryKey\",\n      \"getWalletClientQueryOptions\",\n      \"hashFn\",\n      \"infiniteReadContractsQueryKey\",\n      \"infiniteReadContractsQueryOptions\",\n      \"prepareTransactionRequestQueryKey\",\n      \"prepareTransactionRequestQueryOptions\",\n      \"readContractQueryKey\",\n      \"readContractQueryOptions\",\n      \"readContractsQueryKey\",\n      \"readContractsQueryOptions\",\n      \"reconnectMutationOptions\",\n      \"sendCallsMutationOptions\",\n      \"sendCallsSyncMutationOptions\",\n      \"sendTransactionMutationOptions\",\n      \"sendTransactionSyncMutationOptions\",\n      \"showCallsStatusMutationOptions\",\n      \"signMessageMutationOptions\",\n      \"signTransactionMutationOptions\",\n      \"signTypedDataMutationOptions\",\n      \"simulateContractQueryKey\",\n      \"simulateContractQueryOptions\",\n      \"structuralSharing\",\n      \"switchAccountMutationOptions\",\n      \"switchChainMutationOptions\",\n      \"switchConnectionMutationOptions\",\n      \"useInfiniteQuery\",\n      \"useMutation\",\n      \"useQuery\",\n      \"verifyMessageQueryKey\",\n      \"verifyMessageQueryOptions\",\n      \"verifyTypedDataQueryKey\",\n      \"verifyTypedDataQueryOptions\",\n      \"waitForCallsStatusQueryKey\",\n      \"waitForCallsStatusQueryOptions\",\n      \"waitForTransactionReceiptQueryKey\",\n      \"waitForTransactionReceiptQueryOptions\",\n      \"watchAssetMutationOptions\",\n      \"writeContractMutationOptions\",\n      \"writeContractSyncMutationOptions\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/solid/src/exports/query.ts",
    "content": "////////////////////////////////////////////////////////////////////////////////\n// @wagmi/core/query\n////////////////////////////////////////////////////////////////////////////////\n\n// biome-ignore lint/performance/noBarrelFile: entrypoint module\n// biome-ignore lint/performance/noReExportAll: entrypoint module\nexport * from '@wagmi/core/query'\n\nexport {\n  type SolidInfiniteQueryParameters,\n  type SolidMutationParameters,\n  type SolidQueryParameters,\n  type UseInfiniteQueryReturnType,\n  type UseMutationReturnType,\n  type UseQueryReturnType,\n  useInfiniteQuery,\n  useMutation,\n  useQuery,\n} from '../utils/query.js'\n"
  },
  {
    "path": "packages/solid/src/hydrate.ts",
    "content": "import { hydrate, type ResolvedRegister, type State } from '@wagmi/core'\nimport { mergeProps, onMount, type ParentProps } from 'solid-js'\n\nexport type HydrateProps = {\n  config: ResolvedRegister['config']\n  initialState?: State | undefined\n  reconnectOnMount?: boolean | undefined\n}\n\nexport function Hydrate(parameters: ParentProps<HydrateProps>) {\n  const props = mergeProps({ reconnectOnMount: true }, parameters)\n\n  const { onMount: hydrateOnMount } = hydrate(props.config, {\n    initialState: props.initialState,\n    reconnectOnMount: props.reconnectOnMount,\n  })\n\n  // Hydrate for non-SSR\n  if (!props.config._internal.ssr) hydrateOnMount()\n\n  onMount(() => {\n    if (!props.config._internal.ssr) return\n    hydrateOnMount()\n  })\n\n  return props.children\n}\n"
  },
  {
    "path": "packages/solid/src/primitives/useBalance.test-d.ts",
    "content": "import { expectTypeOf, test } from 'vitest'\n\nimport { useBalance } from './useBalance.js'\n\ntest('select data', () => {\n  const result = useBalance(() => ({\n    query: {\n      select(data) {\n        return data?.value\n      },\n    },\n  }))\n  expectTypeOf(result.data).toEqualTypeOf<bigint | undefined>()\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useBalance.test.ts",
    "content": "import { accounts, chain, testClient, wait } from '@wagmi/test'\nimport { renderPrimitive } from '@wagmi/test/solid'\nimport { createSignal } from 'solid-js'\nimport { type Address, parseEther } from 'viem'\nimport { beforeEach, expect, test, vi } from 'vitest'\nimport { useBalance } from './useBalance.js'\n\nconst address = accounts[0]\n\nbeforeEach(async () => {\n  await testClient.mainnet.setBalance({ address, value: parseEther('10000') })\n  await testClient.mainnet.mine({ blocks: 1 })\n  await testClient.mainnet2.setBalance({ address, value: parseEther('69') })\n  await testClient.mainnet2.mine({ blocks: 1 })\n})\n\ntest('default', async () => {\n  const { result } = renderPrimitive(() => useBalance(() => ({ address })))\n\n  await vi.waitUntil(() => result.isSuccess, { timeout: 10_000 })\n\n  const { data, ...rest } = result\n  expect(data).toMatchObject(\n    expect.objectContaining({\n      decimals: expect.any(Number),\n      symbol: expect.any(String),\n      value: expect.any(BigInt),\n    }),\n  )\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"balance\",\n        {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('parameters: chainId', async () => {\n  const { result } = renderPrimitive(() =>\n    useBalance(() => ({ address, chainId: chain.mainnet2.id })),\n  )\n\n  await vi.waitUntil(() => result.isSuccess, { timeout: 10_000 })\n\n  expect(result).toMatchInlineSnapshot(`\n    {\n      \"data\": {\n        \"decimals\": 18,\n        \"symbol\": \"WAG\",\n        \"value\": 69000000000000000000n,\n      },\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"balance\",\n        {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"chainId\": 456,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('behavior: address: undefined -> defined', async () => {\n  const [address, setAddress] = createSignal<Address>()\n\n  const { result } = renderPrimitive(() =>\n    useBalance(() => ({ address: address() })),\n  )\n\n  expect(result).toMatchInlineSnapshot(`\n    {\n      \"data\": undefined,\n      \"dataUpdatedAt\": 0,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": false,\n      \"isFetchedAfterMount\": false,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": true,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": false,\n      \"isSuccess\": false,\n      \"queryKey\": [\n        \"balance\",\n        {\n          \"address\": undefined,\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"pending\",\n    }\n  `)\n\n  setAddress(accounts[0])\n\n  await vi.waitUntil(() => result.isSuccess, { timeout: 10_000 })\n\n  expect(result).toMatchInlineSnapshot(`\n    {\n      \"data\": {\n        \"decimals\": 18,\n        \"symbol\": \"ETH\",\n        \"value\": 10000000000000000000000n,\n      },\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"balance\",\n        {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n})\n\ntest('behavior: disabled when properties missing', async () => {\n  const { result } = renderPrimitive(() => useBalance())\n\n  await wait(100)\n  await vi.waitFor(() => expect(result.isPending).toBeTruthy())\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useBalance.ts",
    "content": "import type { Config, GetBalanceErrorType, ResolvedRegister } from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetBalanceData,\n  type GetBalanceOptions,\n  getBalanceQueryOptions,\n} from '@wagmi/core/query'\nimport { type Accessor, createMemo } from 'solid-js'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\n/** https://wagmi.sh/solid/api/primitives/useBalance */\nexport function useBalance<\n  config extends Config = ResolvedRegister['config'],\n  selectData = GetBalanceData,\n>(\n  parameters: useBalance.Parameters<config, selectData> = () => ({}),\n): useBalance.ReturnType<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId(() => ({ config: config() }))\n  const options = createMemo(() =>\n    getBalanceQueryOptions(config(), {\n      ...parameters(),\n      chainId: parameters().chainId ?? chainId(),\n    }),\n  )\n  return useQuery(options)\n}\n\nexport namespace useBalance {\n  export type Parameters<\n    config extends Config = Config,\n    selectData = GetBalanceData,\n  > = Accessor<SolidParameters<config, selectData>>\n\n  export type ReturnType<selectData = GetBalanceData> = UseQueryReturnType<\n    selectData,\n    GetBalanceErrorType\n  >\n\n  export type SolidParameters<\n    config extends Config = Config,\n    selectData = GetBalanceData,\n  > = Compute<GetBalanceOptions<config, selectData> & ConfigParameter<config>>\n}\n"
  },
  {
    "path": "packages/solid/src/primitives/useBlockNumber.test-d.ts",
    "content": "import { createConfig, http, webSocket } from '@wagmi/core'\nimport { mainnet, optimism } from '@wagmi/core/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useBlockNumber } from './useBlockNumber.js'\n\ntest('select data', () => {\n  const result = useBlockNumber(() => ({\n    query: {\n      select(data) {\n        expectTypeOf(data).toEqualTypeOf<bigint>()\n        return data?.toString()\n      },\n    },\n  }))\n  expectTypeOf(result.data).toEqualTypeOf<string | undefined>()\n})\n\ntest('differing transports', () => {\n  const config = createConfig({\n    chains: [mainnet, optimism],\n    transports: {\n      [mainnet.id]: http(),\n      [optimism.id]: webSocket(),\n    },\n  })\n\n  useBlockNumber(() => ({\n    config,\n    watch: {\n      poll: false,\n    },\n  }))\n\n  useBlockNumber(() => ({\n    config,\n    chainId: mainnet.id,\n    watch: {\n      poll: true,\n    },\n  }))\n  // @ts-expect-error\n  useBlockNumber(() => ({\n    config,\n    chainId: mainnet.id,\n    watch: {\n      poll: false,\n    },\n  }))\n\n  useBlockNumber(() => ({\n    config,\n    chainId: optimism.id,\n    watch: {\n      poll: true,\n    },\n  }))\n  useBlockNumber(() => ({\n    config,\n    chainId: optimism.id,\n    watch: {\n      poll: false,\n    },\n  }))\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useBlockNumber.test.ts",
    "content": "import { testClient } from '@wagmi/test'\nimport { renderPrimitive } from '@wagmi/test/solid'\nimport { describe, expect, test, vi } from 'vitest'\nimport { useBlockNumber } from './useBlockNumber.js'\n\ndescribe.sequential('useBlockNumber', () => {\n  test('mounts', async () => {\n    await testClient.mainnet.restart()\n\n    const { result, cleanup } = renderPrimitive(() => useBlockNumber())\n\n    await vi.waitUntil(() => result.isSuccess, { timeout: 10_000 })\n\n    // result is a proxy object (store in Solid)\n    // so we spread it into a new object for snapshot testing\n    expect({ ...result }).toMatchInlineSnapshot(`\n    {\n      \"data\": 23535880n,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"blockNumber\",\n        {\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n    cleanup()\n  })\n\n  test('parameters: watch', async () => {\n    await testClient.mainnet.restart()\n\n    const { result, cleanup } = renderPrimitive(() =>\n      useBlockNumber(() => ({ watch: { pollingInterval: 100 } })),\n    )\n\n    await vi.waitUntil(() => result.isSuccess, { timeout: 10_000 })\n    const blockNumber = result.data!\n    expect(result.data).toBeTypeOf('bigint')\n\n    await testClient.mainnet.mine({ blocks: 1 })\n    await vi.waitFor(\n      () => {\n        expect(result.data).toEqual(blockNumber + 1n)\n      },\n      { timeout: 10_000 },\n    )\n\n    await testClient.mainnet.mine({ blocks: 1 })\n    await vi.waitFor(\n      () => {\n        expect(result.data).toEqual(blockNumber + 2n)\n      },\n      { timeout: 10_000 },\n    )\n    cleanup()\n  })\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useBlockNumber.ts",
    "content": "import { useQueryClient } from '@tanstack/solid-query'\nimport type {\n  Config,\n  GetBlockNumberErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type {\n  Compute,\n  ConfigParameter,\n  UnionCompute,\n  UnionStrictOmit,\n} from '@wagmi/core/internal'\nimport {\n  type GetBlockNumberData,\n  type GetBlockNumberOptions,\n  getBlockNumberQueryOptions,\n} from '@wagmi/core/query'\nimport { type Accessor, createMemo } from 'solid-js'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\nimport { useWatchBlockNumber } from './useWatchBlockNumber.js'\n\n/** https://wagmi.sh/solid/api/hooks/useBlockNumber */\nexport function useBlockNumber<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetBlockNumberData,\n>(\n  parameters: useBlockNumber.Parameters<\n    config,\n    chainId,\n    selectData\n  > = () => ({}),\n): useBlockNumber.ReturnType<selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId(() => ({ config: config() }))\n  const options = createMemo(() =>\n    getBlockNumberQueryOptions(config(), {\n      ...parameters(),\n      chainId: parameters().chainId ?? chainId(),\n    }),\n  )\n  const queryClient = useQueryClient()\n  const watchBlockNumberArgs = createMemo(() => {\n    // Assign to variable to help type narrowing\n    const { watch } = parameters()\n    return {\n      ...({\n        config: config(),\n        chainId: parameters().chainId ?? chainId(),\n        ...(typeof watch === 'object' ? watch : {}),\n      } as useWatchBlockNumber.SolidParameters),\n      enabled:\n        (parameters().query?.enabled ?? true) &&\n        (typeof watch === 'object' ? watch.enabled : watch),\n      onBlockNumber(blockNumber) {\n        queryClient.setQueryData(options().queryKey, blockNumber)\n      },\n    } satisfies useWatchBlockNumber.SolidParameters\n  })\n  useWatchBlockNumber(watchBlockNumberArgs)\n  return useQuery(options)\n}\n\nexport namespace useBlockNumber {\n  export type Parameters<\n    config extends Config = Config,\n    chainId extends\n      config['chains'][number]['id'] = config['chains'][number]['id'],\n    selectData = GetBlockNumberData,\n  > = Accessor<SolidParameters<config, chainId, selectData>>\n\n  export type ReturnType<selectData = GetBlockNumberData> = UseQueryReturnType<\n    selectData,\n    GetBlockNumberErrorType\n  >\n\n  export type SolidParameters<\n    config extends Config = Config,\n    chainId extends\n      config['chains'][number]['id'] = config['chains'][number]['id'],\n    selectData = GetBlockNumberData,\n  > = Compute<\n    GetBlockNumberOptions<config, chainId, selectData> &\n      ConfigParameter<config> & {\n        watch?:\n          | boolean\n          | UnionCompute<\n              UnionStrictOmit<\n                useWatchBlockNumber.SolidParameters<config, chainId>,\n                'chainId' | 'config' | 'onBlockNumber' | 'onError'\n              >\n            >\n          | undefined\n      }\n  >\n}\n"
  },
  {
    "path": "packages/solid/src/primitives/useChainId.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useChainId } from './useChainId.js'\n\ntest('default', () => {\n  const chainId = useChainId()\n  expectTypeOf(chainId()).toEqualTypeOf<number>()\n})\n\ntest('parameters: config', () => {\n  const chainId = useChainId(() => ({ config }))\n  expectTypeOf(chainId()).toEqualTypeOf<1 | 456 | 10>()\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useChainId.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { renderPrimitive } from '@wagmi/test/solid'\nimport { expect, test } from 'vitest'\n\nimport { useChainId } from './useChainId.js'\n\ntest('default', async () => {\n  const { result } = renderPrimitive(() => useChainId())\n\n  expect(result()).toMatchInlineSnapshot('1')\n\n  config.setState((x) => ({ ...x, chainId: 456 }))\n\n  expect(result()).toMatchInlineSnapshot('456')\n})\n\ntest('parameters: config', async () => {\n  const { result } = renderPrimitive(() => useChainId(() => ({ config })))\n  expect(result()).toBeDefined()\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useChainId.ts",
    "content": "import {\n  type Config,\n  type GetChainIdReturnType,\n  getChainId,\n  type ResolvedRegister,\n  watchChainId,\n} from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport { type Accessor, createEffect, createSignal, onCleanup } from 'solid-js'\nimport { useConfig } from './useConfig.js'\n\n/** https://wagmi.sh/solid/api/hooks/useChainId */\nexport function useChainId<config extends Config = ResolvedRegister['config']>(\n  parameters: useChainId.Parameters<config> = () => ({}),\n): useChainId.ReturnType<config> {\n  const config = useConfig(parameters)\n  const [chainId, setChainId] = createSignal(getChainId(config()))\n  createEffect(() => {\n    const _config = config()\n    setChainId(() => getChainId(_config))\n    const unsubscribe = watchChainId(_config, {\n      onChange(data) {\n        setChainId(() => data)\n      },\n    })\n    onCleanup(() => unsubscribe())\n  })\n  return chainId\n}\n\nexport namespace useChainId {\n  export type Parameters<config extends Config = Config> = Accessor<\n    SolidParameters<config>\n  >\n  export type ReturnType<config extends Config = Config> = Accessor<\n    SolidReturnType<config>\n  >\n  export type SolidParameters<config extends Config = Config> =\n    ConfigParameter<config>\n  export type SolidReturnType<config extends Config = Config> =\n    GetChainIdReturnType<config>\n}\n"
  },
  {
    "path": "packages/solid/src/primitives/useChains.test.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport { renderPrimitive } from '@wagmi/test/solid'\nimport { expect, test } from 'vitest'\n\nimport { useChains } from './useChains.js'\n\ntest('default', async () => {\n  const { result } = renderPrimitive(() => useChains())\n\n  expect(result().map((x) => x.id)).toMatchInlineSnapshot(`\n    [\n      1,\n      456,\n      10,\n    ]\n  `)\n})\n\ntest('parameters: config', async () => {\n  const { result } = renderPrimitive(() => useChains(() => ({ config })), {\n    wrapper: (props) => props.children,\n  })\n  expect(result().map((x) => x.id)).toMatchInlineSnapshot(`\n    [\n      1,\n      456,\n      10,\n    ]\n  `)\n})\n\ntest('behavior: chains updates', async () => {\n  const { result } = renderPrimitive(() => useChains())\n\n  const chains = result()\n  expect(\n    result().map(({ id, name }) => ({\n      id,\n      name,\n    })),\n  ).toMatchInlineSnapshot(`\n    [\n      {\n        \"id\": 1,\n        \"name\": \"Ethereum\",\n      },\n      {\n        \"id\": 456,\n        \"name\": \"Ethereum\",\n      },\n      {\n        \"id\": 10,\n        \"name\": \"OP Mainnet\",\n      },\n    ]\n  `)\n\n  config._internal.chains.setState([chain.mainnet, chain.mainnet2])\n\n  expect(\n    result().map(({ id, name }) => ({\n      id,\n      name,\n    })),\n  ).toMatchInlineSnapshot(`\n    [\n      {\n        \"id\": 1,\n        \"name\": \"Ethereum\",\n      },\n      {\n        \"id\": 456,\n        \"name\": \"Ethereum\",\n      },\n    ]\n  `)\n\n  config._internal.chains.setState(chains)\n\n  expect(\n    result().map(({ id, name }) => ({\n      id,\n      name,\n    })),\n  ).toMatchInlineSnapshot(`\n    [\n      {\n        \"id\": 1,\n        \"name\": \"Ethereum\",\n      },\n      {\n        \"id\": 456,\n        \"name\": \"Ethereum\",\n      },\n      {\n        \"id\": 10,\n        \"name\": \"OP Mainnet\",\n      },\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useChains.ts",
    "content": "import {\n  type Config,\n  type GetChainsReturnType,\n  getChains,\n  type ResolvedRegister,\n} from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport { watchChains } from '@wagmi/core/internal'\nimport { type Accessor, createEffect, createSignal, onCleanup } from 'solid-js'\nimport { useConfig } from './useConfig.js'\n\n/** https://wagmi.sh/solid/api/primitives/useChains */\nexport function useChains<config extends Config = ResolvedRegister['config']>(\n  parameters: useChains.Parameters<config> = () => ({}),\n): useChains.ReturnType<config> {\n  const config = useConfig(parameters)\n  const [chains, setChains] = createSignal<GetChainsReturnType<config>>(\n    getChains(config()),\n  )\n  createEffect(() => {\n    const unsubscribe = watchChains(config(), {\n      onChange(data) {\n        setChains(() => data)\n      },\n    })\n    onCleanup(() => unsubscribe())\n  })\n  return chains\n}\n\nexport namespace useChains {\n  export type Parameters<config extends Config = Config> = Accessor<\n    ConfigParameter<config>\n  >\n  export type ReturnType<config extends Config = Config> = Accessor<\n    GetChainsReturnType<config>\n  >\n  export type SolidParameters<config extends Config = Config> =\n    ConfigParameter<config>\n  export type SolidReturnType<config extends Config = Config> =\n    GetChainsReturnType<config>\n}\n"
  },
  {
    "path": "packages/solid/src/primitives/useClient.test-d.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport type { Chain } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useClient } from './useClient.js'\n\ntest('default', () => {\n  const client = useClient(() => ({ config }))\n  expectTypeOf(client().chain).toEqualTypeOf<\n    (typeof config)['chains'][number]\n  >()\n  expectTypeOf(client().transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('parameters: chainId', () => {\n  const client = useClient(() => ({\n    config,\n    chainId: chain.mainnet.id,\n  }))\n  expectTypeOf(client().chain).toEqualTypeOf<typeof chain.mainnet>()\n  expectTypeOf(client().chain).not.toEqualTypeOf<typeof chain.mainnet2>()\n  expectTypeOf(client().transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('behavior: unconfigured chain', () => {\n  {\n    const client = useClient(() => ({ chainId: 123456 }))\n    const _client = client()\n    if (_client) {\n      expectTypeOf(_client.chain).toEqualTypeOf<Chain>()\n      expectTypeOf(_client.transport.type).toEqualTypeOf<string>()\n    } else {\n      expectTypeOf(_client).toEqualTypeOf<undefined>()\n    }\n  }\n\n  // @ts-expect-error\n  const client = useClient(() => ({\n    config,\n    chainId: 123456,\n  }))\n  expectTypeOf(client()).toEqualTypeOf<undefined>()\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useClient.test.ts",
    "content": "import { switchChain } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { renderPrimitive } from '@wagmi/test/solid'\nimport { createSignal } from 'solid-js'\nimport { expect, test, vi } from 'vitest'\nimport { useClient } from './useClient.js'\n\ntest('default', async () => {\n  const { result } = renderPrimitive(() => useClient())\n\n  expect(result?.()?.chain.id).toEqual(1)\n\n  await switchChain(config, { chainId: 456 })\n\n  expect(result?.()?.chain?.id).toEqual(456)\n})\n\ntest('parameters: config', () => {\n  const { result } = renderPrimitive(() => useClient(() => ({ config })), {\n    wrapper: (props) => props.children,\n  })\n\n  expect(result()).toBeDefined()\n})\n\ntest('behavior: controlled chainId', async () => {\n  const [chainId, setChainId] = createSignal(456)\n\n  const { result } = renderPrimitive(() =>\n    useClient(() => ({ chainId: chainId() })),\n  )\n\n  expect(result()?.chain.id).toEqual(456)\n\n  setChainId(1)\n\n  await vi.waitFor(() => {\n    expect(result()?.chain.id).toEqual(1)\n  })\n})\n\ntest('behavior: unconfigured chain', () => {\n  const { result } = renderPrimitive(() =>\n    useClient(() => ({ chainId: 123456 })),\n  )\n  expect(result()).toBeUndefined()\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useClient.ts",
    "content": "import {\n  type Config,\n  type GetClientParameters,\n  type GetClientReturnType,\n  getClient,\n  type ResolvedRegister,\n  watchClient,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport type { Accessor } from 'solid-js'\nimport { createEffect, createSignal, onCleanup } from 'solid-js'\nimport { useConfig } from './useConfig.js'\n\n/** https://wagmi.sh/solid/api/primitives/useClient */\nexport function useClient<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends config['chains'][number]['id'] | number | undefined =\n    | config['chains'][number]['id']\n    | undefined,\n>(\n  parameters: useClient.Parameters<config, chainId> = () => ({}),\n): useClient.ReturnType<config, chainId> {\n  const config = useConfig(parameters)\n  const [client, setClient] = createSignal(getClient(config(), parameters()))\n  createEffect(() => {\n    const _config = config()\n    setClient(() => getClient(_config, parameters()))\n    const unsubscribe = watchClient(_config, {\n      onChange(data) {\n        if (client()?.uid === data?.uid) return\n        setClient(() => data)\n      },\n    })\n    onCleanup(() => unsubscribe())\n  })\n  return client as unknown as useClient.ReturnType<config, chainId>\n}\n\nexport namespace useClient {\n  export type Parameters<\n    config extends Config = Config,\n    chainId extends config['chains'][number]['id'] | number | undefined =\n      | config['chains'][number]['id']\n      | undefined,\n  > = Accessor<SolidParameters<config, chainId>>\n\n  export type ReturnType<\n    config extends Config = Config,\n    chainId extends config['chains'][number]['id'] | number | undefined =\n      | config['chains'][number]['id']\n      | undefined,\n  > = Accessor<SolidReturnType<config, chainId>>\n\n  export type SolidParameters<\n    config extends Config = Config,\n    chainId extends config['chains'][number]['id'] | number | undefined =\n      | config['chains'][number]['id']\n      | undefined,\n  > = Compute<GetClientParameters<config, chainId> & ConfigParameter<config>>\n\n  export type SolidReturnType<\n    config extends Config = Config,\n    chainId extends config['chains'][number]['id'] | number | undefined =\n      | config['chains'][number]['id']\n      | undefined,\n  > = GetClientReturnType<config, chainId>\n}\n"
  },
  {
    "path": "packages/solid/src/primitives/useConfig.test-d.ts",
    "content": "import type { Config } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useConfig } from './useConfig.js'\n\ntest('default', async () => {\n  const result = useConfig()\n  expectTypeOf(result()).toEqualTypeOf<Config>()\n})\n\ntest('parameters: config', async () => {\n  const result = useConfig(() => ({ config }))\n  expectTypeOf(result()).not.toEqualTypeOf<Config>()\n  expectTypeOf(result()).toEqualTypeOf<typeof config>()\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useConfig.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { renderPrimitive } from '@wagmi/test/solid'\nimport { expect, test, vi } from 'vitest'\n\nimport { useConfig } from './useConfig.js'\n\ntest('default', () => {\n  const { result } = renderPrimitive(useConfig(() => ({ config })))\n  expect(result).toBeDefined()\n})\n\ntest('behavior: throws when not inside Provider', async () => {\n  vi.spyOn(console, 'error').mockImplementation(() => {})\n\n  try {\n    renderPrimitive(useConfig(), {\n      wrapper: (props) => props.children,\n    })\n  } catch (error) {\n    expect(error).toMatchInlineSnapshot(`\n      [WagmiProviderNotFoundError: \\`useConfig\\` must be used within \\`WagmiProvider\\`.\n\n      Docs: https://wagmi.sh/solid/api/WagmiProvider.html\n      Version: @wagmi/solid@x.y.z]\n    `)\n  }\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useConfig.ts",
    "content": "import type { Config, ResolvedRegister } from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport { type Accessor, createMemo, useContext } from 'solid-js'\nimport { WagmiContext } from '../context.js'\nimport { WagmiProviderNotFoundError } from '../errors/context.js'\n\nexport function useConfig<config extends Config = ResolvedRegister['config']>(\n  parameters: useConfig.Parameters<config> = () => ({}),\n): useConfig.ReturnType<config> {\n  return createMemo(() => {\n    const config = parameters().config ?? useContext(WagmiContext)\n    if (!config) throw new WagmiProviderNotFoundError()\n    return config as config\n  })\n}\n\nexport namespace useConfig {\n  export type Parameters<config extends Config = Config> = Accessor<\n    SolidParameters<config>\n  >\n  export type ReturnType<config extends Config = Config> = Accessor<\n    SolidReturnType<config>\n  >\n  export type SolidParameters<config extends Config = Config> =\n    ConfigParameter<config>\n  export type SolidReturnType<config extends Config = Config> = config\n}\n"
  },
  {
    "path": "packages/solid/src/primitives/useConnect.test-d.ts",
    "content": "import type {\n  ConnectErrorType,\n  Connector,\n  CreateConnectorFn,\n} from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport type { Address, Hex } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useConnect } from './useConnect.js'\n\nconst connector = config.connectors[0]!\nconst contextValue = { foo: 'bar' } as const\n\ntest('context', () => {\n  const connect = useConnect(() => ({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toEqualTypeOf<{\n          chainId?: number | undefined\n          connector: Connector | CreateConnectorFn\n          withCapabilities?: boolean | undefined\n        }>()\n        return contextValue\n      },\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{\n          chainId?: number | undefined\n          connector: Connector | CreateConnectorFn\n          withCapabilities?: boolean | undefined\n        }>()\n        expectTypeOf(error).toEqualTypeOf<ConnectErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{\n          chainId?: number | undefined\n          connector: Connector | CreateConnectorFn\n          withCapabilities?: boolean | undefined\n        }>()\n        expectTypeOf(data).toEqualTypeOf<{\n          accounts:\n            | readonly [Address, ...Address[]]\n            | readonly [\n                { address: Address; capabilities: Record<string, unknown> },\n                ...{\n                  address: Address\n                  capabilities: Record<string, unknown>\n                }[],\n              ]\n\n          chainId: number\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<\n          | {\n              accounts:\n                | readonly [Address, ...Address[]]\n                | readonly [\n                    {\n                      address: Address\n                      capabilities: Record<string, unknown>\n                    },\n                    ...{\n                      address: Address\n                      capabilities: Record<string, unknown>\n                    }[],\n                  ]\n\n              chainId: number\n            }\n          | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<ConnectErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<{\n          chainId?: number | undefined\n          connector: Connector | CreateConnectorFn\n          withCapabilities?: boolean | undefined\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  }))\n\n  expectTypeOf(connect.data).toEqualTypeOf<\n    | {\n        accounts:\n          | readonly [Address, ...Address[]]\n          | readonly [\n              { address: Address; capabilities: Record<string, unknown> },\n              ...{\n                address: Address\n                capabilities: Record<string, unknown>\n              }[],\n            ]\n\n        chainId: number\n      }\n    | undefined\n  >()\n  expectTypeOf(connect.error).toEqualTypeOf<ConnectErrorType | null>()\n  expectTypeOf(connect.variables).toMatchTypeOf<\n    | {\n        chainId?: number | undefined\n        connector: Connector | CreateConnectorFn\n      }\n    | undefined\n  >()\n  expectTypeOf(connect.context).toEqualTypeOf<typeof contextValue | undefined>()\n\n  connect.mutate(\n    { connector },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{\n          chainId?: number | undefined\n          connector: typeof connector | CreateConnectorFn\n          foo?: string | undefined\n          withCapabilities?: boolean | undefined\n        }>()\n        expectTypeOf(error).toEqualTypeOf<ConnectErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{\n          chainId?: number | undefined\n          connector: typeof connector | CreateConnectorFn\n          foo?: string | undefined\n          withCapabilities?: boolean | undefined\n        }>()\n        expectTypeOf(data).toEqualTypeOf<{\n          accounts: readonly [Address, ...Address[]]\n          chainId: number\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<\n          | {\n              accounts: readonly [Address, ...Address[]]\n              chainId: number\n            }\n          | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<ConnectErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<{\n          chainId?: number | undefined\n          connector: typeof connector | CreateConnectorFn\n          foo?: string | undefined\n          withCapabilities?: boolean | undefined\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  )\n\n  connect.mutate(\n    {\n      connector,\n      foo: 'bar',\n      withCapabilities: true,\n    },\n    {\n      onSuccess(data, _variables, _context) {\n        expectTypeOf(data).toEqualTypeOf<{\n          accounts: readonly [\n            {\n              address: Address\n              capabilities: {\n                foo: { bar: Hex }\n              }\n            },\n            ...{\n              address: Address\n              capabilities: {\n                foo: { bar: Hex }\n              }\n            }[],\n          ]\n          chainId: number\n        }>()\n      },\n      onSettled(data, _error, _variables, _context) {\n        expectTypeOf(data).toEqualTypeOf<\n          | {\n              accounts: readonly [\n                {\n                  address: Address\n                  capabilities: {\n                    foo: { bar: Hex }\n                  }\n                },\n                ...{\n                  address: Address\n                  capabilities: {\n                    foo: { bar: Hex }\n                  }\n                }[],\n              ]\n              chainId: number\n            }\n          | undefined\n        >()\n      },\n    },\n  )\n\n  ;(async () => {\n    const res = await connect.mutateAsync({\n      connector,\n      foo: 'bar',\n      withCapabilities: true,\n    })\n    expectTypeOf(res).toEqualTypeOf<{\n      accounts: readonly [\n        {\n          address: Address\n          capabilities: {\n            foo: { bar: Hex }\n          }\n        },\n        ...{\n          address: Address\n          capabilities: {\n            foo: { bar: Hex }\n          }\n        }[],\n      ]\n      chainId: number\n    }>()\n  })()\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useConnect.test.ts",
    "content": "import { disconnect } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { renderPrimitive } from '@wagmi/test/solid'\nimport { afterEach, expect, test, vi } from 'vitest'\nimport { useConnect } from './useConnect.js'\nimport { useConnection } from './useConnection.js'\nimport { useConnectors } from './useConnectors.js'\n\nconst connector = config.connectors[0]!\n\nafterEach(async () => {\n  if (config.state.current === connector.uid)\n    await disconnect(config, { connector })\n})\n\ntest('default', async () => {\n  const { result } = renderPrimitive(() => ({\n    useConnection: useConnection(),\n    useConnect: useConnect(),\n    useConnectors: useConnectors(),\n  }))\n\n  expect(result.useConnection().address).not.toBeDefined()\n  expect(result.useConnection().status).toEqual('disconnected')\n\n  result.useConnect.mutate({\n    connector: result.useConnectors()[0]!,\n  })\n\n  await vi.waitFor(() =>\n    expect(result.useConnection().isConnected).toBeTruthy(),\n  )\n\n  expect(result.useConnection().address).toBeDefined()\n  expect(result.useConnection().status).toEqual('connected')\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useConnect.ts",
    "content": "import type { Config, ConnectErrorType } from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type ConnectData,\n  type ConnectMutate,\n  type ConnectMutateAsync,\n  type ConnectOptions,\n  type ConnectVariables,\n  connectMutationOptions,\n} from '@wagmi/core/query'\nimport { type Accessor, createEffect, onCleanup } from 'solid-js'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useMutation } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\n\n/** https://wagmi.sh/solid/api/hooks/useConnect */\nexport function useConnect<config extends Config = Config, context = unknown>(\n  parameters: useConnect.Parameters<config, context> = () => ({}),\n): useConnect.ReturnType<config, context> {\n  const config = useConfig(parameters)\n  const mutation = useMutation(() =>\n    connectMutationOptions(config(), parameters()),\n  )\n  // Reset mutation back to an idle state when the connector disconnects.\n  createEffect(() => {\n    const unsubscribe = config().subscribe(\n      ({ status }) => status,\n      (status, previousStatus) => {\n        if (previousStatus === 'connected' && status === 'disconnected') {\n          mutation.reset()\n        }\n      },\n    )\n    onCleanup(() => unsubscribe())\n  })\n  return mutation as unknown as useConnect.ReturnType<config, context>\n}\n\nexport namespace useConnect {\n  export type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = Accessor<SolidParameters<config, context>>\n\n  export type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = Compute<\n    UseMutationReturnType<\n      ConnectData<config, config['connectors'][number], boolean>,\n      ConnectErrorType,\n      ConnectVariables<config, config['connectors'][number], boolean>,\n      context,\n      ConnectMutate<config, context>,\n      ConnectMutateAsync<config, context>\n    >\n  >\n\n  export type SolidParameters<\n    config extends Config = Config,\n    context = unknown,\n  > = Compute<ConfigParameter<config> & ConnectOptions<config, context>>\n}\n"
  },
  {
    "path": "packages/solid/src/primitives/useConnection.test-d.ts",
    "content": "import type { Connector } from '@wagmi/core'\nimport type { Address, Chain } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useConnection } from './useConnection.js'\n\ntest('states', () => {\n  const result = useConnection()\n  const connection = result()\n\n  switch (connection.status) {\n    case 'reconnecting': {\n      expectTypeOf(connection).toMatchTypeOf<{\n        address: Address | undefined\n        chain: Chain | undefined\n        chainId: number | undefined\n        connector: Connector | undefined\n        isConnected: boolean\n        isConnecting: false\n        isDisconnected: false\n        isReconnecting: true\n        status: 'reconnecting'\n      }>()\n      break\n    }\n    case 'connecting': {\n      expectTypeOf(connection).toMatchTypeOf<{\n        address: Address | undefined\n        chain: Chain | undefined\n        chainId: number | undefined\n        connector: Connector | undefined\n        isConnected: false\n        isReconnecting: false\n        isConnecting: true\n        isDisconnected: false\n        status: 'connecting'\n      }>()\n      break\n    }\n    case 'connected': {\n      expectTypeOf(connection).toMatchTypeOf<{\n        address: Address\n        chain: Chain | undefined\n        chainId: number\n        connector: Connector\n        isConnected: true\n        isConnecting: false\n        isDisconnected: false\n        isReconnecting: false\n        status: 'connected'\n      }>()\n      break\n    }\n    case 'disconnected': {\n      expectTypeOf(connection).toMatchTypeOf<{\n        address: undefined\n        chain: undefined\n        chainId: undefined\n        connector: undefined\n        isConnected: false\n        isReconnecting: false\n        isConnecting: false\n        isDisconnected: true\n        status: 'disconnected'\n      }>()\n      break\n    }\n  }\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useConnection.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { renderPrimitive } from '@wagmi/test/solid'\nimport { expect, test } from 'vitest'\n\nimport { useConnection } from './useConnection.js'\n\ntest('default', async () => {\n  const { result } = renderPrimitive(() => useConnection())\n\n  expect(result().address).not.toBeDefined()\n  expect(result().status).toEqual('disconnected')\n\n  await connect(config, { connector: config.connectors[0]! })\n\n  expect(result().address).toBeDefined()\n  expect(result().status).toEqual('connected')\n\n  await disconnect(config)\n})\n\ntest('parameters: config', async () => {\n  const { result } = renderPrimitive(() => useConnection(() => ({ config })), {\n    wrapper: ({ children }) => children,\n  })\n  expect(result()).toBeDefined()\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useConnection.ts",
    "content": "import {\n  type Config,\n  type GetConnectionReturnType,\n  getConnection,\n  type ResolvedRegister,\n  watchConnection,\n} from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport { type Accessor, createEffect, createSignal, onCleanup } from 'solid-js'\nimport { useConfig } from './useConfig.js'\n\n/** https://wagmi.sh/solid/api/primitives/useConnection */\nexport function useConnection<\n  config extends Config = ResolvedRegister['config'],\n>(\n  parameters: useConnection.Parameters<config> = () => ({}),\n): useConnection.ReturnType<config> {\n  const config = useConfig(parameters)\n  const [connection, setConnection] = createSignal(getConnection(config()))\n  createEffect(() => {\n    const _config = config()\n    setConnection(() => getConnection(_config))\n    const unsubscribe = watchConnection(_config, {\n      onChange(data) {\n        setConnection(() => data)\n      },\n    })\n    onCleanup(() => unsubscribe())\n  })\n  return connection\n}\n\nexport namespace useConnection {\n  export type Parameters<config extends Config = Config> = Accessor<\n    SolidParameters<config>\n  >\n  export type ReturnType<config extends Config = Config> = Accessor<\n    SolidReturnType<config>\n  >\n  export type SolidParameters<config extends Config = Config> =\n    ConfigParameter<config>\n  export type SolidReturnType<config extends Config = Config> =\n    GetConnectionReturnType<config>\n}\n"
  },
  {
    "path": "packages/solid/src/primitives/useConnectionEffect.test.ts",
    "content": "import { mock } from '@wagmi/connectors'\nimport { connect, createConfig, disconnect, http } from '@wagmi/core'\nimport { accounts, chain, config } from '@wagmi/test'\nimport { createWrapper, renderPrimitive } from '@wagmi/test/solid'\nimport { expect, test, vi } from 'vitest'\n\nimport { WagmiProvider } from '../context.js'\nimport { useConnect } from './useConnect.js'\nimport { useConnectionEffect } from './useConnectionEffect.js'\nimport { useConnectors } from './useConnectors.js'\nimport { useDisconnect } from './useDisconnect.js'\n\ntest('parameters: config', async () => {\n  const { result } = renderPrimitive(\n    () => useConnectionEffect(() => ({ config })),\n    {\n      wrapper: (props) => props.children,\n    },\n  )\n  expect(result).toBeUndefined()\n})\n\ntest('behavior: connect and disconnect called once', async () => {\n  const onConnect = vi.fn()\n  const onDisconnect = vi.fn()\n\n  const { result } = renderPrimitive(() => ({\n    useConnectionEffect: useConnectionEffect(() => ({\n      onConnect,\n      onDisconnect,\n    })),\n    useConnect: useConnect(),\n    useConnectors: useConnectors(),\n    useDisconnect: useDisconnect(),\n  }))\n\n  result.useConnect.mutate({\n    connector: result.useConnectors()[0]!,\n  })\n  await vi.waitFor(() => expect(result.useConnect.isSuccess).toBeTruthy())\n\n  result.useConnect.mutate({\n    connector: result.useConnectors()[0]!,\n  })\n\n  result.useDisconnect.mutate()\n  await vi.waitFor(() => expect(result.useDisconnect.isSuccess).toBeTruthy())\n  result.useDisconnect.mutate()\n\n  expect(onConnect).toBeCalledTimes(1)\n  expect(onDisconnect).toBeCalledTimes(1)\n})\n\ntest('behavior: connect called on reconnect', async () => {\n  const config = createConfig({\n    chains: [chain.mainnet],\n    connectors: [\n      mock({\n        accounts,\n        features: { reconnect: true },\n      }),\n    ],\n    transports: { [chain.mainnet.id]: http() },\n  })\n\n  await connect(config, { connector: config.connectors[0]! })\n  const onConnect = vi.fn((data) => {\n    expect(data.isReconnected).toBeTruthy()\n  })\n\n  renderPrimitive(() => useConnectionEffect(() => ({ onConnect })), {\n    wrapper: createWrapper(WagmiProvider, { config, reconnectOnMount: true }),\n  })\n\n  await vi.waitFor(() => expect(onConnect).toBeCalledTimes(1), {\n    timeout: 10_000,\n  })\n\n  await disconnect(config)\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useConnectionEffect.ts",
    "content": "import { type GetConnectionReturnType, watchConnection } from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport type { Accessor } from 'solid-js'\nimport { createEffect, onCleanup } from 'solid-js'\nimport { useConfig } from './useConfig.js'\n\n/** https://wagmi.sh/solid/api/primitives/useConnectionEffect */\nexport function useConnectionEffect(\n  parameters: useConnectionEffect.Parameters = () => ({}),\n) {\n  const config = useConfig(parameters)\n\n  createEffect(() => {\n    const { onConnect, onDisconnect } = parameters()\n\n    const unsubscribe = watchConnection(config(), {\n      onChange(data, prevData) {\n        if (\n          (prevData.status === 'reconnecting' ||\n            (prevData.status === 'connecting' &&\n              prevData.address === undefined)) &&\n          data.status === 'connected'\n        ) {\n          const { address, addresses, chain, chainId, connector } = data\n          const isReconnected =\n            prevData.status === 'reconnecting' ||\n            // if `previousAccount.status` is `undefined`, the connector connected immediately.\n            prevData.status === undefined\n          onConnect?.({\n            address,\n            addresses,\n            chain,\n            chainId,\n            connector,\n            isReconnected,\n          })\n        } else if (\n          prevData.status === 'connected' &&\n          data.status === 'disconnected'\n        )\n          onDisconnect?.()\n      },\n    })\n    onCleanup(() => unsubscribe())\n  })\n}\n\nexport namespace useConnectionEffect {\n  export type Parameters = Accessor<SolidParameters>\n\n  export type SolidParameters = Compute<\n    {\n      onConnect?(\n        data: Compute<\n          Pick<\n            Extract<GetConnectionReturnType, { status: 'connected' }>,\n            'address' | 'addresses' | 'chain' | 'chainId' | 'connector'\n          > & {\n            isReconnected: boolean\n          }\n        >,\n      ): void\n      onDisconnect?(): void\n    } & ConfigParameter\n  >\n}\n"
  },
  {
    "path": "packages/solid/src/primitives/useConnections.test.ts",
    "content": "import { connect } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { renderPrimitive } from '@wagmi/test/solid'\nimport { expect, test } from 'vitest'\n\nimport { useConnections } from './useConnections.js'\n\ntest('default', async () => {\n  const { result } = renderPrimitive(() => useConnections())\n\n  expect(result()).toEqual([])\n\n  await connect(config, { connector: config.connectors[0]! })\n\n  expect(result().length).toBe(1)\n})\n\ntest('parameters: config', () => {\n  const { result } = renderPrimitive(() => useConnections(() => ({ config })), {\n    wrapper: (props) => props.children,\n  })\n  expect(result()).toBeDefined()\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useConnections.ts",
    "content": "import {\n  type GetConnectionsReturnType,\n  getConnections,\n  watchConnections,\n} from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport { type Accessor, createEffect, createSignal, onCleanup } from 'solid-js'\nimport { useConfig } from './useConfig.js'\n\n/** https://wagmi.sh/solid/api/primitives/useConnections */\nexport function useConnections(\n  parameters: useConnections.Parameters = () => ({}),\n): useConnections.ReturnType {\n  const config = useConfig(parameters)\n  const [connections, setConnections] = createSignal(getConnections(config()))\n  createEffect(() => {\n    const _config = config()\n    setConnections(() => getConnections(_config))\n    const unsubscribe = watchConnections(_config, {\n      onChange(data) {\n        setConnections(() => data)\n      },\n    })\n    onCleanup(() => unsubscribe())\n  })\n  return connections\n}\n\nexport namespace useConnections {\n  export type Parameters = Accessor<SolidParameters>\n  export type ReturnType = Accessor<SolidReturnType>\n  export type SolidParameters = ConfigParameter\n  export type SolidReturnType = GetConnectionsReturnType\n}\n"
  },
  {
    "path": "packages/solid/src/primitives/useConnectorClient.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useConnectorClient } from './useConnectorClient.js'\n\ntest('parameters: config', async () => {\n  const client = useConnectorClient(() => ({ config }))\n  expectTypeOf(client.data?.chain?.id!).toEqualTypeOf<1 | 456 | 10>()\n\n  const client2 = useConnectorClient(() => ({ config, chainId: 1 }))\n  expectTypeOf(client2.data?.chain?.id!).toEqualTypeOf<1>()\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useConnectorClient.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { config, wait } from '@wagmi/test'\nimport { renderPrimitive } from '@wagmi/test/solid'\nimport { expect, test, vi } from 'vitest'\nimport { useConnect } from './useConnect.js'\nimport { useConnectorClient } from './useConnectorClient.js'\nimport { useConnectors } from './useConnectors.js'\nimport { useDisconnect } from './useDisconnect.js'\nimport { useSwitchChain } from './useSwitchChain.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  const { result } = renderPrimitive(() => useConnectorClient())\n\n  await vi.waitFor(() => expect(result.isPending).toBeTruthy())\n\n  expect(result).toMatchInlineSnapshot(`\n    {\n      \"data\": undefined,\n      \"dataUpdatedAt\": 0,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": false,\n      \"isFetchedAfterMount\": false,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": true,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": false,\n      \"isSuccess\": false,\n      \"queryKey\": [\n        \"connectorClient\",\n        {\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"pending\",\n    }\n  `)\n})\n\ntest('behavior: connected on mount', async () => {\n  await connect(config, { connector })\n\n  const { result } = renderPrimitive(() => useConnectorClient())\n\n  await vi.waitUntil(() => result.isSuccess, { timeout: 10_000 })\n\n  const { data, queryKey: _, ...rest } = result\n  expect(data).toMatchObject(\n    expect.objectContaining({\n      account: expect.any(Object),\n      chain: expect.any(Object),\n    }),\n  )\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": false,\n      \"isSuccess\": true,\n      \"refetch\": [Function],\n      \"status\": \"success\",\n    }\n  `)\n\n  await disconnect(config, { connector })\n})\n\ntest('behavior: connect and disconnect', async () => {\n  const { result } = renderPrimitive(() => ({\n    useConnect: useConnect(),\n    useConnectors: useConnectors(),\n    useConnectorClient: useConnectorClient(),\n    useDisconnect: useDisconnect(),\n  }))\n\n  expect(result.useConnectorClient.data).not.toBeDefined()\n\n  result.useConnect.mutate({\n    connector: result.useConnectors()[0]!,\n  })\n\n  await vi.waitFor(() => expect(result.useConnectorClient.data).toBeDefined())\n\n  result.useDisconnect.mutate()\n\n  await vi.waitFor(() =>\n    expect(result.useConnectorClient.data).not.toBeDefined(),\n  )\n})\n\ntest('behavior: switch chains', async () => {\n  await connect(config, { connector })\n\n  const { result } = renderPrimitive(() => ({\n    useConnectorClient: useConnectorClient(),\n    useSwitchChain: useSwitchChain(),\n  }))\n\n  expect(result.useConnectorClient.data).not.toBeDefined()\n  await vi.waitFor(() => expect(result.useConnectorClient.data).toBeDefined())\n\n  result.useSwitchChain.mutate({ chainId: 456 })\n  await vi.waitUntil(() => result.useSwitchChain.isSuccess, {\n    timeout: 10_000,\n  })\n  result.useSwitchChain.reset()\n  await vi.waitUntil(() => result.useConnectorClient.isSuccess, {\n    timeout: 10_000,\n  })\n  expect(result.useConnectorClient.data?.chain.id).toEqual(456)\n\n  result.useSwitchChain.mutate({ chainId: 1 })\n  await vi.waitUntil(() => result.useSwitchChain.isSuccess, {\n    timeout: 10_000,\n  })\n  await vi.waitUntil(() => result.useConnectorClient.isSuccess, {\n    timeout: 10_000,\n  })\n  expect(result.useConnectorClient.data?.chain.id).toEqual(1)\n\n  await disconnect(config, { connector })\n})\n\ntest('behavior: disabled when properties missing', async () => {\n  await disconnect(config, { connector })\n\n  const { result } = renderPrimitive(() => useConnectorClient())\n\n  await wait(0)\n  await vi.waitFor(() => expect(result.isPending).toBeTruthy())\n})\n\ntest('behavior: disabled when connecting', async () => {\n  const { result } = renderPrimitive(() => useConnectorClient())\n  config.setState((x) => ({ ...x, status: 'connecting' }))\n\n  await wait(0)\n  expect(result.isLoading).not.toBeTruthy()\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useConnectorClient.ts",
    "content": "import { useQueryClient } from '@tanstack/solid-query'\nimport type {\n  Config,\n  GetConnectorClientErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetConnectorClientData,\n  type GetConnectorClientOptions,\n  getConnectorClientQueryOptions,\n} from '@wagmi/core/query'\nimport type { Accessor } from 'solid-js'\nimport { createEffect, createMemo, on } from 'solid-js'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\nimport { useConnection } from './useConnection.js'\n\n/** https://wagmi.sh/solid/api/primitives/useConnectorClient */\nexport function useConnectorClient<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetConnectorClientData<config, chainId>,\n>(\n  parameters: useConnectorClient.Parameters<\n    config,\n    chainId,\n    selectData\n  > = () => ({}),\n): useConnectorClient.ReturnType<config, chainId, selectData> {\n  const config = useConfig(parameters)\n  const chainId = useChainId(() => ({ config: config() }))\n  const connection = useConnection(() => ({ config: config() }))\n  const options = createMemo(() =>\n    getConnectorClientQueryOptions<config, chainId>(config(), {\n      ...(parameters() as any),\n      chainId: parameters().chainId ?? chainId(),\n      connector: parameters().connector ?? connection().connector,\n    }),\n  )\n  const queryClient = useQueryClient()\n  createEffect(\n    on(\n      () => connection().address,\n      (currentAddress, previousAddress) => {\n        if (!currentAddress && previousAddress) {\n          // remove when account is disconnected\n          queryClient.removeQueries({ queryKey: options().queryKey })\n        } else if (currentAddress !== previousAddress) {\n          // invalidate when address changes\n          queryClient.invalidateQueries({ queryKey: options().queryKey })\n        }\n      },\n      { defer: true },\n    ),\n  )\n  return useQuery(options) as any\n}\n\nexport namespace useConnectorClient {\n  export type Parameters<\n    config extends Config = Config,\n    chainId extends\n      config['chains'][number]['id'] = config['chains'][number]['id'],\n    selectData = GetConnectorClientData<config, chainId>,\n  > = Accessor<SolidParameters<config, chainId, selectData>>\n\n  export type ReturnType<\n    config extends Config = Config,\n    chainId extends\n      config['chains'][number]['id'] = config['chains'][number]['id'],\n    selectData = GetConnectorClientData<config, chainId>,\n  > = UseQueryReturnType<selectData, GetConnectorClientErrorType>\n\n  export type SolidParameters<\n    config extends Config = Config,\n    chainId extends\n      config['chains'][number]['id'] = config['chains'][number]['id'],\n    selectData = GetConnectorClientData<config, chainId>,\n  > = Compute<\n    GetConnectorClientOptions<config, chainId, selectData> &\n      ConfigParameter<config>\n  >\n}\n"
  },
  {
    "path": "packages/solid/src/primitives/useConnectors.test.ts",
    "content": "import { mock } from '@wagmi/connectors'\nimport { accounts, config } from '@wagmi/test'\nimport { renderPrimitive } from '@wagmi/test/solid'\nimport { expect, test } from 'vitest'\nimport { useConnectors } from './useConnectors.js'\n\ntest('default', async () => {\n  const { result } = renderPrimitive(() => useConnectors())\n\n  const count = config.connectors.length\n  expect(result().length).toBe(count)\n  expect(result()).toEqual(config.connectors)\n\n  config._internal.connectors.setState(() => [\n    ...config.connectors,\n    config._internal.connectors.setup(mock({ accounts })),\n  ])\n\n  expect(result().length).toBe(count + 1)\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useConnectors.ts",
    "content": "import {\n  type Config,\n  type GetConnectorsReturnType,\n  getConnectors,\n  type ResolvedRegister,\n  watchConnectors,\n} from '@wagmi/core'\nimport { type Accessor, createEffect, createSignal, onCleanup } from 'solid-js'\nimport { useConfig } from './useConfig.js'\n\n/** https://wagmi.sh/solid/api/primitives/useConnectors */\nexport function useConnectors<\n  config extends Config = ResolvedRegister['config'],\n>(\n  parameters: useConnectors.Parameters<config> = () => ({}),\n): useConnectors.ReturnType<config> {\n  const config = useConfig(parameters)\n  const [connectors, setConnectors] = createSignal(getConnectors(config()))\n  createEffect(() => {\n    const _config = config()\n    setConnectors(() => getConnectors(_config))\n\n    const unsubscribe = watchConnectors(_config, {\n      onChange(data) {\n        setConnectors(() => data)\n      },\n    })\n    onCleanup(() => unsubscribe())\n  })\n  return connectors\n}\n\nexport namespace useConnectors {\n  export type Parameters<config extends Config = Config> = Accessor<\n    SolidParameters<config>\n  >\n\n  export type ReturnType<config extends Config = Config> = Accessor<\n    SolidReturnType<config>\n  >\n\n  export type SolidParameters<config extends Config = Config> =\n    useConfig.SolidParameters<config>\n\n  export type SolidReturnType<config extends Config = Config> =\n    GetConnectorsReturnType<config>\n}\n"
  },
  {
    "path": "packages/solid/src/primitives/useDisconnect.test-d.ts",
    "content": "import type { Connector, DisconnectErrorType } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useDisconnect } from './useDisconnect.js'\n\nconst connector = config.connectors[0]!\nconst contextValue = { foo: 'bar' } as const\n\ntest('parameter', () => {\n  expectTypeOf(useDisconnect().mutate)\n    .parameter(0)\n    .toEqualTypeOf<{ connector?: Connector | undefined } | undefined>()\n  expectTypeOf(useDisconnect().mutate)\n    .parameter(0)\n    .toEqualTypeOf<{ connector?: Connector | undefined } | undefined>()\n})\n\ntest('context', () => {\n  const disconnect = useDisconnect(() => ({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toEqualTypeOf<\n          { connector?: Connector | undefined } | undefined\n        >()\n        return contextValue\n      },\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<\n          { connector?: Connector | undefined } | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<DisconnectErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<\n          { connector?: Connector | undefined } | undefined\n        >()\n        expectTypeOf(data).toEqualTypeOf<void>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<void | undefined>()\n        expectTypeOf(error).toEqualTypeOf<DisconnectErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<\n          { connector?: Connector | undefined } | undefined\n        >()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  }))\n\n  expectTypeOf(disconnect.data).toEqualTypeOf<void | undefined>()\n  expectTypeOf(disconnect.error).toEqualTypeOf<DisconnectErrorType | null>()\n  expectTypeOf(disconnect.variables).toEqualTypeOf<\n    { connector?: Connector | undefined } | undefined\n  >()\n  expectTypeOf(disconnect.context).toEqualTypeOf<\n    typeof contextValue | undefined\n  >()\n\n  disconnect.mutate(\n    { connector },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<\n          { connector?: Connector | undefined } | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<DisconnectErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<\n          { connector?: Connector | undefined } | undefined\n        >()\n        expectTypeOf(data).toEqualTypeOf<void>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<void | undefined>()\n        expectTypeOf(error).toEqualTypeOf<DisconnectErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<\n          { connector?: Connector | undefined } | undefined\n        >()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  )\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useDisconnect.test.ts",
    "content": "import { connect } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { renderPrimitive } from '@wagmi/test/solid'\nimport { beforeEach, expect, test, vi } from 'vitest'\n\nimport { useConnection } from './useConnection.js'\nimport { useDisconnect } from './useDisconnect.js'\n\nconst connector = config.connectors[0]!\n\nbeforeEach(async () => {\n  await connect(config, { connector })\n})\n\ntest('default', async () => {\n  const { result } = renderPrimitive(() => ({\n    useConnection: useConnection(),\n    useDisconnect: useDisconnect(),\n  }))\n\n  expect(result.useConnection().address).toBeDefined()\n  expect(result.useConnection().status).toEqual('connected')\n\n  result.useDisconnect.mutate()\n\n  await vi.waitFor(() =>\n    expect(result.useConnection().isDisconnected).toBeTruthy(),\n  )\n\n  expect(result.useConnection().address).not.toBeDefined()\n  expect(result.useConnection().status).toEqual('disconnected')\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useDisconnect.ts",
    "content": "import { createMutation as useMutation } from '@tanstack/solid-query'\nimport type { DisconnectErrorType } from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type DisconnectData,\n  type DisconnectMutate,\n  type DisconnectMutateAsync,\n  type DisconnectOptions,\n  type DisconnectVariables,\n  disconnectMutationOptions,\n} from '@wagmi/core/query'\nimport type { Accessor } from 'solid-js'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\n\n/** https://wagmi.sh/solid/api/primitives/useDisconnect */\nexport function useDisconnect<context = unknown>(\n  parameters: useDisconnect.Parameters<context> = () => ({}),\n): useDisconnect.ReturnType<context> {\n  const config = useConfig(parameters)\n  const mutation = useMutation(() =>\n    disconnectMutationOptions(config(), parameters()),\n  )\n  return mutation as useDisconnect.ReturnType<context>\n}\n\nexport namespace useDisconnect {\n  export type Parameters<context = unknown> = Accessor<SolidParameters<context>>\n\n  export type ReturnType<context = unknown> = Compute<\n    UseMutationReturnType<\n      DisconnectData,\n      DisconnectErrorType,\n      DisconnectVariables,\n      context,\n      DisconnectMutate<context>,\n      DisconnectMutateAsync<context>\n    >\n  >\n\n  export type SolidParameters<context = unknown> = Compute<\n    ConfigParameter & DisconnectOptions<context>\n  >\n}\n"
  },
  {
    "path": "packages/solid/src/primitives/useReconnect.test-d.ts",
    "content": "import type {\n  Connector,\n  CreateConnectorFn,\n  ReconnectErrorType,\n} from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport type { Address } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport { useReconnect } from './useReconnect.js'\n\nconst connectors = [config.connectors[0]!]\nconst contextValue = { foo: 'bar' } as const\n\ntest('context', () => {\n  const reconnect = useReconnect(() => ({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toEqualTypeOf<\n          | {\n              connectors?:\n                | readonly (CreateConnectorFn | Connector)[]\n                | undefined\n            }\n          | undefined\n        >()\n        return contextValue\n      },\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<\n          | {\n              connectors?:\n                | readonly (CreateConnectorFn | Connector)[]\n                | undefined\n            }\n          | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<ReconnectErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<\n          | {\n              connectors?:\n                | readonly (CreateConnectorFn | Connector)[]\n                | undefined\n            }\n          | undefined\n        >()\n        expectTypeOf(data).toEqualTypeOf<\n          {\n            accounts: readonly [Address, ...Address[]]\n            chainId: number\n            connector: Connector\n          }[]\n        >()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<\n          | {\n              accounts: readonly [Address, ...Address[]]\n              chainId: number\n              connector: Connector\n            }[]\n          | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<ReconnectErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<\n          | {\n              connectors?:\n                | readonly (CreateConnectorFn | Connector)[]\n                | undefined\n            }\n          | undefined\n        >()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  }))\n\n  expectTypeOf(reconnect.data).toEqualTypeOf<\n    | {\n        accounts: readonly [Address, ...Address[]]\n        chainId: number\n        connector: Connector\n      }[]\n    | undefined\n  >()\n  expectTypeOf(reconnect.error).toEqualTypeOf<ReconnectErrorType | null>()\n  expectTypeOf(reconnect.variables).toEqualTypeOf<\n    | {\n        connectors?: readonly (CreateConnectorFn | Connector)[] | undefined\n      }\n    | undefined\n  >()\n  expectTypeOf(reconnect.context).toEqualTypeOf<\n    typeof contextValue | undefined\n  >()\n\n  reconnect.mutate(\n    { connectors },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<\n          | {\n              connectors?:\n                | readonly (CreateConnectorFn | Connector)[]\n                | undefined\n            }\n          | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<ReconnectErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<\n          | {\n              connectors?:\n                | readonly (CreateConnectorFn | Connector)[]\n                | undefined\n            }\n          | undefined\n        >()\n        expectTypeOf(data).toEqualTypeOf<\n          {\n            accounts: readonly [Address, ...Address[]]\n            chainId: number\n            connector: Connector\n          }[]\n        >()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<\n          | {\n              accounts: readonly [Address, ...Address[]]\n              chainId: number\n              connector: Connector\n            }[]\n          | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<ReconnectErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<\n          | {\n              connectors?:\n                | readonly (CreateConnectorFn | Connector)[]\n                | undefined\n            }\n          | undefined\n        >()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  )\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useReconnect.test.ts",
    "content": "import { mock } from '@wagmi/connectors'\nimport { connect, disconnect } from '@wagmi/core'\nimport { accounts, config } from '@wagmi/test'\nimport { renderPrimitive } from '@wagmi/test/solid'\nimport { afterEach, expect, test, vi } from 'vitest'\n\nimport { useReconnect } from './useReconnect.js'\n\nconst connector = config._internal.connectors.setup(\n  mock({\n    accounts,\n    features: { reconnect: true },\n  }),\n)\n\nafterEach(async () => {\n  if (config.state.current) await disconnect(config)\n})\n\ntest('default', async () => {\n  const { result } = renderPrimitive(() => useReconnect())\n\n  result.mutate()\n  await vi.waitUntil(() => result.isSuccess, { timeout: 10_000 })\n\n  expect(result.data).toStrictEqual([])\n})\n\ntest('parameters: connectors (Connector)', async () => {\n  await connect(config, { connector })\n\n  const { result } = renderPrimitive(() => useReconnect())\n\n  result.mutate({ connectors: [connector] })\n  await vi.waitUntil(() => result.isSuccess, { timeout: 10_000 })\n\n  expect(result.data).toMatchObject(\n    expect.arrayContaining([\n      expect.objectContaining({\n        accounts: expect.any(Array),\n        chainId: expect.any(Number),\n      }),\n    ]),\n  )\n})\n\ntest('parameters: connectors (CreateConnectorFn)', async () => {\n  const connector = mock({\n    accounts,\n    features: { reconnect: true },\n  })\n  await connect(config, { connector })\n\n  const { result } = renderPrimitive(() => useReconnect())\n\n  result.mutate({ connectors: [connector] })\n  await vi.waitUntil(() => result.isSuccess, { timeout: 10_000 })\n\n  expect(result.data).toMatchObject(\n    expect.arrayContaining([\n      expect.objectContaining({\n        accounts: expect.any(Array),\n        chainId: expect.any(Number),\n      }),\n    ]),\n  )\n})\n\ntest(\"behavior: doesn't reconnect if already reconnecting\", async () => {\n  const previousStatus = config.state.status\n  config.setState((x) => ({ ...x, status: 'reconnecting' }))\n  const { result } = renderPrimitive(() => useReconnect())\n  await expect(\n    result.mutateAsync({ connectors: [connector] }),\n  ).resolves.toStrictEqual([])\n  config.setState((x) => ({ ...x, status: previousStatus }))\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useReconnect.ts",
    "content": "import { createMutation as useMutation } from '@tanstack/solid-query'\nimport type { ReconnectErrorType } from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type ReconnectData,\n  type ReconnectMutate,\n  type ReconnectMutateAsync,\n  type ReconnectOptions,\n  type ReconnectVariables,\n  reconnectMutationOptions,\n} from '@wagmi/core/query'\nimport type { Accessor } from 'solid-js'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\n\n/** https://wagmi.sh/solid/api/primitives/useReconnect */\nexport function useReconnect<context = unknown>(\n  parameters: useReconnect.Parameters<context> = () => ({}),\n): useReconnect.ReturnType<context> {\n  const config = useConfig(parameters)\n  const mutation = useMutation(() =>\n    reconnectMutationOptions(config(), parameters()),\n  )\n  return mutation as useReconnect.ReturnType<context>\n}\n\nexport namespace useReconnect {\n  export type Parameters<context = unknown> = Accessor<SolidParameters<context>>\n\n  export type ReturnType<context = unknown> = Compute<\n    UseMutationReturnType<\n      ReconnectData,\n      ReconnectErrorType,\n      ReconnectVariables,\n      context,\n      ReconnectMutate<context>,\n      ReconnectMutateAsync<context>\n    >\n  >\n\n  export type SolidParameters<context = unknown> = Compute<\n    ConfigParameter & ReconnectOptions<context>\n  >\n}\n"
  },
  {
    "path": "packages/solid/src/primitives/useSwitchChain.test-d.ts",
    "content": "import type { Connector, SwitchChainErrorType } from '@wagmi/core'\nimport type { Chain } from '@wagmi/core/chains'\nimport type { Compute, ExactPartial } from '@wagmi/core/internal'\nimport { chain } from '@wagmi/test'\nimport type { AddEthereumChainParameter } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport { useSwitchChain } from './useSwitchChain.js'\n\nconst chainId = chain.mainnet.id\nconst contextValue = { foo: 'bar' } as const\n\ntest('context', () => {\n  const switchChain = useSwitchChain(() => ({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toEqualTypeOf<{\n          addEthereumChainParameter?:\n            | ExactPartial<Omit<AddEthereumChainParameter, 'chainId'>>\n            | undefined\n          chainId: number\n          connector?: Connector | undefined\n        }>()\n        return contextValue\n      },\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{\n          addEthereumChainParameter?:\n            | ExactPartial<Omit<AddEthereumChainParameter, 'chainId'>>\n            | undefined\n          chainId: number\n          connector?: Connector | undefined\n        }>()\n        expectTypeOf(error).toEqualTypeOf<SwitchChainErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{\n          addEthereumChainParameter?:\n            | ExactPartial<Omit<AddEthereumChainParameter, 'chainId'>>\n            | undefined\n          chainId: number\n          connector?: Connector | undefined\n        }>()\n        expectTypeOf(data).toEqualTypeOf<Compute<Chain>>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<Compute<Chain> | undefined>()\n        expectTypeOf(error).toEqualTypeOf<SwitchChainErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<{\n          addEthereumChainParameter?:\n            | ExactPartial<Omit<AddEthereumChainParameter, 'chainId'>>\n            | undefined\n          chainId: number\n          connector?: Connector | undefined\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  }))\n\n  expectTypeOf(switchChain.data).toEqualTypeOf<Compute<Chain> | undefined>()\n  expectTypeOf(switchChain.error).toEqualTypeOf<SwitchChainErrorType | null>()\n  expectTypeOf(switchChain.variables).toEqualTypeOf<\n    | {\n        addEthereumChainParameter?:\n          | ExactPartial<Omit<AddEthereumChainParameter, 'chainId'>>\n          | undefined\n        chainId: number\n        connector?: Connector | undefined\n      }\n    | undefined\n  >()\n  expectTypeOf(switchChain.context).toEqualTypeOf<\n    typeof contextValue | undefined\n  >()\n\n  switchChain.mutate(\n    { chainId },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{\n          addEthereumChainParameter?:\n            | ExactPartial<Omit<AddEthereumChainParameter, 'chainId'>>\n            | undefined\n          chainId: number\n          connector?: Connector | undefined\n        }>()\n        expectTypeOf(error).toEqualTypeOf<SwitchChainErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{\n          addEthereumChainParameter?:\n            | ExactPartial<Omit<AddEthereumChainParameter, 'chainId'>>\n            | undefined\n          chainId: number\n          connector?: Connector | undefined\n        }>()\n        expectTypeOf(data).toEqualTypeOf<Compute<Chain>>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<Compute<Chain> | undefined>()\n        expectTypeOf(error).toEqualTypeOf<SwitchChainErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<{\n          addEthereumChainParameter?:\n            | ExactPartial<Omit<AddEthereumChainParameter, 'chainId'>>\n            | undefined\n          chainId: number\n          connector?: Connector | undefined\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  )\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useSwitchChain.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { chain, config } from '@wagmi/test'\nimport { renderPrimitive } from '@wagmi/test/solid'\nimport { expect, test, vi } from 'vitest'\n\nimport { useConnection } from './useConnection.js'\nimport { useSwitchChain } from './useSwitchChain.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const { result } = renderPrimitive(() => ({\n    useConnection: useConnection(),\n    useSwitchChain: useSwitchChain(),\n  }))\n\n  const chainId1 = result.useConnection().chainId\n  expect(chainId1).toBeDefined()\n\n  result.useSwitchChain.mutate({ chainId: chain.mainnet2.id })\n  await vi.waitFor(() => expect(result.useSwitchChain.isSuccess).toBeTruthy())\n  const chainId2 = result.useConnection().chainId\n  expect(chainId2).toBeDefined()\n  expect(chainId1).not.toBe(chainId2)\n\n  result.useSwitchChain.mutate({ chainId: chain.mainnet.id })\n  await vi.waitFor(() => expect(result.useSwitchChain.isSuccess).toBeTruthy())\n\n  const chainId3 = result.useConnection().chainId\n  expect(chainId3).toBeDefined()\n  expect(chainId1).toBe(chainId3)\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useSwitchChain.ts",
    "content": "import { createMutation as useMutation } from '@tanstack/solid-query'\nimport type {\n  Config,\n  ResolvedRegister,\n  SwitchChainErrorType,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type SwitchChainData,\n  type SwitchChainMutate,\n  type SwitchChainMutateAsync,\n  type SwitchChainOptions,\n  type SwitchChainVariables,\n  switchChainMutationOptions,\n} from '@wagmi/core/query'\nimport type { Accessor } from 'solid-js'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\n\n/** https://wagmi.sh/solid/api/primitives/useSwitchChain */\nexport function useSwitchChain<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useSwitchChain.Parameters<config, context> = () => ({}),\n): useSwitchChain.ReturnType<config, context> {\n  const config = useConfig(parameters)\n  const mutation = useMutation(() =>\n    switchChainMutationOptions(config(), parameters()),\n  )\n  return mutation as useSwitchChain.ReturnType<config, context>\n}\n\nexport namespace useSwitchChain {\n  export type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = Accessor<SolidParameters<config, context>>\n\n  export type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = Compute<\n    UseMutationReturnType<\n      SwitchChainData<config, config['chains'][number]['id']>,\n      SwitchChainErrorType,\n      SwitchChainVariables<config, config['chains'][number]['id']>,\n      context,\n      SwitchChainMutate<config, context>,\n      SwitchChainMutateAsync<config, context>\n    >\n  >\n\n  export type SolidParameters<\n    config extends Config = Config,\n    context = unknown,\n  > = Compute<ConfigParameter<config> & SwitchChainOptions<config, context>>\n}\n"
  },
  {
    "path": "packages/solid/src/primitives/useSwitchConnection.test-d.ts",
    "content": "import type { Connector, SwitchConnectionErrorType } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport type { Address } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport { useSwitchConnection } from './useSwitchConnection.js'\n\nconst connector = config.connectors[0]!\nconst contextValue = { foo: 'bar' } as const\n\ntest('context', () => {\n  const switchConnection = useSwitchConnection(() => ({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toEqualTypeOf<{ connector: Connector }>()\n        return contextValue\n      },\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{ connector: Connector }>()\n        expectTypeOf(error).toEqualTypeOf<SwitchConnectionErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{ connector: Connector }>()\n        expectTypeOf(data).toEqualTypeOf<{\n          accounts: readonly [Address, ...Address[]]\n          chainId: number\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<\n          | {\n              accounts: readonly [Address, ...Address[]]\n              chainId: number\n            }\n          | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<SwitchConnectionErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<{ connector: Connector }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  }))\n\n  expectTypeOf(switchConnection.data).toEqualTypeOf<\n    | {\n        accounts: readonly [Address, ...Address[]]\n        chainId: number\n      }\n    | undefined\n  >()\n  expectTypeOf(\n    switchConnection.error,\n  ).toEqualTypeOf<SwitchConnectionErrorType | null>()\n  expectTypeOf(switchConnection.variables).toEqualTypeOf<\n    { connector: Connector } | undefined\n  >()\n  expectTypeOf(switchConnection.context).toEqualTypeOf<\n    typeof contextValue | undefined\n  >()\n\n  switchConnection.mutate(\n    { connector },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{ connector: Connector }>()\n        expectTypeOf(error).toEqualTypeOf<SwitchConnectionErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{ connector: Connector }>()\n        expectTypeOf(data).toEqualTypeOf<{\n          accounts: readonly [Address, ...Address[]]\n          chainId: number\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<\n          | {\n              accounts: readonly [Address, ...Address[]]\n              chainId: number\n            }\n          | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<SwitchConnectionErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<{ connector: Connector }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  )\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useSwitchConnection.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { config, wait } from '@wagmi/test'\nimport { renderPrimitive } from '@wagmi/test/solid'\nimport { expect, test, vi } from 'vitest'\n\nimport { useConnection } from './useConnection.js'\nimport { useSwitchConnection } from './useSwitchConnection.js'\n\nconst connector1 = config.connectors[0]!\nconst connector2 = config.connectors[1]!\n\ntest('default', async () => {\n  await connect(config, { connector: connector2 })\n  await connect(config, { connector: connector1 })\n\n  const { result } = renderPrimitive(() => ({\n    useConnection: useConnection(),\n    useSwitchConnection: useSwitchConnection(),\n  }))\n\n  const address1 = result.useConnection().address\n  expect(address1).toBeDefined()\n\n  result.useSwitchConnection.mutate({ connector: connector2 })\n  await vi.waitFor(() =>\n    expect(result.useSwitchConnection.isSuccess).toBeTruthy(),\n  )\n  await wait(0)\n\n  const address2 = result.useConnection().address\n  expect(address2).toBeDefined()\n  expect(address1).not.toBe(address2)\n\n  result.useSwitchConnection.mutate({ connector: connector1 })\n  await vi.waitFor(() =>\n    expect(result.useSwitchConnection.isSuccess).toBeTruthy(),\n  )\n  await wait(0)\n\n  const address3 = result.useConnection().address\n  expect(address3).toBeDefined()\n  expect(address1).toBe(address3)\n\n  await disconnect(config, { connector: connector1 })\n  await disconnect(config, { connector: connector2 })\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useSwitchConnection.ts",
    "content": "import { createMutation as useMutation } from '@tanstack/solid-query'\nimport type {\n  Config,\n  ResolvedRegister,\n  SwitchConnectionErrorType,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type SwitchConnectionData,\n  type SwitchConnectionMutate,\n  type SwitchConnectionMutateAsync,\n  type SwitchConnectionOptions,\n  type SwitchConnectionVariables,\n  switchConnectionMutationOptions,\n} from '@wagmi/core/query'\nimport type { Accessor } from 'solid-js'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\n\n/** https://wagmi.sh/solid/api/primitives/useSwitchConnection */\nexport function useSwitchConnection<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: useSwitchConnection.Parameters<config, context> = () => ({}),\n): useSwitchConnection.ReturnType<config, context> {\n  const config = useConfig<config>(parameters)\n  const mutation = useMutation(() =>\n    switchConnectionMutationOptions(config(), parameters()),\n  )\n  return mutation as useSwitchConnection.ReturnType<config, context>\n}\n\nexport namespace useSwitchConnection {\n  export type Parameters<\n    config extends Config = Config,\n    context = unknown,\n  > = Accessor<SolidParameters<config, context>>\n\n  export type ReturnType<\n    config extends Config = Config,\n    context = unknown,\n  > = Compute<\n    UseMutationReturnType<\n      SwitchConnectionData<config>,\n      SwitchConnectionErrorType,\n      SwitchConnectionVariables,\n      context,\n      SwitchConnectionMutate<config, context>,\n      SwitchConnectionMutateAsync<config, context>\n    >\n  >\n\n  export type SolidParameters<\n    config extends Config = Config,\n    context = unknown,\n  > = Compute<\n    ConfigParameter<config> & SwitchConnectionOptions<config, context>\n  >\n}\n"
  },
  {
    "path": "packages/solid/src/primitives/useWatchBlockNumber.test-d.ts",
    "content": "import { createConfig } from '@wagmi/core'\nimport { http, webSocket } from 'viem'\nimport { mainnet, optimism } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useWatchBlockNumber } from './useWatchBlockNumber.js'\n\ntest('default', () => {\n  useWatchBlockNumber(() => ({\n    poll: false,\n    onBlockNumber() {},\n  }))\n})\n\ntest('differing transports', () => {\n  const config = createConfig({\n    chains: [mainnet, optimism],\n    transports: {\n      [mainnet.id]: http(),\n      [optimism.id]: webSocket(),\n    },\n  })\n\n  type Result = useWatchBlockNumber.SolidParameters<\n    typeof config,\n    typeof mainnet.id | typeof optimism.id\n  >\n  expectTypeOf<Result['poll']>().toEqualTypeOf<boolean | undefined>()\n  useWatchBlockNumber(() => ({\n    config,\n    poll: false,\n    onBlockNumber() {},\n  }))\n\n  type Result2 = useWatchBlockNumber.SolidParameters<\n    typeof config,\n    typeof mainnet.id\n  >\n  expectTypeOf<Result2['poll']>().toEqualTypeOf<true | undefined>()\n  useWatchBlockNumber(() => ({\n    config,\n    chainId: mainnet.id,\n    poll: true,\n    onBlockNumber() {},\n  }))\n  // @ts-expect-error\n  useWatchBlockNumber(() => ({\n    config,\n    chainId: mainnet.id,\n    poll: false,\n    onBlockNumber() {},\n  }))\n\n  type Result3 = useWatchBlockNumber.SolidParameters<\n    typeof config,\n    typeof optimism.id\n  >\n  expectTypeOf<Result3['poll']>().toEqualTypeOf<boolean | undefined>()\n  useWatchBlockNumber(() => ({\n    config,\n    chainId: optimism.id,\n    poll: true,\n    onBlockNumber() {},\n  }))\n  useWatchBlockNumber(() => ({\n    config,\n    chainId: optimism.id,\n    poll: false,\n    onBlockNumber() {},\n  }))\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useWatchBlockNumber.test.ts",
    "content": "import { config, testClient, wait } from '@wagmi/test'\nimport { renderPrimitive } from '@wagmi/test/solid'\nimport { expect, test, vi } from 'vitest'\n\nimport { useWatchBlockNumber } from './useWatchBlockNumber.js'\n\ntest('default', async () => {\n  await testClient.mainnet.restart()\n\n  const blockNumbers: bigint[] = []\n  renderPrimitive(() =>\n    useWatchBlockNumber(() => ({\n      onBlockNumber(blockNumber) {\n        blockNumbers.push(blockNumber)\n      },\n    })),\n  )\n\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(100)\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(100)\n  await testClient.mainnet.mine({ blocks: 1 })\n\n  await vi.waitUntil(() => blockNumbers.length === 3, { timeout: 10_000 })\n  expect(blockNumbers.length).toBe(3)\n})\n\ntest('parameters: config', async () => {\n  const blockNumbers: bigint[] = []\n  renderPrimitive(() =>\n    useWatchBlockNumber(() => ({\n      config,\n      onBlockNumber(blockNumber) {\n        blockNumbers.push(blockNumber)\n      },\n    })),\n  )\n\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(100)\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(100)\n  await testClient.mainnet.mine({ blocks: 1 })\n\n  await vi.waitUntil(() => blockNumbers.length === 3, { timeout: 10_000 })\n  expect(blockNumbers.length).toBe(3)\n})\n\ntest('parameters: enabled', async () => {\n  const onBlockNumber = vi.fn()\n  renderPrimitive(() =>\n    useWatchBlockNumber(() => ({\n      enabled: false,\n      onBlockNumber,\n      emitOnBegin: true,\n    })),\n  )\n\n  await wait(200)\n\n  expect(onBlockNumber).not.toHaveBeenCalled()\n})\n"
  },
  {
    "path": "packages/solid/src/primitives/useWatchBlockNumber.ts",
    "content": "import {\n  type Config,\n  type ResolvedRegister,\n  type WatchBlockNumberParameters,\n  watchBlockNumber,\n} from '@wagmi/core'\nimport type {\n  ConfigParameter,\n  EnabledParameter,\n  UnionCompute,\n  UnionExactPartial,\n} from '@wagmi/core/internal'\nimport { type Accessor, createEffect, onCleanup } from 'solid-js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\n/** https://wagmi.sh/solid/api/hooks/useWatchBlockNumber */\nexport function useWatchBlockNumber<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n>(\n  parameters: useWatchBlockNumber.Parameters<config, chainId> = () =>\n    ({}) as any,\n): useWatchBlockNumber.ReturnType {\n  const config = useConfig(parameters)\n  const configChainId = useChainId(() => ({ config: config() }))\n  createEffect(() => {\n    const {\n      config: _,\n      chainId = configChainId(),\n      enabled = true,\n      onBlockNumber,\n      ...rest\n    } = parameters()\n    if (!enabled) return\n    if (!onBlockNumber) return\n    const unwatch = watchBlockNumber(config(), {\n      ...(rest as any),\n      chainId,\n      onBlockNumber,\n    })\n    onCleanup(() => unwatch())\n  })\n}\n\nexport namespace useWatchBlockNumber {\n  export type Parameters<\n    config extends Config = Config,\n    chainId extends\n      config['chains'][number]['id'] = config['chains'][number]['id'],\n  > = Accessor<SolidParameters<config, chainId>>\n\n  export type ReturnType = void\n\n  export type SolidParameters<\n    config extends Config = Config,\n    chainId extends\n      config['chains'][number]['id'] = config['chains'][number]['id'],\n  > = UnionCompute<\n    UnionExactPartial<WatchBlockNumberParameters<config, chainId>> &\n      ConfigParameter<config> &\n      EnabledParameter\n  >\n}\n"
  },
  {
    "path": "packages/solid/src/utils/getVersion.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport { getVersion } from './getVersion.js'\n\ntest('default', () => {\n  expect(getVersion()).toMatchInlineSnapshot(`\"@wagmi/solid@x.y.z\"`)\n})\n"
  },
  {
    "path": "packages/solid/src/utils/getVersion.ts",
    "content": "import { version } from '../version.js'\n\nexport const getVersion = () => `@wagmi/solid@${version}`\n"
  },
  {
    "path": "packages/solid/src/utils/query.ts",
    "content": "import {\n  type DefaultError,\n  type MutateFunction,\n  type QueryKey,\n  type SolidInfiniteQueryOptions,\n  type SolidMutationOptions,\n  type SolidQueryOptions,\n  // TODO: import use___ once solid-query version is updated\n  createInfiniteQuery as tanstack_useInfiniteQuery,\n  createQuery as tanstack_useQuery,\n  type CreateInfiniteQueryResult as UseInfiniteQueryResult,\n  type CreateMutationResult as UseMutationResult,\n  type CreateQueryResult as UseQueryResult,\n  createMutation as useMutation,\n} from '@tanstack/solid-query'\nimport type {\n  Compute,\n  ExactPartial,\n  Omit,\n  UnionStrictOmit,\n} from '@wagmi/core/internal'\nimport { hashFn } from '@wagmi/core/query'\nimport { type Accessor, mergeProps } from 'solid-js'\n\nexport type SolidMutationParameters<\n  data = unknown,\n  error = Error,\n  variables = void,\n  context = unknown,\n> = Compute<\n  Omit<\n    SolidMutationOptions<data, error, Compute<variables>, context>,\n    'mutationFn' | 'mutationKey' | 'throwOnError'\n  >\n>\n\nexport type UseMutationReturnType<\n  data = unknown,\n  error = Error,\n  variables = void,\n  context = unknown,\n  mutate = MutateFunction,\n  mutateAsync = MutateFunction,\n> = Compute<\n  UnionStrictOmit<\n    UseMutationResult<data, error, variables, context>,\n    'mutate' | 'mutateAsync'\n  > & {\n    mutate: mutate\n    mutateAsync: mutateAsync\n  }\n>\n\nexport { useMutation }\n\n////////////////////////////////////////////////////////////////////////////////\n\nexport type SolidQueryParameters<\n  queryFnData = unknown,\n  error = DefaultError,\n  data = queryFnData,\n  queryKey extends QueryKey = QueryKey,\n> = Compute<\n  ExactPartial<\n    Omit<SolidQueryOptions<queryFnData, error, data, queryKey>, 'initialData'>\n  > & {\n    // Fix `initialData` type\n    initialData?:\n      | SolidQueryOptions<queryFnData, error, data, queryKey>['initialData']\n      | undefined\n  }\n>\n\nexport type UseQueryReturnType<data = unknown, error = DefaultError> = Compute<\n  UseQueryResult<data, error> & {\n    queryKey: QueryKey\n  }\n>\n\n// Adding some basic customization.\n// Ideally we don't have this function, but `import('@tanstack/react-query').useQuery` currently has some quirks where it is super hard to\n// pass down the inferred `initialData` type because of it's discriminated overload in the on `useQuery`.\nexport function useQuery<queryFnData, error, data, queryKey extends QueryKey>(\n  parameters: Accessor<\n    SolidQueryParameters<queryFnData, error, data, queryKey> & {\n      queryKey: QueryKey\n    }\n  >,\n): UseQueryReturnType<data, error> {\n  const result = tanstack_useQuery(() => ({\n    ...(parameters() as any),\n    queryKeyHashFn: hashFn, // for bigint support\n  }))\n  return mergeProps(result, {\n    get queryKey() {\n      return parameters().queryKey\n    },\n  }) as UseQueryReturnType<data, error>\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nexport type SolidInfiniteQueryParameters<\n  queryFnData = unknown,\n  error = DefaultError,\n  data = queryFnData,\n  queryData = queryFnData,\n  queryKey extends QueryKey = QueryKey,\n  pageParam = unknown,\n> = Compute<\n  Omit<\n    SolidInfiniteQueryOptions<\n      queryFnData,\n      error,\n      data,\n      queryData,\n      queryKey,\n      pageParam\n    >,\n    'initialData'\n  > & {\n    // Fix `initialData` type\n    initialData?:\n      | SolidInfiniteQueryOptions<\n          queryFnData,\n          error,\n          data,\n          queryKey\n        >['initialData']\n      | undefined\n  }\n>\n\nexport type UseInfiniteQueryReturnType<\n  data = unknown,\n  error = DefaultError,\n> = UseInfiniteQueryResult<data, error> & {\n  queryKey: QueryKey\n}\n\n// Adding some basic customization.\nexport function useInfiniteQuery<\n  queryFnData,\n  error,\n  data,\n  queryData,\n  queryKey extends QueryKey,\n  pageParam = unknown,\n>(\n  parameters: Accessor<\n    SolidInfiniteQueryParameters<\n      queryFnData,\n      error,\n      data,\n      queryData,\n      queryKey,\n      pageParam\n    > & {\n      queryKey: QueryKey\n    }\n  >,\n): UseInfiniteQueryReturnType<data, error> {\n  const result = tanstack_useInfiniteQuery(() => ({\n    ...(parameters() as any),\n    queryKeyHashFn: hashFn, // for bigint support\n  }))\n  return mergeProps(\n    result,\n    parameters().queryKey,\n  ) as unknown as UseInfiniteQueryReturnType<data, error>\n}\n"
  },
  {
    "path": "packages/solid/src/version.ts",
    "content": "export const version = '0.0.4'\n"
  },
  {
    "path": "packages/solid/test/setup.ts",
    "content": "import { vi } from 'vitest'\n\n// Make dates stable across runs\nDate.now = vi.fn(() => new Date(Date.UTC(2023, 1, 1)).valueOf())\n\nvi.mock('../src/version.ts', () => {\n  return { version: 'x.y.z' }\n})\n"
  },
  {
    "path": "packages/solid/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"include\": [\"src/**/*.ts\"],\n  \"exclude\": [\"src/**/*.test.ts\", \"src/**/*.test-d.ts\"],\n  \"compilerOptions\": {\n    \"sourceMap\": true\n  }\n}\n"
  },
  {
    "path": "packages/solid/tsconfig.json",
    "content": "{\n  \"extends\": \"./tsconfig.build.json\",\n  \"compilerOptions\": {\n    \"jsx\": \"preserve\"\n  },\n  \"include\": [\"src/**/*.ts\", \"src/**/*.tsx\", \"test/**/*.ts\", \"test/**/*.tsx\"],\n  \"exclude\": []\n}\n"
  },
  {
    "path": "packages/test/package.json",
    "content": "{\n  \"name\": \"@wagmi/test\",\n  \"private\": true,\n  \"scripts\": {\n    \"check:types\": \"tsc --noEmit\",\n    \"clean\": \"rm -rf dist tsconfig.tsbuildinfo\"\n  },\n  \"files\": [\n    \"dist/**\",\n    \"!dist/**/*.tsbuildinfo\",\n    \"src/**/*.ts\",\n    \"!src/**/*.test.ts\",\n    \"!src/**/*.test-d.ts\",\n    \"react/**\",\n    \"solid/**\",\n    \"vue/**\",\n    \"tempo/**\"\n  ],\n  \"sideEffects\": false,\n  \"type\": \"module\",\n  \"main\": \"./dist/esm/exports/index.js\",\n  \"types\": \"./dist/types/exports/index.d.ts\",\n  \"typings\": \"./dist/types/exports/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/types/exports/index.d.ts\",\n      \"default\": \"./dist/esm/exports/index.js\"\n    },\n    \"./react\": {\n      \"types\": \"./dist/types/exports/react.d.ts\",\n      \"default\": \"./dist/esm/exports/react.js\"\n    },\n    \"./solid\": {\n      \"types\": \"./dist/types/exports/solid.d.ts\",\n      \"default\": \"./dist/esm/exports/solid.js\"\n    },\n    \"./tempo\": {\n      \"types\": \"./dist/types/exports/tempo.d.ts\",\n      \"default\": \"./dist/esm/exports/tempo.js\"\n    },\n    \"./vue\": {\n      \"types\": \"./dist/types/exports/vue.d.ts\",\n      \"default\": \"./dist/esm/exports/vue.js\"\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"typesVersions\": {\n    \"*\": {\n      \"react\": [\n        \"./dist/types/exports/react.d.ts\"\n      ],\n      \"solid\": [\n        \"./dist/types/exports/solid.d.ts\"\n      ],\n      \"tempo\": [\n        \"./dist/types/exports/tempo.d.ts\"\n      ],\n      \"vue\": [\n        \"./dist/types/exports/vue.d.ts\"\n      ]\n    }\n  },\n  \"peerDependencies\": {\n    \"@tanstack/react-query\": \">=5.0.0\",\n    \"@tanstack/solid-query\": \">=5.0.0\",\n    \"@tanstack/vue-query\": \">=5.0.0\",\n    \"@types/react\": \">=18\",\n    \"@types/react-dom\": \">=18\",\n    \"@wagmi/core\": \"workspace:*\",\n    \"@wagmi/solid\": \"workspace:*\",\n    \"@wagmi/vue\": \"workspace:*\",\n    \"ox\": \"catalog:\",\n    \"prool\": \"^0.0.24\",\n    \"react\": \">=18\",\n    \"react-dom\": \">=18\",\n    \"solid-js\": \"1.x\",\n    \"typescript\": \">=5.7.3\",\n    \"viem\": \"2.x\",\n    \"vue\": \">=3\",\n    \"wagmi\": \"workspace:*\"\n  },\n  \"peerDependenciesMeta\": {\n    \"@tanstack/react-query\": {\n      \"optional\": true\n    },\n    \"@tanstack/solid-query\": {\n      \"optional\": true\n    },\n    \"@tanstack/vue-query\": {\n      \"optional\": true\n    },\n    \"@types/react\": {\n      \"optional\": true\n    },\n    \"@types/react-dom\": {\n      \"optional\": true\n    },\n    \"@wagmi/vue\": {\n      \"optional\": true\n    },\n    \"react\": {\n      \"optional\": true\n    },\n    \"react-dom\": {\n      \"optional\": true\n    },\n    \"solid-js\": {\n      \"optional\": true\n    },\n    \"typescript\": {\n      \"optional\": true\n    },\n    \"vue\": {\n      \"optional\": true\n    },\n    \"wagmi\": {\n      \"optional\": true\n    }\n  },\n  \"devDependencies\": {\n    \"@solidjs/testing-library\": \"^0.8.10\",\n    \"@tanstack/react-query\": \"catalog:\",\n    \"@tanstack/solid-query\": \"catalog:\",\n    \"@tanstack/vue-query\": \"catalog:\",\n    \"@types/react\": \"catalog:\",\n    \"@types/react-dom\": \"catalog:\",\n    \"@wagmi/core\": \"workspace:*\",\n    \"@wagmi/solid\": \"workspace:*\",\n    \"@wagmi/vue\": \"workspace:*\",\n    \"ox\": \"catalog:\",\n    \"react\": \"catalog:\",\n    \"react-dom\": \"catalog:\",\n    \"solid-js\": \"catalog:\",\n    \"vue\": \"catalog:\",\n    \"wagmi\": \"workspace:*\"\n  },\n  \"contributors\": [\n    \"awkweb.eth <t@wevm.dev>\",\n    \"jxom.eth <j@wevm.dev>\"\n  ],\n  \"funding\": \"https://github.com/sponsors/wevm\",\n  \"keywords\": [\n    \"eth\",\n    \"ethereum\",\n    \"dapps\",\n    \"wallet\",\n    \"web3\"\n  ]\n}\n"
  },
  {
    "path": "packages/test/src/chains.ts",
    "content": "/// <reference types=\"./vite-env.d.ts\" />\nimport type { Compute } from '@wagmi/core/internal'\nimport * as chains from 'viem/chains'\nimport { getRpcUrls } from './utils.js'\n\nexport type Chain = Compute<\n  chains.Chain & {\n    fork: { blockNumber: bigint; url: string }\n    port: number\n  }\n>\n\nconst mainnetFork = {\n  blockNumber: 23_535_880n,\n  url: unwrapEnv('VITE_MAINNET_FORK_URL', 'https://eth.merkle.io'),\n} as const satisfies Chain['fork']\n\nexport const mainnet = {\n  ...chains.mainnet,\n  ...getRpcUrls({ port: 8545 }),\n  fork: mainnetFork,\n} as const satisfies Chain\n\nexport const mainnet2 = {\n  ...chains.mainnet,\n  ...getRpcUrls({ port: 8546 }),\n  id: 456,\n  nativeCurrency: { decimals: 18, name: 'wagmi', symbol: 'WAG' },\n  fork: mainnetFork,\n} as const satisfies Chain\n\nexport const optimism = {\n  ...chains.optimism,\n  ...getRpcUrls({ port: 8547 }),\n  fork: {\n    blockNumber: 107_317_577n,\n    url: unwrapEnv('VITE_OPTIMISM_FORK_URL', 'https://mainnet.optimism.io'),\n  },\n} as const satisfies Chain\n\nexport const chain = {\n  mainnet,\n  mainnet2,\n  optimism,\n}\n\nfunction unwrapEnv<\n  name extends keyof ImportMetaEnv,\n  defaultValue extends NonNullable<ImportMetaEnv[name]> & {},\n>(name: name, defaultValue?: defaultValue) {\n  const value = (() => {\n    // biome-ignore lint/complexity/useOptionalChain: stable\n    if (typeof process !== 'undefined' && process.env[name])\n      return process.env[name]\n    if (typeof import.meta !== 'undefined' && import.meta.env[name])\n      return import.meta.env[name]\n    return defaultValue\n  })()\n  if (!value) throw new Error(`missing env var for \"${name}\"`)\n  return value\n}\n"
  },
  {
    "path": "packages/test/src/clients.ts",
    "content": "import {\n  type Account,\n  type Client,\n  createTestClient,\n  http,\n  type TestActions,\n  type TestRpcSchema,\n  type Transport,\n} from 'viem'\n\nimport { type Chain, mainnet, mainnet2, optimism } from './chains.js'\n\nexport const mainnetTestClient = createTestClient({\n  mode: 'anvil',\n  cacheTime: 0,\n  chain: mainnet,\n  transport: http(),\n}).extend(wagmiTestMethods)\n\nexport const mainnet2TestClient = createTestClient({\n  mode: 'anvil',\n  cacheTime: 0,\n  chain: mainnet2,\n  transport: http(),\n}).extend(wagmiTestMethods)\n\nexport const optimismTestClient = createTestClient({\n  mode: 'anvil',\n  cacheTime: 0,\n  chain: optimism,\n  transport: http(),\n}).extend(wagmiTestMethods)\n\nexport const testClient = {\n  mainnet: mainnetTestClient,\n  mainnet2: mainnet2TestClient,\n  optimism: optimismTestClient,\n}\n\nfunction wagmiTestMethods(\n  client: Client<\n    Transport,\n    Chain,\n    Account | undefined,\n    TestRpcSchema<'anvil'>,\n    TestActions\n  >,\n) {\n  return {\n    /** Resets instance attached to chain. */\n    async restart() {\n      return await fetch(`${client.chain.rpcUrls.default.http[0]}/restart`)\n    },\n    /** Resets fork attached to chain at starting block number. */\n    resetFork() {\n      return client.reset({\n        jsonRpcUrl: client.chain.fork.url,\n        blockNumber: client.chain.fork.blockNumber,\n      })\n    },\n  }\n}\n"
  },
  {
    "path": "packages/test/src/config.ts",
    "content": "import { createConfig, mock } from '@wagmi/core'\nimport { http } from 'viem'\n\nimport { mainnet, mainnet2, optimism } from './chains.js'\nimport { accounts } from './constants.js'\n\nexport const config = createConfig({\n  chains: [mainnet, mainnet2, optimism],\n  connectors: [mock({ accounts }), mock({ accounts: reverse(accounts) })],\n  pollingInterval: 100,\n  storage: null,\n  transports: {\n    [mainnet.id]: http(),\n    [mainnet2.id]: http(),\n    [optimism.id]: http(),\n  },\n})\n\ntype Reverse<\n  list extends readonly unknown[],\n  ///\n  result extends readonly unknown[] = [],\n> = list extends readonly [infer head, ...infer tail]\n  ? Reverse<tail, [head, ...result]>\n  : result\n\nfunction reverse<list extends readonly unknown[]>(list: list): Reverse<list> {\n  return [...list].reverse() as Reverse<list>\n}\n"
  },
  {
    "path": "packages/test/src/constants.ts",
    "content": "/// <reference types=\"./vite-env.d.ts\" />\n\nimport type { FixedArray } from '@wagmi/core/internal'\nimport { type Address, parseAbi } from 'viem'\nimport { mnemonicToAccount } from 'viem/accounts'\nimport type { chain } from './chains.js'\n\n// Test accounts\nexport const accounts = new Array(10).fill(0).map(\n  (_, addressIndex) =>\n    mnemonicToAccount(\n      'gesture car maximum regret pudding merry fatal electric sea grab crack social',\n      {\n        addressIndex,\n      },\n    ).address,\n) as unknown as FixedArray<Address, 10>\n\n// for `'0x95132632579b073D12a6673e18Ab05777a6B86f8'`\nexport const privateKey =\n  '0x2300b80db97008804dc601f4b2ac9ed24311f79ccb506d0907ee6839314a78d4'\n\nexport let walletConnectProjectId: string\n// biome-ignore lint/complexity/useOptionalChain: _\nif (typeof process !== 'undefined' && process.env.VITE_WC_PROJECT_ID)\n  walletConnectProjectId = process.env.VITE_WC_PROJECT_ID\nif (typeof import.meta !== 'undefined' && import.meta.env.VITE_WC_PROJECT_ID)\n  walletConnectProjectId = import.meta.env.VITE_WC_PROJECT_ID\nelse walletConnectProjectId = 'foobarbaz'\n\nexport const typedData = {\n  basic: {\n    domain: {\n      name: 'Ether Mail',\n      version: '1',\n      chainId: 1,\n      verifyingContract: '0x0000000000000000000000000000000000000000',\n    },\n    types: {\n      Person: [\n        { name: 'name', type: 'string' },\n        { name: 'wallet', type: 'address' },\n      ],\n      Mail: [\n        { name: 'from', type: 'Person' },\n        { name: 'to', type: 'Person' },\n        { name: 'contents', type: 'string' },\n      ],\n    },\n    message: {\n      from: {\n        name: 'Cow',\n        wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n      },\n      to: {\n        name: 'Bob',\n        wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n      },\n      contents: 'Hello, Bob!',\n    },\n  },\n  complex: {\n    domain: {\n      name: 'Ether Mail 🥵',\n      version: '1.1.1',\n      chainId: 1,\n      verifyingContract: '0x0000000000000000000000000000000000000000',\n    },\n    types: {\n      Name: [\n        { name: 'first', type: 'string' },\n        { name: 'last', type: 'string' },\n      ],\n      Person: [\n        { name: 'name', type: 'Name' },\n        { name: 'wallet', type: 'address' },\n        { name: 'favoriteColors', type: 'string[3]' },\n        { name: 'foo', type: 'uint256' },\n        { name: 'age', type: 'uint8' },\n        { name: 'isCool', type: 'bool' },\n      ],\n      Mail: [\n        { name: 'timestamp', type: 'uint256' },\n        { name: 'from', type: 'Person' },\n        { name: 'to', type: 'Person' },\n        { name: 'contents', type: 'string' },\n        { name: 'hash', type: 'bytes' },\n      ],\n    },\n    message: {\n      timestamp: 1234567890n,\n      contents: 'Hello, Bob! 🖤',\n      hash: '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',\n      from: {\n        name: {\n          first: 'Cow',\n          last: 'Burns',\n        },\n        wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n        age: 69,\n        foo: 123123123123123123n,\n        favoriteColors: ['red', 'green', 'blue'],\n        isCool: false,\n      },\n      to: {\n        name: { first: 'Bob', last: 'Builder' },\n        wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n        age: 70,\n        foo: 123123123123123123n,\n        favoriteColors: ['orange', 'yellow', 'green'],\n        isCool: true,\n      },\n    },\n  },\n} as const\n\nexport const abi = {\n  erc20: parseAbi([\n    'event Approval(address indexed owner, address indexed spender, uint256 value)',\n    'event Transfer(address indexed from, address indexed to, uint256 value)',\n    'function allowance(address owner, address spender) view returns (uint256)',\n    'function approve(address spender, uint256 amount) returns (bool)',\n    'function balanceOf(address account) view returns (uint256)',\n    'function decimals() view returns (uint8)',\n    'function name() view returns (string)',\n    'function symbol() view returns (string)',\n    'function totalSupply() view returns (uint256)',\n    'function transfer(address recipient, uint256 amount) returns (bool)',\n    'function transferFrom(address sender, address recipient, uint256 amount) returns (bool)',\n  ]),\n  mloot: parseAbi([\n    'constructor()',\n    'event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)',\n    'event ApprovalForAll(address indexed owner, address indexed operator, bool approved)',\n    'event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)',\n    'event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)',\n    'function approve(address to, uint256 tokenId)',\n    'function balanceOf(address owner) view returns (uint256)',\n    'function claim(uint256 tokenId)',\n    'function getApproved(uint256 tokenId) view returns (address)',\n    'function getChest(uint256 tokenId) view returns (string)',\n    'function getFoot(uint256 tokenId) view returns (string)',\n    'function getHand(uint256 tokenId) view returns (string)',\n    'function getHead(uint256 tokenId) view returns (string)',\n    'function getNeck(uint256 tokenId) view returns (string)',\n    'function getRing(uint256 tokenId) view returns (string)',\n    'function getWaist(uint256 tokenId) view returns (string)',\n    'function getWeapon(uint256 tokenId) view returns (string)',\n    'function isApprovedForAll(address owner, address operator) view returns (bool)',\n    'function name() view returns (string)',\n    'function owner() view returns (address)',\n    'function ownerOf(uint256 tokenId) view returns (address)',\n    'function renounceOwnership()',\n    'function safeTransferFrom(address from, address to, uint256 tokenId)',\n    'function safeTransferFrom(address from, address to, uint256 tokenId, bytes _data)',\n    'function setApprovalForAll(address operator, bool approved)',\n    'function supportsInterface(bytes4 interfaceId) view returns (bool)',\n    'function symbol() view returns (string)',\n    'function tokenByIndex(uint256 index) view returns (uint256)',\n    'function tokenOfOwnerByIndex(address owner, uint256 index) view returns (uint256)',\n    'function tokenURI(uint256 tokenId) view returns (string)',\n    'function totalSupply() view returns (uint256)',\n    'function transferFrom(address from, address to, uint256 tokenId)',\n    'function transferOwnership(address newOwner)',\n  ]),\n  shields: parseAbi([\n    'constructor(string name_, string symbol_, address _emblemWeaver, address makerBadgeRecipient, address granteeBadgeRecipient)',\n    'event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)',\n    'event ApprovalForAll(address indexed owner, address indexed operator, bool approved)',\n    'event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)',\n    'event ShieldBuilt(uint256 tokenId, uint16 field, uint16 hardware, uint16 frame, uint24[4] colors, uint8 shieldBadge)',\n    'event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)',\n    'function approve(address to, uint256 tokenId)',\n    'function balanceOf(address owner) view returns (uint256)',\n    'function build(uint16 field, uint16 hardware, uint16 frame, uint24[4] colors, uint256 tokenId) payable',\n    'function collectFees()',\n    'function emblemWeaver() view returns (address)',\n    'function getApproved(uint256 tokenId) view returns (address)',\n    'function isApprovedForAll(address owner, address operator) view returns (bool)',\n    'function mint(address to, uint8 count) payable',\n    'function mythicFee() view returns (uint256)',\n    'function name() view returns (string)',\n    'function owner() view returns (address)',\n    'function ownerOf(uint256 tokenId) view returns (address)',\n    'function publicMintActive() view returns (bool)',\n    'function publicMintPrice() view returns (uint256)',\n    'function renounceOwnership()',\n    'function safeTransferFrom(address from, address to, uint256 tokenId)',\n    'function safeTransferFrom(address from, address to, uint256 tokenId, bytes _data)',\n    'function setApprovalForAll(address operator, bool approved)',\n    'function setPublicMintActive()',\n    'function setPublicMintPrice(uint256 _publicMintPrice)',\n    'function shieldHashes(bytes32) view returns (bool)',\n    'function shields(uint256 tokenId) view returns (uint16 field, uint16 hardware, uint16 frame, uint24 color1, uint24 color2, uint24 color3, uint24 color4, uint8 shieldBadge)',\n    'function specialFee() view returns (uint256)',\n    'function supportsInterface(bytes4 interfaceId) view returns (bool)',\n    'function symbol() view returns (string)',\n    'function tokenURI(uint256 tokenId) view returns (string)',\n    'function totalSupply() view returns (uint256)',\n    'function transferFrom(address from, address to, uint256 tokenId)',\n    'function transferOwnership(address newOwner)',\n  ]),\n  wagmigotchi: parseAbi([\n    'constructor()',\n    'event CaretakerLoved(address indexed caretaker, uint256 indexed amount)',\n    'function clean()',\n    'function feed()',\n    'function getAlive() view returns (bool)',\n    'function getBoredom() view returns (uint256)',\n    'function getHunger() view returns (uint256)',\n    'function getSleepiness() view returns (uint256)',\n    'function getStatus() view returns (string)',\n    'function getUncleanliness() view returns (uint256)',\n    'function love(address) view returns (uint256)',\n    'function play()',\n    'function sleep()',\n  ]),\n  wagmiMintExample: parseAbi([\n    'constructor()',\n    'event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)',\n    'event ApprovalForAll(address indexed owner, address indexed operator, bool approved)',\n    'event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)',\n    'function approve(address to, uint256 tokenId)',\n    'function balanceOf(address owner) view returns (uint256)',\n    'function getApproved(uint256 tokenId) view returns (address)',\n    'function isApprovedForAll(address owner, address operator) view returns (bool)',\n    'function mint()',\n    'function name() view returns (string)',\n    'function ownerOf(uint256 tokenId) view returns (address)',\n    'function safeTransferFrom(address from, address to, uint256 tokenId)',\n    'function safeTransferFrom(address from, address to, uint256 tokenId, bytes _data)',\n    'function setApprovalForAll(address operator, bool approved)',\n    'function supportsInterface(bytes4 interfaceId) view returns (bool)',\n    'function symbol() view returns (string)',\n    'function tokenURI(uint256 tokenId) pure returns (string)',\n    'function totalSupply() view returns (uint256)',\n    'function transferFrom(address from, address to, uint256 tokenId)',\n  ]),\n  viewOverloads: parseAbi([\n    'function foo() view returns (int8)',\n    'function foo(address account) view returns (string)',\n    'function foo(address a, address b) view returns ((address foo, address bar))',\n    'function bar() view returns (int8)',\n  ]),\n  writeOverloads: parseAbi([\n    'function foo() payable returns (int8)',\n    'function foo(address) returns (string)',\n    'function foo(address, address) returns ((address foo, address bar))',\n    'function bar() payable returns (int8)',\n  ]),\n  bayc: parseAbi([\n    'constructor(string name, string symbol, uint256 maxNftSupply, uint256 saleStart)',\n    'function mintApe(uint256 numberOfTokens) payable',\n    'function reserveApes()',\n    'function flipSaleState()',\n    'function emergencySetStartingIndexBlock()',\n    'function setStartingIndex()',\n    'function setRevealTimestamp(uint256 revealTimeStamp)',\n    'function setProvenanceHash(string provenanceHash)',\n    'function setBaseURI(string baseURI)',\n    'function startingIndex() view returns (uint256)',\n    'function startingIndexBlock() view returns (uint256)',\n    'function saleIsActive() view returns (bool)',\n    'function maxApePurchase() view returns (uint256)',\n    'function apePrice() view returns (uint256)',\n    'function REVEAL_TIMESTAMP() view returns (uint256)',\n    'function MAX_APES() view returns (uint256)',\n    'function BAYC_PROVENANCE() view returns (string)',\n    'function name() view returns (string)',\n    'function symbol() view returns (string)',\n    'function totalSupply() view returns (uint256)',\n    'function balanceOf(address owner) view returns (uint256)',\n    'function ownerOf(uint256 tokenId) view returns (address)',\n    'function getApproved(uint256 tokenId) view returns (address)',\n    'function isApprovedForAll(address owner, address operator) view returns (bool)',\n    'function approve(address to, uint256 tokenId)',\n    'function setApprovalForAll(address operator, bool approved)',\n    'function safeTransferFrom(address from, address to, uint256 tokenId)',\n    'function safeTransferFrom(address from, address to, uint256 tokenId, bytes _data)',\n    'function tokenOfOwnerByIndex(address owner, uint256 index) view returns (uint256)',\n    'function tokenByIndex(uint256 index) view returns (uint256)',\n    'function tokenURI(uint256 tokenId) view returns (string)',\n    'function supportsInterface(bytes4 interfaceId) view returns (bool)',\n    'function transferFrom(address from, address to, uint256 tokenId)',\n    'function renounceOwnership()',\n    'function transferOwnership(address newOwner)',\n    'function withdraw()',\n  ]),\n} as const\n\nconst mainnetAddress = {\n  mloot: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n  shields: '0x0747118c9f44c7a23365b2476dcd05e03114c747',\n  usdc: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n  usdcHolder: '0x5414d89a8bf7e99d732bc52f3e6a3ef461c0c078',\n  wagmigotchi: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',\n  wagmiMintExample: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n} as const\n\nexport const address = {\n  ...mainnetAddress,\n  mainnet: mainnetAddress,\n  mainnet2: mainnetAddress,\n  optimism: {\n    usdc: '0x7f5c764cbc14f9669b88837ca1490cca17c31607',\n  },\n} as const satisfies Record<keyof typeof mainnetAddress, Address> &\n  Record<keyof typeof chain, Record<string, Address>>\n\nexport const bytecode = {\n  bayc: '0x608060405260405180602001604052806000815250600b90805190602001906200002b92919062000484565b506000600f60006101000a81548160ff0219169083151502179055503480156200005457600080fd5b50604051620046d0380380620046d0833981810160405260808110156200007a57600080fd5b81019080805160405193929190846401000000008211156200009b57600080fd5b83820191506020820185811115620000b257600080fd5b8251866001820283011164010000000082111715620000d057600080fd5b8083526020830192505050908051906020019080838360005b8381101562000106578082015181840152602081019050620000e9565b50505050905090810190601f168015620001345780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200015857600080fd5b838201915060208201858111156200016f57600080fd5b82518660018202830111640100000000821117156200018d57600080fd5b8083526020830192505050908051906020019080838360005b83811015620001c3578082015181840152602081019050620001a6565b50505050905090810190601f168015620001f15780820380516001836020036101000a031916815260200191505b5060405260200180519060200190929190805190602001909291905050508383620002296301ffc9a760e01b6200037360201b60201c565b81600690805190602001906200024192919062000484565b5080600790805190602001906200025a92919062000484565b50620002736380ac58cd60e01b6200037360201b60201c565b6200028b635b5e139f60e01b6200037360201b60201c565b620002a363780e9d6360e01b6200037360201b60201c565b50506000620002b76200047c60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35081600e81905550620bdd808101601081905550505050506200052a565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433136353a20696e76616c696420696e746572666163652069640000000081525060200191505060405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620004c757805160ff1916838001178555620004f8565b82800160010185558215620004f8579182015b82811115620004f7578251825591602001919060010190620004da565b5b5090506200050791906200050b565b5090565b5b80821115620005265760008160009055506001016200050c565b5090565b614196806200053a6000396000f3fe60806040526004361061021a5760003560e01c80636c0360eb11610123578063b0f67427116100ab578063e36d64981161006f578063e36d649814610ddf578063e985e9c514610e0a578063e986655014610e91578063eb8d244414610ea8578063f2fde38b14610ed55761021a565b8063b0f6742714610bac578063b88d4fde14610bc3578063bb8a16bd14610cd5578063c87b56dd14610d00578063cb774d4714610db45761021a565b80637d17fcbe116100f25780637d17fcbe14610a395780638da5cb5b14610a5057806395d89b4114610a91578063a22cb46514610b21578063a723533e14610b7e5761021a565b80636c0360eb1461090257806370a0823114610992578063715018a6146109f75780637a3f451e14610a0e5761021a565b80632f745c59116101a65780634f6ccce7116101755780634f6ccce7146106cb57806355f804b31461071a578063571dff3b146107e2578063607e20e31461080d5780636352211e1461089d5761021a565b80632f745c59146105b357806334918dfd146106225780633ccfd60b1461063957806342842e0e146106505761021a565b8063095ea7b3116101ed578063095ea7b3146103bf578063109695231461041a57806318160ddd146104e257806318e20a381461050d57806323b872dd146105385761021a565b8063018a2c371461021f57806301ffc9a71461025a57806306fdde03146102ca578063081812fc1461035a575b600080fd5b34801561022b57600080fd5b506102586004803603602081101561024257600080fd5b8101908080359060200190929190505050610f26565b005b34801561026657600080fd5b506102b26004803603602081101561027d57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610fdf565b60405180821515815260200191505060405180910390f35b3480156102d657600080fd5b506102df611046565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561031f578082015181840152602081019050610304565b50505050905090810190601f16801561034c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561036657600080fd5b506103936004803603602081101561037d57600080fd5b81019080803590602001909291905050506110e8565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103cb57600080fd5b50610418600480360360408110156103e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611183565b005b34801561042657600080fd5b506104e06004803603602081101561043d57600080fd5b810190808035906020019064010000000081111561045a57600080fd5b82018360208201111561046c57600080fd5b8035906020019184600183028401116401000000008311171561048e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506112c7565b005b3480156104ee57600080fd5b506104f7611390565b6040518082815260200191505060405180910390f35b34801561051957600080fd5b506105226113a1565b6040518082815260200191505060405180910390f35b34801561054457600080fd5b506105b16004803603606081101561055b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113a7565b005b3480156105bf57600080fd5b5061060c600480360360408110156105d657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061141d565b6040518082815260200191505060405180910390f35b34801561062e57600080fd5b50610637611478565b005b34801561064557600080fd5b5061064e611553565b005b34801561065c57600080fd5b506106c96004803603606081101561067357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611651565b005b3480156106d757600080fd5b50610704600480360360208110156106ee57600080fd5b8101908080359060200190929190505050611671565b6040518082815260200191505060405180910390f35b34801561072657600080fd5b506107e06004803603602081101561073d57600080fd5b810190808035906020019064010000000081111561075a57600080fd5b82018360208201111561076c57600080fd5b8035906020019184600183028401116401000000008311171561078e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611694565b005b3480156107ee57600080fd5b506107f761174f565b6040518082815260200191505060405180910390f35b34801561081957600080fd5b50610822611754565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610862578082015181840152602081019050610847565b50505050905090810190601f16801561088f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108a957600080fd5b506108d6600480360360208110156108c057600080fd5b81019080803590602001909291905050506117f2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561090e57600080fd5b50610917611829565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561095757808201518184015260208101905061093c565b50505050905090810190601f1680156109845780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561099e57600080fd5b506109e1600480360360208110156109b557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118cb565b6040518082815260200191505060405180910390f35b348015610a0357600080fd5b50610a0c6119a0565b005b348015610a1a57600080fd5b50610a23611b10565b6040518082815260200191505060405180910390f35b348015610a4557600080fd5b50610a4e611b1c565b005b348015610a5c57600080fd5b50610a65611c4c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a9d57600080fd5b50610aa6611c76565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610ae6578082015181840152602081019050610acb565b50505050905090810190601f168015610b135780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610b2d57600080fd5b50610b7c60048036036040811015610b4457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611d18565b005b610baa60048036036020811015610b9457600080fd5b8101908080359060200190929190505050611ece565b005b348015610bb857600080fd5b50610bc1612127565b005b348015610bcf57600080fd5b50610cd360048036036080811015610be657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610c4d57600080fd5b820183602082011115610c5f57600080fd5b80359060200191846001830284011164010000000083111715610c8157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061220b565b005b348015610ce157600080fd5b50610cea612283565b6040518082815260200191505060405180910390f35b348015610d0c57600080fd5b50610d3960048036036020811015610d2357600080fd5b8101908080359060200190929190505050612289565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d79578082015181840152602081019050610d5e565b50505050905090810190601f168015610da65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610dc057600080fd5b50610dc961255a565b6040518082815260200191505060405180910390f35b348015610deb57600080fd5b50610df4612560565b6040518082815260200191505060405180910390f35b348015610e1657600080fd5b50610e7960048036036040811015610e2d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612566565b60405180821515815260200191505060405180910390f35b348015610e9d57600080fd5b50610ea66125fa565b005b348015610eb457600080fd5b50610ebd612764565b60405180821515815260200191505060405180910390f35b348015610ee157600080fd5b50610f2460048036036020811015610ef857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612777565b005b610f2e61296c565b73ffffffffffffffffffffffffffffffffffffffff16610f4c611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614610fd5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8060108190555050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110de5780601f106110b3576101008083540402835291602001916110de565b820191906000526020600020905b8154815290600101906020018083116110c157829003601f168201915b5050505050905090565b60006110f382612974565b611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061408b602c913960400191505060405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061118e826117f2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061410f6021913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661123461296c565b73ffffffffffffffffffffffffffffffffffffffff16148061126357506112628161125d61296c565b612566565b5b6112b8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180613f956038913960400191505060405180910390fd5b6112c28383612991565b505050565b6112cf61296c565b73ffffffffffffffffffffffffffffffffffffffff166112ed611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611376576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b908051906020019061138c929190613de6565b5050565b600061139c6002612a4a565b905090565b60105481565b6113b86113b261296c565b82612a5f565b61140d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806141306031913960400191505060405180910390fd5b611418838383612b53565b505050565b600061147082600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612d9690919063ffffffff16565b905092915050565b61148061296c565b73ffffffffffffffffffffffffffffffffffffffff1661149e611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611527576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b61155b61296c565b73ffffffffffffffffffffffffffffffffffffffff16611579611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561164d573d6000803e3d6000fd5b5050565b61166c8383836040518060200160405280600081525061220b565b505050565b600080611688836002612db090919063ffffffff16565b50905080915050919050565b61169c61296c565b73ffffffffffffffffffffffffffffffffffffffff166116ba611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611743576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61174c81612ddc565b50565b601481565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117ea5780601f106117bf576101008083540402835291602001916117ea565b820191906000526020600020905b8154815290600101906020018083116117cd57829003601f168201915b505050505081565b600061182282604051806060016040528060298152602001613ff7602991396002612df69092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118c15780601f10611896576101008083540402835291602001916118c1565b820191906000526020600020905b8154815290600101906020018083116118a457829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613fcd602a913960400191505060405180910390fd5b611999600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e15565b9050919050565b6119a861296c565b73ffffffffffffffffffffffffffffffffffffffff166119c6611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611a4f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b67011c37937e08000081565b611b2461296c565b73ffffffffffffffffffffffffffffffffffffffff16611b42611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611bcb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600d5414611c43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5374617274696e6720696e64657820697320616c72656164792073657400000081525060200191505060405180910390fd5b43600c81905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d0e5780601f10611ce357610100808354040283529160200191611d0e565b820191906000526020600020905b815481529060010190602001808311611cf157829003601f168201915b5050505050905090565b611d2061296c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611dc1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4552433732313a20617070726f766520746f2063616c6c65720000000000000081525060200191505060405180910390fd5b8060056000611dce61296c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e7b61296c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b600f60009054906101000a900460ff16611f50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f53616c65206d7573742062652061637469766520746f206d696e74204170650081525060200191505060405180910390fd5b6014811115611faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613f746021913960400191505060405180910390fd5b600e54611fc782611fb9611390565b612e2a90919063ffffffff16565b111561201e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806140426028913960400191505060405180910390fd5b3461203a8267011c37937e080000612eb290919063ffffffff16565b11156120ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45746865722076616c75652073656e74206973206e6f7420636f72726563740081525060200191505060405180910390fd5b60005b818110156120ef5760006120c3611390565b9050600e546120d0611390565b10156120e1576120e03382612f38565b5b5080806001019150506120b1565b506000600c541480156121175750600e54612108611390565b148061211657506010544210155b5b156121245743600c819055505b50565b61212f61296c565b73ffffffffffffffffffffffffffffffffffffffff1661214d611c4c565b73ffffffffffffffffffffffffffffffffffffffff16146121d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60006121e0611390565b905060005b601e811015612207576121fa33828401612f38565b80806001019150506121e5565b5050565b61221c61221661296c565b83612a5f565b612271576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806141306031913960400191505060405180910390fd5b61227d84848484612f56565b50505050565b600e5481565b606061229482612974565b6122e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806140e0602f913960400191505060405180910390fd5b6060600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123925780601f1061236757610100808354040283529160200191612392565b820191906000526020600020905b81548152906001019060200180831161237557829003601f168201915b5050505050905060606123a3611829565b90506000815114156123b9578192505050612555565b60008251111561248a5780826040516020018083805190602001908083835b602083106123fb57805182526020820191506020810190506020830392506123d8565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b6020831061244c5780518252602082019150602081019050602083039250612429565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050612555565b8061249485612fc8565b6040516020018083805190602001908083835b602083106124ca57805182526020820191506020810190506020830392506124a7565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b6020831061251b57805182526020820191506020810190506020830392506124f8565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052925050505b919050565b600d5481565b600c5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600d5414612672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5374617274696e6720696e64657820697320616c72656164792073657400000081525060200191505060405180910390fd5b6000600c5414156126eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5374617274696e6720696e64657820626c6f636b206d7573742062652073657481525060200191505060405180910390fd5b600e54600c544060001c816126fc57fe5b06600d8190555060ff61271a600c544361310f90919063ffffffff16565b111561273a57600e54600143034060001c8161273257fe5b06600d819055505b6000600d5414156127625761275b6001600d54612e2a90919063ffffffff16565b600d819055505b565b600f60009054906101000a900460ff1681565b61277f61296c565b73ffffffffffffffffffffffffffffffffffffffff1661279d611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614612826576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128ac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613ed86026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600061298a82600261319290919063ffffffff16565b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a04836117f2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612a58826000016131ac565b9050919050565b6000612a6a82612974565b612abf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613f48602c913960400191505060405180910390fd5b6000612aca836117f2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b3957508373ffffffffffffffffffffffffffffffffffffffff16612b21846110e8565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b4a5750612b498185612566565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612b73826117f2565b73ffffffffffffffffffffffffffffffffffffffff1614612bdf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806140b76029913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613efe6024913960400191505060405180910390fd5b612c708383836131bd565b612c7b600082612991565b612ccc81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206131c290919063ffffffff16565b50612d1e81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206131dc90919063ffffffff16565b50612d35818360026131f69092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612da5836000018361322b565b60001c905092915050565b600080600080612dc386600001866132ae565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190612df2929190613de6565b5050565b6000612e09846000018460001b84613347565b60001c90509392505050565b6000612e238260000161343d565b9050919050565b600080828401905083811015612ea8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080831415612ec55760009050612f32565b6000828402905082848281612ed657fe5b0414612f2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061406a6021913960400191505060405180910390fd5b809150505b92915050565b612f5282826040518060200160405280600081525061344e565b5050565b612f61848484612b53565b612f6d848484846134bf565b612fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180613ea66032913960400191505060405180910390fd5b50505050565b60606000821415613010576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061310a565b600082905060005b6000821461303a578080600101915050600a828161303257fe5b049150613018565b60608167ffffffffffffffff8111801561305357600080fd5b506040519080825280601f01601f1916602001820160405280156130865781602001600182028036833780820191505090505b50905060006001830390508593505b6000841461310257600a84816130a757fe5b0660300160f81b828280600190039350815181106130c157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84816130fa57fe5b049350613095565b819450505050505b919050565b600082821115613187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b60006131a4836000018360001b6136d8565b905092915050565b600081600001805490509050919050565b505050565b60006131d4836000018360001b6136fb565b905092915050565b60006131ee836000018360001b6137e3565b905092915050565b6000613222846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613853565b90509392505050565b60008183600001805490501161328c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613e846022913960400191505060405180910390fd5b82600001828154811061329b57fe5b9060005260206000200154905092915050565b60008082846000018054905011613310576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140206022913960400191505060405180910390fd5b600084600001848154811061332157fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000808460010160008581526020019081526020016000205490506000811415839061340e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156133d35780820151818401526020810190506133b8565b50505050905090810190601f1680156134005780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5084600001600182038154811061342157fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b613458838361392f565b61346560008484846134bf565b6134ba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180613ea66032913960400191505060405180910390fd5b505050565b60006134e08473ffffffffffffffffffffffffffffffffffffffff16613b23565b6134ed57600190506136d0565b606061365763150b7a0260e01b61350261296c565b888787604051602401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561358657808201518184015260208101905061356b565b50505050905090810190601f1680156135b35780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001613ea6603291398773ffffffffffffffffffffffffffffffffffffffff16613b369092919063ffffffff16565b9050600081806020019051602081101561367057600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146137d7576000600182039050600060018660000180549050039050600086600001828154811061374657fe5b906000526020600020015490508087600001848154811061376357fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061379b57fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506137dd565b60009150505b92915050565b60006137ef8383613b4e565b61384857826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061384d565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156138fa57846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613928565b8285600001600183038154811061390d57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552433732313a206d696e7420746f20746865207a65726f206164647265737381525060200191505060405180910390fd5b6139db81612974565b15613a4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000081525060200191505060405180910390fd5b613a5a600083836131bd565b613aab81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206131dc90919063ffffffff16565b50613ac2818360026131f69092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6060613b458484600085613b71565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b606082471015613bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613f226026913960400191505060405180910390fd5b613bd585613b23565b613c47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310613c975780518252602082019150602081019050602083039250613c74565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613cf9576040519150601f19603f3d011682016040523d82523d6000602084013e613cfe565b606091505b5091509150613d0e828286613d1a565b92505050949350505050565b60608315613d2a57829050613ddf565b600083511115613d3d5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613da4578082015181840152602081019050613d89565b50505050905090810190601f168015613dd15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613e2757805160ff1916838001178555613e55565b82800160010185558215613e55579182015b82811115613e54578251825591602001919060010190613e39565b5b509050613e629190613e66565b5090565b5b80821115613e7f576000816000905550600101613e67565b509056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433732313a207472616e7366657220746f20746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d654552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e6473507572636861736520776f756c6420657863656564206d617820737570706c79206f662041706573536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564a2646970667358221220b0e64d1fa6c4dbeb9c6f54607d7e1996943fe27624a80652f57b53fda084621b64736f6c63430007000033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000006080e6d70000000000000000000000000000000000000000000000000000000000000011426f7265644170655961636874436c756200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044241594300000000000000000000000000000000000000000000000000000000',\n  wagmiMintExample:\n    '0x608060405260006007553480156200001657600080fd5b50604051806040016040528060058152602001647761676d6960d81b815250604051806040016040528060058152602001645741474d4960d81b81525081600090805190602001906200006b9291906200008a565b508051620000819060019060208401906200008a565b5050506200016c565b828054620000989062000130565b90600052602060002090601f016020900481019282620000bc576000855562000107565b82601f10620000d757805160ff191683800117855562000107565b8280016001018555821562000107579182015b8281111562000107578251825591602001919060010190620000ea565b506200011592915062000119565b5090565b5b808211156200011557600081556001016200011a565b600181811c908216806200014557607f821691505b6020821081036200016657634e487b7160e01b600052602260045260246000fd5b50919050565b6128c2806200017c6000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80636352211e11610097578063a22cb46511610066578063a22cb46514610215578063b88d4fde14610228578063c87b56dd1461023b578063e985e9c51461024e57600080fd5b80636352211e146101d457806370a08231146101e757806395d89b41146101fa578063a0712d681461020257600080fd5b80631249c58b116100d35780631249c58b1461018f57806318160ddd1461019757806323b872dd146101ae57806342842e0e146101c157600080fd5b806301ffc9a71461010557806306fdde031461012d578063081812fc14610142578063095ea7b31461017a575b600080fd5b61011861011336600461178f565b610297565b60405190151581526020015b60405180910390f35b61013561037c565b6040516101249190611829565b61015561015036600461183c565b61040e565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b61018d61018836600461187e565b6104d3565b005b61018d61062b565b6101a060065481565b604051908152602001610124565b61018d6101bc3660046118a8565b61067d565b61018d6101cf3660046118a8565b610704565b6101556101e236600461183c565b61071f565b6101a06101f53660046118e4565b6107b7565b61013561086b565b61018d61021036600461183c565b61087a565b61018d6102233660046118ff565b610902565b61018d61023636600461196a565b610911565b61013561024936600461183c565b61099f565b61011861025c366004611a64565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061032a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061037657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60606000805461038b90611a97565b80601f01602080910402602001604051908101604052809291908181526020018280546103b790611a97565b80156104045780601f106103d957610100808354040283529160200191610404565b820191906000526020600020905b8154815290600101906020018083116103e757829003601f168201915b5050505050905090565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff166104aa5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60006104de8261071f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036105815760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016104a1565b3373ffffffffffffffffffffffffffffffffffffffff821614806105aa57506105aa813361025c565b61061c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016104a1565b6106268383610b07565b505050565b6007545b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16156106615760010161062f565b61066b3382610ba7565b60068054600190810190915501600755565b6106873382610bc1565b6106f95760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016104a1565b610626838383610d17565b61062683838360405180602001604052806000815250610911565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16806103765760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016104a1565b600073ffffffffffffffffffffffffffffffffffffffff82166108425760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016104a1565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b60606001805461038b90611a97565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16156108ec5760405162461bcd60e51b815260206004820152601160248201527f546f6b656e2049442069732074616b656e00000000000000000000000000000060448201526064016104a1565b6108f63382610ba7565b50600680546001019055565b61090d338383610f4a565b5050565b61091b3383610bc1565b61098d5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016104a1565b6109998484848461105d565b50505050565b6040517f666f726567726f756e64000000000000000000000000000000000000000000006020820152602a810182905260609060009061016890604a016040516020818303038152906040528051906020012060001c6109ff9190611b19565b6040517f6261636b67726f756e64000000000000000000000000000000000000000000006020820152602a810185905290915060009061016890604a016040516020818303038152906040528051906020012060001c610a5f9190611b19565b90506000610aba610a6f866110e6565b610aa9610a7b866110e6565b610a84866110e6565b604051602001610a95929190611b2d565b60405160208183030381529060405261121b565b604051602001610a959291906125ba565b9050600081604051602001610acf919061268b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529695505050505050565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190610b618261071f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61090d82826040518060200160405280600081525061136e565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16610c585760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016104a1565b6000610c638361071f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610cd1575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b80610d0f57508373ffffffffffffffffffffffffffffffffffffffff16610cf78461040e565b73ffffffffffffffffffffffffffffffffffffffff16145b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff16610d378261071f565b73ffffffffffffffffffffffffffffffffffffffff1614610dc05760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e657200000000000000000000000000000000000000000000000000000060648201526084016104a1565b73ffffffffffffffffffffffffffffffffffffffff8216610e485760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016104a1565b610e53600082610b07565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120805460019290610e899084906126ff565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805460019290610ec4908490612716565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fc55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016104a1565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611068848484610d17565b611074848484846113f7565b6109995760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016104a1565b60608160000361112957505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611153578061113d8161272e565b915061114c9050600a83612766565b915061112d565b60008167ffffffffffffffff81111561116e5761116e61193b565b6040519080825280601f01601f191660200182016040528015611198576020820181803683370190505b5090505b8415610d0f576111ad6001836126ff565b91506111ba600a86611b19565b6111c5906030612716565b60f81b8183815181106111da576111da61277a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611214600a86612766565b945061119c565b6060815160000361123a57505060408051602081019091526000815290565b600060405180606001604052806040815260200161284d60409139905060006003845160026112699190612716565b6112739190612766565b61127e9060046127a9565b67ffffffffffffffff8111156112965761129661193b565b6040519080825280601f01601f1916602001820160405280156112c0576020820181803683370190505b509050600182016020820185865187015b8082101561132c576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506112d1565b5050600386510660018114611348576002811461135b57611363565b603d6001830353603d6002830353611363565b603d60018303535b509195945050505050565b61137883836115d0565b61138560008484846113f7565b6106265760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016104a1565b600073ffffffffffffffffffffffffffffffffffffffff84163b156115c5576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061146e9033908990889088906004016127e6565b6020604051808303816000875af19250505080156114c7575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526114c49181019061282f565b60015b61157a573d8080156114f5576040519150601f19603f3d011682016040523d82523d6000602084013e6114fa565b606091505b5080516000036115725760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016104a1565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050610d0f565b506001949350505050565b73ffffffffffffffffffffffffffffffffffffffff82166116335760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104a1565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16156116a55760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016104a1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054600192906116db908490612716565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461178c57600080fd5b50565b6000602082840312156117a157600080fd5b81356117ac8161175e565b9392505050565b60005b838110156117ce5781810151838201526020016117b6565b838111156109995750506000910152565b600081518084526117f78160208601602086016117b3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006117ac60208301846117df565b60006020828403121561184e57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461187957600080fd5b919050565b6000806040838503121561189157600080fd5b61189a83611855565b946020939093013593505050565b6000806000606084860312156118bd57600080fd5b6118c684611855565b92506118d460208501611855565b9150604084013590509250925092565b6000602082840312156118f657600080fd5b6117ac82611855565b6000806040838503121561191257600080fd5b61191b83611855565b91506020830135801515811461193057600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000806080858703121561198057600080fd5b61198985611855565b935061199760208601611855565b925060408501359150606085013567ffffffffffffffff808211156119bb57600080fd5b818701915087601f8301126119cf57600080fd5b8135818111156119e1576119e161193b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611a2757611a2761193b565b816040528281528a6020848701011115611a4057600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611a7757600080fd5b611a8083611855565b9150611a8e60208401611855565b90509250929050565b600181811c90821680611aab57607f821691505b602082108103611ae4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611b2857611b28611aea565b500690565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f737667222077696474683d223130323422206865696768743d2231303260208201527f34222066696c6c3d226e6f6e65223e3c706174682066696c6c3d2268736c2800604082015260008351611bb181605f8501602088016117b3565b7f2c20313030252c20313025292220643d224d3020306831303234763130323448605f918401918201527f307a22202f3e3c672066696c6c3d2268736c2800000000000000000000000000607f8201528351611c148160928401602088016117b3565b7f2c20313030252c2039302529223e3c7061746820643d224d393033203433372e609292909101918201527f35633020392e3131332d372e3338382031362e352d31362e352031362e35732d60b28201527f31362e352d372e3338372d31362e352d31362e3520372e3338382d31362e352060d28201527f31362e352d31362e352031362e3520372e3338372031362e352031362e357a4d60f28201527f3639382e3532392035363663362e39323120302031322e35332d352e353936206101128201527f31322e35332d31322e35762d353063302d362e39303420352e3630392d31322e6101328201527f352031322e3532392d31322e356832352e30353963362e393220302031322e356101528201527f323920352e3539362031322e3532392031322e35763530633020362e393034206101728201527f352e3630392031322e352031322e35332031322e357331322e3532392d352e356101928201527f39362031322e3532392d31322e35762d353063302d362e39303420352e3630396101b28201527f2d31322e352031322e35332d31322e356832352e30353963362e3932203020316101d28201527f322e35323920352e3539362031322e3532392031322e35763530633020362e396101f28201527f303420352e3630392031322e352031322e3532392031322e356833372e3538396102128201527f63362e393220302031322e3532392d352e3539362031322e3532392d31322e356102328201527f762d373563302d362e3930342d352e3630392d31322e352d31322e3532392d316102528201527f322e35732d31322e353320352e3539362d31322e35332031322e357635362e326102728201527f3561362e32363420362e3236342030203120312d31322e3532392030563437386102928201527f2e3563302d362e3930342d352e3630392d31322e352d31322e35332d31322e356102b28201527f483639382e353239632d362e393220302d31322e35323920352e3539362d31326102d28201527f2e3532392031322e35763735633020362e39303420352e3630392031322e35206102f28201527f31322e3532392031322e357a22202f3e3c7061746820643d224d3135372e36356103128201527f3520353431632d362e39333220302d31322e3535322d352e3539362d31322e356103328201527f35322d31322e35762d353063302d362e3930342d352e3631392d31322e352d316103528201527f322e3535312d31322e3553313230203437312e35393620313230203437382e356103728201527f763735633020362e39303420352e36322031322e352031322e3535322031322e6103928201527f35683135302e363263362e39333320302031322e3535322d352e3539362031326103b28201527f2e3535322d31322e35762d353063302d362e39303420352e3631392d31322e356103d28201527f2031322e3535322d31322e35683134342e33343563332e343635203020362e326103f28201527f373620322e37393820362e32373620362e3235732d322e38313120362e32352d6104128201527f362e32373620362e3235483332302e383238632d362e39333320302d31322e356104328201527f353220352e3539362d31322e3535322031322e357633372e35633020362e39306104528201527f3420352e3631392031322e352031322e3535322031322e35683135302e3632636104728201527f362e39333320302031322e3535322d352e3539362031322e3535322d31322e356104928201527f762d373563302d362e3930342d352e3631392d31322e352d31322e3535322d316104b28201527f322e35483238332e313732632d362e39333220302d31322e35353120352e35396104d28201527f362d31322e3535312031322e35763530633020362e3930342d352e36313920316104f28201527f322e352d31322e3535322031322e35682d32352e313033632d362e39333320306105128201527f2d31322e3535322d352e3539362d31322e3535322d31322e35762d353063302d6105328201527f362e3930342d352e36322d31322e352d31322e3535322d31322e35732d31322e6105528201527f35353220352e3539362d31322e3535322031322e35763530633020362e3930346105728201527f2d352e3631392031322e352d31322e3535312031322e35682d32352e3130347a6105928201527f6d3330312e3234322d362e3235633020332e3435322d322e38313120362e32356105b28201527f2d362e32373620362e3235483333392e363535632d332e34363520302d362e326105d28201527f37362d322e3739382d362e3237362d362e323573322e3831312d362e323520366105f28201527f2e3237362d362e3235683131322e39363663332e343635203020362e323736206106128201527f322e37393820362e32373620362e32357a4d343937203535332e3831386330206106328201527f362e39323920352e3632382031322e3534362031322e3537312031322e3534366106528201527f6831333261362e323820362e323820302030203120362e32383620362e3237326106728201527f20362e323820362e32382030203020312d362e32383620362e323733682d31336106928201527f32632d362e39343320302d31322e35373120352e3631362d31322e35373120316106b28201527f322e3534364131322e35362031322e3536203020302030203530392e353731206106d28201527f363034683135302e38353863362e39343320302031322e3537312d352e3631366106f28201527f2031322e3537312d31322e353435762d3131322e393163302d362e3932382d356107128201527f2e3632382d31322e3534352d31322e3537312d31322e353435483530392e35376107328201527f31632d362e39343320302d31322e35373120352e3631372d31322e35373120316107528201527f322e3534357637352e3237337a6d33372e3731342d36322e373237632d362e396107728201527f343320302d31322e35373120352e3631372d31322e3537312031322e353435766107928201527f32352e303931633020362e39323920352e3632382031322e3534362031322e356107b28201527f37312031322e353436683130302e35373263362e39343320302031322e3537316107d28201527f2d352e3631372031322e3537312d31322e353436762d32352e30393163302d366107f28201527f2e3932382d352e3632382d31322e3534352d31322e3537312d31322e353435486108128201527f3533342e3731347a222066696c6c2d72756c653d226576656e6f646422202f3e6108328201527f3c2f673e3c2f7376673e0000000000000000000000000000000000000000000061085282015261085c01949350505050565b7f7b226e616d65223a20227761676d6920230000000000000000000000000000008152600083516125f28160118501602088016117b3565b7f222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b6011918401918201527f6261736536342c00000000000000000000000000000000000000000000000000603182015283516126558160388401602088016117b3565b7f227d00000000000000000000000000000000000000000000000000000000000060389290910191820152603a01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516126c381601d8501602087016117b3565b91909101601d0192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612711576127116126d0565b500390565b60008219821115612729576127296126d0565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361275f5761275f6126d0565b5060010190565b60008261277557612775611aea565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156127e1576127e16126d0565b500290565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261282560808301846117df565b9695505050505050565b60006020828403121561284157600080fd5b81516117ac8161175e56fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212201665a4f9111990d7529375848d3fd02c0121091a940da59e763eba826e7b077064736f6c634300080d0033',\n} as const\n"
  },
  {
    "path": "packages/test/src/exports/index.test-d.ts",
    "content": "import { expectTypeOf } from 'vitest'\n\n// noop test because vitest typecheck fails unless each workspace project has type test\nexpectTypeOf(1).toEqualTypeOf<number>()\n"
  },
  {
    "path": "packages/test/src/exports/index.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport * as react from './index.js'\n\ntest('exports', () => {\n  expect(Object.keys(react)).toMatchInlineSnapshot(`\n    [\n      \"chain\",\n      \"mainnet\",\n      \"mainnet2\",\n      \"optimism\",\n      \"mainnet2TestClient\",\n      \"mainnetTestClient\",\n      \"optimismTestClient\",\n      \"testClient\",\n      \"config\",\n      \"abi\",\n      \"accounts\",\n      \"address\",\n      \"bytecode\",\n      \"privateKey\",\n      \"typedData\",\n      \"walletConnectProjectId\",\n      \"addressRegex\",\n      \"signedTransactionRegex\",\n      \"transactionHashRegex\",\n      \"wait\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/test/src/exports/index.ts",
    "content": "// biome-ignore lint/performance/noBarrelFile: entrypoint module\nexport { chain, mainnet, mainnet2, optimism } from '../chains.js'\nexport {\n  mainnet2TestClient,\n  mainnetTestClient,\n  optimismTestClient,\n  testClient,\n} from '../clients.js'\nexport { config } from '../config.js'\nexport {\n  abi,\n  accounts,\n  address,\n  bytecode,\n  privateKey,\n  typedData,\n  walletConnectProjectId,\n} from '../constants.js'\n\nexport {\n  addressRegex,\n  signedTransactionRegex,\n  transactionHashRegex,\n} from '../regex.js'\n\nexport { wait } from '../utils.js'\n"
  },
  {
    "path": "packages/test/src/exports/react.ts",
    "content": "import { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport * as React from 'react'\nimport {\n  type RenderHookOptions,\n  type RenderHookResult,\n  type RenderResult,\n  render as vbr_render,\n  renderHook as vbr_renderHook,\n} from 'vitest-browser-react'\nimport { WagmiProvider } from 'wagmi'\n\nimport { config } from '../config.js'\n\nexport const queryClient = new QueryClient()\n\nexport function createWrapper<component extends React.FunctionComponent<any>>(\n  Wrapper: component,\n  props: Parameters<component>[0],\n) {\n  type Props = { children?: React.ReactNode | undefined }\n  return function CreatedWrapper({ children }: Props) {\n    return React.createElement(\n      Wrapper,\n      props,\n      React.createElement(\n        QueryClientProvider,\n        { client: queryClient },\n        children,\n      ),\n    )\n  }\n}\n\nexport function renderHook<result, props>(\n  renderCallback: (initialProps?: props) => result,\n  options?: RenderHookOptions<props>,\n): Promise<RenderHookResult<result, props>> {\n  queryClient.clear()\n  return vbr_renderHook(renderCallback, {\n    wrapper: createWrapper(WagmiProvider, { config, reconnectOnMount: false }),\n    ...options,\n  })\n}\n\nexport function render(\n  ...args: Parameters<typeof vbr_render>\n): Promise<RenderResult> {\n  queryClient.clear()\n  return vbr_render(args[0], {\n    ...args[1],\n    wrapper: createWrapper(WagmiProvider, { config, reconnectOnMount: false }),\n  })\n}\n"
  },
  {
    "path": "packages/test/src/exports/solid.ts",
    "content": "import { renderHook } from '@solidjs/testing-library'\nimport { QueryClient, QueryClientProvider } from '@tanstack/solid-query'\nimport { WagmiProvider } from '@wagmi/solid'\nimport { type Component, createComponent, type ParentProps } from 'solid-js'\n\nimport { config } from '../config.js'\n\nexport const queryClient = new QueryClient()\n\nexport function createWrapper<component extends Component<any>>(\n  Wrapper: component,\n  props: Parameters<component>[0],\n) {\n  return function CreatedWrapper(wrapperProps: ParentProps) {\n    return createComponent(Wrapper, {\n      ...props,\n      get children() {\n        return createComponent(QueryClientProvider, {\n          client: queryClient,\n          get children() {\n            return wrapperProps.children\n          },\n        })\n      },\n    })\n  }\n}\n\nexport type RenderPrimitiveReturnType<primitive extends () => unknown> = {\n  result: ReturnType<primitive>\n  cleanup: () => void\n}\n\nexport function renderPrimitive<primitive extends () => unknown>(\n  primitive: primitive,\n  options?: {\n    wrapper?: Component<ParentProps>\n  },\n): RenderPrimitiveReturnType<primitive> {\n  queryClient.clear()\n\n  const wrapper =\n    options?.wrapper ??\n    createWrapper(WagmiProvider, {\n      config,\n      reconnectOnMount: false,\n    })\n\n  const { result, cleanup } = renderHook(primitive, { wrapper })\n\n  return {\n    result: result as ReturnType<primitive>,\n    cleanup,\n  }\n}\n"
  },
  {
    "path": "packages/test/src/exports/tempo.ts",
    "content": "////////////////////////////////////////////////////////////////////////////////\n// Tempo Test Utilities\n////////////////////////////////////////////////////////////////////////////////\n\n// biome-ignore lint/performance/noBarrelFile: entrypoint module\nexport {\n  accounts,\n  addresses,\n  config,\n  createWrapper,\n  queryClient,\n  renderHook,\n  restart,\n  rpcUrl,\n  setupOrders,\n  setupPoolWithLiquidity,\n  setupToken,\n  setupTokenPair,\n  tempoLocal,\n  viem_setupOrders,\n  viem_setupPoolWithLiquidity,\n  viem_setupToken,\n  viem_setupTokenPair,\n} from '../tempo/config.js'\n"
  },
  {
    "path": "packages/test/src/exports/vue.ts",
    "content": "import { VueQueryPlugin } from '@tanstack/vue-query'\nimport { WagmiPlugin } from '@wagmi/vue'\nimport { type App, createApp, type Ref, watch } from 'vue'\n\nimport { config } from '../config.js'\n\nexport type RenderComposableReturnType<composable extends () => unknown> = [\n  ReturnType<composable>,\n  App,\n]\n\nexport function renderComposable<composable extends () => unknown>(\n  composable: composable,\n  options: { attach?: (app: App) => void } | undefined = {\n    attach(app) {\n      app\n        .use(WagmiPlugin, {\n          config,\n          reconnectOnMount: false,\n        })\n        .use(VueQueryPlugin, {})\n    },\n  },\n): RenderComposableReturnType<composable> {\n  let result: unknown\n  const app = createApp({\n    setup() {\n      result = composable()\n      return () => {}\n    },\n  })\n\n  options.attach?.(app)\n  app.mount(document.createElement('div'))\n\n  return [result, app] as unknown as RenderComposableReturnType<composable>\n}\n\nexport type WaitForOptions = {\n  timeout?: number\n}\n\nexport function waitFor<ref extends Ref>(\n  ref: ref,\n  predicate: (value: ref['value']) => boolean = (value) => value,\n  options: WaitForOptions = {},\n) {\n  const { timeout = 10_000 } = options\n  return new Promise<void>((resolve, reject) => {\n    const timer = timeout\n      ? setTimeout(() => {\n          _unwatch()\n          if (predicate(ref.value)) resolve()\n          else reject(new Error(`\\`waitFor\\` timed out in ${timeout}ms.`))\n        }, timeout)\n      : undefined\n\n    const _unwatch = watch(ref, (value) => {\n      if (predicate(value)) {\n        if (timer) clearTimeout(timer)\n        _unwatch()\n        resolve()\n      }\n    })\n  })\n}\n"
  },
  {
    "path": "packages/test/src/regex.ts",
    "content": "export const addressRegex = /^0x([A-Fa-f0-9]{40})$/\n\nexport const transactionHashRegex = /^0x([A-Fa-f0-9]{64})$/\n\nexport const signedTransactionRegex = /^0x([A-Fa-f0-9]+)$/\n"
  },
  {
    "path": "packages/test/src/setup.global.ts",
    "content": "import { Instance, Server } from 'prool'\nimport { chain as chainLookup } from './chains.js'\n\nexport default async function () {\n  const promises = []\n  for (const chain of Object.values(chainLookup)) {\n    const instance = Instance.anvil({\n      chainId: chain.id,\n      forkBlockNumber: chain.fork.blockNumber,\n      forkUrl: chain.fork.url,\n      noMining: true,\n      // @ts-expect-error\n      mnemonicSeedUnsafe: 1,\n    })\n    promises.push(Server.create({ instance, port: chain.port }).start())\n  }\n\n  const results = await Promise.all(promises)\n\n  return async () => {\n    await Promise.all(results.map((stop) => stop()))\n  }\n}\n"
  },
  {
    "path": "packages/test/src/setup.global.types.ts",
    "content": "import { dirname, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport * as attest from '@ark/attest'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = dirname(__filename)\n\nexport default function () {\n  return attest.setup({\n    benchErrorOnThresholdExceeded: true,\n    formatCmd: 'pnpm check',\n    tsconfig: resolve(__dirname, '../../core/tsconfig.json'),\n  })\n}\n"
  },
  {
    "path": "packages/test/src/setup.ts",
    "content": "import { disconnect } from '@wagmi/core'\nimport { afterAll, beforeEach } from 'vitest'\nimport { testClient } from './clients.js'\nimport { config } from './config.js'\n\nbeforeEach(async () => {\n  await disconnect(config).catch(() => {})\n})\n\nafterAll(async () => {\n  // If you are using a fork, you can reset your anvil instance to the initial fork block.\n  await Promise.all(Object.values(testClient).map((client) => client.restart()))\n})\n"
  },
  {
    "path": "packages/test/src/tempo/config.ts",
    "content": "import { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { connect, getConnection, getConnectorClient } from '@wagmi/core'\nimport * as chains from '@wagmi/core/chains'\nimport type { FixedArray } from '@wagmi/core/internal'\nimport { dangerous_secp256k1 } from '@wagmi/core/tempo'\nimport { Mnemonic } from 'ox'\nimport * as React from 'react'\nimport {\n  type Account,\n  type Chain,\n  type Client,\n  defineChain,\n  http,\n  parseUnits,\n  type Transport,\n} from 'viem'\nimport { sendTransactionSync } from 'viem/actions'\nimport { Actions, Addresses, Tick, Account as tempo_Account } from 'viem/tempo'\nimport { vi } from 'vitest'\nimport {\n  type RenderHookOptions,\n  type RenderHookResult,\n  renderHook as vbr_renderHook,\n} from 'vitest-browser-react'\nimport { createConfig, WagmiProvider } from 'wagmi'\n\nexport const port = Number(import.meta.env.RPC_PORT ?? 4000)\n\nexport const rpcUrl = (() => {\n  const id =\n    (typeof process !== 'undefined' &&\n      Number(process.env.VITEST_POOL_ID ?? 1) +\n        Math.floor(Math.random() * 10_000)) ||\n    1 + Math.floor(Math.random() * 10_000)\n  return `http://localhost:${port}/${id}`\n})()\n\nexport const addresses = {\n  alphaUsd: '0x20c0000000000000000000000000000000000001',\n} as const\n\nexport const accounts = Array.from({ length: 20 }, (_, i) => {\n  const privateKey = Mnemonic.toPrivateKey(\n    'test test test test test test test test test test test junk',\n    { as: 'Hex', path: Mnemonic.path({ account: i }) },\n  )\n  return tempo_Account.fromSecp256k1(privateKey)\n}) as unknown as FixedArray<tempo_Account.RootAccount, 20>\n\nexport const tempoLocal = defineChain({\n  ...chains.tempoLocalnet,\n  rpcUrls: { default: { http: [rpcUrl] } },\n}).extend({ feeToken: 1n })\n\nexport const config = createConfig({\n  chains: [tempoLocal],\n  connectors: [\n    dangerous_secp256k1({ account: accounts.at(0) }),\n    dangerous_secp256k1({ account: accounts.at(1) }),\n  ],\n  pollingInterval: 100,\n  storage: null,\n  transports: {\n    [tempoLocal.id]: http(),\n  },\n})\n\nexport const queryClient = new QueryClient()\n\nexport function createWrapper<component extends React.FunctionComponent<any>>(\n  Wrapper: component,\n  props: Parameters<component>[0],\n) {\n  type Props = { children?: React.ReactNode | undefined }\n  return function CreatedWrapper({ children }: Props) {\n    return React.createElement(\n      Wrapper,\n      props,\n      React.createElement(\n        QueryClientProvider,\n        { client: queryClient },\n        children,\n      ),\n    )\n  }\n}\n\nexport function renderHook<result, props>(\n  renderCallback: (initialProps?: props) => result,\n  options?: RenderHookOptions<props>,\n): Promise<RenderHookResult<result, props>> {\n  queryClient.clear()\n  return vbr_renderHook(renderCallback, {\n    wrapper: createWrapper(WagmiProvider, { config, reconnectOnMount: false }),\n    ...options,\n  })\n}\n\nexport async function restart() {\n  await fetch(`${rpcUrl}/restart`)\n\n  // Re-setup liquidity for fee tokens after restart\n  if (getConnection(config).status === 'disconnected')\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n  const client = config.getClient()\n\n  // Temporarily restore real Date.now so viem calculates a valid validBefore timestamp.\n  if ((Date.now as any).mockRestore) (Date.now as any).mockRestore()\n  await Promise.all(\n    [1n, 2n, 3n].map((id) =>\n      Actions.amm.mintSync(client, {\n        account: accounts[0],\n        feeToken: Addresses.pathUsd,\n        nonceKey: 'expiring',\n        userTokenAddress: id,\n        validatorTokenAddress: Addresses.pathUsd,\n        validatorTokenAmount: parseUnits('1000', 6),\n        to: accounts[0].address,\n      }),\n    ),\n  )\n  vi.spyOn(Date, 'now').mockReturnValue(\n    new Date(Date.UTC(2023, 1, 1)).valueOf(),\n  )\n}\n\nexport async function setupToken() {\n  if (getConnection(config).status === 'disconnected')\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n  const client = await getConnectorClient(config)\n  return viem_setupToken(client as never)\n}\n\nexport async function setupPoolWithLiquidity() {\n  if (getConnection(config).status === 'disconnected')\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n  const client = await getConnectorClient(config)\n  return viem_setupPoolWithLiquidity(client as never)\n}\n\nexport async function setupTokenPair() {\n  if (getConnection(config).status === 'disconnected')\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n  const client = await getConnectorClient(config)\n  return viem_setupTokenPair(client as never)\n}\n\nexport async function setupOrders() {\n  if (getConnection(config).status === 'disconnected')\n    await connect(config, {\n      connector: config.connectors[0]!,\n    })\n  const client = await getConnectorClient(config)\n  return viem_setupOrders(client as never)\n}\n\nexport async function viem_setupToken(\n  client: Client<Transport, Chain, Account>,\n  parameters: Partial<\n    Awaited<ReturnType<typeof Actions.token.createSync>>\n  > = {},\n) {\n  const token = await Actions.token.createSync(client, {\n    currency: 'USD',\n    name: 'Test Token',\n    symbol: 'TST',\n    ...parameters,\n  })\n\n  await Actions.token.grantRolesSync(client, {\n    roles: ['issuer'],\n    to: client.account.address,\n    token: token.token,\n  })\n\n  await Actions.token.mintSync(client, {\n    amount: parseUnits('10000', 6),\n    to: client.account.address,\n    token: token.token,\n  })\n\n  return token\n}\n\nexport async function viem_setupPoolWithLiquidity(\n  client: Client<Transport, Chain, Account>,\n) {\n  // Create a new token for testing\n  const { token } = await Actions.token.createSync(client, {\n    name: 'Test Token',\n    symbol: 'TEST',\n    currency: 'USD',\n  })\n\n  // Grant issuer role to mint tokens\n  await Actions.token.grantRolesSync(client, {\n    token,\n    roles: ['issuer'],\n    to: client.account.address,\n  })\n\n  // Mint some tokens to account\n  await Actions.token.mintSync(client, {\n    to: client.account.address,\n    amount: parseUnits('1000', 6),\n    token,\n  })\n\n  // Add liquidity to pool\n  await Actions.amm.mintSync(client, {\n    userTokenAddress: token,\n    validatorTokenAddress: addresses.alphaUsd,\n    validatorTokenAmount: parseUnits('100', 6),\n    to: client.account.address,\n  })\n\n  return { tokenAddress: token }\n}\n\nexport async function viem_setupTokenPair(\n  client: Client<Transport, typeof tempoLocal, Account>,\n) {\n  // Create quote token\n  const { token: quoteToken } = await Actions.token.createSync(client, {\n    name: 'Test Quote Token',\n    symbol: 'QUOTE',\n    currency: 'USD',\n  })\n\n  // Create base token\n  const { token: baseToken } = await Actions.token.createSync(client, {\n    name: 'Test Base Token',\n    symbol: 'BASE',\n    currency: 'USD',\n    quoteToken,\n  })\n\n  await sendTransactionSync(client, {\n    calls: [\n      Actions.token.grantRoles.call({\n        token: baseToken,\n        role: 'issuer',\n        to: client.account.address,\n      }),\n      Actions.token.grantRoles.call({\n        token: quoteToken,\n        role: 'issuer',\n        to: client.account.address,\n      }),\n      Actions.token.mint.call({\n        token: baseToken,\n        to: client.account.address,\n        amount: parseUnits('10000', 6),\n      }),\n      Actions.token.mint.call({\n        token: quoteToken,\n        to: client.account.address,\n        amount: parseUnits('10000', 6),\n      }),\n      Actions.token.approve.call({\n        token: baseToken,\n        spender: Addresses.stablecoinDex,\n        amount: parseUnits('10000', 6),\n      }),\n      Actions.token.approve.call({\n        token: quoteToken,\n        spender: Addresses.stablecoinDex,\n        amount: parseUnits('10000', 6),\n      }),\n    ],\n  })\n\n  // Create the pair on the DEX\n  return await Actions.dex.createPairSync(client, {\n    base: baseToken,\n  })\n}\n\nexport async function viem_setupOrders(\n  client: Client<Transport, typeof tempoLocal, Account>,\n) {\n  const { base: base1 } = await viem_setupTokenPair(client)\n  const { base: base2 } = await viem_setupTokenPair(client)\n\n  const bases = [base1, base2]\n\n  // Create 50 orders with varying amounts, ticks, and tokens\n  const calls = []\n  for (let i = 0; i < 50; i++) {\n    const token = bases[i % bases.length]!\n    const amount = parseUnits(String(100 + i * 10), 6)\n    const isBuy = i % 2 === 0\n    const tickPrice = 1.0 + ((i % 20) - 10) * 0.001\n    const tick = Tick.fromPrice(String(tickPrice))\n\n    calls.push(\n      Actions.dex.place.call({\n        token,\n        amount,\n        type: isBuy ? 'buy' : 'sell',\n        tick,\n      }),\n    )\n  }\n\n  await sendTransactionSync(client, { calls } as never)\n\n  return { bases }\n}\n"
  },
  {
    "path": "packages/test/src/tempo/setup.global.ts",
    "content": "import * as os from 'node:os'\nimport * as path from 'node:path'\nimport { Instance, Server } from 'prool'\nimport {\n  GenericContainer,\n  PullPolicy,\n  type StartedTestContainer,\n  Wait,\n} from 'testcontainers'\n\nconst isMacOS = os.platform() === 'darwin'\n\nfunction toFlagCase(str: string, separator = '-') {\n  const keys = []\n  for (const part of str.split('.')) {\n    if (!part) continue\n    keys.push(\n      part\n        .replace(/\\s+/g, separator)\n        .replace(/([a-z])([A-Z])/g, `$1${separator}$2`)\n        .toLowerCase(),\n    )\n  }\n  return `--${keys.join('.')}`\n}\n\nfunction toArgs(\n  obj: Record<string, unknown>,\n  options: { arraySeparator?: string | null } = {},\n): string[] {\n  const { arraySeparator = ',' } = options\n  return Object.entries(obj).flatMap(([key, value]) => {\n    if (value === undefined) return []\n\n    if (Array.isArray(value)) {\n      if (value[0] === true)\n        return [toFlagCase(key), ...toArgs({ [key]: value[1] }, options)]\n      const arrayValue =\n        arraySeparator === null ? value : value.join(arraySeparator)\n      return [toFlagCase(key), arrayValue].flat()\n    }\n\n    if (typeof value === 'object' && value !== null) {\n      return Object.entries(value).flatMap(([subKey, subValue]) => {\n        if (subValue === undefined) return []\n        const flag = toFlagCase(`${key}.${subKey}`)\n        return toArgs({ [flag.slice(2)]: subValue }, options)\n      })\n    }\n\n    const flag = toFlagCase(key)\n    if (value === false) return [flag, 'false']\n    if (value === true) return [flag]\n    const stringified = value?.toString() ?? ''\n    if (stringified === '') return [flag]\n    return [flag, stringified]\n  })\n}\n\nfunction buildCommand(port: number, blockTime: string): string[] {\n  const datadir = path.join(os.tmpdir(), '.prool', `tempo.${port}`)\n  const params: Record<string, unknown> = {\n    authrpc: { port: port + 30 },\n    datadir,\n    dev: [true, { blockTime }],\n    engine: { disablePrecompileCache: true, legacyStateRoot: true },\n    faucet: {\n      address: [\n        '0x20c0000000000000000000000000000000000000',\n        '0x20c0000000000000000000000000000000000001',\n        '0x20c0000000000000000000000000000000000002',\n        '0x20c0000000000000000000000000000000000003',\n      ],\n      amount: '1000000000000',\n      enabled: true,\n      privateKey:\n        '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',\n    },\n    http: { addr: '0.0.0.0', api: 'all', corsdomain: '*', port },\n    port: port + 10,\n    ws: { port: port + 20 },\n  }\n  return ['node', ...toArgs(params, { arraySeparator: null })]\n}\n\nconst tempoInstance = Instance.define(\n  (parameters?: {\n    image: string\n    port: number\n    blockTime: string\n    log?: string | boolean\n  }) => {\n    const {\n      image,\n      port,\n      blockTime,\n      log: log_,\n    } = parameters ?? {\n      image: 'ghcr.io/tempoxyz/tempo:latest',\n      port: 8545,\n      blockTime: '50ms',\n    }\n\n    const log = (() => {\n      try {\n        return JSON.parse(log_ as string)\n      } catch {\n        return log_\n      }\n    })()\n    const RUST_LOG = log && typeof log !== 'boolean' ? log : ''\n\n    let container: StartedTestContainer | undefined\n\n    return {\n      _internal: {},\n      host: 'localhost',\n      name: 'tempo',\n      port,\n      async start({ port: startPort = port }, { emitter }) {\n        let resolve: () => void\n        let reject: (reason?: unknown) => void\n        const promise = new Promise<void>((res, rej) => {\n          resolve = res\n          reject = rej\n        })\n\n        const c = new GenericContainer(image)\n          .withPullPolicy(PullPolicy.defaultPolicy())\n          .withName(`tempo.${crypto.randomUUID()}`)\n          .withEnvironment({ RUST_LOG })\n          .withCommand(buildCommand(startPort, blockTime))\n          .withWaitStrategy(\n            Wait.forLogMessage(\n              /Received (block|new payload) from consensus engine/,\n            ),\n          )\n          .withLogConsumer((stream) => {\n            stream.on('data', (data) => {\n              const message = data.toString()\n              emitter.emit('message', message)\n              emitter.emit('stdout', message)\n              if (log) console.log(message)\n              if (message.includes('shutting down'))\n                reject!(new Error(`Failed to start: ${message}`))\n            })\n            stream.on('error', (error) => {\n              // biome-ignore lint/suspicious/noConsole: test setup logging\n              if (log) console.error(error.message)\n              emitter.emit('message', error.message)\n              emitter.emit('stderr', error.message)\n              reject!(new Error(`Failed to start: ${error.message}`))\n            })\n          })\n          .withStartupTimeout(30_000)\n\n        if (isMacOS) {\n          c.withExposedPorts({ container: startPort, host: startPort })\n        } else {\n          c.withNetworkMode('host')\n          c.withExtraHosts([\n            { host: 'host.docker.internal', ipAddress: 'host-gateway' },\n            { host: 'localhost', ipAddress: 'host-gateway' },\n          ])\n        }\n\n        c.start()\n          .then((started) => {\n            container = started\n            resolve!()\n          })\n          .catch(reject!)\n\n        return promise\n      },\n      async stop() {\n        if (!container) return\n        await container.stop()\n        container = undefined\n      },\n    }\n  },\n)\n\nexport default async function () {\n  const port = 4000\n  const tag = import.meta.env.VITE_NODE_TAG ?? 'latest'\n  const server = Server.create({\n    instance: tempoInstance({\n      image: `ghcr.io/tempoxyz/tempo:${tag}`,\n      port,\n      blockTime: '2ms',\n      log: import.meta.env.VITE_NODE_LOG,\n    }),\n    port,\n  })\n  await server.start()\n  return async () => await server.stop()\n}\n"
  },
  {
    "path": "packages/test/src/tempo/setup.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { parseUnits } from 'viem'\nimport { Actions, Addresses } from 'viem/tempo'\nimport { beforeAll, beforeEach, vi } from 'vitest'\nimport { accounts, config } from './config.js'\n\n// @ts-expect-error\nBigInt.prototype.toJSON = function () {\n  return this.toString()\n}\n\nbeforeAll(async () => {\n  await connect(config, {\n    connector: config.connectors[0]!,\n  })\n  const client = config.getClient()\n\n  // Mint liquidity for fee tokens.\n  // Temporarily restore real Date.now so viem calculates a valid validBefore timestamp.\n  if ((Date.now as any).mockRestore) (Date.now as any).mockRestore()\n  await Promise.all(\n    [1n, 2n, 3n].map((id) =>\n      Actions.amm.mintSync(client, {\n        account: accounts[0],\n        feeToken: Addresses.pathUsd,\n        nonceKey: 'expiring',\n        userTokenAddress: id,\n        validatorTokenAddress: Addresses.pathUsd,\n        validatorTokenAmount: parseUnits('1000', 6),\n        to: accounts[0].address,\n      }),\n    ),\n  )\n  vi.spyOn(Date, 'now').mockReturnValue(\n    new Date(Date.UTC(2023, 1, 1)).valueOf(),\n  )\n\n  await disconnect(config).catch(() => {})\n})\n\nbeforeEach(async () => {\n  await disconnect(config).catch(() => {})\n  // Make dates stable across runs (set here so it doesn't affect beforeAll setup)\n  vi.spyOn(Date, 'now').mockReturnValue(\n    new Date(Date.UTC(2023, 1, 1)).valueOf(),\n  )\n})\n\nvi.mock('../src/version.ts', () => {\n  return { version: 'x.y.z' }\n})\n\nvi.mock('../../core/src/version.ts', () => {\n  return { version: 'x.y.z' }\n})\n"
  },
  {
    "path": "packages/test/src/utils.ts",
    "content": "const pool =\n  (typeof process !== 'undefined' &&\n    Number(process.env.VITEST_POOL_ID ?? 1) +\n      Math.floor(Math.random() * 10_000)) ||\n  1 + Math.floor(Math.random() * 10_000)\n\nexport function getRpcUrls({ port }: { port: number }) {\n  return {\n    port,\n    rpcUrls: {\n      // These rpc urls are automatically used in the transports.\n      default: {\n        // Note how we append the worker id to the local rpc urls.\n        http: [`http://127.0.0.1:${port}/${pool}`],\n        webSocket: [`ws://127.0.0.1:${port}/${pool}`],\n      },\n      public: {\n        // Note how we append the worker id to the local rpc urls.\n        http: [`http://127.0.0.1:${port}/${pool}`],\n        webSocket: [`ws://127.0.0.1:${port}/${pool}`],\n      },\n    },\n  } as const\n}\n\nexport async function wait(time: number) {\n  return new Promise((res) => setTimeout(res, time))\n}\n"
  },
  {
    "path": "packages/test/src/vite-env.d.ts",
    "content": "/// <reference types=\"vite/client\" />\n\ninterface ImportMetaEnv {\n  readonly VITE_MAINNET_FORK_URL?: string | undefined\n  readonly VITE_OPTIMISM_FORK_URL?: string | undefined\n  readonly VITE_WC_PROJECT_ID?: string | undefined\n  readonly VITE_NODE_LOG?: string | undefined\n  readonly VITE_NODE_TAG?: string | undefined\n  readonly RPC_PORT?: string | undefined\n}\n\ninterface ImportMeta {\n  readonly env: ImportMetaEnv\n}\n"
  },
  {
    "path": "packages/test/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"include\": [\"src/**/*.ts\"],\n  \"exclude\": [\"src/**/*.test.ts\", \"src/**/*.test-d.ts\"],\n  \"compilerOptions\": {\n    \"sourceMap\": true\n  }\n}\n"
  },
  {
    "path": "packages/test/tsconfig.json",
    "content": "{\n  \"extends\": \"./tsconfig.build.json\",\n  \"include\": [\"src/**/*.ts\"],\n  \"exclude\": []\n}\n"
  },
  {
    "path": "packages/vue/CHANGELOG.md",
    "content": "# @wagmi/vue\n\n## 0.5.0\n\n### Minor Changes\n\n- Added `useSignTransaction` ([#4995](https://github.com/wevm/wagmi/pull/4995))\n\n### Patch Changes\n\n- Updated dependencies [[`8b96e2f`](https://github.com/wevm/wagmi/commit/8b96e2f46d9b3441d3b499b03924700ac0629be6)]:\n  - @wagmi/core@3.4.0\n  - @wagmi/connectors@7.2.1\n\n## 0.4.17\n\n### Patch Changes\n\n- Updated dependencies [[`c1dedd9`](https://github.com/wevm/wagmi/commit/c1dedd99c0a1878d7cd48476946868636ac81dd8), [`9dbdd82`](https://github.com/wevm/wagmi/commit/9dbdd8277808eb361fe7fe01ea34e4c6bb85c7a5)]:\n  - @wagmi/core@3.3.4\n  - @wagmi/connectors@7.2.0\n\n## 0.4.16\n\n### Patch Changes\n\n- Updated dependencies [[`4b3f5a3`](https://github.com/wevm/wagmi/commit/4b3f5a3f7b3f242e8fbc1f08ae2f81ae13c5e09f)]:\n  - @wagmi/core@3.3.3\n  - @wagmi/connectors@7.1.7\n\n## 0.4.15\n\n### Patch Changes\n\n- Updated dependencies [[`68e17db`](https://github.com/wevm/wagmi/commit/68e17db7ff84982db8f52f54e6f047c5efab62ab)]:\n  - @wagmi/core@3.3.2\n  - @wagmi/connectors@7.1.6\n\n## 0.4.14\n\n### Patch Changes\n\n- Updated dependencies [[`7f756bd`](https://github.com/wevm/wagmi/commit/7f756bda12cd332016f0bb3a2f20307c37499309)]:\n  - @wagmi/core@3.3.1\n  - @wagmi/connectors@7.1.5\n\n## 0.4.13\n\n### Patch Changes\n\n- Updated dependencies [[`dfe7904`](https://github.com/wevm/wagmi/commit/dfe790426d5ac24d55eacdf8d0193292de801911), [`d503a2c`](https://github.com/wevm/wagmi/commit/d503a2cb6ef96018669a66d03f72a2b2b06dc0fb), [`5399840`](https://github.com/wevm/wagmi/commit/53998407645edd95d85e50a931acaed87c05e256), [`5978cc5`](https://github.com/wevm/wagmi/commit/5978cc508ac837be88ed84c15ea5aa805f59005a), [`67612ed`](https://github.com/wevm/wagmi/commit/67612edfbcb971b71c86964aae72ff3ef80bbe10), [`dbe9484`](https://github.com/wevm/wagmi/commit/dbe9484c1a635c3fc9b658a7d8e34ccc0a82ed1d)]:\n  - @wagmi/core@3.3.0\n  - @wagmi/connectors@7.1.4\n\n## 0.4.12\n\n### Patch Changes\n\n- Updated dependencies [[`979fe26`](https://github.com/wevm/wagmi/commit/979fe265e5273a8b49a4469ffab88b1a18b1aeaa), [`979fe26`](https://github.com/wevm/wagmi/commit/979fe265e5273a8b49a4469ffab88b1a18b1aeaa), [`e4541de`](https://github.com/wevm/wagmi/commit/e4541def76a1744dc36c188453265cc6e9d83722)]:\n  - @wagmi/core@3.2.3\n  - @wagmi/connectors@7.1.3\n\n## 0.4.11\n\n### Patch Changes\n\n- Updated query internals. ([`4fefa57`](https://github.com/wevm/wagmi/commit/4fefa576014820b454344b579282ddecde5c7994))\n\n- Updated dependencies [[`4fefa57`](https://github.com/wevm/wagmi/commit/4fefa576014820b454344b579282ddecde5c7994)]:\n  - @wagmi/core@3.2.2\n  - @wagmi/connectors@7.1.2\n\n## 0.4.10\n\n### Patch Changes\n\n- Updated dependencies [[`a373b50`](https://github.com/wevm/wagmi/commit/a373b504f2ba199ca63ec0da6138ad1aa12a3a8f)]:\n  - @wagmi/core@3.2.1\n  - @wagmi/connectors@7.1.1\n\n## 0.4.9\n\n### Patch Changes\n\n- Updated dependencies [[`2ee3f55`](https://github.com/wevm/wagmi/commit/2ee3f559a2637c7aab3fca6c7d196cf238ecd63d)]:\n  - @wagmi/core@3.2.0\n  - @wagmi/connectors@7.1.3\n\n## 0.4.8\n\n### Patch Changes\n\n- Updated dependencies [[`14989e4`](https://github.com/wevm/wagmi/commit/14989e425a36b765a6a24e5abf1782c2a26c70db)]:\n  - @wagmi/core@3.1.0\n  - @wagmi/connectors@7.1.2\n\n## 0.4.7\n\n### Patch Changes\n\n- Updated dependencies [[`a5c4381`](https://github.com/wevm/wagmi/commit/a5c4381563374018dca0074017b21181ac027e9a)]:\n  - @wagmi/core@3.0.2\n  - @wagmi/connectors@7.0.6\n\n## 0.4.6\n\n### Patch Changes\n\n- Fixed published exports. ([`ed86500`](https://github.com/wevm/wagmi/commit/ed86500fbd56e5f543cb04e990b2dadc08d8b3b5))\n\n- Updated dependencies [[`ed86500`](https://github.com/wevm/wagmi/commit/ed86500fbd56e5f543cb04e990b2dadc08d8b3b5)]:\n  - @wagmi/connectors@7.0.5\n\n## 0.4.5\n\n### Patch Changes\n\n- Updated dependencies [[`9bbf13e`](https://github.com/wevm/wagmi/commit/9bbf13eac895669e70b233de767c8731d221f16e)]:\n  - @wagmi/connectors@7.0.4\n\n## 0.4.4\n\n### Patch Changes\n\n- Updated dependencies [[`058c8c1`](https://github.com/wevm/wagmi/commit/058c8c18459a69a4aa2141e34640273a06a819f4)]:\n  - @wagmi/core@3.0.1\n  - @wagmi/connectors@7.0.3\n\n## 0.4.3\n\n### Patch Changes\n\n- Deprecated custom mutate function names and renamed to `mutate`/`mutateAsync` to reduce destructure key renaming fatigue and align with TanStack Query terminology. ([#4878](https://github.com/wevm/wagmi/pull/4878))\n\n  **Before**\n\n  Had to destructure hook result and often rename keys when using multiple of the same hook. Could decide not to destructure, but syntax becomes awkward for mutate functions (e.g. `connect.connect` or `connect.connectAsync`).\n\n  ```ts\n  const { connect, isPending: connectIsPending } = useConnect();\n  const {\n    writeContract: transfer,\n    error: transferError,\n    isPending: transferIsPending,\n  } = useWriteContract();\n  const { writeContract: approve, error: approveError } = useWriteContract();\n  ```\n\n  **After**\n\n  Allows you to name the hook result whatever you want and not worry about also renaming properties.\n\n  ```ts\n  const connect = useConnect(); // connect.isPending\n  const transfer = useWriteContract(); // transfer.mutate, transfer.error, transfer.isPending\n  const approve = useWriteContract(); // approve.mutate, approve.error\n  ```\n\n## 0.4.2\n\n### Patch Changes\n\n- Updated dependencies [[`0a46561`](https://github.com/wevm/wagmi/commit/0a4656137e1f9ed101dd1f79545d516aba32a92e)]:\n  - @wagmi/connectors@7.0.2\n\n## 0.4.1\n\n### Patch Changes\n\n- Updated dependencies [[`856548a`](https://github.com/wevm/wagmi/commit/856548a5ae23c8771e3a51a919e1e978b83c4b00)]:\n  - @wagmi/connectors@7.0.1\n\n## 0.4.0\n\n### Minor Changes\n\n- 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))\n\n  #### baseAccount\n\n  [`baseAccount`](https://wagmi.sh/vue/api/connectors/baseAccount) requires `@base-org/account`\n\n  ```\n  pnpm add @base-org/account@~2.4.0\n  ```\n\n  #### coinbaseWallet\n\n  [`coinbaseWallet`](https://wagmi.sh/vue/api/connectors/coinbaseWallet) requires `@coinbase/wallet-sdk`\n\n  ```\n  pnpm add @coinbase/wallet-sdk@~4.3.6\n  ```\n\n  #### gemini\n\n  [`gemini`](https://wagmi.sh/vue/api/connectors/gemini) requires `@gemini-wallet/core`\n\n  ```\n  pnpm add @gemini-wallet/core@~0.3.1\n  ```\n\n  #### metaMask\n\n  [`metaMask`](https://wagmi.sh/vue/api/connectors/metaMask) requires `@metamask/sdk`\n\n  ```\n  pnpm add @metamask/sdk@~0.33.1\n  ```\n\n  #### porto\n\n  [`porto`](https://wagmi.sh/vue/api/connectors/porto) requires `porto`\n\n  ```\n  pnpm add porto@~0.2.35\n  ```\n\n  #### safe\n\n  [`safe`](https://wagmi.sh/vue/api/connectors/safe) requires `@safe-global/safe-apps-provider` and `@safe-global/safe-apps-sdk`\n\n  ```\n  pnpm add @safe-global/safe-apps-provider@~0.18.6 @safe-global/safe-apps-sdk@~9.1.0\n  ```\n\n  #### walletConnect\n\n  [`walletConnect`](https://wagmi.sh/vue/api/connectors/walletConnect) requires `walletconnect/ethereum-provider`\n\n  ```\n  pnpm add @walletconnect/ethereum-provider@~2.21.1\n  ```\n\n### Patch Changes\n\n- Updated dependencies [[`73e7326`](https://github.com/wevm/wagmi/commit/73e7326ac21303d7790765c78a7076b319b2ad26)]:\n  - @wagmi/connectors@7.0.0\n  - @wagmi/core@3.0.0\n\n## 0.3.4\n\n### Patch Changes\n\n- Updated dependencies [[`5388de5`](https://github.com/wevm/wagmi/commit/5388de593847b23368c42646c27ee5438260062d)]:\n  - @wagmi/connectors@6.2.0\n\n## 0.3.3\n\n### Patch Changes\n\n- Updated dependencies [[`2ddb506`](https://github.com/wevm/wagmi/commit/2ddb506b67fcb2abb464765d2af88df2eb58de60)]:\n  - @wagmi/connectors@6.1.4\n\n## 0.3.2\n\n### Patch Changes\n\n- Updated dependencies [[`65cf154`](https://github.com/wevm/wagmi/commit/65cf1544d65bfb1fb830c405a371e8cd3c3fb73e)]:\n  - @wagmi/connectors@6.1.3\n\n## 0.3.1\n\n### Patch Changes\n\n- Updated dependencies [[`faf3eed`](https://github.com/wevm/wagmi/commit/faf3eeddb97c300f971083f8ee9b02a29ad23cbb)]:\n  - @wagmi/connectors@6.1.2\n\n## 0.3.0\n\n### Minor Changes\n\n- Exported internal types ([`3e634b7`](https://github.com/wevm/wagmi/commit/3e634b7bcf0bd0e67e59fcb74ad89dfb56e4eae9))\n\n### Patch Changes\n\n- Updated dependencies [[`990dd23`](https://github.com/wevm/wagmi/commit/990dd2339e96b302931056e0fb898bd2dd42a04d)]:\n  - @wagmi/connectors@6.1.1\n\n## 0.2.14\n\n### Patch Changes\n\n- Updated dependencies [[`ae31a8d`](https://github.com/wevm/wagmi/commit/ae31a8d3d0b436841d6546ab2565dee624204aca)]:\n  - @wagmi/connectors@6.1.0\n\n## 0.2.13\n\n### Patch Changes\n\n- Updated dependencies [[`74100b0`](https://github.com/wevm/wagmi/commit/74100b0dea2dfe7b057fdbe1660596554c70642e)]:\n  - @wagmi/core@2.22.1\n  - @wagmi/connectors@6.0.1\n\n## 0.2.12\n\n### Patch Changes\n\n- Updated dependencies [[`ebb2352`](https://github.com/wevm/wagmi/commit/ebb2352375e05e52d0bcf6ae1a60ac4e798bf29f)]:\n  - @wagmi/core@2.22.0\n  - @wagmi/connectors@6.0.0\n\n## 0.2.11\n\n### Patch Changes\n\n- Updated dependencies [[`2f0db95`](https://github.com/wevm/wagmi/commit/2f0db9553d30dd95b3245c44dafec4fa1a758397), [`866aeb0`](https://github.com/wevm/wagmi/commit/866aeb0e6361ef9114246e50149c1077bc05bf10)]:\n  - @wagmi/connectors@5.11.2\n  - @wagmi/core@2.21.2\n\n## 0.2.10\n\n### Patch Changes\n\n- Updated dependencies [[`41eb70e`](https://github.com/wevm/wagmi/commit/41eb70e072774b282053a5e98669a7d01c0e2438), [`9a00e42`](https://github.com/wevm/wagmi/commit/9a00e423d52df9478681df743f00429717ffc584)]:\n  - @wagmi/connectors@5.11.1\n\n## 0.2.9\n\n### Patch Changes\n\n- Updated dependencies [[`f05c075`](https://github.com/wevm/wagmi/commit/f05c075365a737d870a657f2db9220eb93ad0ac1)]:\n  - @wagmi/connectors@5.11.0\n\n## 0.2.8\n\n### Patch Changes\n\n- Updated dependencies [[`72b703a`](https://github.com/wevm/wagmi/commit/72b703ab379c74ecf88f637cf47f31786c823a48)]:\n  - @wagmi/core@2.21.1\n  - @wagmi/connectors@5.10.2\n\n## 0.2.7\n\n### Patch Changes\n\n- Updated dependencies [[`5937456`](https://github.com/wevm/wagmi/commit/59374562f2c3a41245687eb1c29ee8023737c7cc)]:\n  - @wagmi/connectors@5.10.1\n\n## 0.2.6\n\n### Patch Changes\n\n- [#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.\n\n- Updated dependencies [[`8736133a13eb82099e20468b735525a266fdfd6c`](https://github.com/wevm/wagmi/commit/8736133a13eb82099e20468b735525a266fdfd6c)]:\n  - @wagmi/connectors@5.10.0\n  - @wagmi/core@2.21.0\n\n## 0.2.5\n\n### Patch Changes\n\n- Updated dependencies [[`ce06e137e7bfaf000464b1cecd6c86e19a66ebcf`](https://github.com/wevm/wagmi/commit/ce06e137e7bfaf000464b1cecd6c86e19a66ebcf)]:\n  - @wagmi/core@2.20.3\n  - @wagmi/connectors@5.9.9\n\n## 0.2.4\n\n### Patch Changes\n\n- Updated dependencies [[`a03da817a388646c9b4885792101a67eef3616e7`](https://github.com/wevm/wagmi/commit/a03da817a388646c9b4885792101a67eef3616e7)]:\n  - @wagmi/connectors@5.9.8\n\n## 0.2.3\n\n### Patch Changes\n\n- Updated dependencies [[`986b96427a4bb743d2673dfbc7e8cb5041316db3`](https://github.com/wevm/wagmi/commit/986b96427a4bb743d2673dfbc7e8cb5041316db3)]:\n  - @wagmi/core@2.20.2\n  - @wagmi/connectors@5.9.7\n\n## 0.2.2\n\n### Patch Changes\n\n- Updated dependencies [[`d4c367ca46c508598c997cf229a31593a1e2b8b8`](https://github.com/wevm/wagmi/commit/d4c367ca46c508598c997cf229a31593a1e2b8b8)]:\n  - @wagmi/core@2.20.1\n  - @wagmi/connectors@5.9.6\n\n## 0.2.1\n\n### Patch Changes\n\n- Updated dependencies [[`a13aa2b68890f180f6ac3f741cbb9817494cb66c`](https://github.com/wevm/wagmi/commit/a13aa2b68890f180f6ac3f741cbb9817494cb66c)]:\n  - @wagmi/core@2.20.0\n  - @wagmi/connectors@5.9.5\n\n## 0.2.0\n\n### Minor Changes\n\n- [#4737](https://github.com/wevm/wagmi/pull/4737) [`23bad767c5055f54d2a5a5179830e078282fa00f`](https://github.com/wevm/wagmi/commit/23bad767c5055f54d2a5a5179830e078282fa00f) Thanks [@microHoffman](https://github.com/microHoffman)! - Added support for Nuxt 4.\n\n## 0.1.28\n\n### Patch Changes\n\n- Updated dependencies [[`f4039419b83b52b2984de149db85c11f503ffe39`](https://github.com/wevm/wagmi/commit/f4039419b83b52b2984de149db85c11f503ffe39)]:\n  - @wagmi/connectors@5.9.4\n\n## 0.1.27\n\n### Patch Changes\n\n- Updated dependencies [[`909324d28c81e15c9df312b277dcff1983fbae4d`](https://github.com/wevm/wagmi/commit/909324d28c81e15c9df312b277dcff1983fbae4d)]:\n  - @wagmi/connectors@5.9.3\n\n## 0.1.26\n\n### Patch Changes\n\n- Updated dependencies [[`b5f017dbc707729eb0b36d617352be224d1139d4`](https://github.com/wevm/wagmi/commit/b5f017dbc707729eb0b36d617352be224d1139d4)]:\n  - @wagmi/core@2.19.0\n  - @wagmi/connectors@5.9.2\n\n## 0.1.25\n\n### Patch Changes\n\n- Updated dependencies [[`6fbafd425e488dbeee8404162dbeb3c737eeb8cf`](https://github.com/wevm/wagmi/commit/6fbafd425e488dbeee8404162dbeb3c737eeb8cf), [`6514ba29a5acb918773235fed0238d7d679d06d5`](https://github.com/wevm/wagmi/commit/6514ba29a5acb918773235fed0238d7d679d06d5)]:\n  - @wagmi/connectors@5.9.1\n  - @wagmi/core@2.18.1\n\n## 0.1.24\n\n### Minor Changes\n\n- [#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.\n\n### Patch Changes\n\n- Updated dependencies [[`eac550ae5b49f96a7e3404a6d88adc62d3889013`](https://github.com/wevm/wagmi/commit/eac550ae5b49f96a7e3404a6d88adc62d3889013)]:\n  - @wagmi/connectors@6.0.0\n  - @wagmi/core@2.18.0\n\n## 0.1.23\n\n### Patch Changes\n\n- Updated dependencies [[`e75bd89406e9b6ff5b7d3a7148ab34140fe6352a`](https://github.com/wevm/wagmi/commit/e75bd89406e9b6ff5b7d3a7148ab34140fe6352a)]:\n  - @wagmi/connectors@5.8.6\n\n## 0.1.22\n\n### Patch Changes\n\n- Updated dependencies [[`7ce242b549d8cc78e6c319d9ee419693da36704c`](https://github.com/wevm/wagmi/commit/7ce242b549d8cc78e6c319d9ee419693da36704c)]:\n  - @wagmi/core@2.17.3\n  - @wagmi/connectors@5.8.5\n\n## 0.1.21\n\n### Patch Changes\n\n- Updated dependencies [[`3a90f358820444a85bb727742b0a16eb943fc361`](https://github.com/wevm/wagmi/commit/3a90f358820444a85bb727742b0a16eb943fc361)]:\n  - @wagmi/connectors@5.8.4\n\n## 0.1.20\n\n### Patch Changes\n\n- Updated dependencies [[`42b1fed58e9ac09da0f8ebf3e9271f98a707aaac`](https://github.com/wevm/wagmi/commit/42b1fed58e9ac09da0f8ebf3e9271f98a707aaac)]:\n  - @wagmi/connectors@5.8.3\n\n## 0.1.19\n\n### Patch Changes\n\n- Updated dependencies [[`29297a48af72b537173d948ccd2fe37d39914c66`](https://github.com/wevm/wagmi/commit/29297a48af72b537173d948ccd2fe37d39914c66), [`07370106d5fb6b8fe300992d93abf25b3d0eaf57`](https://github.com/wevm/wagmi/commit/07370106d5fb6b8fe300992d93abf25b3d0eaf57)]:\n  - @wagmi/core@2.17.2\n  - @wagmi/connectors@5.8.2\n\n## 0.1.18\n\n### Patch Changes\n\n- Updated dependencies [[`01f64e64fa4f85cdd30023903f972f4f9023681f`](https://github.com/wevm/wagmi/commit/01f64e64fa4f85cdd30023903f972f4f9023681f)]:\n  - @wagmi/core@2.17.1\n  - @wagmi/connectors@5.8.1\n\n## 0.1.17\n\n### Patch Changes\n\n- Updated dependencies [[`cc5517ff6880bb630f1b201930acc20dd1a0b451`](https://github.com/wevm/wagmi/commit/cc5517ff6880bb630f1b201930acc20dd1a0b451)]:\n  - @wagmi/connectors@5.8.0\n\n## 0.1.16\n\n### Patch Changes\n\n- Updated dependencies [[`88427b2bcd13ec375ef519e9ad1ccffef9f02a7b`](https://github.com/wevm/wagmi/commit/88427b2bcd13ec375ef519e9ad1ccffef9f02a7b), [`799ee4d4b23c2ecd64e3f3668e67634e81939719`](https://github.com/wevm/wagmi/commit/799ee4d4b23c2ecd64e3f3668e67634e81939719), [`3f8b2edc4f237cccff1009bcef03d51ca27a7324`](https://github.com/wevm/wagmi/commit/3f8b2edc4f237cccff1009bcef03d51ca27a7324)]:\n  - @wagmi/connectors@6.0.0\n  - @wagmi/core@2.17.0\n\n## 0.1.15\n\n### Patch Changes\n\n- Updated dependencies [[`b59c024b23c69f5459b17390531207cfdf126ce4`](https://github.com/wevm/wagmi/commit/b59c024b23c69f5459b17390531207cfdf126ce4)]:\n  - @wagmi/connectors@5.7.12\n\n## 0.1.14\n\n### Patch Changes\n\n- Updated dependencies [[`a4bd0623eed28e3761a27295831a60ad835f0ee0`](https://github.com/wevm/wagmi/commit/a4bd0623eed28e3761a27295831a60ad835f0ee0)]:\n  - @wagmi/core@2.16.7\n  - @wagmi/connectors@5.7.11\n\n## 0.1.13\n\n### Patch Changes\n\n- Updated dependencies [[`edf47477b2f6385a1c3ae01d36a8498c47f30a0b`](https://github.com/wevm/wagmi/commit/edf47477b2f6385a1c3ae01d36a8498c47f30a0b), [`e944812ebc234a72c1417b77cff341166f5e0fef`](https://github.com/wevm/wagmi/commit/e944812ebc234a72c1417b77cff341166f5e0fef)]:\n  - @wagmi/core@2.16.6\n  - @wagmi/connectors@5.7.10\n\n## 0.1.12\n\n### Patch Changes\n\n- Updated dependencies [[`5b7101fddb61df56e34b2e02b46bc409e496eaf9`](https://github.com/wevm/wagmi/commit/5b7101fddb61df56e34b2e02b46bc409e496eaf9)]:\n  - @wagmi/connectors@5.7.9\n\n## 0.1.11\n\n### Patch Changes\n\n- Updated dependencies [[`d0c9a86921a4e939373cc6e763284e53f2a2e93c`](https://github.com/wevm/wagmi/commit/d0c9a86921a4e939373cc6e763284e53f2a2e93c)]:\n  - @wagmi/core@2.16.5\n  - @wagmi/connectors@5.7.8\n\n## 0.1.10\n\n### Patch Changes\n\n- [`507f864d91238bfd423d0e36d3619eb9f6e52eec`](https://github.com/wevm/wagmi/commit/507f864d91238bfd423d0e36d3619eb9f6e52eec) Thanks [@jxom](https://github.com/jxom)! - Updated `@coinbase/wallet-sdk`.\n\n- Updated dependencies [[`507f864d91238bfd423d0e36d3619eb9f6e52eec`](https://github.com/wevm/wagmi/commit/507f864d91238bfd423d0e36d3619eb9f6e52eec)]:\n  - @wagmi/connectors@5.7.7\n  - @wagmi/core@2.16.4\n\n## 0.1.9\n\n### Patch Changes\n\n- Updated dependencies [[`639952c97f0fe3927106f42d3c9f7f366cdf7f7a`](https://github.com/wevm/wagmi/commit/639952c97f0fe3927106f42d3c9f7f366cdf7f7a), [`5aa2c095f7bfb6dfcf91c6945c3e1f9c9dd05766`](https://github.com/wevm/wagmi/commit/5aa2c095f7bfb6dfcf91c6945c3e1f9c9dd05766)]:\n  - @wagmi/connectors@5.7.6\n\n## 0.1.8\n\n### Patch Changes\n\n- Updated dependencies [[`a257e8d4f97431a4af872cda1817b4ae17c7bbed`](https://github.com/wevm/wagmi/commit/a257e8d4f97431a4af872cda1817b4ae17c7bbed)]:\n  - @wagmi/connectors@5.7.5\n\n## 0.1.7\n\n### Patch Changes\n\n- Updated dependencies [[`c8a257e0f6d2ece013b873895c35769a8a804fdc`](https://github.com/wevm/wagmi/commit/c8a257e0f6d2ece013b873895c35769a8a804fdc)]:\n  - @wagmi/connectors@5.7.4\n\n## 0.1.6\n\n### Patch Changes\n\n- [#4480](https://github.com/wevm/wagmi/pull/4480) [`384a1d91597622eb59e1c05dc13ce25017c5b6d8`](https://github.com/wevm/wagmi/commit/384a1d91597622eb59e1c05dc13ce25017c5b6d8) Thanks [@RodeRickIsWatching](https://github.com/RodeRickIsWatching)! - Fixed invocation of default storage.\n\n- Updated dependencies [[`384a1d91597622eb59e1c05dc13ce25017c5b6d8`](https://github.com/wevm/wagmi/commit/384a1d91597622eb59e1c05dc13ce25017c5b6d8)]:\n  - @wagmi/core@2.16.3\n  - @wagmi/connectors@5.7.3\n\n## 0.1.5\n\n### Patch Changes\n\n- [`012907032b532a438fce48f407470250cbc8f0c6`](https://github.com/wevm/wagmi/commit/012907032b532a438fce48f407470250cbc8f0c6) Thanks [@jxom](https://github.com/jxom)! - Fixed assignment in `getDefaultStorage`.\n\n- Updated dependencies [[`012907032b532a438fce48f407470250cbc8f0c6`](https://github.com/wevm/wagmi/commit/012907032b532a438fce48f407470250cbc8f0c6)]:\n  - @wagmi/core@2.16.2\n  - @wagmi/connectors@5.7.2\n\n## 0.1.4\n\n### Patch Changes\n\n- Updated dependencies [[`9c8c35a3b829f2c58edcd3a29e2dcd99974d7470`](https://github.com/wevm/wagmi/commit/9c8c35a3b829f2c58edcd3a29e2dcd99974d7470), [`3892ebd21c06beef4b28ece4e70d2a38807bce6f`](https://github.com/wevm/wagmi/commit/3892ebd21c06beef4b28ece4e70d2a38807bce6f)]:\n  - @wagmi/connectors@5.7.1\n  - @wagmi/core@2.16.1\n\n## 0.1.3\n\n### Patch Changes\n\n- Updated dependencies [[`e3f63a02c1f7d80481804584f262bc98dab0400d`](https://github.com/wevm/wagmi/commit/e3f63a02c1f7d80481804584f262bc98dab0400d)]:\n  - @wagmi/connectors@5.7.0\n\n## 0.1.2\n\n### Patch Changes\n\n- Updated dependencies [[`adf2253b10c6d4fc583e4bc9f01a8ef5ca267c85`](https://github.com/wevm/wagmi/commit/adf2253b10c6d4fc583e4bc9f01a8ef5ca267c85)]:\n  - @wagmi/connectors@5.6.2\n\n## 0.1.1\n\n### Patch Changes\n\n- Updated dependencies [[`987404f590c1d29ebb3cb68928f5e54aa032793d`](https://github.com/wevm/wagmi/commit/987404f590c1d29ebb3cb68928f5e54aa032793d)]:\n  - @wagmi/connectors@5.6.1\n\n## 0.1.0\n\n### Minor Changes\n\n- [#4453](https://github.com/wevm/wagmi/pull/4453) [`070e48480194c8d7f45bda1d7dd1346e6f5d7227`](https://github.com/wevm/wagmi/commit/070e48480194c8d7f45bda1d7dd1346e6f5d7227) Thanks [@tmm](https://github.com/tmm)! - Added support to `useConnect` for custom `connector.connect` parameters.\n\n### Patch Changes\n\n- Updated dependencies [[`afea6b67822a7a2b96901ec851441d27ee0f7a52`](https://github.com/wevm/wagmi/commit/afea6b67822a7a2b96901ec851441d27ee0f7a52), [`070e48480194c8d7f45bda1d7dd1346e6f5d7227`](https://github.com/wevm/wagmi/commit/070e48480194c8d7f45bda1d7dd1346e6f5d7227), [`8b0726c1106fce88b782e676498eabf0718b2619`](https://github.com/wevm/wagmi/commit/8b0726c1106fce88b782e676498eabf0718b2619)]:\n  - @wagmi/core@2.16.0\n  - @wagmi/connectors@5.6.0\n\n## 0.0.69\n\n### Patch Changes\n\n- [`2f79a3da4872d6158569017b1927a07a1ff5e7ba`](https://github.com/wevm/wagmi/commit/2f79a3da4872d6158569017b1927a07a1ff5e7ba) Thanks [@tmm](https://github.com/tmm)! - Exported `injected` and `mock`.\n\n## 0.0.68\n\n### Patch Changes\n\n- [#4433](https://github.com/wevm/wagmi/pull/4433) [`06e186cd679b27fe195309110e766fcf46d4efbc`](https://github.com/wevm/wagmi/commit/06e186cd679b27fe195309110e766fcf46d4efbc) Thanks [@Aerilym](https://github.com/Aerilym)! - Bumped Metamask SDK version to `0.31.1`.\n\n- Updated dependencies [[`06e186cd679b27fe195309110e766fcf46d4efbc`](https://github.com/wevm/wagmi/commit/06e186cd679b27fe195309110e766fcf46d4efbc)]:\n  - @wagmi/connectors@5.5.3\n  - @wagmi/core@2.15.2\n\n## 0.0.67\n\n### Patch Changes\n\n- Updated dependencies [[`e563ef69130a511fd6f3f72ed4cd4fbe1390541f`](https://github.com/wevm/wagmi/commit/e563ef69130a511fd6f3f72ed4cd4fbe1390541f)]:\n  - @wagmi/connectors@5.5.2\n\n## 0.0.66\n\n### Patch Changes\n\n- [`b8bbb409f4934538e3dd6cac5aaf7346292d0693`](https://github.com/wevm/wagmi/commit/b8bbb409f4934538e3dd6cac5aaf7346292d0693) Thanks [@jxom](https://github.com/jxom)! - Fixed issue where `null` gas would accidentally pass through.\n\n- Updated dependencies [[`b8bbb409f4934538e3dd6cac5aaf7346292d0693`](https://github.com/wevm/wagmi/commit/b8bbb409f4934538e3dd6cac5aaf7346292d0693)]:\n  - @wagmi/core@2.15.1\n  - @wagmi/connectors@5.5.1\n\n## 0.0.65\n\n### Minor Changes\n\n- [#4417](https://github.com/wevm/wagmi/pull/4417) [`42e65ea4fea99c639817088bba915e0933d17141`](https://github.com/wevm/wagmi/commit/42e65ea4fea99c639817088bba915e0933d17141) Thanks [@jxom](https://github.com/jxom)! - Removed simulation in `writeContract` & `sendTransaction`.\n\n### Patch Changes\n\n- Updated dependencies [[`42e65ea4fea99c639817088bba915e0933d17141`](https://github.com/wevm/wagmi/commit/42e65ea4fea99c639817088bba915e0933d17141)]:\n  - @wagmi/connectors@6.0.0\n  - @wagmi/core@2.15.0\n\n## 0.0.64\n\n### Patch Changes\n\n- Updated dependencies [[`7ca62b44cd997d48f92c2b81343726a5908aa00b`](https://github.com/wevm/wagmi/commit/7ca62b44cd997d48f92c2b81343726a5908aa00b)]:\n  - @wagmi/connectors@5.4.0\n\n## 0.0.63\n\n### Patch Changes\n\n- Updated dependencies [[`a13aa8d7c38eb3cc8171a02d6302e6d12cf6bcb3`](https://github.com/wevm/wagmi/commit/a13aa8d7c38eb3cc8171a02d6302e6d12cf6bcb3), [`a13aa8d7c38eb3cc8171a02d6302e6d12cf6bcb3`](https://github.com/wevm/wagmi/commit/a13aa8d7c38eb3cc8171a02d6302e6d12cf6bcb3)]:\n  - @wagmi/core@2.14.6\n  - @wagmi/connectors@5.3.10\n\n## 0.0.62\n\n### Patch Changes\n\n- Updated dependencies [[`b12a04eeec985c48d2feac94b011d41fb29ca23e`](https://github.com/wevm/wagmi/commit/b12a04eeec985c48d2feac94b011d41fb29ca23e)]:\n  - @wagmi/connectors@5.3.9\n\n## 0.0.61\n\n### Patch Changes\n\n- Updated dependencies [[`6b9bbacdc7bffd44fc2165362a5e65fd434e7646`](https://github.com/wevm/wagmi/commit/6b9bbacdc7bffd44fc2165362a5e65fd434e7646), [`dac62dc99a0679fa632a0fae49873d6053d06b35`](https://github.com/wevm/wagmi/commit/dac62dc99a0679fa632a0fae49873d6053d06b35)]:\n  - @wagmi/core@2.14.5\n  - @wagmi/connectors@5.3.8\n\n## 0.0.60\n\n### Patch Changes\n\n- Updated dependencies [[`e08681c81fbdf475213e2d0f4c5517d0abf4e743`](https://github.com/wevm/wagmi/commit/e08681c81fbdf475213e2d0f4c5517d0abf4e743)]:\n  - @wagmi/core@2.14.4\n  - @wagmi/connectors@5.3.7\n\n## 0.0.59\n\n### Patch Changes\n\n- Updated dependencies [[`7558ff3133c11bc4c49473d08ee9a47eaa12df5b`](https://github.com/wevm/wagmi/commit/7558ff3133c11bc4c49473d08ee9a47eaa12df5b)]:\n  - @wagmi/connectors@5.3.6\n\n## 0.0.58\n\n### Patch Changes\n\n- Updated dependencies [[`cb7dd2ebb871d0be8f1a11a8cd8ce592cd74b7c7`](https://github.com/wevm/wagmi/commit/cb7dd2ebb871d0be8f1a11a8cd8ce592cd74b7c7), [`7fe78f2d09778fc01fd0cffe85ba198e64999275`](https://github.com/wevm/wagmi/commit/7fe78f2d09778fc01fd0cffe85ba198e64999275)]:\n  - @wagmi/core@2.14.3\n  - @wagmi/connectors@5.3.5\n\n## 0.0.57\n\n### Patch Changes\n\n- Updated dependencies [[`b6861a4c378dab78d8751ae0ac2aa425f3c24b8f`](https://github.com/wevm/wagmi/commit/b6861a4c378dab78d8751ae0ac2aa425f3c24b8f), [`d0d0963bb5904a15cf0355862d62dd141ce0c31c`](https://github.com/wevm/wagmi/commit/d0d0963bb5904a15cf0355862d62dd141ce0c31c), [`ecac0ba36243d94c9199d0bd21937104c835d9a0`](https://github.com/wevm/wagmi/commit/ecac0ba36243d94c9199d0bd21937104c835d9a0)]:\n  - @wagmi/connectors@5.3.4\n  - @wagmi/core@2.14.2\n\n## 0.0.56\n\n### Patch Changes\n\n- Updated dependencies [[`83c6d16b7d6dddfa6bda036e04f00ec313c6248c`](https://github.com/wevm/wagmi/commit/83c6d16b7d6dddfa6bda036e04f00ec313c6248c)]:\n  - @wagmi/connectors@5.3.3\n\n## 0.0.55\n\n### Patch Changes\n\n- Updated dependencies [[`8970cc51398e1ac713435533096215c6d31ffdf9`](https://github.com/wevm/wagmi/commit/8970cc51398e1ac713435533096215c6d31ffdf9)]:\n  - @wagmi/connectors@5.3.2\n\n## 0.0.54\n\n### Patch Changes\n\n- Updated dependencies [[`052e72e1f8c1c14fcbdce04a9f8fa7ec28d83702`](https://github.com/wevm/wagmi/commit/052e72e1f8c1c14fcbdce04a9f8fa7ec28d83702), [`b250fc21ee577b2a75c5a34ff684f62fb4ad771a`](https://github.com/wevm/wagmi/commit/b250fc21ee577b2a75c5a34ff684f62fb4ad771a)]:\n  - @wagmi/core@2.14.1\n  - @wagmi/connectors@5.3.1\n\n## 0.0.53\n\n### Patch Changes\n\n- Updated dependencies [[`f43e074f473820b208a6295d7c97f847332f1a1d`](https://github.com/wevm/wagmi/commit/f43e074f473820b208a6295d7c97f847332f1a1d)]:\n  - @wagmi/connectors@6.0.0\n  - @wagmi/core@2.14.0\n\n## 0.0.52\n\n### Patch Changes\n\n- Updated dependencies [[`c05caabc20c3ced9682cfc7ba1f3f7dcfece0703`](https://github.com/wevm/wagmi/commit/c05caabc20c3ced9682cfc7ba1f3f7dcfece0703), [`5ae49af590ff168426c9c283d54c34ae5148fcd9`](https://github.com/wevm/wagmi/commit/5ae49af590ff168426c9c283d54c34ae5148fcd9), [`f3182b22e6e454d9bd74f1b940ef34431fd9555d`](https://github.com/wevm/wagmi/commit/f3182b22e6e454d9bd74f1b940ef34431fd9555d)]:\n  - @wagmi/core@2.13.9\n  - @wagmi/connectors@5.2.2\n\n## 0.0.51\n\n### Patch Changes\n\n- Updated dependencies [[`91a40f2db08e3a91db421b8732a5511a1e6c88fd`](https://github.com/wevm/wagmi/commit/91a40f2db08e3a91db421b8732a5511a1e6c88fd)]:\n  - @wagmi/connectors@5.2.1\n\n## 0.0.50\n\n### Patch Changes\n\n- Updated dependencies [[`34a0c3b7eea778aee7c27f7ace5e4b2be4e8a0a4`](https://github.com/wevm/wagmi/commit/34a0c3b7eea778aee7c27f7ace5e4b2be4e8a0a4)]:\n  - @wagmi/connectors@5.2.0\n\n## 0.0.49\n\n### Patch Changes\n\n- Updated dependencies [[`3b2123664b7ac66848390739e855c3b9702ab60c`](https://github.com/wevm/wagmi/commit/3b2123664b7ac66848390739e855c3b9702ab60c)]:\n  - @wagmi/connectors@5.1.15\n\n## 0.0.48\n\n### Patch Changes\n\n- Updated dependencies [[`56f2482508f2ba71bd6b0295c70c6abca7101e57`](https://github.com/wevm/wagmi/commit/56f2482508f2ba71bd6b0295c70c6abca7101e57)]:\n  - @wagmi/connectors@5.1.14\n  - @wagmi/core@2.13.8\n\n## 0.0.47\n\n### Patch Changes\n\n- Updated dependencies [[`be75c2d4ef636d7362420ab0a106bfdf63f5d1e6`](https://github.com/wevm/wagmi/commit/be75c2d4ef636d7362420ab0a106bfdf63f5d1e6)]:\n  - @wagmi/core@2.13.7\n  - @wagmi/connectors@5.1.13\n\n## 0.0.46\n\n### Patch Changes\n\n- Updated dependencies [[`edcbf5d6fbe92f639bead800502edda9e0aa39f1`](https://github.com/wevm/wagmi/commit/edcbf5d6fbe92f639bead800502edda9e0aa39f1)]:\n  - @wagmi/core@2.13.6\n  - @wagmi/connectors@5.1.12\n\n## 0.0.45\n\n### Patch Changes\n\n- Updated dependencies [[`82404c960e04c83e0bae6e1e12459ef9debf9554`](https://github.com/wevm/wagmi/commit/82404c960e04c83e0bae6e1e12459ef9debf9554), [`d07ad7f63a018256908a673d078aaf79e47ac703`](https://github.com/wevm/wagmi/commit/d07ad7f63a018256908a673d078aaf79e47ac703)]:\n  - @wagmi/connectors@5.1.11\n\n## 0.0.44\n\n### Patch Changes\n\n- [#4262](https://github.com/wevm/wagmi/pull/4262) [`8531f83db3a1fbb8202c3e426b7f85679f587a52`](https://github.com/wevm/wagmi/commit/8531f83db3a1fbb8202c3e426b7f85679f587a52) Thanks [@nezouse](https://github.com/nezouse)! - Added experimental actions entrypoint.\n\n## 0.0.43\n\n### Patch Changes\n\n- [#4260](https://github.com/wevm/wagmi/pull/4260) [`969a208a110b760a13fd7263360320f52440a9b6`](https://github.com/wevm/wagmi/commit/969a208a110b760a13fd7263360320f52440a9b6) Thanks [@tmm](https://github.com/tmm)! - Fixed `useReadContract` deployless reads support.\n\n- [#4259](https://github.com/wevm/wagmi/pull/4259) [`f47ce8f6d263e49fdff90b8edb3190142d2657bb`](https://github.com/wevm/wagmi/commit/f47ce8f6d263e49fdff90b8edb3190142d2657bb) Thanks [@tmm](https://github.com/tmm)! - Disabled `useConnectorClient` during reconnection if connector is not fully restored.\n\n- Updated dependencies [[`81de006e66121a18c61945c1f9b8426c83a5713c`](https://github.com/wevm/wagmi/commit/81de006e66121a18c61945c1f9b8426c83a5713c), [`f47ce8f6d263e49fdff90b8edb3190142d2657bb`](https://github.com/wevm/wagmi/commit/f47ce8f6d263e49fdff90b8edb3190142d2657bb)]:\n  - @wagmi/connectors@5.1.10\n  - @wagmi/core@2.13.5\n\n## 0.0.42\n\n### Patch Changes\n\n- [#4252](https://github.com/wevm/wagmi/pull/4252) [`67defb516bbd9b2c7b03e376ecd3aca8a001d065`](https://github.com/wevm/wagmi/commit/67defb516bbd9b2c7b03e376ecd3aca8a001d065) Thanks [@tmm](https://github.com/tmm)! - Added `useWatchContractEvent`.\n\n## 0.0.41\n\n### Patch Changes\n\n- Updated dependencies [[`21bd0e473d374cbbd7a01bececa6022d529026ba`](https://github.com/wevm/wagmi/commit/21bd0e473d374cbbd7a01bececa6022d529026ba), [`5c89c6853e616437a3be2b019db895451fecfb3c`](https://github.com/wevm/wagmi/commit/5c89c6853e616437a3be2b019db895451fecfb3c)]:\n  - @wagmi/connectors@5.1.9\n\n## 0.0.40\n\n### Patch Changes\n\n- Updated dependencies [[`b580ad4edff1721e0b9d138cf5ae2ec74d2374c7`](https://github.com/wevm/wagmi/commit/b580ad4edff1721e0b9d138cf5ae2ec74d2374c7)]:\n  - @wagmi/connectors@5.1.8\n\n## 0.0.39\n\n### Patch Changes\n\n- Updated dependencies [[`91fd81a068789c5020e891f539bcad8f54a7a52f`](https://github.com/wevm/wagmi/commit/91fd81a068789c5020e891f539bcad8f54a7a52f)]:\n  - @wagmi/connectors@5.1.7\n\n## 0.0.38\n\n### Patch Changes\n\n- Updated dependencies [[`3168616298cbb6135d0ffda771cba4126e83eba8`](https://github.com/wevm/wagmi/commit/3168616298cbb6135d0ffda771cba4126e83eba8), [`d7608ef9a79459465dc8c06a2ab740465c881907`](https://github.com/wevm/wagmi/commit/d7608ef9a79459465dc8c06a2ab740465c881907)]:\n  - @wagmi/connectors@5.1.6\n\n## 0.0.37\n\n### Patch Changes\n\n- Updated dependencies [[`b4c8971788c70b09479946ecfa998cff2f1b3953`](https://github.com/wevm/wagmi/commit/b4c8971788c70b09479946ecfa998cff2f1b3953)]:\n  - @wagmi/core@2.13.4\n  - @wagmi/connectors@5.1.5\n\n## 0.0.36\n\n### Patch Changes\n\n- Updated dependencies [[`871dbdbfe59ac8ad01d1ec6150ea7b091b7b7de4`](https://github.com/wevm/wagmi/commit/871dbdbfe59ac8ad01d1ec6150ea7b091b7b7de4)]:\n  - @wagmi/core@2.13.3\n  - @wagmi/connectors@5.1.4\n\n## 0.0.35\n\n### Patch Changes\n\n- Updated dependencies [[`1b9b523fa9b9dfe839aecdf4b40caa9547d7e594`](https://github.com/wevm/wagmi/commit/1b9b523fa9b9dfe839aecdf4b40caa9547d7e594)]:\n  - @wagmi/core@2.13.2\n  - @wagmi/connectors@5.1.3\n\n## 0.0.34\n\n### Patch Changes\n\n- Updated dependencies [[`abb490dac4f0f02f46cb0878e7ca9a0db6aada56`](https://github.com/wevm/wagmi/commit/abb490dac4f0f02f46cb0878e7ca9a0db6aada56), [`28e0e5c9a4f856583f9d36a807502bd51a0c6ec2`](https://github.com/wevm/wagmi/commit/28e0e5c9a4f856583f9d36a807502bd51a0c6ec2)]:\n  - @wagmi/connectors@5.1.2\n\n## 0.0.33\n\n### Patch Changes\n\n- Updated dependencies [[`07c1227f306d0efb9421d4bb77a774f92f5fcf45`](https://github.com/wevm/wagmi/commit/07c1227f306d0efb9421d4bb77a774f92f5fcf45)]:\n  - @wagmi/core@2.13.1\n  - @wagmi/connectors@5.1.1\n\n## 0.0.32\n\n### Patch Changes\n\n- [#4162](https://github.com/wevm/wagmi/pull/4162) [`a73a7737b756886b388f120ae423e72cca53e8a0`](https://github.com/wevm/wagmi/commit/a73a7737b756886b388f120ae423e72cca53e8a0) Thanks [@jxom](https://github.com/jxom)! - Added functionality for consumer-defined RPC URLs (`config.transports`) to be propagated to the WalletConnect & MetaMask Connectors.\n\n- Updated dependencies [[`a73a7737b756886b388f120ae423e72cca53e8a0`](https://github.com/wevm/wagmi/commit/a73a7737b756886b388f120ae423e72cca53e8a0)]:\n  - @wagmi/connectors@6.0.0\n  - @wagmi/core@2.13.0\n\n## 0.0.31\n\n### Patch Changes\n\n- [#4124](https://github.com/wevm/wagmi/pull/4124) [`26616462db2e0140025f22c505c4541cfecb9308`](https://github.com/wevm/wagmi/commit/26616462db2e0140025f22c505c4541cfecb9308) Thanks [@t0rbik](https://github.com/t0rbik)! - Updated `useConnectorClient` to be enabled when status is `'reconnecting'` or `'connected'` (previously was also enabled when status was `'connecting'`).\n\n## 0.0.30\n\n### Patch Changes\n\n- Updated dependencies [[`5bc8c8877810b2eec24a829df87dce40a51e6f20`](https://github.com/wevm/wagmi/commit/5bc8c8877810b2eec24a829df87dce40a51e6f20), [`8d81df5cc884d0a210dedd3c1ea0e2e9e52b83c5`](https://github.com/wevm/wagmi/commit/8d81df5cc884d0a210dedd3c1ea0e2e9e52b83c5)]:\n  - @wagmi/core@2.12.2\n  - @wagmi/connectors@5.0.26\n\n## 0.0.29\n\n### Patch Changes\n\n- [#4146](https://github.com/wevm/wagmi/pull/4146) [`cc996e08e930c9e88cf753a1e874652059e81a3b`](https://github.com/wevm/wagmi/commit/cc996e08e930c9e88cf753a1e874652059e81a3b) Thanks [@jxom](https://github.com/jxom)! - Updated `@safe-global/safe-apps-sdk` + `@safe-global/safe-apps-provider` dependencies.\n\n- Updated dependencies [[`cc996e08e930c9e88cf753a1e874652059e81a3b`](https://github.com/wevm/wagmi/commit/cc996e08e930c9e88cf753a1e874652059e81a3b)]:\n  - @wagmi/connectors@5.0.25\n  - @wagmi/core@2.12.1\n\n## 0.0.28\n\n### Patch Changes\n\n- [`b6cb1477e3e87984917b172a909f1968e0d77dc9`](https://github.com/wevm/wagmi/commit/b6cb1477e3e87984917b172a909f1968e0d77dc9) Thanks [@tmm](https://github.com/tmm)! - Added `useBytecode` composable.\n\n- Updated dependencies [[`5581a810ef70308e99c6f8b630cd4bca59f64afc`](https://github.com/wevm/wagmi/commit/5581a810ef70308e99c6f8b630cd4bca59f64afc)]:\n  - @wagmi/core@2.12.0\n  - @wagmi/connectors@6.0.0\n\n## 0.0.27\n\n### Patch Changes\n\n- [`d3814ab4b88f9f0e052b53bc3d458df87b43f01d`](https://github.com/wevm/wagmi/commit/d3814ab4b88f9f0e052b53bc3d458df87b43f01d) Thanks [@jxom](https://github.com/jxom)! - Updated `mipd` dependency.\n\n- Updated dependencies [[`b08013eaa9ce97c02f8a7128ea400e3da7ef74bb`](https://github.com/wevm/wagmi/commit/b08013eaa9ce97c02f8a7128ea400e3da7ef74bb), [`d3814ab4b88f9f0e052b53bc3d458df87b43f01d`](https://github.com/wevm/wagmi/commit/d3814ab4b88f9f0e052b53bc3d458df87b43f01d)]:\n  - @wagmi/core@2.11.8\n  - @wagmi/connectors@5.0.23\n\n## 0.0.26\n\n### Patch Changes\n\n- Updated dependencies [[`0bb8b562ae04ecfeb2d6b2f1b980ebae31dc127e`](https://github.com/wevm/wagmi/commit/0bb8b562ae04ecfeb2d6b2f1b980ebae31dc127e)]:\n  - @wagmi/connectors@5.0.22\n  - @wagmi/core@2.11.7\n\n## 0.0.25\n\n### Patch Changes\n\n- [#4060](https://github.com/wevm/wagmi/pull/4060) [`95965c1f19d480b97f2b297a077a9e607dee32ad`](https://github.com/wevm/wagmi/commit/95965c1f19d480b97f2b297a077a9e607dee32ad) Thanks [@dalechyn](https://github.com/dalechyn)! - Bumped Tanstack Query dependencies to fix typing issues between exported Wagmi query options and TanStack Query suspense query methods (due to [`direction` property in `QueryFunctionContext` being deprecated](https://github.com/TanStack/query/pull/7410)).\n\n- Updated dependencies [[`ff0760b5900114bcfdf420a9fba3cc278ac95afe`](https://github.com/wevm/wagmi/commit/ff0760b5900114bcfdf420a9fba3cc278ac95afe), [`95965c1f19d480b97f2b297a077a9e607dee32ad`](https://github.com/wevm/wagmi/commit/95965c1f19d480b97f2b297a077a9e607dee32ad)]:\n  - @wagmi/connectors@5.0.21\n  - @wagmi/core@2.11.6\n\n## 0.0.24\n\n### Patch Changes\n\n- Updated dependencies [[`43fa971d34cac57fa5a2898ad4d839b95d7af37c`](https://github.com/wevm/wagmi/commit/43fa971d34cac57fa5a2898ad4d839b95d7af37c)]:\n  - @wagmi/connectors@5.0.20\n\n## 0.0.23\n\n### Patch Changes\n\n- Updated dependencies [[`b7ad208030d9f2e3f89912ff76b16cdbd848feda`](https://github.com/wevm/wagmi/commit/b7ad208030d9f2e3f89912ff76b16cdbd848feda)]:\n  - @wagmi/connectors@5.0.19\n\n## 0.0.22\n\n### Patch Changes\n\n- Updated dependencies [[`44d24620c9e3957f3245d14d6a042736371df70b`](https://github.com/wevm/wagmi/commit/44d24620c9e3957f3245d14d6a042736371df70b)]:\n  - @wagmi/connectors@5.0.18\n\n## 0.0.21\n\n### Patch Changes\n\n- Updated dependencies [[`04f2b846b113f3d300d82c9fa75212f1805817c5`](https://github.com/wevm/wagmi/commit/04f2b846b113f3d300d82c9fa75212f1805817c5)]:\n  - @wagmi/core@2.11.5\n  - @wagmi/connectors@5.0.17\n\n## 0.0.20\n\n### Patch Changes\n\n- Updated dependencies [[`9e8345cd56186b997b5e56deaa2cfc69b30d15f6`](https://github.com/wevm/wagmi/commit/9e8345cd56186b997b5e56deaa2cfc69b30d15f6), [`02c38c28d1aa0ad7a61c33775de603ed974c5c1b`](https://github.com/wevm/wagmi/commit/02c38c28d1aa0ad7a61c33775de603ed974c5c1b)]:\n  - @wagmi/core@2.11.4\n  - @wagmi/connectors@5.0.16\n\n## 0.0.19\n\n### Patch Changes\n\n- Updated dependencies [[`8974e6269bb5d7bfaa90db0246bc7d13e8bff798`](https://github.com/wevm/wagmi/commit/8974e6269bb5d7bfaa90db0246bc7d13e8bff798)]:\n  - @wagmi/core@2.11.3\n  - @wagmi/connectors@5.0.15\n\n## 0.0.18\n\n### Patch Changes\n\n- Updated dependencies [[`b4d9ef79deb554ee20fed6666a474be5e7cdd522`](https://github.com/wevm/wagmi/commit/b4d9ef79deb554ee20fed6666a474be5e7cdd522)]:\n  - @wagmi/core@2.11.2\n  - @wagmi/connectors@5.0.14\n\n## 0.0.17\n\n### Patch Changes\n\n- Updated dependencies [[`9c862d8d63e3d692a22cef2a90782b74a9103f17`](https://github.com/wevm/wagmi/commit/9c862d8d63e3d692a22cef2a90782b74a9103f17)]:\n  - @wagmi/connectors@5.0.13\n  - @wagmi/core@2.11.1\n\n## 0.0.16\n\n### Patch Changes\n\n- Updated dependencies [[`06bb598a7f04c7b167f5b7ff6d46bd15886a6a14`](https://github.com/wevm/wagmi/commit/06bb598a7f04c7b167f5b7ff6d46bd15886a6a14), [`24a45b269bd0214a29d6f82a84ac66ef8c3f3822`](https://github.com/wevm/wagmi/commit/24a45b269bd0214a29d6f82a84ac66ef8c3f3822)]:\n  - @wagmi/core@2.11.0\n  - @wagmi/connectors@6.0.0\n\n## 0.0.15\n\n### Patch Changes\n\n- Updated dependencies [[`f2a7cefab96691ebed8b8e45ffde071c47b58dbe`](https://github.com/wevm/wagmi/commit/f2a7cefab96691ebed8b8e45ffde071c47b58dbe), [`f0ea0b2a7fe193dadfeb49a4c8031ee451c638b5`](https://github.com/wevm/wagmi/commit/f0ea0b2a7fe193dadfeb49a4c8031ee451c638b5), [`e3b124ce414b8fd1b2214e2c5a28dc72158a13d1`](https://github.com/wevm/wagmi/commit/e3b124ce414b8fd1b2214e2c5a28dc72158a13d1)]:\n  - @wagmi/core@2.10.6\n  - @wagmi/connectors@5.0.11\n\n## 0.0.14\n\n### Patch Changes\n\n- Updated dependencies [[`560952acd4bfe33db6c7c07b35c613cef278677c`](https://github.com/wevm/wagmi/commit/560952acd4bfe33db6c7c07b35c613cef278677c)]:\n  - @wagmi/connectors@5.0.10\n\n## 0.0.13\n\n### Patch Changes\n\n- Updated dependencies [[`32cdd7b7dc5aff916c040628519562c3a99d418d`](https://github.com/wevm/wagmi/commit/32cdd7b7dc5aff916c040628519562c3a99d418d)]:\n  - @wagmi/connectors@5.0.9\n\n## 0.0.12\n\n### Patch Changes\n\n- Updated dependencies [[`c1952d1ff7f0a491dc88595a49159451b07b5621`](https://github.com/wevm/wagmi/commit/c1952d1ff7f0a491dc88595a49159451b07b5621)]:\n  - @wagmi/connectors@5.0.8\n\n## 0.0.11\n\n### Patch Changes\n\n- Updated dependencies [[`030c7c2cb380dfd67a2182f62e2aa7a6e1601898`](https://github.com/wevm/wagmi/commit/030c7c2cb380dfd67a2182f62e2aa7a6e1601898)]:\n  - @wagmi/core@2.10.5\n  - @wagmi/connectors@5.0.7\n\n## 0.0.10\n\n### Patch Changes\n\n- Updated dependencies [[`51fde8a0433b4fff357c1a8d7e08b41b4c86c968`](https://github.com/wevm/wagmi/commit/51fde8a0433b4fff357c1a8d7e08b41b4c86c968)]:\n  - @wagmi/core@2.10.4\n  - @wagmi/connectors@5.0.6\n\n## 0.0.9\n\n### Patch Changes\n\n- Updated dependencies [[`70dd28669dd8d2ce08217cd02e29a8fbba7a08d4`](https://github.com/wevm/wagmi/commit/70dd28669dd8d2ce08217cd02e29a8fbba7a08d4)]:\n  - @wagmi/connectors@5.0.5\n\n## 0.0.8\n\n### Patch Changes\n\n- Updated dependencies [[`be9e1b8a9818b92eb0654a20d9471e9e39329e7e`](https://github.com/wevm/wagmi/commit/be9e1b8a9818b92eb0654a20d9471e9e39329e7e)]:\n  - @wagmi/connectors@5.0.4\n\n## 0.0.7\n\n### Patch Changes\n\n- Updated dependencies [[`2804a8a583b1874271154898b4bae38756ef581c`](https://github.com/wevm/wagmi/commit/2804a8a583b1874271154898b4bae38756ef581c), [`2804a8a583b1874271154898b4bae38756ef581c`](https://github.com/wevm/wagmi/commit/2804a8a583b1874271154898b4bae38756ef581c)]:\n  - @wagmi/connectors@5.0.3\n  - @wagmi/core@2.10.3\n\n## 0.0.6\n\n### Patch Changes\n\n- [`ec2f63f106fd468f28b43d3b88ab3e89aaf5e81a`](https://github.com/wevm/wagmi/commit/ec2f63f106fd468f28b43d3b88ab3e89aaf5e81a) Thanks [@tmm](https://github.com/tmm)! - Fixed `useSwitchChain` `chains` typing.\n\n## 0.0.5\n\n### Patch Changes\n\n- [#3940](https://github.com/wevm/wagmi/pull/3940) [`a5071f581dfdfb961718873643a2fc629101c72a`](https://github.com/wevm/wagmi/commit/a5071f581dfdfb961718873643a2fc629101c72a) Thanks [@jxom](https://github.com/jxom)! - Fixed usage of `metaMask` connector in Vite environments.\n\n- Updated dependencies [[`a5071f581dfdfb961718873643a2fc629101c72a`](https://github.com/wevm/wagmi/commit/a5071f581dfdfb961718873643a2fc629101c72a)]:\n  - @wagmi/connectors@5.0.2\n  - @wagmi/core@2.10.2\n\n## 0.0.4\n\n### Patch Changes\n\n- Updated dependencies []:\n  - @wagmi/connectors@5.0.1\n  - @wagmi/core@2.10.1\n\n## 0.0.3\n\n### Patch Changes\n\n- Updated dependencies [[`3117e71825f9c58a0d718f3d1686f1a191fa9cb1`](https://github.com/wevm/wagmi/commit/3117e71825f9c58a0d718f3d1686f1a191fa9cb1), [`3117e71825f9c58a0d718f3d1686f1a191fa9cb1`](https://github.com/wevm/wagmi/commit/3117e71825f9c58a0d718f3d1686f1a191fa9cb1)]:\n  - @wagmi/connectors@5.0.0\n  - @wagmi/core@2.10.0\n\n## 0.0.2\n\n### Patch Changes\n\n- [#3906](https://github.com/wevm/wagmi/pull/3906) [`32fcb4a31dde6b0206961d8ffe9c651f8a459c67`](https://github.com/wevm/wagmi/commit/32fcb4a31dde6b0206961d8ffe9c651f8a459c67) Thanks [@tmm](https://github.com/tmm)! - Added support for Vue.\n\n- Updated dependencies [[`32fcb4a31dde6b0206961d8ffe9c651f8a459c67`](https://github.com/wevm/wagmi/commit/32fcb4a31dde6b0206961d8ffe9c651f8a459c67)]:\n  - @wagmi/connectors@4.3.10\n  - @wagmi/core@2.9.8\n"
  },
  {
    "path": "packages/vue/README.md",
    "content": "# @wagmi/vue\n\nVue Composables for Ethereum\n\n## Installation\n\n```bash\npnpm add @wagmi/vue viem @tanstack/vue-query\n```\n\n## Documentation\n\nFor documentation and guides, visit [wagmi.sh](https://wagmi.sh).\n\n"
  },
  {
    "path": "packages/vue/package.json",
    "content": "{\n  \"name\": \"@wagmi/vue\",\n  \"description\": \"Vue Composables for Ethereum\",\n  \"version\": \"0.5.0\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/wevm/wagmi.git\",\n    \"directory\": \"packages/vue\"\n  },\n  \"scripts\": {\n    \"build\": \"pnpm run build:esm+types\",\n    \"build:esm+types\": \"tsc --project tsconfig.build.json --outDir ./dist/esm --declaration --declarationMap --declarationDir ./dist/types\",\n    \"check:types\": \"tsc --noEmit\",\n    \"clean\": \"rm -rf dist tsconfig.tsbuildinfo actions chains connectors nuxt query\",\n    \"test:build\": \"publint --strict && attw --pack --ignore-rules cjs-resolves-to-esm\"\n  },\n  \"files\": [\n    \"dist/**\",\n    \"!dist/**/*.tsbuildinfo\",\n    \"src/**/*.ts\",\n    \"!src/**/*.test.ts\",\n    \"!src/**/*.test-d.ts\",\n    \"/actions\",\n    \"/chains\",\n    \"/connectors\",\n    \"/nuxt\",\n    \"/query\"\n  ],\n  \"sideEffects\": false,\n  \"type\": \"module\",\n  \"main\": \"./dist/esm/exports/index.js\",\n  \"types\": \"./dist/types/exports/index.d.ts\",\n  \"typings\": \"./dist/types/exports/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/types/exports/index.d.ts\",\n      \"default\": \"./dist/esm/exports/index.js\"\n    },\n    \"./actions\": {\n      \"types\": \"./dist/types/exports/actions.d.ts\",\n      \"default\": \"./dist/esm/exports/actions.js\"\n    },\n    \"./chains\": {\n      \"types\": \"./dist/types/exports/chains.d.ts\",\n      \"default\": \"./dist/esm/exports/chains.js\"\n    },\n    \"./connectors\": {\n      \"types\": \"./dist/types/exports/connectors.d.ts\",\n      \"default\": \"./dist/esm/exports/connectors.js\"\n    },\n    \"./nuxt\": {\n      \"types\": \"./dist/types/exports/nuxt.d.ts\",\n      \"default\": \"./dist/esm/exports/nuxt.js\"\n    },\n    \"./query\": {\n      \"types\": \"./dist/types/exports/query.d.ts\",\n      \"default\": \"./dist/esm/exports/query.js\"\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"typesVersions\": {\n    \"*\": {\n      \"actions\": [\n        \"./dist/types/exports/actions.d.ts\"\n      ],\n      \"chains\": [\n        \"./dist/types/exports/chains.d.ts\"\n      ],\n      \"connectors\": [\n        \"./dist/types/exports/connectors.d.ts\"\n      ],\n      \"nuxt\": [\n        \"./dist/types/exports/nuxt.d.ts\"\n      ],\n      \"query\": [\n        \"./dist/types/exports/query.d.ts\"\n      ]\n    }\n  },\n  \"peerDependencies\": {\n    \"@tanstack/vue-query\": \">=5.0.0\",\n    \"nuxt\": \">=3.0.0 || >=4.0.0\",\n    \"typescript\": \">=5.7.3\",\n    \"viem\": \"2.x\",\n    \"vue\": \">=3\"\n  },\n  \"peerDependenciesMeta\": {\n    \"nuxt\": {\n      \"optional\": true\n    },\n    \"typescript\": {\n      \"optional\": true\n    }\n  },\n  \"dependencies\": {\n    \"@wagmi/connectors\": \"workspace:*\",\n    \"@wagmi/core\": \"workspace:*\"\n  },\n  \"devDependencies\": {\n    \"@nuxt/schema\": \"catalog:\",\n    \"@tanstack/vue-query\": \"catalog:\",\n    \"@vue/test-utils\": \"^2.4.6\",\n    \"nuxt\": \"catalog:\",\n    \"vue\": \"catalog:\"\n  },\n  \"contributors\": [\n    \"awkweb.eth <t@wevm.dev>\",\n    \"jxom.eth <j@wevm.dev>\"\n  ],\n  \"funding\": \"https://github.com/sponsors/wevm\",\n  \"keywords\": [\n    \"wagmi\",\n    \"vue\",\n    \"composables\",\n    \"eth\",\n    \"ethereum\",\n    \"dapps\",\n    \"wallet\",\n    \"web3\"\n  ]\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useBalance.test-d.ts",
    "content": "import { expectTypeOf, test } from 'vitest'\nimport type { Ref } from 'vue'\n\nimport { useBalance } from './useBalance.js'\n\ntest('select data', () => {\n  const result = useBalance({\n    query: {\n      select(data) {\n        return data?.value\n      },\n    },\n  })\n  expectTypeOf(result.data).toEqualTypeOf<Ref<bigint> | Ref<undefined>>()\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useBalance.test.ts",
    "content": "import { accounts, chain, testClient, wait } from '@wagmi/test'\nimport { renderComposable, waitFor } from '@wagmi/test/vue'\nimport { parseEther } from 'viem'\nimport { beforeEach, expect, test } from 'vitest'\n\nimport { ref } from 'vue'\nimport { useBalance } from './useBalance.js'\n\nconst address = accounts[0]\n\nbeforeEach(async () => {\n  await testClient.mainnet.setBalance({ address, value: parseEther('10000') })\n  await testClient.mainnet.mine({ blocks: 1 })\n  await testClient.mainnet2.setBalance({ address, value: parseEther('69') })\n  await testClient.mainnet2.mine({ blocks: 1 })\n})\n\ntest('default', async () => {\n  const [query] = renderComposable(() => useBalance({ address }))\n\n  await waitFor(query.isSuccess)\n\n  expect(query.data.value).toMatchObject(\n    expect.objectContaining({\n      decimals: expect.any(Number),\n      symbol: expect.any(String),\n      value: expect.any(BigInt),\n    }),\n  )\n})\n\ntest('parameters: chainId', async () => {\n  const [query] = renderComposable(() =>\n    useBalance({ address, chainId: chain.mainnet2.id }),\n  )\n\n  await waitFor(query.isSuccess)\n\n  expect(query.data.value).toMatchInlineSnapshot(`\n    {\n      \"decimals\": 18,\n      \"symbol\": \"WAG\",\n      \"value\": 69000000000000000000n,\n    }\n  `)\n})\n\ntest('behavior: address: undefined -> defined', async () => {\n  const address = ref()\n\n  const [query] = renderComposable(() => useBalance({ address }))\n\n  await wait(100)\n  expect(query.fetchStatus.value).toMatchInlineSnapshot(`\"idle\"`)\n\n  address.value = accounts[0]\n\n  await waitFor(query.isSuccess)\n\n  expect(query.data.value).toMatchInlineSnapshot(`\n    {\n      \"decimals\": 18,\n      \"symbol\": \"ETH\",\n      \"value\": 10000000000000000000000n,\n    }\n  `)\n})\n\ntest('behavior: disabled when properties missing', async () => {\n  const [query] = renderComposable(() => useBalance({ address }))\n\n  await wait(100)\n\n  expect(query.fetchStatus.value).toMatchInlineSnapshot(`\"idle\"`)\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useBalance.ts",
    "content": "import type { Config, GetBalanceErrorType, ResolvedRegister } from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetBalanceData,\n  type GetBalanceOptions,\n  getBalanceQueryOptions,\n} from '@wagmi/core/query'\nimport { computed } from 'vue'\nimport type { DeepMaybeRef } from '../types/ref.js'\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseBalanceParameters<\n  config extends Config = Config,\n  selectData = GetBalanceData,\n> = Compute<\n  DeepMaybeRef<GetBalanceOptions<config, selectData> & ConfigParameter<config>>\n>\n\nexport type UseBalanceReturnType<selectData = GetBalanceData> =\n  UseQueryReturnType<selectData, GetBalanceErrorType>\n\n/** https://wagmi.sh/vue/api/composables/useBalance */\nexport function useBalance<\n  config extends Config = ResolvedRegister['config'],\n  selectData = GetBalanceData,\n>(\n  parameters: UseBalanceParameters<config, selectData> = {},\n): UseBalanceReturnType<selectData> {\n  const params = computed(() => deepUnref(parameters))\n  const config = useConfig(params)\n  const chainId = useChainId({ config })\n  const options = computed(() =>\n    getBalanceQueryOptions(config as any, {\n      ...params.value,\n      chainId: params.value.chainId ?? chainId.value,\n    }),\n  )\n  return useQuery(options as any) as any\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useBlockNumber.test-d.ts",
    "content": "import { createConfig, http, webSocket } from '@wagmi/core'\nimport { mainnet, optimism } from '@wagmi/core/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useBlockNumber } from './useBlockNumber.js'\n\ntest('select data', () => {\n  const result = useBlockNumber({\n    query: {\n      select(data) {\n        expectTypeOf(data).toEqualTypeOf<bigint>()\n        return data?.toString()\n      },\n    },\n  })\n  expectTypeOf(result.data.value).toEqualTypeOf<string | undefined>()\n})\n\ntest('differing transports', () => {\n  const config = createConfig({\n    chains: [mainnet, optimism],\n    transports: {\n      [mainnet.id]: http(),\n      [optimism.id]: webSocket(),\n    },\n  })\n\n  useBlockNumber({\n    config,\n    watch: {\n      poll: false,\n    },\n  })\n\n  useBlockNumber({\n    config,\n    chainId: mainnet.id,\n    watch: {\n      poll: true,\n    },\n  })\n  useBlockNumber({\n    config,\n    chainId: mainnet.id,\n    watch: {\n      // @ts-expect-error\n      poll: false,\n    },\n  })\n\n  useBlockNumber({\n    config,\n    chainId: optimism.id,\n    watch: {\n      poll: true,\n    },\n  })\n  useBlockNumber({\n    config,\n    chainId: optimism.id,\n    watch: {\n      poll: false,\n    },\n  })\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useBlockNumber.test.ts",
    "content": "import { config, testClient } from '@wagmi/test'\nimport { renderComposable, waitFor } from '@wagmi/test/vue'\nimport { expect, test } from 'vitest'\nimport { ref } from 'vue'\nimport { useBlockNumber } from './useBlockNumber.js'\n\ntest('default', async () => {\n  await testClient.mainnet.resetFork()\n\n  const [blockNumberQuery] = renderComposable(() => useBlockNumber())\n\n  await waitFor(blockNumberQuery.status, (status) => status === 'success')\n\n  expect(blockNumberQuery.data.value).toMatchInlineSnapshot('23535880n')\n})\n\ntest('parameters: chainId', async () => {\n  config.setState((state) => ({ ...state, chainId: config.chains[0].id }))\n\n  const [blockNumberQuery] = renderComposable(() => useBlockNumber())\n\n  await waitFor(blockNumberQuery.status, (status) => status === 'success')\n  expect(blockNumberQuery.data.value).toBeTypeOf('bigint')\n\n  config.setState((state) => ({ ...state, chainId: config.chains[2].id }))\n\n  await waitFor(blockNumberQuery.status, (status) => status === 'success')\n  expect(blockNumberQuery.data.value).toBeTypeOf('bigint')\n})\n\ntest('parameters: watch', async () => {\n  const [blockNumberQuery] = renderComposable(() =>\n    useBlockNumber({ watch: true }),\n  )\n\n  await waitFor(blockNumberQuery.status, (status) => status === 'success')\n\n  const blockNumber = blockNumberQuery.data.value!\n  await testClient.optimism.mine({ blocks: 1 })\n\n  await waitFor(blockNumberQuery.data, (data) => data === blockNumber + 1n)\n})\n\ntest('parameters: watch (reactive)', async () => {\n  const watch = ref(true)\n\n  const [blockNumberQuery] = renderComposable(() => useBlockNumber({ watch }))\n\n  await waitFor(blockNumberQuery.status, (status) => status === 'success')\n\n  const blockNumber = blockNumberQuery.data.value!\n\n  await testClient.optimism.mine({ blocks: 1 })\n  await waitFor(blockNumberQuery.data, (data) => data === blockNumber + 1n)\n\n  await testClient.optimism.mine({ blocks: 1 })\n  await waitFor(blockNumberQuery.data, (data) => data === blockNumber + 2n)\n\n  watch.value = false\n\n  await testClient.optimism.mine({ blocks: 1 })\n  await waitFor(blockNumberQuery.data, (data) => data === blockNumber + 2n, {\n    timeout: 1_000,\n  })\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useBlockNumber.ts",
    "content": "import { useQueryClient } from '@tanstack/vue-query'\nimport type {\n  Config,\n  GetBlockNumberErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type {\n  Compute,\n  ConfigParameter,\n  UnionCompute,\n  UnionStrictOmit,\n} from '@wagmi/core/internal'\nimport {\n  type GetBlockNumberData,\n  type GetBlockNumberOptions,\n  getBlockNumberQueryOptions,\n} from '@wagmi/core/query'\nimport { computed } from 'vue'\nimport type { DeepMaybeRef, DeepUnwrapRef } from '../types/ref.js'\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\nimport {\n  type UseWatchBlockNumberParameters,\n  useWatchBlockNumber,\n} from './useWatchBlockNumber.js'\n\nexport type UseBlockNumberParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetBlockNumberData,\n> = Compute<\n  DeepMaybeRef<\n    GetBlockNumberOptions<config, chainId, selectData> &\n      ConfigParameter<config> & {\n        watch?:\n          | boolean\n          | UnionCompute<\n              UnionStrictOmit<\n                DeepUnwrapRef<UseWatchBlockNumberParameters<config, chainId>>,\n                'chainId' | 'config' | 'onBlockNumber' | 'onError'\n              >\n            >\n          | undefined\n      }\n  >\n>\n\nexport type UseBlockNumberReturnType<selectData = GetBlockNumberData> =\n  UseQueryReturnType<selectData, GetBlockNumberErrorType>\n\n/** https://wagmi.sh/vue/api/composables/useBlockNumber */\nexport function useBlockNumber<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetBlockNumberData,\n>(\n  parameters: UseBlockNumberParameters<config, chainId, selectData> = {},\n): UseBlockNumberReturnType<selectData> {\n  const params = computed(() => deepUnref(parameters))\n  const config = useConfig(params)\n  const chainId = useChainId({ config })\n  const options = computed(() =>\n    getBlockNumberQueryOptions(config as any, {\n      ...params.value,\n      chainId: params.value.chainId ?? chainId.value,\n    }),\n  )\n\n  const queryClient = useQueryClient()\n  const watchBlockNumberArgs = computed(() => {\n    return {\n      ...({\n        config,\n        chainId: params.value.chainId ?? chainId.value,\n        ...(typeof params.value.watch === 'object' ? params.value.watch : {}),\n      } as UseWatchBlockNumberParameters),\n      enabled:\n        (params.value.query?.enabled ?? true) &&\n        (typeof params.value.watch === 'object'\n          ? params.value.watch.enabled\n          : params.value.watch),\n      onBlockNumber(blockNumber) {\n        queryClient.setQueryData(options.value.queryKey, blockNumber)\n      },\n    } satisfies UseWatchBlockNumberParameters\n  })\n  useWatchBlockNumber(watchBlockNumberArgs)\n\n  return useQuery(options as any) as any\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useBytecode.test-d.ts",
    "content": "import type { Hex } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useBytecode } from './useBytecode.js'\n\ntest('select data', () => {\n  const result = useBytecode({\n    query: {\n      select(data) {\n        expectTypeOf(data).toEqualTypeOf<Hex | undefined>()\n        return data\n      },\n    },\n  })\n  expectTypeOf(result.data.value).toEqualTypeOf<Hex | undefined>()\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useBytecode.test.ts",
    "content": "import { address, chain, wait } from '@wagmi/test'\nimport { renderComposable, waitFor } from '@wagmi/test/vue'\nimport { expect, test } from 'vitest'\n\nimport { ref } from 'vue'\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { useBytecode } from './useBytecode.js'\n\ntest('default', async () => {\n  const [result] = renderComposable(() =>\n    useBytecode({\n      address: address.wagmiMintExample,\n    }),\n  )\n\n  await waitFor(result.isSuccess)\n\n  expect(deepUnref(result)).toMatchInlineSnapshot(`\n    {\n      \"data\": \"0x608060405234801561001057600080fd5b50600436106101005760003560e01c80636352211e11610097578063a22cb46511610066578063a22cb46514610215578063b88d4fde14610228578063c87b56dd1461023b578063e985e9c51461024e57600080fd5b80636352211e146101d457806370a08231146101e757806395d89b41146101fa578063a0712d681461020257600080fd5b80631249c58b116100d35780631249c58b1461018f57806318160ddd1461019757806323b872dd146101ae57806342842e0e146101c157600080fd5b806301ffc9a71461010557806306fdde031461012d578063081812fc14610142578063095ea7b31461017a575b600080fd5b61011861011336600461178f565b610297565b60405190151581526020015b60405180910390f35b61013561037c565b6040516101249190611829565b61015561015036600461183c565b61040e565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b61018d61018836600461187e565b6104d3565b005b61018d61062b565b6101a060065481565b604051908152602001610124565b61018d6101bc3660046118a8565b61067d565b61018d6101cf3660046118a8565b610704565b6101556101e236600461183c565b61071f565b6101a06101f53660046118e4565b6107b7565b61013561086b565b61018d61021036600461183c565b61087a565b61018d6102233660046118ff565b610902565b61018d61023636600461196a565b610911565b61013561024936600461183c565b61099f565b61011861025c366004611a64565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061032a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061037657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60606000805461038b90611a97565b80601f01602080910402602001604051908101604052809291908181526020018280546103b790611a97565b80156104045780601f106103d957610100808354040283529160200191610404565b820191906000526020600020905b8154815290600101906020018083116103e757829003601f168201915b5050505050905090565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff166104aa5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60006104de8261071f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036105815760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016104a1565b3373ffffffffffffffffffffffffffffffffffffffff821614806105aa57506105aa813361025c565b61061c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016104a1565b6106268383610b07565b505050565b6007545b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16156106615760010161062f565b61066b3382610ba7565b60068054600190810190915501600755565b6106873382610bc1565b6106f95760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016104a1565b610626838383610d17565b61062683838360405180602001604052806000815250610911565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16806103765760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016104a1565b600073ffffffffffffffffffffffffffffffffffffffff82166108425760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016104a1565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b60606001805461038b90611a97565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16156108ec5760405162461bcd60e51b815260206004820152601160248201527f546f6b656e2049442069732074616b656e00000000000000000000000000000060448201526064016104a1565b6108f63382610ba7565b50600680546001019055565b61090d338383610f4a565b5050565b61091b3383610bc1565b61098d5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016104a1565b6109998484848461105d565b50505050565b6040517f666f726567726f756e64000000000000000000000000000000000000000000006020820152602a810182905260609060009061016890604a016040516020818303038152906040528051906020012060001c6109ff9190611b19565b6040517f6261636b67726f756e64000000000000000000000000000000000000000000006020820152602a810185905290915060009061016890604a016040516020818303038152906040528051906020012060001c610a5f9190611b19565b90506000610aba610a6f866110e6565b610aa9610a7b866110e6565b610a84866110e6565b604051602001610a95929190611b2d565b60405160208183030381529060405261121b565b604051602001610a959291906125ba565b9050600081604051602001610acf919061268b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529695505050505050565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190610b618261071f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61090d82826040518060200160405280600081525061136e565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16610c585760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016104a1565b6000610c638361071f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610cd1575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b80610d0f57508373ffffffffffffffffffffffffffffffffffffffff16610cf78461040e565b73ffffffffffffffffffffffffffffffffffffffff16145b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff16610d378261071f565b73ffffffffffffffffffffffffffffffffffffffff1614610dc05760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e657200000000000000000000000000000000000000000000000000000060648201526084016104a1565b73ffffffffffffffffffffffffffffffffffffffff8216610e485760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016104a1565b610e53600082610b07565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120805460019290610e899084906126ff565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805460019290610ec4908490612716565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fc55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016104a1565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611068848484610d17565b611074848484846113f7565b6109995760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016104a1565b60608160000361112957505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611153578061113d8161272e565b915061114c9050600a83612766565b915061112d565b60008167ffffffffffffffff81111561116e5761116e61193b565b6040519080825280601f01601f191660200182016040528015611198576020820181803683370190505b5090505b8415610d0f576111ad6001836126ff565b91506111ba600a86611b19565b6111c5906030612716565b60f81b8183815181106111da576111da61277a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611214600a86612766565b945061119c565b6060815160000361123a57505060408051602081019091526000815290565b600060405180606001604052806040815260200161284d60409139905060006003845160026112699190612716565b6112739190612766565b61127e9060046127a9565b67ffffffffffffffff8111156112965761129661193b565b6040519080825280601f01601f1916602001820160405280156112c0576020820181803683370190505b509050600182016020820185865187015b8082101561132c576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506112d1565b5050600386510660018114611348576002811461135b57611363565b603d6001830353603d6002830353611363565b603d60018303535b509195945050505050565b61137883836115d0565b61138560008484846113f7565b6106265760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016104a1565b600073ffffffffffffffffffffffffffffffffffffffff84163b156115c5576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061146e9033908990889088906004016127e6565b6020604051808303816000875af19250505080156114c7575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526114c49181019061282f565b60015b61157a573d8080156114f5576040519150601f19603f3d011682016040523d82523d6000602084013e6114fa565b606091505b5080516000036115725760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016104a1565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050610d0f565b506001949350505050565b73ffffffffffffffffffffffffffffffffffffffff82166116335760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104a1565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16156116a55760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016104a1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054600192906116db908490612716565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461178c57600080fd5b50565b6000602082840312156117a157600080fd5b81356117ac8161175e565b9392505050565b60005b838110156117ce5781810151838201526020016117b6565b838111156109995750506000910152565b600081518084526117f78160208601602086016117b3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006117ac60208301846117df565b60006020828403121561184e57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461187957600080fd5b919050565b6000806040838503121561189157600080fd5b61189a83611855565b946020939093013593505050565b6000806000606084860312156118bd57600080fd5b6118c684611855565b92506118d460208501611855565b9150604084013590509250925092565b6000602082840312156118f657600080fd5b6117ac82611855565b6000806040838503121561191257600080fd5b61191b83611855565b91506020830135801515811461193057600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000806080858703121561198057600080fd5b61198985611855565b935061199760208601611855565b925060408501359150606085013567ffffffffffffffff808211156119bb57600080fd5b818701915087601f8301126119cf57600080fd5b8135818111156119e1576119e161193b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611a2757611a2761193b565b816040528281528a6020848701011115611a4057600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611a7757600080fd5b611a8083611855565b9150611a8e60208401611855565b90509250929050565b600181811c90821680611aab57607f821691505b602082108103611ae4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611b2857611b28611aea565b500690565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f737667222077696474683d223130323422206865696768743d2231303260208201527f34222066696c6c3d226e6f6e65223e3c706174682066696c6c3d2268736c2800604082015260008351611bb181605f8501602088016117b3565b7f2c20313030252c20313025292220643d224d3020306831303234763130323448605f918401918201527f307a22202f3e3c672066696c6c3d2268736c2800000000000000000000000000607f8201528351611c148160928401602088016117b3565b7f2c20313030252c2039302529223e3c7061746820643d224d393033203433372e609292909101918201527f35633020392e3131332d372e3338382031362e352d31362e352031362e35732d60b28201527f31362e352d372e3338372d31362e352d31362e3520372e3338382d31362e352060d28201527f31362e352d31362e352031362e3520372e3338372031362e352031362e357a4d60f28201527f3639382e3532392035363663362e39323120302031322e35332d352e353936206101128201527f31322e35332d31322e35762d353063302d362e39303420352e3630392d31322e6101328201527f352031322e3532392d31322e356832352e30353963362e393220302031322e356101528201527f323920352e3539362031322e3532392031322e35763530633020362e393034206101728201527f352e3630392031322e352031322e35332031322e357331322e3532392d352e356101928201527f39362031322e3532392d31322e35762d353063302d362e39303420352e3630396101b28201527f2d31322e352031322e35332d31322e356832352e30353963362e3932203020316101d28201527f322e35323920352e3539362031322e3532392031322e35763530633020362e396101f28201527f303420352e3630392031322e352031322e3532392031322e356833372e3538396102128201527f63362e393220302031322e3532392d352e3539362031322e3532392d31322e356102328201527f762d373563302d362e3930342d352e3630392d31322e352d31322e3532392d316102528201527f322e35732d31322e353320352e3539362d31322e35332031322e357635362e326102728201527f3561362e32363420362e3236342030203120312d31322e3532392030563437386102928201527f2e3563302d362e3930342d352e3630392d31322e352d31322e35332d31322e356102b28201527f483639382e353239632d362e393220302d31322e35323920352e3539362d31326102d28201527f2e3532392031322e35763735633020362e39303420352e3630392031322e35206102f28201527f31322e3532392031322e357a22202f3e3c7061746820643d224d3135372e36356103128201527f3520353431632d362e39333220302d31322e3535322d352e3539362d31322e356103328201527f35322d31322e35762d353063302d362e3930342d352e3631392d31322e352d316103528201527f322e3535312d31322e3553313230203437312e35393620313230203437382e356103728201527f763735633020362e39303420352e36322031322e352031322e3535322031322e6103928201527f35683135302e363263362e39333320302031322e3535322d352e3539362031326103b28201527f2e3535322d31322e35762d353063302d362e39303420352e3631392d31322e356103d28201527f2031322e3535322d31322e35683134342e33343563332e343635203020362e326103f28201527f373620322e37393820362e32373620362e3235732d322e38313120362e32352d6104128201527f362e32373620362e3235483332302e383238632d362e39333320302d31322e356104328201527f353220352e3539362d31322e3535322031322e357633372e35633020362e39306104528201527f3420352e3631392031322e352031322e3535322031322e35683135302e3632636104728201527f362e39333320302031322e3535322d352e3539362031322e3535322d31322e356104928201527f762d373563302d362e3930342d352e3631392d31322e352d31322e3535322d316104b28201527f322e35483238332e313732632d362e39333220302d31322e35353120352e35396104d28201527f362d31322e3535312031322e35763530633020362e3930342d352e36313920316104f28201527f322e352d31322e3535322031322e35682d32352e313033632d362e39333320306105128201527f2d31322e3535322d352e3539362d31322e3535322d31322e35762d353063302d6105328201527f362e3930342d352e36322d31322e352d31322e3535322d31322e35732d31322e6105528201527f35353220352e3539362d31322e3535322031322e35763530633020362e3930346105728201527f2d352e3631392031322e352d31322e3535312031322e35682d32352e3130347a6105928201527f6d3330312e3234322d362e3235633020332e3435322d322e38313120362e32356105b28201527f2d362e32373620362e3235483333392e363535632d332e34363520302d362e326105d28201527f37362d322e3739382d362e3237362d362e323573322e3831312d362e323520366105f28201527f2e3237362d362e3235683131322e39363663332e343635203020362e323736206106128201527f322e37393820362e32373620362e32357a4d343937203535332e3831386330206106328201527f362e39323920352e3632382031322e3534362031322e3537312031322e3534366106528201527f6831333261362e323820362e323820302030203120362e32383620362e3237326106728201527f20362e323820362e32382030203020312d362e32383620362e323733682d31336106928201527f32632d362e39343320302d31322e35373120352e3631362d31322e35373120316106b28201527f322e3534364131322e35362031322e3536203020302030203530392e353731206106d28201527f363034683135302e38353863362e39343320302031322e3537312d352e3631366106f28201527f2031322e3537312d31322e353435762d3131322e393163302d362e3932382d356107128201527f2e3632382d31322e3534352d31322e3537312d31322e353435483530392e35376107328201527f31632d362e39343320302d31322e35373120352e3631372d31322e35373120316107528201527f322e3534357637352e3237337a6d33372e3731342d36322e373237632d362e396107728201527f343320302d31322e35373120352e3631372d31322e3537312031322e353435766107928201527f32352e303931633020362e39323920352e3632382031322e3534362031322e356107b28201527f37312031322e353436683130302e35373263362e39343320302031322e3537316107d28201527f2d352e3631372031322e3537312d31322e353436762d32352e30393163302d366107f28201527f2e3932382d352e3632382d31322e3534352d31322e3537312d31322e353435486108128201527f3533342e3731347a222066696c6c2d72756c653d226576656e6f646422202f3e6108328201527f3c2f673e3c2f7376673e0000000000000000000000000000000000000000000061085282015261085c01949350505050565b7f7b226e616d65223a20227761676d6920230000000000000000000000000000008152600083516125f28160118501602088016117b3565b7f222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b6011918401918201527f6261736536342c00000000000000000000000000000000000000000000000000603182015283516126558160388401602088016117b3565b7f227d00000000000000000000000000000000000000000000000000000000000060389290910191820152603a01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516126c381601d8501602087016117b3565b91909101601d0192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612711576127116126d0565b500390565b60008219821115612729576127296126d0565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361275f5761275f6126d0565b5060010190565b60008261277557612775611aea565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156127e1576127e16126d0565b500290565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261282560808301846117df565b9695505050505050565b60006020828403121561284157600080fd5b81516117ac8161175e56fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212201665a4f9111990d7529375848d3fd02c0121091a940da59e763eba826e7b077064736f6c634300080d0033\",\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"getBytecode\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n      \"suspense\": [Function],\n    }\n  `)\n})\n\ntest('parameters: blockNumber', async () => {\n  const [result] = renderComposable(() =>\n    useBytecode({\n      address: address.wagmiMintExample,\n      blockNumber: 15564163n,\n    }),\n  )\n\n  await waitFor(result.isSuccess)\n\n  expect(deepUnref(result)).toMatchInlineSnapshot(`\n    {\n      \"data\": null,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"getBytecode\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"blockNumber\": 15564163n,\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n      \"suspense\": [Function],\n    }\n  `)\n})\n\ntest('parameters: blockTag', async () => {\n  const [result] = renderComposable(() =>\n    useBytecode({\n      address: address.wagmiMintExample,\n      blockTag: 'earliest',\n    }),\n  )\n\n  await waitFor(result.isSuccess)\n\n  expect(deepUnref(result)).toMatchInlineSnapshot(`\n    {\n      \"data\": null,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"getBytecode\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"blockTag\": \"earliest\",\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n      \"suspense\": [Function],\n    }\n  `)\n})\n\ntest('parameters: chainId', async () => {\n  const [result] = renderComposable(() =>\n    useBytecode({\n      address: address.wagmiMintExample,\n      chainId: chain.optimism.id,\n    }),\n  )\n\n  await waitFor(result.isSuccess)\n\n  expect(deepUnref(result)).toMatchInlineSnapshot(`\n    {\n      \"data\": null,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"getBytecode\",\n        {\n          \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n          \"chainId\": 10,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n      \"suspense\": [Function],\n    }\n  `)\n})\n\ntest('behavior: address: undefined -> defined', async () => {\n  const contractAddress = ref()\n\n  const [result] = renderComposable(() =>\n    useBytecode({ address: contractAddress }),\n  )\n\n  await wait(100)\n  expect(result.fetchStatus.value).toBe('idle')\n\n  expect(deepUnref(result)).toMatchInlineSnapshot(`\n    {\n      \"data\": undefined,\n      \"dataUpdatedAt\": 0,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": false,\n      \"isFetchedAfterMount\": false,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": true,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": false,\n      \"isSuccess\": false,\n      \"queryKey\": [\n        \"getBytecode\",\n        {\n          \"address\": undefined,\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"pending\",\n      \"suspense\": [Function],\n    }\n  `)\n\n  contractAddress.value = address.wagmiMintExample\n\n  await waitFor(result.isSuccess)\n\n  expect(deepUnref(result)).toMatchInlineSnapshot(`\n    {\n      \"data\": \"0x608060405234801561001057600080fd5b50600436106101005760003560e01c80636352211e11610097578063a22cb46511610066578063a22cb46514610215578063b88d4fde14610228578063c87b56dd1461023b578063e985e9c51461024e57600080fd5b80636352211e146101d457806370a08231146101e757806395d89b41146101fa578063a0712d681461020257600080fd5b80631249c58b116100d35780631249c58b1461018f57806318160ddd1461019757806323b872dd146101ae57806342842e0e146101c157600080fd5b806301ffc9a71461010557806306fdde031461012d578063081812fc14610142578063095ea7b31461017a575b600080fd5b61011861011336600461178f565b610297565b60405190151581526020015b60405180910390f35b61013561037c565b6040516101249190611829565b61015561015036600461183c565b61040e565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b61018d61018836600461187e565b6104d3565b005b61018d61062b565b6101a060065481565b604051908152602001610124565b61018d6101bc3660046118a8565b61067d565b61018d6101cf3660046118a8565b610704565b6101556101e236600461183c565b61071f565b6101a06101f53660046118e4565b6107b7565b61013561086b565b61018d61021036600461183c565b61087a565b61018d6102233660046118ff565b610902565b61018d61023636600461196a565b610911565b61013561024936600461183c565b61099f565b61011861025c366004611a64565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061032a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061037657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60606000805461038b90611a97565b80601f01602080910402602001604051908101604052809291908181526020018280546103b790611a97565b80156104045780601f106103d957610100808354040283529160200191610404565b820191906000526020600020905b8154815290600101906020018083116103e757829003601f168201915b5050505050905090565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff166104aa5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60006104de8261071f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036105815760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016104a1565b3373ffffffffffffffffffffffffffffffffffffffff821614806105aa57506105aa813361025c565b61061c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016104a1565b6106268383610b07565b505050565b6007545b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16156106615760010161062f565b61066b3382610ba7565b60068054600190810190915501600755565b6106873382610bc1565b6106f95760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016104a1565b610626838383610d17565b61062683838360405180602001604052806000815250610911565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16806103765760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016104a1565b600073ffffffffffffffffffffffffffffffffffffffff82166108425760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016104a1565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b60606001805461038b90611a97565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16156108ec5760405162461bcd60e51b815260206004820152601160248201527f546f6b656e2049442069732074616b656e00000000000000000000000000000060448201526064016104a1565b6108f63382610ba7565b50600680546001019055565b61090d338383610f4a565b5050565b61091b3383610bc1565b61098d5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016104a1565b6109998484848461105d565b50505050565b6040517f666f726567726f756e64000000000000000000000000000000000000000000006020820152602a810182905260609060009061016890604a016040516020818303038152906040528051906020012060001c6109ff9190611b19565b6040517f6261636b67726f756e64000000000000000000000000000000000000000000006020820152602a810185905290915060009061016890604a016040516020818303038152906040528051906020012060001c610a5f9190611b19565b90506000610aba610a6f866110e6565b610aa9610a7b866110e6565b610a84866110e6565b604051602001610a95929190611b2d565b60405160208183030381529060405261121b565b604051602001610a959291906125ba565b9050600081604051602001610acf919061268b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529695505050505050565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190610b618261071f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61090d82826040518060200160405280600081525061136e565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16610c585760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016104a1565b6000610c638361071f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610cd1575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b80610d0f57508373ffffffffffffffffffffffffffffffffffffffff16610cf78461040e565b73ffffffffffffffffffffffffffffffffffffffff16145b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff16610d378261071f565b73ffffffffffffffffffffffffffffffffffffffff1614610dc05760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e657200000000000000000000000000000000000000000000000000000060648201526084016104a1565b73ffffffffffffffffffffffffffffffffffffffff8216610e485760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016104a1565b610e53600082610b07565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120805460019290610e899084906126ff565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805460019290610ec4908490612716565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fc55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016104a1565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611068848484610d17565b611074848484846113f7565b6109995760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016104a1565b60608160000361112957505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611153578061113d8161272e565b915061114c9050600a83612766565b915061112d565b60008167ffffffffffffffff81111561116e5761116e61193b565b6040519080825280601f01601f191660200182016040528015611198576020820181803683370190505b5090505b8415610d0f576111ad6001836126ff565b91506111ba600a86611b19565b6111c5906030612716565b60f81b8183815181106111da576111da61277a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611214600a86612766565b945061119c565b6060815160000361123a57505060408051602081019091526000815290565b600060405180606001604052806040815260200161284d60409139905060006003845160026112699190612716565b6112739190612766565b61127e9060046127a9565b67ffffffffffffffff8111156112965761129661193b565b6040519080825280601f01601f1916602001820160405280156112c0576020820181803683370190505b509050600182016020820185865187015b8082101561132c576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506112d1565b5050600386510660018114611348576002811461135b57611363565b603d6001830353603d6002830353611363565b603d60018303535b509195945050505050565b61137883836115d0565b61138560008484846113f7565b6106265760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016104a1565b600073ffffffffffffffffffffffffffffffffffffffff84163b156115c5576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061146e9033908990889088906004016127e6565b6020604051808303816000875af19250505080156114c7575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526114c49181019061282f565b60015b61157a573d8080156114f5576040519150601f19603f3d011682016040523d82523d6000602084013e6114fa565b606091505b5080516000036115725760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016104a1565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050610d0f565b506001949350505050565b73ffffffffffffffffffffffffffffffffffffffff82166116335760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104a1565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16156116a55760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016104a1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054600192906116db908490612716565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461178c57600080fd5b50565b6000602082840312156117a157600080fd5b81356117ac8161175e565b9392505050565b60005b838110156117ce5781810151838201526020016117b6565b838111156109995750506000910152565b600081518084526117f78160208601602086016117b3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006117ac60208301846117df565b60006020828403121561184e57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461187957600080fd5b919050565b6000806040838503121561189157600080fd5b61189a83611855565b946020939093013593505050565b6000806000606084860312156118bd57600080fd5b6118c684611855565b92506118d460208501611855565b9150604084013590509250925092565b6000602082840312156118f657600080fd5b6117ac82611855565b6000806040838503121561191257600080fd5b61191b83611855565b91506020830135801515811461193057600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000806080858703121561198057600080fd5b61198985611855565b935061199760208601611855565b925060408501359150606085013567ffffffffffffffff808211156119bb57600080fd5b818701915087601f8301126119cf57600080fd5b8135818111156119e1576119e161193b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611a2757611a2761193b565b816040528281528a6020848701011115611a4057600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611a7757600080fd5b611a8083611855565b9150611a8e60208401611855565b90509250929050565b600181811c90821680611aab57607f821691505b602082108103611ae4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611b2857611b28611aea565b500690565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f737667222077696474683d223130323422206865696768743d2231303260208201527f34222066696c6c3d226e6f6e65223e3c706174682066696c6c3d2268736c2800604082015260008351611bb181605f8501602088016117b3565b7f2c20313030252c20313025292220643d224d3020306831303234763130323448605f918401918201527f307a22202f3e3c672066696c6c3d2268736c2800000000000000000000000000607f8201528351611c148160928401602088016117b3565b7f2c20313030252c2039302529223e3c7061746820643d224d393033203433372e609292909101918201527f35633020392e3131332d372e3338382031362e352d31362e352031362e35732d60b28201527f31362e352d372e3338372d31362e352d31362e3520372e3338382d31362e352060d28201527f31362e352d31362e352031362e3520372e3338372031362e352031362e357a4d60f28201527f3639382e3532392035363663362e39323120302031322e35332d352e353936206101128201527f31322e35332d31322e35762d353063302d362e39303420352e3630392d31322e6101328201527f352031322e3532392d31322e356832352e30353963362e393220302031322e356101528201527f323920352e3539362031322e3532392031322e35763530633020362e393034206101728201527f352e3630392031322e352031322e35332031322e357331322e3532392d352e356101928201527f39362031322e3532392d31322e35762d353063302d362e39303420352e3630396101b28201527f2d31322e352031322e35332d31322e356832352e30353963362e3932203020316101d28201527f322e35323920352e3539362031322e3532392031322e35763530633020362e396101f28201527f303420352e3630392031322e352031322e3532392031322e356833372e3538396102128201527f63362e393220302031322e3532392d352e3539362031322e3532392d31322e356102328201527f762d373563302d362e3930342d352e3630392d31322e352d31322e3532392d316102528201527f322e35732d31322e353320352e3539362d31322e35332031322e357635362e326102728201527f3561362e32363420362e3236342030203120312d31322e3532392030563437386102928201527f2e3563302d362e3930342d352e3630392d31322e352d31322e35332d31322e356102b28201527f483639382e353239632d362e393220302d31322e35323920352e3539362d31326102d28201527f2e3532392031322e35763735633020362e39303420352e3630392031322e35206102f28201527f31322e3532392031322e357a22202f3e3c7061746820643d224d3135372e36356103128201527f3520353431632d362e39333220302d31322e3535322d352e3539362d31322e356103328201527f35322d31322e35762d353063302d362e3930342d352e3631392d31322e352d316103528201527f322e3535312d31322e3553313230203437312e35393620313230203437382e356103728201527f763735633020362e39303420352e36322031322e352031322e3535322031322e6103928201527f35683135302e363263362e39333320302031322e3535322d352e3539362031326103b28201527f2e3535322d31322e35762d353063302d362e39303420352e3631392d31322e356103d28201527f2031322e3535322d31322e35683134342e33343563332e343635203020362e326103f28201527f373620322e37393820362e32373620362e3235732d322e38313120362e32352d6104128201527f362e32373620362e3235483332302e383238632d362e39333320302d31322e356104328201527f353220352e3539362d31322e3535322031322e357633372e35633020362e39306104528201527f3420352e3631392031322e352031322e3535322031322e35683135302e3632636104728201527f362e39333320302031322e3535322d352e3539362031322e3535322d31322e356104928201527f762d373563302d362e3930342d352e3631392d31322e352d31322e3535322d316104b28201527f322e35483238332e313732632d362e39333220302d31322e35353120352e35396104d28201527f362d31322e3535312031322e35763530633020362e3930342d352e36313920316104f28201527f322e352d31322e3535322031322e35682d32352e313033632d362e39333320306105128201527f2d31322e3535322d352e3539362d31322e3535322d31322e35762d353063302d6105328201527f362e3930342d352e36322d31322e352d31322e3535322d31322e35732d31322e6105528201527f35353220352e3539362d31322e3535322031322e35763530633020362e3930346105728201527f2d352e3631392031322e352d31322e3535312031322e35682d32352e3130347a6105928201527f6d3330312e3234322d362e3235633020332e3435322d322e38313120362e32356105b28201527f2d362e32373620362e3235483333392e363535632d332e34363520302d362e326105d28201527f37362d322e3739382d362e3237362d362e323573322e3831312d362e323520366105f28201527f2e3237362d362e3235683131322e39363663332e343635203020362e323736206106128201527f322e37393820362e32373620362e32357a4d343937203535332e3831386330206106328201527f362e39323920352e3632382031322e3534362031322e3537312031322e3534366106528201527f6831333261362e323820362e323820302030203120362e32383620362e3237326106728201527f20362e323820362e32382030203020312d362e32383620362e323733682d31336106928201527f32632d362e39343320302d31322e35373120352e3631362d31322e35373120316106b28201527f322e3534364131322e35362031322e3536203020302030203530392e353731206106d28201527f363034683135302e38353863362e39343320302031322e3537312d352e3631366106f28201527f2031322e3537312d31322e353435762d3131322e393163302d362e3932382d356107128201527f2e3632382d31322e3534352d31322e3537312d31322e353435483530392e35376107328201527f31632d362e39343320302d31322e35373120352e3631372d31322e35373120316107528201527f322e3534357637352e3237337a6d33372e3731342d36322e373237632d362e396107728201527f343320302d31322e35373120352e3631372d31322e3537312031322e353435766107928201527f32352e303931633020362e39323920352e3632382031322e3534362031322e356107b28201527f37312031322e353436683130302e35373263362e39343320302031322e3537316107d28201527f2d352e3631372031322e3537312d31322e353436762d32352e30393163302d366107f28201527f2e3932382d352e3632382d31322e3534352d31322e3537312d31322e353435486108128201527f3533342e3731347a222066696c6c2d72756c653d226576656e6f646422202f3e6108328201527f3c2f673e3c2f7376673e0000000000000000000000000000000000000000000061085282015261085c01949350505050565b7f7b226e616d65223a20227761676d6920230000000000000000000000000000008152600083516125f28160118501602088016117b3565b7f222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b6011918401918201527f6261736536342c00000000000000000000000000000000000000000000000000603182015283516126558160388401602088016117b3565b7f227d00000000000000000000000000000000000000000000000000000000000060389290910191820152603a01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516126c381601d8501602087016117b3565b91909101601d0192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612711576127116126d0565b500390565b60008219821115612729576127296126d0565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361275f5761275f6126d0565b5060010190565b60008261277557612775611aea565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156127e1576127e16126d0565b500290565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261282560808301846117df565b9695505050505050565b60006020828403121561284157600080fd5b81516117ac8161175e56fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212201665a4f9111990d7529375848d3fd02c0121091a940da59e763eba826e7b077064736f6c634300080d0033\",\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"getBytecode\",\n        {\n          \"address\": undefined,\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n      \"suspense\": [Function],\n    }\n  `)\n})\n\ntest('behavior: disabled when properties missing', async () => {\n  const [result] = renderComposable(() => useBytecode())\n\n  await wait(100)\n  expect(result.isPending.value).toBe(true)\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useBytecode.ts",
    "content": "import type {\n  Config,\n  GetBytecodeErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetBytecodeData,\n  type GetBytecodeOptions,\n  getBytecodeQueryOptions,\n} from '@wagmi/core/query'\nimport { computed } from 'vue'\nimport type { DeepMaybeRef } from '../types/ref.js'\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseBytecodeParameters<\n  config extends Config = Config,\n  selectData = GetBytecodeData,\n> = Compute<\n  DeepMaybeRef<GetBytecodeOptions<config, selectData> & ConfigParameter<config>>\n>\n\nexport type UseBytecodeReturnType<selectData = GetBytecodeData> =\n  UseQueryReturnType<selectData, GetBytecodeErrorType>\n\n/** https://wagmi.sh/vue/api/hooks/useBytecode */\nexport function useBytecode<\n  config extends Config = ResolvedRegister['config'],\n  selectData = GetBytecodeData,\n>(\n  parameters: UseBytecodeParameters<config, selectData> = {},\n): UseBytecodeReturnType<selectData> {\n  const params = computed(() => deepUnref(parameters))\n  const config = useConfig(params)\n  const chainId = useChainId({ config })\n  const options = computed(() =>\n    getBytecodeQueryOptions(config as any, {\n      ...params.value,\n      chainId: params.value.chainId ?? chainId.value,\n    }),\n  )\n  return useQuery(options as any) as any\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useChainId.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useChainId } from './useChainId.js'\n\ntest('default', () => {\n  const chainId = useChainId()\n  expectTypeOf(chainId.value).toEqualTypeOf<number>()\n})\n\ntest('parameters: config', () => {\n  const chainId = useChainId({ config })\n  expectTypeOf(chainId.value).toEqualTypeOf<1 | 456 | 10>()\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useChainId.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { renderComposable } from '@wagmi/test/vue'\nimport { expect, test } from 'vitest'\n\nimport { useChainId } from './useChainId.js'\n\ntest('default', () => {\n  const [chainId] = renderComposable(() => useChainId())\n\n  expect(chainId.value).toMatchInlineSnapshot('1')\n\n  config.setState((x) => ({ ...x, chainId: 456 }))\n\n  expect(chainId.value).toMatchInlineSnapshot('456')\n})\n\ntest('parameters: config', () => {\n  const [chainId] = renderComposable(() => useChainId({ config }), {\n    attach() {},\n  })\n  expect(chainId.value).toBeDefined()\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useChainId.ts",
    "content": "import {\n  type Config,\n  type GetChainIdReturnType,\n  getChainId,\n  type ResolvedRegister,\n  watchChainId,\n} from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport { onScopeDispose, type Ref, readonly, ref } from 'vue'\nimport { useConfig } from './useConfig.js'\n\nexport type UseChainIdParameters<config extends Config = Config> =\n  ConfigParameter<config>\n\nexport type UseChainIdReturnType<config extends Config = Config> = Ref<\n  GetChainIdReturnType<config>\n>\n\n/** https://wagmi.sh/vue/api/composables/useChainId */\nexport function useChainId<config extends Config = ResolvedRegister['config']>(\n  parameters: UseChainIdParameters<config> = {},\n): UseChainIdReturnType<config> {\n  const config = useConfig(parameters)\n\n  const chainId = ref<GetChainIdReturnType>(getChainId(config))\n  const unsubscribe = watchChainId(config, {\n    onChange(data) {\n      chainId.value = data\n    },\n  })\n  onScopeDispose(() => unsubscribe())\n\n  return readonly(chainId)\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useChains.test.ts",
    "content": "import { config } from '@wagmi/test'\nimport { renderComposable } from '@wagmi/test/vue'\nimport { celo } from 'viem/chains'\nimport { expect, test } from 'vitest'\n\nimport { useChains } from './useChains.js'\n\ntest('default', async () => {\n  const [chains] = renderComposable(() => useChains())\n\n  expect(chains.value.length).toBe(3)\n\n  config._internal.chains.setState((x) => [...x, celo])\n\n  expect(chains.value.length).toBe(4)\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useChains.ts",
    "content": "import {\n  type Config,\n  type GetChainsReturnType,\n  getChains,\n  type ResolvedRegister,\n} from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport { watchChains } from '@wagmi/core/internal'\nimport { onScopeDispose, type Ref, readonly, ref } from 'vue'\nimport { useConfig } from './useConfig.js'\n\nexport type UseChainsParameters<config extends Config = Config> =\n  ConfigParameter<config>\n\nexport type UseChainsReturnType<config extends Config = Config> = Ref<\n  GetChainsReturnType<config>\n>\n\n/** https://wagmi.sh/vue/api/composables/useChains */\nexport function useChains<config extends Config = ResolvedRegister['config']>(\n  parameters: UseChainsParameters<config> = {},\n): UseChainsReturnType<config> {\n  const config = useConfig(parameters)\n\n  const chains = ref<GetChainsReturnType<config>>(getChains(config))\n  const unsubscribe = watchChains(config, {\n    onChange(data) {\n      chains.value = data as any\n    },\n  })\n  onScopeDispose(() => unsubscribe())\n\n  return readonly(chains) as UseChainsReturnType<config>\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useClient.test-d.ts",
    "content": "import { chain, config } from '@wagmi/test'\nimport type { Chain } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useClient } from './useClient.js'\n\ntest('default', () => {\n  const client = useClient({ config })\n  expectTypeOf(client.value.chain).toEqualTypeOf<\n    (typeof config)['chains'][number]\n  >()\n  expectTypeOf(client.value.transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('parameters: chainId', () => {\n  const client = useClient({\n    config,\n    chainId: chain.mainnet.id,\n  })\n  expectTypeOf(client.value.chain).toEqualTypeOf<typeof chain.mainnet>()\n  expectTypeOf(client.value.chain).not.toEqualTypeOf<typeof chain.mainnet2>()\n  expectTypeOf(client.value.transport.type).toEqualTypeOf<'http'>()\n})\n\ntest('behavior: unconfigured chain', () => {\n  {\n    const client = useClient({ chainId: 123456 })\n    if (client.value) {\n      expectTypeOf(client.value.chain).toEqualTypeOf<Chain>()\n      expectTypeOf(client.value.transport.type).toEqualTypeOf<string>()\n    } else {\n      expectTypeOf(client.value).toEqualTypeOf<undefined>()\n    }\n  }\n\n  const client = useClient({\n    config,\n    // @ts-expect-error\n    chainId: 123456,\n  })\n  expectTypeOf(client.value).toEqualTypeOf<undefined>()\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useClient.test.ts",
    "content": "import { switchChain } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { renderComposable, waitFor } from '@wagmi/test/vue'\nimport { expect, test } from 'vitest'\nimport { ref } from 'vue'\n\nimport { useClient } from './useClient.js'\n\ntest('default', async () => {\n  const [client] = renderComposable(() => useClient())\n\n  expect(client?.value?.chain.id).toEqual(1)\n\n  await switchChain(config, { chainId: 456 })\n\n  expect(client.value?.chain?.id).toEqual(456)\n})\n\ntest('parameters: config', () => {\n  const [chainId] = renderComposable(() => useClient({ config }), {\n    attach() {},\n  })\n  expect(chainId.value).toBeDefined()\n})\n\ntest('behavior: controlled chainId', async () => {\n  const chainId = ref(456)\n\n  const [client] = renderComposable(() => useClient({ chainId }))\n\n  expect(client?.value?.chain.id).toEqual(456)\n\n  chainId.value = 1\n\n  await waitFor(client, (client) => client?.chain.id === 1)\n})\n\ntest('behavior: unconfigured chain', () => {\n  const [client] = renderComposable(() => useClient({ chainId: 123456 }))\n  expect(client.value).toBeUndefined()\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useClient.ts",
    "content": "import {\n  type Config,\n  type GetClientParameters,\n  type GetClientReturnType,\n  getClient,\n  type ResolvedRegister,\n  watchClient,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  computed,\n  onScopeDispose,\n  type Ref,\n  readonly,\n  ref,\n  watchEffect,\n} from 'vue'\nimport type { DeepMaybeRef } from '../types/ref.js'\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseClientParameters<\n  config extends Config = Config,\n  chainId extends config['chains'][number]['id'] | number | undefined =\n    | config['chains'][number]['id']\n    | undefined,\n> = Compute<\n  DeepMaybeRef<GetClientParameters<config, chainId> & ConfigParameter<config>>\n>\n\nexport type UseClientReturnType<\n  config extends Config = Config,\n  chainId extends config['chains'][number]['id'] | number | undefined =\n    | config['chains'][number]['id']\n    | undefined,\n> = Ref<GetClientReturnType<config, chainId>>\n\n/** https://wagmi.sh/vue/api/composables/useClient */\nexport function useClient<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends config['chains'][number]['id'] | number | undefined =\n    | config['chains'][number]['id']\n    | undefined,\n>(\n  parameters: UseClientParameters<config, chainId> = {},\n): UseClientReturnType<config, chainId> {\n  const params = computed(() => deepUnref(parameters))\n\n  const config = useConfig(params)\n\n  const client = ref(getClient(config, params.value as GetClientParameters))\n  watchEffect(() => {\n    client.value = getClient(config, params.value as GetClientParameters)\n  })\n  const unsubscribe = watchClient(config, {\n    onChange(data) {\n      if (client.value?.uid === data?.uid) return\n      client.value = data\n    },\n  })\n  onScopeDispose(() => unsubscribe())\n\n  return readonly(client) as UseClientReturnType<config, chainId>\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useConfig.test-d.ts",
    "content": "import type { Config } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useConfig } from './useConfig.js'\n\ntest('default', async () => {\n  const result = useConfig()\n  expectTypeOf(result).toEqualTypeOf<Config>()\n})\n\ntest('parameters: config', async () => {\n  const result = useConfig({ config })\n  expectTypeOf(result).not.toEqualTypeOf<Config>()\n  expectTypeOf(result).toEqualTypeOf<typeof config>()\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useConfig.test.ts",
    "content": "import { renderComposable } from '@wagmi/test/vue'\nimport { expect, test, vi } from 'vitest'\n\nimport { useConfig } from './useConfig.js'\n\ntest('default', () => {\n  const [config] = renderComposable(() => useConfig())\n  expect(config).toBeDefined()\n})\n\ntest('behavior: throws when not provided via WagmiPlugin', () => {\n  vi.spyOn(console, 'error').mockImplementation(() => {})\n\n  try {\n    renderComposable(() => useConfig(), { attach() {} })\n  } catch (error) {\n    expect(error).toMatchInlineSnapshot(`\n      [WagmiPluginNotFoundError: No \\`config\\` found in Vue context, use \\`WagmiPlugin\\` to properly initialize the library.\n\n      Docs: https://wagmi.sh/vue/api/Nuxt.html\n      Version: @wagmi/vue@x.y.z]\n    `)\n  }\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useConfig.ts",
    "content": "import type { Config, ResolvedRegister } from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport { hasInjectionContext, inject, unref } from 'vue'\nimport {\n  WagmiInjectionContextError,\n  WagmiPluginNotFoundError,\n} from '../errors/plugin.js'\nimport { configKey } from '../plugin.js'\nimport type { DeepMaybeRef } from '../types/ref.js'\n\nexport type UseConfigParameters<config extends Config = Config> = DeepMaybeRef<\n  ConfigParameter<config>\n>\n\nexport type UseConfigReturnType<config extends Config = Config> = config\n\n/** https://wagmi.sh/vue/api/composables/useConfig */\nexport function useConfig<config extends Config = ResolvedRegister['config']>(\n  parameters_: UseConfigParameters<config> = {},\n): UseConfigReturnType<config> {\n  const parameters = unref(parameters_)\n\n  // passthrough config if provided\n  if (parameters.config) return parameters.config as UseConfigReturnType<config>\n\n  // ensures that `inject()` can be used\n  if (!hasInjectionContext()) throw new WagmiInjectionContextError()\n\n  const config = inject<Config | undefined>(configKey)\n  if (!config) throw new WagmiPluginNotFoundError()\n\n  return config as UseConfigReturnType<config>\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useConnect.test-d.ts",
    "content": "import type {\n  ConnectErrorType,\n  Connector,\n  CreateConnectorFn,\n} from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport type { Address, Hex } from 'viem'\nimport { assertType, expectTypeOf, test } from 'vitest'\n\nimport { useConnect } from './useConnect.js'\n\nconst connector = config.connectors[0]!\nconst contextValue = { foo: 'bar' } as const\n\ntest('context', () => {\n  const connect = useConnect({\n    mutation: {\n      onMutate(variables) {\n        assertType<{\n          chainId?: number | undefined\n          connector: Connector | CreateConnectorFn\n          withCapabilities?: boolean | undefined\n        }>(variables)\n        return contextValue\n      },\n      onError(error, variables, context) {\n        assertType<{\n          chainId?: number | undefined\n          connector: Connector | CreateConnectorFn\n          withCapabilities?: boolean | undefined\n        }>(variables)\n        expectTypeOf(error).toEqualTypeOf<ConnectErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        assertType<{\n          chainId?: number | undefined\n          connector: Connector | CreateConnectorFn\n          withCapabilities?: boolean | undefined\n        }>(variables)\n        expectTypeOf(data).toEqualTypeOf<{\n          accounts:\n            | readonly [Address, ...Address[]]\n            | readonly [\n                { address: Address; capabilities: Record<string, unknown> },\n                ...{\n                  address: Address\n                  capabilities: Record<string, unknown>\n                }[],\n              ]\n\n          chainId: number\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<\n          | {\n              accounts:\n                | readonly [Address, ...Address[]]\n                | readonly [\n                    {\n                      address: Address\n                      capabilities: Record<string, unknown>\n                    },\n                    ...{\n                      address: Address\n                      capabilities: Record<string, unknown>\n                    }[],\n                  ]\n\n              chainId: number\n            }\n          | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<ConnectErrorType | null>()\n        assertType<{\n          chainId?: number | undefined\n          connector: Connector | CreateConnectorFn\n          withCapabilities?: boolean | undefined\n        }>(variables)\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  })\n\n  expectTypeOf(connect.data.value).toEqualTypeOf<\n    | {\n        accounts:\n          | readonly [Address, ...Address[]]\n          | readonly [\n              { address: Address; capabilities: Record<string, unknown> },\n              ...{\n                address: Address\n                capabilities: Record<string, unknown>\n              }[],\n            ]\n\n        chainId: number\n      }\n    | undefined\n  >()\n  expectTypeOf(connect.error.value).toEqualTypeOf<ConnectErrorType | null>()\n  expectTypeOf(connect.variables.value).toMatchTypeOf<\n    | {\n        chainId?: number | undefined\n        connector: Connector | CreateConnectorFn\n      }\n    | undefined\n  >()\n  expectTypeOf(connect.context.value).toEqualTypeOf<\n    typeof contextValue | undefined\n  >()\n\n  connect.mutate(\n    { connector },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{\n          chainId?: number | undefined\n          connector: typeof connector | CreateConnectorFn\n          foo?: string | undefined\n          withCapabilities?: boolean | undefined\n        }>()\n        expectTypeOf(error).toEqualTypeOf<ConnectErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{\n          chainId?: number | undefined\n          connector: typeof connector | CreateConnectorFn\n          foo?: string | undefined\n          withCapabilities?: boolean | undefined\n        }>()\n        expectTypeOf(data).toEqualTypeOf<{\n          accounts: readonly [Address, ...Address[]]\n          chainId: number\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<\n          | {\n              accounts: readonly [Address, ...Address[]]\n              chainId: number\n            }\n          | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<ConnectErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<{\n          chainId?: number | undefined\n          connector: typeof connector | CreateConnectorFn\n          foo?: string | undefined\n          withCapabilities?: boolean | undefined\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  )\n\n  connect.mutate(\n    {\n      connector,\n      foo: 'bar',\n      withCapabilities: true,\n    },\n    {\n      onSuccess(data, _variables, _context) {\n        expectTypeOf(data).toEqualTypeOf<{\n          accounts: readonly [\n            {\n              address: Address\n              capabilities: {\n                foo: { bar: Hex }\n              }\n            },\n            ...{\n              address: Address\n              capabilities: {\n                foo: { bar: Hex }\n              }\n            }[],\n          ]\n          chainId: number\n        }>()\n      },\n      onSettled(data, _error, _variables, _context) {\n        expectTypeOf(data).toEqualTypeOf<\n          | {\n              accounts: readonly [\n                {\n                  address: Address\n                  capabilities: {\n                    foo: { bar: Hex }\n                  }\n                },\n                ...{\n                  address: Address\n                  capabilities: {\n                    foo: { bar: Hex }\n                  }\n                }[],\n              ]\n              chainId: number\n            }\n          | undefined\n        >()\n      },\n    },\n  )\n\n  ;(async () => {\n    const res = await connect.mutateAsync({\n      connector,\n      foo: 'bar',\n      withCapabilities: true,\n    })\n    expectTypeOf(res).toEqualTypeOf<{\n      accounts: readonly [\n        {\n          address: Address\n          capabilities: {\n            foo: { bar: Hex }\n          }\n        },\n        ...{\n          address: Address\n          capabilities: {\n            foo: { bar: Hex }\n          }\n        }[],\n      ]\n      chainId: number\n    }>()\n  })()\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useConnect.test.ts",
    "content": "import { disconnect } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { renderComposable, waitFor } from '@wagmi/test/vue'\nimport { afterEach, expect, test } from 'vitest'\nimport { useConnect } from './useConnect.js'\nimport { useConnection } from './useConnection.js'\nimport { useConnectors } from './useConnectors.js'\n\nconst connector = config.connectors[0]!\n\nafterEach(async () => {\n  if (config.state.current === connector.uid)\n    await disconnect(config, { connector })\n})\n\ntest('default', async () => {\n  const [connection] = renderComposable(() => useConnection())\n  const [connect] = renderComposable(() => useConnect())\n  const [connectors] = renderComposable(() => useConnectors())\n\n  expect(connection.address.value).not.toBeDefined()\n  expect(connection.status.value).toEqual('disconnected')\n\n  connect.mutate({\n    connector: connectors.value[0]!,\n  })\n\n  await waitFor(connection.isConnected, (isConnected) => Boolean(isConnected))\n\n  expect(connection.address.value).toBeDefined()\n  expect(connection.status.value).toEqual('connected')\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useConnect.ts",
    "content": "import { useMutation } from '@tanstack/vue-query'\nimport type {\n  Config,\n  ConnectErrorType,\n  GetConnectorsReturnType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type ConnectData,\n  type ConnectMutate,\n  type ConnectMutateAsync,\n  type ConnectOptions,\n  type ConnectVariables,\n  connectMutationOptions,\n} from '@wagmi/core/query'\nimport { onScopeDispose } from 'vue'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\nimport { useConnectors } from './useConnectors.js'\n\nexport type UseConnectParameters<\n  config extends Config = Config,\n  context = unknown,\n> = Compute<ConfigParameter<config> & ConnectOptions<config, context>>\n\nexport type UseConnectReturnType<\n  config extends Config = Config,\n  context = unknown,\n> = Compute<\n  UseMutationReturnType<\n    ConnectData<config, config['connectors'][number], boolean>,\n    ConnectErrorType,\n    ConnectVariables<config, config['connectors'][number], boolean>,\n    context,\n    ConnectMutate<config, context>,\n    ConnectMutateAsync<config, context>\n  > & {\n    /** @deprecated use `mutate` instead */\n    connect: ConnectMutate<config, context>\n    /** @deprecated use `mutateAsync` instead */\n    connectAsync: ConnectMutateAsync<config, context>\n    /** @deprecated use `useConnectors` instead */\n    connectors: Compute<GetConnectorsReturnType> | config['connectors']\n  }\n>\n\n/** https://wagmi.sh/vue/api/composables/useConnect */\nexport function useConnect<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: UseConnectParameters<config, context> = {},\n): UseConnectReturnType<config, context> {\n  const config = useConfig(parameters)\n  const options = connectMutationOptions(config, parameters)\n  const mutation = useMutation(options)\n\n  // Reset mutation back to an idle state when the connector disconnects.\n  const unsubscribe = config.subscribe(\n    ({ status }) => status,\n    (status, previousStatus) => {\n      if (previousStatus === 'connected' && status === 'disconnected')\n        mutation.reset()\n    },\n  )\n  onScopeDispose(() => unsubscribe())\n\n  type Return = UseConnectReturnType<config, context>\n  return {\n    ...(mutation as Return),\n    connect: mutation.mutate as Return['mutate'],\n    connectAsync: mutation.mutateAsync as Return['mutateAsync'],\n    connectors: useConnectors({ config }).value,\n  }\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useConnection.test-d.ts",
    "content": "import type { Connector } from '@wagmi/core'\nimport type { Address, Chain } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { useConnection } from './useConnection.js'\n\ntest('states', () => {\n  const result = deepUnref(useConnection())\n\n  switch (result.status) {\n    case 'reconnecting': {\n      expectTypeOf(result).toMatchTypeOf<{\n        address: Address | undefined\n        chain: Chain | undefined\n        chainId: number | undefined\n        connector: Connector | undefined\n        isConnected: boolean\n        isConnecting: false\n        isDisconnected: false\n        isReconnecting: true\n        status: 'reconnecting'\n      }>()\n      break\n    }\n    case 'connecting': {\n      expectTypeOf(result).toMatchTypeOf<{\n        address: Address | undefined\n        chain: Chain | undefined\n        chainId: number | undefined\n        connector: Connector | undefined\n        isConnected: false\n        isReconnecting: false\n        isConnecting: true\n        isDisconnected: false\n        status: 'connecting'\n      }>()\n      break\n    }\n    case 'connected': {\n      expectTypeOf(result).toMatchTypeOf<{\n        address: Address\n        chain: Chain | undefined\n        chainId: number\n        connector: Connector\n        isConnected: true\n        isConnecting: false\n        isDisconnected: false\n        isReconnecting: false\n        status: 'connected'\n      }>()\n      break\n    }\n    case 'disconnected': {\n      expectTypeOf(result).toMatchTypeOf<{\n        address: undefined\n        chain: undefined\n        chainId: undefined\n        connector: undefined\n        isConnected: false\n        isReconnecting: false\n        isConnecting: false\n        isDisconnected: true\n        status: 'disconnected'\n      }>()\n      break\n    }\n  }\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useConnection.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { renderComposable } from '@wagmi/test/vue'\nimport { expect, test } from 'vitest'\n\nimport { useConnection } from './useConnection.js'\n\ntest('default', async () => {\n  const [connection] = renderComposable(() => useConnection())\n\n  expect(connection.address.value).not.toBeDefined()\n  expect(connection.status.value).toEqual('disconnected')\n\n  await connect(config, { connector: config.connectors[0]! })\n\n  expect(connection.address.value).toBeDefined()\n  expect(connection.status.value).toEqual('connected')\n\n  await disconnect(config)\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useConnection.ts",
    "content": "import {\n  type Config,\n  type GetConnectionReturnType,\n  getConnection,\n  type ResolvedRegister,\n  watchConnection,\n} from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport { onScopeDispose, reactive, readonly, type ToRefs, toRefs } from 'vue'\nimport { updateState } from '../utils/updateState.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseConnectionParameters<config extends Config = Config> =\n  ConfigParameter<config>\n\nexport type UseConnectionReturnType<config extends Config = Config> = ToRefs<\n  GetConnectionReturnType<config>\n>\n\n/** https://wagmi.sh/vue/api/composables/useConnection */\nexport function useConnection<\n  config extends Config = ResolvedRegister['config'],\n>(\n  parameters: UseConnectionParameters<config> = {},\n): UseConnectionReturnType<config> {\n  const config = useConfig(parameters)\n\n  const connection = reactive(getConnection(config))\n\n  const unsubscribe = watchConnection(config, {\n    onChange(data) {\n      updateState(connection, data)\n    },\n  })\n  onScopeDispose(() => unsubscribe())\n\n  return toRefs(readonly(connection)) as UseConnectionReturnType<config>\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useConnectionEffect.test.ts",
    "content": "import { VueQueryPlugin } from '@tanstack/vue-query'\nimport { mock } from '@wagmi/connectors'\nimport { connect, createConfig, disconnect, http } from '@wagmi/core'\nimport { accounts, chain } from '@wagmi/test'\nimport { renderComposable, waitFor } from '@wagmi/test/vue'\nimport { expect, test, vi } from 'vitest'\nimport type { App } from 'vue'\n\nimport { WagmiPlugin } from '../plugin.js'\nimport { useConnect } from './useConnect.js'\nimport { useConnection } from './useConnection.js'\nimport { useConnectionEffect } from './useConnectionEffect.js'\nimport { useConnectors } from './useConnectors.js'\nimport { useDisconnect } from './useDisconnect.js'\n\ntest('behavior: connect and disconnect called once', async () => {\n  const onConnect = vi.fn()\n  const onDisconnect = vi.fn()\n\n  renderComposable(() => useConnectionEffect({ onConnect, onDisconnect }))\n  const [connect] = renderComposable(() => useConnect())\n  const [connectors] = renderComposable(() => useConnectors())\n  const [disconnect] = renderComposable(() => useDisconnect())\n\n  connect.mutate({\n    connector: connectors.value[0]!,\n  })\n  await waitFor(connect.isSuccess)\n  connect.mutate({\n    connector: connectors.value[0]!,\n  })\n\n  disconnect.mutate()\n  await waitFor(disconnect.isSuccess)\n  disconnect.mutate()\n\n  expect(onConnect).toBeCalledTimes(1)\n  expect(onDisconnect).toBeCalledTimes(1)\n})\n\ntest('behavior: connect called on reconnect', async () => {\n  const config = createConfig({\n    chains: [chain.mainnet],\n    connectors: [\n      mock({\n        accounts,\n        features: { reconnect: true },\n      }),\n    ],\n    transports: { [chain.mainnet.id]: http() },\n  })\n\n  function attach(app: App) {\n    app\n      .use(WagmiPlugin, {\n        config,\n        reconnectOnMount: true,\n      })\n      .use(VueQueryPlugin, {})\n  }\n\n  await connect(config, { connector: config.connectors[0]! })\n  const onConnect = vi.fn((data) => {\n    expect(data.isReconnected).toBeTruthy()\n  })\n\n  renderComposable(() => useConnectionEffect({ onConnect }), {\n    attach,\n  })\n  const [connection] = renderComposable(() => useConnection(), { attach })\n\n  await waitFor(connection.status, (status) => status === 'connected')\n\n  expect(onConnect).toBeCalledTimes(1)\n\n  await disconnect(config)\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useConnectionEffect.ts",
    "content": "import { type GetConnectionReturnType, watchConnection } from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport { watchEffect } from 'vue'\nimport type { DeepMaybeRef } from '../types/ref.js'\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseConnectionEffectParameters = Compute<\n  DeepMaybeRef<\n    {\n      onConnect?(\n        data: Compute<\n          Pick<\n            Extract<GetConnectionReturnType, { status: 'connected' }>,\n            'address' | 'addresses' | 'chain' | 'chainId' | 'connector'\n          > & {\n            isReconnected: boolean\n          }\n        >,\n      ): void\n      onDisconnect?(): void\n    } & ConfigParameter\n  >\n>\n\n/** https://wagmi.sh/vue/api/composables/useConnectionEffect */\nexport function useConnectionEffect(\n  parameters: UseConnectionEffectParameters = {},\n) {\n  const config = useConfig(parameters)\n\n  watchEffect((onCleanup) => {\n    const { onConnect, onDisconnect } = deepUnref(parameters)\n\n    const unwatch = watchConnection(config, {\n      onChange(data, prevData) {\n        if (\n          (prevData.status === 'reconnecting' ||\n            (prevData.status === 'connecting' &&\n              prevData.address === undefined)) &&\n          data.status === 'connected'\n        ) {\n          const { address, addresses, chain, chainId, connector } = data\n          const isReconnected =\n            prevData.status === 'reconnecting' ||\n            // if `previousAccount.status` is `undefined`, the connector connected immediately.\n            prevData.status === undefined\n          onConnect?.({\n            address,\n            addresses,\n            chain,\n            chainId,\n            connector,\n            isReconnected,\n          })\n        } else if (\n          prevData.status === 'connected' &&\n          data.status === 'disconnected'\n        )\n          onDisconnect?.()\n      },\n    })\n\n    onCleanup(() => unwatch())\n  })\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useConnections.test.ts",
    "content": "import { connect } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { renderComposable } from '@wagmi/test/vue'\nimport { expect, test } from 'vitest'\n\nimport { useConnections } from './useConnections.js'\n\ntest('default', async () => {\n  const [connections] = renderComposable(() => useConnections())\n\n  expect(connections.value).toEqual([])\n\n  await connect(config, { connector: config.connectors[0]! })\n\n  expect(connections.value.length).toBe(1)\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useConnections.ts",
    "content": "import {\n  type GetConnectionsReturnType,\n  getConnections,\n  watchConnections,\n} from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport { onScopeDispose, type Ref, readonly, ref } from 'vue'\nimport { useConfig } from './useConfig.js'\n\nexport type UseConnectionsParameters = ConfigParameter\n\nexport type UseConnectionsReturnType = Ref<GetConnectionsReturnType>\n\n/** https://wagmi.sh/vue/api/composables/useConnections */\nexport function useConnections(\n  parameters: UseConnectionsParameters = {},\n): UseConnectionsReturnType {\n  const config = useConfig(parameters)\n\n  const connections = ref(getConnections(config))\n  const unsubscribe = watchConnections(config, {\n    onChange(data) {\n      connections.value = data\n    },\n  })\n  onScopeDispose(() => unsubscribe())\n\n  return readonly(connections) as UseConnectionsReturnType\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useConnectorClient.test-d.ts",
    "content": "import { config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useConnectorClient } from './useConnectorClient.js'\n\ntest('parameters: config', async () => {\n  const client = useConnectorClient({ config })\n  expectTypeOf(client.data?.value?.chain?.id!).toEqualTypeOf<1 | 456 | 10>()\n\n  const client2 = useConnectorClient({ config, chainId: 1 })\n  expectTypeOf(client2.data?.value?.chain?.id!).toEqualTypeOf<1>()\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useConnectorClient.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { config, wait } from '@wagmi/test'\nimport { renderComposable, waitFor } from '@wagmi/test/vue'\nimport { expect, test } from 'vitest'\n\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { useConnect } from './useConnect.js'\nimport { useConnectorClient } from './useConnectorClient.js'\nimport { useConnectors } from './useConnectors.js'\nimport { useDisconnect } from './useDisconnect.js'\nimport { useSwitchChain } from './useSwitchChain.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  const [client] = renderComposable(() => useConnectorClient())\n\n  expect(deepUnref(client)).toMatchInlineSnapshot(`\n    {\n      \"data\": undefined,\n      \"dataUpdatedAt\": 0,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": false,\n      \"isFetchedAfterMount\": false,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": true,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": false,\n      \"isSuccess\": false,\n      \"queryKey\": [\n        \"connectorClient\",\n        {\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"pending\",\n      \"suspense\": [Function],\n    }\n  `)\n})\n\ntest('behavior: connected on mount', async () => {\n  await connect(config, { connector })\n\n  const [client] = renderComposable(() => useConnectorClient())\n\n  await waitFor(client.isSuccess, (isSuccess) => isSuccess === true)\n\n  const { data, queryKey: _, ...rest } = deepUnref(client)\n  expect(data).toMatchObject(\n    expect.objectContaining({\n      account: expect.any(Object),\n      chain: expect.any(Object),\n    }),\n  )\n  expect(rest).toMatchInlineSnapshot(`\n    {\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": false,\n      \"isSuccess\": true,\n      \"refetch\": [Function],\n      \"status\": \"success\",\n      \"suspense\": [Function],\n    }\n  `)\n\n  await disconnect(config, { connector })\n})\n\ntest('behavior: connect and disconnect', async () => {\n  const [connect] = renderComposable(() => useConnect())\n  const [connectors] = renderComposable(() => useConnectors())\n  const [client] = renderComposable(() => useConnectorClient())\n  const [disconnect] = renderComposable(() => useDisconnect())\n\n  expect(client.data.value).not.toBeDefined()\n\n  connect.mutate({\n    connector: connectors.value[0]!,\n  })\n\n  await waitFor(client.data, (data) => data !== undefined)\n\n  disconnect.mutate()\n\n  await waitFor(client.data, (data) => data === undefined)\n})\n\ntest('behavior: switch chains', async () => {\n  await connect(config, { connector })\n\n  const [connectorClient] = renderComposable(() => useConnectorClient())\n  const [switchChain] = renderComposable(() => useSwitchChain())\n\n  expect(connectorClient.data.value).not.toBeDefined()\n  await waitFor(connectorClient.data, (data) => data !== undefined)\n\n  switchChain.mutate({ chainId: 456 })\n  await waitFor(switchChain.isSuccess, (isSuccess) => isSuccess === true)\n  await waitFor(connectorClient.data, (data) => data !== undefined)\n  expect(connectorClient.data?.value?.chain.id).toEqual(456)\n\n  await switchChain.mutateAsync({ chainId: 1 })\n  expect(connectorClient.data?.value?.chain.id).toEqual(1)\n\n  await disconnect(config, { connector })\n})\n\ntest('behavior: disabled when properties missing', async () => {\n  const [connectorClient] = renderComposable(() => useConnectorClient())\n\n  await wait(100)\n  expect(connectorClient.isPending.value).toBe(true)\n})\n\ntest('behavior: disabled when connecting', async () => {\n  const [connectorClient] = renderComposable(() => useConnectorClient())\n\n  config.setState((x) => ({ ...x, status: 'connecting' }))\n\n  await wait(100)\n  expect(connectorClient.isLoading.value).not.toBeTruthy()\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useConnectorClient.ts",
    "content": "import { useQueryClient } from '@tanstack/vue-query'\nimport type {\n  Config,\n  Connector,\n  GetConnectorClientErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetConnectorClientData,\n  type GetConnectorClientOptions,\n  getConnectorClientQueryOptions,\n} from '@wagmi/core/query'\nimport { computed, ref, watchEffect } from 'vue'\nimport type { DeepMaybeRef } from '../types/ref.js'\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\nimport { useConnection } from './useConnection.js'\n\nexport type UseConnectorClientParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetConnectorClientData<config, chainId>,\n> = Compute<\n  DeepMaybeRef<\n    GetConnectorClientOptions<config, chainId, selectData> &\n      ConfigParameter<config>\n  >\n>\n\nexport type UseConnectorClientReturnType<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetConnectorClientData<config, chainId>,\n> = UseQueryReturnType<selectData, GetConnectorClientErrorType>\n\n/** https://wagmi.sh/vue/api/composables/useConnectorClient */\nexport function useConnectorClient<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetConnectorClientData<config, chainId>,\n>(\n  parameters: UseConnectorClientParameters<config, chainId, selectData> = {},\n): UseConnectorClientReturnType<config, chainId, selectData> {\n  const params = computed(() => deepUnref(parameters))\n  const config = useConfig(params)\n  const chainId = useChainId({ config })\n  const { address, connector } = useConnection({ config })\n  const options = computed(() =>\n    getConnectorClientQueryOptions(config as any, {\n      ...(params.value as any),\n      chainId: params.value.chainId ?? chainId.value,\n      connector: (params.value.connector ?? connector.value) as Connector,\n    }),\n  )\n\n  const addressRef = ref(address)\n  const queryClient = useQueryClient()\n  watchEffect(() => {\n    const previousAddress = addressRef.value\n    if (!address && previousAddress) {\n      queryClient.removeQueries({ queryKey: options.value.queryKey })\n      addressRef.value = undefined\n    } else if (address.value !== previousAddress) {\n      queryClient.invalidateQueries({ queryKey: options.value.queryKey })\n      addressRef.value = address.value\n    }\n  })\n\n  return useQuery(options as any) as any\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useConnectors.test.ts",
    "content": "import { mock } from '@wagmi/connectors'\nimport { accounts, config } from '@wagmi/test'\nimport { renderComposable } from '@wagmi/test/vue'\nimport { expect, test } from 'vitest'\n\nimport { useConnectors } from './useConnectors.js'\n\ntest('default', async () => {\n  const [connectors] = renderComposable(() => useConnectors())\n\n  const count = config.connectors.length\n  expect(connectors.value.length).toBe(count)\n  expect(connectors.value).toEqual(config.connectors)\n\n  config._internal.connectors.setState(() => [\n    ...config.connectors,\n    config._internal.connectors.setup(mock({ accounts })),\n  ])\n\n  expect(connectors.value.length).toBe(count + 1)\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useConnectors.ts",
    "content": "import {\n  type Config,\n  type GetConnectorsReturnType,\n  getConnectors,\n  type ResolvedRegister,\n  watchConnectors,\n} from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport { onScopeDispose, type Ref, ref } from 'vue'\nimport { useConfig } from './useConfig.js'\n\nexport type UseConnectorsParameters<config extends Config = Config> =\n  ConfigParameter<config>\n\nexport type UseConnectorsReturnType<config extends Config = Config> = Ref<\n  GetConnectorsReturnType<config>\n>\n\n/** https://wagmi.sh/vue/api/composables/useConnectors */\nexport function useConnectors<\n  config extends Config = ResolvedRegister['config'],\n>(\n  parameters: UseConnectorsParameters<config> = {},\n): UseConnectorsReturnType<config> {\n  const config = useConfig(parameters)\n\n  const connectors = ref(getConnectors(config))\n  const unsubscribe = watchConnectors(config, {\n    onChange(data) {\n      connectors.value = data as never\n    },\n  })\n  onScopeDispose(() => unsubscribe())\n\n  return connectors\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useDisconnect.test-d.ts",
    "content": "import type { Connector, DisconnectErrorType } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useDisconnect } from './useDisconnect.js'\n\nconst connector = config.connectors[0]!\nconst contextValue = { foo: 'bar' } as const\n\ntest('parameter', () => {\n  expectTypeOf(useDisconnect().mutate)\n    .parameter(0)\n    .toEqualTypeOf<{ connector?: Connector | undefined } | undefined>()\n  expectTypeOf(useDisconnect().mutateAsync)\n    .parameter(0)\n    .toEqualTypeOf<{ connector?: Connector | undefined } | undefined>()\n})\n\ntest('context', () => {\n  const disconnect = useDisconnect({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toEqualTypeOf<\n          { connector?: Connector | undefined } | undefined\n        >()\n        return contextValue\n      },\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<\n          { connector?: Connector | undefined } | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<DisconnectErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<\n          { connector?: Connector | undefined } | undefined\n        >()\n        expectTypeOf(data).toEqualTypeOf<void>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<void | undefined>()\n        expectTypeOf(error).toEqualTypeOf<DisconnectErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<\n          { connector?: Connector | undefined } | undefined\n        >()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  })\n\n  expectTypeOf(disconnect.data.value).toEqualTypeOf<void | undefined>()\n  expectTypeOf(\n    disconnect.error.value,\n  ).toEqualTypeOf<DisconnectErrorType | null>()\n  expectTypeOf(disconnect.variables.value).toEqualTypeOf<\n    { connector?: Connector | undefined } | undefined\n  >()\n  expectTypeOf(disconnect.context.value).toEqualTypeOf<\n    typeof contextValue | undefined\n  >()\n\n  disconnect.mutate(\n    { connector },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<\n          { connector?: Connector | undefined } | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<DisconnectErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<\n          { connector?: Connector | undefined } | undefined\n        >()\n        expectTypeOf(data).toEqualTypeOf<void>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<void | undefined>()\n        expectTypeOf(error).toEqualTypeOf<DisconnectErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<\n          { connector?: Connector | undefined } | undefined\n        >()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  )\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useDisconnect.test.ts",
    "content": "import { connect } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { renderComposable, waitFor } from '@wagmi/test/vue'\nimport { beforeEach, expect, test } from 'vitest'\n\nimport { useConnection } from './useConnection.js'\nimport { useDisconnect } from './useDisconnect.js'\n\nconst connector = config.connectors[0]!\n\nbeforeEach(async () => {\n  await connect(config, { connector })\n})\n\ntest('default', async () => {\n  const [connection] = renderComposable(() => useConnection())\n  const [disconnect] = renderComposable(() => useDisconnect())\n\n  expect(connection.address.value).toBeDefined()\n  expect(connection.status.value).toEqual('connected')\n\n  disconnect.mutate()\n\n  await waitFor(connection.isDisconnected, (isDisconnected) =>\n    Boolean(isDisconnected),\n  )\n\n  expect(connection.address.value).not.toBeDefined()\n  expect(connection.status.value).toEqual('disconnected')\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useDisconnect.ts",
    "content": "import { useMutation } from '@tanstack/vue-query'\nimport type { Connector, DisconnectErrorType } from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type DisconnectData,\n  type DisconnectMutate,\n  type DisconnectMutateAsync,\n  type DisconnectOptions,\n  type DisconnectVariables,\n  disconnectMutationOptions,\n} from '@wagmi/core/query'\nimport { computed, type Ref } from 'vue'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\nimport { useConnections } from './useConnections.js'\n\nexport type UseDisconnectParameters<context = unknown> = Compute<\n  ConfigParameter & DisconnectOptions<context>\n>\n\nexport type UseDisconnectReturnType<context = unknown> = Compute<\n  UseMutationReturnType<\n    DisconnectData,\n    DisconnectErrorType,\n    DisconnectVariables,\n    context,\n    DisconnectMutate<context>,\n    DisconnectMutateAsync<context>\n  > & {\n    /** @deprecated use `useConnections` instead */\n    connectors: Ref<readonly Connector[]>\n    /** @deprecated use `mutate` instead */\n    disconnect: DisconnectMutate<context>\n    /** @deprecated use `mutateAsync` instead */\n    disconnectAsync: DisconnectMutateAsync<context>\n  }\n>\n\n/** https://wagmi.sh/vue/api/composables/useDisconnect */\nexport function useDisconnect<context = unknown>(\n  parameters: UseDisconnectParameters<context> = {},\n): UseDisconnectReturnType<context> {\n  const config = useConfig(parameters)\n  const connections = useConnections({ config })\n  const options = disconnectMutationOptions(config, parameters as any)\n  const mutation = useMutation(options)\n  type Return = UseDisconnectReturnType<context>\n  return {\n    ...(mutation as Return),\n    connectors: computed(() =>\n      connections.value.map((connection) => connection.connector),\n    ),\n    disconnect: mutation.mutate as Return['mutate'],\n    disconnectAsync: mutation.mutateAsync as Return['mutateAsync'],\n  }\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useEnsAddress.test.ts",
    "content": "import { renderComposable, waitFor } from '@wagmi/test/vue'\nimport { expect, test } from 'vitest'\n\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { useEnsAddress } from './useEnsAddress.js'\n\ntest('default', async () => {\n  const [result] = renderComposable(() =>\n    useEnsAddress({\n      name: 'wevm.eth',\n    }),\n  )\n\n  await waitFor(result.isSuccess)\n\n  expect(deepUnref(result)).toMatchInlineSnapshot(`\n    {\n      \"data\": \"0xd2135CfB216b74109775236E36d4b433F1DF507B\",\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"ensAddress\",\n        {\n          \"chainId\": 1,\n          \"name\": \"wevm.eth\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n      \"suspense\": [Function],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useEnsAddress.ts",
    "content": "import type {\n  Config,\n  GetEnsAddressErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetEnsAddressData,\n  type GetEnsAddressOptions,\n  getEnsAddressQueryOptions,\n} from '@wagmi/core/query'\nimport { computed } from 'vue'\nimport type { DeepMaybeRef } from '../types/ref.js'\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseEnsAddressParameters<\n  config extends Config = Config,\n  selectData = GetEnsAddressData,\n> = Compute<\n  DeepMaybeRef<\n    GetEnsAddressOptions<config, selectData> & ConfigParameter<config>\n  >\n>\n\nexport type UseEnsAddressReturnType<selectData = GetEnsAddressData> =\n  UseQueryReturnType<selectData, GetEnsAddressErrorType>\n\n/** https://wagmi.sh/vue/api/composables/useEnsAddress */\nexport function useEnsAddress<\n  config extends Config = ResolvedRegister['config'],\n  selectData = GetEnsAddressData,\n>(\n  parameters: UseEnsAddressParameters<config, selectData> = {},\n): UseEnsAddressReturnType<selectData> {\n  const params = computed(() => deepUnref(parameters))\n  const config = useConfig(params)\n  const chainId = useChainId({ config })\n  const options = computed(() =>\n    getEnsAddressQueryOptions(config as any, {\n      ...params.value,\n      chainId: params.value.chainId ?? chainId.value,\n    }),\n  )\n  return useQuery(options as any) as any\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useEnsAvatar.test.ts",
    "content": "import { renderComposable, waitFor } from '@wagmi/test/vue'\nimport { expect, test } from 'vitest'\n\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { useEnsAvatar } from './useEnsAvatar.js'\n\ntest.skip('default', async () => {\n  const [result] = renderComposable(() =>\n    useEnsAvatar({\n      name: 'wevm.eth',\n    }),\n  )\n\n  await waitFor(result.isSuccess)\n\n  expect(deepUnref(result)).toMatchInlineSnapshot(`\n    {\n      \"data\": \"https://euc.li/wevm.eth\",\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"ensAvatar\",\n        {\n          \"chainId\": 1,\n          \"name\": \"wevm.eth\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n      \"suspense\": [Function],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useEnsAvatar.ts",
    "content": "import type {\n  Config,\n  GetEnsAvatarErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetEnsAvatarData,\n  type GetEnsAvatarOptions,\n  getEnsAvatarQueryOptions,\n} from '@wagmi/core/query'\nimport { computed } from 'vue'\nimport type { DeepMaybeRef } from '../types/ref.js'\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseEnsAvatarParameters<\n  config extends Config = Config,\n  selectData = GetEnsAvatarData,\n> = Compute<\n  DeepMaybeRef<\n    GetEnsAvatarOptions<config, selectData> & ConfigParameter<config>\n  >\n>\n\nexport type UseEnsAvatarReturnType<selectData = GetEnsAvatarData> =\n  UseQueryReturnType<selectData, GetEnsAvatarErrorType>\n\n/** https://wagmi.sh/vue/api/composables/useEnsAvatar */\nexport function useEnsAvatar<\n  config extends Config = ResolvedRegister['config'],\n  selectData = GetEnsAvatarData,\n>(\n  parameters: UseEnsAvatarParameters<config, selectData> = {},\n): UseEnsAvatarReturnType<selectData> {\n  const params = computed(() => deepUnref(parameters))\n  const config = useConfig(params)\n  const chainId = useChainId({ config })\n  const options = computed(() =>\n    getEnsAvatarQueryOptions(config as any, {\n      ...params.value,\n      chainId: params.value.chainId ?? chainId.value,\n    }),\n  )\n  return useQuery(options as any) as any\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useEnsName.test.ts",
    "content": "import { renderComposable, waitFor } from '@wagmi/test/vue'\nimport { expect, test } from 'vitest'\n\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { useEnsName } from './useEnsName.js'\n\ntest('default', async () => {\n  const [result] = renderComposable(() =>\n    useEnsName({\n      address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    }),\n  )\n\n  await waitFor(result.isSuccess)\n\n  expect(deepUnref(result)).toMatchInlineSnapshot(`\n    {\n      \"data\": \"wevm.eth\",\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"ensName\",\n        {\n          \"address\": \"0xd2135CfB216b74109775236E36d4b433F1DF507B\",\n          \"chainId\": 1,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n      \"suspense\": [Function],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useEnsName.ts",
    "content": "import type { Config, GetEnsNameErrorType, ResolvedRegister } from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetEnsNameData,\n  type GetEnsNameOptions,\n  getEnsNameQueryOptions,\n} from '@wagmi/core/query'\nimport { computed } from 'vue'\nimport type { DeepMaybeRef } from '../types/ref.js'\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseEnsNameParameters<\n  config extends Config = Config,\n  selectData = GetEnsNameData,\n> = Compute<\n  DeepMaybeRef<GetEnsNameOptions<config, selectData> & ConfigParameter<config>>\n>\n\nexport type UseEnsNameReturnType<selectData = GetEnsNameData> =\n  UseQueryReturnType<selectData, GetEnsNameErrorType>\n\n/** https://wagmi.sh/vue/api/composables/useEnsName */\nexport function useEnsName<\n  config extends Config = ResolvedRegister['config'],\n  selectData = GetEnsNameData,\n>(\n  parameters: UseEnsNameParameters<config, selectData> = {},\n): UseEnsNameReturnType<selectData> {\n  const params = computed(() => deepUnref(parameters))\n  const config = useConfig(params)\n  const chainId = useChainId({ config })\n  const options = computed(() =>\n    getEnsNameQueryOptions(config as any, {\n      ...params.value,\n      chainId: params.value.chainId ?? chainId.value,\n    }),\n  )\n  return useQuery(options as any) as any\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useEstimateGas.test-d.ts",
    "content": "import { expectTypeOf, test } from 'vitest'\n\nimport { useEstimateGas } from './useEstimateGas.js'\n\ntest('select data', () => {\n  const result = useEstimateGas({\n    query: {\n      select(data) {\n        return data.toString()\n      },\n    },\n  })\n  expectTypeOf(result.data.value).toEqualTypeOf<string | undefined>()\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useEstimateGas.test.ts",
    "content": "import { accounts, wait } from '@wagmi/test'\nimport { renderComposable, waitFor } from '@wagmi/test/vue'\nimport { parseEther } from 'viem'\nimport { expect, test } from 'vitest'\n\nimport { ref } from 'vue'\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { useEstimateGas } from './useEstimateGas.js'\n\ntest('default', async () => {\n  const [result] = renderComposable(() =>\n    useEstimateGas({\n      account: accounts[0],\n      to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      value: parseEther('0.01'),\n    }),\n  )\n\n  await waitFor(result.isSuccess)\n\n  expect(deepUnref(result)).toMatchInlineSnapshot(`\n    {\n      \"data\": 21000n,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"estimateGas\",\n        {\n          \"account\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"chainId\": 1,\n          \"to\": \"0xd2135CfB216b74109775236E36d4b433F1DF507B\",\n          \"value\": 10000000000000000n,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n      \"suspense\": [Function],\n    }\n  `)\n})\n\ntest('behavior: address: undefined -> defined', async () => {\n  const address = ref()\n\n  const [result] = renderComposable(() =>\n    useEstimateGas({\n      account: address,\n      to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      value: parseEther('0.01'),\n    }),\n  )\n\n  await wait(100)\n  expect(result.fetchStatus.value).toBe('idle')\n\n  address.value = accounts[0]\n\n  await waitFor(result.isSuccess)\n\n  expect(deepUnref(result)).toMatchInlineSnapshot(`\n    {\n      \"data\": 21000n,\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"estimateGas\",\n        {\n          \"account\": undefined,\n          \"chainId\": 1,\n          \"to\": \"0xd2135CfB216b74109775236E36d4b433F1DF507B\",\n          \"value\": 10000000000000000n,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n      \"suspense\": [Function],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useEstimateGas.ts",
    "content": "import type {\n  Config,\n  EstimateGasErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type EstimateGasData,\n  type EstimateGasOptions,\n  estimateGasQueryOptions,\n} from '@wagmi/core/query'\nimport { computed } from 'vue'\nimport type { DeepMaybeRef } from '../types/ref.js'\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\nimport { useConnection } from './useConnection.js'\n\nexport type UseEstimateGasParameters<\n  config extends Config = Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  selectData = EstimateGasData,\n> = DeepMaybeRef<\n  EstimateGasOptions<config, chainId, selectData> & ConfigParameter<config>\n>\n\nexport type UseEstimateGasReturnType<selectData = EstimateGasData> =\n  UseQueryReturnType<selectData, EstimateGasErrorType>\n\n/** https://wagmi.sh/react/api/hooks/useEstimateGas */\nexport function useEstimateGas<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  selectData = EstimateGasData,\n>(\n  parameters?: UseEstimateGasParameters<config, chainId, selectData>,\n): UseEstimateGasReturnType<selectData>\n\nexport function useEstimateGas(\n  parameters: UseEstimateGasParameters = {},\n): UseEstimateGasReturnType {\n  const params = computed(() => deepUnref(parameters))\n  const config = useConfig(params)\n  const { address, connector } = useConnection({ config })\n  const chainId = useChainId({ config })\n  const options = computed(() =>\n    estimateGasQueryOptions(config as any, {\n      ...params.value,\n      account: params.value.account ?? address.value,\n      chainId: params.value.chainId ?? chainId.value,\n      connector: params.value.connector ?? connector.value,\n    }),\n  )\n  return useQuery(options as any) as any\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useReadContract.test-d.ts",
    "content": "import { abi } from '@wagmi/test'\nimport type { Address } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport { ref } from 'vue'\n\nimport type { DeepUnwrapRef } from '../types/ref.js'\nimport {\n  type UseReadContractParameters,\n  type UseReadContractReturnType,\n  useReadContract,\n} from './useReadContract.js'\n\ntest('select data', () => {\n  const result = useReadContract({\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'balanceOf',\n    args: ['0x'],\n    query: {\n      select(data) {\n        expectTypeOf(data).toEqualTypeOf<bigint>()\n        return data?.toString()\n      },\n    },\n  })\n  expectTypeOf(result.data.value).toEqualTypeOf<string | undefined>()\n})\n\ntest('UseReadContractParameters', () => {\n  type Result = DeepUnwrapRef<\n    UseReadContractParameters<typeof abi.erc20, 'balanceOf'>\n  >\n  expectTypeOf<{\n    functionName?:\n      | 'symbol'\n      | 'name'\n      | 'allowance'\n      | 'balanceOf'\n      | 'decimals'\n      | 'totalSupply'\n      | undefined\n    args?: readonly [Address] | undefined\n  }>().toEqualTypeOf<Pick<Result, 'args' | 'functionName'>>()\n})\n\ntest('UseReadContractReturnType', () => {\n  type Result = UseReadContractReturnType<typeof abi.erc20, 'balanceOf'>\n  expectTypeOf<Result['data']['value']>().toEqualTypeOf<bigint | undefined>()\n})\n\ntest('overloads', () => {\n  useReadContract({\n    address: '0x',\n    abi: abi.viewOverloads,\n    functionName: 'foo',\n    query: {\n      select(data) {\n        expectTypeOf(data).toEqualTypeOf<number>()\n        return data\n      },\n    },\n  })\n\n  useReadContract({\n    address: '0x',\n    abi: abi.viewOverloads,\n    functionName: 'foo',\n    args: [],\n    query: {\n      select(data) {\n        expectTypeOf(data).toEqualTypeOf<number>()\n        return data\n      },\n    },\n  })\n\n  useReadContract({\n    address: '0x',\n    abi: abi.viewOverloads,\n    functionName: 'foo',\n    args: ['0x'],\n    query: {\n      select(data) {\n        expectTypeOf(data).toEqualTypeOf<string>()\n        return data\n      },\n    },\n  })\n\n  useReadContract({\n    address: '0x',\n    abi: abi.viewOverloads,\n    functionName: 'foo',\n    args: ['0x', '0x'],\n    query: {\n      select(data) {\n        expectTypeOf(data).toEqualTypeOf<{\n          foo: `0x${string}`\n          bar: `0x${string}`\n        }>()\n        return data\n      },\n    },\n  })\n})\n\ntest('deployless read (bytecode)', () => {\n  const result = useReadContract({\n    code: '0x',\n    abi: abi.erc20,\n    functionName: 'balanceOf',\n    args: ['0x'],\n  })\n  expectTypeOf(result.data.value).toEqualTypeOf<bigint | undefined>()\n})\n\ntest('loose parameters with refs', () => {\n  const abiRef = abi.erc20\n  const addressRef = ref<`0x${string}`>('0x')\n  const functionNameRef = 'balanceOf'\n  useReadContract({\n    abi: abiRef,\n    address: addressRef,\n    functionName: functionNameRef,\n    args: ['0x'],\n    query: {\n      select(data) {\n        expectTypeOf(data).toEqualTypeOf<bigint>()\n        return data\n      },\n    },\n  })\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useReadContract.test.ts",
    "content": "import { abi, address, bytecode, chain, wait } from '@wagmi/test'\nimport { renderComposable, waitFor } from '@wagmi/test/vue'\nimport { expect, test } from 'vitest'\nimport { ref } from 'vue'\n\nimport { useReadContract } from './useReadContract.js'\n\ntest('default', async () => {\n  const [result] = renderComposable(() =>\n    useReadContract({\n      address: address.wagmiMintExample,\n      abi: abi.wagmiMintExample,\n      functionName: 'balanceOf',\n      args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n    }),\n  )\n\n  await waitFor(result.isSuccess)\n\n  expect(result.data.value).toBe(10n)\n  expect(result.queryKey).toMatchInlineSnapshot(`\n    [\n      \"readContract\",\n      {\n        \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        \"args\": [\n          \"0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC\",\n        ],\n        \"chainId\": 1,\n        \"functionName\": \"balanceOf\",\n      },\n    ]\n  `)\n})\n\ntest('parameters: chainId', async () => {\n  const [result] = renderComposable(() =>\n    useReadContract({\n      address: address.wagmiMintExample,\n      abi: abi.wagmiMintExample,\n      functionName: 'balanceOf',\n      args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],\n      chainId: chain.mainnet2.id,\n    }),\n  )\n\n  await waitFor(result.isSuccess)\n\n  expect(result.data.value).toBe(10n)\n  expect(result.queryKey).toMatchInlineSnapshot(`\n    [\n      \"readContract\",\n      {\n        \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        \"args\": [\n          \"0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC\",\n        ],\n        \"chainId\": 456,\n        \"functionName\": \"balanceOf\",\n      },\n    ]\n  `)\n})\n\ntest('parameters: deployless read (bytecode)', async () => {\n  const [result] = renderComposable(() =>\n    useReadContract({\n      abi: abi.wagmiMintExample,\n      functionName: 'name',\n      code: bytecode.wagmiMintExample,\n    }),\n  )\n\n  await waitFor(result.isSuccess)\n\n  expect(result.data.value).toMatchInlineSnapshot(`\"wagmi\"`)\n})\n\ntest.skip('behavior: disabled when missing properties', async () => {\n  const addressRef = ref()\n  const abiRef = ref()\n  const functionNameRef = ref()\n\n  const [result] = renderComposable(() =>\n    useReadContract({\n      abi: abiRef,\n      address: addressRef,\n      functionName: functionNameRef,\n    }),\n  )\n\n  await wait(100)\n  expect(result.fetchStatus.value).toBe('idle')\n\n  addressRef.value = '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2'\n\n  await wait(100)\n  expect(result.fetchStatus.value).toBe('idle')\n\n  abiRef.value = abi.wagmiMintExample\n  functionNameRef.value = 'totalSupply'\n\n  await wait(100)\n  expect(result.fetchStatus.value).toBe('fetching')\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useReadContract.ts",
    "content": "import type {\n  Config,\n  ReadContractErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { ConfigParameter, UnionCompute } from '@wagmi/core/internal'\nimport {\n  type ReadContractData,\n  type ReadContractOptions,\n  readContractQueryOptions,\n} from '@wagmi/core/query'\nimport type { Abi, ContractFunctionArgs, ContractFunctionName } from 'viem'\nimport { computed, type MaybeRef } from 'vue'\nimport type { DeepMaybeRef } from '../types/ref.js'\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseReadContractParameters<\n  abi extends Abi | readonly unknown[] = Abi,\n  functionName extends ContractFunctionName<\n    abi,\n    'pure' | 'view'\n  > = ContractFunctionName<abi, 'pure' | 'view'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'pure' | 'view',\n    functionName\n  > = ContractFunctionArgs<abi, 'pure' | 'view', functionName>,\n  config extends Config = Config,\n  selectData = ReadContractData<abi, functionName, args>,\n> = MaybeRef<\n  UnionCompute<\n    ReadContractOptions<abi, functionName, args, config, selectData> &\n      ConfigParameter<config>\n  >\n>\n\ntype UseReadContractParametersLoose<\n  abi extends Abi | readonly unknown[] = Abi,\n  functionName extends ContractFunctionName<\n    abi,\n    'pure' | 'view'\n  > = ContractFunctionName<abi, 'pure' | 'view'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'pure' | 'view',\n    functionName\n  > = ContractFunctionArgs<abi, 'pure' | 'view', functionName>,\n  config extends Config = Config,\n  selectData = ReadContractData<abi, functionName, args>,\n> = DeepMaybeRef<\n  ReadContractOptions<abi, functionName, args, config, selectData> &\n    ConfigParameter<Config>\n>\n\nexport type UseReadContractReturnType<\n  abi extends Abi | readonly unknown[] = Abi,\n  functionName extends ContractFunctionName<\n    abi,\n    'pure' | 'view'\n  > = ContractFunctionName<abi, 'pure' | 'view'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'pure' | 'view',\n    functionName\n  > = ContractFunctionArgs<abi, 'pure' | 'view', functionName>,\n  selectData = ReadContractData<abi, functionName, args>,\n> = UseQueryReturnType<selectData, ReadContractErrorType>\n\n/** https://wagmi.sh/vue/api/hooks/useReadContract */\nexport function useReadContract<\n  const abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'pure' | 'view'>,\n  const args extends ContractFunctionArgs<abi, 'pure' | 'view', functionName>,\n  config extends Config = ResolvedRegister['config'],\n  selectData = ReadContractData<abi, functionName, args>,\n>(\n  parameters: UseReadContractParameters<\n    abi,\n    functionName,\n    args,\n    config,\n    selectData\n  >,\n): UseReadContractReturnType<abi, functionName, args, selectData>\nexport function useReadContract<\n  const abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'pure' | 'view'>,\n  const args extends ContractFunctionArgs<abi, 'pure' | 'view', functionName>,\n  config extends Config = ResolvedRegister['config'],\n  selectData = ReadContractData<abi, functionName, args>,\n>(\n  parameters: UseReadContractParametersLoose<\n    abi,\n    functionName,\n    args,\n    config,\n    selectData\n  >,\n): UseReadContractReturnType\nexport function useReadContract(\n  parameters: UseReadContractParametersLoose = {},\n): UseReadContractReturnType {\n  const params = computed(() => deepUnref(parameters)) as any\n  const config = useConfig(params)\n  const chainId = useChainId({ config })\n  const options = computed(() =>\n    readContractQueryOptions(config as any, {\n      ...params.value,\n      chainId: params.value.chainId ?? chainId.value,\n    }),\n  )\n  return useQuery(options as any) as any\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useReconnect.test-d.ts",
    "content": "import type {\n  Connector,\n  CreateConnectorFn,\n  ReconnectErrorType,\n} from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport type { Address } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport { useReconnect } from './useReconnect.js'\n\nconst connectors = [config.connectors[0]!]\nconst contextValue = { foo: 'bar' } as const\n\ntest('context', () => {\n  const { context, data, error, reconnect, variables } = useReconnect({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toEqualTypeOf<\n          | {\n              connectors?:\n                | readonly (CreateConnectorFn | Connector)[]\n                | undefined\n            }\n          | undefined\n        >()\n        return contextValue\n      },\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<\n          | {\n              connectors?:\n                | readonly (CreateConnectorFn | Connector)[]\n                | undefined\n            }\n          | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<ReconnectErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<\n          | {\n              connectors?:\n                | readonly (CreateConnectorFn | Connector)[]\n                | undefined\n            }\n          | undefined\n        >()\n        expectTypeOf(data).toEqualTypeOf<\n          {\n            accounts: readonly [Address, ...Address[]]\n            chainId: number\n            connector: Connector\n          }[]\n        >()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<\n          | {\n              accounts: readonly [Address, ...Address[]]\n              chainId: number\n              connector: Connector\n            }[]\n          | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<ReconnectErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<\n          | {\n              connectors?:\n                | readonly (CreateConnectorFn | Connector)[]\n                | undefined\n            }\n          | undefined\n        >()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  })\n\n  expectTypeOf(data.value).toEqualTypeOf<\n    | {\n        accounts: readonly [Address, ...Address[]]\n        chainId: number\n        connector: Connector\n      }[]\n    | undefined\n  >()\n  expectTypeOf(error.value).toEqualTypeOf<ReconnectErrorType | null>()\n  expectTypeOf(variables.value).toEqualTypeOf<\n    | {\n        connectors?: readonly (CreateConnectorFn | Connector)[] | undefined\n      }\n    | undefined\n  >()\n  expectTypeOf(context.value).toEqualTypeOf<typeof contextValue | undefined>()\n\n  reconnect(\n    { connectors },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<\n          | {\n              connectors?:\n                | readonly (CreateConnectorFn | Connector)[]\n                | undefined\n            }\n          | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<ReconnectErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<\n          | {\n              connectors?:\n                | readonly (CreateConnectorFn | Connector)[]\n                | undefined\n            }\n          | undefined\n        >()\n        expectTypeOf(data).toEqualTypeOf<\n          {\n            accounts: readonly [Address, ...Address[]]\n            chainId: number\n            connector: Connector\n          }[]\n        >()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<\n          | {\n              accounts: readonly [Address, ...Address[]]\n              chainId: number\n              connector: Connector\n            }[]\n          | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<ReconnectErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<\n          | {\n              connectors?:\n                | readonly (CreateConnectorFn | Connector)[]\n                | undefined\n            }\n          | undefined\n        >()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  )\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useReconnect.test.ts",
    "content": "import { mock } from '@wagmi/connectors'\nimport { connect, disconnect } from '@wagmi/core'\nimport { accounts, config } from '@wagmi/test'\nimport { renderComposable, waitFor } from '@wagmi/test/vue'\nimport { afterEach, expect, test } from 'vitest'\n\nimport { useReconnect } from './useReconnect.js'\n\nconst connector = config._internal.connectors.setup(\n  mock({\n    accounts,\n    features: { reconnect: true },\n  }),\n)\n\nafterEach(async () => {\n  if (config.state.current) await disconnect(config)\n})\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const [reconnect] = renderComposable(() => useReconnect())\n\n  reconnect.mutate()\n  await waitFor(reconnect.isSuccess)\n\n  expect(reconnect.data.value).toStrictEqual([])\n})\n\ntest('parameters: connectors (Connector)', async () => {\n  await connect(config, { connector })\n\n  const [reconnect] = renderComposable(() => useReconnect())\n\n  reconnect.mutate({ connectors: [connector] })\n  await waitFor(reconnect.isSuccess)\n\n  expect(reconnect.data.value).toMatchObject(\n    expect.arrayContaining([\n      expect.objectContaining({\n        accounts: expect.any(Array),\n        chainId: expect.any(Number),\n      }),\n    ]),\n  )\n})\n\ntest('parameters: connectors (CreateConnectorFn)', async () => {\n  const connector = mock({\n    accounts,\n    features: { reconnect: true },\n  })\n  await connect(config, { connector })\n\n  const [reconnect] = renderComposable(() => useReconnect())\n\n  reconnect.mutate({ connectors: [connector] })\n  await waitFor(reconnect.isSuccess)\n\n  expect(reconnect.data.value).toMatchObject(\n    expect.arrayContaining([\n      expect.objectContaining({\n        accounts: expect.any(Array),\n        chainId: expect.any(Number),\n      }),\n    ]),\n  )\n})\n\ntest(\"behavior: doesn't reconnect if already reconnecting\", async () => {\n  const previousStatus = config.state.status\n  config.setState((x) => ({ ...x, status: 'reconnecting' }))\n\n  const [reconnect] = renderComposable(() => useReconnect())\n\n  await expect(\n    reconnect.mutateAsync({ connectors: [connector] }),\n  ).resolves.toStrictEqual([])\n  config.setState((x) => ({ ...x, status: previousStatus }))\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useReconnect.ts",
    "content": "import type { Connector, ReconnectErrorType } from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type ReconnectData,\n  type ReconnectMutate,\n  type ReconnectMutateAsync,\n  type ReconnectOptions,\n  type ReconnectVariables,\n  reconnectMutationOptions,\n} from '@wagmi/core/query'\nimport { type UseMutationReturnType, useMutation } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseReconnectParameters<context = unknown> = Compute<\n  ConfigParameter & ReconnectOptions<context>\n>\n\nexport type UseReconnectReturnType<context = unknown> = Compute<\n  UseMutationReturnType<\n    ReconnectData,\n    ReconnectErrorType,\n    ReconnectVariables,\n    context,\n    ReconnectMutate<context>,\n    ReconnectMutateAsync<context>\n  > & {\n    connectors: readonly Connector[]\n    /** @deprecated use `mutate` instead */\n    reconnect: ReconnectMutate<context>\n    /** @deprecated use `mutateAsync` instead */\n    reconnectAsync: ReconnectMutateAsync<context>\n  }\n>\n\n/** https://wagmi.sh/vue/api/composables/useReconnect */\nexport function useReconnect<context = unknown>(\n  parameters: UseReconnectParameters<context> = {},\n): UseReconnectReturnType<context> {\n  const config = useConfig(parameters)\n  const options = reconnectMutationOptions(config, parameters as any)\n  const mutation = useMutation(options)\n  type Return = UseReconnectReturnType<context>\n  return {\n    ...(mutation as Return),\n    connectors: config.connectors,\n    reconnect: mutation.mutate as Return['mutate'],\n    reconnectAsync: mutation.mutateAsync as Return['mutateAsync'],\n  }\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useSendTransaction.test-d.ts",
    "content": "import type { SendTransactionErrorType } from '@wagmi/core'\nimport type { Hash } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useSendTransaction } from './useSendTransaction.js'\n\nconst contextValue = { foo: 'bar' } as const\n\ntest('context', () => {\n  const sendTransaction = useSendTransaction({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toMatchTypeOf<\n          { chainId?: number | undefined } | undefined\n        >()\n        return contextValue\n      },\n      onError(error, variables, context) {\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n        }>()\n        expectTypeOf(error).toEqualTypeOf<SendTransactionErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n        }>()\n        expectTypeOf(data).toEqualTypeOf<Hash>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<Hash | undefined>()\n        expectTypeOf(error).toEqualTypeOf<SendTransactionErrorType | null>()\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  })\n\n  expectTypeOf(sendTransaction.data.value).toEqualTypeOf<Hash | undefined>()\n  expectTypeOf(\n    sendTransaction.error.value,\n  ).toEqualTypeOf<SendTransactionErrorType | null>()\n  expectTypeOf(sendTransaction.variables.value).toMatchTypeOf<\n    { chainId?: number | undefined } | undefined\n  >()\n  expectTypeOf(sendTransaction.context.value).toEqualTypeOf<\n    typeof contextValue | undefined\n  >()\n\n  sendTransaction.mutate(\n    { to: '0x' },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n        }>()\n        expectTypeOf(error).toEqualTypeOf<SendTransactionErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n        }>()\n        expectTypeOf(data).toEqualTypeOf<Hash>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<Hash | undefined>()\n        expectTypeOf(error).toEqualTypeOf<SendTransactionErrorType | null>()\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  )\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useSendTransaction.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { config, transactionHashRegex } from '@wagmi/test'\nimport { renderComposable, waitFor } from '@wagmi/test/vue'\nimport { parseEther } from 'viem'\nimport { expect, test } from 'vitest'\n\nimport { useSendTransaction } from './useSendTransaction.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const [result] = renderComposable(() => useSendTransaction())\n\n  result.mutate({\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n  })\n  await waitFor(result.isSuccess)\n\n  expect(result.data.value).toMatch(transactionHashRegex)\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useSendTransaction.ts",
    "content": "import { useMutation } from '@tanstack/vue-query'\nimport type {\n  Config,\n  ResolvedRegister,\n  SendTransactionErrorType,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type SendTransactionData,\n  type SendTransactionMutate,\n  type SendTransactionMutateAsync,\n  type SendTransactionOptions,\n  type SendTransactionVariables,\n  sendTransactionMutationOptions,\n} from '@wagmi/core/query'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseSendTransactionParameters<\n  config extends Config = Config,\n  context = unknown,\n> = Compute<ConfigParameter<config> & SendTransactionOptions<config, context>>\n\nexport type UseSendTransactionReturnType<\n  config extends Config = Config,\n  context = unknown,\n> = Compute<\n  UseMutationReturnType<\n    SendTransactionData,\n    SendTransactionErrorType,\n    SendTransactionVariables<config, config['chains'][number]['id']>,\n    context,\n    SendTransactionMutate<config, context>,\n    SendTransactionMutateAsync<config, context>\n  > & {\n    /** @deprecated use `mutate` instead */\n    sendTransaction: SendTransactionMutate<config, context>\n    /** @deprecated use `mutateAsync` instead */\n    sendTransactionAsync: SendTransactionMutateAsync<config, context>\n  }\n>\n\n/** https://wagmi.sh/vue/api/composables/useSendTransaction */\nexport function useSendTransaction<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: UseSendTransactionParameters<config, context> = {},\n): UseSendTransactionReturnType<config, context> {\n  const config = useConfig(parameters)\n  const options = sendTransactionMutationOptions(config, parameters)\n  const mutation = useMutation(options)\n  type Return = UseSendTransactionReturnType<config, context>\n  return {\n    ...(mutation as Return),\n    sendTransaction: mutation.mutate as Return['mutate'],\n    sendTransactionAsync: mutation.mutateAsync as Return['mutateAsync'],\n  }\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useSignMessage.test-d.ts",
    "content": "import type { SignMessageErrorType } from '@wagmi/core'\nimport type { SignMessageVariables } from '@wagmi/core/query'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useSignMessage } from './useSignMessage.js'\n\nconst message = 'hello world'\nconst contextValue = { foo: 'bar' } as const\n\ntest('context', () => {\n  const signMessage = useSignMessage({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toEqualTypeOf<SignMessageVariables>()\n        return contextValue\n      },\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<SignMessageVariables>()\n        expectTypeOf(error).toEqualTypeOf<SignMessageErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<SignMessageVariables>()\n        expectTypeOf(data).toEqualTypeOf<`0x${string}`>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<`0x${string}` | undefined>()\n        expectTypeOf(error).toEqualTypeOf<SignMessageErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<SignMessageVariables>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  })\n\n  expectTypeOf(signMessage.data.value).toEqualTypeOf<\n    `0x${string}` | undefined\n  >()\n  expectTypeOf(\n    signMessage.error.value,\n  ).toEqualTypeOf<SignMessageErrorType | null>()\n  expectTypeOf(signMessage.variables.value).toEqualTypeOf<\n    SignMessageVariables | undefined\n  >()\n  expectTypeOf(signMessage.context.value).toEqualTypeOf<\n    typeof contextValue | undefined\n  >()\n\n  signMessage.mutate(\n    { message },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<SignMessageVariables>()\n        expectTypeOf(error).toEqualTypeOf<SignMessageErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<SignMessageVariables>()\n        expectTypeOf(data).toEqualTypeOf<`0x${string}`>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<`0x${string}` | undefined>()\n        expectTypeOf(error).toEqualTypeOf<SignMessageErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<SignMessageVariables>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  )\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useSignMessage.test.ts",
    "content": "import { connect, disconnect, getConnection } from '@wagmi/core'\nimport { config, privateKey } from '@wagmi/test'\nimport { renderComposable, waitFor } from '@wagmi/test/vue'\nimport { recoverMessageAddress } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { expect, test } from 'vitest'\nimport { useSignMessage } from './useSignMessage.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const [result] = renderComposable(() => useSignMessage())\n\n  result.mutate({ message: 'foo bar baz' })\n  await waitFor(result.isSuccess)\n\n  await expect(\n    recoverMessageAddress({\n      message: 'foo bar baz',\n      signature: result.data.value!,\n    }),\n  ).resolves.toEqual(getConnection(config).address)\n\n  await disconnect(config, { connector })\n})\n\ntest('behavior: local account', async () => {\n  const [result] = renderComposable(() => useSignMessage())\n\n  const account = privateKeyToAccount(privateKey)\n  result.mutate({ account, message: 'foo bar baz' })\n  await waitFor(result.isSuccess)\n\n  await expect(\n    recoverMessageAddress({\n      message: 'foo bar baz',\n      signature: result.data.value!,\n    }),\n  ).resolves.toEqual(account.address)\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useSignMessage.ts",
    "content": "import type { SignMessageErrorType } from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type SignMessageData,\n  type SignMessageMutate,\n  type SignMessageMutateAsync,\n  type SignMessageOptions,\n  type SignMessageVariables,\n  signMessageMutationOptions,\n} from '@wagmi/core/query'\nimport { type UseMutationReturnType, useMutation } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseSignMessageParameters<context = unknown> = Compute<\n  ConfigParameter & SignMessageOptions<context>\n>\n\nexport type UseSignMessageReturnType<context = unknown> = Compute<\n  UseMutationReturnType<\n    SignMessageData,\n    SignMessageErrorType,\n    SignMessageVariables,\n    context,\n    SignMessageMutate<context>,\n    SignMessageMutateAsync<context>\n  > & {\n    /** @deprecated use `mutate` instead */\n    signMessage: SignMessageMutate<context>\n    /** @deprecated use `mutateAsync` instead */\n    signMessageAsync: SignMessageMutateAsync<context>\n  }\n>\n\n/** https://wagmi.sh/vue/api/composables/useSignMessage */\nexport function useSignMessage<context = unknown>(\n  parameters: UseSignMessageParameters<context> = {},\n): UseSignMessageReturnType<context> {\n  const config = useConfig(parameters)\n  const options = signMessageMutationOptions(config, parameters)\n  const mutation = useMutation(options)\n  type Return = UseSignMessageReturnType<context>\n  return {\n    ...(mutation as Return),\n    signMessage: mutation.mutate as Return['mutate'],\n    signMessageAsync: mutation.mutateAsync as Return['mutateAsync'],\n  }\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useSignTransaction.test-d.ts",
    "content": "import type { SignTransactionErrorType } from '@wagmi/core'\nimport type {\n  Hash,\n  TransactionSerializedEIP1559,\n  TransactionSerializedEIP2930,\n  TransactionSerializedEIP4844,\n  TransactionSerializedEIP7702,\n  TransactionSerializedLegacy,\n} from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport { useSignTransaction } from './useSignTransaction.js'\n\nconst contextValue = { foo: 'bar' } as const\n\ntest('context', () => {\n  const signTransaction = useSignTransaction({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toMatchTypeOf<\n          { chainId?: number | undefined } | undefined\n        >()\n        return contextValue\n      },\n      onError(error, variables, context) {\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n        }>()\n        expectTypeOf(error).toEqualTypeOf<SignTransactionErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n        }>()\n        expectTypeOf(data).toMatchTypeOf<Hash>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toMatchTypeOf<Hash | undefined>()\n        expectTypeOf(error).toEqualTypeOf<SignTransactionErrorType | null>()\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  })\n\n  expectTypeOf(signTransaction.data.value).toMatchTypeOf<Hash | undefined>()\n  expectTypeOf(\n    signTransaction.error.value,\n  ).toEqualTypeOf<SignTransactionErrorType | null>()\n  expectTypeOf(signTransaction.variables.value).toMatchTypeOf<\n    { chainId?: number | undefined } | undefined\n  >()\n  expectTypeOf(signTransaction.context.value).toEqualTypeOf<\n    typeof contextValue | undefined\n  >()\n\n  signTransaction.mutate(\n    { to: '0x' },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n        }>()\n        expectTypeOf(error).toEqualTypeOf<SignTransactionErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n        }>()\n        expectTypeOf(data).toMatchTypeOf<Hash>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toMatchTypeOf<Hash | undefined>()\n        expectTypeOf(error).toEqualTypeOf<SignTransactionErrorType | null>()\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  )\n})\n\ntest('legacy', () => {\n  const { mutateAsync } = useSignTransaction()\n\n  const result1 = mutateAsync({ gasPrice: 0n })\n  const result2 = mutateAsync({ type: 'legacy' })\n\n  expectTypeOf(result1).toEqualTypeOf<Promise<TransactionSerializedLegacy>>()\n  expectTypeOf(result2).toEqualTypeOf<Promise<TransactionSerializedLegacy>>()\n\n  // @ts-expect-error\n  mutateAsync({\n    gasPrice: 0n,\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n  })\n\n  // @ts-expect-error\n  mutateAsync({\n    gasPrice: 0n,\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n    type: 'legacy',\n  })\n  // @ts-expect-error\n  mutateAsync({\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n    type: 'legacy',\n  })\n})\n\ntest('eip7702', () => {\n  const { mutateAsync } = useSignTransaction()\n\n  const result1 = mutateAsync({\n    authorizationList: [],\n  })\n  const result2 = mutateAsync({\n    authorizationList: [],\n    type: 'eip7702',\n  })\n\n  expectTypeOf(result1).toEqualTypeOf<Promise<TransactionSerializedEIP7702>>()\n  expectTypeOf(result2).toEqualTypeOf<Promise<TransactionSerializedEIP7702>>()\n})\n\ntest('eip4844', () => {\n  const { mutateAsync } = useSignTransaction()\n\n  const result1 = mutateAsync({\n    blobVersionedHashes: [],\n    maxFeePerBlobGas: 0n,\n    to: '0x0000000000000000000000000000000000000000',\n  })\n  const result2 = mutateAsync({\n    blobVersionedHashes: [],\n    maxFeePerBlobGas: 0n,\n    to: '0x0000000000000000000000000000000000000000',\n    type: 'eip4844',\n  })\n\n  expectTypeOf(result1).toEqualTypeOf<Promise<TransactionSerializedEIP4844>>()\n  expectTypeOf(result2).toEqualTypeOf<Promise<TransactionSerializedEIP4844>>()\n})\n\ntest('eip1559', () => {\n  const { mutateAsync } = useSignTransaction()\n\n  const result1 = mutateAsync({\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n  })\n  const result2 = mutateAsync({\n    type: 'eip1559',\n  })\n\n  expectTypeOf(result1).toEqualTypeOf<Promise<TransactionSerializedEIP1559>>()\n  expectTypeOf(result2).toEqualTypeOf<Promise<TransactionSerializedEIP1559>>()\n\n  // @ts-expect-error\n  mutateAsync({\n    gasPrice: 0n,\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n  })\n\n  // @ts-expect-error\n  mutateAsync({\n    gasPrice: 0n,\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n    type: 'eip1559',\n  })\n  // @ts-expect-error\n  mutateAsync({\n    gasPrice: 0n,\n    type: 'eip1559',\n  })\n})\n\ntest('eip2930', () => {\n  const { mutateAsync } = useSignTransaction()\n\n  const result1 = mutateAsync({\n    accessList: [],\n    gasPrice: 0n,\n  })\n  const result2 = mutateAsync({\n    type: 'eip2930',\n  })\n\n  expectTypeOf(result1).toEqualTypeOf<Promise<TransactionSerializedEIP2930>>()\n  expectTypeOf(result2).toEqualTypeOf<Promise<TransactionSerializedEIP2930>>()\n\n  // @ts-expect-error\n  mutateAsync({\n    accessList: [],\n    gasPrice: 0n,\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n  })\n\n  // @ts-expect-error\n  mutateAsync({\n    accessList: [],\n    gasPrice: 0n,\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n    type: 'eip2930',\n  })\n  // @ts-expect-error\n  mutateAsync({\n    accessList: [],\n    maxFeePerGas: 0n,\n    maxPriorityFeePerGas: 0n,\n    type: 'eip2930',\n  })\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useSignTransaction.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { config, signedTransactionRegex } from '@wagmi/test'\nimport { renderComposable, waitFor } from '@wagmi/test/vue'\nimport { parseEther } from 'viem'\nimport { expect, test } from 'vitest'\n\nimport { useSignTransaction } from './useSignTransaction.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const [result] = renderComposable(() => useSignTransaction())\n\n  result.mutate({\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n  })\n  await waitFor(result.isSuccess)\n\n  expect(result.data.value).toMatch(signedTransactionRegex)\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useSignTransaction.ts",
    "content": "import { useMutation } from '@tanstack/vue-query'\nimport type {\n  Config,\n  ResolvedRegister,\n  SelectChains,\n  SignTransactionErrorType,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type SignTransactionData,\n  type SignTransactionMutate,\n  type SignTransactionMutateAsync,\n  type SignTransactionOptions,\n  type SignTransactionVariables,\n  signTransactionMutationOptions,\n} from '@wagmi/core/query'\nimport type { SignTransactionRequest as viem_SignTransactionRequest } from 'viem'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseSignTransactionParameters<\n  config extends Config = Config,\n  request extends viem_SignTransactionRequest<\n    SelectChains<config, config['chains'][number]['id']>[0],\n    SelectChains<config, config['chains'][number]['id']>[0]\n  > = viem_SignTransactionRequest<\n    SelectChains<config, config['chains'][number]['id']>[0],\n    SelectChains<config, config['chains'][number]['id']>[0]\n  >,\n  context = unknown,\n> = Compute<\n  ConfigParameter<config> &\n    SignTransactionOptions<\n      config,\n      config['chains'][number]['id'],\n      request,\n      context\n    >\n>\n\nexport type UseSignTransactionReturnType<\n  config extends Config = Config,\n  request extends viem_SignTransactionRequest<\n    SelectChains<config, config['chains'][number]['id']>[0],\n    SelectChains<config, config['chains'][number]['id']>[0]\n  > = viem_SignTransactionRequest<\n    SelectChains<config, config['chains'][number]['id']>[0],\n    SelectChains<config, config['chains'][number]['id']>[0]\n  >,\n  context = unknown,\n> = Compute<\n  UseMutationReturnType<\n    SignTransactionData<config, config['chains'][number]['id'], request>,\n    SignTransactionErrorType,\n    SignTransactionVariables<config, config['chains'][number]['id'], request>,\n    context,\n    SignTransactionMutate<config, context>,\n    SignTransactionMutateAsync<config, context>\n  > & {\n    /** @deprecated use `mutate` instead */\n    signTransaction: SignTransactionMutate<config, context>\n    /** @deprecated use `mutateAsync` instead */\n    signTransactionAsync: SignTransactionMutateAsync<config, context>\n  }\n>\n\n/** https://wagmi.sh/vue/api/composables/useSignTransaction */\nexport function useSignTransaction<\n  config extends Config = ResolvedRegister['config'],\n  request extends viem_SignTransactionRequest<\n    SelectChains<config, config['chains'][number]['id']>[0],\n    SelectChains<config, config['chains'][number]['id']>[0]\n  > = viem_SignTransactionRequest<\n    SelectChains<config, config['chains'][number]['id']>[0],\n    SelectChains<config, config['chains'][number]['id']>[0]\n  >,\n  context = unknown,\n>(\n  parameters: UseSignTransactionParameters<config, request, context> = {},\n): UseSignTransactionReturnType<config, request, context> {\n  const config = useConfig(parameters)\n  const options = signTransactionMutationOptions(config, parameters)\n  const mutation = useMutation(options)\n  type Return = UseSignTransactionReturnType<config, request, context>\n  return {\n    ...(mutation as unknown as Return),\n    signTransaction: mutation.mutate as Return['mutate'],\n    signTransactionAsync:\n      mutation.mutateAsync as unknown as Return['mutateAsync'],\n  }\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useSignTypedData.test-d.ts",
    "content": "import type {\n  SignTypedDataErrorType,\n  SignTypedDataReturnType,\n} from '@wagmi/core'\nimport type { SignTypedDataVariables } from '@wagmi/core/query'\nimport { typedData } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useSignTypedData } from './useSignTypedData.js'\n\nconst contextValue = { foo: 'bar' } as const\n\ntest('context', () => {\n  const signTypedData = useSignTypedData({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toMatchTypeOf<SignTypedDataVariables>()\n        return contextValue\n      },\n      onError(error, variables, context) {\n        expectTypeOf(variables).toMatchTypeOf<SignTypedDataVariables>()\n        expectTypeOf(error).toEqualTypeOf<SignTypedDataErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toMatchTypeOf<SignTypedDataVariables>()\n        expectTypeOf(data).toEqualTypeOf<SignTypedDataReturnType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<SignTypedDataReturnType | undefined>()\n        expectTypeOf(error).toEqualTypeOf<SignTypedDataErrorType | null>()\n        expectTypeOf(variables).toMatchTypeOf<SignTypedDataVariables>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  })\n\n  expectTypeOf(signTypedData.data.value).toEqualTypeOf<\n    SignTypedDataReturnType | undefined\n  >()\n  expectTypeOf(\n    signTypedData.error.value,\n  ).toEqualTypeOf<SignTypedDataErrorType | null>()\n  expectTypeOf(signTypedData.variables.value).toMatchTypeOf<\n    SignTypedDataVariables | undefined\n  >()\n  expectTypeOf(signTypedData.context.value).toEqualTypeOf<\n    typeof contextValue | undefined\n  >()\n\n  signTypedData.mutate(\n    {\n      types: typedData.basic.types,\n      primaryType: 'Person',\n      message: {\n        name: 'Bob',\n        wallet: '0x',\n      },\n    },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(error).toEqualTypeOf<SignTypedDataErrorType>()\n        expectTypeOf(variables).toMatchTypeOf<{\n          types: typeof typedData.basic.types\n          primaryType: 'Person'\n          message: {\n            name: string\n            wallet: `0x${string}`\n          }\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<SignTypedDataReturnType>()\n        expectTypeOf(variables).toMatchTypeOf<{\n          types: typeof typedData.basic.types\n          primaryType: 'Person'\n          message: {\n            name: string\n            wallet: `0x${string}`\n          }\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<SignTypedDataReturnType | undefined>()\n        expectTypeOf(error).toEqualTypeOf<SignTypedDataErrorType | null>()\n        expectTypeOf(variables).toMatchTypeOf<{\n          types: typeof typedData.basic.types\n          primaryType: 'Person'\n          message: {\n            name: string\n            wallet: `0x${string}`\n          }\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  )\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useSignTypedData.test.ts",
    "content": "import { connect, disconnect, getConnection } from '@wagmi/core'\nimport { config, privateKey, typedData } from '@wagmi/test'\nimport { renderComposable, waitFor } from '@wagmi/test/vue'\nimport { recoverTypedDataAddress } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { expect, test } from 'vitest'\nimport { useSignTypedData } from './useSignTypedData.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const [result] = renderComposable(() => useSignTypedData())\n\n  result.mutate({\n    types: typedData.basic.types,\n    primaryType: 'Mail',\n    message: typedData.basic.message,\n  })\n  await waitFor(result.isSuccess)\n\n  await expect(\n    recoverTypedDataAddress({\n      types: typedData.basic.types,\n      primaryType: 'Mail',\n      message: typedData.basic.message,\n      signature: result.data.value!,\n    }),\n  ).resolves.toEqual(getConnection(config).address)\n\n  await disconnect(config, { connector })\n})\n\ntest('behavior: local account', async () => {\n  const [result] = renderComposable(() => useSignTypedData())\n\n  const account = privateKeyToAccount(privateKey)\n  result.mutate({\n    account,\n    types: typedData.basic.types,\n    primaryType: 'Mail',\n    message: typedData.basic.message,\n  })\n  await waitFor(result.isSuccess)\n\n  await expect(\n    recoverTypedDataAddress({\n      types: typedData.basic.types,\n      primaryType: 'Mail',\n      message: typedData.basic.message,\n      signature: result.data.value!,\n    }),\n  ).resolves.toEqual(account.address)\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useSignTypedData.ts",
    "content": "import type { SignTypedDataErrorType } from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type SignTypedDataData,\n  type SignTypedDataMutate,\n  type SignTypedDataMutateAsync,\n  type SignTypedDataOptions,\n  type SignTypedDataVariables,\n  signTypedDataMutationOptions,\n} from '@wagmi/core/query'\nimport { type UseMutationReturnType, useMutation } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseSignTypedDataParameters<context = unknown> = Compute<\n  ConfigParameter & SignTypedDataOptions<context>\n>\n\nexport type UseSignTypedDataReturnType<context = unknown> = Compute<\n  UseMutationReturnType<\n    SignTypedDataData,\n    SignTypedDataErrorType,\n    SignTypedDataVariables,\n    context,\n    SignTypedDataMutate<context>,\n    SignTypedDataMutateAsync<context>\n  > & {\n    /** @deprecated use `mutate` instead */\n    signTypedData: SignTypedDataMutate<context>\n    /** @deprecated use `mutateAsync` instead */\n    signTypedDataAsync: SignTypedDataMutateAsync<context>\n  }\n>\n\n/** https://wagmi.sh/vue/api/composables/useSignTypedData */\nexport function useSignTypedData<context = unknown>(\n  parameters: UseSignTypedDataParameters<context> = {},\n): UseSignTypedDataReturnType<context> {\n  const config = useConfig(parameters)\n  const options = signTypedDataMutationOptions(config, parameters)\n  const mutation = useMutation(options)\n  type Return = UseSignTypedDataReturnType<context>\n  return {\n    ...(mutation as Return),\n    signTypedData: mutation.mutate as Return['mutate'],\n    signTypedDataAsync: mutation.mutateAsync as Return['mutateAsync'],\n  }\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useSimulateContract.test-d.ts",
    "content": "import { abi, type config } from '@wagmi/test'\nimport type { Address } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\n\nimport {\n  type UseSimulateContractReturnType,\n  useSimulateContract,\n} from './useSimulateContract.js'\n\ntest('default', () => {\n  const result = useSimulateContract({\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n  })\n\n  expectTypeOf(result.data.value).toMatchTypeOf<\n    | {\n        result: boolean\n        request: {\n          chainId?: undefined\n          abi: readonly [\n            {\n              readonly name: 'transferFrom'\n              readonly type: 'function'\n              readonly stateMutability: 'nonpayable'\n              readonly inputs: readonly [\n                { readonly type: 'address'; readonly name: 'sender' },\n                { readonly type: 'address'; readonly name: 'recipient' },\n                { readonly type: 'uint256'; readonly name: 'amount' },\n              ]\n              readonly outputs: readonly [{ type: 'bool' }]\n            },\n          ]\n          functionName: 'transferFrom'\n          args: readonly [Address, Address, bigint]\n        }\n      }\n    | undefined\n  >()\n})\n\ntest('select data', () => {\n  // @ts-ignore TODO: Type instantiation is excessively deep and possibly infinite.\n  const result = useSimulateContract({\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    chainId: 1,\n    query: {\n      select(data) {\n        expectTypeOf(data.result).toEqualTypeOf<boolean>()\n        return data.request.args\n      },\n    },\n  })\n  expectTypeOf(result.data.value).toEqualTypeOf<\n    readonly [Address, Address, bigint] | undefined\n  >()\n})\n\ntest('UseSimulateContractReturnType', () => {\n  type Result = UseSimulateContractReturnType<\n    typeof abi.erc20,\n    'transferFrom',\n    ['0x', '0x', 123n],\n    typeof config,\n    1\n  >\n  expectTypeOf<Result['data']['value']>().toMatchTypeOf<\n    | {\n        result: boolean\n        request: {\n          chainId: number\n          abi: readonly [\n            {\n              readonly name: 'transferFrom'\n              readonly type: 'function'\n              readonly stateMutability: 'nonpayable'\n              readonly inputs: readonly [\n                { readonly type: 'address'; readonly name: 'sender' },\n                { readonly type: 'address'; readonly name: 'recipient' },\n                { readonly type: 'uint256'; readonly name: 'amount' },\n              ]\n              readonly outputs: readonly [{ type: 'bool' }]\n            },\n          ]\n          functionName: 'approve' | 'transfer' | 'transferFrom'\n          args: readonly [Address, Address, bigint]\n        }\n      }\n    | undefined\n  >()\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useSimulateContract.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { abi, address, config, wait } from '@wagmi/test'\nimport { renderComposable, waitFor } from '@wagmi/test/vue'\nimport { expect, test } from 'vitest'\n\nimport { useSimulateContract } from './useSimulateContract.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const [result] = renderComposable(() =>\n    useSimulateContract({\n      address: address.wagmiMintExample,\n      abi: abi.wagmiMintExample,\n      functionName: 'mint',\n    }),\n  )\n\n  await waitFor(result.isSuccess)\n\n  expect(result.data.value).toMatchInlineSnapshot(`\n    {\n      \"chainId\": 1,\n      \"request\": {\n        \"abi\": [\n          {\n            \"inputs\": [],\n            \"name\": \"mint\",\n            \"outputs\": [],\n            \"stateMutability\": \"nonpayable\",\n            \"type\": \"function\",\n          },\n        ],\n        \"account\": {\n          \"address\": \"0x95132632579b073D12a6673e18Ab05777a6B86f8\",\n          \"type\": \"json-rpc\",\n        },\n        \"address\": \"0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2\",\n        \"args\": undefined,\n        \"chainId\": 1,\n        \"dataSuffix\": undefined,\n        \"functionName\": \"mint\",\n      },\n      \"result\": undefined,\n    }\n  `)\n\n  await disconnect(config, { connector })\n})\n\ntest('behavior: disabled when properties missing', async () => {\n  const [result] = renderComposable(() => useSimulateContract())\n\n  await wait(100)\n\n  expect(result.fetchStatus.value).toBe('idle')\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useSimulateContract.ts",
    "content": "import type {\n  Config,\n  ResolvedRegister,\n  SimulateContractErrorType,\n} from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type SimulateContractData,\n  type SimulateContractOptions,\n  simulateContractQueryOptions,\n} from '@wagmi/core/query'\nimport type { Abi, ContractFunctionArgs, ContractFunctionName } from 'viem'\nimport { computed, type MaybeRef } from 'vue'\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\nimport { useConnection } from './useConnection.js'\n\nexport type UseSimulateContractParameters<\n  abi extends Abi | readonly unknown[] = Abi,\n  functionName extends ContractFunctionName<\n    abi,\n    'nonpayable' | 'payable'\n  > = ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  > = ContractFunctionArgs<abi, 'nonpayable' | 'payable', functionName>,\n  config extends Config = Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  selectData = SimulateContractData<abi, functionName, args, config, chainId>,\n> = MaybeRef<\n  SimulateContractOptions<\n    abi,\n    functionName,\n    args,\n    config,\n    chainId,\n    selectData\n  > &\n    ConfigParameter<config>\n>\n\nexport type UseSimulateContractReturnType<\n  abi extends Abi | readonly unknown[] = Abi,\n  functionName extends ContractFunctionName<\n    abi,\n    'nonpayable' | 'payable'\n  > = ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  > = ContractFunctionArgs<abi, 'nonpayable' | 'payable', functionName>,\n  config extends Config = Config,\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  selectData = SimulateContractData<abi, functionName, args, config, chainId>,\n> = UseQueryReturnType<selectData, SimulateContractErrorType>\n\n/** https://wagmi.sh/vue/api/composables/useSimulateContract */\nexport function useSimulateContract<\n  const abi extends Abi | readonly unknown[],\n  functionName extends ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n  args extends ContractFunctionArgs<\n    abi,\n    'nonpayable' | 'payable',\n    functionName\n  >,\n  config extends Config = ResolvedRegister['config'],\n  chainId extends config['chains'][number]['id'] | undefined = undefined,\n  selectData = SimulateContractData<abi, functionName, args, config, chainId>,\n>(\n  parameters: UseSimulateContractParameters<\n    abi,\n    functionName,\n    args,\n    config,\n    chainId,\n    selectData\n  > = {} as any,\n): UseSimulateContractReturnType<\n  abi,\n  functionName,\n  args,\n  config,\n  chainId,\n  selectData\n> {\n  const params = computed(() => deepUnref(parameters)) as any\n  const config = useConfig(params)\n  const { address, connector } = useConnection()\n  const chainId = useChainId({ config })\n  const options = computed(() =>\n    simulateContractQueryOptions(config as any, {\n      ...params.value,\n      account: params.value.account ?? address.value,\n      chainId: params.value.chainId ?? chainId.value,\n      connector: params.value.connector ?? connector.value,\n    }),\n  )\n  return useQuery(options as any) as any\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useSwitchChain.test-d.ts",
    "content": "import type { Connector, SwitchChainErrorType } from '@wagmi/core'\nimport type { Chain } from '@wagmi/core/chains'\nimport type { Compute, ExactPartial } from '@wagmi/core/internal'\nimport { chain } from '@wagmi/test'\nimport type { AddEthereumChainParameter } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport { useSwitchChain } from './useSwitchChain.js'\n\nconst chainId = chain.mainnet.id\nconst contextValue = { foo: 'bar' } as const\n\ntest('context', () => {\n  const switchChain = useSwitchChain({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toEqualTypeOf<{\n          addEthereumChainParameter?:\n            | ExactPartial<Omit<AddEthereumChainParameter, 'chainId'>>\n            | undefined\n          chainId: number\n          connector?: Connector | undefined\n        }>()\n        return contextValue\n      },\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{\n          addEthereumChainParameter?:\n            | ExactPartial<Omit<AddEthereumChainParameter, 'chainId'>>\n            | undefined\n          chainId: number\n          connector?: Connector | undefined\n        }>()\n        expectTypeOf(error).toEqualTypeOf<SwitchChainErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{\n          addEthereumChainParameter?:\n            | ExactPartial<Omit<AddEthereumChainParameter, 'chainId'>>\n            | undefined\n          chainId: number\n          connector?: Connector | undefined\n        }>()\n        expectTypeOf(data).toEqualTypeOf<Compute<Chain>>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<Compute<Chain> | undefined>()\n        expectTypeOf(error).toEqualTypeOf<SwitchChainErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<{\n          addEthereumChainParameter?:\n            | ExactPartial<Omit<AddEthereumChainParameter, 'chainId'>>\n            | undefined\n          chainId: number\n          connector?: Connector | undefined\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  })\n\n  expectTypeOf(switchChain.data.value).toEqualTypeOf<\n    Compute<Chain> | undefined\n  >()\n  expectTypeOf(\n    switchChain.error.value,\n  ).toEqualTypeOf<SwitchChainErrorType | null>()\n  expectTypeOf(switchChain.variables.value).toEqualTypeOf<\n    | {\n        addEthereumChainParameter?:\n          | ExactPartial<Omit<AddEthereumChainParameter, 'chainId'>>\n          | undefined\n        chainId: number\n        connector?: Connector | undefined\n      }\n    | undefined\n  >()\n  expectTypeOf(switchChain.context.value).toEqualTypeOf<\n    typeof contextValue | undefined\n  >()\n\n  switchChain.mutate(\n    { chainId },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{\n          addEthereumChainParameter?:\n            | ExactPartial<Omit<AddEthereumChainParameter, 'chainId'>>\n            | undefined\n          chainId: number\n          connector?: Connector | undefined\n        }>()\n        expectTypeOf(error).toEqualTypeOf<SwitchChainErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{\n          addEthereumChainParameter?:\n            | ExactPartial<Omit<AddEthereumChainParameter, 'chainId'>>\n            | undefined\n          chainId: number\n          connector?: Connector | undefined\n        }>()\n        expectTypeOf(data).toEqualTypeOf<Compute<Chain>>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<Compute<Chain> | undefined>()\n        expectTypeOf(error).toEqualTypeOf<SwitchChainErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<{\n          addEthereumChainParameter?:\n            | ExactPartial<Omit<AddEthereumChainParameter, 'chainId'>>\n            | undefined\n          chainId: number\n          connector?: Connector | undefined\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  )\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useSwitchChain.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { chain, config } from '@wagmi/test'\nimport { renderComposable, waitFor } from '@wagmi/test/vue'\nimport { expect, test } from 'vitest'\n\nimport { useConnection } from './useConnection.js'\nimport { useSwitchChain } from './useSwitchChain.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const [connection] = renderComposable(() => useConnection())\n  const [switchChain] = renderComposable(() => useSwitchChain())\n\n  const chainId1 = connection.chainId.value\n  expect(chainId1).toBeDefined()\n\n  switchChain.mutate({ chainId: chain.mainnet2.id })\n  await waitFor(switchChain.isSuccess)\n\n  const chainId2 = connection.chainId.value\n  expect(chainId2).toBeDefined()\n  expect(chainId1).not.toBe(chainId2)\n\n  switchChain.mutate({ chainId: chain.mainnet.id })\n  await waitFor(switchChain.isSuccess)\n\n  const chainId3 = connection.chainId.value\n  expect(chainId3).toBeDefined()\n  expect(chainId1).toBe(chainId3)\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useSwitchChain.ts",
    "content": "import type {\n  Config,\n  ResolvedRegister,\n  SwitchChainErrorType,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type SwitchChainData,\n  type SwitchChainMutate,\n  type SwitchChainMutateAsync,\n  type SwitchChainOptions,\n  type SwitchChainVariables,\n  switchChainMutationOptions,\n} from '@wagmi/core/query'\nimport type { Ref } from 'vue'\nimport { type UseMutationReturnType, useMutation } from '../utils/query.js'\nimport { useChains } from './useChains.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseSwitchChainParameters<\n  config extends Config = Config,\n  context = unknown,\n> = Compute<ConfigParameter<config> & SwitchChainOptions<config, context>>\n\nexport type UseSwitchChainReturnType<\n  config extends Config = Config,\n  context = unknown,\n> = Compute<\n  UseMutationReturnType<\n    SwitchChainData<config, config['chains'][number]['id']>,\n    SwitchChainErrorType,\n    SwitchChainVariables<config, config['chains'][number]['id']>,\n    context,\n    SwitchChainMutate<config, context>,\n    SwitchChainMutateAsync<config, context>\n  > & {\n    /** @deprecated use `useChains` instead */\n    chains: Ref<config['chains']>\n    /** @deprecated use `mutate` instead */\n    switchChain: SwitchChainMutate<config, context>\n    /** @deprecated use `mutateAsync` instead */\n    switchChainAsync: SwitchChainMutateAsync<config, context>\n  }\n>\n\n/** https://wagmi.sh/vue/api/composables/useSwitchChain */\nexport function useSwitchChain<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: UseSwitchChainParameters<config, context> = {},\n): UseSwitchChainReturnType<config, context> {\n  const config = useConfig(parameters)\n  const options = switchChainMutationOptions(config, parameters as any)\n  const mutation = useMutation(options)\n  type Return = UseSwitchChainReturnType<config, context>\n  return {\n    ...(mutation as unknown as Return),\n    chains: useChains({ config }) as unknown as Ref<config['chains']>,\n    switchChain: mutation.mutate as Return['mutate'],\n    switchChainAsync: mutation.mutateAsync as Return['mutateAsync'],\n  }\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useSwitchConnection.test-d.ts",
    "content": "import type { Connector, SwitchAccountErrorType } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport type { Address } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\nimport { useSwitchConnection } from './useSwitchConnection.js'\n\nconst connector = config.connectors[0]!\nconst contextValue = { foo: 'bar' } as const\n\ntest('context', () => {\n  const { context, data, error, switchConnection, variables } =\n    useSwitchConnection({\n      mutation: {\n        onMutate(variables) {\n          expectTypeOf(variables).toEqualTypeOf<{ connector: Connector }>()\n          return contextValue\n        },\n        onError(error, variables, context) {\n          expectTypeOf(variables).toEqualTypeOf<{ connector: Connector }>()\n          expectTypeOf(error).toEqualTypeOf<SwitchAccountErrorType>()\n          expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n        },\n        onSuccess(data, variables, context) {\n          expectTypeOf(variables).toEqualTypeOf<{ connector: Connector }>()\n          expectTypeOf(data).toEqualTypeOf<{\n            accounts: readonly [Address, ...Address[]]\n            chainId: number\n          }>()\n          expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n        },\n        onSettled(data, error, variables, context) {\n          expectTypeOf(data).toEqualTypeOf<\n            | {\n                accounts: readonly [Address, ...Address[]]\n                chainId: number\n              }\n            | undefined\n          >()\n          expectTypeOf(error).toEqualTypeOf<SwitchAccountErrorType | null>()\n          expectTypeOf(variables).toEqualTypeOf<{ connector: Connector }>()\n          expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n        },\n      },\n    })\n\n  expectTypeOf(data.value).toEqualTypeOf<\n    | {\n        accounts: readonly [Address, ...Address[]]\n        chainId: number\n      }\n    | undefined\n  >()\n  expectTypeOf(error.value).toEqualTypeOf<SwitchAccountErrorType | null>()\n  expectTypeOf(variables.value).toEqualTypeOf<\n    { connector: Connector } | undefined\n  >()\n  expectTypeOf(context.value).toEqualTypeOf<typeof contextValue | undefined>()\n\n  switchConnection(\n    { connector },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{ connector: Connector }>()\n        expectTypeOf(error).toEqualTypeOf<SwitchAccountErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(variables).toEqualTypeOf<{ connector: Connector }>()\n        expectTypeOf(data).toEqualTypeOf<{\n          accounts: readonly [Address, ...Address[]]\n          chainId: number\n        }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<\n          | {\n              accounts: readonly [Address, ...Address[]]\n              chainId: number\n            }\n          | undefined\n        >()\n        expectTypeOf(error).toEqualTypeOf<SwitchAccountErrorType | null>()\n        expectTypeOf(variables).toEqualTypeOf<{ connector: Connector }>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n      },\n    },\n  )\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useSwitchConnection.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { config } from '@wagmi/test'\nimport { renderComposable, waitFor } from '@wagmi/test/vue'\nimport { expect, test } from 'vitest'\n\nimport { useConnection } from './useConnection.js'\nimport { useConnections } from './useConnections.js'\nimport { useSwitchConnection } from './useSwitchConnection.js'\n\nconst connector1 = config.connectors[0]!\nconst connector2 = config.connectors[1]!\n\ntest('default', async () => {\n  const [connection] = renderComposable(() => useConnection())\n  const [switchConnection] = renderComposable(() => useSwitchConnection())\n  const [connections] = renderComposable(() => useConnections())\n\n  expect(connections.value).toEqual([])\n\n  await connect(config, { connector: connector2 })\n  await connect(config, { connector: connector1 })\n\n  expect(connections.value.length).toEqual(2)\n\n  const address1 = connection.address.value\n  expect(address1).toBeDefined()\n\n  switchConnection.mutate({ connector: connector2 })\n  await waitFor(switchConnection.isSuccess)\n\n  const address2 = connection.address.value\n  expect(address2).toBeDefined()\n  expect(address1).not.toBe(address2)\n\n  switchConnection.mutate({ connector: connector1 })\n  await waitFor(switchConnection.isSuccess)\n\n  const address3 = connection.address.value\n  expect(address3).toBeDefined()\n  expect(address1).toBe(address3)\n\n  await disconnect(config, { connector: connector1 })\n  await disconnect(config, { connector: connector2 })\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useSwitchConnection.ts",
    "content": "import type {\n  Config,\n  Connector,\n  ResolvedRegister,\n  SwitchConnectionErrorType,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type SwitchConnectionData,\n  type SwitchConnectionMutate,\n  type SwitchConnectionMutateAsync,\n  type SwitchConnectionOptions,\n  type SwitchConnectionVariables,\n  switchConnectionMutationOptions,\n} from '@wagmi/core/query'\nimport { computed, type Ref } from 'vue'\nimport { type UseMutationReturnType, useMutation } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\nimport { useConnections } from './useConnections.js'\n\nexport type UseSwitchConnectionParameters<\n  config extends Config = Config,\n  context = unknown,\n> = Compute<ConfigParameter<config> & SwitchConnectionOptions<config, context>>\n\nexport type UseSwitchConnectionReturnType<\n  config extends Config = Config,\n  context = unknown,\n> = Compute<\n  UseMutationReturnType<\n    SwitchConnectionData<config>,\n    SwitchConnectionErrorType,\n    SwitchConnectionVariables,\n    context,\n    SwitchConnectionMutate<config, context>,\n    SwitchConnectionMutateAsync<config, context>\n  > & {\n    /** @deprecated use `useConnections` instead */\n    connectors: Ref<readonly Connector[]>\n    /** @deprecated use `switchConnection` instead */\n    switchAccount: SwitchConnectionMutate<config, context>\n    /** @deprecated use `switchConnectionAsync` instead */\n    switchAccountAsync: SwitchConnectionMutateAsync<config, context>\n    /** @deprecated use `mutate` instead */\n    switchConnection: SwitchConnectionMutate<config, context>\n    /** @deprecated use `mutateAsync` instead */\n    switchConnectionAsync: SwitchConnectionMutateAsync<config, context>\n  }\n>\n\n/** https://wagmi.sh/vue/api/composables/useSwitchConnection */\nexport function useSwitchConnection<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: UseSwitchConnectionParameters<config, context> = {},\n): UseSwitchConnectionReturnType<config, context> {\n  const config = useConfig(parameters)\n  const connections = useConnections({ config })\n  const options = switchConnectionMutationOptions(config, parameters as any)\n  const mutation = useMutation(options)\n  type Return = UseSwitchConnectionReturnType<config, context>\n  return {\n    ...(mutation as Return),\n    connectors: computed(() =>\n      connections.value.map((connection) => connection.connector),\n    ),\n    switchAccount: mutation.mutate as Return['mutate'],\n    switchAccountAsync: mutation.mutateAsync as Return['mutateAsync'],\n    switchConnection: mutation.mutate as Return['mutate'],\n    switchConnectionAsync: mutation.mutateAsync as Return['mutateAsync'],\n  }\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useTransaction.test-d.ts",
    "content": "import { expectTypeOf, test } from 'vitest'\n\nimport { useTransaction } from './useTransaction.js'\n\ntest('select data', () => {\n  const result = useTransaction({\n    query: {\n      select(data) {\n        return data?.nonce\n      },\n    },\n  })\n  expectTypeOf(result.data.value).toEqualTypeOf<number | undefined>()\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useTransaction.test.ts",
    "content": "import { renderComposable, waitFor } from '@wagmi/test/vue'\nimport { expect, test } from 'vitest'\n\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { useTransaction } from './useTransaction.js'\n\ntest('default', async () => {\n  const [result] = renderComposable(() =>\n    useTransaction({\n      hash: '0x60668ed8c2dc110d61d945a936fcd45b8f13654e5c78481c8c825d1148c7ef30',\n    }),\n  )\n\n  await waitFor(result.isSuccess)\n\n  expect(deepUnref(result)).toMatchInlineSnapshot(`\n    {\n      \"data\": {\n        \"accessList\": [],\n        \"blockHash\": \"0xd725a38b51e5ceec8c5f6c9ccfdb2cc423af993bb650af5eedca5e4be7156ba7\",\n        \"blockNumber\": 15189204n,\n        \"chainId\": 1,\n        \"from\": \"0xa0cf798816d4b9b9866b5330eea46a18382f251e\",\n        \"gas\": 21000n,\n        \"gasPrice\": 9371645552n,\n        \"hash\": \"0x60668ed8c2dc110d61d945a936fcd45b8f13654e5c78481c8c825d1148c7ef30\",\n        \"input\": \"0x\",\n        \"maxFeePerGas\": 13644824566n,\n        \"maxPriorityFeePerGas\": 1500000000n,\n        \"nonce\": 86,\n        \"r\": \"0x40174f9a38df876c1a7ce2587848819d4082ccd6d67a88aa5cabe59bf594e14f\",\n        \"s\": \"0x7c0c82f62a8a5a9b0e9cf30a54a72fdae8fc54b5b79ddafef0acd30e94e83872\",\n        \"to\": \"0xd2135cfb216b74109775236e36d4b433f1df507b\",\n        \"transactionIndex\": 144,\n        \"type\": \"eip1559\",\n        \"typeHex\": \"0x2\",\n        \"v\": 0n,\n        \"value\": 100000000000000000n,\n        \"yParity\": 0,\n      },\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"transaction\",\n        {\n          \"chainId\": 1,\n          \"hash\": \"0x60668ed8c2dc110d61d945a936fcd45b8f13654e5c78481c8c825d1148c7ef30\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n      \"suspense\": [Function],\n    }\n  `)\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useTransaction.ts",
    "content": "import type {\n  Config,\n  GetTransactionErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetTransactionData,\n  type GetTransactionOptions,\n  getTransactionQueryOptions,\n} from '@wagmi/core/query'\nimport { computed } from 'vue'\nimport type { DeepMaybeRef } from '../types/ref.js'\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseTransactionParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetTransactionData<config, chainId>,\n> = Compute<\n  DeepMaybeRef<\n    GetTransactionOptions<config, chainId, selectData> & ConfigParameter<config>\n  >\n>\n\nexport type UseTransactionReturnType<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetTransactionData<config, chainId>,\n> = UseQueryReturnType<selectData, GetTransactionErrorType>\n\n/** https://wagmi.sh/vue/api/composables/useTransaction */\nexport function useTransaction<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetTransactionData<config, chainId>,\n>(\n  parameters: UseTransactionParameters<config, chainId, selectData> = {},\n): UseTransactionReturnType<config, chainId, selectData> {\n  const params = computed(() => deepUnref(parameters))\n  const config = useConfig(params)\n  const chainId = useChainId({ config })\n  const options = computed(() =>\n    getTransactionQueryOptions(config as any, {\n      ...(params.value as any),\n      chainId: params.value.chainId ?? chainId.value,\n    }),\n  )\n  return useQuery(options as any) as any\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useTransactionReceipt.test-d.ts",
    "content": "import { expectTypeOf, test } from 'vitest'\n\nimport { useTransactionReceipt } from './useTransactionReceipt.js'\n\ntest('select data', () => {\n  const result = useTransactionReceipt({\n    query: {\n      select(data) {\n        return data?.blockNumber\n      },\n    },\n  })\n  expectTypeOf(result.data.value).toEqualTypeOf<bigint | undefined>()\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useTransactionReceipt.test.ts",
    "content": "import { chain, wait } from '@wagmi/test'\nimport { renderComposable, waitFor } from '@wagmi/test/vue'\nimport { expect, test } from 'vitest'\nimport { ref } from 'vue'\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { useTransactionReceipt } from './useTransactionReceipt.js'\n\ntest('default', async () => {\n  const [result] = renderComposable(() =>\n    useTransactionReceipt({\n      hash: '0xbf7d27700d053765c9638d3b9d39eb3c56bfc48377583e8be483d61f9f18a871',\n    }),\n  )\n\n  await waitFor(result.isSuccess)\n\n  expect(deepUnref(result)).toMatchInlineSnapshot(`\n    {\n      \"data\": {\n        \"blockHash\": \"0xb932f77cf770d1d1c8f861153eec1e990f5d56b6ffdb4ac06aef3cca51ef37d4\",\n        \"blockNumber\": 16280769n,\n        \"contractAddress\": null,\n        \"cumulativeGasUsed\": 21000n,\n        \"effectiveGasPrice\": 33427926161n,\n        \"from\": \"0x043022ef9fca1066024d19d681e2ccf44ff90de3\",\n        \"gasUsed\": 21000n,\n        \"logs\": [],\n        \"logsBloom\": \"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\n        \"status\": \"success\",\n        \"to\": \"0x318a5fb4f1604fc46375a1db9a9018b6e423b345\",\n        \"transactionHash\": \"0xbf7d27700d053765c9638d3b9d39eb3c56bfc48377583e8be483d61f9f18a871\",\n        \"transactionIndex\": 0,\n        \"type\": \"legacy\",\n      },\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"getTransactionReceipt\",\n        {\n          \"chainId\": 1,\n          \"hash\": \"0xbf7d27700d053765c9638d3b9d39eb3c56bfc48377583e8be483d61f9f18a871\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n      \"suspense\": [Function],\n    }\n  `)\n})\n\ntest('parameters: chainId', async () => {\n  const [result] = renderComposable(() =>\n    useTransactionReceipt({\n      chainId: chain.mainnet2.id,\n      hash: '0xbf7d27700d053765c9638d3b9d39eb3c56bfc48377583e8be483d61f9f18a871',\n    }),\n  )\n\n  await waitFor(result.isSuccess)\n\n  expect(deepUnref(result)).toMatchInlineSnapshot(`\n    {\n      \"data\": {\n        \"blockHash\": \"0xb932f77cf770d1d1c8f861153eec1e990f5d56b6ffdb4ac06aef3cca51ef37d4\",\n        \"blockNumber\": 16280769n,\n        \"contractAddress\": null,\n        \"cumulativeGasUsed\": 21000n,\n        \"effectiveGasPrice\": 33427926161n,\n        \"from\": \"0x043022ef9fca1066024d19d681e2ccf44ff90de3\",\n        \"gasUsed\": 21000n,\n        \"logs\": [],\n        \"logsBloom\": \"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\n        \"status\": \"success\",\n        \"to\": \"0x318a5fb4f1604fc46375a1db9a9018b6e423b345\",\n        \"transactionHash\": \"0xbf7d27700d053765c9638d3b9d39eb3c56bfc48377583e8be483d61f9f18a871\",\n        \"transactionIndex\": 0,\n        \"type\": \"legacy\",\n      },\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"getTransactionReceipt\",\n        {\n          \"chainId\": 456,\n          \"hash\": \"0xbf7d27700d053765c9638d3b9d39eb3c56bfc48377583e8be483d61f9f18a871\",\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n      \"suspense\": [Function],\n    }\n  `)\n})\n\ntest('behavior: hash: undefined -> defined', async () => {\n  const hash = ref()\n\n  const [result] = renderComposable(() =>\n    useTransactionReceipt({\n      hash,\n    }),\n  )\n\n  await wait(100)\n  expect(result.fetchStatus.value).toBe('idle')\n\n  hash.value =\n    '0xbf7d27700d053765c9638d3b9d39eb3c56bfc48377583e8be483d61f9f18a871'\n\n  await waitFor(result.isSuccess)\n\n  expect(deepUnref(result)).toMatchInlineSnapshot(`\n    {\n      \"data\": {\n        \"blockHash\": \"0xb932f77cf770d1d1c8f861153eec1e990f5d56b6ffdb4ac06aef3cca51ef37d4\",\n        \"blockNumber\": 16280769n,\n        \"contractAddress\": null,\n        \"cumulativeGasUsed\": 21000n,\n        \"effectiveGasPrice\": 33427926161n,\n        \"from\": \"0x043022ef9fca1066024d19d681e2ccf44ff90de3\",\n        \"gasUsed\": 21000n,\n        \"logs\": [],\n        \"logsBloom\": \"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\n        \"status\": \"success\",\n        \"to\": \"0x318a5fb4f1604fc46375a1db9a9018b6e423b345\",\n        \"transactionHash\": \"0xbf7d27700d053765c9638d3b9d39eb3c56bfc48377583e8be483d61f9f18a871\",\n        \"transactionIndex\": 0,\n        \"type\": \"legacy\",\n      },\n      \"dataUpdatedAt\": 1675209600000,\n      \"error\": null,\n      \"errorUpdateCount\": 0,\n      \"errorUpdatedAt\": 0,\n      \"failureCount\": 0,\n      \"failureReason\": null,\n      \"fetchStatus\": \"idle\",\n      \"isError\": false,\n      \"isFetched\": true,\n      \"isFetchedAfterMount\": true,\n      \"isFetching\": false,\n      \"isInitialLoading\": false,\n      \"isLoading\": false,\n      \"isLoadingError\": false,\n      \"isPaused\": false,\n      \"isPending\": false,\n      \"isPlaceholderData\": false,\n      \"isRefetchError\": false,\n      \"isRefetching\": false,\n      \"isStale\": true,\n      \"isSuccess\": true,\n      \"queryKey\": [\n        \"getTransactionReceipt\",\n        {\n          \"chainId\": 1,\n          \"hash\": undefined,\n        },\n      ],\n      \"refetch\": [Function],\n      \"status\": \"success\",\n      \"suspense\": [Function],\n    }\n  `)\n})\n\ntest('behavior: disabled when properties missing', async () => {\n  const [result] = renderComposable(() => useTransactionReceipt())\n\n  await wait(100)\n  expect(result.fetchStatus.value).toBe('idle')\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useTransactionReceipt.ts",
    "content": "import type {\n  Config,\n  GetTransactionReceiptErrorType,\n  ResolvedRegister,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type GetTransactionReceiptData,\n  type GetTransactionReceiptOptions,\n  getTransactionReceiptQueryOptions,\n} from '@wagmi/core/query'\nimport { computed } from 'vue'\nimport type { DeepMaybeRef } from '../types/ref.js'\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseTransactionReceiptParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetTransactionReceiptData<config, chainId>,\n> = Compute<\n  DeepMaybeRef<\n    GetTransactionReceiptOptions<config, chainId, selectData> &\n      ConfigParameter<config>\n  >\n>\n\nexport type UseTransactionReceiptReturnType<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetTransactionReceiptData<config, chainId>,\n> = UseQueryReturnType<selectData, GetTransactionReceiptErrorType>\n\n/** https://wagmi.sh/vue/api/composables/useTransactionReceipt */\nexport function useTransactionReceipt<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = GetTransactionReceiptData<config, chainId>,\n>(\n  parameters: UseTransactionReceiptParameters<config, chainId, selectData> = {},\n): UseTransactionReceiptReturnType<config, chainId, selectData> {\n  const params = computed(() => deepUnref(parameters))\n  const config = useConfig(params)\n  const chainId = useChainId({ config })\n  const options = computed(() =>\n    getTransactionReceiptQueryOptions(config as any, {\n      ...(params.value as any),\n      chainId: params.value.chainId ?? chainId.value,\n    }),\n  )\n  return useQuery(options as any) as any\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useWaitForTransactionReceipt.test-d.ts",
    "content": "import { expectTypeOf, test } from 'vitest'\n\nimport { useWaitForTransactionReceipt } from './useWaitForTransactionReceipt.js'\n\ntest('select data', () => {\n  const result = useWaitForTransactionReceipt({\n    query: {\n      select(data) {\n        return data?.blockNumber\n      },\n    },\n  })\n  expectTypeOf(result.data.value).toEqualTypeOf<bigint | undefined>()\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useWaitForTransactionReceipt.test.ts",
    "content": "import { renderComposable, waitFor } from '@wagmi/test/vue'\nimport { expect, test } from 'vitest'\nimport { wait } from '../../../test/src/utils.js'\nimport { useWaitForTransactionReceipt } from './useWaitForTransactionReceipt.js'\n\ntest('default', async () => {\n  const [result] = renderComposable(() =>\n    useWaitForTransactionReceipt({\n      hash: '0x60668ed8c2dc110d61d945a936fcd45b8f13654e5c78481c8c825d1148c7ef30',\n    }),\n  )\n\n  await waitFor(result.isSuccess)\n\n  expect(result.data.value).toMatchInlineSnapshot(`\n    {\n      \"blockHash\": \"0xd725a38b51e5ceec8c5f6c9ccfdb2cc423af993bb650af5eedca5e4be7156ba7\",\n      \"blockNumber\": 15189204n,\n      \"chainId\": 1,\n      \"contractAddress\": null,\n      \"cumulativeGasUsed\": 12949744n,\n      \"effectiveGasPrice\": 9371645552n,\n      \"from\": \"0xa0cf798816d4b9b9866b5330eea46a18382f251e\",\n      \"gasUsed\": 21000n,\n      \"logs\": [],\n      \"logsBloom\": \"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\n      \"status\": \"success\",\n      \"to\": \"0xd2135cfb216b74109775236e36d4b433f1df507b\",\n      \"transactionHash\": \"0x60668ed8c2dc110d61d945a936fcd45b8f13654e5c78481c8c825d1148c7ef30\",\n      \"transactionIndex\": 144,\n      \"type\": \"eip1559\",\n    }\n  `)\n})\n\ntest('disabled when hash is undefined', async () => {\n  const [result] = renderComposable(() =>\n    useWaitForTransactionReceipt({\n      hash: undefined,\n    }),\n  )\n\n  await wait(100)\n\n  expect(result.isPending.value).toBe(true)\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useWaitForTransactionReceipt.ts",
    "content": "import type {\n  Config,\n  ResolvedRegister,\n  WaitForTransactionReceiptErrorType,\n} from '@wagmi/core'\nimport type { Compute, ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type WaitForTransactionReceiptData,\n  type WaitForTransactionReceiptOptions,\n  waitForTransactionReceiptQueryOptions,\n} from '@wagmi/core/query'\nimport { computed } from 'vue'\nimport type { DeepMaybeRef } from '../types/ref.js'\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { type UseQueryReturnType, useQuery } from '../utils/query.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseWaitForTransactionReceiptParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = WaitForTransactionReceiptData<config, chainId>,\n> = Compute<\n  DeepMaybeRef<\n    WaitForTransactionReceiptOptions<config, chainId, selectData> &\n      ConfigParameter<config>\n  >\n>\n\nexport type UseWaitForTransactionReceiptReturnType<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = WaitForTransactionReceiptData<config, chainId>,\n> = UseQueryReturnType<selectData, WaitForTransactionReceiptErrorType>\n\n/** https://wagmi.sh/vue/api/composables/useWaitForTransactionReceipt */\nexport function useWaitForTransactionReceipt<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n  selectData = WaitForTransactionReceiptData<config, chainId>,\n>(\n  parameters: UseWaitForTransactionReceiptParameters<\n    config,\n    chainId,\n    selectData\n  > = {},\n): UseWaitForTransactionReceiptReturnType<config, chainId, selectData> {\n  const params = computed(() => deepUnref(parameters))\n  const config = useConfig(params)\n  const chainId = useChainId({ config })\n  const options = computed(() =>\n    waitForTransactionReceiptQueryOptions(config as any, {\n      ...(params.value as any),\n      chainId: params.value.chainId ?? chainId.value,\n    }),\n  )\n  return useQuery(options as any) as any\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useWatchBlockNumber.test-d.ts",
    "content": "import { createConfig } from '@wagmi/core'\nimport { http, webSocket } from 'viem'\nimport { mainnet, optimism } from 'viem/chains'\nimport { expectTypeOf, test } from 'vitest'\n\nimport type { DeepUnwrapRef } from '../types/ref.js'\nimport {\n  type UseWatchBlockNumberParameters,\n  useWatchBlockNumber,\n} from './useWatchBlockNumber.js'\n\ntest('default', () => {\n  useWatchBlockNumber({\n    poll: false,\n    onBlockNumber() {},\n  })\n})\n\ntest('differing transports', () => {\n  const config = createConfig({\n    chains: [mainnet, optimism],\n    transports: {\n      [mainnet.id]: http(),\n      [optimism.id]: webSocket(),\n    },\n  })\n\n  type Result = DeepUnwrapRef<\n    UseWatchBlockNumberParameters<\n      typeof config,\n      typeof mainnet.id | typeof optimism.id\n    >\n  >\n  expectTypeOf<Result['poll']>().toEqualTypeOf<boolean | undefined>()\n  useWatchBlockNumber({\n    config,\n    poll: false,\n    onBlockNumber() {},\n  })\n\n  type Result2 = DeepUnwrapRef<\n    UseWatchBlockNumberParameters<typeof config, typeof mainnet.id>\n  >\n  expectTypeOf<Result2['poll']>().toEqualTypeOf<true | undefined>()\n  useWatchBlockNumber({\n    config,\n    chainId: mainnet.id,\n    poll: true,\n    onBlockNumber() {},\n  })\n  useWatchBlockNumber({\n    config,\n    chainId: mainnet.id,\n    // @ts-expect-error\n    poll: false,\n    onBlockNumber() {},\n  })\n\n  type Result3 = DeepUnwrapRef<\n    UseWatchBlockNumberParameters<typeof config, typeof optimism.id>\n  >\n  expectTypeOf<Result3['poll']>().toEqualTypeOf<boolean | undefined>()\n  useWatchBlockNumber({\n    config,\n    chainId: optimism.id,\n    poll: true,\n    onBlockNumber() {},\n  })\n  useWatchBlockNumber({\n    config,\n    chainId: optimism.id,\n    poll: false,\n    onBlockNumber() {},\n  })\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useWatchBlockNumber.test.ts",
    "content": "import { testClient, wait } from '@wagmi/test'\nimport { renderComposable } from '@wagmi/test/vue'\nimport { expect, test } from 'vitest'\nimport { ref } from 'vue'\nimport { useWatchBlockNumber } from './useWatchBlockNumber.js'\n\ntest('default', async () => {\n  const blockNumbers: bigint[] = []\n  renderComposable(() =>\n    useWatchBlockNumber({\n      onBlockNumber(blockNumber) {\n        blockNumbers.push(blockNumber)\n      },\n    }),\n  )\n\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(100)\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(100)\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(100)\n\n  expect(blockNumbers.length).toBe(3)\n  expect(\n    blockNumbers.map((blockNumber) => blockNumber - blockNumbers[0]!),\n  ).toEqual([0n, 1n, 2n])\n  await wait(500)\n})\n\ntest('parameters: enabled', async () => {\n  const enabled = ref(true)\n\n  const blockNumbers: bigint[] = []\n  renderComposable(() =>\n    useWatchBlockNumber({\n      enabled,\n      onBlockNumber(blockNumber) {\n        blockNumbers.push(blockNumber)\n      },\n    }),\n  )\n\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(100)\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(100)\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(100)\n\n  expect(blockNumbers.length).toBe(3)\n  expect(\n    blockNumbers.map((blockNumber) => blockNumber - blockNumbers[0]!),\n  ).toEqual([0n, 1n, 2n])\n\n  enabled.value = false\n\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(100)\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(100)\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(100)\n\n  expect(\n    blockNumbers.map((blockNumber) => blockNumber - blockNumbers[0]!),\n  ).toEqual([0n, 1n, 2n])\n  await wait(500)\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useWatchBlockNumber.ts",
    "content": "import {\n  type Config,\n  type ResolvedRegister,\n  type WatchBlockNumberParameters,\n  watchBlockNumber,\n} from '@wagmi/core'\nimport type {\n  ConfigParameter,\n  UnionCompute,\n  UnionExactPartial,\n} from '@wagmi/core/internal'\nimport { computed, watchEffect } from 'vue'\nimport type { EnabledParameter } from '../types/properties.js'\nimport type { DeepMaybeRef } from '../types/ref.js'\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseWatchBlockNumberParameters<\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n> = DeepMaybeRef<\n  UnionCompute<\n    UnionExactPartial<WatchBlockNumberParameters<config, chainId>> &\n      ConfigParameter<config> &\n      EnabledParameter\n  >\n>\n\nexport type UseWatchBlockNumberReturnType = void\n\n/** https://wagmi.sh/vue/api/composables/useWatchBlockNumber */\nexport function useWatchBlockNumber<\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n>(\n  parameters_: UseWatchBlockNumberParameters<config, chainId> = {} as any,\n): UseWatchBlockNumberReturnType {\n  const parameters = computed(() => deepUnref(parameters_))\n\n  const config = useConfig(parameters)\n  const configChainId = useChainId({ config })\n\n  watchEffect((onCleanup) => {\n    const {\n      chainId = configChainId.value,\n      enabled = true,\n      onBlockNumber,\n      config: _,\n      ...rest\n    } = parameters.value\n\n    if (!enabled) return\n    if (!onBlockNumber) return\n\n    const unwatch = watchBlockNumber(config, {\n      ...(rest as any),\n      chainId,\n      onBlockNumber,\n      emitOnBegin: true,\n    })\n    onCleanup(unwatch)\n  })\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useWatchContractEvent.test-d.ts",
    "content": "import { createConfig, http, webSocket } from '@wagmi/core'\nimport { mainnet, optimism } from '@wagmi/core/chains'\nimport { abi } from '@wagmi/test'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useWatchContractEvent } from './useWatchContractEvent.js'\n\ntest('default', () => {\n  useWatchContractEvent({\n    address: '0x',\n    abi: abi.erc20,\n    eventName: 'Transfer',\n    poll: false,\n    args: {\n      from: '0x',\n      to: '0x',\n    },\n    onLogs(logs) {\n      expectTypeOf(logs[0]!.eventName).toEqualTypeOf<'Transfer'>()\n      expectTypeOf(logs[0]!.args).toEqualTypeOf<{\n        from?: `0x${string}` | undefined\n        to?: `0x${string}` | undefined\n        value?: bigint | undefined\n      }>()\n    },\n  })\n})\n\ntest('behavior: no eventName', () => {\n  useWatchContractEvent({\n    address: '0x',\n    abi: abi.erc20,\n    args: {\n      // TODO: Figure out why this is not working\n      // @ts-ignore\n      from: '0x',\n      to: '0x',\n    },\n    onLogs(logs) {\n      expectTypeOf(logs[0]!.eventName).toEqualTypeOf<'Transfer' | 'Approval'>()\n      expectTypeOf(logs[0]!.args).toEqualTypeOf<\n        | {\n            from?: `0x${string}` | undefined\n            to?: `0x${string}` | undefined\n            value?: bigint | undefined\n          }\n        | {\n            owner?: `0x${string}` | undefined\n            spender?: `0x${string}` | undefined\n            value?: bigint | undefined\n          }\n      >()\n    },\n  })\n})\n\ntest('differing transports', () => {\n  const config = createConfig({\n    chains: [mainnet, optimism],\n    transports: {\n      [mainnet.id]: http(),\n      [optimism.id]: webSocket(),\n    },\n  })\n\n  // TODO: Fix inference for `poll` (`DeepMaybeRef` wrapping `UseWatchContractEventParameters` not working as expected)\n  // type Result = UseWatchContractEventParameters<\n  //   typeof abi.erc20,\n  //   'Transfer' | 'Approval',\n  //   true,\n  //   typeof config,\n  //   typeof mainnet.id | typeof optimism.id\n  // >\n  // expectTypeOf<Result['poll']>().toEqualTypeOf<boolean | undefined>()\n  useWatchContractEvent({\n    config,\n    poll: false,\n    address: '0x',\n    abi: abi.erc20,\n    onLogs() {},\n  })\n\n  // type Result2 = UseWatchContractEventParameters<\n  //   typeof abi.erc20,\n  //   'Transfer' | 'Approval',\n  //   true,\n  //   typeof config,\n  //   typeof mainnet.id\n  // >\n  // expectTypeOf<Result2['poll']>().toEqualTypeOf<true | undefined>()\n  useWatchContractEvent({\n    config,\n    chainId: mainnet.id,\n    poll: true,\n    address: '0x',\n    abi: abi.erc20,\n    onLogs() {},\n  })\n\n  // type Result3 = UseWatchContractEventParameters<\n  //   typeof abi.erc20,\n  //   'Transfer' | 'Approval',\n  //   true,\n  //   typeof config,\n  //   typeof optimism.id\n  // >\n  // expectTypeOf<Result3['poll']>().toEqualTypeOf<boolean | undefined>()\n  useWatchContractEvent({\n    config,\n    chainId: optimism.id,\n    poll: true,\n    address: '0x',\n    abi: abi.erc20,\n    onLogs() {},\n  })\n  useWatchContractEvent({\n    config,\n    chainId: optimism.id,\n    poll: false,\n    address: '0x',\n    abi: abi.erc20,\n    onLogs() {},\n  })\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useWatchContractEvent.test.ts",
    "content": "import { connect, disconnect, readContract, writeContract } from '@wagmi/core'\nimport {\n  abi,\n  accounts,\n  address,\n  config,\n  testClient,\n  transactionHashRegex,\n  wait,\n} from '@wagmi/test'\nimport { renderComposable } from '@wagmi/test/vue'\nimport { createWalletClient, erc20Abi, http, parseEther } from 'viem'\nimport type { WatchEventOnLogsParameter } from 'viem/actions'\nimport { expect, test } from 'vitest'\n\nimport { ref } from 'vue'\nimport { useWatchContractEvent } from './useWatchContractEvent.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  const data = await connect(config, { connector })\n  const connectedAddress = data.accounts[0]\n\n  // impersonate usdc holder account and transfer usdc to connected account\n  await testClient.mainnet.impersonateAccount({ address: address.usdcHolder })\n  await testClient.mainnet.setBalance({\n    address: address.usdcHolder,\n    value: 10000000000000000000000n,\n  })\n  await createWalletClient({\n    account: address.usdcHolder,\n    chain: testClient.mainnet.chain,\n    transport: http(),\n  }).writeContract({\n    address: address.usdc,\n    abi: abi.erc20,\n    functionName: 'transfer',\n    args: [connectedAddress, parseEther('10', 'gwei')],\n  })\n  await testClient.mainnet.mine({ blocks: 1 })\n  await testClient.mainnet.stopImpersonatingAccount({\n    address: address.usdcHolder,\n  })\n\n  const balance = await readContract(config, {\n    abi: erc20Abi,\n    address: address.usdc,\n    functionName: 'balanceOf',\n    args: [connectedAddress],\n  })\n  expect(balance).toBeGreaterThan(0n)\n\n  // start watching transfer events\n  let logs: WatchEventOnLogsParameter = []\n  renderComposable(() =>\n    useWatchContractEvent({\n      address: address.usdc,\n      abi: abi.erc20,\n      eventName: 'Transfer',\n      onLogs(next) {\n        logs = logs.concat(next)\n      },\n    }),\n  )\n\n  await writeContract(config, {\n    address: address.usdc,\n    abi: abi.erc20,\n    functionName: 'transfer',\n    args: [accounts[1], parseEther('1', 'gwei')],\n  })\n\n  await writeContract(config, {\n    address: address.usdc,\n    abi: abi.erc20,\n    functionName: 'transfer',\n    args: [accounts[3], parseEther('1', 'gwei')],\n  })\n\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(100)\n  await testClient.mainnet.mine({ blocks: 1 })\n  await wait(100)\n\n  expect(logs.length).toBe(2)\n  expect(logs[0]?.transactionHash).toMatch(transactionHashRegex)\n\n  await disconnect(config, { connector })\n  await wait(500)\n})\n\ntest('parameters: enabled', async () => {\n  const enabled = ref(true)\n\n  renderComposable(() =>\n    useWatchContractEvent({\n      address: address.usdc,\n      abi: abi.erc20,\n      eventName: 'Transfer',\n    }),\n  )\n\n  renderComposable(() =>\n    useWatchContractEvent({\n      enabled,\n    }),\n  )\n  await wait(500)\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useWatchContractEvent.ts",
    "content": "import {\n  type Config,\n  type ResolvedRegister,\n  type WatchContractEventParameters,\n  watchContractEvent,\n} from '@wagmi/core'\nimport type {\n  ConfigParameter,\n  UnionCompute,\n  UnionExactPartial,\n} from '@wagmi/core/internal'\nimport type { Abi, ContractEventName } from 'viem'\nimport { computed, watchEffect } from 'vue'\nimport type { EnabledParameter } from '../types/properties.js'\nimport type { DeepMaybeRef } from '../types/ref.js'\nimport { deepUnref } from '../utils/cloneDeep.js'\nimport { useChainId } from './useChainId.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseWatchContractEventParameters<\n  abi extends Abi | readonly unknown[] = Abi,\n  eventName extends ContractEventName<abi> = ContractEventName<abi>,\n  strict extends boolean | undefined = undefined,\n  config extends Config = Config,\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n> = DeepMaybeRef<\n  UnionCompute<\n    UnionExactPartial<\n      WatchContractEventParameters<abi, eventName, strict, config, chainId>\n    > &\n      ConfigParameter<config> &\n      EnabledParameter\n  >\n>\n\nexport type UseWatchContractEventReturnType = void\n\n/** https://wagmi.sh/vue/api/composables/useWatchContractEvent */\nexport function useWatchContractEvent<\n  const abi extends Abi | readonly unknown[],\n  eventName extends ContractEventName<abi>,\n  strict extends boolean | undefined = undefined,\n  config extends Config = ResolvedRegister['config'],\n  chainId extends\n    config['chains'][number]['id'] = config['chains'][number]['id'],\n>(\n  parameters: UseWatchContractEventParameters<\n    abi,\n    eventName,\n    strict,\n    config,\n    chainId\n  > = {} as any,\n): UseWatchContractEventReturnType {\n  const parameters_ = computed(() => deepUnref(parameters))\n\n  const config = useConfig(parameters_)\n  const configChainId = useChainId({ config })\n\n  watchEffect((onCleanup) => {\n    const {\n      chainId = configChainId.value,\n      enabled = true,\n      onLogs,\n      config: _,\n      ...rest\n    } = parameters_.value\n\n    if (!enabled) return\n    if (!onLogs) return\n\n    const unwatch = watchContractEvent(config, {\n      ...(rest as any),\n      chainId,\n      onLogs,\n    })\n    onCleanup(unwatch)\n  })\n}\n"
  },
  {
    "path": "packages/vue/src/composables/useWriteContract.test-d.ts",
    "content": "import type { WriteContractErrorType } from '@wagmi/core'\nimport { abi } from '@wagmi/test'\nimport type { Abi, Address, Hash } from 'viem'\nimport { expectTypeOf, test } from 'vitest'\n\nimport { useSimulateContract } from './useSimulateContract.js'\nimport { useWriteContract } from './useWriteContract.js'\n\nconst contextValue = { foo: 'bar' } as const\n\ntest('context', () => {\n  const writeContract = useWriteContract({\n    mutation: {\n      onMutate(variables) {\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n          abi: Abi\n          functionName: string\n          args?: readonly unknown[] | undefined\n        }>()\n        return contextValue\n      },\n      onError(error, variables, context) {\n        expectTypeOf(error).toEqualTypeOf<WriteContractErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n          abi: Abi\n          functionName: string\n          args?: readonly unknown[] | undefined\n        }>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<Hash>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n          abi: Abi\n          functionName: string\n          args?: readonly unknown[] | undefined\n        }>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<Hash | undefined>()\n        expectTypeOf(error).toEqualTypeOf<WriteContractErrorType | null>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n          abi: Abi\n          functionName: string\n          args?: readonly unknown[] | undefined\n        }>()\n      },\n    },\n  })\n\n  expectTypeOf(writeContract.data.value).toEqualTypeOf<Hash | undefined>()\n  expectTypeOf(\n    writeContract.error.value,\n  ).toEqualTypeOf<WriteContractErrorType | null>()\n  expectTypeOf(writeContract.variables.value).toMatchTypeOf<\n    { chainId?: number | undefined } | undefined\n  >()\n  expectTypeOf(writeContract.context.value).toEqualTypeOf<\n    typeof contextValue | undefined\n  >()\n\n  writeContract.mutate(\n    {\n      address: '0x',\n      abi: abi.erc20,\n      functionName: 'transferFrom',\n      args: ['0x', '0x', 123n],\n      chainId: 1,\n    },\n    {\n      onError(error, variables, context) {\n        expectTypeOf(error).toEqualTypeOf<WriteContractErrorType>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n          abi: typeof abi.erc20\n          functionName: 'transferFrom'\n          args: readonly [Address, Address, bigint]\n        }>()\n      },\n      onSuccess(data, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<Hash>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue>()\n\n        expectTypeOf(variables.functionName).toEqualTypeOf<'transferFrom'>()\n        expectTypeOf(variables.args).toEqualTypeOf<\n          readonly [Address, Address, bigint]\n        >()\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n          abi: typeof abi.erc20\n          functionName: 'transferFrom'\n          args: readonly [Address, Address, bigint]\n        }>()\n      },\n      onSettled(data, error, variables, context) {\n        expectTypeOf(data).toEqualTypeOf<Hash | undefined>()\n        expectTypeOf(error).toEqualTypeOf<WriteContractErrorType | null>()\n        expectTypeOf(context).toEqualTypeOf<typeof contextValue | undefined>()\n\n        expectTypeOf(variables).toMatchTypeOf<{\n          chainId?: number | undefined\n          abi: typeof abi.erc20\n          functionName: 'transferFrom'\n          args: readonly [Address, Address, bigint]\n        }>()\n      },\n    },\n  )\n})\n\ntest('useSimulateContract', () => {\n  const { data } = useSimulateContract({\n    address: '0x',\n    abi: abi.erc20,\n    functionName: 'transferFrom',\n    args: ['0x', '0x', 123n],\n    chainId: 1,\n  })\n  const writeContract = useWriteContract()\n\n  const request = data?.value?.request\n  if (request) writeContract.mutate(request)\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useWriteContract.test.ts",
    "content": "import { connect, disconnect } from '@wagmi/core'\nimport { abi, address, config } from '@wagmi/test'\nimport { renderComposable, waitFor } from '@wagmi/test/vue'\nimport { expect, test } from 'vitest'\n\nimport { useWriteContract } from './useWriteContract.js'\n\nconst connector = config.connectors[0]!\n\ntest('default', async () => {\n  await connect(config, { connector })\n\n  const [result] = renderComposable(() => useWriteContract())\n\n  result.mutate({\n    abi: abi.wagmiMintExample,\n    address: address.wagmiMintExample,\n    functionName: 'mint',\n  })\n  await waitFor(result.isSuccess)\n\n  expect(result.data.value).toBeDefined()\n\n  await disconnect(config, { connector })\n})\n"
  },
  {
    "path": "packages/vue/src/composables/useWriteContract.ts",
    "content": "import { useMutation } from '@tanstack/vue-query'\nimport type {\n  Config,\n  ResolvedRegister,\n  WriteContractErrorType,\n} from '@wagmi/core'\nimport type { ConfigParameter } from '@wagmi/core/internal'\nimport {\n  type WriteContractData,\n  type WriteContractMutate,\n  type WriteContractMutateAsync,\n  type WriteContractOptions,\n  type WriteContractVariables,\n  writeContractMutationOptions,\n} from '@wagmi/core/query'\nimport type { Abi } from 'viem'\nimport type { UseMutationReturnType } from '../utils/query.js'\nimport { useConfig } from './useConfig.js'\n\nexport type UseWriteContractParameters<\n  config extends Config = Config,\n  context = unknown,\n> = ConfigParameter<config> & WriteContractOptions<config, context>\n\nexport type UseWriteContractReturnType<\n  config extends Config = Config,\n  context = unknown,\n> = UseMutationReturnType<\n  WriteContractData,\n  WriteContractErrorType,\n  WriteContractVariables<\n    Abi,\n    string,\n    readonly unknown[],\n    config,\n    config['chains'][number]['id']\n  >,\n  context,\n  WriteContractMutate<config, context>,\n  WriteContractMutateAsync<config, context>\n> & {\n  /** @deprecated use `mutate` instead */\n  writeContract: WriteContractMutate<config, context>\n  /** @deprecated use `mutateAsync` instead */\n  writeContractAsync: WriteContractMutateAsync<config, context>\n}\n\n/** https://wagmi.sh/vue/api/composables/useWriteContract */\nexport function useWriteContract<\n  config extends Config = ResolvedRegister['config'],\n  context = unknown,\n>(\n  parameters: UseWriteContractParameters<config, context> = {},\n): UseWriteContractReturnType<config, context> {\n  const config = useConfig(parameters)\n  const options = writeContractMutationOptions(config, parameters)\n  const mutation = useMutation(options)\n  type Return = UseWriteContractReturnType<config, context>\n  return {\n    ...(mutation as Return),\n    writeContract: mutation.mutate as Return['mutate'],\n    writeContractAsync: mutation.mutateAsync as Return['mutateAsync'],\n  }\n}\n"
  },
  {
    "path": "packages/vue/src/errors/base.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport { BaseError } from './base.js'\n\ntest('BaseError', () => {\n  expect(new BaseError('An error occurred.')).toMatchInlineSnapshot(`\n    [WagmiError: An error occurred.\n\n    Version: @wagmi/vue@x.y.z]\n  `)\n\n  expect(\n    new BaseError('An error occurred.', { details: 'details' }),\n  ).toMatchInlineSnapshot(`\n    [WagmiError: An error occurred.\n\n    Details: details\n    Version: @wagmi/vue@x.y.z]\n  `)\n\n  expect(new BaseError('', { details: 'details' })).toMatchInlineSnapshot(`\n    [WagmiError: An error occurred.\n\n    Details: details\n    Version: @wagmi/vue@x.y.z]\n  `)\n})\n\ntest('BaseError (w/ docsPath)', () => {\n  expect(\n    new BaseError('An error occurred.', {\n      details: 'details',\n      docsPath: '/lol',\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiError: An error occurred.\n\n    Docs: https://wagmi.sh/vue/lol.html\n    Details: details\n    Version: @wagmi/vue@x.y.z]\n  `)\n  expect(\n    new BaseError('An error occurred.', {\n      cause: new BaseError('error', { docsPath: '/docs' }),\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiError: An error occurred.\n\n    Docs: https://wagmi.sh/vue/docs.html\n    Version: @wagmi/vue@x.y.z]\n  `)\n  expect(\n    new BaseError('An error occurred.', {\n      cause: new BaseError('error'),\n      docsPath: '/lol',\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiError: An error occurred.\n\n    Docs: https://wagmi.sh/vue/lol.html\n    Version: @wagmi/vue@x.y.z]\n  `)\n  expect(\n    new BaseError('An error occurred.', {\n      details: 'details',\n      docsPath: '/lol',\n      docsSlug: 'test',\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiError: An error occurred.\n\n    Docs: https://wagmi.sh/vue/lol.html#test\n    Details: details\n    Version: @wagmi/vue@x.y.z]\n  `)\n})\n\ntest('BaseError (w/ metaMessages)', () => {\n  expect(\n    new BaseError('An error occurred.', {\n      details: 'details',\n      metaMessages: ['Reason: idk', 'Cause: lol'],\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiError: An error occurred.\n\n    Reason: idk\n    Cause: lol\n\n    Details: details\n    Version: @wagmi/vue@x.y.z]\n  `)\n})\n\ntest('inherited BaseError', () => {\n  const err = new BaseError('An error occurred.', {\n    details: 'details',\n    docsPath: '/lol',\n  })\n  expect(\n    new BaseError('An internal error occurred.', {\n      cause: err,\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiError: An internal error occurred.\n\n    Docs: https://wagmi.sh/vue/lol.html\n    Details: details\n    Version: @wagmi/vue@x.y.z]\n  `)\n})\n\ntest('inherited Error', () => {\n  const err = new Error('details')\n  expect(\n    new BaseError('An internal error occurred.', {\n      cause: err,\n      docsPath: '/lol',\n    }),\n  ).toMatchInlineSnapshot(`\n    [WagmiError: An internal error occurred.\n\n    Docs: https://wagmi.sh/vue/lol.html\n    Details: details\n    Version: @wagmi/vue@x.y.z]\n  `)\n})\n\ntest('walk: no predicate fn (walks to leaf)', () => {\n  class FooError extends BaseError {}\n  class BarError extends BaseError {}\n\n  const err = new BaseError('test1', {\n    cause: new FooError('test2', { cause: new BarError('test3') }),\n  })\n  expect(err.walk()).toMatchInlineSnapshot(`\n    [WagmiError: test3\n\n    Version: @wagmi/vue@x.y.z]\n  `)\n})\n\ntest('walk: predicate fn', () => {\n  class FooError extends BaseError {}\n  class BarError extends BaseError {}\n\n  const err = new BaseError('test1', {\n    cause: new FooError('test2', { cause: new BarError('test3') }),\n  })\n  expect(err.walk((err) => err instanceof FooError)).toMatchInlineSnapshot(`\n    [WagmiError: test2\n\n    Version: @wagmi/vue@x.y.z]\n  `)\n})\n"
  },
  {
    "path": "packages/vue/src/errors/base.ts",
    "content": "import { BaseError as CoreError } from '@wagmi/core'\n\nimport { getVersion } from '../utils/getVersion.js'\n\nexport type BaseErrorType = BaseError & { name: 'WagmiError' }\nexport class BaseError extends CoreError {\n  override name = 'WagmiError'\n  override get docsBaseUrl() {\n    return 'https://wagmi.sh/vue'\n  }\n  override get version() {\n    return getVersion()\n  }\n}\n"
  },
  {
    "path": "packages/vue/src/errors/plugin.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport {\n  WagmiInjectionContextError,\n  WagmiPluginNotFoundError,\n} from './plugin.js'\n\ntest('WagmiPluginNotFoundError', () => {\n  expect(new WagmiPluginNotFoundError()).toMatchInlineSnapshot(`\n    [WagmiPluginNotFoundError: No \\`config\\` found in Vue context, use \\`WagmiPlugin\\` to properly initialize the library.\n\n    Docs: https://wagmi.sh/vue/api/Nuxt.html\n    Version: @wagmi/vue@x.y.z]\n  `)\n})\n\ntest('WagmiInjectionContextError', () => {\n  expect(new WagmiInjectionContextError()).toMatchInlineSnapshot(`\n    [WagmiInjectionContextError: Wagmi composables can only be used inside \\`setup()\\` function or functions that support injection context.\n\n    Docs: https://wagmi.sh/vue/api/Nuxt.html\n    Version: @wagmi/vue@x.y.z]\n  `)\n})\n"
  },
  {
    "path": "packages/vue/src/errors/plugin.ts",
    "content": "import { BaseError } from './base.js'\n\nexport type WagmiPluginNotFoundErrorType = WagmiPluginNotFoundError & {\n  name: 'WagmiPluginNotFoundError'\n}\nexport class WagmiPluginNotFoundError extends BaseError {\n  override name = 'WagmiPluginNotFoundError'\n  constructor() {\n    super(\n      'No `config` found in Vue context, use `WagmiPlugin` to properly initialize the library.',\n      {\n        docsPath: '/api/Nuxt',\n      },\n    )\n  }\n}\n\nexport type WagmiInjectionContextErrorType = WagmiInjectionContextError & {\n  name: 'WagmiInjectionContextError'\n}\nexport class WagmiInjectionContextError extends BaseError {\n  override name = 'WagmiInjectionContextError'\n  constructor() {\n    super(\n      'Wagmi composables can only be used inside `setup()` function or functions that support injection context.',\n      {\n        docsPath: '/api/Nuxt',\n      },\n    )\n  }\n}\n"
  },
  {
    "path": "packages/vue/src/exports/actions.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport * as actions from './actions.js'\n\ntest('exports', () => {\n  expect(Object.keys(actions)).toMatchInlineSnapshot(`\n    [\n      \"call\",\n      \"connect\",\n      \"deployContract\",\n      \"disconnect\",\n      \"estimateFeesPerGas\",\n      \"estimateGas\",\n      \"estimateMaxPriorityFeePerGas\",\n      \"getBalance\",\n      \"getBlobBaseFee\",\n      \"getBlock\",\n      \"getBlockNumber\",\n      \"getBlockTransactionCount\",\n      \"getBytecode\",\n      \"getCallsStatus\",\n      \"getCapabilities\",\n      \"getChainId\",\n      \"getChains\",\n      \"getClient\",\n      \"getAccount\",\n      \"getConnection\",\n      \"getConnections\",\n      \"getConnectorClient\",\n      \"getConnectors\",\n      \"getContractEvents\",\n      \"getEnsAddress\",\n      \"getEnsAvatar\",\n      \"getEnsName\",\n      \"getEnsResolver\",\n      \"getEnsText\",\n      \"getFeeHistory\",\n      \"getGasPrice\",\n      \"getProof\",\n      \"getPublicClient\",\n      \"getStorageAt\",\n      \"getTransaction\",\n      \"getTransactionConfirmations\",\n      \"getTransactionCount\",\n      \"getTransactionReceipt\",\n      \"getWalletClient\",\n      \"multicall\",\n      \"prepareTransactionRequest\",\n      \"readContract\",\n      \"readContracts\",\n      \"reconnect\",\n      \"sendCalls\",\n      \"sendTransaction\",\n      \"showCallsStatus\",\n      \"signMessage\",\n      \"signTransaction\",\n      \"signTypedData\",\n      \"simulateContract\",\n      \"switchChain\",\n      \"switchAccount\",\n      \"switchConnection\",\n      \"verifyMessage\",\n      \"verifyTypedData\",\n      \"waitForCallsStatus\",\n      \"waitForTransactionReceipt\",\n      \"watchAsset\",\n      \"watchBlockNumber\",\n      \"watchBlocks\",\n      \"watchChainId\",\n      \"watchClient\",\n      \"watchAccount\",\n      \"watchConnection\",\n      \"watchConnections\",\n      \"watchConnectors\",\n      \"watchContractEvent\",\n      \"watchPendingTransactions\",\n      \"watchPublicClient\",\n      \"writeContract\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/vue/src/exports/actions.ts",
    "content": "////////////////////////////////////////////////////////////////////////////////\n// @wagmi/core/actions\n////////////////////////////////////////////////////////////////////////////////\n\n// biome-ignore lint/performance/noBarrelFile: entrypoint module\n// biome-ignore lint/performance/noReExportAll: entrypoint module\nexport * from '@wagmi/core/actions'\n"
  },
  {
    "path": "packages/vue/src/exports/chains.ts",
    "content": "////////////////////////////////////////////////////////////////////////////////\n// viem/chains\n////////////////////////////////////////////////////////////////////////////////\n\n// biome-ignore lint/performance/noBarrelFile: entrypoint module\n// biome-ignore lint/performance/noReExportAll: entrypoint module\nexport * from 'viem/chains'\n"
  },
  {
    "path": "packages/vue/src/exports/connectors.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport * as connectors from './connectors.js'\n\ntest('exports', () => {\n  expect(Object.keys(connectors)).toMatchInlineSnapshot(`\n    [\n      \"injected\",\n      \"mock\",\n      \"baseAccount\",\n      \"coinbaseWallet\",\n      \"metaMask\",\n      \"porto\",\n      \"safe\",\n      \"version\",\n      \"walletConnect\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/vue/src/exports/connectors.ts",
    "content": "////////////////////////////////////////////////////////////////////////////////\n// @wagmi/connectors\n////////////////////////////////////////////////////////////////////////////////\n\n// biome-ignore lint/performance/noBarrelFile: entrypoint module\n// biome-ignore lint/performance/noReExportAll: entrypoint module\nexport * from '@wagmi/connectors'\n"
  },
  {
    "path": "packages/vue/src/exports/index.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport * as vue from './index.js'\n\ntest('exports', () => {\n  expect(Object.keys(vue)).toMatchInlineSnapshot(`\n    [\n      \"configKey\",\n      \"WagmiPlugin\",\n      \"BaseError\",\n      \"WagmiInjectionContextError\",\n      \"WagmiPluginNotFoundError\",\n      \"useBalance\",\n      \"useBlockNumber\",\n      \"useBytecode\",\n      \"useChainId\",\n      \"useChains\",\n      \"useClient\",\n      \"useConfig\",\n      \"useConnect\",\n      \"useAccount\",\n      \"useConnection\",\n      \"useAccountEffect\",\n      \"useConnectionEffect\",\n      \"useConnections\",\n      \"useConnectorClient\",\n      \"useConnectors\",\n      \"useDisconnect\",\n      \"useEnsAddress\",\n      \"useEnsAvatar\",\n      \"useEnsName\",\n      \"useEstimateGas\",\n      \"useReadContract\",\n      \"useReconnect\",\n      \"useSendTransaction\",\n      \"useSignMessage\",\n      \"useSignTransaction\",\n      \"useSignTypedData\",\n      \"useSimulateContract\",\n      \"useSwitchChain\",\n      \"useSwitchAccount\",\n      \"useSwitchConnection\",\n      \"useTransaction\",\n      \"useTransactionReceipt\",\n      \"useWaitForTransactionReceipt\",\n      \"useWatchBlockNumber\",\n      \"useWatchContractEvent\",\n      \"useWriteContract\",\n      \"ChainNotConfiguredError\",\n      \"ConnectorAccountNotFoundError\",\n      \"ConnectorAlreadyConnectedError\",\n      \"ConnectorChainMismatchError\",\n      \"ConnectorNotFoundError\",\n      \"ConnectorUnavailableReconnectingError\",\n      \"cookieStorage\",\n      \"cookieToInitialState\",\n      \"createConfig\",\n      \"createConnector\",\n      \"createStorage\",\n      \"custom\",\n      \"deepEqual\",\n      \"deserialize\",\n      \"fallback\",\n      \"http\",\n      \"injected\",\n      \"mock\",\n      \"noopStorage\",\n      \"ProviderNotFoundError\",\n      \"parseCookie\",\n      \"SwitchChainNotSupportedError\",\n      \"serialize\",\n      \"unstable_connector\",\n      \"webSocket\",\n      \"version\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/vue/src/exports/index.ts",
    "content": "////////////////////////////////////////////////////////////////////////////////\n// Plugin\n////////////////////////////////////////////////////////////////////////////////\n\n// biome-ignore lint/performance/noBarrelFile: entrypoint module\nexport { configKey, WagmiPlugin, type WagmiPluginOptions } from '../plugin.js'\n\n////////////////////////////////////////////////////////////////////////////////\n// Errors\n////////////////////////////////////////////////////////////////////////////////\n\nexport { BaseError, type BaseErrorType } from '../errors/base.js'\n\nexport {\n  WagmiInjectionContextError,\n  type WagmiInjectionContextErrorType,\n  WagmiPluginNotFoundError,\n  type WagmiPluginNotFoundErrorType,\n} from '../errors/plugin.js'\n\n////////////////////////////////////////////////////////////////////////////////\n// Composables\n////////////////////////////////////////////////////////////////////////////////\n\nexport {\n  type UseBalanceParameters,\n  type UseBalanceReturnType,\n  useBalance,\n} from '../composables/useBalance.js'\n\nexport {\n  type UseBlockNumberParameters,\n  type UseBlockNumberReturnType,\n  useBlockNumber,\n} from '../composables/useBlockNumber.js'\n\nexport {\n  type UseBytecodeParameters,\n  type UseBytecodeReturnType,\n  useBytecode,\n} from '../composables/useBytecode.js'\n\nexport {\n  type UseChainIdParameters,\n  type UseChainIdReturnType,\n  useChainId,\n} from '../composables/useChainId.js'\n\nexport {\n  type UseChainsParameters,\n  type UseChainsReturnType,\n  useChains,\n} from '../composables/useChains.js'\n\nexport {\n  type UseClientParameters,\n  type UseClientReturnType,\n  useClient,\n} from '../composables/useClient.js'\n\nexport {\n  type UseConfigParameters,\n  type UseConfigReturnType,\n  useConfig,\n} from '../composables/useConfig.js'\n\nexport {\n  type UseConnectParameters,\n  type UseConnectReturnType,\n  useConnect,\n} from '../composables/useConnect.js'\n\nexport {\n  /** @deprecated use `UseConnectionParameters` instead */\n  type UseConnectionParameters as UseAccountParameters,\n  type UseConnectionParameters,\n  /** @deprecated use `UseConnectionReturnType` instead */\n  type UseConnectionReturnType as UseAccountReturnType,\n  type UseConnectionReturnType,\n  /** @deprecated use `useConnection` instead */\n  useConnection as useAccount,\n  useConnection,\n} from '../composables/useConnection.js'\n\nexport {\n  /** @deprecated use `UseConnectionEffectParameters` instead */\n  type UseConnectionEffectParameters as UseAccountEffectParameters,\n  type UseConnectionEffectParameters,\n  /** @deprecated use `useConnectionEffect` instead */\n  useConnectionEffect as useAccountEffect,\n  useConnectionEffect,\n} from '../composables/useConnectionEffect.js'\n\nexport {\n  type UseConnectionsParameters,\n  type UseConnectionsReturnType,\n  useConnections,\n} from '../composables/useConnections.js'\n\nexport {\n  type UseConnectorClientParameters,\n  type UseConnectorClientReturnType,\n  useConnectorClient,\n} from '../composables/useConnectorClient.js'\n\nexport {\n  type UseConnectorsParameters,\n  type UseConnectorsReturnType,\n  useConnectors,\n} from '../composables/useConnectors.js'\n\nexport {\n  type UseDisconnectParameters,\n  type UseDisconnectReturnType,\n  useDisconnect,\n} from '../composables/useDisconnect.js'\n\nexport {\n  type UseEnsAddressParameters,\n  type UseEnsAddressReturnType,\n  useEnsAddress,\n} from '../composables/useEnsAddress.js'\n\nexport {\n  type UseEnsAvatarParameters,\n  type UseEnsAvatarReturnType,\n  useEnsAvatar,\n} from '../composables/useEnsAvatar.js'\n\nexport {\n  type UseEnsNameParameters,\n  type UseEnsNameReturnType,\n  useEnsName,\n} from '../composables/useEnsName.js'\n\nexport {\n  type UseEstimateGasParameters,\n  type UseEstimateGasReturnType,\n  useEstimateGas,\n} from '../composables/useEstimateGas.js'\n\nexport {\n  type UseReadContractParameters,\n  type UseReadContractReturnType,\n  useReadContract,\n} from '../composables/useReadContract.js'\n\nexport {\n  type UseReconnectParameters,\n  type UseReconnectReturnType,\n  useReconnect,\n} from '../composables/useReconnect.js'\n\nexport {\n  type UseSendTransactionParameters,\n  type UseSendTransactionReturnType,\n  useSendTransaction,\n} from '../composables/useSendTransaction.js'\n\nexport {\n  type UseSignMessageParameters,\n  type UseSignMessageReturnType,\n  useSignMessage,\n} from '../composables/useSignMessage.js'\n\nexport {\n  type UseSignTransactionParameters,\n  type UseSignTransactionReturnType,\n  useSignTransaction,\n} from '../composables/useSignTransaction.js'\n\nexport {\n  type UseSignTypedDataParameters,\n  type UseSignTypedDataReturnType,\n  useSignTypedData,\n} from '../composables/useSignTypedData.js'\n\nexport {\n  type UseSimulateContractParameters,\n  type UseSimulateContractReturnType,\n  useSimulateContract,\n} from '../composables/useSimulateContract.js'\n\nexport {\n  type UseSwitchChainParameters,\n  type UseSwitchChainReturnType,\n  useSwitchChain,\n} from '../composables/useSwitchChain.js'\n\nexport {\n  /** @deprecated use `UseSwitchConnectionParameters` instead */\n  type UseSwitchConnectionParameters as UseSwitchAccountParameters,\n  type UseSwitchConnectionParameters,\n  /** @deprecated use `UseSwitchConnectionReturnType` instead */\n  type UseSwitchConnectionReturnType as UseSwitchAccountReturnType,\n  type UseSwitchConnectionReturnType,\n  /** @deprecated use `useSwitchConnection` instead */\n  useSwitchConnection as useSwitchAccount,\n  useSwitchConnection,\n} from '../composables/useSwitchConnection.js'\n\nexport {\n  type UseTransactionParameters,\n  type UseTransactionReturnType,\n  useTransaction,\n} from '../composables/useTransaction.js'\n\nexport {\n  type UseTransactionReceiptParameters,\n  type UseTransactionReceiptReturnType,\n  useTransactionReceipt,\n} from '../composables/useTransactionReceipt.js'\n\nexport {\n  type UseWaitForTransactionReceiptParameters,\n  type UseWaitForTransactionReceiptReturnType,\n  useWaitForTransactionReceipt,\n} from '../composables/useWaitForTransactionReceipt.js'\n\nexport {\n  type UseWatchBlockNumberParameters,\n  type UseWatchBlockNumberReturnType,\n  useWatchBlockNumber,\n} from '../composables/useWatchBlockNumber.js'\n\nexport {\n  type UseWatchContractEventParameters,\n  type UseWatchContractEventReturnType,\n  useWatchContractEvent,\n} from '../composables/useWatchContractEvent.js'\n\nexport {\n  type UseWriteContractParameters,\n  type UseWriteContractReturnType,\n  useWriteContract,\n} from '../composables/useWriteContract.js'\n\n////////////////////////////////////////////////////////////////////////////////\n// @wagmi/core\n////////////////////////////////////////////////////////////////////////////////\n\nexport {\n  ChainNotConfiguredError,\n  // Errors\n  type ChainNotConfiguredErrorType,\n  type Config,\n  // Config\n  type Connection,\n  type Connector,\n  ConnectorAccountNotFoundError,\n  type ConnectorAccountNotFoundErrorType,\n  ConnectorAlreadyConnectedError,\n  type ConnectorAlreadyConnectedErrorType,\n  ConnectorChainMismatchError,\n  type ConnectorChainMismatchErrorType,\n  // Connector\n  type ConnectorEventMap,\n  ConnectorNotFoundError,\n  type ConnectorNotFoundErrorType,\n  ConnectorUnavailableReconnectingError,\n  type ConnectorUnavailableReconnectingErrorType,\n  type CreateConfigParameters,\n  type CreateConnectorFn,\n  // Storage\n  type CreateStorageParameters,\n  // Utilities\n  cookieStorage,\n  cookieToInitialState,\n  createConfig,\n  createConnector,\n  createStorage,\n  // Transports\n  custom,\n  deepEqual,\n  deserialize,\n  fallback,\n  http,\n  injected,\n  mock,\n  noopStorage,\n  type PartializedState,\n  ProviderNotFoundError,\n  type ProviderNotFoundErrorType,\n  parseCookie,\n  // Types\n  type Register,\n  type ResolvedRegister,\n  type State,\n  type Storage,\n  SwitchChainNotSupportedError,\n  type SwitchChainNotSupportedErrorType,\n  serialize,\n  unstable_connector,\n  webSocket,\n} from '@wagmi/core'\n\n////////////////////////////////////////////////////////////////////////////////\n// Version\n////////////////////////////////////////////////////////////////////////////////\n\nexport { version } from '../version.js'\n"
  },
  {
    "path": "packages/vue/src/exports/nuxt.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport * as nuxt from './nuxt.js'\n\ntest('exports', () => {\n  expect(Object.keys(nuxt)).toMatchInlineSnapshot(`\n    [\n      \"default\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/vue/src/exports/nuxt.ts",
    "content": "import { wagmiModule } from '../nuxt/module.js'\n\nexport type { WagmiModuleOptions } from '../nuxt/module.js'\nexport default wagmiModule\n"
  },
  {
    "path": "packages/vue/src/exports/query.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport * as query from './query.js'\n\ntest('exports', () => {\n  expect(Object.keys(query)).toMatchInlineSnapshot(`\n    [\n      \"useMutation\",\n      \"useQuery\",\n      \"callQueryKey\",\n      \"callQueryOptions\",\n      \"connectMutationOptions\",\n      \"deployContractMutationOptions\",\n      \"disconnectMutationOptions\",\n      \"estimateFeesPerGasQueryKey\",\n      \"estimateFeesPerGasQueryOptions\",\n      \"estimateGasQueryKey\",\n      \"estimateGasQueryOptions\",\n      \"estimateMaxPriorityFeePerGasQueryKey\",\n      \"estimateMaxPriorityFeePerGasQueryOptions\",\n      \"getBalanceQueryKey\",\n      \"getBalanceQueryOptions\",\n      \"getBlobBaseFeeQueryKey\",\n      \"getBlobBaseFeeQueryOptions\",\n      \"getBlockQueryKey\",\n      \"getBlockQueryOptions\",\n      \"getBlockNumberQueryKey\",\n      \"getBlockNumberQueryOptions\",\n      \"getBlockTransactionCountQueryKey\",\n      \"getBlockTransactionCountQueryOptions\",\n      \"getBytecodeQueryKey\",\n      \"getBytecodeQueryOptions\",\n      \"getCallsStatusQueryKey\",\n      \"getCallsStatusQueryOptions\",\n      \"getCapabilitiesQueryKey\",\n      \"getCapabilitiesQueryOptions\",\n      \"getConnectorClientQueryKey\",\n      \"getConnectorClientQueryOptions\",\n      \"getContractEventsQueryKey\",\n      \"getContractEventsQueryOptions\",\n      \"getEnsAddressQueryKey\",\n      \"getEnsAddressQueryOptions\",\n      \"getEnsAvatarQueryKey\",\n      \"getEnsAvatarQueryOptions\",\n      \"getEnsNameQueryKey\",\n      \"getEnsNameQueryOptions\",\n      \"getEnsResolverQueryKey\",\n      \"getEnsResolverQueryOptions\",\n      \"getEnsTextQueryKey\",\n      \"getEnsTextQueryOptions\",\n      \"getFeeHistoryQueryKey\",\n      \"getFeeHistoryQueryOptions\",\n      \"getGasPriceQueryKey\",\n      \"getGasPriceQueryOptions\",\n      \"getProofQueryKey\",\n      \"getProofQueryOptions\",\n      \"getStorageAtQueryKey\",\n      \"getStorageAtQueryOptions\",\n      \"getTransactionQueryKey\",\n      \"getTransactionQueryOptions\",\n      \"getTransactionConfirmationsQueryKey\",\n      \"getTransactionConfirmationsQueryOptions\",\n      \"getTransactionCountQueryKey\",\n      \"getTransactionCountQueryOptions\",\n      \"getTransactionReceiptQueryKey\",\n      \"getTransactionReceiptQueryOptions\",\n      \"getWalletClientQueryKey\",\n      \"getWalletClientQueryOptions\",\n      \"infiniteReadContractsQueryKey\",\n      \"infiniteReadContractsQueryOptions\",\n      \"prepareTransactionRequestQueryKey\",\n      \"prepareTransactionRequestQueryOptions\",\n      \"readContractQueryKey\",\n      \"readContractQueryOptions\",\n      \"readContractsQueryKey\",\n      \"readContractsQueryOptions\",\n      \"reconnectMutationOptions\",\n      \"sendCallsMutationOptions\",\n      \"sendCallsSyncMutationOptions\",\n      \"sendTransactionMutationOptions\",\n      \"sendTransactionSyncMutationOptions\",\n      \"showCallsStatusMutationOptions\",\n      \"signMessageMutationOptions\",\n      \"signTransactionMutationOptions\",\n      \"signTypedDataMutationOptions\",\n      \"simulateContractQueryKey\",\n      \"simulateContractQueryOptions\",\n      \"switchChainMutationOptions\",\n      \"switchAccountMutationOptions\",\n      \"switchConnectionMutationOptions\",\n      \"hashFn\",\n      \"structuralSharing\",\n      \"verifyMessageQueryKey\",\n      \"verifyMessageQueryOptions\",\n      \"verifyTypedDataQueryKey\",\n      \"verifyTypedDataQueryOptions\",\n      \"waitForCallsStatusQueryKey\",\n      \"waitForCallsStatusQueryOptions\",\n      \"waitForTransactionReceiptQueryKey\",\n      \"waitForTransactionReceiptQueryOptions\",\n      \"watchAssetMutationOptions\",\n      \"writeContractMutationOptions\",\n      \"writeContractSyncMutationOptions\",\n    ]\n  `)\n})\n"
  },
  {
    "path": "packages/vue/src/exports/query.ts",
    "content": "////////////////////////////////////////////////////////////////////////////////\n// @wagmi/core/query\n////////////////////////////////////////////////////////////////////////////////\n\n// biome-ignore lint/performance/noBarrelFile: entrypoint module\n// biome-ignore lint/performance/noReExportAll: entrypoint module\nexport * from '@wagmi/core/query'\nexport {\n  type UseMutationParameters,\n  type UseMutationReturnType,\n  type UseQueryParameters,\n  type UseQueryReturnType,\n  useMutation,\n  useQuery,\n} from '../utils/query.js'\n"
  },
  {
    "path": "packages/vue/src/nuxt/module.ts",
    "content": "import type { NuxtModule } from '@nuxt/schema'\nimport { addImports, createResolver, defineNuxtModule } from 'nuxt/kit'\n\n// biome-ignore lint/complexity/noBannedTypes: allowed\nexport type WagmiModuleOptions = {}\n\nexport const wagmiModule: NuxtModule<WagmiModuleOptions> =\n  defineNuxtModule<WagmiModuleOptions>({\n    meta: {\n      name: '@wagmi/vue',\n      configKey: 'wagmi',\n      compatibility: {\n        nuxt: '^3.0.0 || ^4.0.0',\n      },\n    },\n    setup(_options, nuxt) {\n      const { resolve } = createResolver(import.meta.url)\n\n      // Add types\n      nuxt.hook('prepare:types', ({ references }) => {\n        references.push({ types: '@wagmi/vue/nuxt' })\n      })\n\n      // Add auto imports\n      const composables = resolve('./runtime/composables')\n      const names = [\n        'useAccount' /** @deprecated */,\n        'useAccountEffect' /** @deprecated */,\n        'useBalance',\n        'useBlockNumber',\n        'useChainId',\n        'useChains',\n        'useClient',\n        'useConfig',\n        'useConnect',\n        'useConnection',\n        'useConnectionEffect',\n        'useConnections',\n        'useConnectorClient',\n        'useConnectors',\n        'useDisconnect',\n        'useEnsAddress',\n        'useEnsAvatar',\n        'useEnsName',\n        'useEstimateGas',\n        'useReadContract',\n        'useReconnect',\n        'useSendTransaction',\n        'useSignMessage',\n        'useSignTypedData',\n        'useSimulateContract',\n        'useSwitchAccount' /** @deprecated */,\n        'useSwitchChain',\n        'useSwitchConnection',\n        'useTransaction',\n        'useTransactionReceipt',\n        'useWaitForTransactionReceipt',\n        'useWatchBlockNumber',\n        'useWriteContract',\n      ]\n      addImports(names.map((name) => ({ from: composables, name })))\n    },\n  })\n"
  },
  {
    "path": "packages/vue/src/nuxt/runtime/composables.ts",
    "content": "// biome-ignore lint/performance/noBarrelFile: entrypoint module\n// biome-ignore lint/performance/noReExportAll: entrypoint module\nexport * from '../../exports/index.js'\n"
  },
  {
    "path": "packages/vue/src/plugin.ts",
    "content": "import { hydrate, type ResolvedRegister, type State } from '@wagmi/core'\nimport type { Plugin } from 'vue'\n\nexport const configKey = Symbol()\n\nexport type WagmiPluginOptions = {\n  config: ResolvedRegister['config']\n  initialState?: State | undefined\n  reconnectOnMount?: boolean | undefined\n}\n\nexport const WagmiPlugin = {\n  install(app, options) {\n    const { config, reconnectOnMount = true } = options\n    app.provide(configKey, config)\n    // TODO: check this works in SSR env.\n    // - reconnect on mount.\n    // - hydrate initial state.\n    const { onMount } = hydrate(config, { ...options, reconnectOnMount })\n    onMount()\n  },\n} satisfies Plugin<WagmiPluginOptions>\n"
  },
  {
    "path": "packages/vue/src/types/properties.ts",
    "content": "import type { MaybeRef } from 'vue'\n\nexport type EnabledParameter = {\n  enabled?: MaybeRef<boolean> | undefined\n}\n"
  },
  {
    "path": "packages/vue/src/types/ref.ts",
    "content": "// Credit: https://github.com/TanStack/query/blob/01ce023826b81e6c41e354f27691f65c9725af67/packages/vue-query/src/types.ts\n\nimport type { Config, Connector } from '@wagmi/core'\nimport type { MaybeRef, Ref, UnwrapRef } from 'vue'\n\ntype Primitive = string | number | boolean | bigint | symbol | undefined | null\ntype UnwrapLeaf =\n  | Primitive\n  // biome-ignore lint/complexity/noBannedTypes: we need to support all types\n  | Function\n  | Date\n  | Error\n  | RegExp\n  | Map<any, any>\n  | WeakMap<any, any>\n  | Set<any>\n  | WeakSet<any>\n\nexport type DeepMaybeRef<value> = MaybeRef<\n  // biome-ignore lint/complexity/noBannedTypes: allowed\n  value extends Function | Config | Connector\n    ? value\n    : value extends object | any[]\n      ? {\n          [key in keyof value]: DeepMaybeRef<value[key]>\n        }\n      : value\n>\n\nexport type DeepUnwrapRef<T> = T extends UnwrapLeaf\n  ? T\n  : T extends Ref<infer U>\n    ? DeepUnwrapRef<U>\n    : // biome-ignore lint/complexity/noBannedTypes: allowed\n      T extends {}\n      ? {\n          [Property in keyof T]: DeepUnwrapRef<T[Property]>\n        }\n      : UnwrapRef<T>\n"
  },
  {
    "path": "packages/vue/src/utils/cloneDeep.ts",
    "content": "// Credit: https://github.com/TanStack/query/blob/01ce023826b81e6c41e354f27691f65c9725af67/packages/vue-query/src/utils.ts\n\nimport { isRef, unref } from 'vue'\n\nimport type { DeepMaybeRef, DeepUnwrapRef } from '../types/ref.js'\n\nfunction cloneDeep<value>(\n  value: DeepMaybeRef<value>,\n  customize?: (val: DeepMaybeRef<value>) => value | undefined,\n): value {\n  if (customize) {\n    const result = customize(value)\n    // If it's a ref of undefined, return undefined\n    if (result === undefined && isRef(value)) return result as value\n    if (result !== undefined) return result\n  }\n\n  if (Array.isArray(value))\n    return value.map((val) => cloneDeep(val, customize)) as unknown as value\n\n  if (typeof value === 'object' && isPlainObject(value)) {\n    const entries = Object.entries(value).map(([key, val]) => [\n      key,\n      cloneDeep(val, customize),\n    ])\n    return Object.fromEntries(entries)\n  }\n\n  return value as value\n}\n\nexport function deepUnref<value>(value: value): DeepUnwrapRef<value> {\n  return cloneDeep(value as any, (val) => {\n    if (isRef(val)) return deepUnref(unref(val))\n    return undefined\n  })\n}\n\n// biome-ignore lint/complexity/noBannedTypes: allowed\nfunction isPlainObject(value: unknown): value is Object {\n  if (Object.prototype.toString.call(value) !== '[object Object]') return false\n  const prototype = Object.getPrototypeOf(value)\n  return prototype === null || prototype === Object.prototype\n}\n"
  },
  {
    "path": "packages/vue/src/utils/getVersion.test.ts",
    "content": "import { expect, test } from 'vitest'\n\nimport { getVersion } from './getVersion.js'\n\ntest('default', () => {\n  expect(getVersion()).toMatchInlineSnapshot(`\"@wagmi/vue@x.y.z\"`)\n})\n"
  },
  {
    "path": "packages/vue/src/utils/getVersion.ts",
    "content": "import { version } from '../version.js'\n\nexport const getVersion = () => `@wagmi/vue@${version}`\n"
  },
  {
    "path": "packages/vue/src/utils/query.ts",
    "content": "import {\n  type DefaultError,\n  type MutateFunction,\n  type MutationObserverOptions,\n  type QueryKey,\n  type UseMutationReturnType as tanstack_UseMutationReturnType,\n  type UseQueryReturnType as tanstack_UseQueryReturnType,\n  useQuery as tanstack_useQuery,\n  type UseQueryOptions,\n  useMutation,\n} from '@tanstack/vue-query'\nimport type {\n  Compute,\n  ExactPartial,\n  Omit,\n  UnionStrictOmit,\n} from '@wagmi/core/internal'\nimport { hashFn } from '@wagmi/core/query'\nimport { computed, type MaybeRef, unref } from 'vue'\n\nimport type { DeepMaybeRef, DeepUnwrapRef } from '../types/ref.js'\n\nexport { useMutation }\n\nexport type UseMutationParameters<\n  data = unknown,\n  error = Error,\n  variables = void,\n  context = unknown,\n> = Compute<\n  DeepMaybeRef<\n    Omit<\n      DeepUnwrapRef<\n        MutationObserverOptions<data, error, Compute<variables>, context>\n      >,\n      'mutationFn' | 'mutationKey' | 'throwOnError'\n    >\n  >\n>\n\nexport type UseMutationReturnType<\n  data = unknown,\n  error = Error,\n  variables = void,\n  context = unknown,\n  mutate = MutateFunction,\n  mutateAsync = MutateFunction,\n> = Compute<\n  UnionStrictOmit<\n    tanstack_UseMutationReturnType<data, error, variables, context>,\n    'mutate' | 'mutateAsync'\n  > & {\n    mutate: mutate\n    mutateAsync: mutateAsync\n  }\n>\n\n////////////////////////////////////////////////////////////////////////////////\n\n// Adding some basic customization.\n// Ideally we don't have this function, but `import('@tanstack/vue-query').useQuery` currently has some quirks where it is super hard to\n// pass down the inferred `initialData` type because of it's discriminated overload in the on `useQuery`.\nexport function useQuery<queryFnData, error, data, queryKey extends QueryKey>(\n  parameters: MaybeRef<\n    UseQueryParameters<queryFnData, error, data, queryKey> & {\n      queryKey: QueryKey\n    }\n  >,\n): UseQueryReturnType<data, error> {\n  const options = computed(() => ({\n    ...(unref(parameters) as any),\n    queryKeyHashFn: hashFn,\n  }))\n  const result = tanstack_useQuery(options) as UseQueryReturnType<data, error>\n  result.queryKey = unref(options).queryKey as QueryKey\n  return result\n}\n\nexport type UseQueryParameters<\n  queryFnData = unknown,\n  error = DefaultError,\n  data = queryFnData,\n  queryKey extends QueryKey = QueryKey,\n> = Compute<\n  DeepMaybeRef<\n    ExactPartial<\n      Omit<\n        DeepUnwrapRef<\n          UseQueryOptions<queryFnData, error, data, queryFnData, queryKey>\n        >,\n        'initialData'\n      >\n    > & {\n      // Fix `initialData` type\n      initialData?:\n        | DeepUnwrapRef<\n            UseQueryOptions<queryFnData, error, data, queryFnData, queryKey>\n          >['initialData']\n        | undefined\n    }\n  >\n>\n\nexport type UseQueryReturnType<data = unknown, error = DefaultError> = Compute<\n  tanstack_UseQueryReturnType<data, error> & {\n    queryKey: QueryKey\n  }\n>\n"
  },
  {
    "path": "packages/vue/src/utils/updateState.ts",
    "content": "// Credit: https://github.com/TanStack/query/blob/01ce023826b81e6c41e354f27691f65c9725af67/packages/vue-query/src/utils.ts#L11-L18\n\nexport function updateState(\n  state: Record<string, unknown>,\n  update: Record<string, any>,\n): void {\n  for (const key of Object.keys(state)) {\n    state[key] = update[key]\n  }\n}\n"
  },
  {
    "path": "packages/vue/src/version.ts",
    "content": "export const version = '0.5.0'\n"
  },
  {
    "path": "packages/vue/test/setup.ts",
    "content": "import { vi } from 'vitest'\n\n// Make dates stable across runs\nDate.now = vi.fn(() => new Date(Date.UTC(2023, 1, 1)).valueOf())\n\nvi.mock('../src/version.ts', () => {\n  return { version: 'x.y.z' }\n})\n"
  },
  {
    "path": "packages/vue/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"include\": [\"src/**/*.ts\"],\n  \"exclude\": [\"src/**/*.test.ts\", \"src/**/*.test-d.ts\"],\n  \"compilerOptions\": {\n    \"sourceMap\": true\n  }\n}\n"
  },
  {
    "path": "packages/vue/tsconfig.json",
    "content": "{\n  \"extends\": \"./tsconfig.build.json\",\n  \"include\": [\"src/**/*.ts\", \"test/**/*.ts\"],\n  \"exclude\": []\n}\n"
  },
  {
    "path": "playgrounds/next/.gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.js\n\n# testing\n/coverage\n\n# next.js\n/.next/\n/out/\n\n# production\n/build\n\n# misc\n.DS_Store\n*.pem\n\n# debug\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# local env files\n.env*.local\n\n# vercel\n.vercel\n\n# typescript\n*.tsbuildinfo\nnext-env.d.ts\n"
  },
  {
    "path": "playgrounds/next/next.config.ts",
    "content": "import type { NextConfig } from 'next'\n\nconst nextConfig = {\n  experimental: {\n    externalDir: true,\n  },\n  // TODO: Remove and switch to turbopack once Next supports extensionAliases\n  // https://github.com/vercel/next.js/issues/82945\n  webpack(config) {\n    config.resolve.extensionAlias = {\n      '.js': ['.js', '.ts'],\n    }\n    return config\n  },\n} satisfies NextConfig\n\nexport default nextConfig\n"
  },
  {
    "path": "playgrounds/next/package.json",
    "content": "{\n  \"name\": \"next-app\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"dev\": \"next dev --webpack\",\n    \"build\": \"next build --webpack\",\n    \"start\": \"next start\",\n    \"lint\": \"next lint\"\n  },\n  \"dependencies\": {\n    \"@next/bundle-analyzer\": \"^14.2.3\",\n    \"@tanstack/react-query\": \"catalog:\",\n    \"next\": \"^16.1.7\",\n    \"react\": \"catalog:\",\n    \"react-dom\": \"catalog:\",\n    \"viem\": \"2.*\",\n    \"wagmi\": \"workspace:*\"\n  },\n  \"devDependencies\": {\n    \"@types/node\": \"^24.5.1\",\n    \"@types/react\": \"catalog:\",\n    \"@types/react-dom\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "playgrounds/next/src/app/contracts.ts",
    "content": "export const wagmiContractConfig = {\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  abi: [\n    { inputs: [], stateMutability: 'nonpayable', type: 'constructor' },\n    {\n      anonymous: false,\n      inputs: [\n        {\n          indexed: true,\n          name: 'owner',\n          type: 'address',\n        },\n        {\n          indexed: true,\n          name: 'approved',\n          type: 'address',\n        },\n        {\n          indexed: true,\n          name: 'tokenId',\n          type: 'uint256',\n        },\n      ],\n      name: 'Approval',\n      type: 'event',\n    },\n    {\n      anonymous: false,\n      inputs: [\n        {\n          indexed: true,\n          name: 'owner',\n          type: 'address',\n        },\n        {\n          indexed: true,\n          name: 'operator',\n          type: 'address',\n        },\n        {\n          indexed: false,\n          name: 'approved',\n          type: 'bool',\n        },\n      ],\n      name: 'ApprovalForAll',\n      type: 'event',\n    },\n    {\n      anonymous: false,\n      inputs: [\n        {\n          indexed: true,\n          name: 'from',\n          type: 'address',\n        },\n        { indexed: true, name: 'to', type: 'address' },\n        {\n          indexed: true,\n          name: 'tokenId',\n          type: 'uint256',\n        },\n      ],\n      name: 'Transfer',\n      type: 'event',\n    },\n    {\n      inputs: [\n        { name: 'to', type: 'address' },\n        { name: 'tokenId', type: 'uint256' },\n      ],\n      name: 'approve',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'owner', type: 'address' }],\n      name: 'balanceOf',\n      outputs: [{ name: '', type: 'uint256' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'tokenId', type: 'uint256' }],\n      name: 'getApproved',\n      outputs: [{ name: '', type: 'address' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'owner', type: 'address' },\n        { name: 'operator', type: 'address' },\n      ],\n      name: 'isApprovedForAll',\n      outputs: [{ name: '', type: 'bool' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [],\n      name: 'mint',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [{ internalType: 'uint256', name: 'tokenId', type: 'uint256' }],\n      name: 'mint',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [],\n      name: 'name',\n      outputs: [{ name: '', type: 'string' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'tokenId', type: 'uint256' }],\n      name: 'ownerOf',\n      outputs: [{ name: '', type: 'address' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'from', type: 'address' },\n        { name: 'to', type: 'address' },\n        { name: 'tokenId', type: 'uint256' },\n      ],\n      name: 'safeTransferFrom',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'from', type: 'address' },\n        { name: 'to', type: 'address' },\n        { name: 'tokenId', type: 'uint256' },\n        { name: '_data', type: 'bytes' },\n      ],\n      name: 'safeTransferFrom',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'operator', type: 'address' },\n        { name: 'approved', type: 'bool' },\n      ],\n      name: 'setApprovalForAll',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'interfaceId', type: 'bytes4' }],\n      name: 'supportsInterface',\n      outputs: [{ name: '', type: 'bool' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [],\n      name: 'symbol',\n      outputs: [{ name: '', type: 'string' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'tokenId', type: 'uint256' }],\n      name: 'tokenURI',\n      outputs: [{ name: '', type: 'string' }],\n      stateMutability: 'pure',\n      type: 'function',\n    },\n    {\n      inputs: [],\n      name: 'totalSupply',\n      outputs: [{ name: '', type: 'uint256' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'from', type: 'address' },\n        { name: 'to', type: 'address' },\n        { name: 'tokenId', type: 'uint256' },\n      ],\n      name: 'transferFrom',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n  ],\n} as const\n"
  },
  {
    "path": "playgrounds/next/src/app/globals.css",
    "content": ":root {\n  background-color: #181818;\n  color: rgba(255, 255, 255, 0.87);\n  color-scheme: light dark;\n  font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;\n  font-synthesis: none;\n  font-weight: 400;\n  line-height: 1.5;\n  text-rendering: optimizeLegibility;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-text-size-adjust: 100%;\n}\n\n@media (prefers-color-scheme: light) {\n  :root {\n    background-color: #f8f8f8;\n    color: #181818;\n  }\n}\n"
  },
  {
    "path": "playgrounds/next/src/app/layout.tsx",
    "content": "import type { Metadata } from 'next'\nimport { Inter } from 'next/font/google'\nimport { headers } from 'next/headers'\nimport type { ReactNode } from 'react'\nimport { cookieToInitialState } from 'wagmi'\nimport './globals.css'\n\nimport { getConfig } from '../wagmi'\nimport { Providers } from './providers'\n\nconst inter = Inter({ subsets: ['latin'] })\n\nexport const metadata: Metadata = {\n  title: 'Create Wagmi',\n  description: 'Generated by create-wagmi',\n}\n\nexport default async function RootLayout(props: { children: ReactNode }) {\n  const initialState = cookieToInitialState(\n    getConfig(),\n    (await headers()).get('cookie'),\n  )\n  return (\n    <html lang=\"en\">\n      <body className={inter.className}>\n        <Providers initialState={initialState}>{props.children}</Providers>\n      </body>\n    </html>\n  )\n}\n"
  },
  {
    "path": "playgrounds/next/src/app/page.tsx",
    "content": "'use client'\n\nimport type { FormEvent } from 'react'\nimport { formatEther, type Hex, parseAbi, parseEther } from 'viem'\nimport {\n  type BaseError,\n  useBalance,\n  useBlockNumber,\n  useChainId,\n  useChains,\n  useConfig,\n  useConnect,\n  useConnection,\n  useConnectionEffect,\n  useConnections,\n  useConnectorClient,\n  useConnectors,\n  useDisconnect,\n  useEnsName,\n  useReadContract,\n  useReadContracts,\n  useSendTransaction,\n  useSignMessage,\n  useSwitchChain,\n  useSwitchConnection,\n  useWaitForTransactionReceipt,\n  useWriteContract,\n} from 'wagmi'\nimport { switchChain } from 'wagmi/actions'\nimport { optimism, sepolia } from 'wagmi/chains'\n\nimport { wagmiContractConfig } from './contracts'\n\nexport default function App() {\n  useConnectionEffect({\n    onConnect(_data) {\n      // console.log('onConnect', data)\n    },\n    onDisconnect() {\n      // console.log('onDisconnect')\n    },\n  })\n\n  return (\n    <>\n      <Connection />\n      <Connect />\n      <SwitchConnection />\n      <SwitchChain />\n      <Repro />\n      <SignMessage />\n      <Connections />\n      <BlockNumber />\n      <Balance />\n      <ConnectorClient />\n      <SendTransaction />\n      <ReadContract />\n      <ReadContracts />\n      <WriteContract />\n    </>\n  )\n}\n\nfunction Connection() {\n  const connection = useConnection()\n  const { disconnect } = useDisconnect()\n  const { data: ensName } = useEnsName({\n    address: connection.address,\n  })\n\n  return (\n    <div>\n      <h2>Connection</h2>\n\n      <div>\n        account: {connection.address} {ensName}\n        <br />\n        chainId: {connection.chainId}\n        <br />\n        status: {connection.status}\n      </div>\n\n      {connection.status === 'connected' && (\n        <button type=\"button\" onClick={() => disconnect()}>\n          Disconnect\n        </button>\n      )}\n    </div>\n  )\n}\n\nfunction Connect() {\n  const chainId = useChainId()\n  const { connect, status, error } = useConnect()\n  const connectors = useConnectors()\n\n  return (\n    <div>\n      <h2>Connect</h2>\n      {connectors.map((connector) => (\n        <button\n          key={connector.uid}\n          onClick={() => connect({ connector, chainId })}\n          type=\"button\"\n        >\n          {connector.name}\n        </button>\n      ))}\n      <div>{status}</div>\n      <div>{error?.message}</div>\n    </div>\n  )\n}\n\nfunction SwitchConnection() {\n  const connection = useConnection()\n  const { switchConnection } = useSwitchConnection()\n  const connections = useConnections()\n\n  return (\n    <div>\n      <h2>Switch Connection</h2>\n\n      {connections.map(({ connector }) => (\n        <button\n          disabled={connection.connector?.uid === connector.uid}\n          key={connector.uid}\n          onClick={() => switchConnection({ connector })}\n          type=\"button\"\n        >\n          {connector.name}\n        </button>\n      ))}\n    </div>\n  )\n}\n\nfunction SwitchChain() {\n  const chainId = useChainId()\n  const { switchChain, error } = useSwitchChain()\n  const chains = useChains()\n\n  return (\n    <div>\n      <h2>Switch Chain</h2>\n\n      {chains.map((chain) => (\n        <button\n          disabled={chainId === chain.id}\n          key={chain.id}\n          onClick={() => switchChain({ chainId: chain.id })}\n          type=\"button\"\n        >\n          {chain.name}\n        </button>\n      ))}\n\n      {error?.message}\n    </div>\n  )\n}\n\nfunction SignMessage() {\n  const { data, signMessage } = useSignMessage()\n\n  return (\n    <div>\n      <h2>Sign Message</h2>\n\n      <form\n        onSubmit={(event) => {\n          event.preventDefault()\n          const formData = new FormData(event.target as HTMLFormElement)\n          signMessage({ message: formData.get('message') as string })\n        }}\n      >\n        <input name=\"message\" />\n        <button type=\"submit\">Sign Message</button>\n      </form>\n\n      {data}\n    </div>\n  )\n}\n\nfunction Connections() {\n  const connections = useConnections()\n\n  return (\n    <div>\n      <h2>Connections</h2>\n\n      {connections.map((connection) => (\n        <div key={connection.connector.uid}>\n          <div>connector {connection.connector.name}</div>\n          <div>accounts: {JSON.stringify(connection.accounts)}</div>\n          <div>chainId: {connection.chainId}</div>\n        </div>\n      ))}\n    </div>\n  )\n}\n\nfunction Balance() {\n  const { address } = useConnection()\n\n  const { data: default_ } = useBalance({ address })\n  const { data: account_ } = useBalance({ address })\n  const { data: optimism_ } = useBalance({\n    address,\n    chainId: optimism.id,\n  })\n\n  return (\n    <div>\n      <h2>Balance</h2>\n\n      <div>\n        Balance (Default Chain):{' '}\n        {!!default_?.value && formatEther(default_.value)}\n      </div>\n      <div>\n        Balance (Connection Chain):{' '}\n        {!!account_?.value && formatEther(account_.value)}\n      </div>\n      <div>\n        Balance (Optimism Chain):{' '}\n        {!!optimism_?.value && formatEther(optimism_.value)}\n      </div>\n    </div>\n  )\n}\n\nfunction BlockNumber() {\n  const { data: default_ } = useBlockNumber({ watch: true })\n  const { data: account_ } = useBlockNumber({\n    watch: true,\n  })\n  const { data: optimism_ } = useBlockNumber({\n    chainId: optimism.id,\n    watch: true,\n  })\n\n  return (\n    <div>\n      <h2>Block Number</h2>\n\n      <div>Block Number (Default Chain): {default_?.toString()}</div>\n      <div>Block Number (Connection Chain): {account_?.toString()}</div>\n      <div>Block Number (Optimism): {optimism_?.toString()}</div>\n    </div>\n  )\n}\n\nfunction ConnectorClient() {\n  const { data, error } = useConnectorClient()\n  return (\n    <div>\n      <h2>Connector Client</h2>\n      client {data?.account?.address} {data?.chain?.id}\n      {error?.message}\n    </div>\n  )\n}\n\nfunction SendTransaction() {\n  const { data: hash, error, isPending, sendTransaction } = useSendTransaction()\n\n  async function submit(e: FormEvent<HTMLFormElement>) {\n    e.preventDefault()\n    const formData = new FormData(e.target as HTMLFormElement)\n    const to = formData.get('address') as Hex\n    const value = formData.get('value') as string\n    sendTransaction({ to, value: parseEther(value) })\n  }\n\n  const { isLoading: isConfirming, isSuccess: isConfirmed } =\n    useWaitForTransactionReceipt({\n      hash,\n    })\n\n  return (\n    <div>\n      <h2>Send Transaction</h2>\n      <form onSubmit={submit}>\n        <input name=\"address\" placeholder=\"Address\" required />\n        <input\n          name=\"value\"\n          placeholder=\"Amount (ETH)\"\n          type=\"number\"\n          step=\"0.000000001\"\n          required\n        />\n        <button disabled={isPending} type=\"submit\">\n          {isPending ? 'Confirming...' : 'Send'}\n        </button>\n      </form>\n      {hash && <div>Transaction Hash: {hash}</div>}\n      {isConfirming && 'Waiting for confirmation...'}\n      {isConfirmed && 'Transaction confirmed.'}\n      {error && (\n        <div>Error: {(error as BaseError).shortMessage || error.message}</div>\n      )}\n    </div>\n  )\n}\n\nfunction ReadContract() {\n  const { data: balance } = useReadContract({\n    ...wagmiContractConfig,\n    functionName: 'balanceOf',\n    args: ['0x03A71968491d55603FFe1b11A9e23eF013f75bCF'],\n  })\n\n  return (\n    <div>\n      <h2>Read Contract</h2>\n      <div>Balance: {balance?.toString()}</div>\n    </div>\n  )\n}\n\nfunction ReadContracts() {\n  const { data } = useReadContracts({\n    allowFailure: false,\n    contracts: [\n      {\n        ...wagmiContractConfig,\n        functionName: 'balanceOf',\n        args: ['0x03A71968491d55603FFe1b11A9e23eF013f75bCF'],\n      },\n      {\n        ...wagmiContractConfig,\n        functionName: 'ownerOf',\n        args: [69n],\n      },\n      {\n        ...wagmiContractConfig,\n        functionName: 'totalSupply',\n      },\n    ],\n  })\n  const [balance, ownerOf, totalSupply] = data || []\n\n  return (\n    <div>\n      <h2>Read Contract</h2>\n      <div>Balance: {balance?.toString()}</div>\n      <div>Owner of Token 69: {ownerOf?.toString()}</div>\n      <div>Total Supply: {totalSupply?.toString()}</div>\n    </div>\n  )\n}\n\nfunction WriteContract() {\n  const { data: hash, error, isPending, writeContract } = useWriteContract()\n\n  async function submit(e: FormEvent<HTMLFormElement>) {\n    e.preventDefault()\n    const formData = new FormData(e.target as HTMLFormElement)\n    const tokenId = formData.get('tokenId') as string\n    writeContract({\n      address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n      abi: parseAbi(['function mint(uint256 tokenId)']),\n      functionName: 'mint',\n      args: [BigInt(tokenId)],\n    })\n  }\n\n  const { isLoading: isConfirming, isSuccess: isConfirmed } =\n    useWaitForTransactionReceipt({\n      hash,\n    })\n\n  return (\n    <div>\n      <h2>Write Contract</h2>\n      <form onSubmit={submit}>\n        <input name=\"tokenId\" placeholder=\"Token ID\" required />\n        <button disabled={isPending} type=\"submit\">\n          {isPending ? 'Confirming...' : 'Mint'}\n        </button>\n      </form>\n      {hash && <div>Transaction Hash: {hash}</div>}\n      {isConfirming && 'Waiting for confirmation...'}\n      {isConfirmed && 'Transaction confirmed.'}\n      {error && (\n        <div>Error: {(error as BaseError).shortMessage || error.message}</div>\n      )}\n    </div>\n  )\n}\n\nfunction Repro() {\n  const config = useConfig()\n  const chainId = useChainId()\n\n  console.log('chainId from useChainId is', chainId)\n  return (\n    <main className=\"flex min-h-screen flex-col items-center p-24\">\n      Current Chain Id: {chainId}\n      <button\n        type=\"button\"\n        onClick={() => switchChain(config, { chainId: sepolia.id })}\n      >\n        Switch to Polygon\n      </button>\n      <button\n        type=\"button\"\n        onClick={() => switchChain(config, { chainId: optimism.id })}\n      >\n        Switch to Arbitrum\n      </button>\n    </main>\n  )\n}\n"
  },
  {
    "path": "playgrounds/next/src/app/providers.tsx",
    "content": "'use client'\n\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { type ReactNode, useState } from 'react'\nimport { type State, WagmiProvider } from 'wagmi'\n\nimport { getConfig } from '../wagmi'\n\nexport function Providers(props: {\n  children: ReactNode\n  initialState?: State\n}) {\n  const [config] = useState(() => getConfig())\n  const [queryClient] = useState(() => new QueryClient())\n\n  return (\n    <WagmiProvider config={config} initialState={props.initialState}>\n      <QueryClientProvider client={queryClient}>\n        {props.children}\n      </QueryClientProvider>\n    </WagmiProvider>\n  )\n}\n"
  },
  {
    "path": "playgrounds/next/src/wagmi.ts",
    "content": "import { cookieStorage, createConfig, createStorage, http } from 'wagmi'\nimport { mainnet, optimism, sepolia } from 'wagmi/chains'\nimport { injected, metaMask, walletConnect } from 'wagmi/connectors'\n\nexport function getConfig() {\n  return createConfig({\n    chains: [mainnet, sepolia, optimism],\n    connectors: [\n      injected(),\n      walletConnect({\n        projectId: process.env.NEXT_PUBLIC_WC_PROJECT_ID!,\n      }),\n      metaMask(),\n    ],\n    storage: createStorage({\n      storage: cookieStorage,\n    }),\n    ssr: true,\n    transports: {\n      [mainnet.id]: http(),\n      [sepolia.id]: http(),\n      [optimism.id]: http(),\n    },\n  })\n}\n\ndeclare module 'wagmi' {\n  interface Register {\n    config: ReturnType<typeof getConfig>\n  }\n}\n"
  },
  {
    "path": "playgrounds/next/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n    \"allowImportingTsExtensions\": true,\n    \"allowJs\": true,\n    \"skipLibCheck\": true,\n    \"strict\": true,\n    \"noEmit\": true,\n    \"esModuleInterop\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"bundler\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"jsx\": \"react-jsx\",\n    \"incremental\": true,\n    \"plugins\": [\n      {\n        \"name\": \"next\"\n      }\n    ]\n  },\n  \"include\": [\n    \"next-env.d.ts\",\n    \"**/*.ts\",\n    \"**/*.tsx\",\n    \".next/types/**/*.ts\",\n    \".next/dev/types/**/*.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "playgrounds/nuxt/.gitignore",
    "content": "# Nuxt dev/build outputs\n.output\n.data\n.nuxt\n.nitro\n.cache\ndist\n\n# Node dependencies\nnode_modules\n\n# Logs\nlogs\n*.log\n\n# Misc\n.DS_Store\n.fleet\n.idea\n\n# Local env files\n.env\n.env.*\n!.env.example\n"
  },
  {
    "path": "playgrounds/nuxt/app.vue",
    "content": "<template>\n  <Connect />\n  <Connection />\n</template>\n\n<style>\n:root {\n  background-color: #181818;\n  color: rgba(255, 255, 255, 0.87);\n  color-scheme: light dark;\n  font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;\n  font-synthesis: none;\n  font-weight: 400;\n  line-height: 1.5;\n  text-rendering: optimizeLegibility;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-text-size-adjust: 100%;\n}\n\n@media (prefers-color-scheme: light) {\n  :root {\n    background-color: #f8f8f8;\n    color: #181818;\n  }\n}\n</style>\n"
  },
  {
    "path": "playgrounds/nuxt/components/Connect.vue",
    "content": "<script setup lang=\"ts\">\nimport { useChainId, useConnect, useConnectors } from '@wagmi/vue'\n\nconst chainId = useChainId()\nconst { connect, error, status } = useConnect()\nconst connectors = useConnectors()\n</script>\n\n<template>\n  <h2>Connect</h2>\n\n  <button v-for=\"connector in connectors\" :key=\"connector.id\" type=\"button\" @click=\"connect({ connector, chainId })\">\n    {{ connector.name }}\n  </button>\n\n  <div>\n    {{ status }}\n    {{ error?.message }}\n  </div>\n</template>\n"
  },
  {
    "path": "playgrounds/nuxt/components/Connection.vue",
    "content": "<script setup lang=\"ts\">\nimport { useConnection, useDisconnect } from '@wagmi/vue'\n\nconst { address, chainId, status } = useConnection()\nconst { disconnect } = useDisconnect()\n</script>\n\n<template>\n  <h2>Connection</h2>\n\n  <div>\n    address: {{ address }}\n    <br />\n    chainId: {{ chainId }}\n    <br />\n    status: {{ status }}\n  </div>\n\n  <button v-if=\"status !== 'disconnected'\" type=\"button\" @click=\"disconnect()\">\n    Disconnect\n  </button>\n</template>\n"
  },
  {
    "path": "playgrounds/nuxt/nuxt.config.ts",
    "content": "import { defineNuxtConfig } from 'nuxt/config'\n\n// https://nuxt.com/docs/api/configuration/nuxt-config\nexport default defineNuxtConfig({\n  devtools: { enabled: true },\n  modules: ['@wagmi/vue/nuxt'],\n})\n"
  },
  {
    "path": "playgrounds/nuxt/package.json",
    "content": "{\n  \"name\": \"nuxt-app\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"build\": \"nuxt build\",\n    \"dev\": \"nuxt dev\",\n    \"generate\": \"nuxt generate\",\n    \"preview\": \"nuxt preview\",\n    \"_postinstall\": \"nuxt prepare\"\n  },\n  \"dependencies\": {\n    \"@tanstack/vue-query\": \"catalog:\",\n    \"@wagmi/vue\": \"workspace:*\",\n    \"nuxt\": \"catalog:\",\n    \"viem\": \"2.*\",\n    \"vue\": \"catalog:\",\n    \"vue-router\": \"^4.3.2\"\n  }\n}\n"
  },
  {
    "path": "playgrounds/nuxt/plugins/wagmi.ts",
    "content": "import { VueQueryPlugin } from '@tanstack/vue-query'\nimport { WagmiPlugin } from '@wagmi/vue'\nimport { defineNuxtPlugin } from 'nuxt/app'\n\nimport { config } from '../wagmi'\n\n// TODO: Move to @wagmi/vue/nuxt nitro plugin\nexport default defineNuxtPlugin((nuxtApp) => {\n  nuxtApp.vueApp.use(WagmiPlugin, { config }).use(VueQueryPlugin, {})\n})\n"
  },
  {
    "path": "playgrounds/nuxt/server/tsconfig.json",
    "content": "{\n  \"extends\": \"../.nuxt/tsconfig.server.json\"\n}\n"
  },
  {
    "path": "playgrounds/nuxt/tsconfig.json",
    "content": "{\n  \"extends\": \"./.nuxt/tsconfig.json\"\n}\n"
  },
  {
    "path": "playgrounds/nuxt/wagmi.ts",
    "content": "import { cookieStorage, createConfig, createStorage, http } from '@wagmi/vue'\nimport { mainnet, optimism, sepolia } from '@wagmi/vue/chains'\nimport { injected, metaMask, walletConnect } from '@wagmi/vue/connectors'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia, optimism],\n  connectors: [\n    injected(),\n    walletConnect({\n      projectId: process.env.NUXT_PUBLIC_WC_PROJECT_ID!,\n    }),\n    metaMask(),\n  ],\n  storage: createStorage({\n    storage: cookieStorage,\n  }),\n  ssr: true,\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n    [optimism.id]: http(),\n  },\n})\n\ndeclare module '@wagmi/vue' {\n  interface Register {\n    config: typeof config\n  }\n}\n"
  },
  {
    "path": "playgrounds/solid-start/.gitignore",
    "content": "dist\n.wrangler\n.output\n.vercel\n.netlify\n.vinxi\napp.config.timestamp_*.js\n\n# Environment\n.env\n.env*.local\n\n# dependencies\n/node_modules\n\n# IDEs and editors\n/.idea\n.project\n.classpath\n*.launch\n.settings/\n\n# Temp\ngitignore\n\n# System Files\n.DS_Store\nThumbs.db\n"
  },
  {
    "path": "playgrounds/solid-start/app.config.ts",
    "content": "import { defineConfig } from '@solidjs/start/config'\n\nexport default defineConfig({})\n"
  },
  {
    "path": "playgrounds/solid-start/package.json",
    "content": "{\n  \"name\": \"solid-start-app\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"dev\": \"vinxi dev\",\n    \"build\": \"vinxi build\",\n    \"start\": \"vinxi start\"\n  },\n  \"dependencies\": {\n    \"@solidjs/start\": \"^1.1.0\",\n    \"@tanstack/solid-query\": \"catalog:\",\n    \"@wagmi/solid\": \"workspace:*\",\n    \"solid-js\": \"catalog:\",\n    \"viem\": \"2.*\",\n    \"vinxi\": \"^0.5.7\"\n  }\n}\n"
  },
  {
    "path": "playgrounds/solid-start/src/app.css",
    "content": ":root {\n  background-color: #181818;\n  color: rgba(255, 255, 255, 0.87);\n  color-scheme: light dark;\n  font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;\n  font-synthesis: none;\n  font-weight: 400;\n  line-height: 1.5;\n  text-rendering: optimizeLegibility;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-text-size-adjust: 100%;\n}\n\n@media (prefers-color-scheme: light) {\n  :root {\n    background-color: #f8f8f8;\n    color: #181818;\n  }\n}\n"
  },
  {
    "path": "playgrounds/solid-start/src/app.tsx",
    "content": "import { QueryClient, QueryClientProvider } from '@tanstack/solid-query'\nimport {\n  cookieToInitialState,\n  useBalance,\n  useBlockNumber,\n  useChainId,\n  useChains,\n  useConnect,\n  useConnection,\n  useConnections,\n  useConnectorClient,\n  useConnectors,\n  useDisconnect,\n  useSwitchChain,\n  useSwitchConnection,\n  WagmiProvider,\n} from '@wagmi/solid'\nimport { optimism } from '@wagmi/solid/chains'\nimport { For, Show } from 'solid-js'\nimport { getRequestEvent, isServer } from 'solid-js/web'\nimport { formatEther, stringify } from 'viem'\n\nimport { config } from './wagmi'\n\nfunction getInitialState() {\n  if (!isServer) return undefined\n  const event = getRequestEvent()\n  const cookie = event?.request.headers.get('cookie')\n  return cookieToInitialState(config, cookie)\n}\n\nexport default function App() {\n  const initialState = getInitialState()\n  const queryClient = new QueryClient()\n\n  return (\n    <WagmiProvider config={config} initialState={initialState}>\n      <QueryClientProvider client={queryClient}>\n        <Connection />\n        <Connect />\n        <SwitchConnection />\n        <SwitchChain />\n        {/* <SignMessage /> */}\n        <Connections />\n        <BlockNumber />\n        <Balance />\n        <ConnectorClient />\n        {/* <SendTransaction /> */}\n        {/* <ReadContract /> */}\n        {/* <ReadContracts /> */}\n        {/* <WriteContract /> */}\n      </QueryClientProvider>\n    </WagmiProvider>\n  )\n}\n\nfunction Connection() {\n  const connection = useConnection()\n  const disconnect = useDisconnect()\n\n  return (\n    <div>\n      <h2>Connection</h2>\n\n      <div>\n        account: {connection().address}\n        <br />\n        chainId: {connection().chainId}\n        <br />\n        status: {connection().status}\n      </div>\n\n      <Show when={connection().status !== 'disconnected'}>\n        <button\n          type=\"button\"\n          onClick={() => {\n            console.log('disconnect clicked')\n            disconnect.mutate()\n          }}\n        >\n          Disconnect\n        </button>\n      </Show>\n    </div>\n  )\n}\n\nfunction Connect() {\n  const chainId = useChainId()\n  const connect = useConnect()\n  const connectors = useConnectors()\n\n  return (\n    <div>\n      <h2>Connect</h2>\n      <For each={connectors()}>\n        {(connector) => (\n          <button\n            onClick={async () => {\n              connect\n                .mutateAsync({\n                  connector,\n                  chainId: chainId(),\n                })\n                .then(console.log)\n                // biome-ignore lint/suspicious/noConsole: allow\n                .catch(console.error)\n            }}\n            type=\"button\"\n          >\n            {connector.name}\n          </button>\n        )}\n      </For>\n      <div>{connect.status}</div>\n      <div>{connect.error?.message}</div>\n    </div>\n  )\n}\n\nfunction SwitchConnection() {\n  const connection = useConnection()\n  const { mutate: switchConnection } = useSwitchConnection()\n  const connections = useConnections()\n\n  return (\n    <div>\n      <h2>Switch Connection</h2>\n\n      <For each={connections()}>\n        {(conn) => (\n          <button\n            disabled={connection().connector?.uid === conn.connector.uid}\n            onClick={() => switchConnection({ connector: conn.connector })}\n            type=\"button\"\n          >\n            {conn.connector.name}\n          </button>\n        )}\n      </For>\n    </div>\n  )\n}\n\nfunction SwitchChain() {\n  const chainId = useChainId()\n  const switchChain = useSwitchChain()\n  const chains = useChains()\n\n  return (\n    <div>\n      <h2>Switch Chain</h2>\n\n      <For each={chains()}>\n        {(chain) => (\n          <button\n            disabled={chainId() === chain.id}\n            onClick={() => switchChain.mutate({ chainId: chain.id })}\n            type=\"button\"\n          >\n            {chain.name}\n          </button>\n        )}\n      </For>\n\n      {switchChain.error?.message}\n    </div>\n  )\n}\n\nfunction Connections() {\n  const connections = useConnections()\n\n  return (\n    <div>\n      <h2>Connections</h2>\n\n      <For each={connections()}>\n        {(connection) => (\n          <div>\n            <div>connector {connection.connector.name}</div>\n            <div>accounts: {stringify(connection.accounts)}</div>\n            <div>chainId: {connection.chainId}</div>\n          </div>\n        )}\n      </For>\n    </div>\n  )\n}\n\nfunction BlockNumber() {\n  const default_ = useBlockNumber(() => ({ watch: true }))\n  const account_ = useBlockNumber(() => ({ watch: true }))\n  const optimism_ = useBlockNumber(() => ({\n    chainId: optimism.id,\n    watch: true,\n  }))\n\n  return (\n    <div>\n      <h2>Block Number</h2>\n\n      <div>Block Number (Default Chain): {default_.data?.toString()}</div>\n      <div>Block Number (Connection Chain): {account_.data?.toString()}</div>\n      <div>Block Number (Optimism): {optimism_.data?.toString()}</div>\n    </div>\n  )\n}\n\nfunction Balance() {\n  const connection = useConnection()\n\n  const default_ = useBalance(() => ({\n    address: connection().address,\n  }))\n  const account_ = useBalance(() => ({\n    address: connection().address,\n  }))\n  const optimism_ = useBalance(() => ({\n    address: connection().address,\n    chainId: optimism.id,\n  }))\n\n  return (\n    <div>\n      <h2>Balance</h2>\n\n      <div>\n        Balance (Default Chain):{' '}\n        {!!default_?.data?.value && formatEther(default_.data.value)}\n      </div>\n      <div>\n        Balance (Connection Chain):{' '}\n        {!!account_?.data?.value && formatEther(account_.data.value)}\n      </div>\n      <div>\n        Balance (Optimism Chain):{' '}\n        {!!optimism_?.data?.value && formatEther(optimism_.data.value)}\n      </div>\n    </div>\n  )\n}\n\nfunction ConnectorClient() {\n  const connectorClient = useConnectorClient()\n  return (\n    <div>\n      <h2>Connector Client</h2>\n      client {connectorClient.data?.account?.address}{' '}\n      {connectorClient.data?.chain?.id}\n      {connectorClient.error?.message}\n    </div>\n  )\n}\n"
  },
  {
    "path": "playgrounds/solid-start/src/contracts.ts",
    "content": "export const wagmiContractConfig = {\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  abi: [\n    { inputs: [], stateMutability: 'nonpayable', type: 'constructor' },\n    {\n      anonymous: false,\n      inputs: [\n        {\n          indexed: true,\n          name: 'owner',\n          type: 'address',\n        },\n        {\n          indexed: true,\n          name: 'approved',\n          type: 'address',\n        },\n        {\n          indexed: true,\n          name: 'tokenId',\n          type: 'uint256',\n        },\n      ],\n      name: 'Approval',\n      type: 'event',\n    },\n    {\n      anonymous: false,\n      inputs: [\n        {\n          indexed: true,\n          name: 'owner',\n          type: 'address',\n        },\n        {\n          indexed: true,\n          name: 'operator',\n          type: 'address',\n        },\n        {\n          indexed: false,\n          name: 'approved',\n          type: 'bool',\n        },\n      ],\n      name: 'ApprovalForAll',\n      type: 'event',\n    },\n    {\n      anonymous: false,\n      inputs: [\n        {\n          indexed: true,\n          name: 'from',\n          type: 'address',\n        },\n        { indexed: true, name: 'to', type: 'address' },\n        {\n          indexed: true,\n          name: 'tokenId',\n          type: 'uint256',\n        },\n      ],\n      name: 'Transfer',\n      type: 'event',\n    },\n    {\n      inputs: [\n        { name: 'to', type: 'address' },\n        { name: 'tokenId', type: 'uint256' },\n      ],\n      name: 'approve',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'owner', type: 'address' }],\n      name: 'balanceOf',\n      outputs: [{ name: '', type: 'uint256' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'tokenId', type: 'uint256' }],\n      name: 'getApproved',\n      outputs: [{ name: '', type: 'address' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'owner', type: 'address' },\n        { name: 'operator', type: 'address' },\n      ],\n      name: 'isApprovedForAll',\n      outputs: [{ name: '', type: 'bool' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [],\n      name: 'mint',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [{ internalType: 'uint256', name: 'tokenId', type: 'uint256' }],\n      name: 'mint',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [],\n      name: 'name',\n      outputs: [{ name: '', type: 'string' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'tokenId', type: 'uint256' }],\n      name: 'ownerOf',\n      outputs: [{ name: '', type: 'address' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'from', type: 'address' },\n        { name: 'to', type: 'address' },\n        { name: 'tokenId', type: 'uint256' },\n      ],\n      name: 'safeTransferFrom',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'from', type: 'address' },\n        { name: 'to', type: 'address' },\n        { name: 'tokenId', type: 'uint256' },\n        { name: '_data', type: 'bytes' },\n      ],\n      name: 'safeTransferFrom',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'operator', type: 'address' },\n        { name: 'approved', type: 'bool' },\n      ],\n      name: 'setApprovalForAll',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'interfaceId', type: 'bytes4' }],\n      name: 'supportsInterface',\n      outputs: [{ name: '', type: 'bool' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [],\n      name: 'symbol',\n      outputs: [{ name: '', type: 'string' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'tokenId', type: 'uint256' }],\n      name: 'tokenURI',\n      outputs: [{ name: '', type: 'string' }],\n      stateMutability: 'pure',\n      type: 'function',\n    },\n    {\n      inputs: [],\n      name: 'totalSupply',\n      outputs: [{ name: '', type: 'uint256' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'from', type: 'address' },\n        { name: 'to', type: 'address' },\n        { name: 'tokenId', type: 'uint256' },\n      ],\n      name: 'transferFrom',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n  ],\n} as const\n"
  },
  {
    "path": "playgrounds/solid-start/src/entry-client.tsx",
    "content": "// @refresh reload\nimport { mount, StartClient } from '@solidjs/start/client'\n\nmount(() => <StartClient />, document.getElementById('app')!)\n"
  },
  {
    "path": "playgrounds/solid-start/src/entry-server.tsx",
    "content": "// @refresh reload\nimport { createHandler, StartServer } from '@solidjs/start/server'\n\nexport default createHandler(() => (\n  <StartServer\n    document={({ assets, children, scripts }) => (\n      <html lang=\"en\">\n        <head>\n          <meta charset=\"utf-8\" />\n          <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n          <link rel=\"icon\" href=\"/favicon.ico\" />\n          {assets}\n        </head>\n        <body>\n          <div id=\"app\">{children}</div>\n          {scripts}\n        </body>\n      </html>\n    )}\n  />\n))\n"
  },
  {
    "path": "playgrounds/solid-start/src/global.d.ts",
    "content": "/// <reference types=\"@solidjs/start/env\" />\n"
  },
  {
    "path": "playgrounds/solid-start/src/wagmi.ts",
    "content": "import { createConfig, http } from '@wagmi/solid'\nimport { celo, mainnet, optimism, sepolia } from '@wagmi/solid/chains'\nimport {\n  baseAccount,\n  metaMask,\n  porto,\n  walletConnect,\n} from '@wagmi/solid/connectors'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia, optimism, celo],\n  connectors: [\n    walletConnect({\n      projectId: import.meta.env.VITE_WC_PROJECT_ID,\n    }),\n    porto(),\n    baseAccount(),\n    metaMask(),\n  ],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n    [optimism.id]: http(),\n    [celo.id]: http(),\n  },\n  ssr: true,\n})\n\ndeclare module '@wagmi/solid' {\n  interface Register {\n    config: typeof config\n  }\n}\n"
  },
  {
    "path": "playgrounds/solid-start/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"bundler\",\n    \"allowSyntheticDefaultImports\": true,\n    \"esModuleInterop\": true,\n    \"jsx\": \"preserve\",\n    \"jsxImportSource\": \"solid-js\",\n    \"allowJs\": true,\n    \"strict\": true,\n    \"noEmit\": true,\n    \"types\": [\"vinxi/types/client\"],\n    \"isolatedModules\": true,\n    \"paths\": {\n      \"~/*\": [\"./src/*\"],\n      \"@wagmi/connectors\": [\"../../packages/connectors/src/exports\"],\n      \"@wagmi/core\": [\"../../packages/core/src/exports\"],\n      \"@wagmi/core/*\": [\"../../packages/core/src/exports/*\"],\n      \"@wagmi/solid\": [\"../../packages/solid/src/exports\"],\n      \"@wagmi/solid/*\": [\"../../packages/solid/src/exports/*\"]\n    }\n  }\n}\n"
  },
  {
    "path": "playgrounds/tanstack-start/package.json",
    "content": "{\n  \"name\": \"tanstack-start\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"vite build\",\n    \"preview\": \"vite preview\",\n    \"deploy\": \"pnpm build && wrangler deploy\"\n  },\n  \"dependencies\": {\n    \"@cloudflare/vite-plugin\": \"^1.20.0\",\n    \"@tanstack/react-query\": \"catalog:\",\n    \"@tanstack/react-query-devtools\": \"^5.91.2\",\n    \"@tanstack/react-router\": \"^1.145.7\",\n    \"@tanstack/react-router-ssr-query\": \"^1.145.7\",\n    \"@tanstack/react-start\": \"^1.166.16\",\n    \"@tanstack/router-plugin\": \"^1.145.7\",\n    \"react\": \"catalog:\",\n    \"react-dom\": \"catalog:\",\n    \"viem\": \"2.*\",\n    \"wagmi\": \"workspace:*\"\n  },\n  \"devDependencies\": {\n    \"@tanstack/devtools-vite\": \"^0.4.1\",\n    \"@tanstack/react-devtools\": \"^0.9.1\",\n    \"@tanstack/react-router-devtools\": \"^1.145.7\",\n    \"@types/node\": \"^24.5.1\",\n    \"@types/react\": \"catalog:\",\n    \"@types/react-dom\": \"catalog:\",\n    \"@vitejs/plugin-react\": \"catalog:\",\n    \"typescript\": \"^5.9.3\",\n    \"vite\": \"catalog:\",\n    \"wrangler\": \"^4.59.1\"\n  }\n}\n"
  },
  {
    "path": "playgrounds/tanstack-start/src/contracts.ts",
    "content": "export const wagmiContractConfig = {\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  abi: [\n    { inputs: [], stateMutability: 'nonpayable', type: 'constructor' },\n    {\n      anonymous: false,\n      inputs: [\n        {\n          indexed: true,\n          name: 'owner',\n          type: 'address',\n        },\n        {\n          indexed: true,\n          name: 'approved',\n          type: 'address',\n        },\n        {\n          indexed: true,\n          name: 'tokenId',\n          type: 'uint256',\n        },\n      ],\n      name: 'Approval',\n      type: 'event',\n    },\n    {\n      anonymous: false,\n      inputs: [\n        {\n          indexed: true,\n          name: 'owner',\n          type: 'address',\n        },\n        {\n          indexed: true,\n          name: 'operator',\n          type: 'address',\n        },\n        {\n          indexed: false,\n          name: 'approved',\n          type: 'bool',\n        },\n      ],\n      name: 'ApprovalForAll',\n      type: 'event',\n    },\n    {\n      anonymous: false,\n      inputs: [\n        {\n          indexed: true,\n          name: 'from',\n          type: 'address',\n        },\n        { indexed: true, name: 'to', type: 'address' },\n        {\n          indexed: true,\n          name: 'tokenId',\n          type: 'uint256',\n        },\n      ],\n      name: 'Transfer',\n      type: 'event',\n    },\n    {\n      inputs: [\n        { name: 'to', type: 'address' },\n        { name: 'tokenId', type: 'uint256' },\n      ],\n      name: 'approve',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'owner', type: 'address' }],\n      name: 'balanceOf',\n      outputs: [{ name: '', type: 'uint256' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'tokenId', type: 'uint256' }],\n      name: 'getApproved',\n      outputs: [{ name: '', type: 'address' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'owner', type: 'address' },\n        { name: 'operator', type: 'address' },\n      ],\n      name: 'isApprovedForAll',\n      outputs: [{ name: '', type: 'bool' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [],\n      name: 'mint',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [{ internalType: 'uint256', name: 'tokenId', type: 'uint256' }],\n      name: 'mint',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [],\n      name: 'name',\n      outputs: [{ name: '', type: 'string' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'tokenId', type: 'uint256' }],\n      name: 'ownerOf',\n      outputs: [{ name: '', type: 'address' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'from', type: 'address' },\n        { name: 'to', type: 'address' },\n        { name: 'tokenId', type: 'uint256' },\n      ],\n      name: 'safeTransferFrom',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'from', type: 'address' },\n        { name: 'to', type: 'address' },\n        { name: 'tokenId', type: 'uint256' },\n        { name: '_data', type: 'bytes' },\n      ],\n      name: 'safeTransferFrom',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'operator', type: 'address' },\n        { name: 'approved', type: 'bool' },\n      ],\n      name: 'setApprovalForAll',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'interfaceId', type: 'bytes4' }],\n      name: 'supportsInterface',\n      outputs: [{ name: '', type: 'bool' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [],\n      name: 'symbol',\n      outputs: [{ name: '', type: 'string' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'tokenId', type: 'uint256' }],\n      name: 'tokenURI',\n      outputs: [{ name: '', type: 'string' }],\n      stateMutability: 'pure',\n      type: 'function',\n    },\n    {\n      inputs: [],\n      name: 'totalSupply',\n      outputs: [{ name: '', type: 'uint256' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'from', type: 'address' },\n        { name: 'to', type: 'address' },\n        { name: 'tokenId', type: 'uint256' },\n      ],\n      name: 'transferFrom',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n  ],\n} as const\n"
  },
  {
    "path": "playgrounds/tanstack-start/src/index.css",
    "content": ":root {\n  background-color: #181818;\n  color: rgba(255, 255, 255, 0.87);\n  color-scheme: light dark;\n  font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;\n  font-synthesis: none;\n  font-weight: 400;\n  line-height: 1.5;\n  text-rendering: optimizeLegibility;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-text-size-adjust: 100%;\n}\n\n@media (prefers-color-scheme: light) {\n  :root {\n    background-color: #f8f8f8;\n    color: #181818;\n  }\n}\n"
  },
  {
    "path": "playgrounds/tanstack-start/src/routeTree.gen.ts",
    "content": "/* eslint-disable */\n\n// @ts-nocheck\n\n// noinspection JSUnusedGlobalSymbols\n\n// This file was automatically generated by TanStack Router.\n// You should NOT make any changes in this file as it will be overwritten.\n// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.\n\nimport { Route as rootRouteImport } from './routes/__root'\nimport { Route as IndexRouteImport } from './routes/index'\n\nconst IndexRoute = IndexRouteImport.update({\n  id: '/',\n  path: '/',\n  getParentRoute: () => rootRouteImport,\n} as any)\n\nexport interface FileRoutesByFullPath {\n  '/': typeof IndexRoute\n}\nexport interface FileRoutesByTo {\n  '/': typeof IndexRoute\n}\nexport interface FileRoutesById {\n  __root__: typeof rootRouteImport\n  '/': typeof IndexRoute\n}\nexport interface FileRouteTypes {\n  fileRoutesByFullPath: FileRoutesByFullPath\n  fullPaths: '/'\n  fileRoutesByTo: FileRoutesByTo\n  to: '/'\n  id: '__root__' | '/'\n  fileRoutesById: FileRoutesById\n}\nexport interface RootRouteChildren {\n  IndexRoute: typeof IndexRoute\n}\n\ndeclare module '@tanstack/react-router' {\n  interface FileRoutesByPath {\n    '/': {\n      id: '/'\n      path: '/'\n      fullPath: '/'\n      preLoaderRoute: typeof IndexRouteImport\n      parentRoute: typeof rootRouteImport\n    }\n  }\n}\n\nconst rootRouteChildren: RootRouteChildren = {\n  IndexRoute: IndexRoute,\n}\nexport const routeTree = rootRouteImport\n  ._addFileChildren(rootRouteChildren)\n  ._addFileTypes<FileRouteTypes>()\n\nimport type { getRouter } from './router.tsx'\nimport type { createStart } from '@tanstack/react-start'\ndeclare module '@tanstack/react-start' {\n  interface Register {\n    ssr: true\n    router: Awaited<ReturnType<typeof getRouter>>\n  }\n}\n"
  },
  {
    "path": "playgrounds/tanstack-start/src/router.tsx",
    "content": "import { QueryClient } from '@tanstack/react-query'\nimport { createRouter } from '@tanstack/react-router'\nimport { setupRouterSsrQueryIntegration } from '@tanstack/react-router-ssr-query'\nimport { hashFn } from 'wagmi/query'\nimport { routeTree } from './routeTree.gen'\n\nexport const getRouter = () => {\n  const queryClient: QueryClient = new QueryClient({\n    defaultOptions: {\n      queries: {\n        staleTime: 60 * 1_000,\n        gcTime: 1_000 * 60 * 60 * 24,\n        queryKeyHashFn: hashFn,\n        refetchOnWindowFocus: false,\n        refetchOnReconnect: () => !queryClient.isMutating(),\n      },\n    },\n  })\n\n  const router = createRouter({\n    routeTree,\n    context: {\n      queryClient,\n    },\n    defaultPreload: 'intent',\n  })\n\n  setupRouterSsrQueryIntegration({\n    router,\n    queryClient,\n    wrapQueryClient: false,\n  })\n\n  return router\n}\n"
  },
  {
    "path": "playgrounds/tanstack-start/src/routes/__root.tsx",
    "content": "import { TanStackDevtools } from '@tanstack/react-devtools'\nimport { type QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { ReactQueryDevtools as TanStackQueryDevtoolsPanel } from '@tanstack/react-query-devtools'\nimport {\n  createRootRouteWithContext,\n  HeadContent,\n  Scripts,\n} from '@tanstack/react-router'\nimport { TanStackRouterDevtoolsPanel } from '@tanstack/react-router-devtools'\nimport * as React from 'react'\nimport { deserialize, type State, WagmiProvider } from 'wagmi'\nimport appCss from '../index.css?url'\nimport { getConfig, getWagmiStateSSR } from '../wagmi'\n\nexport const Route = createRootRouteWithContext<{ queryClient: QueryClient }>()(\n  {\n    head: () => ({\n      meta: [\n        { charSet: 'utf-8' },\n        { title: 'TanStack Start Example' },\n        { name: 'viewport', content: 'width=device-width, initial-scale=1' },\n      ],\n      links: [\n        {\n          rel: 'stylesheet',\n          href: appCss,\n        },\n      ],\n    }),\n    notFoundComponent: () => <div>Not Found</div>,\n    loader: () => getWagmiStateSSR(),\n    shellComponent: RootDocument,\n  },\n)\n\nfunction RootDocument({ children }: { children: React.ReactNode }) {\n  const { queryClient } = Route.useRouteContext()\n  const [config] = React.useState(() => getConfig())\n  const wagmiState = Route.useLoaderData({ select: deserialize<State> })\n\n  return (\n    <html lang=\"en\">\n      <head>\n        <HeadContent />\n      </head>\n      <body>\n        <WagmiProvider config={config} initialState={wagmiState}>\n          <QueryClientProvider client={queryClient}>\n            {children}\n            <TanStackDevtools\n              config={{\n                position: 'bottom-right',\n              }}\n              plugins={[\n                {\n                  name: 'Tanstack Router',\n                  render: <TanStackRouterDevtoolsPanel />,\n                },\n                {\n                  name: 'Tanstack Query',\n                  render: <TanStackQueryDevtoolsPanel />,\n                },\n              ]}\n            />\n          </QueryClientProvider>\n        </WagmiProvider>\n        <Scripts />\n      </body>\n    </html>\n  )\n}\n"
  },
  {
    "path": "playgrounds/tanstack-start/src/routes/index.tsx",
    "content": "import { ClientOnly, createFileRoute } from '@tanstack/react-router'\nimport { getRequestHeader } from '@tanstack/react-start/server'\nimport type { FormEvent } from 'react'\nimport * as React from 'react'\nimport { formatEther, type Hex, parseAbi, parseEther } from 'viem'\nimport {\n  type BaseError,\n  useBalance,\n  useBlockNumber,\n  useChainId,\n  useChains,\n  useConfig,\n  useConnect,\n  useConnection,\n  useConnectionEffect,\n  useConnections,\n  useConnectorClient,\n  useConnectors,\n  useDisconnect,\n  useEnsName,\n  useReadContract,\n  useReadContracts,\n  useSendTransaction,\n  useSignMessage,\n  useSwitchChain,\n  useSwitchConnection,\n  useWaitForTransactionReceipt,\n  useWriteContract,\n} from 'wagmi'\nimport { switchChain } from 'wagmi/actions'\nimport { optimism, sepolia } from 'wagmi/chains'\nimport { wagmiContractConfig } from '../contracts'\n\nexport const Route = createFileRoute('/')({\n  server: {\n    handlers: {\n      GET: async ({ next }) => {\n        const headers = getRequestHeader('cookie')\n        // biome-ignore lint/suspicious/noConsole: _\n        console.info(headers)\n        return next()\n      },\n    },\n  },\n  component: RouteComponent,\n})\n\nfunction RouteComponent() {\n  useConnectionEffect({\n    onConnect(data) {\n      console.log('onConnect', data)\n    },\n    onDisconnect() {\n      console.log('onDisconnect')\n    },\n  })\n\n  return (\n    <>\n      <ClientOnly fallback={<React.Fragment />}>\n        <Connect />\n      </ClientOnly>\n      <Connection />\n      <SwitchChain />\n      <Repro />\n      <SwitchConnection />\n      <SignMessage />\n      <Connections />\n      <BlockNumber />\n      <Balance />\n      <ConnectorClient />\n      <SendTransaction />\n      <ReadContract />\n      <ReadContracts />\n      <WriteContract />\n    </>\n  )\n}\n\nfunction Connection() {\n  const { address, chainId } = useConnection()\n  const disconnect = useDisconnect()\n  const { data: ensName } = useEnsName({ address })\n\n  return (\n    <div>\n      <h2>Connection</h2>\n\n      <div>\n        account: {address} {ensName}\n        <br />\n        chainId: {chainId}\n        <br />\n        {/* status: {isMounted ? connection.status : 'disconnected'} */}\n      </div>\n\n      <button type=\"button\" onClick={() => disconnect.mutate()}>\n        Disconnect\n      </button>\n    </div>\n  )\n}\n\nfunction Connect() {\n  const chainId = useChainId()\n  const connect = useConnect()\n  const connectors = useConnectors()\n\n  return (\n    <div>\n      <h2>Connect</h2>\n      {connectors.map((connector) => (\n        <button\n          type=\"button\"\n          key={connector.uid}\n          onClick={() => connect.mutate({ connector, chainId })}\n        >\n          {connector.name}\n        </button>\n      ))}\n      <div>{connect.status}</div>\n      <div>{connect.error?.message}</div>\n    </div>\n  )\n}\n\nfunction SwitchConnection() {\n  const connection = useConnection()\n  const { mutate: switchConnection } = useSwitchConnection()\n  const connections = useConnections()\n\n  return (\n    <div>\n      <h2>Switch Connection</h2>\n\n      {connections.map(({ connector }) => (\n        <button\n          disabled={connection.connector?.uid === connector.uid}\n          key={connector.uid}\n          onClick={() => switchConnection({ connector })}\n          type=\"button\"\n        >\n          {connector.name}\n        </button>\n      ))}\n    </div>\n  )\n}\n\nfunction SwitchChain() {\n  const chainId = useChainId()\n  const { mutate: switchChain, error } = useSwitchChain()\n  const chains = useChains()\n\n  return (\n    <div>\n      <h2>Switch Chain</h2>\n\n      {chains.map((chain) => (\n        <button\n          disabled={chainId === chain.id}\n          key={chain.id}\n          onClick={() => switchChain({ chainId: chain.id })}\n          type=\"button\"\n        >\n          {chain.name}\n        </button>\n      ))}\n\n      {error?.message}\n    </div>\n  )\n}\n\nfunction SignMessage() {\n  const { data, mutate: signMessage } = useSignMessage()\n\n  return (\n    <div>\n      <h2>Sign Message</h2>\n\n      <form\n        onSubmit={(event) => {\n          event.preventDefault()\n          const formData = new FormData(event.target as HTMLFormElement)\n          signMessage({ message: formData.get('message') as string })\n        }}\n      >\n        <input name=\"message\" />\n        <button type=\"submit\">Sign Message</button>\n      </form>\n\n      {data}\n    </div>\n  )\n}\n\nfunction Connections() {\n  const connections = useConnections()\n\n  return (\n    <div>\n      <h2>Connections</h2>\n\n      {connections.map((connection) => (\n        <div key={connection.connector.uid}>\n          <div>connector {connection.connector.name}</div>\n          <div>accounts: {JSON.stringify(connection.accounts)}</div>\n          <div>chainId: {connection.chainId}</div>\n        </div>\n      ))}\n    </div>\n  )\n}\n\nfunction Balance() {\n  const { address } = useConnection()\n\n  const { data: default_ } = useBalance({ address })\n  const { data: account_ } = useBalance({ address })\n  const { data: optimism_ } = useBalance({\n    address,\n    chainId: optimism.id,\n  })\n\n  return (\n    <div>\n      <h2>Balance</h2>\n\n      <div>\n        Balance (Default Chain):{' '}\n        {!!default_?.value && formatEther(default_.value)}\n      </div>\n      <div>\n        Balance (Connection Chain):{' '}\n        {!!account_?.value && formatEther(account_.value)}\n      </div>\n      <div>\n        Balance (Optimism Chain):{' '}\n        {!!optimism_?.value && formatEther(optimism_.value)}\n      </div>\n    </div>\n  )\n}\n\nfunction BlockNumber() {\n  const { data: default_ } = useBlockNumber({ watch: true })\n  const { data: account_ } = useBlockNumber({\n    watch: true,\n  })\n  const { data: optimism_ } = useBlockNumber({\n    chainId: optimism.id,\n    watch: true,\n  })\n\n  return (\n    <div>\n      <h2>Block Number</h2>\n\n      <div>Block Number (Default Chain): {default_?.toString()}</div>\n      <div>Block Number (Connection Chain): {account_?.toString()}</div>\n      <div>Block Number (Optimism): {optimism_?.toString()}</div>\n    </div>\n  )\n}\n\nfunction ConnectorClient() {\n  const { data, error } = useConnectorClient()\n  return (\n    <div>\n      <h2>Connector Client</h2>\n      client {data?.account?.address} {data?.chain?.id}\n      {error?.message}\n    </div>\n  )\n}\n\nfunction SendTransaction() {\n  const { data: hash, error, isPending, mutate } = useSendTransaction()\n\n  async function submit(e: FormEvent<HTMLFormElement>) {\n    e.preventDefault()\n    const formData = new FormData(e.target as HTMLFormElement)\n    const to = formData.get('address') as Hex\n    const value = formData.get('value') as string\n    mutate({ to, value: parseEther(value) })\n  }\n\n  const { isLoading: isConfirming, isSuccess: isConfirmed } =\n    useWaitForTransactionReceipt({\n      hash,\n    })\n\n  return (\n    <div>\n      <h2>Send Transaction</h2>\n      <form onSubmit={submit}>\n        <input name=\"address\" placeholder=\"Address\" required />\n        <input\n          name=\"value\"\n          placeholder=\"Amount (ETH)\"\n          type=\"number\"\n          step=\"0.000000001\"\n          required\n        />\n        <button disabled={isPending} type=\"submit\">\n          {isPending ? 'Confirming...' : 'Send'}\n        </button>\n      </form>\n      {hash && <div>Transaction Hash: {hash}</div>}\n      {isConfirming && 'Waiting for confirmation...'}\n      {isConfirmed && 'Transaction confirmed.'}\n      {error && (\n        <div>Error: {(error as BaseError).shortMessage || error.message}</div>\n      )}\n    </div>\n  )\n}\n\nfunction ReadContract() {\n  const { data: balance } = useReadContract({\n    ...wagmiContractConfig,\n    functionName: 'balanceOf',\n    args: ['0x03A71968491d55603FFe1b11A9e23eF013f75bCF'],\n  })\n\n  return (\n    <div>\n      <h2>Read Contract</h2>\n      <div>Balance: {balance?.toString()}</div>\n    </div>\n  )\n}\n\nfunction ReadContracts() {\n  const { data } = useReadContracts({\n    allowFailure: false,\n    contracts: [\n      {\n        ...wagmiContractConfig,\n        functionName: 'balanceOf',\n        args: ['0x03A71968491d55603FFe1b11A9e23eF013f75bCF'],\n      },\n      {\n        ...wagmiContractConfig,\n        functionName: 'ownerOf',\n        args: [69n],\n      },\n      {\n        ...wagmiContractConfig,\n        functionName: 'totalSupply',\n      },\n    ],\n  })\n  const [balance, ownerOf, totalSupply] = data || []\n\n  return (\n    <div>\n      <h2>Read Contract</h2>\n      <div>Balance: {balance?.toString()}</div>\n      <div>Owner of Token 69: {ownerOf?.toString()}</div>\n      <div>Total Supply: {totalSupply?.toString()}</div>\n    </div>\n  )\n}\n\nfunction WriteContract() {\n  const {\n    data: hash,\n    error,\n    isPending,\n    mutate: writeContract,\n  } = useWriteContract()\n\n  async function submit(e: FormEvent<HTMLFormElement>) {\n    e.preventDefault()\n    const formData = new FormData(e.target as HTMLFormElement)\n    const tokenId = formData.get('tokenId') as string\n    writeContract({\n      address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n      abi: parseAbi(['function mint(uint256 tokenId)']),\n      functionName: 'mint',\n      args: [BigInt(tokenId)],\n    })\n  }\n\n  const { isLoading: isConfirming, isSuccess: isConfirmed } =\n    useWaitForTransactionReceipt({\n      hash,\n    })\n\n  return (\n    <div>\n      <h2>Write Contract</h2>\n      <form onSubmit={submit}>\n        <input name=\"tokenId\" placeholder=\"Token ID\" required />\n        <button disabled={isPending} type=\"submit\">\n          {isPending ? 'Confirming...' : 'Mint'}\n        </button>\n      </form>\n      {hash && <div>Transaction Hash: {hash}</div>}\n      {isConfirming && 'Waiting for confirmation...'}\n      {isConfirmed && 'Transaction confirmed.'}\n      {error && (\n        <div>Error: {(error as BaseError).shortMessage || error.message}</div>\n      )}\n    </div>\n  )\n}\n\nfunction Repro() {\n  const config = useConfig()\n  const chainId = useChainId()\n\n  console.log('chainId from useChainId is', chainId)\n  return (\n    <main className=\"flex min-h-screen flex-col items-center p-24\">\n      Current Chain Id: {chainId}\n      <button\n        type=\"button\"\n        onClick={() => switchChain(config, { chainId: sepolia.id })}\n      >\n        Switch to Polygon\n      </button>\n      <button\n        type=\"button\"\n        onClick={() => switchChain(config, { chainId: optimism.id })}\n      >\n        Switch to Arbitrum\n      </button>\n    </main>\n  )\n}\n"
  },
  {
    "path": "playgrounds/tanstack-start/src/wagmi.ts",
    "content": "import { createServerFn } from '@tanstack/react-start'\nimport { getRequestHeader } from '@tanstack/react-start/server'\nimport {\n  cookieStorage,\n  cookieToInitialState,\n  createConfig,\n  createStorage,\n  http,\n  serialize,\n} from 'wagmi'\nimport { mainnet, optimism, sepolia } from 'wagmi/chains'\nimport { injected, metaMask } from 'wagmi/connectors'\n\nexport function getConfig() {\n  return createConfig({\n    chains: [mainnet, sepolia, optimism],\n    connectors: [injected(), metaMask()],\n    storage: createStorage({\n      storage: cookieStorage,\n    }),\n    ssr: true,\n    transports: {\n      [mainnet.id]: http(),\n      [sepolia.id]: http(),\n      [optimism.id]: http(),\n    },\n  })\n}\n\nexport const getWagmiStateSSR = createServerFn().handler(() => {\n  const cookie = getRequestHeader('cookie')\n  const initialState = cookieToInitialState(getConfig(), cookie)\n  return serialize(initialState || {})\n})\n\ndeclare module 'wagmi' {\n  interface Register {\n    config: ReturnType<typeof getConfig>\n  }\n}\n"
  },
  {
    "path": "playgrounds/tanstack-start/tsconfig.json",
    "content": "{\n  \"include\": [\"**/*.ts\", \"**/*.tsx\"],\n  \"compilerOptions\": {\n    \"target\": \"ES2022\",\n    \"jsx\": \"react-jsx\",\n    \"module\": \"ESNext\",\n    \"lib\": [\"ES2022\", \"DOM\", \"DOM.Iterable\"],\n    \"types\": [\"vite/client\"],\n\n    /* Bundler mode */\n    \"moduleResolution\": \"bundler\",\n    \"allowImportingTsExtensions\": true,\n    \"verbatimModuleSyntax\": false,\n    \"noEmit\": true,\n\n    /* Linting */\n    \"skipLibCheck\": true,\n    \"strict\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"noFallthroughCasesInSwitch\": true,\n    \"noUncheckedSideEffectImports\": true,\n    \"baseUrl\": \".\"\n  },\n  \"files\": [\"./worker-configuration.d.ts\"]\n}\n"
  },
  {
    "path": "playgrounds/tanstack-start/vite.config.ts",
    "content": "import { cloudflare } from '@cloudflare/vite-plugin'\nimport { devtools } from '@tanstack/devtools-vite'\nimport { tanstackStart } from '@tanstack/react-start/plugin/vite'\nimport viteReact from '@vitejs/plugin-react'\nimport { defineConfig } from 'vite'\n\nexport default defineConfig({\n  plugins: [\n    devtools(),\n    cloudflare({ viteEnvironment: { name: 'ssr' } }),\n    tanstackStart(),\n    viteReact(),\n  ],\n})\n"
  },
  {
    "path": "playgrounds/tanstack-start/worker-configuration.d.ts",
    "content": "/* eslint-disable */\n// Generated by Wrangler by running `wrangler types` (hash: c12347f6456cb051ac2112c49b405c15)\n// Runtime types generated with workerd@1.20260103.0 2025-12-10 nodejs_compat\ndeclare namespace Cloudflare {\n  interface Env {\n    VITE_PUBLIC_WC_PROJECT_ID: 'your-project-id'\n  }\n}\ninterface Env extends Cloudflare.Env {}\ntype StringifyValues<EnvType extends Record<string, unknown>> = {\n  [Binding in keyof EnvType]: EnvType[Binding] extends string\n    ? EnvType[Binding]\n    : string\n}\ndeclare namespace NodeJS {\n  interface ProcessEnv\n    extends StringifyValues<\n      Pick<Cloudflare.Env, 'VITE_PUBLIC_WC_PROJECT_ID'>\n    > {}\n}\n\n// Begin runtime types\n/*! *****************************************************************************\nCopyright (c) Cloudflare. All rights reserved.\nCopyright (c) Microsoft Corporation. All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n/* eslint-disable */\n// noinspection JSUnusedGlobalSymbols\ndeclare var onmessage: never\n/**\n * The **`DOMException`** interface represents an abnormal event (called an **exception**) that occurs as a result of calling a method or accessing a property of a web API.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMException)\n */\ndeclare class DOMException extends Error {\n  constructor(message?: string, name?: string)\n  /**\n   * The **`message`** read-only property of the a message or description associated with the given error name.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMException/message)\n   */\n  readonly message: string\n  /**\n   * The **`name`** read-only property of the one of the strings associated with an error name.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMException/name)\n   */\n  readonly name: string\n  /**\n   * The **`code`** read-only property of the DOMException interface returns one of the legacy error code constants, or `0` if none match.\n   * @deprecated\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMException/code)\n   */\n  readonly code: number\n  static readonly INDEX_SIZE_ERR: number\n  static readonly DOMSTRING_SIZE_ERR: number\n  static readonly HIERARCHY_REQUEST_ERR: number\n  static readonly WRONG_DOCUMENT_ERR: number\n  static readonly INVALID_CHARACTER_ERR: number\n  static readonly NO_DATA_ALLOWED_ERR: number\n  static readonly NO_MODIFICATION_ALLOWED_ERR: number\n  static readonly NOT_FOUND_ERR: number\n  static readonly NOT_SUPPORTED_ERR: number\n  static readonly INUSE_ATTRIBUTE_ERR: number\n  static readonly INVALID_STATE_ERR: number\n  static readonly SYNTAX_ERR: number\n  static readonly INVALID_MODIFICATION_ERR: number\n  static readonly NAMESPACE_ERR: number\n  static readonly INVALID_ACCESS_ERR: number\n  static readonly VALIDATION_ERR: number\n  static readonly TYPE_MISMATCH_ERR: number\n  static readonly SECURITY_ERR: number\n  static readonly NETWORK_ERR: number\n  static readonly ABORT_ERR: number\n  static readonly URL_MISMATCH_ERR: number\n  static readonly QUOTA_EXCEEDED_ERR: number\n  static readonly TIMEOUT_ERR: number\n  static readonly INVALID_NODE_TYPE_ERR: number\n  static readonly DATA_CLONE_ERR: number\n  get stack(): any\n  set stack(value: any)\n}\ntype WorkerGlobalScopeEventMap = {\n  fetch: FetchEvent\n  scheduled: ScheduledEvent\n  queue: QueueEvent\n  unhandledrejection: PromiseRejectionEvent\n  rejectionhandled: PromiseRejectionEvent\n}\ndeclare abstract class WorkerGlobalScope extends EventTarget<WorkerGlobalScopeEventMap> {\n  EventTarget: typeof EventTarget\n}\n/* The **`console`** object provides access to the debugging console (e.g., the Web console in Firefox). *\n * The **`console`** object provides access to the debugging console (e.g., the Web console in Firefox).\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console)\n */\ninterface Console {\n  assert(condition?: boolean, ...data: any[]): void\n  /**\n   * The **`console.clear()`** static method clears the console if possible.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/clear_static)\n   */\n  clear(): void\n  /**\n   * The **`console.count()`** static method logs the number of times that this particular call to `count()` has been called.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/count_static)\n   */\n  count(label?: string): void\n  /**\n   * The **`console.countReset()`** static method resets counter used with console/count_static.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/countReset_static)\n   */\n  countReset(label?: string): void\n  /**\n   * The **`console.debug()`** static method outputs a message to the console at the 'debug' log level.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/debug_static)\n   */\n  debug(...data: any[]): void\n  /**\n   * The **`console.dir()`** static method displays a list of the properties of the specified JavaScript object.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/dir_static)\n   */\n  dir(item?: any, options?: any): void\n  /**\n   * The **`console.dirxml()`** static method displays an interactive tree of the descendant elements of the specified XML/HTML element.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/dirxml_static)\n   */\n  dirxml(...data: any[]): void\n  /**\n   * The **`console.error()`** static method outputs a message to the console at the 'error' log level.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/error_static)\n   */\n  error(...data: any[]): void\n  /**\n   * The **`console.group()`** static method creates a new inline group in the Web console log, causing any subsequent console messages to be indented by an additional level, until console/groupEnd_static is called.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/group_static)\n   */\n  group(...data: any[]): void\n  /**\n   * The **`console.groupCollapsed()`** static method creates a new inline group in the console.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/groupCollapsed_static)\n   */\n  groupCollapsed(...data: any[]): void\n  /**\n   * The **`console.groupEnd()`** static method exits the current inline group in the console.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/groupEnd_static)\n   */\n  groupEnd(): void\n  /**\n   * The **`console.info()`** static method outputs a message to the console at the 'info' log level.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/info_static)\n   */\n  info(...data: any[]): void\n  /**\n   * The **`console.log()`** static method outputs a message to the console.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/log_static)\n   */\n  log(...data: any[]): void\n  /**\n   * The **`console.table()`** static method displays tabular data as a table.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/table_static)\n   */\n  table(tabularData?: any, properties?: string[]): void\n  /**\n   * The **`console.time()`** static method starts a timer you can use to track how long an operation takes.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/time_static)\n   */\n  time(label?: string): void\n  /**\n   * The **`console.timeEnd()`** static method stops a timer that was previously started by calling console/time_static.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/timeEnd_static)\n   */\n  timeEnd(label?: string): void\n  /**\n   * The **`console.timeLog()`** static method logs the current value of a timer that was previously started by calling console/time_static.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/timeLog_static)\n   */\n  timeLog(label?: string, ...data: any[]): void\n  timeStamp(label?: string): void\n  /**\n   * The **`console.trace()`** static method outputs a stack trace to the console.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/trace_static)\n   */\n  trace(...data: any[]): void\n  /**\n   * The **`console.warn()`** static method outputs a warning message to the console at the 'warning' log level.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/console/warn_static)\n   */\n  warn(...data: any[]): void\n}\ndeclare const console: Console\ntype BufferSource = ArrayBufferView | ArrayBuffer\ntype TypedArray =\n  | Int8Array\n  | Uint8Array\n  | Uint8ClampedArray\n  | Int16Array\n  | Uint16Array\n  | Int32Array\n  | Uint32Array\n  | Float32Array\n  | Float64Array\n  | BigInt64Array\n  | BigUint64Array\ndeclare namespace WebAssembly {\n  class CompileError extends Error {\n    constructor(message?: string)\n  }\n  class RuntimeError extends Error {\n    constructor(message?: string)\n  }\n  type ValueType =\n    | 'anyfunc'\n    | 'externref'\n    | 'f32'\n    | 'f64'\n    | 'i32'\n    | 'i64'\n    | 'v128'\n  interface GlobalDescriptor {\n    value: ValueType\n    mutable?: boolean\n  }\n  class Global {\n    constructor(descriptor: GlobalDescriptor, value?: any)\n    value: any\n    valueOf(): any\n  }\n  type ImportValue = ExportValue | number\n  type ModuleImports = Record<string, ImportValue>\n  type Imports = Record<string, ModuleImports>\n  type ExportValue = Function | Global | Memory | Table\n  type Exports = Record<string, ExportValue>\n  class Instance {\n    constructor(module: Module, imports?: Imports)\n    readonly exports: Exports\n  }\n  interface MemoryDescriptor {\n    initial: number\n    maximum?: number\n    shared?: boolean\n  }\n  class Memory {\n    constructor(descriptor: MemoryDescriptor)\n    readonly buffer: ArrayBuffer\n    grow(delta: number): number\n  }\n  type ImportExportKind = 'function' | 'global' | 'memory' | 'table'\n  interface ModuleExportDescriptor {\n    kind: ImportExportKind\n    name: string\n  }\n  interface ModuleImportDescriptor {\n    kind: ImportExportKind\n    module: string\n    name: string\n  }\n  abstract class Module {\n    static customSections(module: Module, sectionName: string): ArrayBuffer[]\n    static exports(module: Module): ModuleExportDescriptor[]\n    static imports(module: Module): ModuleImportDescriptor[]\n  }\n  type TableKind = 'anyfunc' | 'externref'\n  interface TableDescriptor {\n    element: TableKind\n    initial: number\n    maximum?: number\n  }\n  class Table {\n    constructor(descriptor: TableDescriptor, value?: any)\n    readonly length: number\n    get(index: number): any\n    grow(delta: number, value?: any): number\n    set(index: number, value?: any): void\n  }\n  function instantiate(module: Module, imports?: Imports): Promise<Instance>\n  function validate(bytes: BufferSource): boolean\n}\n/**\n * The **`ServiceWorkerGlobalScope`** interface of the Service Worker API represents the global execution context of a service worker.\n * Available only in secure contexts.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ServiceWorkerGlobalScope)\n */\ninterface ServiceWorkerGlobalScope extends WorkerGlobalScope {\n  DOMException: typeof DOMException\n  WorkerGlobalScope: typeof WorkerGlobalScope\n  btoa(data: string): string\n  atob(data: string): string\n  setTimeout(callback: (...args: any[]) => void, msDelay?: number): number\n  setTimeout<Args extends any[]>(\n    callback: (...args: Args) => void,\n    msDelay?: number,\n    ...args: Args\n  ): number\n  clearTimeout(timeoutId: number | null): void\n  setInterval(callback: (...args: any[]) => void, msDelay?: number): number\n  setInterval<Args extends any[]>(\n    callback: (...args: Args) => void,\n    msDelay?: number,\n    ...args: Args\n  ): number\n  clearInterval(timeoutId: number | null): void\n  queueMicrotask(task: Function): void\n  structuredClone<T>(value: T, options?: StructuredSerializeOptions): T\n  reportError(error: any): void\n  fetch(\n    input: RequestInfo | URL,\n    init?: RequestInit<RequestInitCfProperties>,\n  ): Promise<Response>\n  self: ServiceWorkerGlobalScope\n  crypto: Crypto\n  caches: CacheStorage\n  scheduler: Scheduler\n  performance: Performance\n  Cloudflare: Cloudflare\n  readonly origin: string\n  Event: typeof Event\n  ExtendableEvent: typeof ExtendableEvent\n  CustomEvent: typeof CustomEvent\n  PromiseRejectionEvent: typeof PromiseRejectionEvent\n  FetchEvent: typeof FetchEvent\n  TailEvent: typeof TailEvent\n  TraceEvent: typeof TailEvent\n  ScheduledEvent: typeof ScheduledEvent\n  MessageEvent: typeof MessageEvent\n  CloseEvent: typeof CloseEvent\n  ReadableStreamDefaultReader: typeof ReadableStreamDefaultReader\n  ReadableStreamBYOBReader: typeof ReadableStreamBYOBReader\n  ReadableStream: typeof ReadableStream\n  WritableStream: typeof WritableStream\n  WritableStreamDefaultWriter: typeof WritableStreamDefaultWriter\n  TransformStream: typeof TransformStream\n  ByteLengthQueuingStrategy: typeof ByteLengthQueuingStrategy\n  CountQueuingStrategy: typeof CountQueuingStrategy\n  ErrorEvent: typeof ErrorEvent\n  MessageChannel: typeof MessageChannel\n  MessagePort: typeof MessagePort\n  EventSource: typeof EventSource\n  ReadableStreamBYOBRequest: typeof ReadableStreamBYOBRequest\n  ReadableStreamDefaultController: typeof ReadableStreamDefaultController\n  ReadableByteStreamController: typeof ReadableByteStreamController\n  WritableStreamDefaultController: typeof WritableStreamDefaultController\n  TransformStreamDefaultController: typeof TransformStreamDefaultController\n  CompressionStream: typeof CompressionStream\n  DecompressionStream: typeof DecompressionStream\n  TextEncoderStream: typeof TextEncoderStream\n  TextDecoderStream: typeof TextDecoderStream\n  Headers: typeof Headers\n  Body: typeof Body\n  Request: typeof Request\n  Response: typeof Response\n  WebSocket: typeof WebSocket\n  WebSocketPair: typeof WebSocketPair\n  WebSocketRequestResponsePair: typeof WebSocketRequestResponsePair\n  AbortController: typeof AbortController\n  AbortSignal: typeof AbortSignal\n  TextDecoder: typeof TextDecoder\n  TextEncoder: typeof TextEncoder\n  navigator: Navigator\n  Navigator: typeof Navigator\n  URL: typeof URL\n  URLSearchParams: typeof URLSearchParams\n  URLPattern: typeof URLPattern\n  Blob: typeof Blob\n  File: typeof File\n  FormData: typeof FormData\n  Crypto: typeof Crypto\n  SubtleCrypto: typeof SubtleCrypto\n  CryptoKey: typeof CryptoKey\n  CacheStorage: typeof CacheStorage\n  Cache: typeof Cache\n  FixedLengthStream: typeof FixedLengthStream\n  IdentityTransformStream: typeof IdentityTransformStream\n  HTMLRewriter: typeof HTMLRewriter\n}\ndeclare function addEventListener<Type extends keyof WorkerGlobalScopeEventMap>(\n  type: Type,\n  handler: EventListenerOrEventListenerObject<WorkerGlobalScopeEventMap[Type]>,\n  options?: EventTargetAddEventListenerOptions | boolean,\n): void\ndeclare function removeEventListener<\n  Type extends keyof WorkerGlobalScopeEventMap,\n>(\n  type: Type,\n  handler: EventListenerOrEventListenerObject<WorkerGlobalScopeEventMap[Type]>,\n  options?: EventTargetEventListenerOptions | boolean,\n): void\n/**\n * The **`dispatchEvent()`** method of the EventTarget sends an Event to the object, (synchronously) invoking the affected event listeners in the appropriate order.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent)\n */\ndeclare function dispatchEvent(\n  event: WorkerGlobalScopeEventMap[keyof WorkerGlobalScopeEventMap],\n): boolean\n/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/btoa) */\ndeclare function btoa(data: string): string\n/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/atob) */\ndeclare function atob(data: string): string\n/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/setTimeout) */\ndeclare function setTimeout(\n  callback: (...args: any[]) => void,\n  msDelay?: number,\n): number\n/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/setTimeout) */\ndeclare function setTimeout<Args extends any[]>(\n  callback: (...args: Args) => void,\n  msDelay?: number,\n  ...args: Args\n): number\n/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/clearTimeout) */\ndeclare function clearTimeout(timeoutId: number | null): void\n/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/setInterval) */\ndeclare function setInterval(\n  callback: (...args: any[]) => void,\n  msDelay?: number,\n): number\n/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/setInterval) */\ndeclare function setInterval<Args extends any[]>(\n  callback: (...args: Args) => void,\n  msDelay?: number,\n  ...args: Args\n): number\n/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/clearInterval) */\ndeclare function clearInterval(timeoutId: number | null): void\n/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/queueMicrotask) */\ndeclare function queueMicrotask(task: Function): void\n/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/structuredClone) */\ndeclare function structuredClone<T>(\n  value: T,\n  options?: StructuredSerializeOptions,\n): T\n/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/reportError) */\ndeclare function reportError(error: any): void\n/* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/fetch) */\ndeclare function fetch(\n  input: RequestInfo | URL,\n  init?: RequestInit<RequestInitCfProperties>,\n): Promise<Response>\ndeclare const self: ServiceWorkerGlobalScope\n/**\n * The Web Crypto API provides a set of low-level functions for common cryptographic tasks.\n * The Workers runtime implements the full surface of this API, but with some differences in\n * the [supported algorithms](https://developers.cloudflare.com/workers/runtime-apis/web-crypto/#supported-algorithms)\n * compared to those implemented in most browsers.\n *\n * [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/web-crypto/)\n */\ndeclare const crypto: Crypto\n/**\n * The Cache API allows fine grained control of reading and writing from the Cloudflare global network cache.\n *\n * [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/)\n */\ndeclare const caches: CacheStorage\ndeclare const scheduler: Scheduler\n/**\n * The Workers runtime supports a subset of the Performance API, used to measure timing and performance,\n * as well as timing of subrequests and other operations.\n *\n * [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/performance/)\n */\ndeclare const performance: Performance\ndeclare const Cloudflare: Cloudflare\ndeclare const origin: string\ndeclare const navigator: Navigator\ntype TestController = {}\ninterface ExecutionContext<Props = unknown> {\n  waitUntil(promise: Promise<any>): void\n  passThroughOnException(): void\n  readonly exports: Cloudflare.Exports\n  readonly props: Props\n}\ntype ExportedHandlerFetchHandler<Env = unknown, CfHostMetadata = unknown> = (\n  request: Request<CfHostMetadata, IncomingRequestCfProperties<CfHostMetadata>>,\n  env: Env,\n  ctx: ExecutionContext,\n) => Response | Promise<Response>\ntype ExportedHandlerTailHandler<Env = unknown> = (\n  events: TraceItem[],\n  env: Env,\n  ctx: ExecutionContext,\n) => void | Promise<void>\ntype ExportedHandlerTraceHandler<Env = unknown> = (\n  traces: TraceItem[],\n  env: Env,\n  ctx: ExecutionContext,\n) => void | Promise<void>\ntype ExportedHandlerTailStreamHandler<Env = unknown> = (\n  event: TailStream.TailEvent<TailStream.Onset>,\n  env: Env,\n  ctx: ExecutionContext,\n) => TailStream.TailEventHandlerType | Promise<TailStream.TailEventHandlerType>\ntype ExportedHandlerScheduledHandler<Env = unknown> = (\n  controller: ScheduledController,\n  env: Env,\n  ctx: ExecutionContext,\n) => void | Promise<void>\ntype ExportedHandlerQueueHandler<Env = unknown, Message = unknown> = (\n  batch: MessageBatch<Message>,\n  env: Env,\n  ctx: ExecutionContext,\n) => void | Promise<void>\ntype ExportedHandlerTestHandler<Env = unknown> = (\n  controller: TestController,\n  env: Env,\n  ctx: ExecutionContext,\n) => void | Promise<void>\ninterface ExportedHandler<\n  Env = unknown,\n  QueueHandlerMessage = unknown,\n  CfHostMetadata = unknown,\n> {\n  fetch?: ExportedHandlerFetchHandler<Env, CfHostMetadata>\n  tail?: ExportedHandlerTailHandler<Env>\n  trace?: ExportedHandlerTraceHandler<Env>\n  tailStream?: ExportedHandlerTailStreamHandler<Env>\n  scheduled?: ExportedHandlerScheduledHandler<Env>\n  test?: ExportedHandlerTestHandler<Env>\n  email?: EmailExportedHandler<Env>\n  queue?: ExportedHandlerQueueHandler<Env, QueueHandlerMessage>\n}\ninterface StructuredSerializeOptions {\n  transfer?: any[]\n}\ndeclare abstract class Navigator {\n  sendBeacon(url: string, body?: BodyInit): boolean\n  readonly userAgent: string\n  readonly hardwareConcurrency: number\n  readonly language: string\n  readonly languages: string[]\n}\ninterface AlarmInvocationInfo {\n  readonly isRetry: boolean\n  readonly retryCount: number\n}\ninterface Cloudflare {\n  readonly compatibilityFlags: Record<string, boolean>\n}\ninterface DurableObject {\n  fetch(request: Request): Response | Promise<Response>\n  alarm?(alarmInfo?: AlarmInvocationInfo): void | Promise<void>\n  webSocketMessage?(\n    ws: WebSocket,\n    message: string | ArrayBuffer,\n  ): void | Promise<void>\n  webSocketClose?(\n    ws: WebSocket,\n    code: number,\n    reason: string,\n    wasClean: boolean,\n  ): void | Promise<void>\n  webSocketError?(ws: WebSocket, error: unknown): void | Promise<void>\n}\ntype DurableObjectStub<\n  T extends Rpc.DurableObjectBranded | undefined = undefined,\n> = Fetcher<\n  T,\n  'alarm' | 'webSocketMessage' | 'webSocketClose' | 'webSocketError'\n> & {\n  readonly id: DurableObjectId\n  readonly name?: string\n}\ninterface DurableObjectId {\n  toString(): string\n  equals(other: DurableObjectId): boolean\n  readonly name?: string\n}\ndeclare abstract class DurableObjectNamespace<\n  T extends Rpc.DurableObjectBranded | undefined = undefined,\n> {\n  newUniqueId(\n    options?: DurableObjectNamespaceNewUniqueIdOptions,\n  ): DurableObjectId\n  idFromName(name: string): DurableObjectId\n  idFromString(id: string): DurableObjectId\n  get(\n    id: DurableObjectId,\n    options?: DurableObjectNamespaceGetDurableObjectOptions,\n  ): DurableObjectStub<T>\n  getByName(\n    name: string,\n    options?: DurableObjectNamespaceGetDurableObjectOptions,\n  ): DurableObjectStub<T>\n  jurisdiction(\n    jurisdiction: DurableObjectJurisdiction,\n  ): DurableObjectNamespace<T>\n}\ntype DurableObjectJurisdiction = 'eu' | 'fedramp' | 'fedramp-high'\ninterface DurableObjectNamespaceNewUniqueIdOptions {\n  jurisdiction?: DurableObjectJurisdiction\n}\ntype DurableObjectLocationHint =\n  | 'wnam'\n  | 'enam'\n  | 'sam'\n  | 'weur'\n  | 'eeur'\n  | 'apac'\n  | 'oc'\n  | 'afr'\n  | 'me'\ntype DurableObjectRoutingMode = 'primary-only'\ninterface DurableObjectNamespaceGetDurableObjectOptions {\n  locationHint?: DurableObjectLocationHint\n  routingMode?: DurableObjectRoutingMode\n}\ntype DurableObjectClass<\n  _T extends Rpc.DurableObjectBranded | undefined = undefined,\n> = {}\ninterface DurableObjectState<Props = unknown> {\n  waitUntil(promise: Promise<any>): void\n  readonly exports: Cloudflare.Exports\n  readonly props: Props\n  readonly id: DurableObjectId\n  readonly storage: DurableObjectStorage\n  container?: Container\n  blockConcurrencyWhile<T>(callback: () => Promise<T>): Promise<T>\n  acceptWebSocket(ws: WebSocket, tags?: string[]): void\n  getWebSockets(tag?: string): WebSocket[]\n  setWebSocketAutoResponse(maybeReqResp?: WebSocketRequestResponsePair): void\n  getWebSocketAutoResponse(): WebSocketRequestResponsePair | null\n  getWebSocketAutoResponseTimestamp(ws: WebSocket): Date | null\n  setHibernatableWebSocketEventTimeout(timeoutMs?: number): void\n  getHibernatableWebSocketEventTimeout(): number | null\n  getTags(ws: WebSocket): string[]\n  abort(reason?: string): void\n}\ninterface DurableObjectTransaction {\n  get<T = unknown>(\n    key: string,\n    options?: DurableObjectGetOptions,\n  ): Promise<T | undefined>\n  get<T = unknown>(\n    keys: string[],\n    options?: DurableObjectGetOptions,\n  ): Promise<Map<string, T>>\n  list<T = unknown>(options?: DurableObjectListOptions): Promise<Map<string, T>>\n  put<T>(\n    key: string,\n    value: T,\n    options?: DurableObjectPutOptions,\n  ): Promise<void>\n  put<T>(\n    entries: Record<string, T>,\n    options?: DurableObjectPutOptions,\n  ): Promise<void>\n  delete(key: string, options?: DurableObjectPutOptions): Promise<boolean>\n  delete(keys: string[], options?: DurableObjectPutOptions): Promise<number>\n  rollback(): void\n  getAlarm(options?: DurableObjectGetAlarmOptions): Promise<number | null>\n  setAlarm(\n    scheduledTime: number | Date,\n    options?: DurableObjectSetAlarmOptions,\n  ): Promise<void>\n  deleteAlarm(options?: DurableObjectSetAlarmOptions): Promise<void>\n}\ninterface DurableObjectStorage {\n  get<T = unknown>(\n    key: string,\n    options?: DurableObjectGetOptions,\n  ): Promise<T | undefined>\n  get<T = unknown>(\n    keys: string[],\n    options?: DurableObjectGetOptions,\n  ): Promise<Map<string, T>>\n  list<T = unknown>(options?: DurableObjectListOptions): Promise<Map<string, T>>\n  put<T>(\n    key: string,\n    value: T,\n    options?: DurableObjectPutOptions,\n  ): Promise<void>\n  put<T>(\n    entries: Record<string, T>,\n    options?: DurableObjectPutOptions,\n  ): Promise<void>\n  delete(key: string, options?: DurableObjectPutOptions): Promise<boolean>\n  delete(keys: string[], options?: DurableObjectPutOptions): Promise<number>\n  deleteAll(options?: DurableObjectPutOptions): Promise<void>\n  transaction<T>(\n    closure: (txn: DurableObjectTransaction) => Promise<T>,\n  ): Promise<T>\n  getAlarm(options?: DurableObjectGetAlarmOptions): Promise<number | null>\n  setAlarm(\n    scheduledTime: number | Date,\n    options?: DurableObjectSetAlarmOptions,\n  ): Promise<void>\n  deleteAlarm(options?: DurableObjectSetAlarmOptions): Promise<void>\n  sync(): Promise<void>\n  sql: SqlStorage\n  kv: SyncKvStorage\n  transactionSync<T>(closure: () => T): T\n  getCurrentBookmark(): Promise<string>\n  getBookmarkForTime(timestamp: number | Date): Promise<string>\n  onNextSessionRestoreBookmark(bookmark: string): Promise<string>\n}\ninterface DurableObjectListOptions {\n  start?: string\n  startAfter?: string\n  end?: string\n  prefix?: string\n  reverse?: boolean\n  limit?: number\n  allowConcurrency?: boolean\n  noCache?: boolean\n}\ninterface DurableObjectGetOptions {\n  allowConcurrency?: boolean\n  noCache?: boolean\n}\ninterface DurableObjectGetAlarmOptions {\n  allowConcurrency?: boolean\n}\ninterface DurableObjectPutOptions {\n  allowConcurrency?: boolean\n  allowUnconfirmed?: boolean\n  noCache?: boolean\n}\ninterface DurableObjectSetAlarmOptions {\n  allowConcurrency?: boolean\n  allowUnconfirmed?: boolean\n}\ndeclare class WebSocketRequestResponsePair {\n  constructor(request: string, response: string)\n  get request(): string\n  get response(): string\n}\ninterface AnalyticsEngineDataset {\n  writeDataPoint(event?: AnalyticsEngineDataPoint): void\n}\ninterface AnalyticsEngineDataPoint {\n  indexes?: ((ArrayBuffer | string) | null)[]\n  doubles?: number[]\n  blobs?: ((ArrayBuffer | string) | null)[]\n}\n/**\n * The **`Event`** interface represents an event which takes place on an `EventTarget`.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event)\n */\ndeclare class Event {\n  constructor(type: string, init?: EventInit)\n  /**\n   * The **`type`** read-only property of the Event interface returns a string containing the event's type.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/type)\n   */\n  get type(): string\n  /**\n   * The **`eventPhase`** read-only property of the being evaluated.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/eventPhase)\n   */\n  get eventPhase(): number\n  /**\n   * The read-only **`composed`** property of the or not the event will propagate across the shadow DOM boundary into the standard DOM.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/composed)\n   */\n  get composed(): boolean\n  /**\n   * The **`bubbles`** read-only property of the Event interface indicates whether the event bubbles up through the DOM tree or not.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/bubbles)\n   */\n  get bubbles(): boolean\n  /**\n   * The **`cancelable`** read-only property of the Event interface indicates whether the event can be canceled, and therefore prevented as if the event never happened.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/cancelable)\n   */\n  get cancelable(): boolean\n  /**\n   * The **`defaultPrevented`** read-only property of the Event interface returns a boolean value indicating whether or not the call to Event.preventDefault() canceled the event.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/defaultPrevented)\n   */\n  get defaultPrevented(): boolean\n  /**\n   * The Event property **`returnValue`** indicates whether the default action for this event has been prevented or not.\n   * @deprecated\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/returnValue)\n   */\n  get returnValue(): boolean\n  /**\n   * The **`currentTarget`** read-only property of the Event interface identifies the element to which the event handler has been attached.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/currentTarget)\n   */\n  get currentTarget(): EventTarget | undefined\n  /**\n   * The read-only **`target`** property of the dispatched.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/target)\n   */\n  get target(): EventTarget | undefined\n  /**\n   * The deprecated **`Event.srcElement`** is an alias for the Event.target property.\n   * @deprecated\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/srcElement)\n   */\n  get srcElement(): EventTarget | undefined\n  /**\n   * The **`timeStamp`** read-only property of the Event interface returns the time (in milliseconds) at which the event was created.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/timeStamp)\n   */\n  get timeStamp(): number\n  /**\n   * The **`isTrusted`** read-only property of the when the event was generated by the user agent (including via user actions and programmatic methods such as HTMLElement.focus()), and `false` when the event was dispatched via The only exception is the `click` event, which initializes the `isTrusted` property to `false` in user agents.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/isTrusted)\n   */\n  get isTrusted(): boolean\n  /**\n   * The **`cancelBubble`** property of the Event interface is deprecated.\n   * @deprecated\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/cancelBubble)\n   */\n  get cancelBubble(): boolean\n  /**\n   * The **`cancelBubble`** property of the Event interface is deprecated.\n   * @deprecated\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/cancelBubble)\n   */\n  set cancelBubble(value: boolean)\n  /**\n   * The **`stopImmediatePropagation()`** method of the If several listeners are attached to the same element for the same event type, they are called in the order in which they were added.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/stopImmediatePropagation)\n   */\n  stopImmediatePropagation(): void\n  /**\n   * The **`preventDefault()`** method of the Event interface tells the user agent that if the event does not get explicitly handled, its default action should not be taken as it normally would be.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/preventDefault)\n   */\n  preventDefault(): void\n  /**\n   * The **`stopPropagation()`** method of the Event interface prevents further propagation of the current event in the capturing and bubbling phases.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/stopPropagation)\n   */\n  stopPropagation(): void\n  /**\n   * The **`composedPath()`** method of the Event interface returns the event's path which is an array of the objects on which listeners will be invoked.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Event/composedPath)\n   */\n  composedPath(): EventTarget[]\n  static readonly NONE: number\n  static readonly CAPTURING_PHASE: number\n  static readonly AT_TARGET: number\n  static readonly BUBBLING_PHASE: number\n}\ninterface EventInit {\n  bubbles?: boolean\n  cancelable?: boolean\n  composed?: boolean\n}\ntype EventListener<EventType extends Event = Event> = (event: EventType) => void\ninterface EventListenerObject<EventType extends Event = Event> {\n  handleEvent(event: EventType): void\n}\ntype EventListenerOrEventListenerObject<EventType extends Event = Event> =\n  | EventListener<EventType>\n  | EventListenerObject<EventType>\n/**\n * The **`EventTarget`** interface is implemented by objects that can receive events and may have listeners for them.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget)\n */\ndeclare class EventTarget<\n  EventMap extends Record<string, Event> = Record<string, Event>,\n> {\n  constructor()\n  /**\n   * The **`addEventListener()`** method of the EventTarget interface sets up a function that will be called whenever the specified event is delivered to the target.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget/addEventListener)\n   */\n  addEventListener<Type extends keyof EventMap>(\n    type: Type,\n    handler: EventListenerOrEventListenerObject<EventMap[Type]>,\n    options?: EventTargetAddEventListenerOptions | boolean,\n  ): void\n  /**\n   * The **`removeEventListener()`** method of the EventTarget interface removes an event listener previously registered with EventTarget.addEventListener() from the target.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget/removeEventListener)\n   */\n  removeEventListener<Type extends keyof EventMap>(\n    type: Type,\n    handler: EventListenerOrEventListenerObject<EventMap[Type]>,\n    options?: EventTargetEventListenerOptions | boolean,\n  ): void\n  /**\n   * The **`dispatchEvent()`** method of the EventTarget sends an Event to the object, (synchronously) invoking the affected event listeners in the appropriate order.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent)\n   */\n  dispatchEvent(event: EventMap[keyof EventMap]): boolean\n}\ninterface EventTargetEventListenerOptions {\n  capture?: boolean\n}\ninterface EventTargetAddEventListenerOptions {\n  capture?: boolean\n  passive?: boolean\n  once?: boolean\n  signal?: AbortSignal\n}\ninterface EventTargetHandlerObject {\n  handleEvent: (event: Event) => any | undefined\n}\n/**\n * The **`AbortController`** interface represents a controller object that allows you to abort one or more Web requests as and when desired.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortController)\n */\ndeclare class AbortController {\n  constructor()\n  /**\n   * The **`signal`** read-only property of the AbortController interface returns an AbortSignal object instance, which can be used to communicate with/abort an asynchronous operation as desired.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortController/signal)\n   */\n  get signal(): AbortSignal\n  /**\n   * The **`abort()`** method of the AbortController interface aborts an asynchronous operation before it has completed.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortController/abort)\n   */\n  abort(reason?: any): void\n}\n/**\n * The **`AbortSignal`** interface represents a signal object that allows you to communicate with an asynchronous operation (such as a fetch request) and abort it if required via an AbortController object.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal)\n */\ndeclare abstract class AbortSignal extends EventTarget {\n  /**\n   * The **`AbortSignal.abort()`** static method returns an AbortSignal that is already set as aborted (and which does not trigger an AbortSignal/abort_event event).\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/abort_static)\n   */\n  static abort(reason?: any): AbortSignal\n  /**\n   * The **`AbortSignal.timeout()`** static method returns an AbortSignal that will automatically abort after a specified time.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/timeout_static)\n   */\n  static timeout(delay: number): AbortSignal\n  /**\n   * The **`AbortSignal.any()`** static method takes an iterable of abort signals and returns an AbortSignal.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/any_static)\n   */\n  static any(signals: AbortSignal[]): AbortSignal\n  /**\n   * The **`aborted`** read-only property returns a value that indicates whether the asynchronous operations the signal is communicating with are aborted (`true`) or not (`false`).\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/aborted)\n   */\n  get aborted(): boolean\n  /**\n   * The **`reason`** read-only property returns a JavaScript value that indicates the abort reason.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/reason)\n   */\n  get reason(): any\n  /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/abort_event) */\n  get onabort(): any | null\n  /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/abort_event) */\n  set onabort(value: any | null)\n  /**\n   * The **`throwIfAborted()`** method throws the signal's abort AbortSignal.reason if the signal has been aborted; otherwise it does nothing.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/AbortSignal/throwIfAborted)\n   */\n  throwIfAborted(): void\n}\ninterface Scheduler {\n  wait(delay: number, maybeOptions?: SchedulerWaitOptions): Promise<void>\n}\ninterface SchedulerWaitOptions {\n  signal?: AbortSignal\n}\n/**\n * The **`ExtendableEvent`** interface extends the lifetime of the `install` and `activate` events dispatched on the global scope as part of the service worker lifecycle.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ExtendableEvent)\n */\ndeclare abstract class ExtendableEvent extends Event {\n  /**\n   * The **`ExtendableEvent.waitUntil()`** method tells the event dispatcher that work is ongoing.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ExtendableEvent/waitUntil)\n   */\n  waitUntil(promise: Promise<any>): void\n}\n/**\n * The **`CustomEvent`** interface represents events initialized by an application for any purpose.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CustomEvent)\n */\ndeclare class CustomEvent<T = any> extends Event {\n  constructor(type: string, init?: CustomEventCustomEventInit)\n  /**\n   * The read-only **`detail`** property of the CustomEvent interface returns any data passed when initializing the event.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CustomEvent/detail)\n   */\n  get detail(): T\n}\ninterface CustomEventCustomEventInit {\n  bubbles?: boolean\n  cancelable?: boolean\n  composed?: boolean\n  detail?: any\n}\n/**\n * The **`Blob`** interface represents a blob, which is a file-like object of immutable, raw data; they can be read as text or binary data, or converted into a ReadableStream so its methods can be used for processing the data.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob)\n */\ndeclare class Blob {\n  constructor(\n    type?: ((ArrayBuffer | ArrayBufferView) | string | Blob)[],\n    options?: BlobOptions,\n  )\n  /**\n   * The **`size`** read-only property of the Blob interface returns the size of the Blob or File in bytes.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/size)\n   */\n  get size(): number\n  /**\n   * The **`type`** read-only property of the Blob interface returns the MIME type of the file.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/type)\n   */\n  get type(): string\n  /**\n   * The **`slice()`** method of the Blob interface creates and returns a new `Blob` object which contains data from a subset of the blob on which it's called.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/slice)\n   */\n  slice(start?: number, end?: number, type?: string): Blob\n  /**\n   * The **`arrayBuffer()`** method of the Blob interface returns a Promise that resolves with the contents of the blob as binary data contained in an ArrayBuffer.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/arrayBuffer)\n   */\n  arrayBuffer(): Promise<ArrayBuffer>\n  /**\n   * The **`bytes()`** method of the Blob interface returns a Promise that resolves with a Uint8Array containing the contents of the blob as an array of bytes.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/bytes)\n   */\n  bytes(): Promise<Uint8Array>\n  /**\n   * The **`text()`** method of the string containing the contents of the blob, interpreted as UTF-8.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/text)\n   */\n  text(): Promise<string>\n  /**\n   * The **`stream()`** method of the Blob interface returns a ReadableStream which upon reading returns the data contained within the `Blob`.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob/stream)\n   */\n  stream(): ReadableStream\n}\ninterface BlobOptions {\n  type?: string\n}\n/**\n * The **`File`** interface provides information about files and allows JavaScript in a web page to access their content.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/File)\n */\ndeclare class File extends Blob {\n  constructor(\n    bits: ((ArrayBuffer | ArrayBufferView) | string | Blob)[] | undefined,\n    name: string,\n    options?: FileOptions,\n  )\n  /**\n   * The **`name`** read-only property of the File interface returns the name of the file represented by a File object.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/File/name)\n   */\n  get name(): string\n  /**\n   * The **`lastModified`** read-only property of the File interface provides the last modified date of the file as the number of milliseconds since the Unix epoch (January 1, 1970 at midnight).\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/File/lastModified)\n   */\n  get lastModified(): number\n}\ninterface FileOptions {\n  type?: string\n  lastModified?: number\n}\n/**\n * The Cache API allows fine grained control of reading and writing from the Cloudflare global network cache.\n *\n * [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/)\n */\ndeclare abstract class CacheStorage {\n  /**\n   * The **`open()`** method of the the Cache object matching the `cacheName`.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CacheStorage/open)\n   */\n  open(cacheName: string): Promise<Cache>\n  readonly default: Cache\n}\n/**\n * The Cache API allows fine grained control of reading and writing from the Cloudflare global network cache.\n *\n * [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/)\n */\ndeclare abstract class Cache {\n  /* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/#delete) */\n  delete(\n    request: RequestInfo | URL,\n    options?: CacheQueryOptions,\n  ): Promise<boolean>\n  /* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/#match) */\n  match(\n    request: RequestInfo | URL,\n    options?: CacheQueryOptions,\n  ): Promise<Response | undefined>\n  /* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/cache/#put) */\n  put(request: RequestInfo | URL, response: Response): Promise<void>\n}\ninterface CacheQueryOptions {\n  ignoreMethod?: boolean\n}\n/**\n * The Web Crypto API provides a set of low-level functions for common cryptographic tasks.\n * The Workers runtime implements the full surface of this API, but with some differences in\n * the [supported algorithms](https://developers.cloudflare.com/workers/runtime-apis/web-crypto/#supported-algorithms)\n * compared to those implemented in most browsers.\n *\n * [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/web-crypto/)\n */\ndeclare abstract class Crypto {\n  /**\n   * The **`Crypto.subtle`** read-only property returns a cryptographic operations.\n   * Available only in secure contexts.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/subtle)\n   */\n  get subtle(): SubtleCrypto\n  /**\n   * The **`Crypto.getRandomValues()`** method lets you get cryptographically strong random values.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/getRandomValues)\n   */\n  getRandomValues<\n    T extends\n      | Int8Array\n      | Uint8Array\n      | Int16Array\n      | Uint16Array\n      | Int32Array\n      | Uint32Array\n      | BigInt64Array\n      | BigUint64Array,\n  >(buffer: T): T\n  /**\n   * The **`randomUUID()`** method of the Crypto interface is used to generate a v4 UUID using a cryptographically secure random number generator.\n   * Available only in secure contexts.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Crypto/randomUUID)\n   */\n  randomUUID(): string\n  DigestStream: typeof DigestStream\n}\n/**\n * The **`SubtleCrypto`** interface of the Web Crypto API provides a number of low-level cryptographic functions.\n * Available only in secure contexts.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto)\n */\ndeclare abstract class SubtleCrypto {\n  /**\n   * The **`encrypt()`** method of the SubtleCrypto interface encrypts data.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/encrypt)\n   */\n  encrypt(\n    algorithm: string | SubtleCryptoEncryptAlgorithm,\n    key: CryptoKey,\n    plainText: ArrayBuffer | ArrayBufferView,\n  ): Promise<ArrayBuffer>\n  /**\n   * The **`decrypt()`** method of the SubtleCrypto interface decrypts some encrypted data.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/decrypt)\n   */\n  decrypt(\n    algorithm: string | SubtleCryptoEncryptAlgorithm,\n    key: CryptoKey,\n    cipherText: ArrayBuffer | ArrayBufferView,\n  ): Promise<ArrayBuffer>\n  /**\n   * The **`sign()`** method of the SubtleCrypto interface generates a digital signature.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/sign)\n   */\n  sign(\n    algorithm: string | SubtleCryptoSignAlgorithm,\n    key: CryptoKey,\n    data: ArrayBuffer | ArrayBufferView,\n  ): Promise<ArrayBuffer>\n  /**\n   * The **`verify()`** method of the SubtleCrypto interface verifies a digital signature.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/verify)\n   */\n  verify(\n    algorithm: string | SubtleCryptoSignAlgorithm,\n    key: CryptoKey,\n    signature: ArrayBuffer | ArrayBufferView,\n    data: ArrayBuffer | ArrayBufferView,\n  ): Promise<boolean>\n  /**\n   * The **`digest()`** method of the SubtleCrypto interface generates a _digest_ of the given data, using the specified hash function.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/digest)\n   */\n  digest(\n    algorithm: string | SubtleCryptoHashAlgorithm,\n    data: ArrayBuffer | ArrayBufferView,\n  ): Promise<ArrayBuffer>\n  /**\n   * The **`generateKey()`** method of the SubtleCrypto interface is used to generate a new key (for symmetric algorithms) or key pair (for public-key algorithms).\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/generateKey)\n   */\n  generateKey(\n    algorithm: string | SubtleCryptoGenerateKeyAlgorithm,\n    extractable: boolean,\n    keyUsages: string[],\n  ): Promise<CryptoKey | CryptoKeyPair>\n  /**\n   * The **`deriveKey()`** method of the SubtleCrypto interface can be used to derive a secret key from a master key.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/deriveKey)\n   */\n  deriveKey(\n    algorithm: string | SubtleCryptoDeriveKeyAlgorithm,\n    baseKey: CryptoKey,\n    derivedKeyAlgorithm: string | SubtleCryptoImportKeyAlgorithm,\n    extractable: boolean,\n    keyUsages: string[],\n  ): Promise<CryptoKey>\n  /**\n   * The **`deriveBits()`** method of the key.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/deriveBits)\n   */\n  deriveBits(\n    algorithm: string | SubtleCryptoDeriveKeyAlgorithm,\n    baseKey: CryptoKey,\n    length?: number | null,\n  ): Promise<ArrayBuffer>\n  /**\n   * The **`importKey()`** method of the SubtleCrypto interface imports a key: that is, it takes as input a key in an external, portable format and gives you a CryptoKey object that you can use in the Web Crypto API.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/importKey)\n   */\n  importKey(\n    format: string,\n    keyData: (ArrayBuffer | ArrayBufferView) | JsonWebKey,\n    algorithm: string | SubtleCryptoImportKeyAlgorithm,\n    extractable: boolean,\n    keyUsages: string[],\n  ): Promise<CryptoKey>\n  /**\n   * The **`exportKey()`** method of the SubtleCrypto interface exports a key: that is, it takes as input a CryptoKey object and gives you the key in an external, portable format.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/exportKey)\n   */\n  exportKey(format: string, key: CryptoKey): Promise<ArrayBuffer | JsonWebKey>\n  /**\n   * The **`wrapKey()`** method of the SubtleCrypto interface 'wraps' a key.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/wrapKey)\n   */\n  wrapKey(\n    format: string,\n    key: CryptoKey,\n    wrappingKey: CryptoKey,\n    wrapAlgorithm: string | SubtleCryptoEncryptAlgorithm,\n  ): Promise<ArrayBuffer>\n  /**\n   * The **`unwrapKey()`** method of the SubtleCrypto interface 'unwraps' a key.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SubtleCrypto/unwrapKey)\n   */\n  unwrapKey(\n    format: string,\n    wrappedKey: ArrayBuffer | ArrayBufferView,\n    unwrappingKey: CryptoKey,\n    unwrapAlgorithm: string | SubtleCryptoEncryptAlgorithm,\n    unwrappedKeyAlgorithm: string | SubtleCryptoImportKeyAlgorithm,\n    extractable: boolean,\n    keyUsages: string[],\n  ): Promise<CryptoKey>\n  timingSafeEqual(\n    a: ArrayBuffer | ArrayBufferView,\n    b: ArrayBuffer | ArrayBufferView,\n  ): boolean\n}\n/**\n * The **`CryptoKey`** interface of the Web Crypto API represents a cryptographic key obtained from one of the SubtleCrypto methods SubtleCrypto.generateKey, SubtleCrypto.deriveKey, SubtleCrypto.importKey, or SubtleCrypto.unwrapKey.\n * Available only in secure contexts.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey)\n */\ndeclare abstract class CryptoKey {\n  /**\n   * The read-only **`type`** property of the CryptoKey interface indicates which kind of key is represented by the object.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/type)\n   */\n  readonly type: string\n  /**\n   * The read-only **`extractable`** property of the CryptoKey interface indicates whether or not the key may be extracted using `SubtleCrypto.exportKey()` or `SubtleCrypto.wrapKey()`.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/extractable)\n   */\n  readonly extractable: boolean\n  /**\n   * The read-only **`algorithm`** property of the CryptoKey interface returns an object describing the algorithm for which this key can be used, and any associated extra parameters.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/algorithm)\n   */\n  readonly algorithm:\n    | CryptoKeyKeyAlgorithm\n    | CryptoKeyAesKeyAlgorithm\n    | CryptoKeyHmacKeyAlgorithm\n    | CryptoKeyRsaKeyAlgorithm\n    | CryptoKeyEllipticKeyAlgorithm\n    | CryptoKeyArbitraryKeyAlgorithm\n  /**\n   * The read-only **`usages`** property of the CryptoKey interface indicates what can be done with the key.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CryptoKey/usages)\n   */\n  readonly usages: string[]\n}\ninterface CryptoKeyPair {\n  publicKey: CryptoKey\n  privateKey: CryptoKey\n}\ninterface JsonWebKey {\n  kty: string\n  use?: string\n  key_ops?: string[]\n  alg?: string\n  ext?: boolean\n  crv?: string\n  x?: string\n  y?: string\n  d?: string\n  n?: string\n  e?: string\n  p?: string\n  q?: string\n  dp?: string\n  dq?: string\n  qi?: string\n  oth?: RsaOtherPrimesInfo[]\n  k?: string\n}\ninterface RsaOtherPrimesInfo {\n  r?: string\n  d?: string\n  t?: string\n}\ninterface SubtleCryptoDeriveKeyAlgorithm {\n  name: string\n  salt?: ArrayBuffer | ArrayBufferView\n  iterations?: number\n  hash?: string | SubtleCryptoHashAlgorithm\n  $public?: CryptoKey\n  info?: ArrayBuffer | ArrayBufferView\n}\ninterface SubtleCryptoEncryptAlgorithm {\n  name: string\n  iv?: ArrayBuffer | ArrayBufferView\n  additionalData?: ArrayBuffer | ArrayBufferView\n  tagLength?: number\n  counter?: ArrayBuffer | ArrayBufferView\n  length?: number\n  label?: ArrayBuffer | ArrayBufferView\n}\ninterface SubtleCryptoGenerateKeyAlgorithm {\n  name: string\n  hash?: string | SubtleCryptoHashAlgorithm\n  modulusLength?: number\n  publicExponent?: ArrayBuffer | ArrayBufferView\n  length?: number\n  namedCurve?: string\n}\ninterface SubtleCryptoHashAlgorithm {\n  name: string\n}\ninterface SubtleCryptoImportKeyAlgorithm {\n  name: string\n  hash?: string | SubtleCryptoHashAlgorithm\n  length?: number\n  namedCurve?: string\n  compressed?: boolean\n}\ninterface SubtleCryptoSignAlgorithm {\n  name: string\n  hash?: string | SubtleCryptoHashAlgorithm\n  dataLength?: number\n  saltLength?: number\n}\ninterface CryptoKeyKeyAlgorithm {\n  name: string\n}\ninterface CryptoKeyAesKeyAlgorithm {\n  name: string\n  length: number\n}\ninterface CryptoKeyHmacKeyAlgorithm {\n  name: string\n  hash: CryptoKeyKeyAlgorithm\n  length: number\n}\ninterface CryptoKeyRsaKeyAlgorithm {\n  name: string\n  modulusLength: number\n  publicExponent: ArrayBuffer | ArrayBufferView\n  hash?: CryptoKeyKeyAlgorithm\n}\ninterface CryptoKeyEllipticKeyAlgorithm {\n  name: string\n  namedCurve: string\n}\ninterface CryptoKeyArbitraryKeyAlgorithm {\n  name: string\n  hash?: CryptoKeyKeyAlgorithm\n  namedCurve?: string\n  length?: number\n}\ndeclare class DigestStream extends WritableStream<\n  ArrayBuffer | ArrayBufferView\n> {\n  constructor(algorithm: string | SubtleCryptoHashAlgorithm)\n  readonly digest: Promise<ArrayBuffer>\n  get bytesWritten(): number | bigint\n}\n/**\n * The **`TextDecoder`** interface represents a decoder for a specific text encoding, such as `UTF-8`, `ISO-8859-2`, `KOI8-R`, `GBK`, etc.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextDecoder)\n */\ndeclare class TextDecoder {\n  constructor(label?: string, options?: TextDecoderConstructorOptions)\n  /**\n   * The **`TextDecoder.decode()`** method returns a string containing text decoded from the buffer passed as a parameter.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextDecoder/decode)\n   */\n  decode(\n    input?: ArrayBuffer | ArrayBufferView,\n    options?: TextDecoderDecodeOptions,\n  ): string\n  get encoding(): string\n  get fatal(): boolean\n  get ignoreBOM(): boolean\n}\n/**\n * The **`TextEncoder`** interface takes a stream of code points as input and emits a stream of UTF-8 bytes.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextEncoder)\n */\ndeclare class TextEncoder {\n  constructor()\n  /**\n   * The **`TextEncoder.encode()`** method takes a string as input, and returns a Global_Objects/Uint8Array containing the text given in parameters encoded with the specific method for that TextEncoder object.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextEncoder/encode)\n   */\n  encode(input?: string): Uint8Array\n  /**\n   * The **`TextEncoder.encodeInto()`** method takes a string to encode and a destination Uint8Array to put resulting UTF-8 encoded text into, and returns a dictionary object indicating the progress of the encoding.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextEncoder/encodeInto)\n   */\n  encodeInto(input: string, buffer: Uint8Array): TextEncoderEncodeIntoResult\n  get encoding(): string\n}\ninterface TextDecoderConstructorOptions {\n  fatal: boolean\n  ignoreBOM: boolean\n}\ninterface TextDecoderDecodeOptions {\n  stream: boolean\n}\ninterface TextEncoderEncodeIntoResult {\n  read: number\n  written: number\n}\n/**\n * The **`ErrorEvent`** interface represents events providing information related to errors in scripts or in files.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ErrorEvent)\n */\ndeclare class ErrorEvent extends Event {\n  constructor(type: string, init?: ErrorEventErrorEventInit)\n  /**\n   * The **`filename`** read-only property of the ErrorEvent interface returns a string containing the name of the script file in which the error occurred.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ErrorEvent/filename)\n   */\n  get filename(): string\n  /**\n   * The **`message`** read-only property of the ErrorEvent interface returns a string containing a human-readable error message describing the problem.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ErrorEvent/message)\n   */\n  get message(): string\n  /**\n   * The **`lineno`** read-only property of the ErrorEvent interface returns an integer containing the line number of the script file on which the error occurred.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ErrorEvent/lineno)\n   */\n  get lineno(): number\n  /**\n   * The **`colno`** read-only property of the ErrorEvent interface returns an integer containing the column number of the script file on which the error occurred.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ErrorEvent/colno)\n   */\n  get colno(): number\n  /**\n   * The **`error`** read-only property of the ErrorEvent interface returns a JavaScript value, such as an Error or DOMException, representing the error associated with this event.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ErrorEvent/error)\n   */\n  get error(): any\n}\ninterface ErrorEventErrorEventInit {\n  message?: string\n  filename?: string\n  lineno?: number\n  colno?: number\n  error?: any\n}\n/**\n * The **`MessageEvent`** interface represents a message received by a target object.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageEvent)\n */\ndeclare class MessageEvent extends Event {\n  constructor(type: string, initializer: MessageEventInit)\n  /**\n   * The **`data`** read-only property of the The data sent by the message emitter; this can be any data type, depending on what originated this event.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageEvent/data)\n   */\n  readonly data: any\n  /**\n   * The **`origin`** read-only property of the origin of the message emitter.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageEvent/origin)\n   */\n  readonly origin: string | null\n  /**\n   * The **`lastEventId`** read-only property of the unique ID for the event.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageEvent/lastEventId)\n   */\n  readonly lastEventId: string\n  /**\n   * The **`source`** read-only property of the a WindowProxy, MessagePort, or a `MessageEventSource` (which can be a WindowProxy, message emitter.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageEvent/source)\n   */\n  readonly source: MessagePort | null\n  /**\n   * The **`ports`** read-only property of the containing all MessagePort objects sent with the message, in order.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageEvent/ports)\n   */\n  readonly ports: MessagePort[]\n}\ninterface MessageEventInit {\n  data: ArrayBuffer | string\n}\n/**\n * The **`PromiseRejectionEvent`** interface represents events which are sent to the global script context when JavaScript Promises are rejected.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/PromiseRejectionEvent)\n */\ndeclare abstract class PromiseRejectionEvent extends Event {\n  /**\n   * The PromiseRejectionEvent interface's **`promise`** read-only property indicates the JavaScript rejected.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/PromiseRejectionEvent/promise)\n   */\n  readonly promise: Promise<any>\n  /**\n   * The PromiseRejectionEvent **`reason`** read-only property is any JavaScript value or Object which provides the reason passed into Promise.reject().\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/PromiseRejectionEvent/reason)\n   */\n  readonly reason: any\n}\n/**\n * The **`FormData`** interface provides a way to construct a set of key/value pairs representing form fields and their values, which can be sent using the Window/fetch, XMLHttpRequest.send() or navigator.sendBeacon() methods.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData)\n */\ndeclare class FormData {\n  constructor()\n  /**\n   * The **`append()`** method of the FormData interface appends a new value onto an existing key inside a `FormData` object, or adds the key if it does not already exist.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/append)\n   */\n  append(name: string, value: string): void\n  /**\n   * The **`append()`** method of the FormData interface appends a new value onto an existing key inside a `FormData` object, or adds the key if it does not already exist.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/append)\n   */\n  append(name: string, value: Blob, filename?: string): void\n  /**\n   * The **`delete()`** method of the FormData interface deletes a key and its value(s) from a `FormData` object.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/delete)\n   */\n  delete(name: string): void\n  /**\n   * The **`get()`** method of the FormData interface returns the first value associated with a given key from within a `FormData` object.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/get)\n   */\n  get(name: string): (File | string) | null\n  /**\n   * The **`getAll()`** method of the FormData interface returns all the values associated with a given key from within a `FormData` object.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/getAll)\n   */\n  getAll(name: string): (File | string)[]\n  /**\n   * The **`has()`** method of the FormData interface returns whether a `FormData` object contains a certain key.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/has)\n   */\n  has(name: string): boolean\n  /**\n   * The **`set()`** method of the FormData interface sets a new value for an existing key inside a `FormData` object, or adds the key/value if it does not already exist.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/set)\n   */\n  set(name: string, value: string): void\n  /**\n   * The **`set()`** method of the FormData interface sets a new value for an existing key inside a `FormData` object, or adds the key/value if it does not already exist.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FormData/set)\n   */\n  set(name: string, value: Blob, filename?: string): void\n  /* Returns an array of key, value pairs for every entry in the list. */\n  entries(): IterableIterator<[key: string, value: File | string]>\n  /* Returns a list of keys in the list. */\n  keys(): IterableIterator<string>\n  /* Returns a list of values in the list. */\n  values(): IterableIterator<File | string>\n  forEach<This = unknown>(\n    callback: (\n      this: This,\n      value: File | string,\n      key: string,\n      parent: FormData,\n    ) => void,\n    thisArg?: This,\n  ): void\n  [Symbol.iterator](): IterableIterator<[key: string, value: File | string]>\n}\ninterface ContentOptions {\n  html?: boolean\n}\ndeclare class HTMLRewriter {\n  constructor()\n  on(\n    selector: string,\n    handlers: HTMLRewriterElementContentHandlers,\n  ): HTMLRewriter\n  onDocument(handlers: HTMLRewriterDocumentContentHandlers): HTMLRewriter\n  transform(response: Response): Response\n}\ninterface HTMLRewriterElementContentHandlers {\n  element?(element: Element): void | Promise<void>\n  comments?(comment: Comment): void | Promise<void>\n  text?(element: Text): void | Promise<void>\n}\ninterface HTMLRewriterDocumentContentHandlers {\n  doctype?(doctype: Doctype): void | Promise<void>\n  comments?(comment: Comment): void | Promise<void>\n  text?(text: Text): void | Promise<void>\n  end?(end: DocumentEnd): void | Promise<void>\n}\ninterface Doctype {\n  readonly name: string | null\n  readonly publicId: string | null\n  readonly systemId: string | null\n}\ninterface Element {\n  tagName: string\n  readonly attributes: IterableIterator<string[]>\n  readonly removed: boolean\n  readonly namespaceURI: string\n  getAttribute(name: string): string | null\n  hasAttribute(name: string): boolean\n  setAttribute(name: string, value: string): Element\n  removeAttribute(name: string): Element\n  before(\n    content: string | ReadableStream | Response,\n    options?: ContentOptions,\n  ): Element\n  after(\n    content: string | ReadableStream | Response,\n    options?: ContentOptions,\n  ): Element\n  prepend(\n    content: string | ReadableStream | Response,\n    options?: ContentOptions,\n  ): Element\n  append(\n    content: string | ReadableStream | Response,\n    options?: ContentOptions,\n  ): Element\n  replace(\n    content: string | ReadableStream | Response,\n    options?: ContentOptions,\n  ): Element\n  remove(): Element\n  removeAndKeepContent(): Element\n  setInnerContent(\n    content: string | ReadableStream | Response,\n    options?: ContentOptions,\n  ): Element\n  onEndTag(handler: (tag: EndTag) => void | Promise<void>): void\n}\ninterface EndTag {\n  name: string\n  before(\n    content: string | ReadableStream | Response,\n    options?: ContentOptions,\n  ): EndTag\n  after(\n    content: string | ReadableStream | Response,\n    options?: ContentOptions,\n  ): EndTag\n  remove(): EndTag\n}\ninterface Comment {\n  text: string\n  readonly removed: boolean\n  before(content: string, options?: ContentOptions): Comment\n  after(content: string, options?: ContentOptions): Comment\n  replace(content: string, options?: ContentOptions): Comment\n  remove(): Comment\n}\ninterface Text {\n  readonly text: string\n  readonly lastInTextNode: boolean\n  readonly removed: boolean\n  before(\n    content: string | ReadableStream | Response,\n    options?: ContentOptions,\n  ): Text\n  after(\n    content: string | ReadableStream | Response,\n    options?: ContentOptions,\n  ): Text\n  replace(\n    content: string | ReadableStream | Response,\n    options?: ContentOptions,\n  ): Text\n  remove(): Text\n}\ninterface DocumentEnd {\n  append(content: string, options?: ContentOptions): DocumentEnd\n}\n/**\n * This is the event type for `fetch` events dispatched on the ServiceWorkerGlobalScope.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FetchEvent)\n */\ndeclare abstract class FetchEvent extends ExtendableEvent {\n  /**\n   * The **`request`** read-only property of the the event handler.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FetchEvent/request)\n   */\n  readonly request: Request\n  /**\n   * The **`respondWith()`** method of allows you to provide a promise for a Response yourself.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/FetchEvent/respondWith)\n   */\n  respondWith(promise: Response | Promise<Response>): void\n  passThroughOnException(): void\n}\ntype HeadersInit = Headers | Iterable<Iterable<string>> | Record<string, string>\n/**\n * The **`Headers`** interface of the Fetch API allows you to perform various actions on HTTP request and response headers.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers)\n */\ndeclare class Headers {\n  constructor(init?: HeadersInit)\n  /**\n   * The **`get()`** method of the Headers interface returns a byte string of all the values of a header within a `Headers` object with a given name.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/get)\n   */\n  get(name: string): string | null\n  getAll(name: string): string[]\n  /**\n   * The **`getSetCookie()`** method of the Headers interface returns an array containing the values of all Set-Cookie headers associated with a response.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/getSetCookie)\n   */\n  getSetCookie(): string[]\n  /**\n   * The **`has()`** method of the Headers interface returns a boolean stating whether a `Headers` object contains a certain header.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/has)\n   */\n  has(name: string): boolean\n  /**\n   * The **`set()`** method of the Headers interface sets a new value for an existing header inside a `Headers` object, or adds the header if it does not already exist.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/set)\n   */\n  set(name: string, value: string): void\n  /**\n   * The **`append()`** method of the Headers interface appends a new value onto an existing header inside a `Headers` object, or adds the header if it does not already exist.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/append)\n   */\n  append(name: string, value: string): void\n  /**\n   * The **`delete()`** method of the Headers interface deletes a header from the current `Headers` object.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Headers/delete)\n   */\n  delete(name: string): void\n  forEach<This = unknown>(\n    callback: (this: This, value: string, key: string, parent: Headers) => void,\n    thisArg?: This,\n  ): void\n  /* Returns an iterator allowing to go through all key/value pairs contained in this object. */\n  entries(): IterableIterator<[key: string, value: string]>\n  /* Returns an iterator allowing to go through all keys of the key/value pairs contained in this object. */\n  keys(): IterableIterator<string>\n  /* Returns an iterator allowing to go through all values of the key/value pairs contained in this object. */\n  values(): IterableIterator<string>\n  [Symbol.iterator](): IterableIterator<[key: string, value: string]>\n}\ntype BodyInit =\n  | ReadableStream<Uint8Array>\n  | string\n  | ArrayBuffer\n  | ArrayBufferView\n  | Blob\n  | URLSearchParams\n  | FormData\ndeclare abstract class Body {\n  /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/body) */\n  get body(): ReadableStream | null\n  /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bodyUsed) */\n  get bodyUsed(): boolean\n  /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/arrayBuffer) */\n  arrayBuffer(): Promise<ArrayBuffer>\n  /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bytes) */\n  bytes(): Promise<Uint8Array>\n  /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/text) */\n  text(): Promise<string>\n  /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/json) */\n  json<T>(): Promise<T>\n  /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/formData) */\n  formData(): Promise<FormData>\n  /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/blob) */\n  blob(): Promise<Blob>\n}\n/**\n * The **`Response`** interface of the Fetch API represents the response to a request.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response)\n */\ndeclare var Response: {\n  prototype: Response\n  new (body?: BodyInit | null, init?: ResponseInit): Response\n  error(): Response\n  redirect(url: string, status?: number): Response\n  json(any: any, maybeInit?: ResponseInit | Response): Response\n}\n/**\n * The **`Response`** interface of the Fetch API represents the response to a request.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response)\n */\ninterface Response extends Body {\n  /**\n   * The **`clone()`** method of the Response interface creates a clone of a response object, identical in every way, but stored in a different variable.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/clone)\n   */\n  clone(): Response\n  /**\n   * The **`status`** read-only property of the Response interface contains the HTTP status codes of the response.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/status)\n   */\n  status: number\n  /**\n   * The **`statusText`** read-only property of the Response interface contains the status message corresponding to the HTTP status code in Response.status.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/statusText)\n   */\n  statusText: string\n  /**\n   * The **`headers`** read-only property of the with the response.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/headers)\n   */\n  headers: Headers\n  /**\n   * The **`ok`** read-only property of the Response interface contains a Boolean stating whether the response was successful (status in the range 200-299) or not.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/ok)\n   */\n  ok: boolean\n  /**\n   * The **`redirected`** read-only property of the Response interface indicates whether or not the response is the result of a request you made which was redirected.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/redirected)\n   */\n  redirected: boolean\n  /**\n   * The **`url`** read-only property of the Response interface contains the URL of the response.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/url)\n   */\n  url: string\n  webSocket: WebSocket | null\n  cf: any | undefined\n  /**\n   * The **`type`** read-only property of the Response interface contains the type of the response.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/type)\n   */\n  type: 'default' | 'error'\n}\ninterface ResponseInit {\n  status?: number\n  statusText?: string\n  headers?: HeadersInit\n  cf?: any\n  webSocket?: WebSocket | null\n  encodeBody?: 'automatic' | 'manual'\n}\ntype RequestInfo<CfHostMetadata = unknown, Cf = CfProperties<CfHostMetadata>> =\n  | Request<CfHostMetadata, Cf>\n  | string\n/**\n * The **`Request`** interface of the Fetch API represents a resource request.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request)\n */\ndeclare var Request: {\n  prototype: Request\n  new <CfHostMetadata = unknown, Cf = CfProperties<CfHostMetadata>>(\n    input: RequestInfo<CfProperties> | URL,\n    init?: RequestInit<Cf>,\n  ): Request<CfHostMetadata, Cf>\n}\n/**\n * The **`Request`** interface of the Fetch API represents a resource request.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request)\n */\ninterface Request<CfHostMetadata = unknown, Cf = CfProperties<CfHostMetadata>>\n  extends Body {\n  /**\n   * The **`clone()`** method of the Request interface creates a copy of the current `Request` object.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/clone)\n   */\n  clone(): Request<CfHostMetadata, Cf>\n  /**\n   * The **`method`** read-only property of the `POST`, etc.) A String indicating the method of the request.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/method)\n   */\n  method: string\n  /**\n   * The **`url`** read-only property of the Request interface contains the URL of the request.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/url)\n   */\n  url: string\n  /**\n   * The **`headers`** read-only property of the with the request.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/headers)\n   */\n  headers: Headers\n  /**\n   * The **`redirect`** read-only property of the Request interface contains the mode for how redirects are handled.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/redirect)\n   */\n  redirect: string\n  fetcher: Fetcher | null\n  /**\n   * The read-only **`signal`** property of the Request interface returns the AbortSignal associated with the request.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/signal)\n   */\n  signal: AbortSignal\n  cf: Cf | undefined\n  /**\n   * The **`integrity`** read-only property of the Request interface contains the subresource integrity value of the request.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/integrity)\n   */\n  integrity: string\n  /**\n   * The **`keepalive`** read-only property of the Request interface contains the request's `keepalive` setting (`true` or `false`), which indicates whether the browser will keep the associated request alive if the page that initiated it is unloaded before the request is complete.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/keepalive)\n   */\n  keepalive: boolean\n  /**\n   * The **`cache`** read-only property of the Request interface contains the cache mode of the request.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/cache)\n   */\n  cache?: 'no-store' | 'no-cache'\n}\ninterface RequestInit<Cf = CfProperties> {\n  /* A string to set request's method. */\n  method?: string\n  /* A Headers object, an object literal, or an array of two-item arrays to set request's headers. */\n  headers?: HeadersInit\n  /* A BodyInit object or null to set request's body. */\n  body?: BodyInit | null\n  /* A string indicating whether request follows redirects, results in an error upon encountering a redirect, or returns the redirect (in an opaque fashion). Sets request's redirect. */\n  redirect?: string\n  fetcher?: Fetcher | null\n  cf?: Cf\n  /* A string indicating how the request will interact with the browser's cache to set request's cache. */\n  cache?: 'no-store' | 'no-cache'\n  /* A cryptographic hash of the resource to be fetched by request. Sets request's integrity. */\n  integrity?: string\n  /* An AbortSignal to set request's signal. */\n  signal?: AbortSignal | null\n  encodeResponseBody?: 'automatic' | 'manual'\n}\ntype Service<\n  T extends\n    | (new (\n        ...args: any[]\n      ) => Rpc.WorkerEntrypointBranded)\n    | Rpc.WorkerEntrypointBranded\n    | ExportedHandler<any, any, any>\n    | undefined = undefined,\n> = T extends new (\n  ...args: any[]\n) => Rpc.WorkerEntrypointBranded\n  ? Fetcher<InstanceType<T>>\n  : T extends Rpc.WorkerEntrypointBranded\n    ? Fetcher<T>\n    : T extends Exclude<Rpc.EntrypointBranded, Rpc.WorkerEntrypointBranded>\n      ? never\n      : Fetcher<undefined>\ntype Fetcher<\n  T extends Rpc.EntrypointBranded | undefined = undefined,\n  Reserved extends string = never,\n> = (T extends Rpc.EntrypointBranded\n  ? Rpc.Provider<T, Reserved | 'fetch' | 'connect'>\n  : unknown) & {\n  fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>\n  connect(address: SocketAddress | string, options?: SocketOptions): Socket\n}\ninterface KVNamespaceListKey<Metadata, Key extends string = string> {\n  name: Key\n  expiration?: number\n  metadata?: Metadata\n}\ntype KVNamespaceListResult<Metadata, Key extends string = string> =\n  | {\n      list_complete: false\n      keys: KVNamespaceListKey<Metadata, Key>[]\n      cursor: string\n      cacheStatus: string | null\n    }\n  | {\n      list_complete: true\n      keys: KVNamespaceListKey<Metadata, Key>[]\n      cacheStatus: string | null\n    }\ninterface KVNamespace<Key extends string = string> {\n  get(\n    key: Key,\n    options?: Partial<KVNamespaceGetOptions<undefined>>,\n  ): Promise<string | null>\n  get(key: Key, type: 'text'): Promise<string | null>\n  get<ExpectedValue = unknown>(\n    key: Key,\n    type: 'json',\n  ): Promise<ExpectedValue | null>\n  get(key: Key, type: 'arrayBuffer'): Promise<ArrayBuffer | null>\n  get(key: Key, type: 'stream'): Promise<ReadableStream | null>\n  get(key: Key, options?: KVNamespaceGetOptions<'text'>): Promise<string | null>\n  get<ExpectedValue = unknown>(\n    key: Key,\n    options?: KVNamespaceGetOptions<'json'>,\n  ): Promise<ExpectedValue | null>\n  get(\n    key: Key,\n    options?: KVNamespaceGetOptions<'arrayBuffer'>,\n  ): Promise<ArrayBuffer | null>\n  get(\n    key: Key,\n    options?: KVNamespaceGetOptions<'stream'>,\n  ): Promise<ReadableStream | null>\n  get(key: Array<Key>, type: 'text'): Promise<Map<string, string | null>>\n  get<ExpectedValue = unknown>(\n    key: Array<Key>,\n    type: 'json',\n  ): Promise<Map<string, ExpectedValue | null>>\n  get(\n    key: Array<Key>,\n    options?: Partial<KVNamespaceGetOptions<undefined>>,\n  ): Promise<Map<string, string | null>>\n  get(\n    key: Array<Key>,\n    options?: KVNamespaceGetOptions<'text'>,\n  ): Promise<Map<string, string | null>>\n  get<ExpectedValue = unknown>(\n    key: Array<Key>,\n    options?: KVNamespaceGetOptions<'json'>,\n  ): Promise<Map<string, ExpectedValue | null>>\n  list<Metadata = unknown>(\n    options?: KVNamespaceListOptions,\n  ): Promise<KVNamespaceListResult<Metadata, Key>>\n  put(\n    key: Key,\n    value: string | ArrayBuffer | ArrayBufferView | ReadableStream,\n    options?: KVNamespacePutOptions,\n  ): Promise<void>\n  getWithMetadata<Metadata = unknown>(\n    key: Key,\n    options?: Partial<KVNamespaceGetOptions<undefined>>,\n  ): Promise<KVNamespaceGetWithMetadataResult<string, Metadata>>\n  getWithMetadata<Metadata = unknown>(\n    key: Key,\n    type: 'text',\n  ): Promise<KVNamespaceGetWithMetadataResult<string, Metadata>>\n  getWithMetadata<ExpectedValue = unknown, Metadata = unknown>(\n    key: Key,\n    type: 'json',\n  ): Promise<KVNamespaceGetWithMetadataResult<ExpectedValue, Metadata>>\n  getWithMetadata<Metadata = unknown>(\n    key: Key,\n    type: 'arrayBuffer',\n  ): Promise<KVNamespaceGetWithMetadataResult<ArrayBuffer, Metadata>>\n  getWithMetadata<Metadata = unknown>(\n    key: Key,\n    type: 'stream',\n  ): Promise<KVNamespaceGetWithMetadataResult<ReadableStream, Metadata>>\n  getWithMetadata<Metadata = unknown>(\n    key: Key,\n    options: KVNamespaceGetOptions<'text'>,\n  ): Promise<KVNamespaceGetWithMetadataResult<string, Metadata>>\n  getWithMetadata<ExpectedValue = unknown, Metadata = unknown>(\n    key: Key,\n    options: KVNamespaceGetOptions<'json'>,\n  ): Promise<KVNamespaceGetWithMetadataResult<ExpectedValue, Metadata>>\n  getWithMetadata<Metadata = unknown>(\n    key: Key,\n    options: KVNamespaceGetOptions<'arrayBuffer'>,\n  ): Promise<KVNamespaceGetWithMetadataResult<ArrayBuffer, Metadata>>\n  getWithMetadata<Metadata = unknown>(\n    key: Key,\n    options: KVNamespaceGetOptions<'stream'>,\n  ): Promise<KVNamespaceGetWithMetadataResult<ReadableStream, Metadata>>\n  getWithMetadata<Metadata = unknown>(\n    key: Array<Key>,\n    type: 'text',\n  ): Promise<Map<string, KVNamespaceGetWithMetadataResult<string, Metadata>>>\n  getWithMetadata<ExpectedValue = unknown, Metadata = unknown>(\n    key: Array<Key>,\n    type: 'json',\n  ): Promise<\n    Map<string, KVNamespaceGetWithMetadataResult<ExpectedValue, Metadata>>\n  >\n  getWithMetadata<Metadata = unknown>(\n    key: Array<Key>,\n    options?: Partial<KVNamespaceGetOptions<undefined>>,\n  ): Promise<Map<string, KVNamespaceGetWithMetadataResult<string, Metadata>>>\n  getWithMetadata<Metadata = unknown>(\n    key: Array<Key>,\n    options?: KVNamespaceGetOptions<'text'>,\n  ): Promise<Map<string, KVNamespaceGetWithMetadataResult<string, Metadata>>>\n  getWithMetadata<ExpectedValue = unknown, Metadata = unknown>(\n    key: Array<Key>,\n    options?: KVNamespaceGetOptions<'json'>,\n  ): Promise<\n    Map<string, KVNamespaceGetWithMetadataResult<ExpectedValue, Metadata>>\n  >\n  delete(key: Key): Promise<void>\n}\ninterface KVNamespaceListOptions {\n  limit?: number\n  prefix?: string | null\n  cursor?: string | null\n}\ninterface KVNamespaceGetOptions<Type> {\n  type: Type\n  cacheTtl?: number\n}\ninterface KVNamespacePutOptions {\n  expiration?: number\n  expirationTtl?: number\n  metadata?: any | null\n}\ninterface KVNamespaceGetWithMetadataResult<Value, Metadata> {\n  value: Value | null\n  metadata: Metadata | null\n  cacheStatus: string | null\n}\ntype QueueContentType = 'text' | 'bytes' | 'json' | 'v8'\ninterface Queue<Body = unknown> {\n  send(message: Body, options?: QueueSendOptions): Promise<void>\n  sendBatch(\n    messages: Iterable<MessageSendRequest<Body>>,\n    options?: QueueSendBatchOptions,\n  ): Promise<void>\n}\ninterface QueueSendOptions {\n  contentType?: QueueContentType\n  delaySeconds?: number\n}\ninterface QueueSendBatchOptions {\n  delaySeconds?: number\n}\ninterface MessageSendRequest<Body = unknown> {\n  body: Body\n  contentType?: QueueContentType\n  delaySeconds?: number\n}\ninterface QueueRetryOptions {\n  delaySeconds?: number\n}\ninterface Message<Body = unknown> {\n  readonly id: string\n  readonly timestamp: Date\n  readonly body: Body\n  readonly attempts: number\n  retry(options?: QueueRetryOptions): void\n  ack(): void\n}\ninterface QueueEvent<Body = unknown> extends ExtendableEvent {\n  readonly messages: readonly Message<Body>[]\n  readonly queue: string\n  retryAll(options?: QueueRetryOptions): void\n  ackAll(): void\n}\ninterface MessageBatch<Body = unknown> {\n  readonly messages: readonly Message<Body>[]\n  readonly queue: string\n  retryAll(options?: QueueRetryOptions): void\n  ackAll(): void\n}\ninterface R2Error extends Error {\n  readonly name: string\n  readonly code: number\n  readonly message: string\n  readonly action: string\n  readonly stack: any\n}\ninterface R2ListOptions {\n  limit?: number\n  prefix?: string\n  cursor?: string\n  delimiter?: string\n  startAfter?: string\n  include?: ('httpMetadata' | 'customMetadata')[]\n}\ndeclare abstract class R2Bucket {\n  head(key: string): Promise<R2Object | null>\n  get(\n    key: string,\n    options: R2GetOptions & {\n      onlyIf: R2Conditional | Headers\n    },\n  ): Promise<R2ObjectBody | R2Object | null>\n  get(key: string, options?: R2GetOptions): Promise<R2ObjectBody | null>\n  put(\n    key: string,\n    value:\n      | ReadableStream\n      | ArrayBuffer\n      | ArrayBufferView\n      | string\n      | null\n      | Blob,\n    options?: R2PutOptions & {\n      onlyIf: R2Conditional | Headers\n    },\n  ): Promise<R2Object | null>\n  put(\n    key: string,\n    value:\n      | ReadableStream\n      | ArrayBuffer\n      | ArrayBufferView\n      | string\n      | null\n      | Blob,\n    options?: R2PutOptions,\n  ): Promise<R2Object>\n  createMultipartUpload(\n    key: string,\n    options?: R2MultipartOptions,\n  ): Promise<R2MultipartUpload>\n  resumeMultipartUpload(key: string, uploadId: string): R2MultipartUpload\n  delete(keys: string | string[]): Promise<void>\n  list(options?: R2ListOptions): Promise<R2Objects>\n}\ninterface R2MultipartUpload {\n  readonly key: string\n  readonly uploadId: string\n  uploadPart(\n    partNumber: number,\n    value: ReadableStream | (ArrayBuffer | ArrayBufferView) | string | Blob,\n    options?: R2UploadPartOptions,\n  ): Promise<R2UploadedPart>\n  abort(): Promise<void>\n  complete(uploadedParts: R2UploadedPart[]): Promise<R2Object>\n}\ninterface R2UploadedPart {\n  partNumber: number\n  etag: string\n}\ndeclare abstract class R2Object {\n  readonly key: string\n  readonly version: string\n  readonly size: number\n  readonly etag: string\n  readonly httpEtag: string\n  readonly checksums: R2Checksums\n  readonly uploaded: Date\n  readonly httpMetadata?: R2HTTPMetadata\n  readonly customMetadata?: Record<string, string>\n  readonly range?: R2Range\n  readonly storageClass: string\n  readonly ssecKeyMd5?: string\n  writeHttpMetadata(headers: Headers): void\n}\ninterface R2ObjectBody extends R2Object {\n  get body(): ReadableStream\n  get bodyUsed(): boolean\n  arrayBuffer(): Promise<ArrayBuffer>\n  bytes(): Promise<Uint8Array>\n  text(): Promise<string>\n  json<T>(): Promise<T>\n  blob(): Promise<Blob>\n}\ntype R2Range =\n  | {\n      offset: number\n      length?: number\n    }\n  | {\n      offset?: number\n      length: number\n    }\n  | {\n      suffix: number\n    }\ninterface R2Conditional {\n  etagMatches?: string\n  etagDoesNotMatch?: string\n  uploadedBefore?: Date\n  uploadedAfter?: Date\n  secondsGranularity?: boolean\n}\ninterface R2GetOptions {\n  onlyIf?: R2Conditional | Headers\n  range?: R2Range | Headers\n  ssecKey?: ArrayBuffer | string\n}\ninterface R2PutOptions {\n  onlyIf?: R2Conditional | Headers\n  httpMetadata?: R2HTTPMetadata | Headers\n  customMetadata?: Record<string, string>\n  md5?: (ArrayBuffer | ArrayBufferView) | string\n  sha1?: (ArrayBuffer | ArrayBufferView) | string\n  sha256?: (ArrayBuffer | ArrayBufferView) | string\n  sha384?: (ArrayBuffer | ArrayBufferView) | string\n  sha512?: (ArrayBuffer | ArrayBufferView) | string\n  storageClass?: string\n  ssecKey?: ArrayBuffer | string\n}\ninterface R2MultipartOptions {\n  httpMetadata?: R2HTTPMetadata | Headers\n  customMetadata?: Record<string, string>\n  storageClass?: string\n  ssecKey?: ArrayBuffer | string\n}\ninterface R2Checksums {\n  readonly md5?: ArrayBuffer\n  readonly sha1?: ArrayBuffer\n  readonly sha256?: ArrayBuffer\n  readonly sha384?: ArrayBuffer\n  readonly sha512?: ArrayBuffer\n  toJSON(): R2StringChecksums\n}\ninterface R2StringChecksums {\n  md5?: string\n  sha1?: string\n  sha256?: string\n  sha384?: string\n  sha512?: string\n}\ninterface R2HTTPMetadata {\n  contentType?: string\n  contentLanguage?: string\n  contentDisposition?: string\n  contentEncoding?: string\n  cacheControl?: string\n  cacheExpiry?: Date\n}\ntype R2Objects = {\n  objects: R2Object[]\n  delimitedPrefixes: string[]\n} & (\n  | {\n      truncated: true\n      cursor: string\n    }\n  | {\n      truncated: false\n    }\n)\ninterface R2UploadPartOptions {\n  ssecKey?: ArrayBuffer | string\n}\ndeclare abstract class ScheduledEvent extends ExtendableEvent {\n  readonly scheduledTime: number\n  readonly cron: string\n  noRetry(): void\n}\ninterface ScheduledController {\n  readonly scheduledTime: number\n  readonly cron: string\n  noRetry(): void\n}\ninterface QueuingStrategy<T = any> {\n  highWaterMark?: number | bigint\n  size?: (chunk: T) => number | bigint\n}\ninterface UnderlyingSink<W = any> {\n  type?: string\n  start?: (controller: WritableStreamDefaultController) => void | Promise<void>\n  write?: (\n    chunk: W,\n    controller: WritableStreamDefaultController,\n  ) => void | Promise<void>\n  abort?: (reason: any) => void | Promise<void>\n  close?: () => void | Promise<void>\n}\ninterface UnderlyingByteSource {\n  type: 'bytes'\n  autoAllocateChunkSize?: number\n  start?: (controller: ReadableByteStreamController) => void | Promise<void>\n  pull?: (controller: ReadableByteStreamController) => void | Promise<void>\n  cancel?: (reason: any) => void | Promise<void>\n}\ninterface UnderlyingSource<R = any> {\n  type?: '' | undefined\n  start?: (\n    controller: ReadableStreamDefaultController<R>,\n  ) => void | Promise<void>\n  pull?: (\n    controller: ReadableStreamDefaultController<R>,\n  ) => void | Promise<void>\n  cancel?: (reason: any) => void | Promise<void>\n  expectedLength?: number | bigint\n}\ninterface Transformer<I = any, O = any> {\n  readableType?: string\n  writableType?: string\n  start?: (\n    controller: TransformStreamDefaultController<O>,\n  ) => void | Promise<void>\n  transform?: (\n    chunk: I,\n    controller: TransformStreamDefaultController<O>,\n  ) => void | Promise<void>\n  flush?: (\n    controller: TransformStreamDefaultController<O>,\n  ) => void | Promise<void>\n  cancel?: (reason: any) => void | Promise<void>\n  expectedLength?: number\n}\ninterface StreamPipeOptions {\n  preventAbort?: boolean\n  preventCancel?: boolean\n  /**\n   * Pipes this readable stream to a given writable stream destination. The way in which the piping process behaves under various error conditions can be customized with a number of passed options. It returns a promise that fulfills when the piping process completes successfully, or rejects if any errors were encountered.\n   *\n   * Piping a stream will lock it for the duration of the pipe, preventing any other consumer from acquiring a reader.\n   *\n   * Errors and closures of the source and destination streams propagate as follows:\n   *\n   * An error in this source readable stream will abort destination, unless preventAbort is truthy. The returned promise will be rejected with the source's error, or with any error that occurs during aborting the destination.\n   *\n   * An error in destination will cancel this source readable stream, unless preventCancel is truthy. The returned promise will be rejected with the destination's error, or with any error that occurs during canceling the source.\n   *\n   * When this source readable stream closes, destination will be closed, unless preventClose is truthy. The returned promise will be fulfilled once this process completes, unless an error is encountered while closing the destination, in which case it will be rejected with that error.\n   *\n   * If destination starts out closed or closing, this source readable stream will be canceled, unless preventCancel is true. The returned promise will be rejected with an error indicating piping to a closed stream failed, or with any error that occurs during canceling the source.\n   *\n   * The signal option can be set to an AbortSignal to allow aborting an ongoing pipe operation via the corresponding AbortController. In this case, this source readable stream will be canceled, and destination aborted, unless the respective options preventCancel or preventAbort are set.\n   */\n  preventClose?: boolean\n  signal?: AbortSignal\n}\ntype ReadableStreamReadResult<R = any> =\n  | {\n      done: false\n      value: R\n    }\n  | {\n      done: true\n      value?: undefined\n    }\n/**\n * The `ReadableStream` interface of the Streams API represents a readable stream of byte data.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream)\n */\ninterface ReadableStream<R = any> {\n  /**\n   * The **`locked`** read-only property of the ReadableStream interface returns whether or not the readable stream is locked to a reader.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/locked)\n   */\n  get locked(): boolean\n  /**\n   * The **`cancel()`** method of the ReadableStream interface returns a Promise that resolves when the stream is canceled.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/cancel)\n   */\n  cancel(reason?: any): Promise<void>\n  /**\n   * The **`getReader()`** method of the ReadableStream interface creates a reader and locks the stream to it.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/getReader)\n   */\n  getReader(): ReadableStreamDefaultReader<R>\n  /**\n   * The **`getReader()`** method of the ReadableStream interface creates a reader and locks the stream to it.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/getReader)\n   */\n  getReader(options: ReadableStreamGetReaderOptions): ReadableStreamBYOBReader\n  /**\n   * The **`pipeThrough()`** method of the ReadableStream interface provides a chainable way of piping the current stream through a transform stream or any other writable/readable pair.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/pipeThrough)\n   */\n  pipeThrough<T>(\n    transform: ReadableWritablePair<T, R>,\n    options?: StreamPipeOptions,\n  ): ReadableStream<T>\n  /**\n   * The **`pipeTo()`** method of the ReadableStream interface pipes the current `ReadableStream` to a given WritableStream and returns a Promise that fulfills when the piping process completes successfully, or rejects if any errors were encountered.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/pipeTo)\n   */\n  pipeTo(\n    destination: WritableStream<R>,\n    options?: StreamPipeOptions,\n  ): Promise<void>\n  /**\n   * The **`tee()`** method of the two-element array containing the two resulting branches as new ReadableStream instances.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream/tee)\n   */\n  tee(): [ReadableStream<R>, ReadableStream<R>]\n  values(options?: ReadableStreamValuesOptions): AsyncIterableIterator<R>\n  [Symbol.asyncIterator](\n    options?: ReadableStreamValuesOptions,\n  ): AsyncIterableIterator<R>\n}\n/**\n * The `ReadableStream` interface of the Streams API represents a readable stream of byte data.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStream)\n */\ndeclare const ReadableStream: {\n  prototype: ReadableStream\n  new (\n    underlyingSource: UnderlyingByteSource,\n    strategy?: QueuingStrategy<Uint8Array>,\n  ): ReadableStream<Uint8Array>\n  new <R = any>(\n    underlyingSource?: UnderlyingSource<R>,\n    strategy?: QueuingStrategy<R>,\n  ): ReadableStream<R>\n}\n/**\n * The **`ReadableStreamDefaultReader`** interface of the Streams API represents a default reader that can be used to read stream data supplied from a network (such as a fetch request).\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultReader)\n */\ndeclare class ReadableStreamDefaultReader<R = any> {\n  constructor(stream: ReadableStream)\n  get closed(): Promise<void>\n  cancel(reason?: any): Promise<void>\n  /**\n   * The **`read()`** method of the ReadableStreamDefaultReader interface returns a Promise providing access to the next chunk in the stream's internal queue.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultReader/read)\n   */\n  read(): Promise<ReadableStreamReadResult<R>>\n  /**\n   * The **`releaseLock()`** method of the ReadableStreamDefaultReader interface releases the reader's lock on the stream.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultReader/releaseLock)\n   */\n  releaseLock(): void\n}\n/**\n * The `ReadableStreamBYOBReader` interface of the Streams API defines a reader for a ReadableStream that supports zero-copy reading from an underlying byte source.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBReader)\n */\ndeclare class ReadableStreamBYOBReader {\n  constructor(stream: ReadableStream)\n  get closed(): Promise<void>\n  cancel(reason?: any): Promise<void>\n  /**\n   * The **`read()`** method of the ReadableStreamBYOBReader interface is used to read data into a view on a user-supplied buffer from an associated readable byte stream.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBReader/read)\n   */\n  read<T extends ArrayBufferView>(view: T): Promise<ReadableStreamReadResult<T>>\n  /**\n   * The **`releaseLock()`** method of the ReadableStreamBYOBReader interface releases the reader's lock on the stream.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBReader/releaseLock)\n   */\n  releaseLock(): void\n  readAtLeast<T extends ArrayBufferView>(\n    minElements: number,\n    view: T,\n  ): Promise<ReadableStreamReadResult<T>>\n}\ninterface ReadableStreamBYOBReaderReadableStreamBYOBReaderReadOptions {\n  min?: number\n}\ninterface ReadableStreamGetReaderOptions {\n  /**\n   * Creates a ReadableStreamBYOBReader and locks the stream to the new reader.\n   *\n   * This call behaves the same way as the no-argument variant, except that it only works on readable byte streams, i.e. streams which were constructed specifically with the ability to handle \"bring your own buffer\" reading. The returned BYOB reader provides the ability to directly read individual chunks from the stream via its read() method, into developer-supplied buffers, allowing more precise control over allocation.\n   */\n  mode: 'byob'\n}\n/**\n * The **`ReadableStreamBYOBRequest`** interface of the Streams API represents a 'pull request' for data from an underlying source that will made as a zero-copy transfer to a consumer (bypassing the stream's internal queues).\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBRequest)\n */\ndeclare abstract class ReadableStreamBYOBRequest {\n  /**\n   * The **`view`** getter property of the ReadableStreamBYOBRequest interface returns the current view.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBRequest/view)\n   */\n  get view(): Uint8Array | null\n  /**\n   * The **`respond()`** method of the ReadableStreamBYOBRequest interface is used to signal to the associated readable byte stream that the specified number of bytes were written into the ReadableStreamBYOBRequest.view.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBRequest/respond)\n   */\n  respond(bytesWritten: number): void\n  /**\n   * The **`respondWithNewView()`** method of the ReadableStreamBYOBRequest interface specifies a new view that the consumer of the associated readable byte stream should write to instead of ReadableStreamBYOBRequest.view.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBRequest/respondWithNewView)\n   */\n  respondWithNewView(view: ArrayBuffer | ArrayBufferView): void\n  get atLeast(): number | null\n}\n/**\n * The **`ReadableStreamDefaultController`** interface of the Streams API represents a controller allowing control of a ReadableStream's state and internal queue.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultController)\n */\ndeclare abstract class ReadableStreamDefaultController<R = any> {\n  /**\n   * The **`desiredSize`** read-only property of the required to fill the stream's internal queue.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultController/desiredSize)\n   */\n  get desiredSize(): number | null\n  /**\n   * The **`close()`** method of the ReadableStreamDefaultController interface closes the associated stream.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultController/close)\n   */\n  close(): void\n  /**\n   * The **`enqueue()`** method of the ```js-nolint enqueue(chunk) ``` - `chunk` - : The chunk to enqueue.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultController/enqueue)\n   */\n  enqueue(chunk?: R): void\n  /**\n   * The **`error()`** method of the with the associated stream to error.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableStreamDefaultController/error)\n   */\n  error(reason: any): void\n}\n/**\n * The **`ReadableByteStreamController`** interface of the Streams API represents a controller for a readable byte stream.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController)\n */\ndeclare abstract class ReadableByteStreamController {\n  /**\n   * The **`byobRequest`** read-only property of the ReadableByteStreamController interface returns the current BYOB request, or `null` if there are no pending requests.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController/byobRequest)\n   */\n  get byobRequest(): ReadableStreamBYOBRequest | null\n  /**\n   * The **`desiredSize`** read-only property of the ReadableByteStreamController interface returns the number of bytes required to fill the stream's internal queue to its 'desired size'.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController/desiredSize)\n   */\n  get desiredSize(): number | null\n  /**\n   * The **`close()`** method of the ReadableByteStreamController interface closes the associated stream.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController/close)\n   */\n  close(): void\n  /**\n   * The **`enqueue()`** method of the ReadableByteStreamController interface enqueues a given chunk on the associated readable byte stream (the chunk is copied into the stream's internal queues).\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController/enqueue)\n   */\n  enqueue(chunk: ArrayBuffer | ArrayBufferView): void\n  /**\n   * The **`error()`** method of the ReadableByteStreamController interface causes any future interactions with the associated stream to error with the specified reason.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ReadableByteStreamController/error)\n   */\n  error(reason: any): void\n}\n/**\n * The **`WritableStreamDefaultController`** interface of the Streams API represents a controller allowing control of a WritableStream's state.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultController)\n */\ndeclare abstract class WritableStreamDefaultController {\n  /**\n   * The read-only **`signal`** property of the WritableStreamDefaultController interface returns the AbortSignal associated with the controller.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultController/signal)\n   */\n  get signal(): AbortSignal\n  /**\n   * The **`error()`** method of the with the associated stream to error.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultController/error)\n   */\n  error(reason?: any): void\n}\n/**\n * The **`TransformStreamDefaultController`** interface of the Streams API provides methods to manipulate the associated ReadableStream and WritableStream.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStreamDefaultController)\n */\ndeclare abstract class TransformStreamDefaultController<O = any> {\n  /**\n   * The **`desiredSize`** read-only property of the TransformStreamDefaultController interface returns the desired size to fill the queue of the associated ReadableStream.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStreamDefaultController/desiredSize)\n   */\n  get desiredSize(): number | null\n  /**\n   * The **`enqueue()`** method of the TransformStreamDefaultController interface enqueues the given chunk in the readable side of the stream.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStreamDefaultController/enqueue)\n   */\n  enqueue(chunk?: O): void\n  /**\n   * The **`error()`** method of the TransformStreamDefaultController interface errors both sides of the stream.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStreamDefaultController/error)\n   */\n  error(reason: any): void\n  /**\n   * The **`terminate()`** method of the TransformStreamDefaultController interface closes the readable side and errors the writable side of the stream.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStreamDefaultController/terminate)\n   */\n  terminate(): void\n}\ninterface ReadableWritablePair<R = any, W = any> {\n  readable: ReadableStream<R>\n  /**\n   * Provides a convenient, chainable way of piping this readable stream through a transform stream (or any other { writable, readable } pair). It simply pipes the stream into the writable side of the supplied pair, and returns the readable side for further use.\n   *\n   * Piping a stream will lock it for the duration of the pipe, preventing any other consumer from acquiring a reader.\n   */\n  writable: WritableStream<W>\n}\n/**\n * The **`WritableStream`** interface of the Streams API provides a standard abstraction for writing streaming data to a destination, known as a sink.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStream)\n */\ndeclare class WritableStream<W = any> {\n  constructor(\n    underlyingSink?: UnderlyingSink,\n    queuingStrategy?: QueuingStrategy,\n  )\n  /**\n   * The **`locked`** read-only property of the WritableStream interface returns a boolean indicating whether the `WritableStream` is locked to a writer.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStream/locked)\n   */\n  get locked(): boolean\n  /**\n   * The **`abort()`** method of the WritableStream interface aborts the stream, signaling that the producer can no longer successfully write to the stream and it is to be immediately moved to an error state, with any queued writes discarded.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStream/abort)\n   */\n  abort(reason?: any): Promise<void>\n  /**\n   * The **`close()`** method of the WritableStream interface closes the associated stream.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStream/close)\n   */\n  close(): Promise<void>\n  /**\n   * The **`getWriter()`** method of the WritableStream interface returns a new instance of WritableStreamDefaultWriter and locks the stream to that instance.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStream/getWriter)\n   */\n  getWriter(): WritableStreamDefaultWriter<W>\n}\n/**\n * The **`WritableStreamDefaultWriter`** interface of the Streams API is the object returned by WritableStream.getWriter() and once created locks the writer to the `WritableStream` ensuring that no other streams can write to the underlying sink.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter)\n */\ndeclare class WritableStreamDefaultWriter<W = any> {\n  constructor(stream: WritableStream)\n  /**\n   * The **`closed`** read-only property of the the stream errors or the writer's lock is released.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/closed)\n   */\n  get closed(): Promise<void>\n  /**\n   * The **`ready`** read-only property of the that resolves when the desired size of the stream's internal queue transitions from non-positive to positive, signaling that it is no longer applying backpressure.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/ready)\n   */\n  get ready(): Promise<void>\n  /**\n   * The **`desiredSize`** read-only property of the to fill the stream's internal queue.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/desiredSize)\n   */\n  get desiredSize(): number | null\n  /**\n   * The **`abort()`** method of the the producer can no longer successfully write to the stream and it is to be immediately moved to an error state, with any queued writes discarded.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/abort)\n   */\n  abort(reason?: any): Promise<void>\n  /**\n   * The **`close()`** method of the stream.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/close)\n   */\n  close(): Promise<void>\n  /**\n   * The **`write()`** method of the operation.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/write)\n   */\n  write(chunk?: W): Promise<void>\n  /**\n   * The **`releaseLock()`** method of the corresponding stream.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WritableStreamDefaultWriter/releaseLock)\n   */\n  releaseLock(): void\n}\n/**\n * The **`TransformStream`** interface of the Streams API represents a concrete implementation of the pipe chain _transform stream_ concept.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStream)\n */\ndeclare class TransformStream<I = any, O = any> {\n  constructor(\n    transformer?: Transformer<I, O>,\n    writableStrategy?: QueuingStrategy<I>,\n    readableStrategy?: QueuingStrategy<O>,\n  )\n  /**\n   * The **`readable`** read-only property of the TransformStream interface returns the ReadableStream instance controlled by this `TransformStream`.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStream/readable)\n   */\n  get readable(): ReadableStream<O>\n  /**\n   * The **`writable`** read-only property of the TransformStream interface returns the WritableStream instance controlled by this `TransformStream`.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TransformStream/writable)\n   */\n  get writable(): WritableStream<I>\n}\ndeclare class FixedLengthStream extends IdentityTransformStream {\n  constructor(\n    expectedLength: number | bigint,\n    queuingStrategy?: IdentityTransformStreamQueuingStrategy,\n  )\n}\ndeclare class IdentityTransformStream extends TransformStream<\n  ArrayBuffer | ArrayBufferView,\n  Uint8Array\n> {\n  constructor(queuingStrategy?: IdentityTransformStreamQueuingStrategy)\n}\ninterface IdentityTransformStreamQueuingStrategy {\n  highWaterMark?: number | bigint\n}\ninterface ReadableStreamValuesOptions {\n  preventCancel?: boolean\n}\n/**\n * The **`CompressionStream`** interface of the Compression Streams API is an API for compressing a stream of data.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CompressionStream)\n */\ndeclare class CompressionStream extends TransformStream<\n  ArrayBuffer | ArrayBufferView,\n  Uint8Array\n> {\n  constructor(format: 'gzip' | 'deflate' | 'deflate-raw')\n}\n/**\n * The **`DecompressionStream`** interface of the Compression Streams API is an API for decompressing a stream of data.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/DecompressionStream)\n */\ndeclare class DecompressionStream extends TransformStream<\n  ArrayBuffer | ArrayBufferView,\n  Uint8Array\n> {\n  constructor(format: 'gzip' | 'deflate' | 'deflate-raw')\n}\n/**\n * The **`TextEncoderStream`** interface of the Encoding API converts a stream of strings into bytes in the UTF-8 encoding.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextEncoderStream)\n */\ndeclare class TextEncoderStream extends TransformStream<string, Uint8Array> {\n  constructor()\n  get encoding(): string\n}\n/**\n * The **`TextDecoderStream`** interface of the Encoding API converts a stream of text in a binary encoding, such as UTF-8 etc., to a stream of strings.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextDecoderStream)\n */\ndeclare class TextDecoderStream extends TransformStream<\n  ArrayBuffer | ArrayBufferView,\n  string\n> {\n  constructor(label?: string, options?: TextDecoderStreamTextDecoderStreamInit)\n  get encoding(): string\n  get fatal(): boolean\n  get ignoreBOM(): boolean\n}\ninterface TextDecoderStreamTextDecoderStreamInit {\n  fatal?: boolean\n  ignoreBOM?: boolean\n}\n/**\n * The **`ByteLengthQueuingStrategy`** interface of the Streams API provides a built-in byte length queuing strategy that can be used when constructing streams.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ByteLengthQueuingStrategy)\n */\ndeclare class ByteLengthQueuingStrategy\n  implements QueuingStrategy<ArrayBufferView>\n{\n  constructor(init: QueuingStrategyInit)\n  /**\n   * The read-only **`ByteLengthQueuingStrategy.highWaterMark`** property returns the total number of bytes that can be contained in the internal queue before backpressure is applied.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/ByteLengthQueuingStrategy/highWaterMark)\n   */\n  get highWaterMark(): number\n  /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/ByteLengthQueuingStrategy/size) */\n  get size(): (chunk?: any) => number\n}\n/**\n * The **`CountQueuingStrategy`** interface of the Streams API provides a built-in chunk counting queuing strategy that can be used when constructing streams.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CountQueuingStrategy)\n */\ndeclare class CountQueuingStrategy implements QueuingStrategy {\n  constructor(init: QueuingStrategyInit)\n  /**\n   * The read-only **`CountQueuingStrategy.highWaterMark`** property returns the total number of chunks that can be contained in the internal queue before backpressure is applied.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CountQueuingStrategy/highWaterMark)\n   */\n  get highWaterMark(): number\n  /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/CountQueuingStrategy/size) */\n  get size(): (chunk?: any) => number\n}\ninterface QueuingStrategyInit {\n  /**\n   * Creates a new ByteLengthQueuingStrategy with the provided high water mark.\n   *\n   * Note that the provided high water mark will not be validated ahead of time. Instead, if it is negative, NaN, or not a number, the resulting ByteLengthQueuingStrategy will cause the corresponding stream constructor to throw.\n   */\n  highWaterMark: number\n}\ninterface ScriptVersion {\n  id?: string\n  tag?: string\n  message?: string\n}\ndeclare abstract class TailEvent extends ExtendableEvent {\n  readonly events: TraceItem[]\n  readonly traces: TraceItem[]\n}\ninterface TraceItem {\n  readonly event:\n    | (\n        | TraceItemFetchEventInfo\n        | TraceItemJsRpcEventInfo\n        | TraceItemScheduledEventInfo\n        | TraceItemAlarmEventInfo\n        | TraceItemQueueEventInfo\n        | TraceItemEmailEventInfo\n        | TraceItemTailEventInfo\n        | TraceItemCustomEventInfo\n        | TraceItemHibernatableWebSocketEventInfo\n      )\n    | null\n  readonly eventTimestamp: number | null\n  readonly logs: TraceLog[]\n  readonly exceptions: TraceException[]\n  readonly diagnosticsChannelEvents: TraceDiagnosticChannelEvent[]\n  readonly scriptName: string | null\n  readonly entrypoint?: string\n  readonly scriptVersion?: ScriptVersion\n  readonly dispatchNamespace?: string\n  readonly scriptTags?: string[]\n  readonly durableObjectId?: string\n  readonly outcome: string\n  readonly executionModel: string\n  readonly truncated: boolean\n  readonly cpuTime: number\n  readonly wallTime: number\n}\ninterface TraceItemAlarmEventInfo {\n  readonly scheduledTime: Date\n}\ntype TraceItemCustomEventInfo = {}\ninterface TraceItemScheduledEventInfo {\n  readonly scheduledTime: number\n  readonly cron: string\n}\ninterface TraceItemQueueEventInfo {\n  readonly queue: string\n  readonly batchSize: number\n}\ninterface TraceItemEmailEventInfo {\n  readonly mailFrom: string\n  readonly rcptTo: string\n  readonly rawSize: number\n}\ninterface TraceItemTailEventInfo {\n  readonly consumedEvents: TraceItemTailEventInfoTailItem[]\n}\ninterface TraceItemTailEventInfoTailItem {\n  readonly scriptName: string | null\n}\ninterface TraceItemFetchEventInfo {\n  readonly response?: TraceItemFetchEventInfoResponse\n  readonly request: TraceItemFetchEventInfoRequest\n}\ninterface TraceItemFetchEventInfoRequest {\n  readonly cf?: any\n  readonly headers: Record<string, string>\n  readonly method: string\n  readonly url: string\n  getUnredacted(): TraceItemFetchEventInfoRequest\n}\ninterface TraceItemFetchEventInfoResponse {\n  readonly status: number\n}\ninterface TraceItemJsRpcEventInfo {\n  readonly rpcMethod: string\n}\ninterface TraceItemHibernatableWebSocketEventInfo {\n  readonly getWebSocketEvent:\n    | TraceItemHibernatableWebSocketEventInfoMessage\n    | TraceItemHibernatableWebSocketEventInfoClose\n    | TraceItemHibernatableWebSocketEventInfoError\n}\ninterface TraceItemHibernatableWebSocketEventInfoMessage {\n  readonly webSocketEventType: string\n}\ninterface TraceItemHibernatableWebSocketEventInfoClose {\n  readonly webSocketEventType: string\n  readonly code: number\n  readonly wasClean: boolean\n}\ninterface TraceItemHibernatableWebSocketEventInfoError {\n  readonly webSocketEventType: string\n}\ninterface TraceLog {\n  readonly timestamp: number\n  readonly level: string\n  readonly message: any\n}\ninterface TraceException {\n  readonly timestamp: number\n  readonly message: string\n  readonly name: string\n  readonly stack?: string\n}\ninterface TraceDiagnosticChannelEvent {\n  readonly timestamp: number\n  readonly channel: string\n  readonly message: any\n}\ninterface TraceMetrics {\n  readonly cpuTime: number\n  readonly wallTime: number\n}\ninterface UnsafeTraceMetrics {\n  fromTrace(item: TraceItem): TraceMetrics\n}\n/**\n * The **`URL`** interface is used to parse, construct, normalize, and encode URL.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL)\n */\ndeclare class URL {\n  constructor(url: string | URL, base?: string | URL)\n  /**\n   * The **`origin`** read-only property of the URL interface returns a string containing the Unicode serialization of the origin of the represented URL.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/origin)\n   */\n  get origin(): string\n  /**\n   * The **`href`** property of the URL interface is a string containing the whole URL.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/href)\n   */\n  get href(): string\n  /**\n   * The **`href`** property of the URL interface is a string containing the whole URL.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/href)\n   */\n  set href(value: string)\n  /**\n   * The **`protocol`** property of the URL interface is a string containing the protocol or scheme of the URL, including the final `':'`.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/protocol)\n   */\n  get protocol(): string\n  /**\n   * The **`protocol`** property of the URL interface is a string containing the protocol or scheme of the URL, including the final `':'`.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/protocol)\n   */\n  set protocol(value: string)\n  /**\n   * The **`username`** property of the URL interface is a string containing the username component of the URL.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/username)\n   */\n  get username(): string\n  /**\n   * The **`username`** property of the URL interface is a string containing the username component of the URL.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/username)\n   */\n  set username(value: string)\n  /**\n   * The **`password`** property of the URL interface is a string containing the password component of the URL.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/password)\n   */\n  get password(): string\n  /**\n   * The **`password`** property of the URL interface is a string containing the password component of the URL.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/password)\n   */\n  set password(value: string)\n  /**\n   * The **`host`** property of the URL interface is a string containing the host, which is the URL.hostname, and then, if the port of the URL is nonempty, a `':'`, followed by the URL.port of the URL.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/host)\n   */\n  get host(): string\n  /**\n   * The **`host`** property of the URL interface is a string containing the host, which is the URL.hostname, and then, if the port of the URL is nonempty, a `':'`, followed by the URL.port of the URL.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/host)\n   */\n  set host(value: string)\n  /**\n   * The **`hostname`** property of the URL interface is a string containing either the domain name or IP address of the URL.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/hostname)\n   */\n  get hostname(): string\n  /**\n   * The **`hostname`** property of the URL interface is a string containing either the domain name or IP address of the URL.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/hostname)\n   */\n  set hostname(value: string)\n  /**\n   * The **`port`** property of the URL interface is a string containing the port number of the URL.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/port)\n   */\n  get port(): string\n  /**\n   * The **`port`** property of the URL interface is a string containing the port number of the URL.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/port)\n   */\n  set port(value: string)\n  /**\n   * The **`pathname`** property of the URL interface represents a location in a hierarchical structure.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/pathname)\n   */\n  get pathname(): string\n  /**\n   * The **`pathname`** property of the URL interface represents a location in a hierarchical structure.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/pathname)\n   */\n  set pathname(value: string)\n  /**\n   * The **`search`** property of the URL interface is a search string, also called a _query string_, that is a string containing a `'?'` followed by the parameters of the URL.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/search)\n   */\n  get search(): string\n  /**\n   * The **`search`** property of the URL interface is a search string, also called a _query string_, that is a string containing a `'?'` followed by the parameters of the URL.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/search)\n   */\n  set search(value: string)\n  /**\n   * The **`hash`** property of the URL interface is a string containing a `'#'` followed by the fragment identifier of the URL.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/hash)\n   */\n  get hash(): string\n  /**\n   * The **`hash`** property of the URL interface is a string containing a `'#'` followed by the fragment identifier of the URL.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/hash)\n   */\n  set hash(value: string)\n  /**\n   * The **`searchParams`** read-only property of the access to the [MISSING: httpmethod('GET')] decoded query arguments contained in the URL.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/searchParams)\n   */\n  get searchParams(): URLSearchParams\n  /**\n   * The **`toJSON()`** method of the URL interface returns a string containing a serialized version of the URL, although in practice it seems to have the same effect as ```js-nolint toJSON() ``` None.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/toJSON)\n   */\n  toJSON(): string\n  /*function toString() { [native code] }*/\n  toString(): string\n  /**\n   * The **`URL.canParse()`** static method of the URL interface returns a boolean indicating whether or not an absolute URL, or a relative URL combined with a base URL, are parsable and valid.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/canParse_static)\n   */\n  static canParse(url: string, base?: string): boolean\n  /**\n   * The **`URL.parse()`** static method of the URL interface returns a newly created URL object representing the URL defined by the parameters.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/parse_static)\n   */\n  static parse(url: string, base?: string): URL | null\n  /**\n   * The **`createObjectURL()`** static method of the URL interface creates a string containing a URL representing the object given in the parameter.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/createObjectURL_static)\n   */\n  static createObjectURL(object: File | Blob): string\n  /**\n   * The **`revokeObjectURL()`** static method of the URL interface releases an existing object URL which was previously created by calling Call this method when you've finished using an object URL to let the browser know not to keep the reference to the file any longer.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/revokeObjectURL_static)\n   */\n  static revokeObjectURL(object_url: string): void\n}\n/**\n * The **`URLSearchParams`** interface defines utility methods to work with the query string of a URL.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams)\n */\ndeclare class URLSearchParams {\n  constructor(\n    init?: Iterable<Iterable<string>> | Record<string, string> | string,\n  )\n  /**\n   * The **`size`** read-only property of the URLSearchParams interface indicates the total number of search parameter entries.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/size)\n   */\n  get size(): number\n  /**\n   * The **`append()`** method of the URLSearchParams interface appends a specified key/value pair as a new search parameter.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/append)\n   */\n  append(name: string, value: string): void\n  /**\n   * The **`delete()`** method of the URLSearchParams interface deletes specified parameters and their associated value(s) from the list of all search parameters.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/delete)\n   */\n  delete(name: string, value?: string): void\n  /**\n   * The **`get()`** method of the URLSearchParams interface returns the first value associated to the given search parameter.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/get)\n   */\n  get(name: string): string | null\n  /**\n   * The **`getAll()`** method of the URLSearchParams interface returns all the values associated with a given search parameter as an array.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/getAll)\n   */\n  getAll(name: string): string[]\n  /**\n   * The **`has()`** method of the URLSearchParams interface returns a boolean value that indicates whether the specified parameter is in the search parameters.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/has)\n   */\n  has(name: string, value?: string): boolean\n  /**\n   * The **`set()`** method of the URLSearchParams interface sets the value associated with a given search parameter to the given value.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/set)\n   */\n  set(name: string, value: string): void\n  /**\n   * The **`URLSearchParams.sort()`** method sorts all key/value pairs contained in this object in place and returns `undefined`.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/URLSearchParams/sort)\n   */\n  sort(): void\n  /* Returns an array of key, value pairs for every entry in the search params. */\n  entries(): IterableIterator<[key: string, value: string]>\n  /* Returns a list of keys in the search params. */\n  keys(): IterableIterator<string>\n  /* Returns a list of values in the search params. */\n  values(): IterableIterator<string>\n  forEach<This = unknown>(\n    callback: (\n      this: This,\n      value: string,\n      key: string,\n      parent: URLSearchParams,\n    ) => void,\n    thisArg?: This,\n  ): void\n  /*function toString() { [native code] }*/\n  toString(): string\n  [Symbol.iterator](): IterableIterator<[key: string, value: string]>\n}\ndeclare class URLPattern {\n  constructor(\n    input?: string | URLPatternInit,\n    baseURL?: string | URLPatternOptions,\n    patternOptions?: URLPatternOptions,\n  )\n  get protocol(): string\n  get username(): string\n  get password(): string\n  get hostname(): string\n  get port(): string\n  get pathname(): string\n  get search(): string\n  get hash(): string\n  get hasRegExpGroups(): boolean\n  test(input?: string | URLPatternInit, baseURL?: string): boolean\n  exec(\n    input?: string | URLPatternInit,\n    baseURL?: string,\n  ): URLPatternResult | null\n}\ninterface URLPatternInit {\n  protocol?: string\n  username?: string\n  password?: string\n  hostname?: string\n  port?: string\n  pathname?: string\n  search?: string\n  hash?: string\n  baseURL?: string\n}\ninterface URLPatternComponentResult {\n  input: string\n  groups: Record<string, string>\n}\ninterface URLPatternResult {\n  inputs: (string | URLPatternInit)[]\n  protocol: URLPatternComponentResult\n  username: URLPatternComponentResult\n  password: URLPatternComponentResult\n  hostname: URLPatternComponentResult\n  port: URLPatternComponentResult\n  pathname: URLPatternComponentResult\n  search: URLPatternComponentResult\n  hash: URLPatternComponentResult\n}\ninterface URLPatternOptions {\n  ignoreCase?: boolean\n}\n/**\n * A `CloseEvent` is sent to clients using WebSockets when the connection is closed.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CloseEvent)\n */\ndeclare class CloseEvent extends Event {\n  constructor(type: string, initializer?: CloseEventInit)\n  /**\n   * The **`code`** read-only property of the CloseEvent interface returns a WebSocket connection close code indicating the reason the connection was closed.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CloseEvent/code)\n   */\n  readonly code: number\n  /**\n   * The **`reason`** read-only property of the CloseEvent interface returns the WebSocket connection close reason the server gave for closing the connection; that is, a concise human-readable prose explanation for the closure.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CloseEvent/reason)\n   */\n  readonly reason: string\n  /**\n   * The **`wasClean`** read-only property of the CloseEvent interface returns `true` if the connection closed cleanly.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CloseEvent/wasClean)\n   */\n  readonly wasClean: boolean\n}\ninterface CloseEventInit {\n  code?: number\n  reason?: string\n  wasClean?: boolean\n}\ntype WebSocketEventMap = {\n  close: CloseEvent\n  message: MessageEvent\n  open: Event\n  error: ErrorEvent\n}\n/**\n * The `WebSocket` object provides the API for creating and managing a WebSocket connection to a server, as well as for sending and receiving data on the connection.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket)\n */\ndeclare var WebSocket: {\n  prototype: WebSocket\n  new (url: string, protocols?: string[] | string): WebSocket\n  readonly READY_STATE_CONNECTING: number\n  readonly CONNECTING: number\n  readonly READY_STATE_OPEN: number\n  readonly OPEN: number\n  readonly READY_STATE_CLOSING: number\n  readonly CLOSING: number\n  readonly READY_STATE_CLOSED: number\n  readonly CLOSED: number\n}\n/**\n * The `WebSocket` object provides the API for creating and managing a WebSocket connection to a server, as well as for sending and receiving data on the connection.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket)\n */\ninterface WebSocket extends EventTarget<WebSocketEventMap> {\n  accept(): void\n  /**\n   * The **`WebSocket.send()`** method enqueues the specified data to be transmitted to the server over the WebSocket connection, increasing the value of `bufferedAmount` by the number of bytes needed to contain the data.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/send)\n   */\n  send(message: (ArrayBuffer | ArrayBufferView) | string): void\n  /**\n   * The **`WebSocket.close()`** method closes the already `CLOSED`, this method does nothing.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/close)\n   */\n  close(code?: number, reason?: string): void\n  serializeAttachment(attachment: any): void\n  deserializeAttachment(): any | null\n  /**\n   * The **`WebSocket.readyState`** read-only property returns the current state of the WebSocket connection.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/readyState)\n   */\n  readyState: number\n  /**\n   * The **`WebSocket.url`** read-only property returns the absolute URL of the WebSocket as resolved by the constructor.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/url)\n   */\n  url: string | null\n  /**\n   * The **`WebSocket.protocol`** read-only property returns the name of the sub-protocol the server selected; this will be one of the strings specified in the `protocols` parameter when creating the WebSocket object, or the empty string if no connection is established.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/protocol)\n   */\n  protocol: string | null\n  /**\n   * The **`WebSocket.extensions`** read-only property returns the extensions selected by the server.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/WebSocket/extensions)\n   */\n  extensions: string | null\n}\ndeclare const WebSocketPair: {\n  new (): {\n    0: WebSocket\n    1: WebSocket\n  }\n}\ninterface SqlStorage {\n  exec<T extends Record<string, SqlStorageValue>>(\n    query: string,\n    ...bindings: any[]\n  ): SqlStorageCursor<T>\n  get databaseSize(): number\n  Cursor: typeof SqlStorageCursor\n  Statement: typeof SqlStorageStatement\n}\ndeclare abstract class SqlStorageStatement {}\ntype SqlStorageValue = ArrayBuffer | string | number | null\ndeclare abstract class SqlStorageCursor<\n  T extends Record<string, SqlStorageValue>,\n> {\n  next():\n    | {\n        done?: false\n        value: T\n      }\n    | {\n        done: true\n        value?: never\n      }\n  toArray(): T[]\n  one(): T\n  raw<U extends SqlStorageValue[]>(): IterableIterator<U>\n  columnNames: string[]\n  get rowsRead(): number\n  get rowsWritten(): number\n  [Symbol.iterator](): IterableIterator<T>\n}\ninterface Socket {\n  get readable(): ReadableStream\n  get writable(): WritableStream\n  get closed(): Promise<void>\n  get opened(): Promise<SocketInfo>\n  get upgraded(): boolean\n  get secureTransport(): 'on' | 'off' | 'starttls'\n  close(): Promise<void>\n  startTls(options?: TlsOptions): Socket\n}\ninterface SocketOptions {\n  secureTransport?: string\n  allowHalfOpen: boolean\n  highWaterMark?: number | bigint\n}\ninterface SocketAddress {\n  hostname: string\n  port: number\n}\ninterface TlsOptions {\n  expectedServerHostname?: string\n}\ninterface SocketInfo {\n  remoteAddress?: string\n  localAddress?: string\n}\n/**\n * The **`EventSource`** interface is web content's interface to server-sent events.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource)\n */\ndeclare class EventSource extends EventTarget {\n  constructor(url: string, init?: EventSourceEventSourceInit)\n  /**\n   * The **`close()`** method of the EventSource interface closes the connection, if one is made, and sets the ```js-nolint close() ``` None.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/close)\n   */\n  close(): void\n  /**\n   * The **`url`** read-only property of the URL of the source.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/url)\n   */\n  get url(): string\n  /**\n   * The **`withCredentials`** read-only property of the the `EventSource` object was instantiated with CORS credentials set.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/withCredentials)\n   */\n  get withCredentials(): boolean\n  /**\n   * The **`readyState`** read-only property of the connection.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/readyState)\n   */\n  get readyState(): number\n  /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/open_event) */\n  get onopen(): any | null\n  /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/open_event) */\n  set onopen(value: any | null)\n  /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/message_event) */\n  get onmessage(): any | null\n  /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/message_event) */\n  set onmessage(value: any | null)\n  /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/error_event) */\n  get onerror(): any | null\n  /* [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventSource/error_event) */\n  set onerror(value: any | null)\n  static readonly CONNECTING: number\n  static readonly OPEN: number\n  static readonly CLOSED: number\n  static from(stream: ReadableStream): EventSource\n}\ninterface EventSourceEventSourceInit {\n  withCredentials?: boolean\n  fetcher?: Fetcher\n}\ninterface Container {\n  get running(): boolean\n  start(options?: ContainerStartupOptions): void\n  monitor(): Promise<void>\n  destroy(error?: any): Promise<void>\n  signal(signo: number): void\n  getTcpPort(port: number): Fetcher\n  setInactivityTimeout(durationMs: number | bigint): Promise<void>\n}\ninterface ContainerStartupOptions {\n  entrypoint?: string[]\n  enableInternet: boolean\n  env?: Record<string, string>\n  hardTimeout?: number | bigint\n}\n/**\n * The **`MessagePort`** interface of the Channel Messaging API represents one of the two ports of a MessageChannel, allowing messages to be sent from one port and listening out for them arriving at the other.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessagePort)\n */\ndeclare abstract class MessagePort extends EventTarget {\n  /**\n   * The **`postMessage()`** method of the transfers ownership of objects to other browsing contexts.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessagePort/postMessage)\n   */\n  postMessage(data?: any, options?: any[] | MessagePortPostMessageOptions): void\n  /**\n   * The **`close()`** method of the MessagePort interface disconnects the port, so it is no longer active.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessagePort/close)\n   */\n  close(): void\n  /**\n   * The **`start()`** method of the MessagePort interface starts the sending of messages queued on the port.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessagePort/start)\n   */\n  start(): void\n  get onmessage(): any | null\n  set onmessage(value: any | null)\n}\n/**\n * The **`MessageChannel`** interface of the Channel Messaging API allows us to create a new message channel and send data through it via its two MessagePort properties.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageChannel)\n */\ndeclare class MessageChannel {\n  constructor()\n  /**\n   * The **`port1`** read-only property of the the port attached to the context that originated the channel.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageChannel/port1)\n   */\n  readonly port1: MessagePort\n  /**\n   * The **`port2`** read-only property of the the port attached to the context at the other end of the channel, which the message is initially sent to.\n   *\n   * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MessageChannel/port2)\n   */\n  readonly port2: MessagePort\n}\ninterface MessagePortPostMessageOptions {\n  transfer?: any[]\n}\ntype LoopbackForExport<\n  T extends\n    | (new (\n        ...args: any[]\n      ) => Rpc.EntrypointBranded)\n    | ExportedHandler<any, any, any>\n    | undefined = undefined,\n> = T extends new (\n  ...args: any[]\n) => Rpc.WorkerEntrypointBranded\n  ? LoopbackServiceStub<InstanceType<T>>\n  : T extends new (\n        ...args: any[]\n      ) => Rpc.DurableObjectBranded\n    ? LoopbackDurableObjectClass<InstanceType<T>>\n    : T extends ExportedHandler<any, any, any>\n      ? LoopbackServiceStub<undefined>\n      : undefined\ntype LoopbackServiceStub<\n  T extends Rpc.WorkerEntrypointBranded | undefined = undefined,\n> = Fetcher<T> &\n  (T extends CloudflareWorkersModule.WorkerEntrypoint<any, infer Props>\n    ? (opts: { props?: Props }) => Fetcher<T>\n    : (opts: { props?: any }) => Fetcher<T>)\ntype LoopbackDurableObjectClass<\n  T extends Rpc.DurableObjectBranded | undefined = undefined,\n> = DurableObjectClass<T> &\n  (T extends CloudflareWorkersModule.DurableObject<any, infer Props>\n    ? (opts: { props?: Props }) => DurableObjectClass<T>\n    : (opts: { props?: any }) => DurableObjectClass<T>)\ninterface SyncKvStorage {\n  get<T = unknown>(key: string): T | undefined\n  list<T = unknown>(options?: SyncKvListOptions): Iterable<[string, T]>\n  put<T>(key: string, value: T): void\n  delete(key: string): boolean\n}\ninterface SyncKvListOptions {\n  start?: string\n  startAfter?: string\n  end?: string\n  prefix?: string\n  reverse?: boolean\n  limit?: number\n}\ninterface WorkerStub {\n  getEntrypoint<T extends Rpc.WorkerEntrypointBranded | undefined>(\n    name?: string,\n    options?: WorkerStubEntrypointOptions,\n  ): Fetcher<T>\n}\ninterface WorkerStubEntrypointOptions {\n  props?: any\n}\ninterface WorkerLoader {\n  get(\n    name: string | null,\n    getCode: () => WorkerLoaderWorkerCode | Promise<WorkerLoaderWorkerCode>,\n  ): WorkerStub\n}\ninterface WorkerLoaderModule {\n  js?: string\n  cjs?: string\n  text?: string\n  data?: ArrayBuffer\n  json?: any\n  py?: string\n  wasm?: ArrayBuffer\n}\ninterface WorkerLoaderWorkerCode {\n  compatibilityDate: string\n  compatibilityFlags?: string[]\n  allowExperimental?: boolean\n  mainModule: string\n  modules: Record<string, WorkerLoaderModule | string>\n  env?: any\n  globalOutbound?: Fetcher | null\n  tails?: Fetcher[]\n  streamingTails?: Fetcher[]\n}\n/**\n * The Workers runtime supports a subset of the Performance API, used to measure timing and performance,\n * as well as timing of subrequests and other operations.\n *\n * [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/performance/)\n */\ndeclare abstract class Performance {\n  /* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/performance/#performancetimeorigin) */\n  get timeOrigin(): number\n  /* [Cloudflare Docs Reference](https://developers.cloudflare.com/workers/runtime-apis/performance/#performancenow) */\n  now(): number\n}\ntype AiImageClassificationInput = {\n  image: number[]\n}\ntype AiImageClassificationOutput = {\n  score?: number\n  label?: string\n}[]\ndeclare abstract class BaseAiImageClassification {\n  inputs: AiImageClassificationInput\n  postProcessedOutputs: AiImageClassificationOutput\n}\ntype AiImageToTextInput = {\n  image: number[]\n  prompt?: string\n  max_tokens?: number\n  temperature?: number\n  top_p?: number\n  top_k?: number\n  seed?: number\n  repetition_penalty?: number\n  frequency_penalty?: number\n  presence_penalty?: number\n  raw?: boolean\n  messages?: RoleScopedChatInput[]\n}\ntype AiImageToTextOutput = {\n  description: string\n}\ndeclare abstract class BaseAiImageToText {\n  inputs: AiImageToTextInput\n  postProcessedOutputs: AiImageToTextOutput\n}\ntype AiImageTextToTextInput = {\n  image: string\n  prompt?: string\n  max_tokens?: number\n  temperature?: number\n  ignore_eos?: boolean\n  top_p?: number\n  top_k?: number\n  seed?: number\n  repetition_penalty?: number\n  frequency_penalty?: number\n  presence_penalty?: number\n  raw?: boolean\n  messages?: RoleScopedChatInput[]\n}\ntype AiImageTextToTextOutput = {\n  description: string\n}\ndeclare abstract class BaseAiImageTextToText {\n  inputs: AiImageTextToTextInput\n  postProcessedOutputs: AiImageTextToTextOutput\n}\ntype AiMultimodalEmbeddingsInput = {\n  image: string\n  text: string[]\n}\ntype AiIMultimodalEmbeddingsOutput = {\n  data: number[][]\n  shape: number[]\n}\ndeclare abstract class BaseAiMultimodalEmbeddings {\n  inputs: AiImageTextToTextInput\n  postProcessedOutputs: AiImageTextToTextOutput\n}\ntype AiObjectDetectionInput = {\n  image: number[]\n}\ntype AiObjectDetectionOutput = {\n  score?: number\n  label?: string\n}[]\ndeclare abstract class BaseAiObjectDetection {\n  inputs: AiObjectDetectionInput\n  postProcessedOutputs: AiObjectDetectionOutput\n}\ntype AiSentenceSimilarityInput = {\n  source: string\n  sentences: string[]\n}\ntype AiSentenceSimilarityOutput = number[]\ndeclare abstract class BaseAiSentenceSimilarity {\n  inputs: AiSentenceSimilarityInput\n  postProcessedOutputs: AiSentenceSimilarityOutput\n}\ntype AiAutomaticSpeechRecognitionInput = {\n  audio: number[]\n}\ntype AiAutomaticSpeechRecognitionOutput = {\n  text?: string\n  words?: {\n    word: string\n    start: number\n    end: number\n  }[]\n  vtt?: string\n}\ndeclare abstract class BaseAiAutomaticSpeechRecognition {\n  inputs: AiAutomaticSpeechRecognitionInput\n  postProcessedOutputs: AiAutomaticSpeechRecognitionOutput\n}\ntype AiSummarizationInput = {\n  input_text: string\n  max_length?: number\n}\ntype AiSummarizationOutput = {\n  summary: string\n}\ndeclare abstract class BaseAiSummarization {\n  inputs: AiSummarizationInput\n  postProcessedOutputs: AiSummarizationOutput\n}\ntype AiTextClassificationInput = {\n  text: string\n}\ntype AiTextClassificationOutput = {\n  score?: number\n  label?: string\n}[]\ndeclare abstract class BaseAiTextClassification {\n  inputs: AiTextClassificationInput\n  postProcessedOutputs: AiTextClassificationOutput\n}\ntype AiTextEmbeddingsInput = {\n  text: string | string[]\n}\ntype AiTextEmbeddingsOutput = {\n  shape: number[]\n  data: number[][]\n}\ndeclare abstract class BaseAiTextEmbeddings {\n  inputs: AiTextEmbeddingsInput\n  postProcessedOutputs: AiTextEmbeddingsOutput\n}\ntype RoleScopedChatInput = {\n  role:\n    | 'user'\n    | 'assistant'\n    | 'system'\n    | 'tool'\n    | (string & NonNullable<unknown>)\n  content: string\n  name?: string\n}\ntype AiTextGenerationToolLegacyInput = {\n  name: string\n  description: string\n  parameters?: {\n    type: 'object' | (string & NonNullable<unknown>)\n    properties: {\n      [key: string]: {\n        type: string\n        description?: string\n      }\n    }\n    required: string[]\n  }\n}\ntype AiTextGenerationToolInput = {\n  type: 'function' | (string & NonNullable<unknown>)\n  function: {\n    name: string\n    description: string\n    parameters?: {\n      type: 'object' | (string & NonNullable<unknown>)\n      properties: {\n        [key: string]: {\n          type: string\n          description?: string\n        }\n      }\n      required: string[]\n    }\n  }\n}\ntype AiTextGenerationFunctionsInput = {\n  name: string\n  code: string\n}\ntype AiTextGenerationResponseFormat = {\n  type: string\n  json_schema?: any\n}\ntype AiTextGenerationInput = {\n  prompt?: string\n  raw?: boolean\n  stream?: boolean\n  max_tokens?: number\n  temperature?: number\n  top_p?: number\n  top_k?: number\n  seed?: number\n  repetition_penalty?: number\n  frequency_penalty?: number\n  presence_penalty?: number\n  messages?: RoleScopedChatInput[]\n  response_format?: AiTextGenerationResponseFormat\n  tools?:\n    | AiTextGenerationToolInput[]\n    | AiTextGenerationToolLegacyInput[]\n    | (object & NonNullable<unknown>)\n  functions?: AiTextGenerationFunctionsInput[]\n}\ntype AiTextGenerationToolLegacyOutput = {\n  name: string\n  arguments: unknown\n}\ntype AiTextGenerationToolOutput = {\n  id: string\n  type: 'function'\n  function: {\n    name: string\n    arguments: string\n  }\n}\ntype UsageTags = {\n  prompt_tokens: number\n  completion_tokens: number\n  total_tokens: number\n}\ntype AiTextGenerationOutput = {\n  response?: string\n  tool_calls?: AiTextGenerationToolLegacyOutput[] & AiTextGenerationToolOutput[]\n  usage?: UsageTags\n}\ndeclare abstract class BaseAiTextGeneration {\n  inputs: AiTextGenerationInput\n  postProcessedOutputs: AiTextGenerationOutput\n}\ntype AiTextToSpeechInput = {\n  prompt: string\n  lang?: string\n}\ntype AiTextToSpeechOutput =\n  | Uint8Array\n  | {\n      audio: string\n    }\ndeclare abstract class BaseAiTextToSpeech {\n  inputs: AiTextToSpeechInput\n  postProcessedOutputs: AiTextToSpeechOutput\n}\ntype AiTextToImageInput = {\n  prompt: string\n  negative_prompt?: string\n  height?: number\n  width?: number\n  image?: number[]\n  image_b64?: string\n  mask?: number[]\n  num_steps?: number\n  strength?: number\n  guidance?: number\n  seed?: number\n}\ntype AiTextToImageOutput = ReadableStream<Uint8Array>\ndeclare abstract class BaseAiTextToImage {\n  inputs: AiTextToImageInput\n  postProcessedOutputs: AiTextToImageOutput\n}\ntype AiTranslationInput = {\n  text: string\n  target_lang: string\n  source_lang?: string\n}\ntype AiTranslationOutput = {\n  translated_text?: string\n}\ndeclare abstract class BaseAiTranslation {\n  inputs: AiTranslationInput\n  postProcessedOutputs: AiTranslationOutput\n}\n/**\n * Workers AI support for OpenAI's Responses API\n * Reference: https://github.com/openai/openai-node/blob/master/src/resources/responses/responses.ts\n *\n * It's a stripped down version from its source.\n * It currently supports basic function calling, json mode and accepts images as input.\n *\n * It does not include types for WebSearch, CodeInterpreter, FileInputs, MCP, CustomTools.\n * We plan to add those incrementally as model + platform capabilities evolve.\n */\ntype ResponsesInput = {\n  background?: boolean | null\n  conversation?: string | ResponseConversationParam | null\n  include?: Array<ResponseIncludable> | null\n  input?: string | ResponseInput\n  instructions?: string | null\n  max_output_tokens?: number | null\n  parallel_tool_calls?: boolean | null\n  previous_response_id?: string | null\n  prompt_cache_key?: string\n  reasoning?: Reasoning | null\n  safety_identifier?: string\n  service_tier?: 'auto' | 'default' | 'flex' | 'scale' | 'priority' | null\n  stream?: boolean | null\n  stream_options?: StreamOptions | null\n  temperature?: number | null\n  text?: ResponseTextConfig\n  tool_choice?: ToolChoiceOptions | ToolChoiceFunction\n  tools?: Array<Tool>\n  top_p?: number | null\n  truncation?: 'auto' | 'disabled' | null\n}\ntype ResponsesOutput = {\n  id?: string\n  created_at?: number\n  output_text?: string\n  error?: ResponseError | null\n  incomplete_details?: ResponseIncompleteDetails | null\n  instructions?: string | Array<ResponseInputItem> | null\n  object?: 'response'\n  output?: Array<ResponseOutputItem>\n  parallel_tool_calls?: boolean\n  temperature?: number | null\n  tool_choice?: ToolChoiceOptions | ToolChoiceFunction\n  tools?: Array<Tool>\n  top_p?: number | null\n  max_output_tokens?: number | null\n  previous_response_id?: string | null\n  prompt?: ResponsePrompt | null\n  reasoning?: Reasoning | null\n  safety_identifier?: string\n  service_tier?: 'auto' | 'default' | 'flex' | 'scale' | 'priority' | null\n  status?: ResponseStatus\n  text?: ResponseTextConfig\n  truncation?: 'auto' | 'disabled' | null\n  usage?: ResponseUsage\n}\ntype EasyInputMessage = {\n  content: string | ResponseInputMessageContentList\n  role: 'user' | 'assistant' | 'system' | 'developer'\n  type?: 'message'\n}\ntype ResponsesFunctionTool = {\n  name: string\n  parameters: {\n    [key: string]: unknown\n  } | null\n  strict: boolean | null\n  type: 'function'\n  description?: string | null\n}\ntype ResponseIncompleteDetails = {\n  reason?: 'max_output_tokens' | 'content_filter'\n}\ntype ResponsePrompt = {\n  id: string\n  variables?: {\n    [key: string]: string | ResponseInputText | ResponseInputImage\n  } | null\n  version?: string | null\n}\ntype Reasoning = {\n  effort?: ReasoningEffort | null\n  generate_summary?: 'auto' | 'concise' | 'detailed' | null\n  summary?: 'auto' | 'concise' | 'detailed' | null\n}\ntype ResponseContent =\n  | ResponseInputText\n  | ResponseInputImage\n  | ResponseOutputText\n  | ResponseOutputRefusal\n  | ResponseContentReasoningText\ntype ResponseContentReasoningText = {\n  text: string\n  type: 'reasoning_text'\n}\ntype ResponseConversationParam = {\n  id: string\n}\ntype ResponseCreatedEvent = {\n  response: Response\n  sequence_number: number\n  type: 'response.created'\n}\ntype ResponseCustomToolCallOutput = {\n  call_id: string\n  output: string | Array<ResponseInputText | ResponseInputImage>\n  type: 'custom_tool_call_output'\n  id?: string\n}\ntype ResponseError = {\n  code:\n    | 'server_error'\n    | 'rate_limit_exceeded'\n    | 'invalid_prompt'\n    | 'vector_store_timeout'\n    | 'invalid_image'\n    | 'invalid_image_format'\n    | 'invalid_base64_image'\n    | 'invalid_image_url'\n    | 'image_too_large'\n    | 'image_too_small'\n    | 'image_parse_error'\n    | 'image_content_policy_violation'\n    | 'invalid_image_mode'\n    | 'image_file_too_large'\n    | 'unsupported_image_media_type'\n    | 'empty_image_file'\n    | 'failed_to_download_image'\n    | 'image_file_not_found'\n  message: string\n}\ntype ResponseErrorEvent = {\n  code: string | null\n  message: string\n  param: string | null\n  sequence_number: number\n  type: 'error'\n}\ntype ResponseFailedEvent = {\n  response: Response\n  sequence_number: number\n  type: 'response.failed'\n}\ntype ResponseFormatText = {\n  type: 'text'\n}\ntype ResponseFormatJSONObject = {\n  type: 'json_object'\n}\ntype ResponseFormatTextConfig =\n  | ResponseFormatText\n  | ResponseFormatTextJSONSchemaConfig\n  | ResponseFormatJSONObject\ntype ResponseFormatTextJSONSchemaConfig = {\n  name: string\n  schema: {\n    [key: string]: unknown\n  }\n  type: 'json_schema'\n  description?: string\n  strict?: boolean | null\n}\ntype ResponseFunctionCallArgumentsDeltaEvent = {\n  delta: string\n  item_id: string\n  output_index: number\n  sequence_number: number\n  type: 'response.function_call_arguments.delta'\n}\ntype ResponseFunctionCallArgumentsDoneEvent = {\n  arguments: string\n  item_id: string\n  name: string\n  output_index: number\n  sequence_number: number\n  type: 'response.function_call_arguments.done'\n}\ntype ResponseFunctionCallOutputItem =\n  | ResponseInputTextContent\n  | ResponseInputImageContent\ntype ResponseFunctionCallOutputItemList = Array<ResponseFunctionCallOutputItem>\ntype ResponseFunctionToolCall = {\n  arguments: string\n  call_id: string\n  name: string\n  type: 'function_call'\n  id?: string\n  status?: 'in_progress' | 'completed' | 'incomplete'\n}\ninterface ResponseFunctionToolCallItem extends ResponseFunctionToolCall {\n  id: string\n}\ntype ResponseFunctionToolCallOutputItem = {\n  id: string\n  call_id: string\n  output: string | Array<ResponseInputText | ResponseInputImage>\n  type: 'function_call_output'\n  status?: 'in_progress' | 'completed' | 'incomplete'\n}\ntype ResponseIncludable =\n  | 'message.input_image.image_url'\n  | 'message.output_text.logprobs'\ntype ResponseIncompleteEvent = {\n  response: Response\n  sequence_number: number\n  type: 'response.incomplete'\n}\ntype ResponseInput = Array<ResponseInputItem>\ntype ResponseInputContent = ResponseInputText | ResponseInputImage\ntype ResponseInputImage = {\n  detail: 'low' | 'high' | 'auto'\n  type: 'input_image'\n  /**\n   * Base64 encoded image\n   */\n  image_url?: string | null\n}\ntype ResponseInputImageContent = {\n  type: 'input_image'\n  detail?: 'low' | 'high' | 'auto' | null\n  /**\n   * Base64 encoded image\n   */\n  image_url?: string | null\n}\ntype ResponseInputItem =\n  | EasyInputMessage\n  | ResponseInputItemMessage\n  | ResponseOutputMessage\n  | ResponseFunctionToolCall\n  | ResponseInputItemFunctionCallOutput\n  | ResponseReasoningItem\ntype ResponseInputItemFunctionCallOutput = {\n  call_id: string\n  output: string | ResponseFunctionCallOutputItemList\n  type: 'function_call_output'\n  id?: string | null\n  status?: 'in_progress' | 'completed' | 'incomplete' | null\n}\ntype ResponseInputItemMessage = {\n  content: ResponseInputMessageContentList\n  role: 'user' | 'system' | 'developer'\n  status?: 'in_progress' | 'completed' | 'incomplete'\n  type?: 'message'\n}\ntype ResponseInputMessageContentList = Array<ResponseInputContent>\ntype ResponseInputMessageItem = {\n  id: string\n  content: ResponseInputMessageContentList\n  role: 'user' | 'system' | 'developer'\n  status?: 'in_progress' | 'completed' | 'incomplete'\n  type?: 'message'\n}\ntype ResponseInputText = {\n  text: string\n  type: 'input_text'\n}\ntype ResponseInputTextContent = {\n  text: string\n  type: 'input_text'\n}\ntype ResponseItem =\n  | ResponseInputMessageItem\n  | ResponseOutputMessage\n  | ResponseFunctionToolCallItem\n  | ResponseFunctionToolCallOutputItem\ntype ResponseOutputItem =\n  | ResponseOutputMessage\n  | ResponseFunctionToolCall\n  | ResponseReasoningItem\ntype ResponseOutputItemAddedEvent = {\n  item: ResponseOutputItem\n  output_index: number\n  sequence_number: number\n  type: 'response.output_item.added'\n}\ntype ResponseOutputItemDoneEvent = {\n  item: ResponseOutputItem\n  output_index: number\n  sequence_number: number\n  type: 'response.output_item.done'\n}\ntype ResponseOutputMessage = {\n  id: string\n  content: Array<ResponseOutputText | ResponseOutputRefusal>\n  role: 'assistant'\n  status: 'in_progress' | 'completed' | 'incomplete'\n  type: 'message'\n}\ntype ResponseOutputRefusal = {\n  refusal: string\n  type: 'refusal'\n}\ntype ResponseOutputText = {\n  text: string\n  type: 'output_text'\n  logprobs?: Array<Logprob>\n}\ntype ResponseReasoningItem = {\n  id: string\n  summary: Array<ResponseReasoningSummaryItem>\n  type: 'reasoning'\n  content?: Array<ResponseReasoningContentItem>\n  encrypted_content?: string | null\n  status?: 'in_progress' | 'completed' | 'incomplete'\n}\ntype ResponseReasoningSummaryItem = {\n  text: string\n  type: 'summary_text'\n}\ntype ResponseReasoningContentItem = {\n  text: string\n  type: 'reasoning_text'\n}\ntype ResponseReasoningTextDeltaEvent = {\n  content_index: number\n  delta: string\n  item_id: string\n  output_index: number\n  sequence_number: number\n  type: 'response.reasoning_text.delta'\n}\ntype ResponseReasoningTextDoneEvent = {\n  content_index: number\n  item_id: string\n  output_index: number\n  sequence_number: number\n  text: string\n  type: 'response.reasoning_text.done'\n}\ntype ResponseRefusalDeltaEvent = {\n  content_index: number\n  delta: string\n  item_id: string\n  output_index: number\n  sequence_number: number\n  type: 'response.refusal.delta'\n}\ntype ResponseRefusalDoneEvent = {\n  content_index: number\n  item_id: string\n  output_index: number\n  refusal: string\n  sequence_number: number\n  type: 'response.refusal.done'\n}\ntype ResponseStatus =\n  | 'completed'\n  | 'failed'\n  | 'in_progress'\n  | 'cancelled'\n  | 'queued'\n  | 'incomplete'\ntype ResponseStreamEvent =\n  | ResponseCompletedEvent\n  | ResponseCreatedEvent\n  | ResponseErrorEvent\n  | ResponseFunctionCallArgumentsDeltaEvent\n  | ResponseFunctionCallArgumentsDoneEvent\n  | ResponseFailedEvent\n  | ResponseIncompleteEvent\n  | ResponseOutputItemAddedEvent\n  | ResponseOutputItemDoneEvent\n  | ResponseReasoningTextDeltaEvent\n  | ResponseReasoningTextDoneEvent\n  | ResponseRefusalDeltaEvent\n  | ResponseRefusalDoneEvent\n  | ResponseTextDeltaEvent\n  | ResponseTextDoneEvent\ntype ResponseCompletedEvent = {\n  response: Response\n  sequence_number: number\n  type: 'response.completed'\n}\ntype ResponseTextConfig = {\n  format?: ResponseFormatTextConfig\n  verbosity?: 'low' | 'medium' | 'high' | null\n}\ntype ResponseTextDeltaEvent = {\n  content_index: number\n  delta: string\n  item_id: string\n  logprobs: Array<Logprob>\n  output_index: number\n  sequence_number: number\n  type: 'response.output_text.delta'\n}\ntype ResponseTextDoneEvent = {\n  content_index: number\n  item_id: string\n  logprobs: Array<Logprob>\n  output_index: number\n  sequence_number: number\n  text: string\n  type: 'response.output_text.done'\n}\ntype Logprob = {\n  token: string\n  logprob: number\n  top_logprobs?: Array<TopLogprob>\n}\ntype TopLogprob = {\n  token?: string\n  logprob?: number\n}\ntype ResponseUsage = {\n  input_tokens: number\n  output_tokens: number\n  total_tokens: number\n}\ntype Tool = ResponsesFunctionTool\ntype ToolChoiceFunction = {\n  name: string\n  type: 'function'\n}\ntype ToolChoiceOptions = 'none'\ntype ReasoningEffort = 'minimal' | 'low' | 'medium' | 'high' | null\ntype StreamOptions = {\n  include_obfuscation?: boolean\n}\ntype Ai_Cf_Baai_Bge_Base_En_V1_5_Input =\n  | {\n      text: string | string[]\n      /**\n       * The pooling method used in the embedding process. `cls` pooling will generate more accurate embeddings on larger inputs - however, embeddings created with cls pooling are not compatible with embeddings generated with mean pooling. The default pooling method is `mean` in order for this to not be a breaking change, but we highly suggest using the new `cls` pooling for better accuracy.\n       */\n      pooling?: 'mean' | 'cls'\n    }\n  | {\n      /**\n       * Batch of the embeddings requests to run using async-queue\n       */\n      requests: {\n        text: string | string[]\n        /**\n         * The pooling method used in the embedding process. `cls` pooling will generate more accurate embeddings on larger inputs - however, embeddings created with cls pooling are not compatible with embeddings generated with mean pooling. The default pooling method is `mean` in order for this to not be a breaking change, but we highly suggest using the new `cls` pooling for better accuracy.\n         */\n        pooling?: 'mean' | 'cls'\n      }[]\n    }\ntype Ai_Cf_Baai_Bge_Base_En_V1_5_Output =\n  | {\n      shape?: number[]\n      /**\n       * Embeddings of the requested text values\n       */\n      data?: number[][]\n      /**\n       * The pooling method used in the embedding process.\n       */\n      pooling?: 'mean' | 'cls'\n    }\n  | Ai_Cf_Baai_Bge_Base_En_V1_5_AsyncResponse\ninterface Ai_Cf_Baai_Bge_Base_En_V1_5_AsyncResponse {\n  /**\n   * The async request id that can be used to obtain the results.\n   */\n  request_id?: string\n}\ndeclare abstract class Base_Ai_Cf_Baai_Bge_Base_En_V1_5 {\n  inputs: Ai_Cf_Baai_Bge_Base_En_V1_5_Input\n  postProcessedOutputs: Ai_Cf_Baai_Bge_Base_En_V1_5_Output\n}\ntype Ai_Cf_Openai_Whisper_Input =\n  | string\n  | {\n      /**\n       * An array of integers that represent the audio data constrained to 8-bit unsigned integer values\n       */\n      audio: number[]\n    }\ninterface Ai_Cf_Openai_Whisper_Output {\n  /**\n   * The transcription\n   */\n  text: string\n  word_count?: number\n  words?: {\n    word?: string\n    /**\n     * The second this word begins in the recording\n     */\n    start?: number\n    /**\n     * The ending second when the word completes\n     */\n    end?: number\n  }[]\n  vtt?: string\n}\ndeclare abstract class Base_Ai_Cf_Openai_Whisper {\n  inputs: Ai_Cf_Openai_Whisper_Input\n  postProcessedOutputs: Ai_Cf_Openai_Whisper_Output\n}\ntype Ai_Cf_Meta_M2M100_1_2B_Input =\n  | {\n      /**\n       * The text to be translated\n       */\n      text: string\n      /**\n       * The language code of the source text (e.g., 'en' for English). Defaults to 'en' if not specified\n       */\n      source_lang?: string\n      /**\n       * The language code to translate the text into (e.g., 'es' for Spanish)\n       */\n      target_lang: string\n    }\n  | {\n      /**\n       * Batch of the embeddings requests to run using async-queue\n       */\n      requests: {\n        /**\n         * The text to be translated\n         */\n        text: string\n        /**\n         * The language code of the source text (e.g., 'en' for English). Defaults to 'en' if not specified\n         */\n        source_lang?: string\n        /**\n         * The language code to translate the text into (e.g., 'es' for Spanish)\n         */\n        target_lang: string\n      }[]\n    }\ntype Ai_Cf_Meta_M2M100_1_2B_Output =\n  | {\n      /**\n       * The translated text in the target language\n       */\n      translated_text?: string\n    }\n  | Ai_Cf_Meta_M2M100_1_2B_AsyncResponse\ninterface Ai_Cf_Meta_M2M100_1_2B_AsyncResponse {\n  /**\n   * The async request id that can be used to obtain the results.\n   */\n  request_id?: string\n}\ndeclare abstract class Base_Ai_Cf_Meta_M2M100_1_2B {\n  inputs: Ai_Cf_Meta_M2M100_1_2B_Input\n  postProcessedOutputs: Ai_Cf_Meta_M2M100_1_2B_Output\n}\ntype Ai_Cf_Baai_Bge_Small_En_V1_5_Input =\n  | {\n      text: string | string[]\n      /**\n       * The pooling method used in the embedding process. `cls` pooling will generate more accurate embeddings on larger inputs - however, embeddings created with cls pooling are not compatible with embeddings generated with mean pooling. The default pooling method is `mean` in order for this to not be a breaking change, but we highly suggest using the new `cls` pooling for better accuracy.\n       */\n      pooling?: 'mean' | 'cls'\n    }\n  | {\n      /**\n       * Batch of the embeddings requests to run using async-queue\n       */\n      requests: {\n        text: string | string[]\n        /**\n         * The pooling method used in the embedding process. `cls` pooling will generate more accurate embeddings on larger inputs - however, embeddings created with cls pooling are not compatible with embeddings generated with mean pooling. The default pooling method is `mean` in order for this to not be a breaking change, but we highly suggest using the new `cls` pooling for better accuracy.\n         */\n        pooling?: 'mean' | 'cls'\n      }[]\n    }\ntype Ai_Cf_Baai_Bge_Small_En_V1_5_Output =\n  | {\n      shape?: number[]\n      /**\n       * Embeddings of the requested text values\n       */\n      data?: number[][]\n      /**\n       * The pooling method used in the embedding process.\n       */\n      pooling?: 'mean' | 'cls'\n    }\n  | Ai_Cf_Baai_Bge_Small_En_V1_5_AsyncResponse\ninterface Ai_Cf_Baai_Bge_Small_En_V1_5_AsyncResponse {\n  /**\n   * The async request id that can be used to obtain the results.\n   */\n  request_id?: string\n}\ndeclare abstract class Base_Ai_Cf_Baai_Bge_Small_En_V1_5 {\n  inputs: Ai_Cf_Baai_Bge_Small_En_V1_5_Input\n  postProcessedOutputs: Ai_Cf_Baai_Bge_Small_En_V1_5_Output\n}\ntype Ai_Cf_Baai_Bge_Large_En_V1_5_Input =\n  | {\n      text: string | string[]\n      /**\n       * The pooling method used in the embedding process. `cls` pooling will generate more accurate embeddings on larger inputs - however, embeddings created with cls pooling are not compatible with embeddings generated with mean pooling. The default pooling method is `mean` in order for this to not be a breaking change, but we highly suggest using the new `cls` pooling for better accuracy.\n       */\n      pooling?: 'mean' | 'cls'\n    }\n  | {\n      /**\n       * Batch of the embeddings requests to run using async-queue\n       */\n      requests: {\n        text: string | string[]\n        /**\n         * The pooling method used in the embedding process. `cls` pooling will generate more accurate embeddings on larger inputs - however, embeddings created with cls pooling are not compatible with embeddings generated with mean pooling. The default pooling method is `mean` in order for this to not be a breaking change, but we highly suggest using the new `cls` pooling for better accuracy.\n         */\n        pooling?: 'mean' | 'cls'\n      }[]\n    }\ntype Ai_Cf_Baai_Bge_Large_En_V1_5_Output =\n  | {\n      shape?: number[]\n      /**\n       * Embeddings of the requested text values\n       */\n      data?: number[][]\n      /**\n       * The pooling method used in the embedding process.\n       */\n      pooling?: 'mean' | 'cls'\n    }\n  | Ai_Cf_Baai_Bge_Large_En_V1_5_AsyncResponse\ninterface Ai_Cf_Baai_Bge_Large_En_V1_5_AsyncResponse {\n  /**\n   * The async request id that can be used to obtain the results.\n   */\n  request_id?: string\n}\ndeclare abstract class Base_Ai_Cf_Baai_Bge_Large_En_V1_5 {\n  inputs: Ai_Cf_Baai_Bge_Large_En_V1_5_Input\n  postProcessedOutputs: Ai_Cf_Baai_Bge_Large_En_V1_5_Output\n}\ntype Ai_Cf_Unum_Uform_Gen2_Qwen_500M_Input =\n  | string\n  | {\n      /**\n       * The input text prompt for the model to generate a response.\n       */\n      prompt?: string\n      /**\n       * If true, a chat template is not applied and you must adhere to the specific model's expected formatting.\n       */\n      raw?: boolean\n      /**\n       * Controls the creativity of the AI's responses by adjusting how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n       */\n      top_p?: number\n      /**\n       * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.\n       */\n      top_k?: number\n      /**\n       * Random seed for reproducibility of the generation.\n       */\n      seed?: number\n      /**\n       * Penalty for repeated tokens; higher values discourage repetition.\n       */\n      repetition_penalty?: number\n      /**\n       * Decreases the likelihood of the model repeating the same lines verbatim.\n       */\n      frequency_penalty?: number\n      /**\n       * Increases the likelihood of the model introducing new topics.\n       */\n      presence_penalty?: number\n      image: number[] | (string & NonNullable<unknown>)\n      /**\n       * The maximum number of tokens to generate in the response.\n       */\n      max_tokens?: number\n    }\ninterface Ai_Cf_Unum_Uform_Gen2_Qwen_500M_Output {\n  description?: string\n}\ndeclare abstract class Base_Ai_Cf_Unum_Uform_Gen2_Qwen_500M {\n  inputs: Ai_Cf_Unum_Uform_Gen2_Qwen_500M_Input\n  postProcessedOutputs: Ai_Cf_Unum_Uform_Gen2_Qwen_500M_Output\n}\ntype Ai_Cf_Openai_Whisper_Tiny_En_Input =\n  | string\n  | {\n      /**\n       * An array of integers that represent the audio data constrained to 8-bit unsigned integer values\n       */\n      audio: number[]\n    }\ninterface Ai_Cf_Openai_Whisper_Tiny_En_Output {\n  /**\n   * The transcription\n   */\n  text: string\n  word_count?: number\n  words?: {\n    word?: string\n    /**\n     * The second this word begins in the recording\n     */\n    start?: number\n    /**\n     * The ending second when the word completes\n     */\n    end?: number\n  }[]\n  vtt?: string\n}\ndeclare abstract class Base_Ai_Cf_Openai_Whisper_Tiny_En {\n  inputs: Ai_Cf_Openai_Whisper_Tiny_En_Input\n  postProcessedOutputs: Ai_Cf_Openai_Whisper_Tiny_En_Output\n}\ninterface Ai_Cf_Openai_Whisper_Large_V3_Turbo_Input {\n  /**\n   * Base64 encoded value of the audio data.\n   */\n  audio: string\n  /**\n   * Supported tasks are 'translate' or 'transcribe'.\n   */\n  task?: string\n  /**\n   * The language of the audio being transcribed or translated.\n   */\n  language?: string\n  /**\n   * Preprocess the audio with a voice activity detection model.\n   */\n  vad_filter?: boolean\n  /**\n   * A text prompt to help provide context to the model on the contents of the audio.\n   */\n  initial_prompt?: string\n  /**\n   * The prefix it appended the the beginning of the output of the transcription and can guide the transcription result.\n   */\n  prefix?: string\n}\ninterface Ai_Cf_Openai_Whisper_Large_V3_Turbo_Output {\n  transcription_info?: {\n    /**\n     * The language of the audio being transcribed or translated.\n     */\n    language?: string\n    /**\n     * The confidence level or probability of the detected language being accurate, represented as a decimal between 0 and 1.\n     */\n    language_probability?: number\n    /**\n     * The total duration of the original audio file, in seconds.\n     */\n    duration?: number\n    /**\n     * The duration of the audio after applying Voice Activity Detection (VAD) to remove silent or irrelevant sections, in seconds.\n     */\n    duration_after_vad?: number\n  }\n  /**\n   * The complete transcription of the audio.\n   */\n  text: string\n  /**\n   * The total number of words in the transcription.\n   */\n  word_count?: number\n  segments?: {\n    /**\n     * The starting time of the segment within the audio, in seconds.\n     */\n    start?: number\n    /**\n     * The ending time of the segment within the audio, in seconds.\n     */\n    end?: number\n    /**\n     * The transcription of the segment.\n     */\n    text?: string\n    /**\n     * The temperature used in the decoding process, controlling randomness in predictions. Lower values result in more deterministic outputs.\n     */\n    temperature?: number\n    /**\n     * The average log probability of the predictions for the words in this segment, indicating overall confidence.\n     */\n    avg_logprob?: number\n    /**\n     * The compression ratio of the input to the output, measuring how much the text was compressed during the transcription process.\n     */\n    compression_ratio?: number\n    /**\n     * The probability that the segment contains no speech, represented as a decimal between 0 and 1.\n     */\n    no_speech_prob?: number\n    words?: {\n      /**\n       * The individual word transcribed from the audio.\n       */\n      word?: string\n      /**\n       * The starting time of the word within the audio, in seconds.\n       */\n      start?: number\n      /**\n       * The ending time of the word within the audio, in seconds.\n       */\n      end?: number\n    }[]\n  }[]\n  /**\n   * The transcription in WebVTT format, which includes timing and text information for use in subtitles.\n   */\n  vtt?: string\n}\ndeclare abstract class Base_Ai_Cf_Openai_Whisper_Large_V3_Turbo {\n  inputs: Ai_Cf_Openai_Whisper_Large_V3_Turbo_Input\n  postProcessedOutputs: Ai_Cf_Openai_Whisper_Large_V3_Turbo_Output\n}\ntype Ai_Cf_Baai_Bge_M3_Input =\n  | Ai_Cf_Baai_Bge_M3_Input_QueryAnd_Contexts\n  | Ai_Cf_Baai_Bge_M3_Input_Embedding\n  | {\n      /**\n       * Batch of the embeddings requests to run using async-queue\n       */\n      requests: (\n        | Ai_Cf_Baai_Bge_M3_Input_QueryAnd_Contexts_1\n        | Ai_Cf_Baai_Bge_M3_Input_Embedding_1\n      )[]\n    }\ninterface Ai_Cf_Baai_Bge_M3_Input_QueryAnd_Contexts {\n  /**\n   * A query you wish to perform against the provided contexts. If no query is provided the model with respond with embeddings for contexts\n   */\n  query?: string\n  /**\n   * List of provided contexts. Note that the index in this array is important, as the response will refer to it.\n   */\n  contexts: {\n    /**\n     * One of the provided context content\n     */\n    text?: string\n  }[]\n  /**\n   * When provided with too long context should the model error out or truncate the context to fit?\n   */\n  truncate_inputs?: boolean\n}\ninterface Ai_Cf_Baai_Bge_M3_Input_Embedding {\n  text: string | string[]\n  /**\n   * When provided with too long context should the model error out or truncate the context to fit?\n   */\n  truncate_inputs?: boolean\n}\ninterface Ai_Cf_Baai_Bge_M3_Input_QueryAnd_Contexts_1 {\n  /**\n   * A query you wish to perform against the provided contexts. If no query is provided the model with respond with embeddings for contexts\n   */\n  query?: string\n  /**\n   * List of provided contexts. Note that the index in this array is important, as the response will refer to it.\n   */\n  contexts: {\n    /**\n     * One of the provided context content\n     */\n    text?: string\n  }[]\n  /**\n   * When provided with too long context should the model error out or truncate the context to fit?\n   */\n  truncate_inputs?: boolean\n}\ninterface Ai_Cf_Baai_Bge_M3_Input_Embedding_1 {\n  text: string | string[]\n  /**\n   * When provided with too long context should the model error out or truncate the context to fit?\n   */\n  truncate_inputs?: boolean\n}\ntype Ai_Cf_Baai_Bge_M3_Output =\n  | Ai_Cf_Baai_Bge_M3_Ouput_Query\n  | Ai_Cf_Baai_Bge_M3_Output_EmbeddingFor_Contexts\n  | Ai_Cf_Baai_Bge_M3_Ouput_Embedding\n  | Ai_Cf_Baai_Bge_M3_AsyncResponse\ninterface Ai_Cf_Baai_Bge_M3_Ouput_Query {\n  response?: {\n    /**\n     * Index of the context in the request\n     */\n    id?: number\n    /**\n     * Score of the context under the index.\n     */\n    score?: number\n  }[]\n}\ninterface Ai_Cf_Baai_Bge_M3_Output_EmbeddingFor_Contexts {\n  response?: number[][]\n  shape?: number[]\n  /**\n   * The pooling method used in the embedding process.\n   */\n  pooling?: 'mean' | 'cls'\n}\ninterface Ai_Cf_Baai_Bge_M3_Ouput_Embedding {\n  shape?: number[]\n  /**\n   * Embeddings of the requested text values\n   */\n  data?: number[][]\n  /**\n   * The pooling method used in the embedding process.\n   */\n  pooling?: 'mean' | 'cls'\n}\ninterface Ai_Cf_Baai_Bge_M3_AsyncResponse {\n  /**\n   * The async request id that can be used to obtain the results.\n   */\n  request_id?: string\n}\ndeclare abstract class Base_Ai_Cf_Baai_Bge_M3 {\n  inputs: Ai_Cf_Baai_Bge_M3_Input\n  postProcessedOutputs: Ai_Cf_Baai_Bge_M3_Output\n}\ninterface Ai_Cf_Black_Forest_Labs_Flux_1_Schnell_Input {\n  /**\n   * A text description of the image you want to generate.\n   */\n  prompt: string\n  /**\n   * The number of diffusion steps; higher values can improve quality but take longer.\n   */\n  steps?: number\n}\ninterface Ai_Cf_Black_Forest_Labs_Flux_1_Schnell_Output {\n  /**\n   * The generated image in Base64 format.\n   */\n  image?: string\n}\ndeclare abstract class Base_Ai_Cf_Black_Forest_Labs_Flux_1_Schnell {\n  inputs: Ai_Cf_Black_Forest_Labs_Flux_1_Schnell_Input\n  postProcessedOutputs: Ai_Cf_Black_Forest_Labs_Flux_1_Schnell_Output\n}\ntype Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Input =\n  | Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Prompt\n  | Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Messages\ninterface Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Prompt {\n  /**\n   * The input text prompt for the model to generate a response.\n   */\n  prompt: string\n  image?: number[] | (string & NonNullable<unknown>)\n  /**\n   * If true, a chat template is not applied and you must adhere to the specific model's expected formatting.\n   */\n  raw?: boolean\n  /**\n   * If true, the response will be streamed back incrementally using SSE, Server Sent Events.\n   */\n  stream?: boolean\n  /**\n   * The maximum number of tokens to generate in the response.\n   */\n  max_tokens?: number\n  /**\n   * Controls the randomness of the output; higher values produce more random results.\n   */\n  temperature?: number\n  /**\n   * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n   */\n  top_p?: number\n  /**\n   * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.\n   */\n  top_k?: number\n  /**\n   * Random seed for reproducibility of the generation.\n   */\n  seed?: number\n  /**\n   * Penalty for repeated tokens; higher values discourage repetition.\n   */\n  repetition_penalty?: number\n  /**\n   * Decreases the likelihood of the model repeating the same lines verbatim.\n   */\n  frequency_penalty?: number\n  /**\n   * Increases the likelihood of the model introducing new topics.\n   */\n  presence_penalty?: number\n  /**\n   * Name of the LoRA (Low-Rank Adaptation) model to fine-tune the base model.\n   */\n  lora?: string\n}\ninterface Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Messages {\n  /**\n   * An array of message objects representing the conversation history.\n   */\n  messages: {\n    /**\n     * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool').\n     */\n    role?: string\n    /**\n     * The tool call id. Must be supplied for tool calls for Mistral-3. If you don't know what to put here you can fall back to 000000001\n     */\n    tool_call_id?: string\n    content?:\n      | string\n      | {\n          /**\n           * Type of the content provided\n           */\n          type?: string\n          text?: string\n          image_url?: {\n            /**\n             * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted\n             */\n            url?: string\n          }\n        }[]\n      | {\n          /**\n           * Type of the content provided\n           */\n          type?: string\n          text?: string\n          image_url?: {\n            /**\n             * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted\n             */\n            url?: string\n          }\n        }\n  }[]\n  image?: number[] | (string & NonNullable<unknown>)\n  functions?: {\n    name: string\n    code: string\n  }[]\n  /**\n   * A list of tools available for the assistant to use.\n   */\n  tools?: (\n    | {\n        /**\n         * The name of the tool. More descriptive the better.\n         */\n        name: string\n        /**\n         * A brief description of what the tool does.\n         */\n        description: string\n        /**\n         * Schema defining the parameters accepted by the tool.\n         */\n        parameters: {\n          /**\n           * The type of the parameters object (usually 'object').\n           */\n          type: string\n          /**\n           * List of required parameter names.\n           */\n          required?: string[]\n          /**\n           * Definitions of each parameter.\n           */\n          properties: {\n            [k: string]: {\n              /**\n               * The data type of the parameter.\n               */\n              type: string\n              /**\n               * A description of the expected parameter.\n               */\n              description: string\n            }\n          }\n        }\n      }\n    | {\n        /**\n         * Specifies the type of tool (e.g., 'function').\n         */\n        type: string\n        /**\n         * Details of the function tool.\n         */\n        function: {\n          /**\n           * The name of the function.\n           */\n          name: string\n          /**\n           * A brief description of what the function does.\n           */\n          description: string\n          /**\n           * Schema defining the parameters accepted by the function.\n           */\n          parameters: {\n            /**\n             * The type of the parameters object (usually 'object').\n             */\n            type: string\n            /**\n             * List of required parameter names.\n             */\n            required?: string[]\n            /**\n             * Definitions of each parameter.\n             */\n            properties: {\n              [k: string]: {\n                /**\n                 * The data type of the parameter.\n                 */\n                type: string\n                /**\n                 * A description of the expected parameter.\n                 */\n                description: string\n              }\n            }\n          }\n        }\n      }\n  )[]\n  /**\n   * If true, the response will be streamed back incrementally.\n   */\n  stream?: boolean\n  /**\n   * The maximum number of tokens to generate in the response.\n   */\n  max_tokens?: number\n  /**\n   * Controls the randomness of the output; higher values produce more random results.\n   */\n  temperature?: number\n  /**\n   * Controls the creativity of the AI's responses by adjusting how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n   */\n  top_p?: number\n  /**\n   * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.\n   */\n  top_k?: number\n  /**\n   * Random seed for reproducibility of the generation.\n   */\n  seed?: number\n  /**\n   * Penalty for repeated tokens; higher values discourage repetition.\n   */\n  repetition_penalty?: number\n  /**\n   * Decreases the likelihood of the model repeating the same lines verbatim.\n   */\n  frequency_penalty?: number\n  /**\n   * Increases the likelihood of the model introducing new topics.\n   */\n  presence_penalty?: number\n}\ntype Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Output = {\n  /**\n   * The generated text response from the model\n   */\n  response?: string\n  /**\n   * An array of tool calls requests made during the response generation\n   */\n  tool_calls?: {\n    /**\n     * The arguments passed to be passed to the tool call request\n     */\n    arguments?: object\n    /**\n     * The name of the tool to be called\n     */\n    name?: string\n  }[]\n}\ndeclare abstract class Base_Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct {\n  inputs: Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Input\n  postProcessedOutputs: Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Output\n}\ntype Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Input =\n  | Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Prompt\n  | Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Messages\n  | Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Async_Batch\ninterface Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Prompt {\n  /**\n   * The input text prompt for the model to generate a response.\n   */\n  prompt: string\n  /**\n   * Name of the LoRA (Low-Rank Adaptation) model to fine-tune the base model.\n   */\n  lora?: string\n  response_format?: Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_JSON_Mode\n  /**\n   * If true, a chat template is not applied and you must adhere to the specific model's expected formatting.\n   */\n  raw?: boolean\n  /**\n   * If true, the response will be streamed back incrementally using SSE, Server Sent Events.\n   */\n  stream?: boolean\n  /**\n   * The maximum number of tokens to generate in the response.\n   */\n  max_tokens?: number\n  /**\n   * Controls the randomness of the output; higher values produce more random results.\n   */\n  temperature?: number\n  /**\n   * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n   */\n  top_p?: number\n  /**\n   * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.\n   */\n  top_k?: number\n  /**\n   * Random seed for reproducibility of the generation.\n   */\n  seed?: number\n  /**\n   * Penalty for repeated tokens; higher values discourage repetition.\n   */\n  repetition_penalty?: number\n  /**\n   * Decreases the likelihood of the model repeating the same lines verbatim.\n   */\n  frequency_penalty?: number\n  /**\n   * Increases the likelihood of the model introducing new topics.\n   */\n  presence_penalty?: number\n}\ninterface Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_JSON_Mode {\n  type?: 'json_object' | 'json_schema'\n  json_schema?: unknown\n}\ninterface Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Messages {\n  /**\n   * An array of message objects representing the conversation history.\n   */\n  messages: {\n    /**\n     * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool').\n     */\n    role: string\n    /**\n     * The content of the message as a string.\n     */\n    content: string\n  }[]\n  functions?: {\n    name: string\n    code: string\n  }[]\n  /**\n   * A list of tools available for the assistant to use.\n   */\n  tools?: (\n    | {\n        /**\n         * The name of the tool. More descriptive the better.\n         */\n        name: string\n        /**\n         * A brief description of what the tool does.\n         */\n        description: string\n        /**\n         * Schema defining the parameters accepted by the tool.\n         */\n        parameters: {\n          /**\n           * The type of the parameters object (usually 'object').\n           */\n          type: string\n          /**\n           * List of required parameter names.\n           */\n          required?: string[]\n          /**\n           * Definitions of each parameter.\n           */\n          properties: {\n            [k: string]: {\n              /**\n               * The data type of the parameter.\n               */\n              type: string\n              /**\n               * A description of the expected parameter.\n               */\n              description: string\n            }\n          }\n        }\n      }\n    | {\n        /**\n         * Specifies the type of tool (e.g., 'function').\n         */\n        type: string\n        /**\n         * Details of the function tool.\n         */\n        function: {\n          /**\n           * The name of the function.\n           */\n          name: string\n          /**\n           * A brief description of what the function does.\n           */\n          description: string\n          /**\n           * Schema defining the parameters accepted by the function.\n           */\n          parameters: {\n            /**\n             * The type of the parameters object (usually 'object').\n             */\n            type: string\n            /**\n             * List of required parameter names.\n             */\n            required?: string[]\n            /**\n             * Definitions of each parameter.\n             */\n            properties: {\n              [k: string]: {\n                /**\n                 * The data type of the parameter.\n                 */\n                type: string\n                /**\n                 * A description of the expected parameter.\n                 */\n                description: string\n              }\n            }\n          }\n        }\n      }\n  )[]\n  response_format?: Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_JSON_Mode_1\n  /**\n   * If true, a chat template is not applied and you must adhere to the specific model's expected formatting.\n   */\n  raw?: boolean\n  /**\n   * If true, the response will be streamed back incrementally using SSE, Server Sent Events.\n   */\n  stream?: boolean\n  /**\n   * The maximum number of tokens to generate in the response.\n   */\n  max_tokens?: number\n  /**\n   * Controls the randomness of the output; higher values produce more random results.\n   */\n  temperature?: number\n  /**\n   * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n   */\n  top_p?: number\n  /**\n   * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.\n   */\n  top_k?: number\n  /**\n   * Random seed for reproducibility of the generation.\n   */\n  seed?: number\n  /**\n   * Penalty for repeated tokens; higher values discourage repetition.\n   */\n  repetition_penalty?: number\n  /**\n   * Decreases the likelihood of the model repeating the same lines verbatim.\n   */\n  frequency_penalty?: number\n  /**\n   * Increases the likelihood of the model introducing new topics.\n   */\n  presence_penalty?: number\n}\ninterface Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_JSON_Mode_1 {\n  type?: 'json_object' | 'json_schema'\n  json_schema?: unknown\n}\ninterface Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Async_Batch {\n  requests?: {\n    /**\n     * User-supplied reference. This field will be present in the response as well it can be used to reference the request and response. It's NOT validated to be unique.\n     */\n    external_reference?: string\n    /**\n     * Prompt for the text generation model\n     */\n    prompt?: string\n    /**\n     * If true, the response will be streamed back incrementally using SSE, Server Sent Events.\n     */\n    stream?: boolean\n    /**\n     * The maximum number of tokens to generate in the response.\n     */\n    max_tokens?: number\n    /**\n     * Controls the randomness of the output; higher values produce more random results.\n     */\n    temperature?: number\n    /**\n     * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n     */\n    top_p?: number\n    /**\n     * Random seed for reproducibility of the generation.\n     */\n    seed?: number\n    /**\n     * Penalty for repeated tokens; higher values discourage repetition.\n     */\n    repetition_penalty?: number\n    /**\n     * Decreases the likelihood of the model repeating the same lines verbatim.\n     */\n    frequency_penalty?: number\n    /**\n     * Increases the likelihood of the model introducing new topics.\n     */\n    presence_penalty?: number\n    response_format?: Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_JSON_Mode_2\n  }[]\n}\ninterface Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_JSON_Mode_2 {\n  type?: 'json_object' | 'json_schema'\n  json_schema?: unknown\n}\ntype Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Output =\n  | {\n      /**\n       * The generated text response from the model\n       */\n      response: string\n      /**\n       * Usage statistics for the inference request\n       */\n      usage?: {\n        /**\n         * Total number of tokens in input\n         */\n        prompt_tokens?: number\n        /**\n         * Total number of tokens in output\n         */\n        completion_tokens?: number\n        /**\n         * Total number of input and output tokens\n         */\n        total_tokens?: number\n      }\n      /**\n       * An array of tool calls requests made during the response generation\n       */\n      tool_calls?: {\n        /**\n         * The arguments passed to be passed to the tool call request\n         */\n        arguments?: object\n        /**\n         * The name of the tool to be called\n         */\n        name?: string\n      }[]\n    }\n  | string\n  | Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_AsyncResponse\ninterface Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_AsyncResponse {\n  /**\n   * The async request id that can be used to obtain the results.\n   */\n  request_id?: string\n}\ndeclare abstract class Base_Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast {\n  inputs: Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Input\n  postProcessedOutputs: Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Output\n}\ninterface Ai_Cf_Meta_Llama_Guard_3_8B_Input {\n  /**\n   * An array of message objects representing the conversation history.\n   */\n  messages: {\n    /**\n     * The role of the message sender must alternate between 'user' and 'assistant'.\n     */\n    role: 'user' | 'assistant'\n    /**\n     * The content of the message as a string.\n     */\n    content: string\n  }[]\n  /**\n   * The maximum number of tokens to generate in the response.\n   */\n  max_tokens?: number\n  /**\n   * Controls the randomness of the output; higher values produce more random results.\n   */\n  temperature?: number\n  /**\n   * Dictate the output format of the generated response.\n   */\n  response_format?: {\n    /**\n     * Set to json_object to process and output generated text as JSON.\n     */\n    type?: string\n  }\n}\ninterface Ai_Cf_Meta_Llama_Guard_3_8B_Output {\n  response?:\n    | string\n    | {\n        /**\n         * Whether the conversation is safe or not.\n         */\n        safe?: boolean\n        /**\n         * A list of what hazard categories predicted for the conversation, if the conversation is deemed unsafe.\n         */\n        categories?: string[]\n      }\n  /**\n   * Usage statistics for the inference request\n   */\n  usage?: {\n    /**\n     * Total number of tokens in input\n     */\n    prompt_tokens?: number\n    /**\n     * Total number of tokens in output\n     */\n    completion_tokens?: number\n    /**\n     * Total number of input and output tokens\n     */\n    total_tokens?: number\n  }\n}\ndeclare abstract class Base_Ai_Cf_Meta_Llama_Guard_3_8B {\n  inputs: Ai_Cf_Meta_Llama_Guard_3_8B_Input\n  postProcessedOutputs: Ai_Cf_Meta_Llama_Guard_3_8B_Output\n}\ninterface Ai_Cf_Baai_Bge_Reranker_Base_Input {\n  /**\n   * A query you wish to perform against the provided contexts.\n   */\n  /**\n   * Number of returned results starting with the best score.\n   */\n  top_k?: number\n  /**\n   * List of provided contexts. Note that the index in this array is important, as the response will refer to it.\n   */\n  contexts: {\n    /**\n     * One of the provided context content\n     */\n    text?: string\n  }[]\n}\ninterface Ai_Cf_Baai_Bge_Reranker_Base_Output {\n  response?: {\n    /**\n     * Index of the context in the request\n     */\n    id?: number\n    /**\n     * Score of the context under the index.\n     */\n    score?: number\n  }[]\n}\ndeclare abstract class Base_Ai_Cf_Baai_Bge_Reranker_Base {\n  inputs: Ai_Cf_Baai_Bge_Reranker_Base_Input\n  postProcessedOutputs: Ai_Cf_Baai_Bge_Reranker_Base_Output\n}\ntype Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_Input =\n  | Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_Prompt\n  | Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_Messages\ninterface Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_Prompt {\n  /**\n   * The input text prompt for the model to generate a response.\n   */\n  prompt: string\n  /**\n   * Name of the LoRA (Low-Rank Adaptation) model to fine-tune the base model.\n   */\n  lora?: string\n  response_format?: Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_JSON_Mode\n  /**\n   * If true, a chat template is not applied and you must adhere to the specific model's expected formatting.\n   */\n  raw?: boolean\n  /**\n   * If true, the response will be streamed back incrementally using SSE, Server Sent Events.\n   */\n  stream?: boolean\n  /**\n   * The maximum number of tokens to generate in the response.\n   */\n  max_tokens?: number\n  /**\n   * Controls the randomness of the output; higher values produce more random results.\n   */\n  temperature?: number\n  /**\n   * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n   */\n  top_p?: number\n  /**\n   * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.\n   */\n  top_k?: number\n  /**\n   * Random seed for reproducibility of the generation.\n   */\n  seed?: number\n  /**\n   * Penalty for repeated tokens; higher values discourage repetition.\n   */\n  repetition_penalty?: number\n  /**\n   * Decreases the likelihood of the model repeating the same lines verbatim.\n   */\n  frequency_penalty?: number\n  /**\n   * Increases the likelihood of the model introducing new topics.\n   */\n  presence_penalty?: number\n}\ninterface Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_JSON_Mode {\n  type?: 'json_object' | 'json_schema'\n  json_schema?: unknown\n}\ninterface Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_Messages {\n  /**\n   * An array of message objects representing the conversation history.\n   */\n  messages: {\n    /**\n     * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool').\n     */\n    role: string\n    /**\n     * The content of the message as a string.\n     */\n    content: string\n  }[]\n  functions?: {\n    name: string\n    code: string\n  }[]\n  /**\n   * A list of tools available for the assistant to use.\n   */\n  tools?: (\n    | {\n        /**\n         * The name of the tool. More descriptive the better.\n         */\n        name: string\n        /**\n         * A brief description of what the tool does.\n         */\n        description: string\n        /**\n         * Schema defining the parameters accepted by the tool.\n         */\n        parameters: {\n          /**\n           * The type of the parameters object (usually 'object').\n           */\n          type: string\n          /**\n           * List of required parameter names.\n           */\n          required?: string[]\n          /**\n           * Definitions of each parameter.\n           */\n          properties: {\n            [k: string]: {\n              /**\n               * The data type of the parameter.\n               */\n              type: string\n              /**\n               * A description of the expected parameter.\n               */\n              description: string\n            }\n          }\n        }\n      }\n    | {\n        /**\n         * Specifies the type of tool (e.g., 'function').\n         */\n        type: string\n        /**\n         * Details of the function tool.\n         */\n        function: {\n          /**\n           * The name of the function.\n           */\n          name: string\n          /**\n           * A brief description of what the function does.\n           */\n          description: string\n          /**\n           * Schema defining the parameters accepted by the function.\n           */\n          parameters: {\n            /**\n             * The type of the parameters object (usually 'object').\n             */\n            type: string\n            /**\n             * List of required parameter names.\n             */\n            required?: string[]\n            /**\n             * Definitions of each parameter.\n             */\n            properties: {\n              [k: string]: {\n                /**\n                 * The data type of the parameter.\n                 */\n                type: string\n                /**\n                 * A description of the expected parameter.\n                 */\n                description: string\n              }\n            }\n          }\n        }\n      }\n  )[]\n  response_format?: Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_JSON_Mode_1\n  /**\n   * If true, a chat template is not applied and you must adhere to the specific model's expected formatting.\n   */\n  raw?: boolean\n  /**\n   * If true, the response will be streamed back incrementally using SSE, Server Sent Events.\n   */\n  stream?: boolean\n  /**\n   * The maximum number of tokens to generate in the response.\n   */\n  max_tokens?: number\n  /**\n   * Controls the randomness of the output; higher values produce more random results.\n   */\n  temperature?: number\n  /**\n   * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n   */\n  top_p?: number\n  /**\n   * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.\n   */\n  top_k?: number\n  /**\n   * Random seed for reproducibility of the generation.\n   */\n  seed?: number\n  /**\n   * Penalty for repeated tokens; higher values discourage repetition.\n   */\n  repetition_penalty?: number\n  /**\n   * Decreases the likelihood of the model repeating the same lines verbatim.\n   */\n  frequency_penalty?: number\n  /**\n   * Increases the likelihood of the model introducing new topics.\n   */\n  presence_penalty?: number\n}\ninterface Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_JSON_Mode_1 {\n  type?: 'json_object' | 'json_schema'\n  json_schema?: unknown\n}\ntype Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_Output = {\n  /**\n   * The generated text response from the model\n   */\n  response: string\n  /**\n   * Usage statistics for the inference request\n   */\n  usage?: {\n    /**\n     * Total number of tokens in input\n     */\n    prompt_tokens?: number\n    /**\n     * Total number of tokens in output\n     */\n    completion_tokens?: number\n    /**\n     * Total number of input and output tokens\n     */\n    total_tokens?: number\n  }\n  /**\n   * An array of tool calls requests made during the response generation\n   */\n  tool_calls?: {\n    /**\n     * The arguments passed to be passed to the tool call request\n     */\n    arguments?: object\n    /**\n     * The name of the tool to be called\n     */\n    name?: string\n  }[]\n}\ndeclare abstract class Base_Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct {\n  inputs: Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_Input\n  postProcessedOutputs: Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct_Output\n}\ntype Ai_Cf_Qwen_Qwq_32B_Input =\n  | Ai_Cf_Qwen_Qwq_32B_Prompt\n  | Ai_Cf_Qwen_Qwq_32B_Messages\ninterface Ai_Cf_Qwen_Qwq_32B_Prompt {\n  /**\n   * The input text prompt for the model to generate a response.\n   */\n  prompt: string\n  /**\n   * JSON schema that should be fulfilled for the response.\n   */\n  guided_json?: object\n  /**\n   * If true, a chat template is not applied and you must adhere to the specific model's expected formatting.\n   */\n  raw?: boolean\n  /**\n   * If true, the response will be streamed back incrementally using SSE, Server Sent Events.\n   */\n  stream?: boolean\n  /**\n   * The maximum number of tokens to generate in the response.\n   */\n  max_tokens?: number\n  /**\n   * Controls the randomness of the output; higher values produce more random results.\n   */\n  temperature?: number\n  /**\n   * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n   */\n  top_p?: number\n  /**\n   * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.\n   */\n  top_k?: number\n  /**\n   * Random seed for reproducibility of the generation.\n   */\n  seed?: number\n  /**\n   * Penalty for repeated tokens; higher values discourage repetition.\n   */\n  repetition_penalty?: number\n  /**\n   * Decreases the likelihood of the model repeating the same lines verbatim.\n   */\n  frequency_penalty?: number\n  /**\n   * Increases the likelihood of the model introducing new topics.\n   */\n  presence_penalty?: number\n}\ninterface Ai_Cf_Qwen_Qwq_32B_Messages {\n  /**\n   * An array of message objects representing the conversation history.\n   */\n  messages: {\n    /**\n     * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool').\n     */\n    role?: string\n    /**\n     * The tool call id. Must be supplied for tool calls for Mistral-3. If you don't know what to put here you can fall back to 000000001\n     */\n    tool_call_id?: string\n    content?:\n      | string\n      | {\n          /**\n           * Type of the content provided\n           */\n          type?: string\n          text?: string\n          image_url?: {\n            /**\n             * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted\n             */\n            url?: string\n          }\n        }[]\n      | {\n          /**\n           * Type of the content provided\n           */\n          type?: string\n          text?: string\n          image_url?: {\n            /**\n             * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted\n             */\n            url?: string\n          }\n        }\n  }[]\n  functions?: {\n    name: string\n    code: string\n  }[]\n  /**\n   * A list of tools available for the assistant to use.\n   */\n  tools?: (\n    | {\n        /**\n         * The name of the tool. More descriptive the better.\n         */\n        name: string\n        /**\n         * A brief description of what the tool does.\n         */\n        description: string\n        /**\n         * Schema defining the parameters accepted by the tool.\n         */\n        parameters: {\n          /**\n           * The type of the parameters object (usually 'object').\n           */\n          type: string\n          /**\n           * List of required parameter names.\n           */\n          required?: string[]\n          /**\n           * Definitions of each parameter.\n           */\n          properties: {\n            [k: string]: {\n              /**\n               * The data type of the parameter.\n               */\n              type: string\n              /**\n               * A description of the expected parameter.\n               */\n              description: string\n            }\n          }\n        }\n      }\n    | {\n        /**\n         * Specifies the type of tool (e.g., 'function').\n         */\n        type: string\n        /**\n         * Details of the function tool.\n         */\n        function: {\n          /**\n           * The name of the function.\n           */\n          name: string\n          /**\n           * A brief description of what the function does.\n           */\n          description: string\n          /**\n           * Schema defining the parameters accepted by the function.\n           */\n          parameters: {\n            /**\n             * The type of the parameters object (usually 'object').\n             */\n            type: string\n            /**\n             * List of required parameter names.\n             */\n            required?: string[]\n            /**\n             * Definitions of each parameter.\n             */\n            properties: {\n              [k: string]: {\n                /**\n                 * The data type of the parameter.\n                 */\n                type: string\n                /**\n                 * A description of the expected parameter.\n                 */\n                description: string\n              }\n            }\n          }\n        }\n      }\n  )[]\n  /**\n   * JSON schema that should be fufilled for the response.\n   */\n  guided_json?: object\n  /**\n   * If true, a chat template is not applied and you must adhere to the specific model's expected formatting.\n   */\n  raw?: boolean\n  /**\n   * If true, the response will be streamed back incrementally using SSE, Server Sent Events.\n   */\n  stream?: boolean\n  /**\n   * The maximum number of tokens to generate in the response.\n   */\n  max_tokens?: number\n  /**\n   * Controls the randomness of the output; higher values produce more random results.\n   */\n  temperature?: number\n  /**\n   * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n   */\n  top_p?: number\n  /**\n   * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.\n   */\n  top_k?: number\n  /**\n   * Random seed for reproducibility of the generation.\n   */\n  seed?: number\n  /**\n   * Penalty for repeated tokens; higher values discourage repetition.\n   */\n  repetition_penalty?: number\n  /**\n   * Decreases the likelihood of the model repeating the same lines verbatim.\n   */\n  frequency_penalty?: number\n  /**\n   * Increases the likelihood of the model introducing new topics.\n   */\n  presence_penalty?: number\n}\ntype Ai_Cf_Qwen_Qwq_32B_Output = {\n  /**\n   * The generated text response from the model\n   */\n  response: string\n  /**\n   * Usage statistics for the inference request\n   */\n  usage?: {\n    /**\n     * Total number of tokens in input\n     */\n    prompt_tokens?: number\n    /**\n     * Total number of tokens in output\n     */\n    completion_tokens?: number\n    /**\n     * Total number of input and output tokens\n     */\n    total_tokens?: number\n  }\n  /**\n   * An array of tool calls requests made during the response generation\n   */\n  tool_calls?: {\n    /**\n     * The arguments passed to be passed to the tool call request\n     */\n    arguments?: object\n    /**\n     * The name of the tool to be called\n     */\n    name?: string\n  }[]\n}\ndeclare abstract class Base_Ai_Cf_Qwen_Qwq_32B {\n  inputs: Ai_Cf_Qwen_Qwq_32B_Input\n  postProcessedOutputs: Ai_Cf_Qwen_Qwq_32B_Output\n}\ntype Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct_Input =\n  | Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct_Prompt\n  | Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct_Messages\ninterface Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct_Prompt {\n  /**\n   * The input text prompt for the model to generate a response.\n   */\n  prompt: string\n  /**\n   * JSON schema that should be fulfilled for the response.\n   */\n  guided_json?: object\n  /**\n   * If true, a chat template is not applied and you must adhere to the specific model's expected formatting.\n   */\n  raw?: boolean\n  /**\n   * If true, the response will be streamed back incrementally using SSE, Server Sent Events.\n   */\n  stream?: boolean\n  /**\n   * The maximum number of tokens to generate in the response.\n   */\n  max_tokens?: number\n  /**\n   * Controls the randomness of the output; higher values produce more random results.\n   */\n  temperature?: number\n  /**\n   * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n   */\n  top_p?: number\n  /**\n   * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.\n   */\n  top_k?: number\n  /**\n   * Random seed for reproducibility of the generation.\n   */\n  seed?: number\n  /**\n   * Penalty for repeated tokens; higher values discourage repetition.\n   */\n  repetition_penalty?: number\n  /**\n   * Decreases the likelihood of the model repeating the same lines verbatim.\n   */\n  frequency_penalty?: number\n  /**\n   * Increases the likelihood of the model introducing new topics.\n   */\n  presence_penalty?: number\n}\ninterface Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct_Messages {\n  /**\n   * An array of message objects representing the conversation history.\n   */\n  messages: {\n    /**\n     * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool').\n     */\n    role?: string\n    /**\n     * The tool call id. Must be supplied for tool calls for Mistral-3. If you don't know what to put here you can fall back to 000000001\n     */\n    tool_call_id?: string\n    content?:\n      | string\n      | {\n          /**\n           * Type of the content provided\n           */\n          type?: string\n          text?: string\n          image_url?: {\n            /**\n             * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted\n             */\n            url?: string\n          }\n        }[]\n      | {\n          /**\n           * Type of the content provided\n           */\n          type?: string\n          text?: string\n          image_url?: {\n            /**\n             * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted\n             */\n            url?: string\n          }\n        }\n  }[]\n  functions?: {\n    name: string\n    code: string\n  }[]\n  /**\n   * A list of tools available for the assistant to use.\n   */\n  tools?: (\n    | {\n        /**\n         * The name of the tool. More descriptive the better.\n         */\n        name: string\n        /**\n         * A brief description of what the tool does.\n         */\n        description: string\n        /**\n         * Schema defining the parameters accepted by the tool.\n         */\n        parameters: {\n          /**\n           * The type of the parameters object (usually 'object').\n           */\n          type: string\n          /**\n           * List of required parameter names.\n           */\n          required?: string[]\n          /**\n           * Definitions of each parameter.\n           */\n          properties: {\n            [k: string]: {\n              /**\n               * The data type of the parameter.\n               */\n              type: string\n              /**\n               * A description of the expected parameter.\n               */\n              description: string\n            }\n          }\n        }\n      }\n    | {\n        /**\n         * Specifies the type of tool (e.g., 'function').\n         */\n        type: string\n        /**\n         * Details of the function tool.\n         */\n        function: {\n          /**\n           * The name of the function.\n           */\n          name: string\n          /**\n           * A brief description of what the function does.\n           */\n          description: string\n          /**\n           * Schema defining the parameters accepted by the function.\n           */\n          parameters: {\n            /**\n             * The type of the parameters object (usually 'object').\n             */\n            type: string\n            /**\n             * List of required parameter names.\n             */\n            required?: string[]\n            /**\n             * Definitions of each parameter.\n             */\n            properties: {\n              [k: string]: {\n                /**\n                 * The data type of the parameter.\n                 */\n                type: string\n                /**\n                 * A description of the expected parameter.\n                 */\n                description: string\n              }\n            }\n          }\n        }\n      }\n  )[]\n  /**\n   * JSON schema that should be fufilled for the response.\n   */\n  guided_json?: object\n  /**\n   * If true, a chat template is not applied and you must adhere to the specific model's expected formatting.\n   */\n  raw?: boolean\n  /**\n   * If true, the response will be streamed back incrementally using SSE, Server Sent Events.\n   */\n  stream?: boolean\n  /**\n   * The maximum number of tokens to generate in the response.\n   */\n  max_tokens?: number\n  /**\n   * Controls the randomness of the output; higher values produce more random results.\n   */\n  temperature?: number\n  /**\n   * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n   */\n  top_p?: number\n  /**\n   * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.\n   */\n  top_k?: number\n  /**\n   * Random seed for reproducibility of the generation.\n   */\n  seed?: number\n  /**\n   * Penalty for repeated tokens; higher values discourage repetition.\n   */\n  repetition_penalty?: number\n  /**\n   * Decreases the likelihood of the model repeating the same lines verbatim.\n   */\n  frequency_penalty?: number\n  /**\n   * Increases the likelihood of the model introducing new topics.\n   */\n  presence_penalty?: number\n}\ntype Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct_Output = {\n  /**\n   * The generated text response from the model\n   */\n  response: string\n  /**\n   * Usage statistics for the inference request\n   */\n  usage?: {\n    /**\n     * Total number of tokens in input\n     */\n    prompt_tokens?: number\n    /**\n     * Total number of tokens in output\n     */\n    completion_tokens?: number\n    /**\n     * Total number of input and output tokens\n     */\n    total_tokens?: number\n  }\n  /**\n   * An array of tool calls requests made during the response generation\n   */\n  tool_calls?: {\n    /**\n     * The arguments passed to be passed to the tool call request\n     */\n    arguments?: object\n    /**\n     * The name of the tool to be called\n     */\n    name?: string\n  }[]\n}\ndeclare abstract class Base_Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct {\n  inputs: Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct_Input\n  postProcessedOutputs: Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct_Output\n}\ntype Ai_Cf_Google_Gemma_3_12B_It_Input =\n  | Ai_Cf_Google_Gemma_3_12B_It_Prompt\n  | Ai_Cf_Google_Gemma_3_12B_It_Messages\ninterface Ai_Cf_Google_Gemma_3_12B_It_Prompt {\n  /**\n   * The input text prompt for the model to generate a response.\n   */\n  prompt: string\n  /**\n   * JSON schema that should be fufilled for the response.\n   */\n  guided_json?: object\n  /**\n   * If true, a chat template is not applied and you must adhere to the specific model's expected formatting.\n   */\n  raw?: boolean\n  /**\n   * If true, the response will be streamed back incrementally using SSE, Server Sent Events.\n   */\n  stream?: boolean\n  /**\n   * The maximum number of tokens to generate in the response.\n   */\n  max_tokens?: number\n  /**\n   * Controls the randomness of the output; higher values produce more random results.\n   */\n  temperature?: number\n  /**\n   * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n   */\n  top_p?: number\n  /**\n   * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.\n   */\n  top_k?: number\n  /**\n   * Random seed for reproducibility of the generation.\n   */\n  seed?: number\n  /**\n   * Penalty for repeated tokens; higher values discourage repetition.\n   */\n  repetition_penalty?: number\n  /**\n   * Decreases the likelihood of the model repeating the same lines verbatim.\n   */\n  frequency_penalty?: number\n  /**\n   * Increases the likelihood of the model introducing new topics.\n   */\n  presence_penalty?: number\n}\ninterface Ai_Cf_Google_Gemma_3_12B_It_Messages {\n  /**\n   * An array of message objects representing the conversation history.\n   */\n  messages: {\n    /**\n     * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool').\n     */\n    role?: string\n    content?:\n      | string\n      | {\n          /**\n           * Type of the content provided\n           */\n          type?: string\n          text?: string\n          image_url?: {\n            /**\n             * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted\n             */\n            url?: string\n          }\n        }[]\n  }[]\n  functions?: {\n    name: string\n    code: string\n  }[]\n  /**\n   * A list of tools available for the assistant to use.\n   */\n  tools?: (\n    | {\n        /**\n         * The name of the tool. More descriptive the better.\n         */\n        name: string\n        /**\n         * A brief description of what the tool does.\n         */\n        description: string\n        /**\n         * Schema defining the parameters accepted by the tool.\n         */\n        parameters: {\n          /**\n           * The type of the parameters object (usually 'object').\n           */\n          type: string\n          /**\n           * List of required parameter names.\n           */\n          required?: string[]\n          /**\n           * Definitions of each parameter.\n           */\n          properties: {\n            [k: string]: {\n              /**\n               * The data type of the parameter.\n               */\n              type: string\n              /**\n               * A description of the expected parameter.\n               */\n              description: string\n            }\n          }\n        }\n      }\n    | {\n        /**\n         * Specifies the type of tool (e.g., 'function').\n         */\n        type: string\n        /**\n         * Details of the function tool.\n         */\n        function: {\n          /**\n           * The name of the function.\n           */\n          name: string\n          /**\n           * A brief description of what the function does.\n           */\n          description: string\n          /**\n           * Schema defining the parameters accepted by the function.\n           */\n          parameters: {\n            /**\n             * The type of the parameters object (usually 'object').\n             */\n            type: string\n            /**\n             * List of required parameter names.\n             */\n            required?: string[]\n            /**\n             * Definitions of each parameter.\n             */\n            properties: {\n              [k: string]: {\n                /**\n                 * The data type of the parameter.\n                 */\n                type: string\n                /**\n                 * A description of the expected parameter.\n                 */\n                description: string\n              }\n            }\n          }\n        }\n      }\n  )[]\n  /**\n   * JSON schema that should be fufilled for the response.\n   */\n  guided_json?: object\n  /**\n   * If true, a chat template is not applied and you must adhere to the specific model's expected formatting.\n   */\n  raw?: boolean\n  /**\n   * If true, the response will be streamed back incrementally using SSE, Server Sent Events.\n   */\n  stream?: boolean\n  /**\n   * The maximum number of tokens to generate in the response.\n   */\n  max_tokens?: number\n  /**\n   * Controls the randomness of the output; higher values produce more random results.\n   */\n  temperature?: number\n  /**\n   * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n   */\n  top_p?: number\n  /**\n   * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.\n   */\n  top_k?: number\n  /**\n   * Random seed for reproducibility of the generation.\n   */\n  seed?: number\n  /**\n   * Penalty for repeated tokens; higher values discourage repetition.\n   */\n  repetition_penalty?: number\n  /**\n   * Decreases the likelihood of the model repeating the same lines verbatim.\n   */\n  frequency_penalty?: number\n  /**\n   * Increases the likelihood of the model introducing new topics.\n   */\n  presence_penalty?: number\n}\ntype Ai_Cf_Google_Gemma_3_12B_It_Output = {\n  /**\n   * The generated text response from the model\n   */\n  response: string\n  /**\n   * Usage statistics for the inference request\n   */\n  usage?: {\n    /**\n     * Total number of tokens in input\n     */\n    prompt_tokens?: number\n    /**\n     * Total number of tokens in output\n     */\n    completion_tokens?: number\n    /**\n     * Total number of input and output tokens\n     */\n    total_tokens?: number\n  }\n  /**\n   * An array of tool calls requests made during the response generation\n   */\n  tool_calls?: {\n    /**\n     * The arguments passed to be passed to the tool call request\n     */\n    arguments?: object\n    /**\n     * The name of the tool to be called\n     */\n    name?: string\n  }[]\n}\ndeclare abstract class Base_Ai_Cf_Google_Gemma_3_12B_It {\n  inputs: Ai_Cf_Google_Gemma_3_12B_It_Input\n  postProcessedOutputs: Ai_Cf_Google_Gemma_3_12B_It_Output\n}\ntype Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Input =\n  | Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Prompt\n  | Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Messages\n  | Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Async_Batch\ninterface Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Prompt {\n  /**\n   * The input text prompt for the model to generate a response.\n   */\n  prompt: string\n  /**\n   * JSON schema that should be fulfilled for the response.\n   */\n  guided_json?: object\n  response_format?: Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_JSON_Mode\n  /**\n   * If true, a chat template is not applied and you must adhere to the specific model's expected formatting.\n   */\n  raw?: boolean\n  /**\n   * If true, the response will be streamed back incrementally using SSE, Server Sent Events.\n   */\n  stream?: boolean\n  /**\n   * The maximum number of tokens to generate in the response.\n   */\n  max_tokens?: number\n  /**\n   * Controls the randomness of the output; higher values produce more random results.\n   */\n  temperature?: number\n  /**\n   * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n   */\n  top_p?: number\n  /**\n   * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.\n   */\n  top_k?: number\n  /**\n   * Random seed for reproducibility of the generation.\n   */\n  seed?: number\n  /**\n   * Penalty for repeated tokens; higher values discourage repetition.\n   */\n  repetition_penalty?: number\n  /**\n   * Decreases the likelihood of the model repeating the same lines verbatim.\n   */\n  frequency_penalty?: number\n  /**\n   * Increases the likelihood of the model introducing new topics.\n   */\n  presence_penalty?: number\n}\ninterface Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_JSON_Mode {\n  type?: 'json_object' | 'json_schema'\n  json_schema?: unknown\n}\ninterface Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Messages {\n  /**\n   * An array of message objects representing the conversation history.\n   */\n  messages: {\n    /**\n     * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool').\n     */\n    role?: string\n    /**\n     * The tool call id. If you don't know what to put here you can fall back to 000000001\n     */\n    tool_call_id?: string\n    content?:\n      | string\n      | {\n          /**\n           * Type of the content provided\n           */\n          type?: string\n          text?: string\n          image_url?: {\n            /**\n             * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted\n             */\n            url?: string\n          }\n        }[]\n      | {\n          /**\n           * Type of the content provided\n           */\n          type?: string\n          text?: string\n          image_url?: {\n            /**\n             * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted\n             */\n            url?: string\n          }\n        }\n  }[]\n  functions?: {\n    name: string\n    code: string\n  }[]\n  /**\n   * A list of tools available for the assistant to use.\n   */\n  tools?: (\n    | {\n        /**\n         * The name of the tool. More descriptive the better.\n         */\n        name: string\n        /**\n         * A brief description of what the tool does.\n         */\n        description: string\n        /**\n         * Schema defining the parameters accepted by the tool.\n         */\n        parameters: {\n          /**\n           * The type of the parameters object (usually 'object').\n           */\n          type: string\n          /**\n           * List of required parameter names.\n           */\n          required?: string[]\n          /**\n           * Definitions of each parameter.\n           */\n          properties: {\n            [k: string]: {\n              /**\n               * The data type of the parameter.\n               */\n              type: string\n              /**\n               * A description of the expected parameter.\n               */\n              description: string\n            }\n          }\n        }\n      }\n    | {\n        /**\n         * Specifies the type of tool (e.g., 'function').\n         */\n        type: string\n        /**\n         * Details of the function tool.\n         */\n        function: {\n          /**\n           * The name of the function.\n           */\n          name: string\n          /**\n           * A brief description of what the function does.\n           */\n          description: string\n          /**\n           * Schema defining the parameters accepted by the function.\n           */\n          parameters: {\n            /**\n             * The type of the parameters object (usually 'object').\n             */\n            type: string\n            /**\n             * List of required parameter names.\n             */\n            required?: string[]\n            /**\n             * Definitions of each parameter.\n             */\n            properties: {\n              [k: string]: {\n                /**\n                 * The data type of the parameter.\n                 */\n                type: string\n                /**\n                 * A description of the expected parameter.\n                 */\n                description: string\n              }\n            }\n          }\n        }\n      }\n  )[]\n  response_format?: Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_JSON_Mode\n  /**\n   * JSON schema that should be fufilled for the response.\n   */\n  guided_json?: object\n  /**\n   * If true, a chat template is not applied and you must adhere to the specific model's expected formatting.\n   */\n  raw?: boolean\n  /**\n   * If true, the response will be streamed back incrementally using SSE, Server Sent Events.\n   */\n  stream?: boolean\n  /**\n   * The maximum number of tokens to generate in the response.\n   */\n  max_tokens?: number\n  /**\n   * Controls the randomness of the output; higher values produce more random results.\n   */\n  temperature?: number\n  /**\n   * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n   */\n  top_p?: number\n  /**\n   * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.\n   */\n  top_k?: number\n  /**\n   * Random seed for reproducibility of the generation.\n   */\n  seed?: number\n  /**\n   * Penalty for repeated tokens; higher values discourage repetition.\n   */\n  repetition_penalty?: number\n  /**\n   * Decreases the likelihood of the model repeating the same lines verbatim.\n   */\n  frequency_penalty?: number\n  /**\n   * Increases the likelihood of the model introducing new topics.\n   */\n  presence_penalty?: number\n}\ninterface Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Async_Batch {\n  requests: (\n    | Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Prompt_Inner\n    | Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Messages_Inner\n  )[]\n}\ninterface Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Prompt_Inner {\n  /**\n   * The input text prompt for the model to generate a response.\n   */\n  prompt: string\n  /**\n   * JSON schema that should be fulfilled for the response.\n   */\n  guided_json?: object\n  response_format?: Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_JSON_Mode\n  /**\n   * If true, a chat template is not applied and you must adhere to the specific model's expected formatting.\n   */\n  raw?: boolean\n  /**\n   * If true, the response will be streamed back incrementally using SSE, Server Sent Events.\n   */\n  stream?: boolean\n  /**\n   * The maximum number of tokens to generate in the response.\n   */\n  max_tokens?: number\n  /**\n   * Controls the randomness of the output; higher values produce more random results.\n   */\n  temperature?: number\n  /**\n   * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n   */\n  top_p?: number\n  /**\n   * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.\n   */\n  top_k?: number\n  /**\n   * Random seed for reproducibility of the generation.\n   */\n  seed?: number\n  /**\n   * Penalty for repeated tokens; higher values discourage repetition.\n   */\n  repetition_penalty?: number\n  /**\n   * Decreases the likelihood of the model repeating the same lines verbatim.\n   */\n  frequency_penalty?: number\n  /**\n   * Increases the likelihood of the model introducing new topics.\n   */\n  presence_penalty?: number\n}\ninterface Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Messages_Inner {\n  /**\n   * An array of message objects representing the conversation history.\n   */\n  messages: {\n    /**\n     * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool').\n     */\n    role?: string\n    /**\n     * The tool call id. If you don't know what to put here you can fall back to 000000001\n     */\n    tool_call_id?: string\n    content?:\n      | string\n      | {\n          /**\n           * Type of the content provided\n           */\n          type?: string\n          text?: string\n          image_url?: {\n            /**\n             * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted\n             */\n            url?: string\n          }\n        }[]\n      | {\n          /**\n           * Type of the content provided\n           */\n          type?: string\n          text?: string\n          image_url?: {\n            /**\n             * image uri with data (e.g. data:image/jpeg;base64,/9j/...). HTTP URL will not be accepted\n             */\n            url?: string\n          }\n        }\n  }[]\n  functions?: {\n    name: string\n    code: string\n  }[]\n  /**\n   * A list of tools available for the assistant to use.\n   */\n  tools?: (\n    | {\n        /**\n         * The name of the tool. More descriptive the better.\n         */\n        name: string\n        /**\n         * A brief description of what the tool does.\n         */\n        description: string\n        /**\n         * Schema defining the parameters accepted by the tool.\n         */\n        parameters: {\n          /**\n           * The type of the parameters object (usually 'object').\n           */\n          type: string\n          /**\n           * List of required parameter names.\n           */\n          required?: string[]\n          /**\n           * Definitions of each parameter.\n           */\n          properties: {\n            [k: string]: {\n              /**\n               * The data type of the parameter.\n               */\n              type: string\n              /**\n               * A description of the expected parameter.\n               */\n              description: string\n            }\n          }\n        }\n      }\n    | {\n        /**\n         * Specifies the type of tool (e.g., 'function').\n         */\n        type: string\n        /**\n         * Details of the function tool.\n         */\n        function: {\n          /**\n           * The name of the function.\n           */\n          name: string\n          /**\n           * A brief description of what the function does.\n           */\n          description: string\n          /**\n           * Schema defining the parameters accepted by the function.\n           */\n          parameters: {\n            /**\n             * The type of the parameters object (usually 'object').\n             */\n            type: string\n            /**\n             * List of required parameter names.\n             */\n            required?: string[]\n            /**\n             * Definitions of each parameter.\n             */\n            properties: {\n              [k: string]: {\n                /**\n                 * The data type of the parameter.\n                 */\n                type: string\n                /**\n                 * A description of the expected parameter.\n                 */\n                description: string\n              }\n            }\n          }\n        }\n      }\n  )[]\n  response_format?: Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_JSON_Mode\n  /**\n   * JSON schema that should be fufilled for the response.\n   */\n  guided_json?: object\n  /**\n   * If true, a chat template is not applied and you must adhere to the specific model's expected formatting.\n   */\n  raw?: boolean\n  /**\n   * If true, the response will be streamed back incrementally using SSE, Server Sent Events.\n   */\n  stream?: boolean\n  /**\n   * The maximum number of tokens to generate in the response.\n   */\n  max_tokens?: number\n  /**\n   * Controls the randomness of the output; higher values produce more random results.\n   */\n  temperature?: number\n  /**\n   * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n   */\n  top_p?: number\n  /**\n   * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.\n   */\n  top_k?: number\n  /**\n   * Random seed for reproducibility of the generation.\n   */\n  seed?: number\n  /**\n   * Penalty for repeated tokens; higher values discourage repetition.\n   */\n  repetition_penalty?: number\n  /**\n   * Decreases the likelihood of the model repeating the same lines verbatim.\n   */\n  frequency_penalty?: number\n  /**\n   * Increases the likelihood of the model introducing new topics.\n   */\n  presence_penalty?: number\n}\ntype Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Output = {\n  /**\n   * The generated text response from the model\n   */\n  response: string\n  /**\n   * Usage statistics for the inference request\n   */\n  usage?: {\n    /**\n     * Total number of tokens in input\n     */\n    prompt_tokens?: number\n    /**\n     * Total number of tokens in output\n     */\n    completion_tokens?: number\n    /**\n     * Total number of input and output tokens\n     */\n    total_tokens?: number\n  }\n  /**\n   * An array of tool calls requests made during the response generation\n   */\n  tool_calls?: {\n    /**\n     * The tool call id.\n     */\n    id?: string\n    /**\n     * Specifies the type of tool (e.g., 'function').\n     */\n    type?: string\n    /**\n     * Details of the function tool.\n     */\n    function?: {\n      /**\n       * The name of the tool to be called\n       */\n      name?: string\n      /**\n       * The arguments passed to be passed to the tool call request\n       */\n      arguments?: object\n    }\n  }[]\n}\ndeclare abstract class Base_Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct {\n  inputs: Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Input\n  postProcessedOutputs: Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Output\n}\ntype Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Input =\n  | Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Prompt\n  | Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Messages\n  | Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Async_Batch\ninterface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Prompt {\n  /**\n   * The input text prompt for the model to generate a response.\n   */\n  prompt: string\n  /**\n   * Name of the LoRA (Low-Rank Adaptation) model to fine-tune the base model.\n   */\n  lora?: string\n  response_format?: Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_JSON_Mode\n  /**\n   * If true, a chat template is not applied and you must adhere to the specific model's expected formatting.\n   */\n  raw?: boolean\n  /**\n   * If true, the response will be streamed back incrementally using SSE, Server Sent Events.\n   */\n  stream?: boolean\n  /**\n   * The maximum number of tokens to generate in the response.\n   */\n  max_tokens?: number\n  /**\n   * Controls the randomness of the output; higher values produce more random results.\n   */\n  temperature?: number\n  /**\n   * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n   */\n  top_p?: number\n  /**\n   * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.\n   */\n  top_k?: number\n  /**\n   * Random seed for reproducibility of the generation.\n   */\n  seed?: number\n  /**\n   * Penalty for repeated tokens; higher values discourage repetition.\n   */\n  repetition_penalty?: number\n  /**\n   * Decreases the likelihood of the model repeating the same lines verbatim.\n   */\n  frequency_penalty?: number\n  /**\n   * Increases the likelihood of the model introducing new topics.\n   */\n  presence_penalty?: number\n}\ninterface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_JSON_Mode {\n  type?: 'json_object' | 'json_schema'\n  json_schema?: unknown\n}\ninterface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Messages {\n  /**\n   * An array of message objects representing the conversation history.\n   */\n  messages: {\n    /**\n     * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool').\n     */\n    role: string\n    /**\n     * The content of the message as a string.\n     */\n    content: string\n  }[]\n  functions?: {\n    name: string\n    code: string\n  }[]\n  /**\n   * A list of tools available for the assistant to use.\n   */\n  tools?: (\n    | {\n        /**\n         * The name of the tool. More descriptive the better.\n         */\n        name: string\n        /**\n         * A brief description of what the tool does.\n         */\n        description: string\n        /**\n         * Schema defining the parameters accepted by the tool.\n         */\n        parameters: {\n          /**\n           * The type of the parameters object (usually 'object').\n           */\n          type: string\n          /**\n           * List of required parameter names.\n           */\n          required?: string[]\n          /**\n           * Definitions of each parameter.\n           */\n          properties: {\n            [k: string]: {\n              /**\n               * The data type of the parameter.\n               */\n              type: string\n              /**\n               * A description of the expected parameter.\n               */\n              description: string\n            }\n          }\n        }\n      }\n    | {\n        /**\n         * Specifies the type of tool (e.g., 'function').\n         */\n        type: string\n        /**\n         * Details of the function tool.\n         */\n        function: {\n          /**\n           * The name of the function.\n           */\n          name: string\n          /**\n           * A brief description of what the function does.\n           */\n          description: string\n          /**\n           * Schema defining the parameters accepted by the function.\n           */\n          parameters: {\n            /**\n             * The type of the parameters object (usually 'object').\n             */\n            type: string\n            /**\n             * List of required parameter names.\n             */\n            required?: string[]\n            /**\n             * Definitions of each parameter.\n             */\n            properties: {\n              [k: string]: {\n                /**\n                 * The data type of the parameter.\n                 */\n                type: string\n                /**\n                 * A description of the expected parameter.\n                 */\n                description: string\n              }\n            }\n          }\n        }\n      }\n  )[]\n  response_format?: Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_JSON_Mode_1\n  /**\n   * If true, a chat template is not applied and you must adhere to the specific model's expected formatting.\n   */\n  raw?: boolean\n  /**\n   * If true, the response will be streamed back incrementally using SSE, Server Sent Events.\n   */\n  stream?: boolean\n  /**\n   * The maximum number of tokens to generate in the response.\n   */\n  max_tokens?: number\n  /**\n   * Controls the randomness of the output; higher values produce more random results.\n   */\n  temperature?: number\n  /**\n   * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n   */\n  top_p?: number\n  /**\n   * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.\n   */\n  top_k?: number\n  /**\n   * Random seed for reproducibility of the generation.\n   */\n  seed?: number\n  /**\n   * Penalty for repeated tokens; higher values discourage repetition.\n   */\n  repetition_penalty?: number\n  /**\n   * Decreases the likelihood of the model repeating the same lines verbatim.\n   */\n  frequency_penalty?: number\n  /**\n   * Increases the likelihood of the model introducing new topics.\n   */\n  presence_penalty?: number\n}\ninterface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_JSON_Mode_1 {\n  type?: 'json_object' | 'json_schema'\n  json_schema?: unknown\n}\ninterface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Async_Batch {\n  requests: (\n    | Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Prompt_1\n    | Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Messages_1\n  )[]\n}\ninterface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Prompt_1 {\n  /**\n   * The input text prompt for the model to generate a response.\n   */\n  prompt: string\n  /**\n   * Name of the LoRA (Low-Rank Adaptation) model to fine-tune the base model.\n   */\n  lora?: string\n  response_format?: Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_JSON_Mode_2\n  /**\n   * If true, a chat template is not applied and you must adhere to the specific model's expected formatting.\n   */\n  raw?: boolean\n  /**\n   * If true, the response will be streamed back incrementally using SSE, Server Sent Events.\n   */\n  stream?: boolean\n  /**\n   * The maximum number of tokens to generate in the response.\n   */\n  max_tokens?: number\n  /**\n   * Controls the randomness of the output; higher values produce more random results.\n   */\n  temperature?: number\n  /**\n   * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n   */\n  top_p?: number\n  /**\n   * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.\n   */\n  top_k?: number\n  /**\n   * Random seed for reproducibility of the generation.\n   */\n  seed?: number\n  /**\n   * Penalty for repeated tokens; higher values discourage repetition.\n   */\n  repetition_penalty?: number\n  /**\n   * Decreases the likelihood of the model repeating the same lines verbatim.\n   */\n  frequency_penalty?: number\n  /**\n   * Increases the likelihood of the model introducing new topics.\n   */\n  presence_penalty?: number\n}\ninterface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_JSON_Mode_2 {\n  type?: 'json_object' | 'json_schema'\n  json_schema?: unknown\n}\ninterface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Messages_1 {\n  /**\n   * An array of message objects representing the conversation history.\n   */\n  messages: {\n    /**\n     * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool').\n     */\n    role: string\n    /**\n     * The content of the message as a string.\n     */\n    content: string\n  }[]\n  functions?: {\n    name: string\n    code: string\n  }[]\n  /**\n   * A list of tools available for the assistant to use.\n   */\n  tools?: (\n    | {\n        /**\n         * The name of the tool. More descriptive the better.\n         */\n        name: string\n        /**\n         * A brief description of what the tool does.\n         */\n        description: string\n        /**\n         * Schema defining the parameters accepted by the tool.\n         */\n        parameters: {\n          /**\n           * The type of the parameters object (usually 'object').\n           */\n          type: string\n          /**\n           * List of required parameter names.\n           */\n          required?: string[]\n          /**\n           * Definitions of each parameter.\n           */\n          properties: {\n            [k: string]: {\n              /**\n               * The data type of the parameter.\n               */\n              type: string\n              /**\n               * A description of the expected parameter.\n               */\n              description: string\n            }\n          }\n        }\n      }\n    | {\n        /**\n         * Specifies the type of tool (e.g., 'function').\n         */\n        type: string\n        /**\n         * Details of the function tool.\n         */\n        function: {\n          /**\n           * The name of the function.\n           */\n          name: string\n          /**\n           * A brief description of what the function does.\n           */\n          description: string\n          /**\n           * Schema defining the parameters accepted by the function.\n           */\n          parameters: {\n            /**\n             * The type of the parameters object (usually 'object').\n             */\n            type: string\n            /**\n             * List of required parameter names.\n             */\n            required?: string[]\n            /**\n             * Definitions of each parameter.\n             */\n            properties: {\n              [k: string]: {\n                /**\n                 * The data type of the parameter.\n                 */\n                type: string\n                /**\n                 * A description of the expected parameter.\n                 */\n                description: string\n              }\n            }\n          }\n        }\n      }\n  )[]\n  response_format?: Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_JSON_Mode_3\n  /**\n   * If true, a chat template is not applied and you must adhere to the specific model's expected formatting.\n   */\n  raw?: boolean\n  /**\n   * If true, the response will be streamed back incrementally using SSE, Server Sent Events.\n   */\n  stream?: boolean\n  /**\n   * The maximum number of tokens to generate in the response.\n   */\n  max_tokens?: number\n  /**\n   * Controls the randomness of the output; higher values produce more random results.\n   */\n  temperature?: number\n  /**\n   * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n   */\n  top_p?: number\n  /**\n   * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.\n   */\n  top_k?: number\n  /**\n   * Random seed for reproducibility of the generation.\n   */\n  seed?: number\n  /**\n   * Penalty for repeated tokens; higher values discourage repetition.\n   */\n  repetition_penalty?: number\n  /**\n   * Decreases the likelihood of the model repeating the same lines verbatim.\n   */\n  frequency_penalty?: number\n  /**\n   * Increases the likelihood of the model introducing new topics.\n   */\n  presence_penalty?: number\n}\ninterface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_JSON_Mode_3 {\n  type?: 'json_object' | 'json_schema'\n  json_schema?: unknown\n}\ntype Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Output =\n  | Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Chat_Completion_Response\n  | Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Text_Completion_Response\n  | string\n  | Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_AsyncResponse\ninterface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Chat_Completion_Response {\n  /**\n   * Unique identifier for the completion\n   */\n  id?: string\n  /**\n   * Object type identifier\n   */\n  object?: 'chat.completion'\n  /**\n   * Unix timestamp of when the completion was created\n   */\n  created?: number\n  /**\n   * Model used for the completion\n   */\n  model?: string\n  /**\n   * List of completion choices\n   */\n  choices?: {\n    /**\n     * Index of the choice in the list\n     */\n    index?: number\n    /**\n     * The message generated by the model\n     */\n    message?: {\n      /**\n       * Role of the message author\n       */\n      role: string\n      /**\n       * The content of the message\n       */\n      content: string\n      /**\n       * Internal reasoning content (if available)\n       */\n      reasoning_content?: string\n      /**\n       * Tool calls made by the assistant\n       */\n      tool_calls?: {\n        /**\n         * Unique identifier for the tool call\n         */\n        id: string\n        /**\n         * Type of tool call\n         */\n        type: 'function'\n        function: {\n          /**\n           * Name of the function to call\n           */\n          name: string\n          /**\n           * JSON string of arguments for the function\n           */\n          arguments: string\n        }\n      }[]\n    }\n    /**\n     * Reason why the model stopped generating\n     */\n    finish_reason?: string\n    /**\n     * Stop reason (may be null)\n     */\n    stop_reason?: string | null\n    /**\n     * Log probabilities (if requested)\n     */\n    logprobs?: {} | null\n  }[]\n  /**\n   * Usage statistics for the inference request\n   */\n  usage?: {\n    /**\n     * Total number of tokens in input\n     */\n    prompt_tokens?: number\n    /**\n     * Total number of tokens in output\n     */\n    completion_tokens?: number\n    /**\n     * Total number of input and output tokens\n     */\n    total_tokens?: number\n  }\n  /**\n   * Log probabilities for the prompt (if requested)\n   */\n  prompt_logprobs?: {} | null\n}\ninterface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Text_Completion_Response {\n  /**\n   * Unique identifier for the completion\n   */\n  id?: string\n  /**\n   * Object type identifier\n   */\n  object?: 'text_completion'\n  /**\n   * Unix timestamp of when the completion was created\n   */\n  created?: number\n  /**\n   * Model used for the completion\n   */\n  model?: string\n  /**\n   * List of completion choices\n   */\n  choices?: {\n    /**\n     * Index of the choice in the list\n     */\n    index: number\n    /**\n     * The generated text completion\n     */\n    text: string\n    /**\n     * Reason why the model stopped generating\n     */\n    finish_reason: string\n    /**\n     * Stop reason (may be null)\n     */\n    stop_reason?: string | null\n    /**\n     * Log probabilities (if requested)\n     */\n    logprobs?: {} | null\n    /**\n     * Log probabilities for the prompt (if requested)\n     */\n    prompt_logprobs?: {} | null\n  }[]\n  /**\n   * Usage statistics for the inference request\n   */\n  usage?: {\n    /**\n     * Total number of tokens in input\n     */\n    prompt_tokens?: number\n    /**\n     * Total number of tokens in output\n     */\n    completion_tokens?: number\n    /**\n     * Total number of input and output tokens\n     */\n    total_tokens?: number\n  }\n}\ninterface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_AsyncResponse {\n  /**\n   * The async request id that can be used to obtain the results.\n   */\n  request_id?: string\n}\ndeclare abstract class Base_Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8 {\n  inputs: Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Input\n  postProcessedOutputs: Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Output\n}\ninterface Ai_Cf_Deepgram_Nova_3_Input {\n  audio: {\n    body: object\n    contentType: string\n  }\n  /**\n   * Sets how the model will interpret strings submitted to the custom_topic param. When strict, the model will only return topics submitted using the custom_topic param. When extended, the model will return its own detected topics in addition to those submitted using the custom_topic param.\n   */\n  custom_topic_mode?: 'extended' | 'strict'\n  /**\n   * Custom topics you want the model to detect within your input audio or text if present Submit up to 100\n   */\n  custom_topic?: string\n  /**\n   * Sets how the model will interpret intents submitted to the custom_intent param. When strict, the model will only return intents submitted using the custom_intent param. When extended, the model will return its own detected intents in addition those submitted using the custom_intents param\n   */\n  custom_intent_mode?: 'extended' | 'strict'\n  /**\n   * Custom intents you want the model to detect within your input audio if present\n   */\n  custom_intent?: string\n  /**\n   * Identifies and extracts key entities from content in submitted audio\n   */\n  detect_entities?: boolean\n  /**\n   * Identifies the dominant language spoken in submitted audio\n   */\n  detect_language?: boolean\n  /**\n   * Recognize speaker changes. Each word in the transcript will be assigned a speaker number starting at 0\n   */\n  diarize?: boolean\n  /**\n   * Identify and extract key entities from content in submitted audio\n   */\n  dictation?: boolean\n  /**\n   * Specify the expected encoding of your submitted audio\n   */\n  encoding?:\n    | 'linear16'\n    | 'flac'\n    | 'mulaw'\n    | 'amr-nb'\n    | 'amr-wb'\n    | 'opus'\n    | 'speex'\n    | 'g729'\n  /**\n   * Arbitrary key-value pairs that are attached to the API response for usage in downstream processing\n   */\n  extra?: string\n  /**\n   * Filler Words can help transcribe interruptions in your audio, like 'uh' and 'um'\n   */\n  filler_words?: boolean\n  /**\n   * Key term prompting can boost or suppress specialized terminology and brands.\n   */\n  keyterm?: string\n  /**\n   * Keywords can boost or suppress specialized terminology and brands.\n   */\n  keywords?: string\n  /**\n   * The BCP-47 language tag that hints at the primary spoken language. Depending on the Model and API endpoint you choose only certain languages are available.\n   */\n  language?: string\n  /**\n   * Spoken measurements will be converted to their corresponding abbreviations.\n   */\n  measurements?: boolean\n  /**\n   * Opts out requests from the Deepgram Model Improvement Program. Refer to our Docs for pricing impacts before setting this to true. https://dpgr.am/deepgram-mip.\n   */\n  mip_opt_out?: boolean\n  /**\n   * Mode of operation for the model representing broad area of topic that will be talked about in the supplied audio\n   */\n  mode?: 'general' | 'medical' | 'finance'\n  /**\n   * Transcribe each audio channel independently.\n   */\n  multichannel?: boolean\n  /**\n   * Numerals converts numbers from written format to numerical format.\n   */\n  numerals?: boolean\n  /**\n   * Splits audio into paragraphs to improve transcript readability.\n   */\n  paragraphs?: boolean\n  /**\n   * Profanity Filter looks for recognized profanity and converts it to the nearest recognized non-profane word or removes it from the transcript completely.\n   */\n  profanity_filter?: boolean\n  /**\n   * Add punctuation and capitalization to the transcript.\n   */\n  punctuate?: boolean\n  /**\n   * Redaction removes sensitive information from your transcripts.\n   */\n  redact?: string\n  /**\n   * Search for terms or phrases in submitted audio and replaces them.\n   */\n  replace?: string\n  /**\n   * Search for terms or phrases in submitted audio.\n   */\n  search?: string\n  /**\n   * Recognizes the sentiment throughout a transcript or text.\n   */\n  sentiment?: boolean\n  /**\n   * Apply formatting to transcript output. When set to true, additional formatting will be applied to transcripts to improve readability.\n   */\n  smart_format?: boolean\n  /**\n   * Detect topics throughout a transcript or text.\n   */\n  topics?: boolean\n  /**\n   * Segments speech into meaningful semantic units.\n   */\n  utterances?: boolean\n  /**\n   * Seconds to wait before detecting a pause between words in submitted audio.\n   */\n  utt_split?: number\n  /**\n   * The number of channels in the submitted audio\n   */\n  channels?: number\n  /**\n   * Specifies whether the streaming endpoint should provide ongoing transcription updates as more audio is received. When set to true, the endpoint sends continuous updates, meaning transcription results may evolve over time. Note: Supported only for webosockets.\n   */\n  interim_results?: boolean\n  /**\n   * Indicates how long model will wait to detect whether a speaker has finished speaking or pauses for a significant period of time. When set to a value, the streaming endpoint immediately finalizes the transcription for the processed time range and returns the transcript with a speech_final parameter set to true. Can also be set to false to disable endpointing\n   */\n  endpointing?: string\n  /**\n   * Indicates that speech has started. You'll begin receiving Speech Started messages upon speech starting. Note: Supported only for webosockets.\n   */\n  vad_events?: boolean\n  /**\n   * Indicates how long model will wait to send an UtteranceEnd message after a word has been transcribed. Use with interim_results. Note: Supported only for webosockets.\n   */\n  utterance_end_ms?: boolean\n}\ninterface Ai_Cf_Deepgram_Nova_3_Output {\n  results?: {\n    channels?: {\n      alternatives?: {\n        confidence?: number\n        transcript?: string\n        words?: {\n          confidence?: number\n          end?: number\n          start?: number\n          word?: string\n        }[]\n      }[]\n    }[]\n    summary?: {\n      result?: string\n      short?: string\n    }\n    sentiments?: {\n      segments?: {\n        text?: string\n        start_word?: number\n        end_word?: number\n        sentiment?: string\n        sentiment_score?: number\n      }[]\n      average?: {\n        sentiment?: string\n        sentiment_score?: number\n      }\n    }\n  }\n}\ndeclare abstract class Base_Ai_Cf_Deepgram_Nova_3 {\n  inputs: Ai_Cf_Deepgram_Nova_3_Input\n  postProcessedOutputs: Ai_Cf_Deepgram_Nova_3_Output\n}\ninterface Ai_Cf_Qwen_Qwen3_Embedding_0_6B_Input {\n  queries?: string | string[]\n  /**\n   * Optional instruction for the task\n   */\n  instruction?: string\n  documents?: string | string[]\n  text?: string | string[]\n}\ninterface Ai_Cf_Qwen_Qwen3_Embedding_0_6B_Output {\n  data?: number[][]\n  shape?: number[]\n}\ndeclare abstract class Base_Ai_Cf_Qwen_Qwen3_Embedding_0_6B {\n  inputs: Ai_Cf_Qwen_Qwen3_Embedding_0_6B_Input\n  postProcessedOutputs: Ai_Cf_Qwen_Qwen3_Embedding_0_6B_Output\n}\ntype Ai_Cf_Pipecat_Ai_Smart_Turn_V2_Input =\n  | {\n      /**\n       * readable stream with audio data and content-type specified for that data\n       */\n      audio: {\n        body: object\n        contentType: string\n      }\n      /**\n       * type of data PCM data that's sent to the inference server as raw array\n       */\n      dtype?: 'uint8' | 'float32' | 'float64'\n    }\n  | {\n      /**\n       * base64 encoded audio data\n       */\n      audio: string\n      /**\n       * type of data PCM data that's sent to the inference server as raw array\n       */\n      dtype?: 'uint8' | 'float32' | 'float64'\n    }\ninterface Ai_Cf_Pipecat_Ai_Smart_Turn_V2_Output {\n  /**\n   * if true, end-of-turn was detected\n   */\n  is_complete?: boolean\n  /**\n   * probability of the end-of-turn detection\n   */\n  probability?: number\n}\ndeclare abstract class Base_Ai_Cf_Pipecat_Ai_Smart_Turn_V2 {\n  inputs: Ai_Cf_Pipecat_Ai_Smart_Turn_V2_Input\n  postProcessedOutputs: Ai_Cf_Pipecat_Ai_Smart_Turn_V2_Output\n}\ndeclare abstract class Base_Ai_Cf_Openai_Gpt_Oss_120B {\n  inputs: ResponsesInput\n  postProcessedOutputs: ResponsesOutput\n}\ndeclare abstract class Base_Ai_Cf_Openai_Gpt_Oss_20B {\n  inputs: ResponsesInput\n  postProcessedOutputs: ResponsesOutput\n}\ninterface Ai_Cf_Leonardo_Phoenix_1_0_Input {\n  /**\n   * A text description of the image you want to generate.\n   */\n  prompt: string\n  /**\n   * Controls how closely the generated image should adhere to the prompt; higher values make the image more aligned with the prompt\n   */\n  guidance?: number\n  /**\n   * Random seed for reproducibility of the image generation\n   */\n  seed?: number\n  /**\n   * The height of the generated image in pixels\n   */\n  height?: number\n  /**\n   * The width of the generated image in pixels\n   */\n  width?: number\n  /**\n   * The number of diffusion steps; higher values can improve quality but take longer\n   */\n  num_steps?: number\n  /**\n   * Specify what to exclude from the generated images\n   */\n  negative_prompt?: string\n}\n/**\n * The generated image in JPEG format\n */\ntype Ai_Cf_Leonardo_Phoenix_1_0_Output = string\ndeclare abstract class Base_Ai_Cf_Leonardo_Phoenix_1_0 {\n  inputs: Ai_Cf_Leonardo_Phoenix_1_0_Input\n  postProcessedOutputs: Ai_Cf_Leonardo_Phoenix_1_0_Output\n}\ninterface Ai_Cf_Leonardo_Lucid_Origin_Input {\n  /**\n   * A text description of the image you want to generate.\n   */\n  prompt: string\n  /**\n   * Controls how closely the generated image should adhere to the prompt; higher values make the image more aligned with the prompt\n   */\n  guidance?: number\n  /**\n   * Random seed for reproducibility of the image generation\n   */\n  seed?: number\n  /**\n   * The height of the generated image in pixels\n   */\n  height?: number\n  /**\n   * The width of the generated image in pixels\n   */\n  width?: number\n  /**\n   * The number of diffusion steps; higher values can improve quality but take longer\n   */\n  num_steps?: number\n  /**\n   * The number of diffusion steps; higher values can improve quality but take longer\n   */\n  steps?: number\n}\ninterface Ai_Cf_Leonardo_Lucid_Origin_Output {\n  /**\n   * The generated image in Base64 format.\n   */\n  image?: string\n}\ndeclare abstract class Base_Ai_Cf_Leonardo_Lucid_Origin {\n  inputs: Ai_Cf_Leonardo_Lucid_Origin_Input\n  postProcessedOutputs: Ai_Cf_Leonardo_Lucid_Origin_Output\n}\ninterface Ai_Cf_Deepgram_Aura_1_Input {\n  /**\n   * Speaker used to produce the audio.\n   */\n  speaker?:\n    | 'angus'\n    | 'asteria'\n    | 'arcas'\n    | 'orion'\n    | 'orpheus'\n    | 'athena'\n    | 'luna'\n    | 'zeus'\n    | 'perseus'\n    | 'helios'\n    | 'hera'\n    | 'stella'\n  /**\n   * Encoding of the output audio.\n   */\n  encoding?: 'linear16' | 'flac' | 'mulaw' | 'alaw' | 'mp3' | 'opus' | 'aac'\n  /**\n   * Container specifies the file format wrapper for the output audio. The available options depend on the encoding type..\n   */\n  container?: 'none' | 'wav' | 'ogg'\n  /**\n   * The text content to be converted to speech\n   */\n  text: string\n  /**\n   * Sample Rate specifies the sample rate for the output audio. Based on the encoding, different sample rates are supported. For some encodings, the sample rate is not configurable\n   */\n  sample_rate?: number\n  /**\n   * The bitrate of the audio in bits per second. Choose from predefined ranges or specific values based on the encoding type.\n   */\n  bit_rate?: number\n}\n/**\n * The generated audio in MP3 format\n */\ntype Ai_Cf_Deepgram_Aura_1_Output = string\ndeclare abstract class Base_Ai_Cf_Deepgram_Aura_1 {\n  inputs: Ai_Cf_Deepgram_Aura_1_Input\n  postProcessedOutputs: Ai_Cf_Deepgram_Aura_1_Output\n}\ninterface Ai_Cf_Ai4Bharat_Indictrans2_En_Indic_1B_Input {\n  /**\n   * Input text to translate. Can be a single string or a list of strings.\n   */\n  text: string | string[]\n  /**\n   * Target langauge to translate to\n   */\n  target_language:\n    | 'asm_Beng'\n    | 'awa_Deva'\n    | 'ben_Beng'\n    | 'bho_Deva'\n    | 'brx_Deva'\n    | 'doi_Deva'\n    | 'eng_Latn'\n    | 'gom_Deva'\n    | 'gon_Deva'\n    | 'guj_Gujr'\n    | 'hin_Deva'\n    | 'hne_Deva'\n    | 'kan_Knda'\n    | 'kas_Arab'\n    | 'kas_Deva'\n    | 'kha_Latn'\n    | 'lus_Latn'\n    | 'mag_Deva'\n    | 'mai_Deva'\n    | 'mal_Mlym'\n    | 'mar_Deva'\n    | 'mni_Beng'\n    | 'mni_Mtei'\n    | 'npi_Deva'\n    | 'ory_Orya'\n    | 'pan_Guru'\n    | 'san_Deva'\n    | 'sat_Olck'\n    | 'snd_Arab'\n    | 'snd_Deva'\n    | 'tam_Taml'\n    | 'tel_Telu'\n    | 'urd_Arab'\n    | 'unr_Deva'\n}\ninterface Ai_Cf_Ai4Bharat_Indictrans2_En_Indic_1B_Output {\n  /**\n   * Translated texts\n   */\n  translations: string[]\n}\ndeclare abstract class Base_Ai_Cf_Ai4Bharat_Indictrans2_En_Indic_1B {\n  inputs: Ai_Cf_Ai4Bharat_Indictrans2_En_Indic_1B_Input\n  postProcessedOutputs: Ai_Cf_Ai4Bharat_Indictrans2_En_Indic_1B_Output\n}\ntype Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Input =\n  | Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Prompt\n  | Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Messages\n  | Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Async_Batch\ninterface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Prompt {\n  /**\n   * The input text prompt for the model to generate a response.\n   */\n  prompt: string\n  /**\n   * Name of the LoRA (Low-Rank Adaptation) model to fine-tune the base model.\n   */\n  lora?: string\n  response_format?: Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_JSON_Mode\n  /**\n   * If true, a chat template is not applied and you must adhere to the specific model's expected formatting.\n   */\n  raw?: boolean\n  /**\n   * If true, the response will be streamed back incrementally using SSE, Server Sent Events.\n   */\n  stream?: boolean\n  /**\n   * The maximum number of tokens to generate in the response.\n   */\n  max_tokens?: number\n  /**\n   * Controls the randomness of the output; higher values produce more random results.\n   */\n  temperature?: number\n  /**\n   * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n   */\n  top_p?: number\n  /**\n   * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.\n   */\n  top_k?: number\n  /**\n   * Random seed for reproducibility of the generation.\n   */\n  seed?: number\n  /**\n   * Penalty for repeated tokens; higher values discourage repetition.\n   */\n  repetition_penalty?: number\n  /**\n   * Decreases the likelihood of the model repeating the same lines verbatim.\n   */\n  frequency_penalty?: number\n  /**\n   * Increases the likelihood of the model introducing new topics.\n   */\n  presence_penalty?: number\n}\ninterface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_JSON_Mode {\n  type?: 'json_object' | 'json_schema'\n  json_schema?: unknown\n}\ninterface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Messages {\n  /**\n   * An array of message objects representing the conversation history.\n   */\n  messages: {\n    /**\n     * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool').\n     */\n    role: string\n    /**\n     * The content of the message as a string.\n     */\n    content: string\n  }[]\n  functions?: {\n    name: string\n    code: string\n  }[]\n  /**\n   * A list of tools available for the assistant to use.\n   */\n  tools?: (\n    | {\n        /**\n         * The name of the tool. More descriptive the better.\n         */\n        name: string\n        /**\n         * A brief description of what the tool does.\n         */\n        description: string\n        /**\n         * Schema defining the parameters accepted by the tool.\n         */\n        parameters: {\n          /**\n           * The type of the parameters object (usually 'object').\n           */\n          type: string\n          /**\n           * List of required parameter names.\n           */\n          required?: string[]\n          /**\n           * Definitions of each parameter.\n           */\n          properties: {\n            [k: string]: {\n              /**\n               * The data type of the parameter.\n               */\n              type: string\n              /**\n               * A description of the expected parameter.\n               */\n              description: string\n            }\n          }\n        }\n      }\n    | {\n        /**\n         * Specifies the type of tool (e.g., 'function').\n         */\n        type: string\n        /**\n         * Details of the function tool.\n         */\n        function: {\n          /**\n           * The name of the function.\n           */\n          name: string\n          /**\n           * A brief description of what the function does.\n           */\n          description: string\n          /**\n           * Schema defining the parameters accepted by the function.\n           */\n          parameters: {\n            /**\n             * The type of the parameters object (usually 'object').\n             */\n            type: string\n            /**\n             * List of required parameter names.\n             */\n            required?: string[]\n            /**\n             * Definitions of each parameter.\n             */\n            properties: {\n              [k: string]: {\n                /**\n                 * The data type of the parameter.\n                 */\n                type: string\n                /**\n                 * A description of the expected parameter.\n                 */\n                description: string\n              }\n            }\n          }\n        }\n      }\n  )[]\n  response_format?: Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_JSON_Mode_1\n  /**\n   * If true, a chat template is not applied and you must adhere to the specific model's expected formatting.\n   */\n  raw?: boolean\n  /**\n   * If true, the response will be streamed back incrementally using SSE, Server Sent Events.\n   */\n  stream?: boolean\n  /**\n   * The maximum number of tokens to generate in the response.\n   */\n  max_tokens?: number\n  /**\n   * Controls the randomness of the output; higher values produce more random results.\n   */\n  temperature?: number\n  /**\n   * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n   */\n  top_p?: number\n  /**\n   * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.\n   */\n  top_k?: number\n  /**\n   * Random seed for reproducibility of the generation.\n   */\n  seed?: number\n  /**\n   * Penalty for repeated tokens; higher values discourage repetition.\n   */\n  repetition_penalty?: number\n  /**\n   * Decreases the likelihood of the model repeating the same lines verbatim.\n   */\n  frequency_penalty?: number\n  /**\n   * Increases the likelihood of the model introducing new topics.\n   */\n  presence_penalty?: number\n}\ninterface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_JSON_Mode_1 {\n  type?: 'json_object' | 'json_schema'\n  json_schema?: unknown\n}\ninterface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Async_Batch {\n  requests: (\n    | Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Prompt_1\n    | Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Messages_1\n  )[]\n}\ninterface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Prompt_1 {\n  /**\n   * The input text prompt for the model to generate a response.\n   */\n  prompt: string\n  /**\n   * Name of the LoRA (Low-Rank Adaptation) model to fine-tune the base model.\n   */\n  lora?: string\n  response_format?: Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_JSON_Mode_2\n  /**\n   * If true, a chat template is not applied and you must adhere to the specific model's expected formatting.\n   */\n  raw?: boolean\n  /**\n   * If true, the response will be streamed back incrementally using SSE, Server Sent Events.\n   */\n  stream?: boolean\n  /**\n   * The maximum number of tokens to generate in the response.\n   */\n  max_tokens?: number\n  /**\n   * Controls the randomness of the output; higher values produce more random results.\n   */\n  temperature?: number\n  /**\n   * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n   */\n  top_p?: number\n  /**\n   * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.\n   */\n  top_k?: number\n  /**\n   * Random seed for reproducibility of the generation.\n   */\n  seed?: number\n  /**\n   * Penalty for repeated tokens; higher values discourage repetition.\n   */\n  repetition_penalty?: number\n  /**\n   * Decreases the likelihood of the model repeating the same lines verbatim.\n   */\n  frequency_penalty?: number\n  /**\n   * Increases the likelihood of the model introducing new topics.\n   */\n  presence_penalty?: number\n}\ninterface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_JSON_Mode_2 {\n  type?: 'json_object' | 'json_schema'\n  json_schema?: unknown\n}\ninterface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Messages_1 {\n  /**\n   * An array of message objects representing the conversation history.\n   */\n  messages: {\n    /**\n     * The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool').\n     */\n    role: string\n    /**\n     * The content of the message as a string.\n     */\n    content: string\n  }[]\n  functions?: {\n    name: string\n    code: string\n  }[]\n  /**\n   * A list of tools available for the assistant to use.\n   */\n  tools?: (\n    | {\n        /**\n         * The name of the tool. More descriptive the better.\n         */\n        name: string\n        /**\n         * A brief description of what the tool does.\n         */\n        description: string\n        /**\n         * Schema defining the parameters accepted by the tool.\n         */\n        parameters: {\n          /**\n           * The type of the parameters object (usually 'object').\n           */\n          type: string\n          /**\n           * List of required parameter names.\n           */\n          required?: string[]\n          /**\n           * Definitions of each parameter.\n           */\n          properties: {\n            [k: string]: {\n              /**\n               * The data type of the parameter.\n               */\n              type: string\n              /**\n               * A description of the expected parameter.\n               */\n              description: string\n            }\n          }\n        }\n      }\n    | {\n        /**\n         * Specifies the type of tool (e.g., 'function').\n         */\n        type: string\n        /**\n         * Details of the function tool.\n         */\n        function: {\n          /**\n           * The name of the function.\n           */\n          name: string\n          /**\n           * A brief description of what the function does.\n           */\n          description: string\n          /**\n           * Schema defining the parameters accepted by the function.\n           */\n          parameters: {\n            /**\n             * The type of the parameters object (usually 'object').\n             */\n            type: string\n            /**\n             * List of required parameter names.\n             */\n            required?: string[]\n            /**\n             * Definitions of each parameter.\n             */\n            properties: {\n              [k: string]: {\n                /**\n                 * The data type of the parameter.\n                 */\n                type: string\n                /**\n                 * A description of the expected parameter.\n                 */\n                description: string\n              }\n            }\n          }\n        }\n      }\n  )[]\n  response_format?: Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_JSON_Mode_3\n  /**\n   * If true, a chat template is not applied and you must adhere to the specific model's expected formatting.\n   */\n  raw?: boolean\n  /**\n   * If true, the response will be streamed back incrementally using SSE, Server Sent Events.\n   */\n  stream?: boolean\n  /**\n   * The maximum number of tokens to generate in the response.\n   */\n  max_tokens?: number\n  /**\n   * Controls the randomness of the output; higher values produce more random results.\n   */\n  temperature?: number\n  /**\n   * Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.\n   */\n  top_p?: number\n  /**\n   * Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.\n   */\n  top_k?: number\n  /**\n   * Random seed for reproducibility of the generation.\n   */\n  seed?: number\n  /**\n   * Penalty for repeated tokens; higher values discourage repetition.\n   */\n  repetition_penalty?: number\n  /**\n   * Decreases the likelihood of the model repeating the same lines verbatim.\n   */\n  frequency_penalty?: number\n  /**\n   * Increases the likelihood of the model introducing new topics.\n   */\n  presence_penalty?: number\n}\ninterface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_JSON_Mode_3 {\n  type?: 'json_object' | 'json_schema'\n  json_schema?: unknown\n}\ntype Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Output =\n  | Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Chat_Completion_Response\n  | Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Text_Completion_Response\n  | string\n  | Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_AsyncResponse\ninterface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Chat_Completion_Response {\n  /**\n   * Unique identifier for the completion\n   */\n  id?: string\n  /**\n   * Object type identifier\n   */\n  object?: 'chat.completion'\n  /**\n   * Unix timestamp of when the completion was created\n   */\n  created?: number\n  /**\n   * Model used for the completion\n   */\n  model?: string\n  /**\n   * List of completion choices\n   */\n  choices?: {\n    /**\n     * Index of the choice in the list\n     */\n    index?: number\n    /**\n     * The message generated by the model\n     */\n    message?: {\n      /**\n       * Role of the message author\n       */\n      role: string\n      /**\n       * The content of the message\n       */\n      content: string\n      /**\n       * Internal reasoning content (if available)\n       */\n      reasoning_content?: string\n      /**\n       * Tool calls made by the assistant\n       */\n      tool_calls?: {\n        /**\n         * Unique identifier for the tool call\n         */\n        id: string\n        /**\n         * Type of tool call\n         */\n        type: 'function'\n        function: {\n          /**\n           * Name of the function to call\n           */\n          name: string\n          /**\n           * JSON string of arguments for the function\n           */\n          arguments: string\n        }\n      }[]\n    }\n    /**\n     * Reason why the model stopped generating\n     */\n    finish_reason?: string\n    /**\n     * Stop reason (may be null)\n     */\n    stop_reason?: string | null\n    /**\n     * Log probabilities (if requested)\n     */\n    logprobs?: {} | null\n  }[]\n  /**\n   * Usage statistics for the inference request\n   */\n  usage?: {\n    /**\n     * Total number of tokens in input\n     */\n    prompt_tokens?: number\n    /**\n     * Total number of tokens in output\n     */\n    completion_tokens?: number\n    /**\n     * Total number of input and output tokens\n     */\n    total_tokens?: number\n  }\n  /**\n   * Log probabilities for the prompt (if requested)\n   */\n  prompt_logprobs?: {} | null\n}\ninterface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Text_Completion_Response {\n  /**\n   * Unique identifier for the completion\n   */\n  id?: string\n  /**\n   * Object type identifier\n   */\n  object?: 'text_completion'\n  /**\n   * Unix timestamp of when the completion was created\n   */\n  created?: number\n  /**\n   * Model used for the completion\n   */\n  model?: string\n  /**\n   * List of completion choices\n   */\n  choices?: {\n    /**\n     * Index of the choice in the list\n     */\n    index: number\n    /**\n     * The generated text completion\n     */\n    text: string\n    /**\n     * Reason why the model stopped generating\n     */\n    finish_reason: string\n    /**\n     * Stop reason (may be null)\n     */\n    stop_reason?: string | null\n    /**\n     * Log probabilities (if requested)\n     */\n    logprobs?: {} | null\n    /**\n     * Log probabilities for the prompt (if requested)\n     */\n    prompt_logprobs?: {} | null\n  }[]\n  /**\n   * Usage statistics for the inference request\n   */\n  usage?: {\n    /**\n     * Total number of tokens in input\n     */\n    prompt_tokens?: number\n    /**\n     * Total number of tokens in output\n     */\n    completion_tokens?: number\n    /**\n     * Total number of input and output tokens\n     */\n    total_tokens?: number\n  }\n}\ninterface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_AsyncResponse {\n  /**\n   * The async request id that can be used to obtain the results.\n   */\n  request_id?: string\n}\ndeclare abstract class Base_Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It {\n  inputs: Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Input\n  postProcessedOutputs: Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Output\n}\ninterface Ai_Cf_Pfnet_Plamo_Embedding_1B_Input {\n  /**\n   * Input text to embed. Can be a single string or a list of strings.\n   */\n  text: string | string[]\n}\ninterface Ai_Cf_Pfnet_Plamo_Embedding_1B_Output {\n  /**\n   * Embedding vectors, where each vector is a list of floats.\n   */\n  data: number[][]\n  /**\n   * Shape of the embedding data as [number_of_embeddings, embedding_dimension].\n   *\n   * @minItems 2\n   * @maxItems 2\n   */\n  shape: [number, number]\n}\ndeclare abstract class Base_Ai_Cf_Pfnet_Plamo_Embedding_1B {\n  inputs: Ai_Cf_Pfnet_Plamo_Embedding_1B_Input\n  postProcessedOutputs: Ai_Cf_Pfnet_Plamo_Embedding_1B_Output\n}\ninterface Ai_Cf_Deepgram_Flux_Input {\n  /**\n   * Encoding of the audio stream. Currently only supports raw signed little-endian 16-bit PCM.\n   */\n  encoding: 'linear16'\n  /**\n   * Sample rate of the audio stream in Hz.\n   */\n  sample_rate: string\n  /**\n   * End-of-turn confidence required to fire an eager end-of-turn event. When set, enables EagerEndOfTurn and TurnResumed events. Valid Values 0.3 - 0.9.\n   */\n  eager_eot_threshold?: string\n  /**\n   * End-of-turn confidence required to finish a turn. Valid Values 0.5 - 0.9.\n   */\n  eot_threshold?: string\n  /**\n   * A turn will be finished when this much time has passed after speech, regardless of EOT confidence.\n   */\n  eot_timeout_ms?: string\n  /**\n   * Keyterm prompting can improve recognition of specialized terminology. Pass multiple keyterm query parameters to boost multiple keyterms.\n   */\n  keyterm?: string\n  /**\n   * Opts out requests from the Deepgram Model Improvement Program. Refer to Deepgram Docs for pricing impacts before setting this to true. https://dpgr.am/deepgram-mip\n   */\n  mip_opt_out?: 'true' | 'false'\n  /**\n   * Label your requests for the purpose of identification during usage reporting\n   */\n  tag?: string\n}\n/**\n * Output will be returned as websocket messages.\n */\ninterface Ai_Cf_Deepgram_Flux_Output {\n  /**\n   * The unique identifier of the request (uuid)\n   */\n  request_id?: string\n  /**\n   * Starts at 0 and increments for each message the server sends to the client.\n   */\n  sequence_id?: number\n  /**\n   * The type of event being reported.\n   */\n  event?:\n    | 'Update'\n    | 'StartOfTurn'\n    | 'EagerEndOfTurn'\n    | 'TurnResumed'\n    | 'EndOfTurn'\n  /**\n   * The index of the current turn\n   */\n  turn_index?: number\n  /**\n   * Start time in seconds of the audio range that was transcribed\n   */\n  audio_window_start?: number\n  /**\n   * End time in seconds of the audio range that was transcribed\n   */\n  audio_window_end?: number\n  /**\n   * Text that was said over the course of the current turn\n   */\n  transcript?: string\n  /**\n   * The words in the transcript\n   */\n  words?: {\n    /**\n     * The individual punctuated, properly-cased word from the transcript\n     */\n    word: string\n    /**\n     * Confidence that this word was transcribed correctly\n     */\n    confidence: number\n  }[]\n  /**\n   * Confidence that no more speech is coming in this turn\n   */\n  end_of_turn_confidence?: number\n}\ndeclare abstract class Base_Ai_Cf_Deepgram_Flux {\n  inputs: Ai_Cf_Deepgram_Flux_Input\n  postProcessedOutputs: Ai_Cf_Deepgram_Flux_Output\n}\ninterface Ai_Cf_Deepgram_Aura_2_En_Input {\n  /**\n   * Speaker used to produce the audio.\n   */\n  speaker?:\n    | 'amalthea'\n    | 'andromeda'\n    | 'apollo'\n    | 'arcas'\n    | 'aries'\n    | 'asteria'\n    | 'athena'\n    | 'atlas'\n    | 'aurora'\n    | 'callista'\n    | 'cora'\n    | 'cordelia'\n    | 'delia'\n    | 'draco'\n    | 'electra'\n    | 'harmonia'\n    | 'helena'\n    | 'hera'\n    | 'hermes'\n    | 'hyperion'\n    | 'iris'\n    | 'janus'\n    | 'juno'\n    | 'jupiter'\n    | 'luna'\n    | 'mars'\n    | 'minerva'\n    | 'neptune'\n    | 'odysseus'\n    | 'ophelia'\n    | 'orion'\n    | 'orpheus'\n    | 'pandora'\n    | 'phoebe'\n    | 'pluto'\n    | 'saturn'\n    | 'thalia'\n    | 'theia'\n    | 'vesta'\n    | 'zeus'\n  /**\n   * Encoding of the output audio.\n   */\n  encoding?: 'linear16' | 'flac' | 'mulaw' | 'alaw' | 'mp3' | 'opus' | 'aac'\n  /**\n   * Container specifies the file format wrapper for the output audio. The available options depend on the encoding type..\n   */\n  container?: 'none' | 'wav' | 'ogg'\n  /**\n   * The text content to be converted to speech\n   */\n  text: string\n  /**\n   * Sample Rate specifies the sample rate for the output audio. Based on the encoding, different sample rates are supported. For some encodings, the sample rate is not configurable\n   */\n  sample_rate?: number\n  /**\n   * The bitrate of the audio in bits per second. Choose from predefined ranges or specific values based on the encoding type.\n   */\n  bit_rate?: number\n}\n/**\n * The generated audio in MP3 format\n */\ntype Ai_Cf_Deepgram_Aura_2_En_Output = string\ndeclare abstract class Base_Ai_Cf_Deepgram_Aura_2_En {\n  inputs: Ai_Cf_Deepgram_Aura_2_En_Input\n  postProcessedOutputs: Ai_Cf_Deepgram_Aura_2_En_Output\n}\ninterface Ai_Cf_Deepgram_Aura_2_Es_Input {\n  /**\n   * Speaker used to produce the audio.\n   */\n  speaker?:\n    | 'sirio'\n    | 'nestor'\n    | 'carina'\n    | 'celeste'\n    | 'alvaro'\n    | 'diana'\n    | 'aquila'\n    | 'selena'\n    | 'estrella'\n    | 'javier'\n  /**\n   * Encoding of the output audio.\n   */\n  encoding?: 'linear16' | 'flac' | 'mulaw' | 'alaw' | 'mp3' | 'opus' | 'aac'\n  /**\n   * Container specifies the file format wrapper for the output audio. The available options depend on the encoding type..\n   */\n  container?: 'none' | 'wav' | 'ogg'\n  /**\n   * The text content to be converted to speech\n   */\n  text: string\n  /**\n   * Sample Rate specifies the sample rate for the output audio. Based on the encoding, different sample rates are supported. For some encodings, the sample rate is not configurable\n   */\n  sample_rate?: number\n  /**\n   * The bitrate of the audio in bits per second. Choose from predefined ranges or specific values based on the encoding type.\n   */\n  bit_rate?: number\n}\n/**\n * The generated audio in MP3 format\n */\ntype Ai_Cf_Deepgram_Aura_2_Es_Output = string\ndeclare abstract class Base_Ai_Cf_Deepgram_Aura_2_Es {\n  inputs: Ai_Cf_Deepgram_Aura_2_Es_Input\n  postProcessedOutputs: Ai_Cf_Deepgram_Aura_2_Es_Output\n}\ninterface AiModels {\n  '@cf/huggingface/distilbert-sst-2-int8': BaseAiTextClassification\n  '@cf/stabilityai/stable-diffusion-xl-base-1.0': BaseAiTextToImage\n  '@cf/runwayml/stable-diffusion-v1-5-inpainting': BaseAiTextToImage\n  '@cf/runwayml/stable-diffusion-v1-5-img2img': BaseAiTextToImage\n  '@cf/lykon/dreamshaper-8-lcm': BaseAiTextToImage\n  '@cf/bytedance/stable-diffusion-xl-lightning': BaseAiTextToImage\n  '@cf/myshell-ai/melotts': BaseAiTextToSpeech\n  '@cf/google/embeddinggemma-300m': BaseAiTextEmbeddings\n  '@cf/microsoft/resnet-50': BaseAiImageClassification\n  '@cf/meta/llama-2-7b-chat-int8': BaseAiTextGeneration\n  '@cf/mistral/mistral-7b-instruct-v0.1': BaseAiTextGeneration\n  '@cf/meta/llama-2-7b-chat-fp16': BaseAiTextGeneration\n  '@hf/thebloke/llama-2-13b-chat-awq': BaseAiTextGeneration\n  '@hf/thebloke/mistral-7b-instruct-v0.1-awq': BaseAiTextGeneration\n  '@hf/thebloke/zephyr-7b-beta-awq': BaseAiTextGeneration\n  '@hf/thebloke/openhermes-2.5-mistral-7b-awq': BaseAiTextGeneration\n  '@hf/thebloke/neural-chat-7b-v3-1-awq': BaseAiTextGeneration\n  '@hf/thebloke/llamaguard-7b-awq': BaseAiTextGeneration\n  '@hf/thebloke/deepseek-coder-6.7b-base-awq': BaseAiTextGeneration\n  '@hf/thebloke/deepseek-coder-6.7b-instruct-awq': BaseAiTextGeneration\n  '@cf/deepseek-ai/deepseek-math-7b-instruct': BaseAiTextGeneration\n  '@cf/defog/sqlcoder-7b-2': BaseAiTextGeneration\n  '@cf/openchat/openchat-3.5-0106': BaseAiTextGeneration\n  '@cf/tiiuae/falcon-7b-instruct': BaseAiTextGeneration\n  '@cf/thebloke/discolm-german-7b-v1-awq': BaseAiTextGeneration\n  '@cf/qwen/qwen1.5-0.5b-chat': BaseAiTextGeneration\n  '@cf/qwen/qwen1.5-7b-chat-awq': BaseAiTextGeneration\n  '@cf/qwen/qwen1.5-14b-chat-awq': BaseAiTextGeneration\n  '@cf/tinyllama/tinyllama-1.1b-chat-v1.0': BaseAiTextGeneration\n  '@cf/microsoft/phi-2': BaseAiTextGeneration\n  '@cf/qwen/qwen1.5-1.8b-chat': BaseAiTextGeneration\n  '@cf/mistral/mistral-7b-instruct-v0.2-lora': BaseAiTextGeneration\n  '@hf/nousresearch/hermes-2-pro-mistral-7b': BaseAiTextGeneration\n  '@hf/nexusflow/starling-lm-7b-beta': BaseAiTextGeneration\n  '@hf/google/gemma-7b-it': BaseAiTextGeneration\n  '@cf/meta-llama/llama-2-7b-chat-hf-lora': BaseAiTextGeneration\n  '@cf/google/gemma-2b-it-lora': BaseAiTextGeneration\n  '@cf/google/gemma-7b-it-lora': BaseAiTextGeneration\n  '@hf/mistral/mistral-7b-instruct-v0.2': BaseAiTextGeneration\n  '@cf/meta/llama-3-8b-instruct': BaseAiTextGeneration\n  '@cf/fblgit/una-cybertron-7b-v2-bf16': BaseAiTextGeneration\n  '@cf/meta/llama-3-8b-instruct-awq': BaseAiTextGeneration\n  '@cf/meta/llama-3.1-8b-instruct-fp8': BaseAiTextGeneration\n  '@cf/meta/llama-3.1-8b-instruct-awq': BaseAiTextGeneration\n  '@cf/meta/llama-3.2-3b-instruct': BaseAiTextGeneration\n  '@cf/meta/llama-3.2-1b-instruct': BaseAiTextGeneration\n  '@cf/deepseek-ai/deepseek-r1-distill-qwen-32b': BaseAiTextGeneration\n  '@cf/ibm-granite/granite-4.0-h-micro': BaseAiTextGeneration\n  '@cf/facebook/bart-large-cnn': BaseAiSummarization\n  '@cf/llava-hf/llava-1.5-7b-hf': BaseAiImageToText\n  '@cf/baai/bge-base-en-v1.5': Base_Ai_Cf_Baai_Bge_Base_En_V1_5\n  '@cf/openai/whisper': Base_Ai_Cf_Openai_Whisper\n  '@cf/meta/m2m100-1.2b': Base_Ai_Cf_Meta_M2M100_1_2B\n  '@cf/baai/bge-small-en-v1.5': Base_Ai_Cf_Baai_Bge_Small_En_V1_5\n  '@cf/baai/bge-large-en-v1.5': Base_Ai_Cf_Baai_Bge_Large_En_V1_5\n  '@cf/unum/uform-gen2-qwen-500m': Base_Ai_Cf_Unum_Uform_Gen2_Qwen_500M\n  '@cf/openai/whisper-tiny-en': Base_Ai_Cf_Openai_Whisper_Tiny_En\n  '@cf/openai/whisper-large-v3-turbo': Base_Ai_Cf_Openai_Whisper_Large_V3_Turbo\n  '@cf/baai/bge-m3': Base_Ai_Cf_Baai_Bge_M3\n  '@cf/black-forest-labs/flux-1-schnell': Base_Ai_Cf_Black_Forest_Labs_Flux_1_Schnell\n  '@cf/meta/llama-3.2-11b-vision-instruct': Base_Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct\n  '@cf/meta/llama-3.3-70b-instruct-fp8-fast': Base_Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast\n  '@cf/meta/llama-guard-3-8b': Base_Ai_Cf_Meta_Llama_Guard_3_8B\n  '@cf/baai/bge-reranker-base': Base_Ai_Cf_Baai_Bge_Reranker_Base\n  '@cf/qwen/qwen2.5-coder-32b-instruct': Base_Ai_Cf_Qwen_Qwen2_5_Coder_32B_Instruct\n  '@cf/qwen/qwq-32b': Base_Ai_Cf_Qwen_Qwq_32B\n  '@cf/mistralai/mistral-small-3.1-24b-instruct': Base_Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct\n  '@cf/google/gemma-3-12b-it': Base_Ai_Cf_Google_Gemma_3_12B_It\n  '@cf/meta/llama-4-scout-17b-16e-instruct': Base_Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct\n  '@cf/qwen/qwen3-30b-a3b-fp8': Base_Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8\n  '@cf/deepgram/nova-3': Base_Ai_Cf_Deepgram_Nova_3\n  '@cf/qwen/qwen3-embedding-0.6b': Base_Ai_Cf_Qwen_Qwen3_Embedding_0_6B\n  '@cf/pipecat-ai/smart-turn-v2': Base_Ai_Cf_Pipecat_Ai_Smart_Turn_V2\n  '@cf/openai/gpt-oss-120b': Base_Ai_Cf_Openai_Gpt_Oss_120B\n  '@cf/openai/gpt-oss-20b': Base_Ai_Cf_Openai_Gpt_Oss_20B\n  '@cf/leonardo/phoenix-1.0': Base_Ai_Cf_Leonardo_Phoenix_1_0\n  '@cf/leonardo/lucid-origin': Base_Ai_Cf_Leonardo_Lucid_Origin\n  '@cf/deepgram/aura-1': Base_Ai_Cf_Deepgram_Aura_1\n  '@cf/ai4bharat/indictrans2-en-indic-1B': Base_Ai_Cf_Ai4Bharat_Indictrans2_En_Indic_1B\n  '@cf/aisingapore/gemma-sea-lion-v4-27b-it': Base_Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It\n  '@cf/pfnet/plamo-embedding-1b': Base_Ai_Cf_Pfnet_Plamo_Embedding_1B\n  '@cf/deepgram/flux': Base_Ai_Cf_Deepgram_Flux\n  '@cf/deepgram/aura-2-en': Base_Ai_Cf_Deepgram_Aura_2_En\n  '@cf/deepgram/aura-2-es': Base_Ai_Cf_Deepgram_Aura_2_Es\n}\ntype AiOptions = {\n  /**\n   * Send requests as an asynchronous batch job, only works for supported models\n   * https://developers.cloudflare.com/workers-ai/features/batch-api\n   */\n  queueRequest?: boolean\n  /**\n   * Establish websocket connections, only works for supported models\n   */\n  websocket?: boolean\n  /**\n   * Tag your requests to group and view them in Cloudflare dashboard.\n   *\n   * Rules:\n   * Tags must only contain letters, numbers, and the symbols: : - . / @\n   * Each tag can have maximum 50 characters.\n   * Maximum 5 tags are allowed each request.\n   * Duplicate tags will removed.\n   */\n  tags?: string[]\n  gateway?: GatewayOptions\n  returnRawResponse?: boolean\n  prefix?: string\n  extraHeaders?: object\n}\ntype AiModelsSearchParams = {\n  author?: string\n  hide_experimental?: boolean\n  page?: number\n  per_page?: number\n  search?: string\n  source?: number\n  task?: string\n}\ntype AiModelsSearchObject = {\n  id: string\n  source: number\n  name: string\n  description: string\n  task: {\n    id: string\n    name: string\n    description: string\n  }\n  tags: string[]\n  properties: {\n    property_id: string\n    value: string\n  }[]\n}\ninterface InferenceUpstreamError extends Error {}\ninterface AiInternalError extends Error {}\ntype AiModelListType = Record<string, any>\ndeclare abstract class Ai<AiModelList extends AiModelListType = AiModels> {\n  aiGatewayLogId: string | null\n  gateway(gatewayId: string): AiGateway\n  autorag(autoragId: string): AutoRAG\n  run<\n    Name extends keyof AiModelList,\n    Options extends AiOptions,\n    InputOptions extends AiModelList[Name]['inputs'],\n  >(\n    model: Name,\n    inputs: InputOptions,\n    options?: Options,\n  ): Promise<\n    Options extends\n      | {\n          returnRawResponse: true\n        }\n      | {\n          websocket: true\n        }\n      ? Response\n      : InputOptions extends {\n            stream: true\n          }\n        ? ReadableStream\n        : AiModelList[Name]['postProcessedOutputs']\n  >\n  models(params?: AiModelsSearchParams): Promise<AiModelsSearchObject[]>\n  toMarkdown(): ToMarkdownService\n  toMarkdown(\n    files: MarkdownDocument[],\n    options?: ConversionRequestOptions,\n  ): Promise<ConversionResponse[]>\n  toMarkdown(\n    files: MarkdownDocument,\n    options?: ConversionRequestOptions,\n  ): Promise<ConversionResponse>\n}\ntype GatewayRetries = {\n  maxAttempts?: 1 | 2 | 3 | 4 | 5\n  retryDelayMs?: number\n  backoff?: 'constant' | 'linear' | 'exponential'\n}\ntype GatewayOptions = {\n  id: string\n  cacheKey?: string\n  cacheTtl?: number\n  skipCache?: boolean\n  metadata?: Record<string, number | string | boolean | null | bigint>\n  collectLog?: boolean\n  eventId?: string\n  requestTimeoutMs?: number\n  retries?: GatewayRetries\n}\ntype UniversalGatewayOptions = Exclude<GatewayOptions, 'id'> & {\n  /**\n   ** @deprecated\n   */\n  id?: string\n}\ntype AiGatewayPatchLog = {\n  score?: number | null\n  feedback?: -1 | 1 | null\n  metadata?: Record<string, number | string | boolean | null | bigint> | null\n}\ntype AiGatewayLog = {\n  id: string\n  provider: string\n  model: string\n  model_type?: string\n  path: string\n  duration: number\n  request_type?: string\n  request_content_type?: string\n  status_code: number\n  response_content_type?: string\n  success: boolean\n  cached: boolean\n  tokens_in?: number\n  tokens_out?: number\n  metadata?: Record<string, number | string | boolean | null | bigint>\n  step?: number\n  cost?: number\n  custom_cost?: boolean\n  request_size: number\n  request_head?: string\n  request_head_complete: boolean\n  response_size: number\n  response_head?: string\n  response_head_complete: boolean\n  created_at: Date\n}\ntype AIGatewayProviders =\n  | 'workers-ai'\n  | 'anthropic'\n  | 'aws-bedrock'\n  | 'azure-openai'\n  | 'google-vertex-ai'\n  | 'huggingface'\n  | 'openai'\n  | 'perplexity-ai'\n  | 'replicate'\n  | 'groq'\n  | 'cohere'\n  | 'google-ai-studio'\n  | 'mistral'\n  | 'grok'\n  | 'openrouter'\n  | 'deepseek'\n  | 'cerebras'\n  | 'cartesia'\n  | 'elevenlabs'\n  | 'adobe-firefly'\ntype AIGatewayHeaders = {\n  'cf-aig-metadata':\n    | Record<string, number | string | boolean | null | bigint>\n    | string\n  'cf-aig-custom-cost':\n    | {\n        per_token_in?: number\n        per_token_out?: number\n      }\n    | {\n        total_cost?: number\n      }\n    | string\n  'cf-aig-cache-ttl': number | string\n  'cf-aig-skip-cache': boolean | string\n  'cf-aig-cache-key': string\n  'cf-aig-event-id': string\n  'cf-aig-request-timeout': number | string\n  'cf-aig-max-attempts': number | string\n  'cf-aig-retry-delay': number | string\n  'cf-aig-backoff': string\n  'cf-aig-collect-log': boolean | string\n  Authorization: string\n  'Content-Type': string\n  [key: string]: string | number | boolean | object\n}\ntype AIGatewayUniversalRequest = {\n  provider: AIGatewayProviders | string // eslint-disable-line\n  endpoint: string\n  headers: Partial<AIGatewayHeaders>\n  query: unknown\n}\ninterface AiGatewayInternalError extends Error {}\ninterface AiGatewayLogNotFound extends Error {}\ndeclare abstract class AiGateway {\n  patchLog(logId: string, data: AiGatewayPatchLog): Promise<void>\n  getLog(logId: string): Promise<AiGatewayLog>\n  run(\n    data: AIGatewayUniversalRequest | AIGatewayUniversalRequest[],\n    options?: {\n      gateway?: UniversalGatewayOptions\n      extraHeaders?: object\n    },\n  ): Promise<Response>\n  getUrl(provider?: AIGatewayProviders | string): Promise<string> // eslint-disable-line\n}\ninterface AutoRAGInternalError extends Error {}\ninterface AutoRAGNotFoundError extends Error {}\ninterface AutoRAGUnauthorizedError extends Error {}\ninterface AutoRAGNameNotSetError extends Error {}\ntype ComparisonFilter = {\n  key: string\n  type: 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte'\n  value: string | number | boolean\n}\ntype CompoundFilter = {\n  type: 'and' | 'or'\n  filters: ComparisonFilter[]\n}\ntype AutoRagSearchRequest = {\n  query: string\n  filters?: CompoundFilter | ComparisonFilter\n  max_num_results?: number\n  ranking_options?: {\n    ranker?: string\n    score_threshold?: number\n  }\n  reranking?: {\n    enabled?: boolean\n    model?: string\n  }\n  rewrite_query?: boolean\n}\ntype AutoRagAiSearchRequest = AutoRagSearchRequest & {\n  stream?: boolean\n  system_prompt?: string\n}\ntype AutoRagAiSearchRequestStreaming = Omit<\n  AutoRagAiSearchRequest,\n  'stream'\n> & {\n  stream: true\n}\ntype AutoRagSearchResponse = {\n  object: 'vector_store.search_results.page'\n  search_query: string\n  data: {\n    file_id: string\n    filename: string\n    score: number\n    attributes: Record<string, string | number | boolean | null>\n    content: {\n      type: 'text'\n      text: string\n    }[]\n  }[]\n  has_more: boolean\n  next_page: string | null\n}\ntype AutoRagListResponse = {\n  id: string\n  enable: boolean\n  type: string\n  source: string\n  vectorize_name: string\n  paused: boolean\n  status: string\n}[]\ntype AutoRagAiSearchResponse = AutoRagSearchResponse & {\n  response: string\n}\ndeclare abstract class AutoRAG {\n  list(): Promise<AutoRagListResponse>\n  search(params: AutoRagSearchRequest): Promise<AutoRagSearchResponse>\n  aiSearch(params: AutoRagAiSearchRequestStreaming): Promise<Response>\n  aiSearch(params: AutoRagAiSearchRequest): Promise<AutoRagAiSearchResponse>\n  aiSearch(\n    params: AutoRagAiSearchRequest,\n  ): Promise<AutoRagAiSearchResponse | Response>\n}\ninterface BasicImageTransformations {\n  /**\n   * Maximum width in image pixels. The value must be an integer.\n   */\n  width?: number\n  /**\n   * Maximum height in image pixels. The value must be an integer.\n   */\n  height?: number\n  /**\n   * Resizing mode as a string. It affects interpretation of width and height\n   * options:\n   *  - scale-down: Similar to contain, but the image is never enlarged. If\n   *    the image is larger than given width or height, it will be resized.\n   *    Otherwise its original size will be kept.\n   *  - contain: Resizes to maximum size that fits within the given width and\n   *    height. If only a single dimension is given (e.g. only width), the\n   *    image will be shrunk or enlarged to exactly match that dimension.\n   *    Aspect ratio is always preserved.\n   *  - cover: Resizes (shrinks or enlarges) to fill the entire area of width\n   *    and height. If the image has an aspect ratio different from the ratio\n   *    of width and height, it will be cropped to fit.\n   *  - crop: The image will be shrunk and cropped to fit within the area\n   *    specified by width and height. The image will not be enlarged. For images\n   *    smaller than the given dimensions it's the same as scale-down. For\n   *    images larger than the given dimensions, it's the same as cover.\n   *    See also trim.\n   *  - pad: Resizes to the maximum size that fits within the given width and\n   *    height, and then fills the remaining area with a background color\n   *    (white by default). Use of this mode is not recommended, as the same\n   *    effect can be more efficiently achieved with the contain mode and the\n   *    CSS object-fit: contain property.\n   *  - squeeze: Stretches and deforms to the width and height given, even if it\n   *    breaks aspect ratio\n   */\n  fit?: 'scale-down' | 'contain' | 'cover' | 'crop' | 'pad' | 'squeeze'\n  /**\n   * Image segmentation using artificial intelligence models. Sets pixels not\n   * within selected segment area to transparent e.g \"foreground\" sets every\n   * background pixel as transparent.\n   */\n  segment?: 'foreground'\n  /**\n   * When cropping with fit: \"cover\", this defines the side or point that should\n   * be left uncropped. The value is either a string\n   * \"left\", \"right\", \"top\", \"bottom\", \"auto\", or \"center\" (the default),\n   * or an object {x, y} containing focal point coordinates in the original\n   * image expressed as fractions ranging from 0.0 (top or left) to 1.0\n   * (bottom or right), 0.5 being the center. {fit: \"cover\", gravity: \"top\"} will\n   * crop bottom or left and right sides as necessary, but won’t crop anything\n   * from the top. {fit: \"cover\", gravity: {x:0.5, y:0.2}} will crop each side to\n   * preserve as much as possible around a point at 20% of the height of the\n   * source image.\n   */\n  gravity?:\n    | 'face'\n    | 'left'\n    | 'right'\n    | 'top'\n    | 'bottom'\n    | 'center'\n    | 'auto'\n    | 'entropy'\n    | BasicImageTransformationsGravityCoordinates\n  /**\n   * Background color to add underneath the image. Applies only to images with\n   * transparency (such as PNG). Accepts any CSS color (#RRGGBB, rgba(…),\n   * hsl(…), etc.)\n   */\n  background?: string\n  /**\n   * Number of degrees (90, 180, 270) to rotate the image by. width and height\n   * options refer to axes after rotation.\n   */\n  rotate?: 0 | 90 | 180 | 270 | 360\n}\ninterface BasicImageTransformationsGravityCoordinates {\n  x?: number\n  y?: number\n  mode?: 'remainder' | 'box-center'\n}\n/**\n * In addition to the properties you can set in the RequestInit dict\n * that you pass as an argument to the Request constructor, you can\n * set certain properties of a `cf` object to control how Cloudflare\n * features are applied to that new Request.\n *\n * Note: Currently, these properties cannot be tested in the\n * playground.\n */\ninterface RequestInitCfProperties extends Record<string, unknown> {\n  cacheEverything?: boolean\n  /**\n   * A request's cache key is what determines if two requests are\n   * \"the same\" for caching purposes. If a request has the same cache key\n   * as some previous request, then we can serve the same cached response for\n   * both. (e.g. 'some-key')\n   *\n   * Only available for Enterprise customers.\n   */\n  cacheKey?: string\n  /**\n   * This allows you to append additional Cache-Tag response headers\n   * to the origin response without modifications to the origin server.\n   * This will allow for greater control over the Purge by Cache Tag feature\n   * utilizing changes only in the Workers process.\n   *\n   * Only available for Enterprise customers.\n   */\n  cacheTags?: string[]\n  /**\n   * Force response to be cached for a given number of seconds. (e.g. 300)\n   */\n  cacheTtl?: number\n  /**\n   * Force response to be cached for a given number of seconds based on the Origin status code.\n   * (e.g. { '200-299': 86400, '404': 1, '500-599': 0 })\n   */\n  cacheTtlByStatus?: Record<string, number>\n  scrapeShield?: boolean\n  apps?: boolean\n  image?: RequestInitCfPropertiesImage\n  minify?: RequestInitCfPropertiesImageMinify\n  mirage?: boolean\n  polish?: 'lossy' | 'lossless' | 'off'\n  r2?: RequestInitCfPropertiesR2\n  /**\n   * Redirects the request to an alternate origin server. You can use this,\n   * for example, to implement load balancing across several origins.\n   * (e.g.us-east.example.com)\n   *\n   * Note - For security reasons, the hostname set in resolveOverride must\n   * be proxied on the same Cloudflare zone of the incoming request.\n   * Otherwise, the setting is ignored. CNAME hosts are allowed, so to\n   * resolve to a host under a different domain or a DNS only domain first\n   * declare a CNAME record within your own zone’s DNS mapping to the\n   * external hostname, set proxy on Cloudflare, then set resolveOverride\n   * to point to that CNAME record.\n   */\n  resolveOverride?: string\n}\ninterface RequestInitCfPropertiesImageDraw extends BasicImageTransformations {\n  /**\n   * Absolute URL of the image file to use for the drawing. It can be any of\n   * the supported file formats. For drawing of watermarks or non-rectangular\n   * overlays we recommend using PNG or WebP images.\n   */\n  url: string\n  /**\n   * Floating-point number between 0 (transparent) and 1 (opaque).\n   * For example, opacity: 0.5 makes overlay semitransparent.\n   */\n  opacity?: number\n  /**\n   * - If set to true, the overlay image will be tiled to cover the entire\n   *   area. This is useful for stock-photo-like watermarks.\n   * - If set to \"x\", the overlay image will be tiled horizontally only\n   *   (form a line).\n   * - If set to \"y\", the overlay image will be tiled vertically only\n   *   (form a line).\n   */\n  repeat?: true | 'x' | 'y'\n  /**\n   * Position of the overlay image relative to a given edge. Each property is\n   * an offset in pixels. 0 aligns exactly to the edge. For example, left: 10\n   * positions left side of the overlay 10 pixels from the left edge of the\n   * image it's drawn over. bottom: 0 aligns bottom of the overlay with bottom\n   * of the background image.\n   *\n   * Setting both left & right, or both top & bottom is an error.\n   *\n   * If no position is specified, the image will be centered.\n   */\n  top?: number\n  left?: number\n  bottom?: number\n  right?: number\n}\ninterface RequestInitCfPropertiesImage extends BasicImageTransformations {\n  /**\n   * Device Pixel Ratio. Default 1. Multiplier for width/height that makes it\n   * easier to specify higher-DPI sizes in <img srcset>.\n   */\n  dpr?: number\n  /**\n   * Allows you to trim your image. Takes dpr into account and is performed before\n   * resizing or rotation.\n   *\n   * It can be used as:\n   * - left, top, right, bottom - it will specify the number of pixels to cut\n   *   off each side\n   * - width, height - the width/height you'd like to end up with - can be used\n   *   in combination with the properties above\n   * - border - this will automatically trim the surroundings of an image based on\n   *   it's color. It consists of three properties:\n   *    - color: rgb or hex representation of the color you wish to trim (todo: verify the rgba bit)\n   *    - tolerance: difference from color to treat as color\n   *    - keep: the number of pixels of border to keep\n   */\n  trim?:\n    | 'border'\n    | {\n        top?: number\n        bottom?: number\n        left?: number\n        right?: number\n        width?: number\n        height?: number\n        border?:\n          | boolean\n          | {\n              color?: string\n              tolerance?: number\n              keep?: number\n            }\n      }\n  /**\n   * Quality setting from 1-100 (useful values are in 60-90 range). Lower values\n   * make images look worse, but load faster. The default is 85. It applies only\n   * to JPEG and WebP images. It doesn’t have any effect on PNG.\n   */\n  quality?: number | 'low' | 'medium-low' | 'medium-high' | 'high'\n  /**\n   * Output format to generate. It can be:\n   *  - avif: generate images in AVIF format.\n   *  - webp: generate images in Google WebP format. Set quality to 100 to get\n   *    the WebP-lossless format.\n   *  - json: instead of generating an image, outputs information about the\n   *    image, in JSON format. The JSON object will contain image size\n   *    (before and after resizing), source image’s MIME type, file size, etc.\n   * - jpeg: generate images in JPEG format.\n   * - png: generate images in PNG format.\n   */\n  format?:\n    | 'avif'\n    | 'webp'\n    | 'json'\n    | 'jpeg'\n    | 'png'\n    | 'baseline-jpeg'\n    | 'png-force'\n    | 'svg'\n  /**\n   * Whether to preserve animation frames from input files. Default is true.\n   * Setting it to false reduces animations to still images. This setting is\n   * recommended when enlarging images or processing arbitrary user content,\n   * because large GIF animations can weigh tens or even hundreds of megabytes.\n   * It is also useful to set anim:false when using format:\"json\" to get the\n   * response quicker without the number of frames.\n   */\n  anim?: boolean\n  /**\n   * What EXIF data should be preserved in the output image. Note that EXIF\n   * rotation and embedded color profiles are always applied (\"baked in\" into\n   * the image), and aren't affected by this option. Note that if the Polish\n   * feature is enabled, all metadata may have been removed already and this\n   * option may have no effect.\n   *  - keep: Preserve most of EXIF metadata, including GPS location if there's\n   *    any.\n   *  - copyright: Only keep the copyright tag, and discard everything else.\n   *    This is the default behavior for JPEG files.\n   *  - none: Discard all invisible EXIF metadata. Currently WebP and PNG\n   *    output formats always discard metadata.\n   */\n  metadata?: 'keep' | 'copyright' | 'none'\n  /**\n   * Strength of sharpening filter to apply to the image. Floating-point\n   * number between 0 (no sharpening, default) and 10 (maximum). 1.0 is a\n   * recommended value for downscaled images.\n   */\n  sharpen?: number\n  /**\n   * Radius of a blur filter (approximate gaussian). Maximum supported radius\n   * is 250.\n   */\n  blur?: number\n  /**\n   * Overlays are drawn in the order they appear in the array (last array\n   * entry is the topmost layer).\n   */\n  draw?: RequestInitCfPropertiesImageDraw[]\n  /**\n   * Fetching image from authenticated origin. Setting this property will\n   * pass authentication headers (Authorization, Cookie, etc.) through to\n   * the origin.\n   */\n  'origin-auth'?: 'share-publicly'\n  /**\n   * Adds a border around the image. The border is added after resizing. Border\n   * width takes dpr into account, and can be specified either using a single\n   * width property, or individually for each side.\n   */\n  border?:\n    | {\n        color: string\n        width: number\n      }\n    | {\n        color: string\n        top: number\n        right: number\n        bottom: number\n        left: number\n      }\n  /**\n   * Increase brightness by a factor. A value of 1.0 equals no change, a value\n   * of 0.5 equals half brightness, and a value of 2.0 equals twice as bright.\n   * 0 is ignored.\n   */\n  brightness?: number\n  /**\n   * Increase contrast by a factor. A value of 1.0 equals no change, a value of\n   * 0.5 equals low contrast, and a value of 2.0 equals high contrast. 0 is\n   * ignored.\n   */\n  contrast?: number\n  /**\n   * Increase exposure by a factor. A value of 1.0 equals no change, a value of\n   * 0.5 darkens the image, and a value of 2.0 lightens the image. 0 is ignored.\n   */\n  gamma?: number\n  /**\n   * Increase contrast by a factor. A value of 1.0 equals no change, a value of\n   * 0.5 equals low contrast, and a value of 2.0 equals high contrast. 0 is\n   * ignored.\n   */\n  saturation?: number\n  /**\n   * Flips the images horizontally, vertically, or both. Flipping is applied before\n   * rotation, so if you apply flip=h,rotate=90 then the image will be flipped\n   * horizontally, then rotated by 90 degrees.\n   */\n  flip?: 'h' | 'v' | 'hv'\n  /**\n   * Slightly reduces latency on a cache miss by selecting a\n   * quickest-to-compress file format, at a cost of increased file size and\n   * lower image quality. It will usually override the format option and choose\n   * JPEG over WebP or AVIF. We do not recommend using this option, except in\n   * unusual circumstances like resizing uncacheable dynamically-generated\n   * images.\n   */\n  compression?: 'fast'\n}\ninterface RequestInitCfPropertiesImageMinify {\n  javascript?: boolean\n  css?: boolean\n  html?: boolean\n}\ninterface RequestInitCfPropertiesR2 {\n  /**\n   * Colo id of bucket that an object is stored in\n   */\n  bucketColoId?: number\n}\n/**\n * Request metadata provided by Cloudflare's edge.\n */\ntype IncomingRequestCfProperties<HostMetadata = unknown> =\n  IncomingRequestCfPropertiesBase &\n    IncomingRequestCfPropertiesBotManagementEnterprise &\n    IncomingRequestCfPropertiesCloudflareForSaaSEnterprise<HostMetadata> &\n    IncomingRequestCfPropertiesGeographicInformation &\n    IncomingRequestCfPropertiesCloudflareAccessOrApiShield\ninterface IncomingRequestCfPropertiesBase extends Record<string, unknown> {\n  /**\n   * [ASN](https://www.iana.org/assignments/as-numbers/as-numbers.xhtml) of the incoming request.\n   *\n   * @example 395747\n   */\n  asn?: number\n  /**\n   * The organization which owns the ASN of the incoming request.\n   *\n   * @example \"Google Cloud\"\n   */\n  asOrganization?: string\n  /**\n   * The original value of the `Accept-Encoding` header if Cloudflare modified it.\n   *\n   * @example \"gzip, deflate, br\"\n   */\n  clientAcceptEncoding?: string\n  /**\n   * The number of milliseconds it took for the request to reach your worker.\n   *\n   * @example 22\n   */\n  clientTcpRtt?: number\n  /**\n   * The three-letter [IATA](https://en.wikipedia.org/wiki/IATA_airport_code)\n   * airport code of the data center that the request hit.\n   *\n   * @example \"DFW\"\n   */\n  colo: string\n  /**\n   * Represents the upstream's response to a\n   * [TCP `keepalive` message](https://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html)\n   * from cloudflare.\n   *\n   * For workers with no upstream, this will always be `1`.\n   *\n   * @example 3\n   */\n  edgeRequestKeepAliveStatus: IncomingRequestCfPropertiesEdgeRequestKeepAliveStatus\n  /**\n   * The HTTP Protocol the request used.\n   *\n   * @example \"HTTP/2\"\n   */\n  httpProtocol: string\n  /**\n   * The browser-requested prioritization information in the request object.\n   *\n   * If no information was set, defaults to the empty string `\"\"`\n   *\n   * @example \"weight=192;exclusive=0;group=3;group-weight=127\"\n   * @default \"\"\n   */\n  requestPriority: string\n  /**\n   * The TLS version of the connection to Cloudflare.\n   * In requests served over plaintext (without TLS), this property is the empty string `\"\"`.\n   *\n   * @example \"TLSv1.3\"\n   */\n  tlsVersion: string\n  /**\n   * The cipher for the connection to Cloudflare.\n   * In requests served over plaintext (without TLS), this property is the empty string `\"\"`.\n   *\n   * @example \"AEAD-AES128-GCM-SHA256\"\n   */\n  tlsCipher: string\n  /**\n   * Metadata containing the [`HELLO`](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.1.2) and [`FINISHED`](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.9) messages from this request's TLS handshake.\n   *\n   * If the incoming request was served over plaintext (without TLS) this field is undefined.\n   */\n  tlsExportedAuthenticator?: IncomingRequestCfPropertiesExportedAuthenticatorMetadata\n}\ninterface IncomingRequestCfPropertiesBotManagementBase {\n  /**\n   * Cloudflare’s [level of certainty](https://developers.cloudflare.com/bots/concepts/bot-score/) that a request comes from a bot,\n   * represented as an integer percentage between `1` (almost certainly a bot) and `99` (almost certainly human).\n   *\n   * @example 54\n   */\n  score: number\n  /**\n   * A boolean value that is true if the request comes from a good bot, like Google or Bing.\n   * Most customers choose to allow this traffic. For more details, see [Traffic from known bots](https://developers.cloudflare.com/firewall/known-issues-and-faq/#how-does-firewall-rules-handle-traffic-from-known-bots).\n   */\n  verifiedBot: boolean\n  /**\n   * A boolean value that is true if the request originates from a\n   * Cloudflare-verified proxy service.\n   */\n  corporateProxy: boolean\n  /**\n   * A boolean value that's true if the request matches [file extensions](https://developers.cloudflare.com/bots/reference/static-resources/) for many types of static resources.\n   */\n  staticResource: boolean\n  /**\n   * List of IDs that correlate to the Bot Management heuristic detections made on a request (you can have multiple heuristic detections on the same request).\n   */\n  detectionIds: number[]\n}\ninterface IncomingRequestCfPropertiesBotManagement {\n  /**\n   * Results of Cloudflare's Bot Management analysis\n   */\n  botManagement: IncomingRequestCfPropertiesBotManagementBase\n  /**\n   * Duplicate of `botManagement.score`.\n   *\n   * @deprecated\n   */\n  clientTrustScore: number\n}\ninterface IncomingRequestCfPropertiesBotManagementEnterprise\n  extends IncomingRequestCfPropertiesBotManagement {\n  /**\n   * Results of Cloudflare's Bot Management analysis\n   */\n  botManagement: IncomingRequestCfPropertiesBotManagementBase & {\n    /**\n     * A [JA3 Fingerprint](https://developers.cloudflare.com/bots/concepts/ja3-fingerprint/) to help profile specific SSL/TLS clients\n     * across different destination IPs, Ports, and X509 certificates.\n     */\n    ja3Hash: string\n  }\n}\ninterface IncomingRequestCfPropertiesCloudflareForSaaSEnterprise<HostMetadata> {\n  /**\n   * Custom metadata set per-host in [Cloudflare for SaaS](https://developers.cloudflare.com/cloudflare-for-platforms/cloudflare-for-saas/).\n   *\n   * This field is only present if you have Cloudflare for SaaS enabled on your account\n   * and you have followed the [required steps to enable it]((https://developers.cloudflare.com/cloudflare-for-platforms/cloudflare-for-saas/domain-support/custom-metadata/)).\n   */\n  hostMetadata?: HostMetadata\n}\ninterface IncomingRequestCfPropertiesCloudflareAccessOrApiShield {\n  /**\n   * Information about the client certificate presented to Cloudflare.\n   *\n   * This is populated when the incoming request is served over TLS using\n   * either Cloudflare Access or API Shield (mTLS)\n   * and the presented SSL certificate has a valid\n   * [Certificate Serial Number](https://ldapwiki.com/wiki/Certificate%20Serial%20Number)\n   * (i.e., not `null` or `\"\"`).\n   *\n   * Otherwise, a set of placeholder values are used.\n   *\n   * The property `certPresented` will be set to `\"1\"` when\n   * the object is populated (i.e. the above conditions were met).\n   */\n  tlsClientAuth:\n    | IncomingRequestCfPropertiesTLSClientAuth\n    | IncomingRequestCfPropertiesTLSClientAuthPlaceholder\n}\n/**\n * Metadata about the request's TLS handshake\n */\ninterface IncomingRequestCfPropertiesExportedAuthenticatorMetadata {\n  /**\n   * The client's [`HELLO` message](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.1.2), encoded in hexadecimal\n   *\n   * @example \"44372ba35fa1270921d318f34c12f155dc87b682cf36a790cfaa3ba8737a1b5d\"\n   */\n  clientHandshake: string\n  /**\n   * The server's [`HELLO` message](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.1.2), encoded in hexadecimal\n   *\n   * @example \"44372ba35fa1270921d318f34c12f155dc87b682cf36a790cfaa3ba8737a1b5d\"\n   */\n  serverHandshake: string\n  /**\n   * The client's [`FINISHED` message](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.9), encoded in hexadecimal\n   *\n   * @example \"084ee802fe1348f688220e2a6040a05b2199a761f33cf753abb1b006792d3f8b\"\n   */\n  clientFinished: string\n  /**\n   * The server's [`FINISHED` message](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.9), encoded in hexadecimal\n   *\n   * @example \"084ee802fe1348f688220e2a6040a05b2199a761f33cf753abb1b006792d3f8b\"\n   */\n  serverFinished: string\n}\n/**\n * Geographic data about the request's origin.\n */\ninterface IncomingRequestCfPropertiesGeographicInformation {\n  /**\n   * The [ISO 3166-1 Alpha 2](https://www.iso.org/iso-3166-country-codes.html) country code the request originated from.\n   *\n   * If your worker is [configured to accept TOR connections](https://support.cloudflare.com/hc/en-us/articles/203306930-Understanding-Cloudflare-Tor-support-and-Onion-Routing), this may also be `\"T1\"`, indicating a request that originated over TOR.\n   *\n   * If Cloudflare is unable to determine where the request originated this property is omitted.\n   *\n   * The country code `\"T1\"` is used for requests originating on TOR.\n   *\n   * @example \"GB\"\n   */\n  country?: Iso3166Alpha2Code | 'T1'\n  /**\n   * If present, this property indicates that the request originated in the EU\n   *\n   * @example \"1\"\n   */\n  isEUCountry?: '1'\n  /**\n   * A two-letter code indicating the continent the request originated from.\n   *\n   * @example \"AN\"\n   */\n  continent?: ContinentCode\n  /**\n   * The city the request originated from\n   *\n   * @example \"Austin\"\n   */\n  city?: string\n  /**\n   * Postal code of the incoming request\n   *\n   * @example \"78701\"\n   */\n  postalCode?: string\n  /**\n   * Latitude of the incoming request\n   *\n   * @example \"30.27130\"\n   */\n  latitude?: string\n  /**\n   * Longitude of the incoming request\n   *\n   * @example \"-97.74260\"\n   */\n  longitude?: string\n  /**\n   * Timezone of the incoming request\n   *\n   * @example \"America/Chicago\"\n   */\n  timezone?: string\n  /**\n   * If known, the ISO 3166-2 name for the first level region associated with\n   * the IP address of the incoming request\n   *\n   * @example \"Texas\"\n   */\n  region?: string\n  /**\n   * If known, the ISO 3166-2 code for the first-level region associated with\n   * the IP address of the incoming request\n   *\n   * @example \"TX\"\n   */\n  regionCode?: string\n  /**\n   * Metro code (DMA) of the incoming request\n   *\n   * @example \"635\"\n   */\n  metroCode?: string\n}\n/** Data about the incoming request's TLS certificate */\ninterface IncomingRequestCfPropertiesTLSClientAuth {\n  /** Always `\"1\"`, indicating that the certificate was presented */\n  certPresented: '1'\n  /**\n   * Result of certificate verification.\n   *\n   * @example \"FAILED:self signed certificate\"\n   */\n  certVerified: Exclude<CertVerificationStatus, 'NONE'>\n  /** The presented certificate's revokation status.\n   *\n   * - A value of `\"1\"` indicates the certificate has been revoked\n   * - A value of `\"0\"` indicates the certificate has not been revoked\n   */\n  certRevoked: '1' | '0'\n  /**\n   * The certificate issuer's [distinguished name](https://knowledge.digicert.com/generalinformation/INFO1745.html)\n   *\n   * @example \"CN=cloudflareaccess.com, C=US, ST=Texas, L=Austin, O=Cloudflare\"\n   */\n  certIssuerDN: string\n  /**\n   * The certificate subject's [distinguished name](https://knowledge.digicert.com/generalinformation/INFO1745.html)\n   *\n   * @example \"CN=*.cloudflareaccess.com, C=US, ST=Texas, L=Austin, O=Cloudflare\"\n   */\n  certSubjectDN: string\n  /**\n   * The certificate issuer's [distinguished name](https://knowledge.digicert.com/generalinformation/INFO1745.html) ([RFC 2253](https://www.rfc-editor.org/rfc/rfc2253.html) formatted)\n   *\n   * @example \"CN=cloudflareaccess.com, C=US, ST=Texas, L=Austin, O=Cloudflare\"\n   */\n  certIssuerDNRFC2253: string\n  /**\n   * The certificate subject's [distinguished name](https://knowledge.digicert.com/generalinformation/INFO1745.html) ([RFC 2253](https://www.rfc-editor.org/rfc/rfc2253.html) formatted)\n   *\n   * @example \"CN=*.cloudflareaccess.com, C=US, ST=Texas, L=Austin, O=Cloudflare\"\n   */\n  certSubjectDNRFC2253: string\n  /** The certificate issuer's distinguished name (legacy policies) */\n  certIssuerDNLegacy: string\n  /** The certificate subject's distinguished name (legacy policies) */\n  certSubjectDNLegacy: string\n  /**\n   * The certificate's serial number\n   *\n   * @example \"00936EACBE07F201DF\"\n   */\n  certSerial: string\n  /**\n   * The certificate issuer's serial number\n   *\n   * @example \"2489002934BDFEA34\"\n   */\n  certIssuerSerial: string\n  /**\n   * The certificate's Subject Key Identifier\n   *\n   * @example \"BB:AF:7E:02:3D:FA:A6:F1:3C:84:8E:AD:EE:38:98:EC:D9:32:32:D4\"\n   */\n  certSKI: string\n  /**\n   * The certificate issuer's Subject Key Identifier\n   *\n   * @example \"BB:AF:7E:02:3D:FA:A6:F1:3C:84:8E:AD:EE:38:98:EC:D9:32:32:D4\"\n   */\n  certIssuerSKI: string\n  /**\n   * The certificate's SHA-1 fingerprint\n   *\n   * @example \"6b9109f323999e52259cda7373ff0b4d26bd232e\"\n   */\n  certFingerprintSHA1: string\n  /**\n   * The certificate's SHA-256 fingerprint\n   *\n   * @example \"acf77cf37b4156a2708e34c4eb755f9b5dbbe5ebb55adfec8f11493438d19e6ad3f157f81fa3b98278453d5652b0c1fd1d71e5695ae4d709803a4d3f39de9dea\"\n   */\n  certFingerprintSHA256: string\n  /**\n   * The effective starting date of the certificate\n   *\n   * @example \"Dec 22 19:39:00 2018 GMT\"\n   */\n  certNotBefore: string\n  /**\n   * The effective expiration date of the certificate\n   *\n   * @example \"Dec 22 19:39:00 2018 GMT\"\n   */\n  certNotAfter: string\n}\n/** Placeholder values for TLS Client Authorization */\ninterface IncomingRequestCfPropertiesTLSClientAuthPlaceholder {\n  certPresented: '0'\n  certVerified: 'NONE'\n  certRevoked: '0'\n  certIssuerDN: ''\n  certSubjectDN: ''\n  certIssuerDNRFC2253: ''\n  certSubjectDNRFC2253: ''\n  certIssuerDNLegacy: ''\n  certSubjectDNLegacy: ''\n  certSerial: ''\n  certIssuerSerial: ''\n  certSKI: ''\n  certIssuerSKI: ''\n  certFingerprintSHA1: ''\n  certFingerprintSHA256: ''\n  certNotBefore: ''\n  certNotAfter: ''\n}\n/** Possible outcomes of TLS verification */\ndeclare type CertVerificationStatus =\n  /** Authentication succeeded */\n  | 'SUCCESS'\n  /** No certificate was presented */\n  | 'NONE'\n  /** Failed because the certificate was self-signed */\n  | 'FAILED:self signed certificate'\n  /** Failed because the certificate failed a trust chain check */\n  | 'FAILED:unable to verify the first certificate'\n  /** Failed because the certificate not yet valid */\n  | 'FAILED:certificate is not yet valid'\n  /** Failed because the certificate is expired */\n  | 'FAILED:certificate has expired'\n  /** Failed for another unspecified reason */\n  | 'FAILED'\n/**\n * An upstream endpoint's response to a TCP `keepalive` message from Cloudflare.\n */\ndeclare type IncomingRequestCfPropertiesEdgeRequestKeepAliveStatus =\n  | 0 /** Unknown */\n  | 1 /** no keepalives (not found) */\n  | 2 /** no connection re-use, opening keepalive connection failed */\n  | 3 /** no connection re-use, keepalive accepted and saved */\n  | 4 /** connection re-use, refused by the origin server (`TCP FIN`) */\n  | 5 /** connection re-use, accepted by the origin server */\n/** ISO 3166-1 Alpha-2 codes */\ndeclare type Iso3166Alpha2Code =\n  | 'AD'\n  | 'AE'\n  | 'AF'\n  | 'AG'\n  | 'AI'\n  | 'AL'\n  | 'AM'\n  | 'AO'\n  | 'AQ'\n  | 'AR'\n  | 'AS'\n  | 'AT'\n  | 'AU'\n  | 'AW'\n  | 'AX'\n  | 'AZ'\n  | 'BA'\n  | 'BB'\n  | 'BD'\n  | 'BE'\n  | 'BF'\n  | 'BG'\n  | 'BH'\n  | 'BI'\n  | 'BJ'\n  | 'BL'\n  | 'BM'\n  | 'BN'\n  | 'BO'\n  | 'BQ'\n  | 'BR'\n  | 'BS'\n  | 'BT'\n  | 'BV'\n  | 'BW'\n  | 'BY'\n  | 'BZ'\n  | 'CA'\n  | 'CC'\n  | 'CD'\n  | 'CF'\n  | 'CG'\n  | 'CH'\n  | 'CI'\n  | 'CK'\n  | 'CL'\n  | 'CM'\n  | 'CN'\n  | 'CO'\n  | 'CR'\n  | 'CU'\n  | 'CV'\n  | 'CW'\n  | 'CX'\n  | 'CY'\n  | 'CZ'\n  | 'DE'\n  | 'DJ'\n  | 'DK'\n  | 'DM'\n  | 'DO'\n  | 'DZ'\n  | 'EC'\n  | 'EE'\n  | 'EG'\n  | 'EH'\n  | 'ER'\n  | 'ES'\n  | 'ET'\n  | 'FI'\n  | 'FJ'\n  | 'FK'\n  | 'FM'\n  | 'FO'\n  | 'FR'\n  | 'GA'\n  | 'GB'\n  | 'GD'\n  | 'GE'\n  | 'GF'\n  | 'GG'\n  | 'GH'\n  | 'GI'\n  | 'GL'\n  | 'GM'\n  | 'GN'\n  | 'GP'\n  | 'GQ'\n  | 'GR'\n  | 'GS'\n  | 'GT'\n  | 'GU'\n  | 'GW'\n  | 'GY'\n  | 'HK'\n  | 'HM'\n  | 'HN'\n  | 'HR'\n  | 'HT'\n  | 'HU'\n  | 'ID'\n  | 'IE'\n  | 'IL'\n  | 'IM'\n  | 'IN'\n  | 'IO'\n  | 'IQ'\n  | 'IR'\n  | 'IS'\n  | 'IT'\n  | 'JE'\n  | 'JM'\n  | 'JO'\n  | 'JP'\n  | 'KE'\n  | 'KG'\n  | 'KH'\n  | 'KI'\n  | 'KM'\n  | 'KN'\n  | 'KP'\n  | 'KR'\n  | 'KW'\n  | 'KY'\n  | 'KZ'\n  | 'LA'\n  | 'LB'\n  | 'LC'\n  | 'LI'\n  | 'LK'\n  | 'LR'\n  | 'LS'\n  | 'LT'\n  | 'LU'\n  | 'LV'\n  | 'LY'\n  | 'MA'\n  | 'MC'\n  | 'MD'\n  | 'ME'\n  | 'MF'\n  | 'MG'\n  | 'MH'\n  | 'MK'\n  | 'ML'\n  | 'MM'\n  | 'MN'\n  | 'MO'\n  | 'MP'\n  | 'MQ'\n  | 'MR'\n  | 'MS'\n  | 'MT'\n  | 'MU'\n  | 'MV'\n  | 'MW'\n  | 'MX'\n  | 'MY'\n  | 'MZ'\n  | 'NA'\n  | 'NC'\n  | 'NE'\n  | 'NF'\n  | 'NG'\n  | 'NI'\n  | 'NL'\n  | 'NO'\n  | 'NP'\n  | 'NR'\n  | 'NU'\n  | 'NZ'\n  | 'OM'\n  | 'PA'\n  | 'PE'\n  | 'PF'\n  | 'PG'\n  | 'PH'\n  | 'PK'\n  | 'PL'\n  | 'PM'\n  | 'PN'\n  | 'PR'\n  | 'PS'\n  | 'PT'\n  | 'PW'\n  | 'PY'\n  | 'QA'\n  | 'RE'\n  | 'RO'\n  | 'RS'\n  | 'RU'\n  | 'RW'\n  | 'SA'\n  | 'SB'\n  | 'SC'\n  | 'SD'\n  | 'SE'\n  | 'SG'\n  | 'SH'\n  | 'SI'\n  | 'SJ'\n  | 'SK'\n  | 'SL'\n  | 'SM'\n  | 'SN'\n  | 'SO'\n  | 'SR'\n  | 'SS'\n  | 'ST'\n  | 'SV'\n  | 'SX'\n  | 'SY'\n  | 'SZ'\n  | 'TC'\n  | 'TD'\n  | 'TF'\n  | 'TG'\n  | 'TH'\n  | 'TJ'\n  | 'TK'\n  | 'TL'\n  | 'TM'\n  | 'TN'\n  | 'TO'\n  | 'TR'\n  | 'TT'\n  | 'TV'\n  | 'TW'\n  | 'TZ'\n  | 'UA'\n  | 'UG'\n  | 'UM'\n  | 'US'\n  | 'UY'\n  | 'UZ'\n  | 'VA'\n  | 'VC'\n  | 'VE'\n  | 'VG'\n  | 'VI'\n  | 'VN'\n  | 'VU'\n  | 'WF'\n  | 'WS'\n  | 'YE'\n  | 'YT'\n  | 'ZA'\n  | 'ZM'\n  | 'ZW'\n/** The 2-letter continent codes Cloudflare uses */\ndeclare type ContinentCode = 'AF' | 'AN' | 'AS' | 'EU' | 'NA' | 'OC' | 'SA'\ntype CfProperties<HostMetadata = unknown> =\n  | IncomingRequestCfProperties<HostMetadata>\n  | RequestInitCfProperties\ninterface D1Meta {\n  duration: number\n  size_after: number\n  rows_read: number\n  rows_written: number\n  last_row_id: number\n  changed_db: boolean\n  changes: number\n  /**\n   * The region of the database instance that executed the query.\n   */\n  served_by_region?: string\n  /**\n   * True if-and-only-if the database instance that executed the query was the primary.\n   */\n  served_by_primary?: boolean\n  timings?: {\n    /**\n     * The duration of the SQL query execution by the database instance. It doesn't include any network time.\n     */\n    sql_duration_ms: number\n  }\n  /**\n   * Number of total attempts to execute the query, due to automatic retries.\n   * Note: All other fields in the response like `timings` only apply to the last attempt.\n   */\n  total_attempts?: number\n}\ninterface D1Response {\n  success: true\n  meta: D1Meta & Record<string, unknown>\n  error?: never\n}\ntype D1Result<T = unknown> = D1Response & {\n  results: T[]\n}\ninterface D1ExecResult {\n  count: number\n  duration: number\n}\ntype D1SessionConstraint =\n  // Indicates that the first query should go to the primary, and the rest queries\n  // using the same D1DatabaseSession will go to any replica that is consistent with\n  // the bookmark maintained by the session (returned by the first query).\n  | 'first-primary'\n  // Indicates that the first query can go anywhere (primary or replica), and the rest queries\n  // using the same D1DatabaseSession will go to any replica that is consistent with\n  // the bookmark maintained by the session (returned by the first query).\n  | 'first-unconstrained'\ntype D1SessionBookmark = string\ndeclare abstract class D1Database {\n  prepare(query: string): D1PreparedStatement\n  batch<T = unknown>(statements: D1PreparedStatement[]): Promise<D1Result<T>[]>\n  exec(query: string): Promise<D1ExecResult>\n  /**\n   * Creates a new D1 Session anchored at the given constraint or the bookmark.\n   * All queries executed using the created session will have sequential consistency,\n   * meaning that all writes done through the session will be visible in subsequent reads.\n   *\n   * @param constraintOrBookmark Either the session constraint or the explicit bookmark to anchor the created session.\n   */\n  withSession(\n    constraintOrBookmark?: D1SessionBookmark | D1SessionConstraint,\n  ): D1DatabaseSession\n  /**\n   * @deprecated dump() will be removed soon, only applies to deprecated alpha v1 databases.\n   */\n  dump(): Promise<ArrayBuffer>\n}\ndeclare abstract class D1DatabaseSession {\n  prepare(query: string): D1PreparedStatement\n  batch<T = unknown>(statements: D1PreparedStatement[]): Promise<D1Result<T>[]>\n  /**\n   * @returns The latest session bookmark across all executed queries on the session.\n   *          If no query has been executed yet, `null` is returned.\n   */\n  getBookmark(): D1SessionBookmark | null\n}\ndeclare abstract class D1PreparedStatement {\n  bind(...values: unknown[]): D1PreparedStatement\n  first<T = unknown>(colName: string): Promise<T | null>\n  first<T = Record<string, unknown>>(): Promise<T | null>\n  run<T = Record<string, unknown>>(): Promise<D1Result<T>>\n  all<T = Record<string, unknown>>(): Promise<D1Result<T>>\n  raw<T = unknown[]>(options: {\n    columnNames: true\n  }): Promise<[string[], ...T[]]>\n  raw<T = unknown[]>(options?: { columnNames?: false }): Promise<T[]>\n}\n// `Disposable` was added to TypeScript's standard lib types in version 5.2.\n// To support older TypeScript versions, define an empty `Disposable` interface.\n// Users won't be able to use `using`/`Symbol.dispose` without upgrading to 5.2,\n// but this will ensure type checking on older versions still passes.\n// TypeScript's interface merging will ensure our empty interface is effectively\n// ignored when `Disposable` is included in the standard lib.\ntype Disposable = {}\n/**\n * An email message that can be sent from a Worker.\n */\ninterface EmailMessage {\n  /**\n   * Envelope From attribute of the email message.\n   */\n  readonly from: string\n  /**\n   * Envelope To attribute of the email message.\n   */\n  readonly to: string\n}\n/**\n * An email message that is sent to a consumer Worker and can be rejected/forwarded.\n */\ninterface ForwardableEmailMessage extends EmailMessage {\n  /**\n   * Stream of the email message content.\n   */\n  readonly raw: ReadableStream<Uint8Array>\n  /**\n   * An [Headers object](https://developer.mozilla.org/en-US/docs/Web/API/Headers).\n   */\n  readonly headers: Headers\n  /**\n   * Size of the email message content.\n   */\n  readonly rawSize: number\n  /**\n   * Reject this email message by returning a permanent SMTP error back to the connecting client including the given reason.\n   * @param reason The reject reason.\n   * @returns void\n   */\n  setReject(reason: string): void\n  /**\n   * Forward this email message to a verified destination address of the account.\n   * @param rcptTo Verified destination address.\n   * @param headers A [Headers object](https://developer.mozilla.org/en-US/docs/Web/API/Headers).\n   * @returns A promise that resolves when the email message is forwarded.\n   */\n  forward(rcptTo: string, headers?: Headers): Promise<void>\n  /**\n   * Reply to the sender of this email message with a new EmailMessage object.\n   * @param message The reply message.\n   * @returns A promise that resolves when the email message is replied.\n   */\n  reply(message: EmailMessage): Promise<void>\n}\n/**\n * A binding that allows a Worker to send email messages.\n */\ninterface SendEmail {\n  send(message: EmailMessage): Promise<void>\n}\ndeclare abstract class EmailEvent extends ExtendableEvent {\n  readonly message: ForwardableEmailMessage\n}\ndeclare type EmailExportedHandler<Env = unknown> = (\n  message: ForwardableEmailMessage,\n  env: Env,\n  ctx: ExecutionContext,\n) => void | Promise<void>\ndeclare module 'cloudflare:email' {\n  let _EmailMessage: {\n    prototype: EmailMessage\n    new (from: string, to: string, raw: ReadableStream | string): EmailMessage\n  }\n  export { _EmailMessage as EmailMessage }\n}\n/**\n * Hello World binding to serve as an explanatory example. DO NOT USE\n */\ninterface HelloWorldBinding {\n  /**\n   * Retrieve the current stored value\n   */\n  get(): Promise<{\n    value: string\n    ms?: number\n  }>\n  /**\n   * Set a new stored value\n   */\n  set(value: string): Promise<void>\n}\ninterface Hyperdrive {\n  /**\n   * Connect directly to Hyperdrive as if it's your database, returning a TCP socket.\n   *\n   * Calling this method returns an idential socket to if you call\n   * `connect(\"host:port\")` using the `host` and `port` fields from this object.\n   * Pick whichever approach works better with your preferred DB client library.\n   *\n   * Note that this socket is not yet authenticated -- it's expected that your\n   * code (or preferably, the client library of your choice) will authenticate\n   * using the information in this class's readonly fields.\n   */\n  connect(): Socket\n  /**\n   * A valid DB connection string that can be passed straight into the typical\n   * client library/driver/ORM. This will typically be the easiest way to use\n   * Hyperdrive.\n   */\n  readonly connectionString: string\n  /*\n   * A randomly generated hostname that is only valid within the context of the\n   * currently running Worker which, when passed into `connect()` function from\n   * the \"cloudflare:sockets\" module, will connect to the Hyperdrive instance\n   * for your database.\n   */\n  readonly host: string\n  /*\n   * The port that must be paired the the host field when connecting.\n   */\n  readonly port: number\n  /*\n   * The username to use when authenticating to your database via Hyperdrive.\n   * Unlike the host and password, this will be the same every time\n   */\n  readonly user: string\n  /*\n   * The randomly generated password to use when authenticating to your\n   * database via Hyperdrive. Like the host field, this password is only valid\n   * within the context of the currently running Worker instance from which\n   * it's read.\n   */\n  readonly password: string\n  /*\n   * The name of the database to connect to.\n   */\n  readonly database: string\n}\n// Copyright (c) 2024 Cloudflare, Inc.\n// Licensed under the Apache 2.0 license found in the LICENSE file or at:\n//     https://opensource.org/licenses/Apache-2.0\ntype ImageInfoResponse =\n  | {\n      format: 'image/svg+xml'\n    }\n  | {\n      format: string\n      fileSize: number\n      width: number\n      height: number\n    }\ntype ImageTransform = {\n  width?: number\n  height?: number\n  background?: string\n  blur?: number\n  border?:\n    | {\n        color?: string\n        width?: number\n      }\n    | {\n        top?: number\n        bottom?: number\n        left?: number\n        right?: number\n      }\n  brightness?: number\n  contrast?: number\n  fit?: 'scale-down' | 'contain' | 'pad' | 'squeeze' | 'cover' | 'crop'\n  flip?: 'h' | 'v' | 'hv'\n  gamma?: number\n  segment?: 'foreground'\n  gravity?:\n    | 'face'\n    | 'left'\n    | 'right'\n    | 'top'\n    | 'bottom'\n    | 'center'\n    | 'auto'\n    | 'entropy'\n    | {\n        x?: number\n        y?: number\n        mode: 'remainder' | 'box-center'\n      }\n  rotate?: 0 | 90 | 180 | 270\n  saturation?: number\n  sharpen?: number\n  trim?:\n    | 'border'\n    | {\n        top?: number\n        bottom?: number\n        left?: number\n        right?: number\n        width?: number\n        height?: number\n        border?:\n          | boolean\n          | {\n              color?: string\n              tolerance?: number\n              keep?: number\n            }\n      }\n}\ntype ImageDrawOptions = {\n  opacity?: number\n  repeat?: boolean | string\n  top?: number\n  left?: number\n  bottom?: number\n  right?: number\n}\ntype ImageInputOptions = {\n  encoding?: 'base64'\n}\ntype ImageOutputOptions = {\n  format:\n    | 'image/jpeg'\n    | 'image/png'\n    | 'image/gif'\n    | 'image/webp'\n    | 'image/avif'\n    | 'rgb'\n    | 'rgba'\n  quality?: number\n  background?: string\n  anim?: boolean\n}\ninterface ImagesBinding {\n  /**\n   * Get image metadata (type, width and height)\n   * @throws {@link ImagesError} with code 9412 if input is not an image\n   * @param stream The image bytes\n   */\n  info(\n    stream: ReadableStream<Uint8Array>,\n    options?: ImageInputOptions,\n  ): Promise<ImageInfoResponse>\n  /**\n   * Begin applying a series of transformations to an image\n   * @param stream The image bytes\n   * @returns A transform handle\n   */\n  input(\n    stream: ReadableStream<Uint8Array>,\n    options?: ImageInputOptions,\n  ): ImageTransformer\n}\ninterface ImageTransformer {\n  /**\n   * Apply transform next, returning a transform handle.\n   * You can then apply more transformations, draw, or retrieve the output.\n   * @param transform\n   */\n  transform(transform: ImageTransform): ImageTransformer\n  /**\n   * Draw an image on this transformer, returning a transform handle.\n   * You can then apply more transformations, draw, or retrieve the output.\n   * @param image The image (or transformer that will give the image) to draw\n   * @param options The options configuring how to draw the image\n   */\n  draw(\n    image: ReadableStream<Uint8Array> | ImageTransformer,\n    options?: ImageDrawOptions,\n  ): ImageTransformer\n  /**\n   * Retrieve the image that results from applying the transforms to the\n   * provided input\n   * @param options Options that apply to the output e.g. output format\n   */\n  output(options: ImageOutputOptions): Promise<ImageTransformationResult>\n}\ntype ImageTransformationOutputOptions = {\n  encoding?: 'base64'\n}\ninterface ImageTransformationResult {\n  /**\n   * The image as a response, ready to store in cache or return to users\n   */\n  response(): Response\n  /**\n   * The content type of the returned image\n   */\n  contentType(): string\n  /**\n   * The bytes of the response\n   */\n  image(options?: ImageTransformationOutputOptions): ReadableStream<Uint8Array>\n}\ninterface ImagesError extends Error {\n  readonly code: number\n  readonly message: string\n  readonly stack?: string\n}\n/**\n * Media binding for transforming media streams.\n * Provides the entry point for media transformation operations.\n */\ninterface MediaBinding {\n  /**\n   * Creates a media transformer from an input stream.\n   * @param media - The input media bytes\n   * @returns A MediaTransformer instance for applying transformations\n   */\n  input(media: ReadableStream<Uint8Array>): MediaTransformer\n}\n/**\n * Media transformer for applying transformation operations to media content.\n * Handles sizing, fitting, and other input transformation parameters.\n */\ninterface MediaTransformer {\n  /**\n   * Applies transformation options to the media content.\n   * @param transform - Configuration for how the media should be transformed\n   * @returns A generator for producing the transformed media output\n   */\n  transform(\n    transform: MediaTransformationInputOptions,\n  ): MediaTransformationGenerator\n}\n/**\n * Generator for producing media transformation results.\n * Configures the output format and parameters for the transformed media.\n */\ninterface MediaTransformationGenerator {\n  /**\n   * Generates the final media output with specified options.\n   * @param output - Configuration for the output format and parameters\n   * @returns The final transformation result containing the transformed media\n   */\n  output(output: MediaTransformationOutputOptions): MediaTransformationResult\n}\n/**\n * Result of a media transformation operation.\n * Provides multiple ways to access the transformed media content.\n */\ninterface MediaTransformationResult {\n  /**\n   * Returns the transformed media as a readable stream of bytes.\n   * @returns A stream containing the transformed media data\n   */\n  media(): ReadableStream<Uint8Array>\n  /**\n   * Returns the transformed media as an HTTP response object.\n   * @returns The transformed media as a Response, ready to store in cache or return to users\n   */\n  response(): Response\n  /**\n   * Returns the MIME type of the transformed media.\n   * @returns The content type string (e.g., 'image/jpeg', 'video/mp4')\n   */\n  contentType(): string\n}\n/**\n * Configuration options for transforming media input.\n * Controls how the media should be resized and fitted.\n */\ntype MediaTransformationInputOptions = {\n  /** How the media should be resized to fit the specified dimensions */\n  fit?: 'contain' | 'cover' | 'scale-down'\n  /** Target width in pixels */\n  width?: number\n  /** Target height in pixels */\n  height?: number\n}\n/**\n * Configuration options for Media Transformations output.\n * Controls the format, timing, and type of the generated output.\n */\ntype MediaTransformationOutputOptions = {\n  /**\n   * Output mode determining the type of media to generate\n   */\n  mode?: 'video' | 'spritesheet' | 'frame' | 'audio'\n  /** Whether to include audio in the output */\n  audio?: boolean\n  /**\n   * Starting timestamp for frame extraction or start time for clips. (e.g. '2s').\n   */\n  time?: string\n  /**\n   * Duration for video clips, audio extraction, and spritesheet generation (e.g. '5s').\n   */\n  duration?: string\n  /**\n   * Number of frames in the spritesheet.\n   */\n  imageCount?: number\n  /**\n   * Output format for the generated media.\n   */\n  format?: 'jpg' | 'png' | 'm4a'\n}\n/**\n * Error object for media transformation operations.\n * Extends the standard Error interface with additional media-specific information.\n */\ninterface MediaError extends Error {\n  readonly code: number\n  readonly message: string\n  readonly stack?: string\n}\ndeclare module 'cloudflare:node' {\n  interface NodeStyleServer {\n    listen(...args: unknown[]): this\n    address(): {\n      port?: number | null | undefined\n    }\n  }\n  export function httpServerHandler(port: number): ExportedHandler\n  export function httpServerHandler(options: { port: number }): ExportedHandler\n  export function httpServerHandler(server: NodeStyleServer): ExportedHandler\n}\ntype Params<P extends string = any> = Record<P, string | string[]>\ntype EventContext<Env, P extends string, Data> = {\n  request: Request<unknown, IncomingRequestCfProperties<unknown>>\n  functionPath: string\n  waitUntil: (promise: Promise<any>) => void\n  passThroughOnException: () => void\n  next: (input?: Request | string, init?: RequestInit) => Promise<Response>\n  env: Env & {\n    ASSETS: {\n      fetch: typeof fetch\n    }\n  }\n  params: Params<P>\n  data: Data\n}\ntype PagesFunction<\n  Env = unknown,\n  Params extends string = any,\n  Data extends Record<string, unknown> = Record<string, unknown>,\n> = (context: EventContext<Env, Params, Data>) => Response | Promise<Response>\ntype EventPluginContext<Env, P extends string, Data, PluginArgs> = {\n  request: Request<unknown, IncomingRequestCfProperties<unknown>>\n  functionPath: string\n  waitUntil: (promise: Promise<any>) => void\n  passThroughOnException: () => void\n  next: (input?: Request | string, init?: RequestInit) => Promise<Response>\n  env: Env & {\n    ASSETS: {\n      fetch: typeof fetch\n    }\n  }\n  params: Params<P>\n  data: Data\n  pluginArgs: PluginArgs\n}\ntype PagesPluginFunction<\n  Env = unknown,\n  Params extends string = any,\n  Data extends Record<string, unknown> = Record<string, unknown>,\n  PluginArgs = unknown,\n> = (\n  context: EventPluginContext<Env, Params, Data, PluginArgs>,\n) => Response | Promise<Response>\ndeclare module 'assets:*' {\n  export const onRequest: PagesFunction\n}\n// Copyright (c) 2022-2023 Cloudflare, Inc.\n// Licensed under the Apache 2.0 license found in the LICENSE file or at:\n//     https://opensource.org/licenses/Apache-2.0\ndeclare module 'cloudflare:pipelines' {\n  export abstract class PipelineTransformationEntrypoint<\n    Env = unknown,\n    I extends PipelineRecord = PipelineRecord,\n    O extends PipelineRecord = PipelineRecord,\n  > {\n    protected env: Env\n    protected ctx: ExecutionContext\n    constructor(ctx: ExecutionContext, env: Env)\n    /**\n     * run recieves an array of PipelineRecord which can be\n     * transformed and returned to the pipeline\n     * @param records Incoming records from the pipeline to be transformed\n     * @param metadata Information about the specific pipeline calling the transformation entrypoint\n     * @returns A promise containing the transformed PipelineRecord array\n     */\n    public run(records: I[], metadata: PipelineBatchMetadata): Promise<O[]>\n  }\n  export type PipelineRecord = Record<string, unknown>\n  export type PipelineBatchMetadata = {\n    pipelineId: string\n    pipelineName: string\n  }\n  export interface Pipeline<T extends PipelineRecord = PipelineRecord> {\n    /**\n     * The Pipeline interface represents the type of a binding to a Pipeline\n     *\n     * @param records The records to send to the pipeline\n     */\n    send(records: T[]): Promise<void>\n  }\n}\n// PubSubMessage represents an incoming PubSub message.\n// The message includes metadata about the broker, the client, and the payload\n// itself.\n// https://developers.cloudflare.com/pub-sub/\ninterface PubSubMessage {\n  // Message ID\n  readonly mid: number\n  // MQTT broker FQDN in the form mqtts://BROKER.NAMESPACE.cloudflarepubsub.com:PORT\n  readonly broker: string\n  // The MQTT topic the message was sent on.\n  readonly topic: string\n  // The client ID of the client that published this message.\n  readonly clientId: string\n  // The unique identifier (JWT ID) used by the client to authenticate, if token\n  // auth was used.\n  readonly jti?: string\n  // A Unix timestamp (seconds from Jan 1, 1970), set when the Pub/Sub Broker\n  // received the message from the client.\n  readonly receivedAt: number\n  // An (optional) string with the MIME type of the payload, if set by the\n  // client.\n  readonly contentType: string\n  // Set to 1 when the payload is a UTF-8 string\n  // https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901063\n  readonly payloadFormatIndicator: number\n  // Pub/Sub (MQTT) payloads can be UTF-8 strings, or byte arrays.\n  // You can use payloadFormatIndicator to inspect this before decoding.\n  payload: string | Uint8Array\n}\n// JsonWebKey extended by kid parameter\ninterface JsonWebKeyWithKid extends JsonWebKey {\n  // Key Identifier of the JWK\n  readonly kid: string\n}\ninterface RateLimitOptions {\n  key: string\n}\ninterface RateLimitOutcome {\n  success: boolean\n}\ninterface RateLimit {\n  /**\n   * Rate limit a request based on the provided options.\n   * @see https://developers.cloudflare.com/workers/runtime-apis/bindings/rate-limit/\n   * @returns A promise that resolves with the outcome of the rate limit.\n   */\n  limit(options: RateLimitOptions): Promise<RateLimitOutcome>\n}\n// Namespace for RPC utility types. Unfortunately, we can't use a `module` here as these types need\n// to referenced by `Fetcher`. This is included in the \"importable\" version of the types which\n// strips all `module` blocks.\ndeclare namespace Rpc {\n  // Branded types for identifying `WorkerEntrypoint`/`DurableObject`/`Target`s.\n  // TypeScript uses *structural* typing meaning anything with the same shape as type `T` is a `T`.\n  // For the classes exported by `cloudflare:workers` we want *nominal* typing (i.e. we only want to\n  // accept `WorkerEntrypoint` from `cloudflare:workers`, not any other class with the same shape)\n  export const __RPC_STUB_BRAND: '__RPC_STUB_BRAND'\n  export const __RPC_TARGET_BRAND: '__RPC_TARGET_BRAND'\n  export const __WORKER_ENTRYPOINT_BRAND: '__WORKER_ENTRYPOINT_BRAND'\n  export const __DURABLE_OBJECT_BRAND: '__DURABLE_OBJECT_BRAND'\n  export const __WORKFLOW_ENTRYPOINT_BRAND: '__WORKFLOW_ENTRYPOINT_BRAND'\n  export interface RpcTargetBranded {\n    [__RPC_TARGET_BRAND]: never\n  }\n  export interface WorkerEntrypointBranded {\n    [__WORKER_ENTRYPOINT_BRAND]: never\n  }\n  export interface DurableObjectBranded {\n    [__DURABLE_OBJECT_BRAND]: never\n  }\n  export interface WorkflowEntrypointBranded {\n    [__WORKFLOW_ENTRYPOINT_BRAND]: never\n  }\n  export type EntrypointBranded =\n    | WorkerEntrypointBranded\n    | DurableObjectBranded\n    | WorkflowEntrypointBranded\n  // Types that can be used through `Stub`s\n  export type Stubable = RpcTargetBranded | ((...args: any[]) => any)\n  // Types that can be passed over RPC\n  // The reason for using a generic type here is to build a serializable subset of structured\n  //   cloneable composite types. This allows types defined with the \"interface\" keyword to pass the\n  //   serializable check as well. Otherwise, only types defined with the \"type\" keyword would pass.\n  type Serializable<T> =\n    // Structured cloneables\n    | BaseType\n    // Structured cloneable composites\n    | Map<\n        T extends Map<infer U, unknown> ? Serializable<U> : never,\n        T extends Map<unknown, infer U> ? Serializable<U> : never\n      >\n    | Set<T extends Set<infer U> ? Serializable<U> : never>\n    | ReadonlyArray<T extends ReadonlyArray<infer U> ? Serializable<U> : never>\n    | {\n        [K in keyof T]: K extends number | string ? Serializable<T[K]> : never\n      }\n    // Special types\n    | Stub<Stubable>\n    // Serialized as stubs, see `Stubify`\n    | Stubable\n  // Base type for all RPC stubs, including common memory management methods.\n  // `T` is used as a marker type for unwrapping `Stub`s later.\n  interface StubBase<T extends Stubable> extends Disposable {\n    [__RPC_STUB_BRAND]: T\n    dup(): this\n  }\n  export type Stub<T extends Stubable> = Provider<T> & StubBase<T>\n  // This represents all the types that can be sent as-is over an RPC boundary\n  type BaseType =\n    | void\n    | undefined\n    | null\n    | boolean\n    | number\n    | bigint\n    | string\n    | TypedArray\n    | ArrayBuffer\n    | DataView\n    | Date\n    | Error\n    | RegExp\n    | ReadableStream<Uint8Array>\n    | WritableStream<Uint8Array>\n    | Request\n    | Response\n    | Headers\n  // Recursively rewrite all `Stubable` types with `Stub`s\n  // prettier-ignore\n  type Stubify<T> = T extends Stubable\n    ? Stub<T>\n    : T extends Map<infer K, infer V>\n      ? Map<Stubify<K>, Stubify<V>>\n      : T extends Set<infer V>\n        ? Set<Stubify<V>>\n        : T extends Array<infer V>\n          ? Array<Stubify<V>>\n          : T extends ReadonlyArray<infer V>\n            ? ReadonlyArray<Stubify<V>>\n            : T extends BaseType\n              ? T\n              : T extends {\n                    [key: string | number]: any\n                  }\n                ? {\n                    [K in keyof T]: Stubify<T[K]>\n                  }\n                : T\n  // Recursively rewrite all `Stub<T>`s with the corresponding `T`s.\n  // Note we use `StubBase` instead of `Stub` here to avoid circular dependencies:\n  // `Stub` depends on `Provider`, which depends on `Unstubify`, which would depend on `Stub`.\n  // prettier-ignore\n  type Unstubify<T> = T extends StubBase<infer V>\n    ? V\n    : T extends Map<infer K, infer V>\n      ? Map<Unstubify<K>, Unstubify<V>>\n      : T extends Set<infer V>\n        ? Set<Unstubify<V>>\n        : T extends Array<infer V>\n          ? Array<Unstubify<V>>\n          : T extends ReadonlyArray<infer V>\n            ? ReadonlyArray<Unstubify<V>>\n            : T extends BaseType\n              ? T\n              : T extends {\n                    [key: string | number]: unknown\n                  }\n                ? {\n                    [K in keyof T]: Unstubify<T[K]>\n                  }\n                : T\n  type UnstubifyAll<A extends any[]> = {\n    [I in keyof A]: Unstubify<A[I]>\n  }\n  // Utility type for adding `Provider`/`Disposable`s to `object` types only.\n  // Note `unknown & T` is equivalent to `T`.\n  type MaybeProvider<T> = T extends object ? Provider<T> : unknown\n  type MaybeDisposable<T> = T extends object ? Disposable : unknown\n  // Type for method return or property on an RPC interface.\n  // - Stubable types are replaced by stubs.\n  // - Serializable types are passed by value, with stubable types replaced by stubs\n  //   and a top-level `Disposer`.\n  // Everything else can't be passed over PRC.\n  // Technically, we use custom thenables here, but they quack like `Promise`s.\n  // Intersecting with `(Maybe)Provider` allows pipelining.\n  // prettier-ignore\n  type Result<R> = R extends Stubable\n    ? Promise<Stub<R>> & Provider<R>\n    : R extends Serializable<R>\n      ? Promise<Stubify<R> & MaybeDisposable<R>> & MaybeProvider<R>\n      : never\n  // Type for method or property on an RPC interface.\n  // For methods, unwrap `Stub`s in parameters, and rewrite returns to be `Result`s.\n  // Unwrapping `Stub`s allows calling with `Stubable` arguments.\n  // For properties, rewrite types to be `Result`s.\n  // In each case, unwrap `Promise`s.\n  type MethodOrProperty<V> = V extends (...args: infer P) => infer R\n    ? (...args: UnstubifyAll<P>) => Result<Awaited<R>>\n    : Result<Awaited<V>>\n  // Type for the callable part of an `Provider` if `T` is callable.\n  // This is intersected with methods/properties.\n  type MaybeCallableProvider<T> = T extends (...args: any[]) => any\n    ? MethodOrProperty<T>\n    : unknown\n  // Base type for all other types providing RPC-like interfaces.\n  // Rewrites all methods/properties to be `MethodOrProperty`s, while preserving callable types.\n  // `Reserved` names (e.g. stub method names like `dup()`) and symbols can't be accessed over RPC.\n  export type Provider<\n    T extends object,\n    Reserved extends string = never,\n  > = MaybeCallableProvider<T> &\n    Pick<\n      {\n        [K in keyof T]: MethodOrProperty<T[K]>\n      },\n      Exclude<keyof T, Reserved | symbol | keyof StubBase<never>>\n    >\n}\ndeclare namespace Cloudflare {\n  // Type of `env`.\n  //\n  // The specific project can extend `Env` by redeclaring it in project-specific files. Typescript\n  // will merge all declarations.\n  //\n  // You can use `wrangler types` to generate the `Env` type automatically.\n  type Env = {}\n  // Project-specific parameters used to inform types.\n  //\n  // This interface is, again, intended to be declared in project-specific files, and then that\n  // declaration will be merged with this one.\n  //\n  // A project should have a declaration like this:\n  //\n  //     interface GlobalProps {\n  //       // Declares the main module's exports. Used to populate Cloudflare.Exports aka the type\n  //       // of `ctx.exports`.\n  //       mainModule: typeof import(\"my-main-module\");\n  //\n  //       // Declares which of the main module's exports are configured with durable storage, and\n  //       // thus should behave as Durable Object namsepace bindings.\n  //       durableNamespaces: \"MyDurableObject\" | \"AnotherDurableObject\";\n  //     }\n  //\n  // You can use `wrangler types` to generate `GlobalProps` automatically.\n  type GlobalProps = {}\n  // Evaluates to the type of a property in GlobalProps, defaulting to `Default` if it is not\n  // present.\n  type GlobalProp<K extends string, Default> = K extends keyof GlobalProps\n    ? GlobalProps[K]\n    : Default\n  // The type of the program's main module exports, if known. Requires `GlobalProps` to declare the\n  // `mainModule` property.\n  type MainModule = GlobalProp<'mainModule', {}>\n  // The type of ctx.exports, which contains loopback bindings for all top-level exports.\n  type Exports = {\n    [K in keyof MainModule]: LoopbackForExport<MainModule[K]> &\n      // If the export is listed in `durableNamespaces`, then it is also a\n      // DurableObjectNamespace.\n      (K extends GlobalProp<'durableNamespaces', never>\n        ? MainModule[K] extends new (\n            ...args: any[]\n          ) => infer DoInstance\n          ? DoInstance extends Rpc.DurableObjectBranded\n            ? DurableObjectNamespace<DoInstance>\n            : DurableObjectNamespace<undefined>\n          : DurableObjectNamespace<undefined>\n        : {})\n  }\n}\ndeclare namespace CloudflareWorkersModule {\n  export type RpcStub<T extends Rpc.Stubable> = Rpc.Stub<T>\n  export const RpcStub: {\n    new <T extends Rpc.Stubable>(value: T): Rpc.Stub<T>\n  }\n  export abstract class RpcTarget implements Rpc.RpcTargetBranded {\n    [Rpc.__RPC_TARGET_BRAND]: never\n  }\n  // `protected` fields don't appear in `keyof`s, so can't be accessed over RPC\n  export abstract class WorkerEntrypoint<Env = Cloudflare.Env, Props = {}>\n    implements Rpc.WorkerEntrypointBranded\n  {\n    [Rpc.__WORKER_ENTRYPOINT_BRAND]: never\n    protected ctx: ExecutionContext<Props>\n    protected env: Env\n    constructor(ctx: ExecutionContext, env: Env)\n    email?(message: ForwardableEmailMessage): void | Promise<void>\n    fetch?(request: Request): Response | Promise<Response>\n    queue?(batch: MessageBatch<unknown>): void | Promise<void>\n    scheduled?(controller: ScheduledController): void | Promise<void>\n    tail?(events: TraceItem[]): void | Promise<void>\n    tailStream?(\n      event: TailStream.TailEvent<TailStream.Onset>,\n    ):\n      | TailStream.TailEventHandlerType\n      | Promise<TailStream.TailEventHandlerType>\n    test?(controller: TestController): void | Promise<void>\n    trace?(traces: TraceItem[]): void | Promise<void>\n  }\n  export abstract class DurableObject<Env = Cloudflare.Env, Props = {}>\n    implements Rpc.DurableObjectBranded\n  {\n    [Rpc.__DURABLE_OBJECT_BRAND]: never\n    protected ctx: DurableObjectState<Props>\n    protected env: Env\n    constructor(ctx: DurableObjectState, env: Env)\n    alarm?(alarmInfo?: AlarmInvocationInfo): void | Promise<void>\n    fetch?(request: Request): Response | Promise<Response>\n    webSocketMessage?(\n      ws: WebSocket,\n      message: string | ArrayBuffer,\n    ): void | Promise<void>\n    webSocketClose?(\n      ws: WebSocket,\n      code: number,\n      reason: string,\n      wasClean: boolean,\n    ): void | Promise<void>\n    webSocketError?(ws: WebSocket, error: unknown): void | Promise<void>\n  }\n  export type WorkflowDurationLabel =\n    | 'second'\n    | 'minute'\n    | 'hour'\n    | 'day'\n    | 'week'\n    | 'month'\n    | 'year'\n  export type WorkflowSleepDuration =\n    | `${number} ${WorkflowDurationLabel}${'s' | ''}`\n    | number\n  export type WorkflowDelayDuration = WorkflowSleepDuration\n  export type WorkflowTimeoutDuration = WorkflowSleepDuration\n  export type WorkflowRetentionDuration = WorkflowSleepDuration\n  export type WorkflowBackoff = 'constant' | 'linear' | 'exponential'\n  export type WorkflowStepConfig = {\n    retries?: {\n      limit: number\n      delay: WorkflowDelayDuration | number\n      backoff?: WorkflowBackoff\n    }\n    timeout?: WorkflowTimeoutDuration | number\n  }\n  export type WorkflowEvent<T> = {\n    payload: Readonly<T>\n    timestamp: Date\n    instanceId: string\n  }\n  export type WorkflowStepEvent<T> = {\n    payload: Readonly<T>\n    timestamp: Date\n    type: string\n  }\n  export abstract class WorkflowStep {\n    do<T extends Rpc.Serializable<T>>(\n      name: string,\n      callback: () => Promise<T>,\n    ): Promise<T>\n    do<T extends Rpc.Serializable<T>>(\n      name: string,\n      config: WorkflowStepConfig,\n      callback: () => Promise<T>,\n    ): Promise<T>\n    sleep: (name: string, duration: WorkflowSleepDuration) => Promise<void>\n    sleepUntil: (name: string, timestamp: Date | number) => Promise<void>\n    waitForEvent<T extends Rpc.Serializable<T>>(\n      name: string,\n      options: {\n        type: string\n        timeout?: WorkflowTimeoutDuration | number\n      },\n    ): Promise<WorkflowStepEvent<T>>\n  }\n  export abstract class WorkflowEntrypoint<\n    Env = unknown,\n    T extends Rpc.Serializable<T> | unknown = unknown,\n  > implements Rpc.WorkflowEntrypointBranded\n  {\n    [Rpc.__WORKFLOW_ENTRYPOINT_BRAND]: never\n    protected ctx: ExecutionContext\n    protected env: Env\n    constructor(ctx: ExecutionContext, env: Env)\n    run(event: Readonly<WorkflowEvent<T>>, step: WorkflowStep): Promise<unknown>\n  }\n  export function waitUntil(promise: Promise<unknown>): void\n  export function withEnv(newEnv: unknown, fn: () => unknown): unknown\n  export function withExports(newExports: unknown, fn: () => unknown): unknown\n  export function withEnvAndExports(\n    newEnv: unknown,\n    newExports: unknown,\n    fn: () => unknown,\n  ): unknown\n  export const env: Cloudflare.Env\n  export const exports: Cloudflare.Exports\n}\ndeclare module 'cloudflare:workers' {\n  export = CloudflareWorkersModule\n}\ninterface SecretsStoreSecret {\n  /**\n   * Get a secret from the Secrets Store, returning a string of the secret value\n   * if it exists, or throws an error if it does not exist\n   */\n  get(): Promise<string>\n}\ndeclare module 'cloudflare:sockets' {\n  function _connect(\n    address: string | SocketAddress,\n    options?: SocketOptions,\n  ): Socket\n  export { _connect as connect }\n}\ntype MarkdownDocument = {\n  name: string\n  blob: Blob\n}\ntype ConversionResponse =\n  | {\n      name: string\n      mimeType: string\n      format: 'markdown'\n      tokens: number\n      data: string\n    }\n  | {\n      name: string\n      mimeType: string\n      format: 'error'\n      error: string\n    }\ntype ImageConversionOptions = {\n  descriptionLanguage?: 'en' | 'es' | 'fr' | 'it' | 'pt' | 'de'\n}\ntype EmbeddedImageConversionOptions = ImageConversionOptions & {\n  convert?: boolean\n  maxConvertedImages?: number\n}\ntype ConversionOptions = {\n  html?: {\n    images?: EmbeddedImageConversionOptions & {\n      convertOGImage?: boolean\n    }\n  }\n  docx?: {\n    images?: EmbeddedImageConversionOptions\n  }\n  image?: ImageConversionOptions\n  pdf?: {\n    images?: EmbeddedImageConversionOptions\n    metadata?: boolean\n  }\n}\ntype ConversionRequestOptions = {\n  gateway?: GatewayOptions\n  extraHeaders?: object\n  conversionOptions?: ConversionOptions\n}\ntype SupportedFileFormat = {\n  mimeType: string\n  extension: string\n}\ndeclare abstract class ToMarkdownService {\n  transform(\n    files: MarkdownDocument[],\n    options?: ConversionRequestOptions,\n  ): Promise<ConversionResponse[]>\n  transform(\n    files: MarkdownDocument,\n    options?: ConversionRequestOptions,\n  ): Promise<ConversionResponse>\n  supported(): Promise<SupportedFileFormat[]>\n}\ndeclare namespace TailStream {\n  interface Header {\n    readonly name: string\n    readonly value: string\n  }\n  interface FetchEventInfo {\n    readonly type: 'fetch'\n    readonly method: string\n    readonly url: string\n    readonly cfJson?: object\n    readonly headers: Header[]\n  }\n  interface JsRpcEventInfo {\n    readonly type: 'jsrpc'\n  }\n  interface ScheduledEventInfo {\n    readonly type: 'scheduled'\n    readonly scheduledTime: Date\n    readonly cron: string\n  }\n  interface AlarmEventInfo {\n    readonly type: 'alarm'\n    readonly scheduledTime: Date\n  }\n  interface QueueEventInfo {\n    readonly type: 'queue'\n    readonly queueName: string\n    readonly batchSize: number\n  }\n  interface EmailEventInfo {\n    readonly type: 'email'\n    readonly mailFrom: string\n    readonly rcptTo: string\n    readonly rawSize: number\n  }\n  interface TraceEventInfo {\n    readonly type: 'trace'\n    readonly traces: (string | null)[]\n  }\n  interface HibernatableWebSocketEventInfoMessage {\n    readonly type: 'message'\n  }\n  interface HibernatableWebSocketEventInfoError {\n    readonly type: 'error'\n  }\n  interface HibernatableWebSocketEventInfoClose {\n    readonly type: 'close'\n    readonly code: number\n    readonly wasClean: boolean\n  }\n  interface HibernatableWebSocketEventInfo {\n    readonly type: 'hibernatableWebSocket'\n    readonly info:\n      | HibernatableWebSocketEventInfoClose\n      | HibernatableWebSocketEventInfoError\n      | HibernatableWebSocketEventInfoMessage\n  }\n  interface CustomEventInfo {\n    readonly type: 'custom'\n  }\n  interface FetchResponseInfo {\n    readonly type: 'fetch'\n    readonly statusCode: number\n  }\n  type EventOutcome =\n    | 'ok'\n    | 'canceled'\n    | 'exception'\n    | 'unknown'\n    | 'killSwitch'\n    | 'daemonDown'\n    | 'exceededCpu'\n    | 'exceededMemory'\n    | 'loadShed'\n    | 'responseStreamDisconnected'\n    | 'scriptNotFound'\n  interface ScriptVersion {\n    readonly id: string\n    readonly tag?: string\n    readonly message?: string\n  }\n  interface Onset {\n    readonly type: 'onset'\n    readonly attributes: Attribute[]\n    // id for the span being opened by this Onset event.\n    readonly spanId: string\n    readonly dispatchNamespace?: string\n    readonly entrypoint?: string\n    readonly executionModel: string\n    readonly scriptName?: string\n    readonly scriptTags?: string[]\n    readonly scriptVersion?: ScriptVersion\n    readonly info:\n      | FetchEventInfo\n      | JsRpcEventInfo\n      | ScheduledEventInfo\n      | AlarmEventInfo\n      | QueueEventInfo\n      | EmailEventInfo\n      | TraceEventInfo\n      | HibernatableWebSocketEventInfo\n      | CustomEventInfo\n  }\n  interface Outcome {\n    readonly type: 'outcome'\n    readonly outcome: EventOutcome\n    readonly cpuTime: number\n    readonly wallTime: number\n  }\n  interface SpanOpen {\n    readonly type: 'spanOpen'\n    readonly name: string\n    // id for the span being opened by this SpanOpen event.\n    readonly spanId: string\n    readonly info?: FetchEventInfo | JsRpcEventInfo | Attributes\n  }\n  interface SpanClose {\n    readonly type: 'spanClose'\n    readonly outcome: EventOutcome\n  }\n  interface DiagnosticChannelEvent {\n    readonly type: 'diagnosticChannel'\n    readonly channel: string\n    readonly message: any\n  }\n  interface Exception {\n    readonly type: 'exception'\n    readonly name: string\n    readonly message: string\n    readonly stack?: string\n  }\n  interface Log {\n    readonly type: 'log'\n    readonly level: 'debug' | 'error' | 'info' | 'log' | 'warn'\n    readonly message: object\n  }\n  // This marks the worker handler return information.\n  // This is separate from Outcome because the worker invocation can live for a long time after\n  // returning. For example - Websockets that return an http upgrade response but then continue\n  // streaming information or SSE http connections.\n  interface Return {\n    readonly type: 'return'\n    readonly info?: FetchResponseInfo\n  }\n  interface Attribute {\n    readonly name: string\n    readonly value:\n      | string\n      | string[]\n      | boolean\n      | boolean[]\n      | number\n      | number[]\n      | bigint\n      | bigint[]\n  }\n  interface Attributes {\n    readonly type: 'attributes'\n    readonly info: Attribute[]\n  }\n  type EventType =\n    | Onset\n    | Outcome\n    | SpanOpen\n    | SpanClose\n    | DiagnosticChannelEvent\n    | Exception\n    | Log\n    | Return\n    | Attributes\n  // Context in which this trace event lives.\n  interface SpanContext {\n    // Single id for the entire top-level invocation\n    // This should be a new traceId for the first worker stage invoked in the eyeball request and then\n    // same-account service-bindings should reuse the same traceId but cross-account service-bindings\n    // should use a new traceId.\n    readonly traceId: string\n    // spanId in which this event is handled\n    // for Onset and SpanOpen events this would be the parent span id\n    // for Outcome and SpanClose these this would be the span id of the opening Onset and SpanOpen events\n    // For Hibernate and Mark this would be the span under which they were emitted.\n    // spanId is not set ONLY if:\n    //  1. This is an Onset event\n    //  2. We are not inherting any SpanContext. (e.g. this is a cross-account service binding or a new top-level invocation)\n    readonly spanId?: string\n  }\n  interface TailEvent<Event extends EventType> {\n    // invocation id of the currently invoked worker stage.\n    // invocation id will always be unique to every Onset event and will be the same until the Outcome event.\n    readonly invocationId: string\n    // Inherited spanContext for this event.\n    readonly spanContext: SpanContext\n    readonly timestamp: Date\n    readonly sequence: number\n    readonly event: Event\n  }\n  type TailEventHandler<Event extends EventType = EventType> = (\n    event: TailEvent<Event>,\n  ) => void | Promise<void>\n  type TailEventHandlerObject = {\n    outcome?: TailEventHandler<Outcome>\n    spanOpen?: TailEventHandler<SpanOpen>\n    spanClose?: TailEventHandler<SpanClose>\n    diagnosticChannel?: TailEventHandler<DiagnosticChannelEvent>\n    exception?: TailEventHandler<Exception>\n    log?: TailEventHandler<Log>\n    return?: TailEventHandler<Return>\n    attributes?: TailEventHandler<Attributes>\n  }\n  type TailEventHandlerType = TailEventHandler | TailEventHandlerObject\n}\n// Copyright (c) 2022-2023 Cloudflare, Inc.\n// Licensed under the Apache 2.0 license found in the LICENSE file or at:\n//     https://opensource.org/licenses/Apache-2.0\n/**\n * Data types supported for holding vector metadata.\n */\ntype VectorizeVectorMetadataValue = string | number | boolean | string[]\n/**\n * Additional information to associate with a vector.\n */\ntype VectorizeVectorMetadata =\n  | VectorizeVectorMetadataValue\n  | Record<string, VectorizeVectorMetadataValue>\ntype VectorFloatArray = Float32Array | Float64Array\ninterface VectorizeError {\n  code?: number\n  error: string\n}\n/**\n * Comparison logic/operation to use for metadata filtering.\n *\n * This list is expected to grow as support for more operations are released.\n */\ntype VectorizeVectorMetadataFilterOp =\n  | '$eq'\n  | '$ne'\n  | '$lt'\n  | '$lte'\n  | '$gt'\n  | '$gte'\ntype VectorizeVectorMetadataFilterCollectionOp = '$in' | '$nin'\n/**\n * Filter criteria for vector metadata used to limit the retrieved query result set.\n */\ntype VectorizeVectorMetadataFilter = {\n  [field: string]:\n    | Exclude<VectorizeVectorMetadataValue, string[]>\n    | null\n    | {\n        [Op in VectorizeVectorMetadataFilterOp]?: Exclude<\n          VectorizeVectorMetadataValue,\n          string[]\n        > | null\n      }\n    | {\n        [Op in VectorizeVectorMetadataFilterCollectionOp]?: Exclude<\n          VectorizeVectorMetadataValue,\n          string[]\n        >[]\n      }\n}\n/**\n * Supported distance metrics for an index.\n * Distance metrics determine how other \"similar\" vectors are determined.\n */\ntype VectorizeDistanceMetric = 'euclidean' | 'cosine' | 'dot-product'\n/**\n * Metadata return levels for a Vectorize query.\n *\n * Default to \"none\".\n *\n * @property all      Full metadata for the vector return set, including all fields (including those un-indexed) without truncation. This is a more expensive retrieval, as it requires additional fetching & reading of un-indexed data.\n * @property indexed  Return all metadata fields configured for indexing in the vector return set. This level of retrieval is \"free\" in that no additional overhead is incurred returning this data. However, note that indexed metadata is subject to truncation (especially for larger strings).\n * @property none     No indexed metadata will be returned.\n */\ntype VectorizeMetadataRetrievalLevel = 'all' | 'indexed' | 'none'\ninterface VectorizeQueryOptions {\n  topK?: number\n  namespace?: string\n  returnValues?: boolean\n  returnMetadata?: boolean | VectorizeMetadataRetrievalLevel\n  filter?: VectorizeVectorMetadataFilter\n}\n/**\n * Information about the configuration of an index.\n */\ntype VectorizeIndexConfig =\n  | {\n      dimensions: number\n      metric: VectorizeDistanceMetric\n    }\n  | {\n      preset: string // keep this generic, as we'll be adding more presets in the future and this is only in a read capacity\n    }\n/**\n * Metadata about an existing index.\n *\n * This type is exclusively for the Vectorize **beta** and will be deprecated once Vectorize RC is released.\n * See {@link VectorizeIndexInfo} for its post-beta equivalent.\n */\ninterface VectorizeIndexDetails {\n  /** The unique ID of the index */\n  readonly id: string\n  /** The name of the index. */\n  name: string\n  /** (optional) A human readable description for the index. */\n  description?: string\n  /** The index configuration, including the dimension size and distance metric. */\n  config: VectorizeIndexConfig\n  /** The number of records containing vectors within the index. */\n  vectorsCount: number\n}\n/**\n * Metadata about an existing index.\n */\ninterface VectorizeIndexInfo {\n  /** The number of records containing vectors within the index. */\n  vectorCount: number\n  /** Number of dimensions the index has been configured for. */\n  dimensions: number\n  /** ISO 8601 datetime of the last processed mutation on in the index. All changes before this mutation will be reflected in the index state. */\n  processedUpToDatetime: number\n  /** UUIDv4 of the last mutation processed by the index. All changes before this mutation will be reflected in the index state. */\n  processedUpToMutation: number\n}\n/**\n * Represents a single vector value set along with its associated metadata.\n */\ninterface VectorizeVector {\n  /** The ID for the vector. This can be user-defined, and must be unique. It should uniquely identify the object, and is best set based on the ID of what the vector represents. */\n  id: string\n  /** The vector values */\n  values: VectorFloatArray | number[]\n  /** The namespace this vector belongs to. */\n  namespace?: string\n  /** Metadata associated with the vector. Includes the values of other fields and potentially additional details. */\n  metadata?: Record<string, VectorizeVectorMetadata>\n}\n/**\n * Represents a matched vector for a query along with its score and (if specified) the matching vector information.\n */\ntype VectorizeMatch = Pick<Partial<VectorizeVector>, 'values'> &\n  Omit<VectorizeVector, 'values'> & {\n    /** The score or rank for similarity, when returned as a result */\n    score: number\n  }\n/**\n * A set of matching {@link VectorizeMatch} for a particular query.\n */\ninterface VectorizeMatches {\n  matches: VectorizeMatch[]\n  count: number\n}\n/**\n * Results of an operation that performed a mutation on a set of vectors.\n * Here, `ids` is a list of vectors that were successfully processed.\n *\n * This type is exclusively for the Vectorize **beta** and will be deprecated once Vectorize RC is released.\n * See {@link VectorizeAsyncMutation} for its post-beta equivalent.\n */\ninterface VectorizeVectorMutation {\n  /* List of ids of vectors that were successfully processed. */\n  ids: string[]\n  /* Total count of the number of processed vectors. */\n  count: number\n}\n/**\n * Result type indicating a mutation on the Vectorize Index.\n * Actual mutations are processed async where the `mutationId` is the unique identifier for the operation.\n */\ninterface VectorizeAsyncMutation {\n  /** The unique identifier for the async mutation operation containing the changeset. */\n  mutationId: string\n}\n/**\n * A Vectorize Vector Search Index for querying vectors/embeddings.\n *\n * This type is exclusively for the Vectorize **beta** and will be deprecated once Vectorize RC is released.\n * See {@link Vectorize} for its new implementation.\n */\ndeclare abstract class VectorizeIndex {\n  /**\n   * Get information about the currently bound index.\n   * @returns A promise that resolves with information about the current index.\n   */\n  public describe(): Promise<VectorizeIndexDetails>\n  /**\n   * Use the provided vector to perform a similarity search across the index.\n   * @param vector Input vector that will be used to drive the similarity search.\n   * @param options Configuration options to massage the returned data.\n   * @returns A promise that resolves with matched and scored vectors.\n   */\n  public query(\n    vector: VectorFloatArray | number[],\n    options?: VectorizeQueryOptions,\n  ): Promise<VectorizeMatches>\n  /**\n   * Insert a list of vectors into the index dataset. If a provided id exists, an error will be thrown.\n   * @param vectors List of vectors that will be inserted.\n   * @returns A promise that resolves with the ids & count of records that were successfully processed.\n   */\n  public insert(vectors: VectorizeVector[]): Promise<VectorizeVectorMutation>\n  /**\n   * Upsert a list of vectors into the index dataset. If a provided id exists, it will be replaced with the new values.\n   * @param vectors List of vectors that will be upserted.\n   * @returns A promise that resolves with the ids & count of records that were successfully processed.\n   */\n  public upsert(vectors: VectorizeVector[]): Promise<VectorizeVectorMutation>\n  /**\n   * Delete a list of vectors with a matching id.\n   * @param ids List of vector ids that should be deleted.\n   * @returns A promise that resolves with the ids & count of records that were successfully processed (and thus deleted).\n   */\n  public deleteByIds(ids: string[]): Promise<VectorizeVectorMutation>\n  /**\n   * Get a list of vectors with a matching id.\n   * @param ids List of vector ids that should be returned.\n   * @returns A promise that resolves with the raw unscored vectors matching the id set.\n   */\n  public getByIds(ids: string[]): Promise<VectorizeVector[]>\n}\n/**\n * A Vectorize Vector Search Index for querying vectors/embeddings.\n *\n * Mutations in this version are async, returning a mutation id.\n */\ndeclare abstract class Vectorize {\n  /**\n   * Get information about the currently bound index.\n   * @returns A promise that resolves with information about the current index.\n   */\n  public describe(): Promise<VectorizeIndexInfo>\n  /**\n   * Use the provided vector to perform a similarity search across the index.\n   * @param vector Input vector that will be used to drive the similarity search.\n   * @param options Configuration options to massage the returned data.\n   * @returns A promise that resolves with matched and scored vectors.\n   */\n  public query(\n    vector: VectorFloatArray | number[],\n    options?: VectorizeQueryOptions,\n  ): Promise<VectorizeMatches>\n  /**\n   * Use the provided vector-id to perform a similarity search across the index.\n   * @param vectorId Id for a vector in the index against which the index should be queried.\n   * @param options Configuration options to massage the returned data.\n   * @returns A promise that resolves with matched and scored vectors.\n   */\n  public queryById(\n    vectorId: string,\n    options?: VectorizeQueryOptions,\n  ): Promise<VectorizeMatches>\n  /**\n   * Insert a list of vectors into the index dataset. If a provided id exists, an error will be thrown.\n   * @param vectors List of vectors that will be inserted.\n   * @returns A promise that resolves with a unique identifier of a mutation containing the insert changeset.\n   */\n  public insert(vectors: VectorizeVector[]): Promise<VectorizeAsyncMutation>\n  /**\n   * Upsert a list of vectors into the index dataset. If a provided id exists, it will be replaced with the new values.\n   * @param vectors List of vectors that will be upserted.\n   * @returns A promise that resolves with a unique identifier of a mutation containing the upsert changeset.\n   */\n  public upsert(vectors: VectorizeVector[]): Promise<VectorizeAsyncMutation>\n  /**\n   * Delete a list of vectors with a matching id.\n   * @param ids List of vector ids that should be deleted.\n   * @returns A promise that resolves with a unique identifier of a mutation containing the delete changeset.\n   */\n  public deleteByIds(ids: string[]): Promise<VectorizeAsyncMutation>\n  /**\n   * Get a list of vectors with a matching id.\n   * @param ids List of vector ids that should be returned.\n   * @returns A promise that resolves with the raw unscored vectors matching the id set.\n   */\n  public getByIds(ids: string[]): Promise<VectorizeVector[]>\n}\n/**\n * The interface for \"version_metadata\" binding\n * providing metadata about the Worker Version using this binding.\n */\ntype WorkerVersionMetadata = {\n  /** The ID of the Worker Version using this binding */\n  id: string\n  /** The tag of the Worker Version using this binding */\n  tag: string\n  /** The timestamp of when the Worker Version was uploaded */\n  timestamp: string\n}\ninterface DynamicDispatchLimits {\n  /**\n   * Limit CPU time in milliseconds.\n   */\n  cpuMs?: number\n  /**\n   * Limit number of subrequests.\n   */\n  subRequests?: number\n}\ninterface DynamicDispatchOptions {\n  /**\n   * Limit resources of invoked Worker script.\n   */\n  limits?: DynamicDispatchLimits\n  /**\n   * Arguments for outbound Worker script, if configured.\n   */\n  outbound?: {\n    [key: string]: any\n  }\n}\ninterface DispatchNamespace {\n  /**\n   * @param name Name of the Worker script.\n   * @param args Arguments to Worker script.\n   * @param options Options for Dynamic Dispatch invocation.\n   * @returns A Fetcher object that allows you to send requests to the Worker script.\n   * @throws If the Worker script does not exist in this dispatch namespace, an error will be thrown.\n   */\n  get(\n    name: string,\n    args?: {\n      [key: string]: any\n    },\n    options?: DynamicDispatchOptions,\n  ): Fetcher\n}\ndeclare module 'cloudflare:workflows' {\n  /**\n   * NonRetryableError allows for a user to throw a fatal error\n   * that makes a Workflow instance fail immediately without triggering a retry\n   */\n  export class NonRetryableError extends Error {\n    public constructor(message: string, name?: string)\n  }\n}\ndeclare abstract class Workflow<PARAMS = unknown> {\n  /**\n   * Get a handle to an existing instance of the Workflow.\n   * @param id Id for the instance of this Workflow\n   * @returns A promise that resolves with a handle for the Instance\n   */\n  public get(id: string): Promise<WorkflowInstance>\n  /**\n   * Create a new instance and return a handle to it. If a provided id exists, an error will be thrown.\n   * @param options Options when creating an instance including id and params\n   * @returns A promise that resolves with a handle for the Instance\n   */\n  public create(\n    options?: WorkflowInstanceCreateOptions<PARAMS>,\n  ): Promise<WorkflowInstance>\n  /**\n   * Create a batch of instances and return handle for all of them. If a provided id exists, an error will be thrown.\n   * `createBatch` is limited at 100 instances at a time or when the RPC limit for the batch (1MiB) is reached.\n   * @param batch List of Options when creating an instance including name and params\n   * @returns A promise that resolves with a list of handles for the created instances.\n   */\n  public createBatch(\n    batch: WorkflowInstanceCreateOptions<PARAMS>[],\n  ): Promise<WorkflowInstance[]>\n}\ntype WorkflowDurationLabel =\n  | 'second'\n  | 'minute'\n  | 'hour'\n  | 'day'\n  | 'week'\n  | 'month'\n  | 'year'\ntype WorkflowSleepDuration =\n  | `${number} ${WorkflowDurationLabel}${'s' | ''}`\n  | number\ntype WorkflowRetentionDuration = WorkflowSleepDuration\ninterface WorkflowInstanceCreateOptions<PARAMS = unknown> {\n  /**\n   * An id for your Workflow instance. Must be unique within the Workflow.\n   */\n  id?: string\n  /**\n   * The event payload the Workflow instance is triggered with\n   */\n  params?: PARAMS\n  /**\n   * The retention policy for Workflow instance.\n   * Defaults to the maximum retention period available for the owner's account.\n   */\n  retention?: {\n    successRetention?: WorkflowRetentionDuration\n    errorRetention?: WorkflowRetentionDuration\n  }\n}\ntype InstanceStatus = {\n  status:\n    | 'queued' // means that instance is waiting to be started (see concurrency limits)\n    | 'running'\n    | 'paused'\n    | 'errored'\n    | 'terminated' // user terminated the instance while it was running\n    | 'complete'\n    | 'waiting' // instance is hibernating and waiting for sleep or event to finish\n    | 'waitingForPause' // instance is finishing the current work to pause\n    | 'unknown'\n  error?: {\n    name: string\n    message: string\n  }\n  output?: unknown\n}\ninterface WorkflowError {\n  code?: number\n  message: string\n}\ndeclare abstract class WorkflowInstance {\n  public id: string\n  /**\n   * Pause the instance.\n   */\n  public pause(): Promise<void>\n  /**\n   * Resume the instance. If it is already running, an error will be thrown.\n   */\n  public resume(): Promise<void>\n  /**\n   * Terminate the instance. If it is errored, terminated or complete, an error will be thrown.\n   */\n  public terminate(): Promise<void>\n  /**\n   * Restart the instance.\n   */\n  public restart(): Promise<void>\n  /**\n   * Returns the current status of the instance.\n   */\n  public status(): Promise<InstanceStatus>\n  /**\n   * Send an event to this instance.\n   */\n  public sendEvent({\n    type,\n    payload,\n  }: {\n    type: string\n    payload: unknown\n  }): Promise<void>\n}\n"
  },
  {
    "path": "playgrounds/tanstack-start/wrangler.jsonc",
    "content": "{\n  \"$schema\": \"node_modules/wrangler/config-schema.json\",\n  \"name\": \"tanstack-start-app\",\n  \"compatibility_date\": \"2025-12-10\",\n  \"compatibility_flags\": [\"nodejs_compat\"],\n  \"main\": \"@tanstack/react-start/server-entry\"\n}\n"
  },
  {
    "path": "playgrounds/vite-core/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"
  },
  {
    "path": "playgrounds/vite-core/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Vite Core</title>\n  </head>\n  <body>\n    <div id=\"root\"></div>\n    <script type=\"module\" src=\"/src/main.tsx\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "playgrounds/vite-core/package.json",
    "content": "{\n  \"name\": \"vite-core\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"tsc && vite build\",\n    \"preview\": \"vite preview\"\n  },\n  \"dependencies\": {\n    \"@wagmi/connectors\": \"workspace:*\",\n    \"@wagmi/core\": \"workspace:*\",\n    \"react\": \"catalog:\",\n    \"react-dom\": \"catalog:\",\n    \"viem\": \"2.*\"\n  },\n  \"devDependencies\": {\n    \"@types/react\": \"catalog:\",\n    \"@types/react-dom\": \"catalog:\",\n    \"@vitejs/plugin-react\": \"catalog:\",\n    \"buffer\": \"catalog:\",\n    \"vite\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "playgrounds/vite-core/src/App.tsx",
    "content": "import {\n  connect,\n  disconnect,\n  type GetBalanceReturnType,\n  type GetBlockNumberReturnType,\n  getBalance,\n  getBlockNumber,\n  getConnection,\n  reconnect,\n  switchConnection,\n  watchBlockNumber,\n  watchConnection,\n} from '@wagmi/core'\nimport { useEffect, useReducer, useState } from 'react'\n\nimport { formatEther } from 'viem'\nimport { config } from './wagmi'\n\nfunction App() {\n  useEffect(() => {\n    reconnect(config)\n  }, [])\n\n  return (\n    <>\n      <Connection />\n      <Connect />\n      <SwitchConnection />\n      <Balance />\n      <BlockNumber />\n    </>\n  )\n}\n\nfunction Connection() {\n  const [connection, setConnection] = useState(getConnection(config))\n\n  useEffect(() => {\n    return watchConnection(config, {\n      onChange(data) {\n        setConnection(data)\n      },\n    })\n  }, [])\n\n  return (\n    <div>\n      <h2>Connection</h2>\n\n      <div>\n        address: {connection.address}\n        <br />\n        chainId: {connection.chainId}\n        <br />\n        status: {connection.status}\n      </div>\n\n      {connection.status === 'connected' && (\n        <button type=\"button\" onClick={() => disconnect(config)}>\n          Disconnect\n        </button>\n      )}\n    </div>\n  )\n}\n\nfunction Connect() {\n  const [, rerender] = useReducer((count) => count + 1, 0)\n\n  useEffect(() => {\n    return config.subscribe(({ connections }) => connections, rerender)\n  }, [])\n\n  return (\n    <div>\n      <h2>Connect</h2>\n\n      {config.connectors.map((connector) => (\n        <button\n          disabled={config.state.connections.has(connector.uid)}\n          id={connector.uid}\n          key={connector.uid}\n          onClick={async () => await connect(config, { connector })}\n          type=\"button\"\n        >\n          {connector.name}\n        </button>\n      ))}\n    </div>\n  )\n}\n\nfunction SwitchConnection() {\n  const [, rerender] = useReducer((count) => count + 1, 0)\n\n  useEffect(() => {\n    return config.subscribe(\n      ({ connections, current }) => ({ connections, current }),\n      rerender,\n    )\n  }, [])\n\n  return (\n    <div>\n      <h2>Switch Connection</h2>\n\n      {config.connectors\n        .filter((connector) => config.state.connections.has(connector.uid))\n        .map((connector) => (\n          <button\n            disabled={config.state.current === connector.uid}\n            id={connector.uid}\n            key={connector.uid}\n            onClick={async () => await switchConnection(config, { connector })}\n            type=\"button\"\n          >\n            {connector.name}\n          </button>\n        ))}\n    </div>\n  )\n}\n\nfunction Balance() {\n  const [connection, setConnection] = useState(getConnection(config))\n\n  useEffect(() => {\n    return watchConnection(config, {\n      onChange(data) {\n        setConnection(data)\n      },\n    })\n  }, [])\n\n  /////////////////////////////////////////////////////////\n\n  const [balance, setBalance] = useState<GetBalanceReturnType | undefined>()\n\n  useEffect(() => {\n    if (!connection.address) return\n    return watchBlockNumber(config, {\n      async onBlockNumber() {\n        try {\n          const balance = await getBalance(config, {\n            address: connection.address!,\n          })\n          setBalance(balance)\n        } catch (error) {\n          // biome-ignore lint/suspicious/noConsole: logging\n          console.error('Error fetching balance', error)\n        }\n      },\n    })\n  }, [connection.address])\n\n  return (\n    <div>\n      <h2>Balance</h2>\n\n      <div>Balance: {!!balance?.value && formatEther(balance.value)}</div>\n    </div>\n  )\n}\n\nfunction BlockNumber() {\n  const [blockNumber, setBlockNumber] = useState<\n    GetBlockNumberReturnType | undefined\n  >()\n\n  useEffect(() => {\n    ;(async () => {\n      setBlockNumber(await getBlockNumber(config))\n\n      watchBlockNumber(config, { onBlockNumber: setBlockNumber })\n    })()\n  }, [])\n\n  return (\n    <div>\n      <h2>Block Number</h2>\n\n      <div>Block Number (Default Chain): {blockNumber?.toString()}</div>\n    </div>\n  )\n}\n\nexport default App\n"
  },
  {
    "path": "playgrounds/vite-core/src/index.css",
    "content": ":root {\n  background-color: #181818;\n  color: rgba(255, 255, 255, 0.87);\n  color-scheme: light dark;\n  font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;\n  font-synthesis: none;\n  font-weight: 400;\n  line-height: 1.5;\n  text-rendering: optimizeLegibility;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-text-size-adjust: 100%;\n}\n\n@media (prefers-color-scheme: light) {\n  :root {\n    background-color: #f8f8f8;\n    color: #181818;\n  }\n}\n"
  },
  {
    "path": "playgrounds/vite-core/src/main.tsx",
    "content": "import React from 'react'\nimport ReactDOM from 'react-dom/client'\nimport './index.css'\n\nimport { Buffer } from 'buffer'\n\n// `@coinbase-wallet/sdk` uses `Buffer`\nglobalThis.Buffer = Buffer\n\nimport App from './App.tsx'\n\nReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(\n  <React.StrictMode>\n    <App />\n  </React.StrictMode>,\n)\n"
  },
  {
    "path": "playgrounds/vite-core/src/vite-env.d.ts",
    "content": "/// <reference types=\"vite/client\" />\n"
  },
  {
    "path": "playgrounds/vite-core/src/wagmi.ts",
    "content": "import { baseAccount, metaMask, walletConnect } from '@wagmi/connectors'\nimport { createConfig, createStorage, http } from '@wagmi/core'\nimport { mainnet, optimism, sepolia } from '@wagmi/core/chains'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia, optimism],\n  connectors: [\n    walletConnect({ projectId: import.meta.env.VITE_WC_PROJECT_ID }),\n    baseAccount(),\n    metaMask(),\n  ],\n  storage: createStorage({ storage: localStorage, key: 'vite-core' }),\n  transports: {\n    [mainnet.id]: http(\n      'https://eth-mainnet.g.alchemy.com/v2/StF61Ht3J9nXAojZX-b21LVt9l0qDL38',\n    ),\n    [sepolia.id]: http(\n      'https://eth-sepolia.g.alchemy.com/v2/roJyEHxkj7XWg1T9wmYnxvktDodQrFAS',\n    ),\n    [optimism.id]: http(),\n  },\n})\n"
  },
  {
    "path": "playgrounds/vite-core/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"lib\": [\"DOM\", \"DOM.Iterable\", \"ESNext\"],\n    \"module\": \"ESNext\",\n    \"skipLibCheck\": true,\n\n    \"moduleResolution\": \"bundler\",\n    \"allowImportingTsExtensions\": true,\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"noEmit\": true,\n    \"jsx\": \"react-jsx\",\n\n    \"strict\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"noFallthroughCasesInSwitch\": true,\n\n    \"paths\": {\n      \"@wagmi/connectors\": [\"../../packages/connectors/src/exports\"],\n      \"@wagmi/core\": [\"../../packages/core/src/exports\"],\n      \"@wagmi/core/*\": [\"../../packages/core/src/exports/*\"]\n    }\n  },\n  \"include\": [\"src\"],\n  \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"
  },
  {
    "path": "playgrounds/vite-core/tsconfig.node.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"skipLibCheck\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"bundler\",\n    \"allowSyntheticDefaultImports\": true\n  },\n  \"include\": [\"vite.config.ts\"]\n}\n"
  },
  {
    "path": "playgrounds/vite-core/vite.config.ts",
    "content": "import react from '@vitejs/plugin-react'\nimport { defineConfig } from 'vite'\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [react()],\n})\n"
  },
  {
    "path": "playgrounds/vite-react/.gitignore",
    "content": "src/generated.ts\n\n# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"
  },
  {
    "path": "playgrounds/vite-react/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Vite React</title>\n  </head>\n  <body>\n    <div id=\"root\"></div>\n    <script type=\"module\" src=\"/src/main.tsx\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "playgrounds/vite-react/package.json",
    "content": "{\n  \"name\": \"vite-react\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"tsc && vite build\",\n    \"preview\": \"vite preview\"\n  },\n  \"dependencies\": {\n    \"@tanstack/query-sync-storage-persister\": \"^5.90.12\",\n    \"@tanstack/react-query\": \"catalog:\",\n    \"@tanstack/react-query-persist-client\": \"^5.90.12\",\n    \"cuer\": \"^0.0.3\",\n    \"idb-keyval\": \"^6.2.1\",\n    \"react\": \"catalog:\",\n    \"react-dom\": \"catalog:\",\n    \"viem\": \"2.*\",\n    \"wagmi\": \"workspace:*\"\n  },\n  \"devDependencies\": {\n    \"@tanstack/react-query-devtools\": \"^5.91.2\",\n    \"@types/react\": \"catalog:\",\n    \"@types/react-dom\": \"catalog:\",\n    \"@vitejs/plugin-react\": \"catalog:\",\n    \"@wagmi/cli\": \"workspace:*\",\n    \"buffer\": \"catalog:\",\n    \"vite\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "playgrounds/vite-react/public/manifest.json",
    "content": "{\n  \"name\": \"vite-react\",\n  \"description\": \"vite-react playground\",\n  \"iconPath\": \"favicon.ico\"\n}\n"
  },
  {
    "path": "playgrounds/vite-react/src/App.tsx",
    "content": "import { Cuer } from 'cuer'\nimport { type FormEvent, useState } from 'react'\nimport { formatEther, type Hex, parseAbi, parseEther, stringify } from 'viem'\nimport {\n  type BaseError,\n  useBalance,\n  useBlockNumber,\n  useChainId,\n  useChains,\n  useConnect,\n  useConnection,\n  useConnectionEffect,\n  useConnections,\n  useConnectorClient,\n  useConnectors,\n  useDisconnect,\n  useEnsName,\n  useReadContract,\n  useReadContracts,\n  useSendTransaction,\n  useSignMessage,\n  useSwitchChain,\n  useSwitchConnection,\n  useWaitForTransactionReceipt,\n  useWriteContract,\n} from 'wagmi'\nimport { optimism } from 'wagmi/chains'\n\nimport { wagmiContractConfig } from './contracts'\n\nfunction App() {\n  useConnectionEffect({\n    onConnect(_data) {\n      // console.log('onConnect', data)\n    },\n    onDisconnect() {\n      // console.log('onDisconnect')\n    },\n  })\n\n  return (\n    <>\n      <Connection />\n      <Connect />\n      <SwitchConnection />\n      <SwitchChain />\n      <SignMessage />\n      <Connections />\n      <BlockNumber />\n      <Balance />\n      <ConnectorClient />\n      <SendTransaction />\n      <ReadContract />\n      <ReadContracts />\n      <WriteContract />\n    </>\n  )\n}\n\nfunction Connection() {\n  const connection = useConnection()\n  const { disconnect } = useDisconnect()\n  const { data: ensName } = useEnsName({\n    address: connection.address,\n  })\n\n  return (\n    <div>\n      <h2>Connection</h2>\n\n      <div>\n        account: {connection.address} {ensName}\n        <br />\n        chainId: {connection.chainId}\n        <br />\n        status: {connection.status}\n      </div>\n\n      {connection.status !== 'disconnected' && (\n        <button type=\"button\" onClick={() => disconnect()}>\n          Disconnect\n        </button>\n      )}\n    </div>\n  )\n}\n\nfunction Connect() {\n  const chainId = useChainId()\n  const connectors = useConnectors()\n  const [qrUri, setQrUri] = useState<string>()\n\n  const connect = useConnect({\n    mutation: {\n      onMutate(variables) {\n        const connector = variables.connector\n        if (connector && typeof connector !== 'function') {\n          if (connector.id === 'walletConnect')\n            connector.emitter.on('message', (message) => {\n              if (message.type !== 'display_uri') return\n              if (typeof message.data !== 'string') return\n              setQrUri(message.data)\n            })\n          if (connector.id === 'metaMaskSDK')\n            connector.emitter.on('message', (message) => {\n              if (message.type !== 'display_uri') return\n              if (typeof message.data !== 'string') return\n              setQrUri(message.data)\n            })\n        }\n      },\n      onSettled() {\n        setQrUri(undefined)\n      },\n    },\n  })\n\n  return (\n    <div>\n      <h2>Connect</h2>\n      {connectors.map((connector) => (\n        <button\n          key={connector.uid}\n          onClick={async () => {\n            connect\n              .mutateAsync({\n                connector,\n                chainId,\n                withCapabilities: true,\n              })\n              .then(console.log)\n              // biome-ignore lint/suspicious/noConsole: allow\n              .catch(console.error)\n          }}\n          type=\"button\"\n        >\n          {connector.name}\n        </button>\n      ))}\n      <div>{connect.status}</div>\n      <div>{connect.error?.message}</div>\n\n      {qrUri && (\n        <div\n          style={{\n            padding: 8,\n            background: 'white',\n            width: 200,\n            position: 'fixed',\n            bottom: 16,\n            left: 16,\n            zIndex: 99999,\n            borderRadius: 8,\n          }}\n        >\n          <Cuer value={qrUri} color=\"black\" />\n        </div>\n      )}\n    </div>\n  )\n}\n\nfunction SwitchConnection() {\n  const connection = useConnection()\n  const { switchConnection } = useSwitchConnection()\n  const connections = useConnections()\n\n  return (\n    <div>\n      <h2>Switch Connection</h2>\n\n      {connections.map(({ connector }) => (\n        <button\n          disabled={connection.connector?.uid === connector.uid}\n          key={connector.uid}\n          onClick={() => switchConnection({ connector })}\n          type=\"button\"\n        >\n          {connector.name}\n        </button>\n      ))}\n    </div>\n  )\n}\n\nfunction SwitchChain() {\n  const chainId = useChainId()\n  const { switchChain, error } = useSwitchChain()\n  const chains = useChains()\n\n  return (\n    <div>\n      <h2>Switch Chain</h2>\n\n      {chains.map((chain) => (\n        <button\n          disabled={chainId === chain.id}\n          key={chain.id}\n          onClick={() => switchChain({ chainId: chain.id })}\n          type=\"button\"\n        >\n          {chain.name}\n        </button>\n      ))}\n\n      {error?.message}\n    </div>\n  )\n}\n\nfunction SignMessage() {\n  const signMessage = useSignMessage()\n\n  return (\n    <div>\n      <h2>Sign Message</h2>\n\n      <form\n        onSubmit={(event) => {\n          event.preventDefault()\n          const formData = new FormData(event.target as HTMLFormElement)\n          signMessage.mutate({ message: formData.get('message') as string })\n        }}\n      >\n        <input name=\"message\" />\n        <button type=\"submit\">Sign Message</button>\n      </form>\n\n      {signMessage.data}\n    </div>\n  )\n}\n\nfunction Connections() {\n  const connections = useConnections()\n\n  return (\n    <div>\n      <h2>Connections</h2>\n\n      {connections.map((connection) => (\n        <div key={connection.connector.uid}>\n          <div>connector {connection.connector.name}</div>\n          <div>accounts: {stringify(connection.accounts)}</div>\n          <div>chainId: {connection.chainId}</div>\n        </div>\n      ))}\n    </div>\n  )\n}\n\nfunction Balance() {\n  const { address } = useConnection()\n\n  const { data: default_ } = useBalance({ address })\n  const { data: account_ } = useBalance({ address })\n  const { data: optimism_ } = useBalance({\n    address,\n    chainId: optimism.id,\n  })\n\n  return (\n    <div>\n      <h2>Balance</h2>\n\n      <div>\n        Balance (Default Chain):{' '}\n        {!!default_?.value && formatEther(default_.value)}\n      </div>\n      <div>\n        Balance (Connection Chain):{' '}\n        {!!account_?.value && formatEther(account_.value)}\n      </div>\n      <div>\n        Balance (Optimism Chain):{' '}\n        {!!optimism_?.value && formatEther(optimism_.value)}\n      </div>\n    </div>\n  )\n}\n\nfunction BlockNumber() {\n  const { data: default_ } = useBlockNumber({ watch: true })\n  const { data: account_ } = useBlockNumber({\n    watch: true,\n  })\n  const { data: optimism_ } = useBlockNumber({\n    chainId: optimism.id,\n    watch: true,\n  })\n\n  return (\n    <div>\n      <h2>Block Number</h2>\n\n      <div>Block Number (Default Chain): {default_?.toString()}</div>\n      <div>Block Number (Connection Chain): {account_?.toString()}</div>\n      <div>Block Number (Optimism): {optimism_?.toString()}</div>\n    </div>\n  )\n}\n\nfunction ConnectorClient() {\n  const { data, error } = useConnectorClient()\n  return (\n    <div>\n      <h2>Connector Client</h2>\n      client {data?.account?.address} {data?.chain?.id}\n      {error?.message}\n    </div>\n  )\n}\n\nfunction SendTransaction() {\n  const { data: hash, error, isPending, sendTransaction } = useSendTransaction()\n\n  async function submit(e: FormEvent<HTMLFormElement>) {\n    e.preventDefault()\n    const formData = new FormData(e.target as HTMLFormElement)\n    const to = formData.get('address') as Hex\n    const value = formData.get('value') as string\n    sendTransaction({ to, value: parseEther(value) })\n  }\n\n  const { isLoading: isConfirming, isSuccess: isConfirmed } =\n    useWaitForTransactionReceipt({\n      hash,\n    })\n\n  return (\n    <div>\n      <h2>Send Transaction</h2>\n      <form onSubmit={submit}>\n        <input name=\"address\" placeholder=\"Address\" required />\n        <input\n          name=\"value\"\n          placeholder=\"Amount (ETH)\"\n          type=\"number\"\n          step=\"0.000000001\"\n          required\n        />\n        <button disabled={isPending} type=\"submit\">\n          {isPending ? 'Confirming...' : 'Send'}\n        </button>\n      </form>\n      {hash && <div>Transaction Hash: {hash}</div>}\n      {isConfirming && 'Waiting for confirmation...'}\n      {isConfirmed && 'Transaction confirmed.'}\n      {error && (\n        <div>Error: {(error as BaseError).shortMessage || error.message}</div>\n      )}\n    </div>\n  )\n}\n\nfunction ReadContract() {\n  const { data: balance } = useReadContract({\n    ...wagmiContractConfig,\n    functionName: 'balanceOf',\n    args: ['0x03A71968491d55603FFe1b11A9e23eF013f75bCF'],\n  })\n\n  return (\n    <div>\n      <h2>Read Contract</h2>\n      <div>Balance: {balance?.toString()}</div>\n    </div>\n  )\n}\n\nfunction ReadContracts() {\n  const { data } = useReadContracts({\n    allowFailure: false,\n    contracts: [\n      {\n        ...wagmiContractConfig,\n        functionName: 'balanceOf',\n        args: ['0x03A71968491d55603FFe1b11A9e23eF013f75bCF'],\n      },\n      {\n        ...wagmiContractConfig,\n        functionName: 'ownerOf',\n        args: [69n],\n      },\n      {\n        ...wagmiContractConfig,\n        functionName: 'totalSupply',\n      },\n    ],\n  })\n  const [balance, ownerOf, totalSupply] = data || []\n\n  return (\n    <div>\n      <h2>Read Contract</h2>\n      <div>Balance: {balance?.toString()}</div>\n      <div>Owner of Token 69: {ownerOf?.toString()}</div>\n      <div>Total Supply: {totalSupply?.toString()}</div>\n    </div>\n  )\n}\n\nfunction WriteContract() {\n  const { data: hash, error, isPending, writeContract } = useWriteContract()\n\n  async function submit(e: FormEvent<HTMLFormElement>) {\n    e.preventDefault()\n    const formData = new FormData(e.target as HTMLFormElement)\n    const tokenId = formData.get('tokenId') as string\n    writeContract({\n      address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n      abi: parseAbi(['function mint(uint256 tokenId)']),\n      functionName: 'mint',\n      args: [BigInt(tokenId)],\n    })\n  }\n\n  const { isLoading: isConfirming, isSuccess: isConfirmed } =\n    useWaitForTransactionReceipt({\n      hash,\n    })\n\n  return (\n    <div>\n      <h2>Write Contract</h2>\n      <form onSubmit={submit}>\n        <input name=\"tokenId\" placeholder=\"Token ID\" required />\n        <button disabled={isPending} type=\"submit\">\n          {isPending ? 'Confirming...' : 'Mint'}\n        </button>\n      </form>\n      {hash && <div>Transaction Hash: {hash}</div>}\n      {isConfirming && 'Waiting for confirmation...'}\n      {isConfirmed && 'Transaction confirmed.'}\n      {error && (\n        <div>Error: {(error as BaseError).shortMessage || error.message}</div>\n      )}\n    </div>\n  )\n}\n\nexport default App\n"
  },
  {
    "path": "playgrounds/vite-react/src/contracts.ts",
    "content": "export const wagmiContractConfig = {\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  abi: [\n    { inputs: [], stateMutability: 'nonpayable', type: 'constructor' },\n    {\n      anonymous: false,\n      inputs: [\n        {\n          indexed: true,\n          name: 'owner',\n          type: 'address',\n        },\n        {\n          indexed: true,\n          name: 'approved',\n          type: 'address',\n        },\n        {\n          indexed: true,\n          name: 'tokenId',\n          type: 'uint256',\n        },\n      ],\n      name: 'Approval',\n      type: 'event',\n    },\n    {\n      anonymous: false,\n      inputs: [\n        {\n          indexed: true,\n          name: 'owner',\n          type: 'address',\n        },\n        {\n          indexed: true,\n          name: 'operator',\n          type: 'address',\n        },\n        {\n          indexed: false,\n          name: 'approved',\n          type: 'bool',\n        },\n      ],\n      name: 'ApprovalForAll',\n      type: 'event',\n    },\n    {\n      anonymous: false,\n      inputs: [\n        {\n          indexed: true,\n          name: 'from',\n          type: 'address',\n        },\n        { indexed: true, name: 'to', type: 'address' },\n        {\n          indexed: true,\n          name: 'tokenId',\n          type: 'uint256',\n        },\n      ],\n      name: 'Transfer',\n      type: 'event',\n    },\n    {\n      inputs: [\n        { name: 'to', type: 'address' },\n        { name: 'tokenId', type: 'uint256' },\n      ],\n      name: 'approve',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'owner', type: 'address' }],\n      name: 'balanceOf',\n      outputs: [{ name: '', type: 'uint256' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'tokenId', type: 'uint256' }],\n      name: 'getApproved',\n      outputs: [{ name: '', type: 'address' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'owner', type: 'address' },\n        { name: 'operator', type: 'address' },\n      ],\n      name: 'isApprovedForAll',\n      outputs: [{ name: '', type: 'bool' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [],\n      name: 'mint',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [{ internalType: 'uint256', name: 'tokenId', type: 'uint256' }],\n      name: 'mint',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [],\n      name: 'name',\n      outputs: [{ name: '', type: 'string' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'tokenId', type: 'uint256' }],\n      name: 'ownerOf',\n      outputs: [{ name: '', type: 'address' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'from', type: 'address' },\n        { name: 'to', type: 'address' },\n        { name: 'tokenId', type: 'uint256' },\n      ],\n      name: 'safeTransferFrom',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'from', type: 'address' },\n        { name: 'to', type: 'address' },\n        { name: 'tokenId', type: 'uint256' },\n        { name: '_data', type: 'bytes' },\n      ],\n      name: 'safeTransferFrom',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'operator', type: 'address' },\n        { name: 'approved', type: 'bool' },\n      ],\n      name: 'setApprovalForAll',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'interfaceId', type: 'bytes4' }],\n      name: 'supportsInterface',\n      outputs: [{ name: '', type: 'bool' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [],\n      name: 'symbol',\n      outputs: [{ name: '', type: 'string' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'tokenId', type: 'uint256' }],\n      name: 'tokenURI',\n      outputs: [{ name: '', type: 'string' }],\n      stateMutability: 'pure',\n      type: 'function',\n    },\n    {\n      inputs: [],\n      name: 'totalSupply',\n      outputs: [{ name: '', type: 'uint256' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'from', type: 'address' },\n        { name: 'to', type: 'address' },\n        { name: 'tokenId', type: 'uint256' },\n      ],\n      name: 'transferFrom',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n  ],\n} as const\n"
  },
  {
    "path": "playgrounds/vite-react/src/index.css",
    "content": ":root {\n  background-color: #181818;\n  color: rgba(255, 255, 255, 0.87);\n  color-scheme: light dark;\n  font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;\n  font-synthesis: none;\n  font-weight: 400;\n  line-height: 1.5;\n  text-rendering: optimizeLegibility;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-text-size-adjust: 100%;\n}\n\n@media (prefers-color-scheme: light) {\n  :root {\n    background-color: #f8f8f8;\n    color: #181818;\n  }\n}\n"
  },
  {
    "path": "playgrounds/vite-react/src/main.tsx",
    "content": "import { createSyncStoragePersister } from '@tanstack/query-sync-storage-persister'\nimport { QueryClient } from '@tanstack/react-query'\nimport { ReactQueryDevtools } from '@tanstack/react-query-devtools'\nimport { PersistQueryClientProvider } from '@tanstack/react-query-persist-client'\nimport { Buffer } from 'buffer'\nimport React from 'react'\nimport ReactDOM from 'react-dom/client'\nimport { deserialize, serialize, WagmiProvider } from 'wagmi'\n\nimport './index.css'\n\n// `@coinbase-wallet/sdk` uses `Buffer`\nglobalThis.Buffer = Buffer\n\nimport App from './App.tsx'\nimport { config } from './wagmi.ts'\n\nconst queryClient = new QueryClient({\n  defaultOptions: {\n    queries: {\n      gcTime: 1_000 * 60 * 60 * 24, // 24 hours\n      networkMode: 'offlineFirst',\n      refetchOnWindowFocus: false,\n      retry: 0,\n    },\n    mutations: { networkMode: 'offlineFirst' },\n  },\n})\n\nconst persister = createSyncStoragePersister({\n  key: 'vite-react.cache',\n  serialize,\n  storage: window.localStorage,\n  deserialize,\n})\n\nReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(\n  <React.StrictMode>\n    <WagmiProvider config={config}>\n      <PersistQueryClientProvider\n        client={queryClient}\n        persistOptions={{ persister }}\n      >\n        <App />\n        <ReactQueryDevtools initialIsOpen={false} />\n      </PersistQueryClientProvider>\n    </WagmiProvider>\n  </React.StrictMode>,\n)\n"
  },
  {
    "path": "playgrounds/vite-react/src/vite-env.d.ts",
    "content": "/// <reference types=\"vite/client\" />\n"
  },
  {
    "path": "playgrounds/vite-react/src/wagmi.ts",
    "content": "import { del, get, set } from 'idb-keyval'\nimport { createConfig, http } from 'wagmi'\nimport { celo, mainnet, optimism, sepolia } from 'wagmi/chains'\nimport { baseAccount, metaMask, porto, walletConnect } from 'wagmi/connectors'\n\n// biome-ignore lint/correctness/noUnusedVariables: allowed\nconst indexedDBStorage = {\n  async getItem(name: string) {\n    return get(name)\n  },\n  async setItem(name: string, value: string) {\n    await set(name, value)\n  },\n  async removeItem(name: string) {\n    await del(name)\n  },\n}\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia, optimism, celo],\n  connectors: [\n    walletConnect({\n      projectId: import.meta.env.VITE_WC_PROJECT_ID,\n    }),\n    porto(),\n    baseAccount(),\n    metaMask({ ui: { headless: true } }),\n  ],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n    [optimism.id]: http(),\n    [celo.id]: http(),\n  },\n})\n\ndeclare module 'wagmi' {\n  interface Register {\n    config: typeof config\n  }\n}\n"
  },
  {
    "path": "playgrounds/vite-react/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"lib\": [\"DOM\", \"DOM.Iterable\", \"ESNext\"],\n    \"module\": \"ESNext\",\n    \"skipLibCheck\": true,\n\n    \"moduleResolution\": \"bundler\",\n    \"allowImportingTsExtensions\": true,\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"noEmit\": true,\n    \"jsx\": \"react-jsx\",\n\n    \"strict\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"noFallthroughCasesInSwitch\": true,\n\n    \"paths\": {\n      \"@wagmi/connectors\": [\"../../packages/connectors/src/exports\"],\n      \"@wagmi/core\": [\"../../packages/core/src/exports\"],\n      \"@wagmi/core/*\": [\"../../packages/core/src/exports/*\"],\n      \"wagmi\": [\"../../packages/react/src/exports\"],\n      \"wagmi/*\": [\"../../packages/react/src/exports/*\"]\n    }\n  },\n  \"include\": [\"src\"],\n  \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"
  },
  {
    "path": "playgrounds/vite-react/tsconfig.node.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"skipLibCheck\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"bundler\",\n    \"allowSyntheticDefaultImports\": true\n  },\n  \"include\": [\"vite.config.ts\"]\n}\n"
  },
  {
    "path": "playgrounds/vite-react/vite.config.ts",
    "content": "import react from '@vitejs/plugin-react'\nimport { defineConfig } from 'vite'\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [react()],\n})\n"
  },
  {
    "path": "playgrounds/vite-react/wagmi.config.ts",
    "content": "import { defineConfig } from '@wagmi/cli'\nimport { foundry, hardhat } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  out: 'src/generated.ts',\n  contracts: [],\n  plugins: [\n    foundry({\n      namePrefix: 'foundry',\n      project: '../../packages/cli/src/plugins/__fixtures__/foundry',\n    }),\n    hardhat({\n      namePrefix: 'hardhat',\n      project: '../../packages/cli/src/plugins/__fixtures__/hardhat',\n    }),\n  ],\n})\n"
  },
  {
    "path": "playgrounds/vite-solid/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"
  },
  {
    "path": "playgrounds/vite-solid/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"/vite.svg\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Vite Solid</title>\n  </head>\n  <body>\n    <div id=\"root\"></div>\n    <script type=\"module\" src=\"/src/index.tsx\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "playgrounds/vite-solid/package.json",
    "content": "{\n  \"name\": \"vite-solid\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"tsc && vite build\",\n    \"preview\": \"vite preview\"\n  },\n  \"dependencies\": {\n    \"@tanstack/solid-query\": \"catalog:\",\n    \"@wagmi/solid\": \"workspace:*\",\n    \"solid-js\": \"catalog:\",\n    \"viem\": \"2.*\"\n  },\n  \"devDependencies\": {\n    \"buffer\": \"catalog:\",\n    \"vite\": \"catalog:\",\n    \"vite-plugin-solid\": \"catalog:\"\n  }\n}\n"
  },
  {
    "path": "playgrounds/vite-solid/src/App.tsx",
    "content": "import {\n  useBalance,\n  useBlockNumber,\n  useChainId,\n  useChains,\n  useConnect,\n  useConnection,\n  useConnections,\n  useConnectorClient,\n  useConnectors,\n  useDisconnect,\n  useSwitchChain,\n  useSwitchConnection,\n} from '@wagmi/solid'\nimport { optimism } from '@wagmi/solid/chains'\nimport { For, Show } from 'solid-js'\nimport { formatEther, stringify } from 'viem'\n\nexport function App() {\n  return (\n    <>\n      <Connection />\n      <Connect />\n      <SwitchConnection />\n      <SwitchChain />\n      {/* <SignMessage /> */}\n      <Connections />\n      <BlockNumber />\n      <Balance />\n      <ConnectorClient />\n      {/* <SendTransaction /> */}\n      {/* <ReadContract /> */}\n      {/* <ReadContracts /> */}\n      {/* <WriteContract /> */}\n    </>\n  )\n}\n\nfunction Connection() {\n  const connection = useConnection()\n  const disconnect = useDisconnect()\n\n  return (\n    <div>\n      <h2>Connection</h2>\n\n      <div>\n        account: {connection().address}\n        <br />\n        chainId: {connection().chainId}\n        <br />\n        status: {connection().status}\n      </div>\n\n      <Show when={connection().status !== 'disconnected'}>\n        <button\n          type=\"button\"\n          onClick={() => {\n            console.log('disconnect clicked')\n            disconnect.mutate()\n          }}\n        >\n          Disconnect\n        </button>\n      </Show>\n    </div>\n  )\n}\n\nfunction Connect() {\n  const chainId = useChainId()\n  const connect = useConnect()\n  const connectors = useConnectors()\n\n  return (\n    <div>\n      <h2>Connect</h2>\n      <For each={connectors()}>\n        {(connector) => (\n          <button\n            onClick={async () => {\n              connect\n                .mutateAsync({\n                  connector,\n                  chainId: chainId(),\n                })\n                .then(console.log)\n                // biome-ignore lint/suspicious/noConsole: allow\n                .catch(console.error)\n            }}\n            type=\"button\"\n          >\n            {connector.name}\n          </button>\n        )}\n      </For>\n      <div>{connect.status}</div>\n      <div>{connect.error?.message}</div>\n    </div>\n  )\n}\n\nfunction SwitchConnection() {\n  const connection = useConnection()\n  const { mutate: switchConnection } = useSwitchConnection()\n  const connections = useConnections()\n\n  return (\n    <div>\n      <h2>Switch Connection</h2>\n\n      <For each={connections()}>\n        {(conn) => (\n          <button\n            disabled={connection().connector?.uid === conn.connector.uid}\n            onClick={() => switchConnection({ connector: conn.connector })}\n            type=\"button\"\n          >\n            {conn.connector.name}\n          </button>\n        )}\n      </For>\n    </div>\n  )\n}\n\nfunction SwitchChain() {\n  const chainId = useChainId()\n  const switchChain = useSwitchChain()\n  const chains = useChains()\n\n  return (\n    <div>\n      <h2>Switch Chain</h2>\n\n      <For each={chains()}>\n        {(chain) => (\n          <button\n            disabled={chainId() === chain.id}\n            onClick={() => switchChain.mutate({ chainId: chain.id })}\n            type=\"button\"\n          >\n            {chain.name}\n          </button>\n        )}\n      </For>\n\n      {switchChain.error?.message}\n    </div>\n  )\n}\n\nfunction Connections() {\n  const connections = useConnections()\n\n  return (\n    <div>\n      <h2>Connections</h2>\n\n      <For each={connections()}>\n        {(connection) => (\n          <div>\n            <div>connector {connection.connector.name}</div>\n            <div>accounts: {stringify(connection.accounts)}</div>\n            <div>chainId: {connection.chainId}</div>\n          </div>\n        )}\n      </For>\n    </div>\n  )\n}\n\nfunction BlockNumber() {\n  const default_ = useBlockNumber(() => ({ watch: true }))\n  const account_ = useBlockNumber(() => ({ watch: true }))\n  const optimism_ = useBlockNumber(() => ({\n    chainId: optimism.id,\n    watch: true,\n  }))\n\n  return (\n    <div>\n      <h2>Block Number</h2>\n\n      <div>Block Number (Default Chain): {default_.data?.toString()}</div>\n      <div>Block Number (Connection Chain): {account_.data?.toString()}</div>\n      <div>Block Number (Optimism): {optimism_.data?.toString()}</div>\n    </div>\n  )\n}\n\nfunction Balance() {\n  const connection = useConnection()\n\n  const default_ = useBalance(() => ({\n    address: connection().address,\n  }))\n  const account_ = useBalance(() => ({\n    address: connection().address,\n  }))\n  const optimism_ = useBalance(() => ({\n    address: connection().address,\n    chainId: optimism.id,\n  }))\n\n  return (\n    <div>\n      <h2>Balance</h2>\n\n      <div>\n        Balance (Default Chain):{' '}\n        {!!default_?.data?.value && formatEther(default_.data.value)}\n      </div>\n      <div>\n        Balance (Connection Chain):{' '}\n        {!!account_?.data?.value && formatEther(account_.data.value)}\n      </div>\n      <div>\n        Balance (Optimism Chain):{' '}\n        {!!optimism_?.data?.value && formatEther(optimism_.data.value)}\n      </div>\n    </div>\n  )\n}\n\nfunction ConnectorClient() {\n  const connectorClient = useConnectorClient()\n  return (\n    <div>\n      <h2>Connector Client</h2>\n      client {connectorClient.data?.account?.address}{' '}\n      {connectorClient.data?.chain?.id}\n      {connectorClient.error?.message}\n    </div>\n  )\n}\n"
  },
  {
    "path": "playgrounds/vite-solid/src/contracts.ts",
    "content": "export const wagmiContractConfig = {\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  abi: [\n    { inputs: [], stateMutability: 'nonpayable', type: 'constructor' },\n    {\n      anonymous: false,\n      inputs: [\n        {\n          indexed: true,\n          name: 'owner',\n          type: 'address',\n        },\n        {\n          indexed: true,\n          name: 'approved',\n          type: 'address',\n        },\n        {\n          indexed: true,\n          name: 'tokenId',\n          type: 'uint256',\n        },\n      ],\n      name: 'Approval',\n      type: 'event',\n    },\n    {\n      anonymous: false,\n      inputs: [\n        {\n          indexed: true,\n          name: 'owner',\n          type: 'address',\n        },\n        {\n          indexed: true,\n          name: 'operator',\n          type: 'address',\n        },\n        {\n          indexed: false,\n          name: 'approved',\n          type: 'bool',\n        },\n      ],\n      name: 'ApprovalForAll',\n      type: 'event',\n    },\n    {\n      anonymous: false,\n      inputs: [\n        {\n          indexed: true,\n          name: 'from',\n          type: 'address',\n        },\n        { indexed: true, name: 'to', type: 'address' },\n        {\n          indexed: true,\n          name: 'tokenId',\n          type: 'uint256',\n        },\n      ],\n      name: 'Transfer',\n      type: 'event',\n    },\n    {\n      inputs: [\n        { name: 'to', type: 'address' },\n        { name: 'tokenId', type: 'uint256' },\n      ],\n      name: 'approve',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'owner', type: 'address' }],\n      name: 'balanceOf',\n      outputs: [{ name: '', type: 'uint256' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'tokenId', type: 'uint256' }],\n      name: 'getApproved',\n      outputs: [{ name: '', type: 'address' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'owner', type: 'address' },\n        { name: 'operator', type: 'address' },\n      ],\n      name: 'isApprovedForAll',\n      outputs: [{ name: '', type: 'bool' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [],\n      name: 'mint',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [{ internalType: 'uint256', name: 'tokenId', type: 'uint256' }],\n      name: 'mint',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [],\n      name: 'name',\n      outputs: [{ name: '', type: 'string' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'tokenId', type: 'uint256' }],\n      name: 'ownerOf',\n      outputs: [{ name: '', type: 'address' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'from', type: 'address' },\n        { name: 'to', type: 'address' },\n        { name: 'tokenId', type: 'uint256' },\n      ],\n      name: 'safeTransferFrom',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'from', type: 'address' },\n        { name: 'to', type: 'address' },\n        { name: 'tokenId', type: 'uint256' },\n        { name: '_data', type: 'bytes' },\n      ],\n      name: 'safeTransferFrom',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'operator', type: 'address' },\n        { name: 'approved', type: 'bool' },\n      ],\n      name: 'setApprovalForAll',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'interfaceId', type: 'bytes4' }],\n      name: 'supportsInterface',\n      outputs: [{ name: '', type: 'bool' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [],\n      name: 'symbol',\n      outputs: [{ name: '', type: 'string' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'tokenId', type: 'uint256' }],\n      name: 'tokenURI',\n      outputs: [{ name: '', type: 'string' }],\n      stateMutability: 'pure',\n      type: 'function',\n    },\n    {\n      inputs: [],\n      name: 'totalSupply',\n      outputs: [{ name: '', type: 'uint256' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'from', type: 'address' },\n        { name: 'to', type: 'address' },\n        { name: 'tokenId', type: 'uint256' },\n      ],\n      name: 'transferFrom',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n  ],\n} as const\n"
  },
  {
    "path": "playgrounds/vite-solid/src/index.css",
    "content": ":root {\n  background-color: #181818;\n  color: rgba(255, 255, 255, 0.87);\n  color-scheme: light dark;\n  font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;\n  font-synthesis: none;\n  font-weight: 400;\n  line-height: 1.5;\n  text-rendering: optimizeLegibility;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-text-size-adjust: 100%;\n}\n\n@media (prefers-color-scheme: light) {\n  :root {\n    background-color: #f8f8f8;\n    color: #181818;\n  }\n}\n"
  },
  {
    "path": "playgrounds/vite-solid/src/index.tsx",
    "content": "/* @refresh reload */\n\nimport { QueryClient, QueryClientProvider } from '@tanstack/solid-query'\nimport { WagmiProvider } from '@wagmi/solid'\nimport { Buffer } from 'buffer'\nimport { render } from 'solid-js/web'\n\nimport './index.css'\n\n// `@coinbase-wallet/sdk` uses `Buffer`\nglobalThis.Buffer = Buffer\n\nimport { App } from './App.tsx'\nimport { config } from './wagmi.ts'\n\nconst queryClient = new QueryClient()\n\nconst root = document.getElementById('root')\n\nrender(\n  () => (\n    <WagmiProvider config={config}>\n      <QueryClientProvider client={queryClient}>\n        <App />\n      </QueryClientProvider>\n    </WagmiProvider>\n  ),\n  root!,\n)\n"
  },
  {
    "path": "playgrounds/vite-solid/src/vite-env.d.ts",
    "content": "/// <reference types=\"vite/client\" />\n"
  },
  {
    "path": "playgrounds/vite-solid/src/wagmi.ts",
    "content": "import { createConfig, http } from '@wagmi/solid'\nimport { celo, mainnet, optimism, sepolia } from '@wagmi/solid/chains'\nimport {\n  baseAccount,\n  metaMask,\n  porto,\n  walletConnect,\n} from '@wagmi/solid/connectors'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia, optimism, celo],\n  connectors: [\n    walletConnect({\n      projectId: import.meta.env.VITE_WC_PROJECT_ID,\n    }),\n    porto(),\n    baseAccount(),\n    metaMask(),\n  ],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n    [optimism.id]: http(),\n    [celo.id]: http(),\n  },\n})\n\ndeclare module '@wagmi/solid' {\n  interface Register {\n    config: typeof config\n  }\n}\n"
  },
  {
    "path": "playgrounds/vite-solid/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"lib\": [\"DOM\", \"DOM.Iterable\", \"ESNext\"],\n    \"module\": \"ESNext\",\n    \"skipLibCheck\": true,\n\n    \"moduleResolution\": \"bundler\",\n    \"allowImportingTsExtensions\": true,\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"noEmit\": true,\n    \"jsx\": \"preserve\",\n    \"jsxImportSource\": \"solid-js\",\n\n    \"strict\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"noFallthroughCasesInSwitch\": true,\n\n    \"paths\": {\n      \"@wagmi/connectors\": [\"../../packages/connectors/src/exports\"],\n      \"@wagmi/core\": [\"../../packages/core/src/exports\"],\n      \"@wagmi/core/*\": [\"../../packages/core/src/exports/*\"],\n      \"@wagmi/solid\": [\"../../packages/solid/src/exports\"],\n      \"@wagmi/solid/*\": [\"../../packages/solid/src/exports/*\"]\n    }\n  },\n  \"include\": [\"src\"],\n  \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"
  },
  {
    "path": "playgrounds/vite-solid/tsconfig.node.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"skipLibCheck\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"bundler\",\n    \"allowSyntheticDefaultImports\": true\n  },\n  \"include\": [\"vite.config.ts\"]\n}\n"
  },
  {
    "path": "playgrounds/vite-solid/vite.config.ts",
    "content": "import { defineConfig } from 'vite'\nimport solid from 'vite-plugin-solid'\n\nexport default defineConfig({\n  plugins: [solid()],\n})\n"
  },
  {
    "path": "playgrounds/vite-vue/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"
  },
  {
    "path": "playgrounds/vite-vue/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"/vite.svg\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Vite Vue</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script type=\"module\" src=\"/src/main.ts\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "playgrounds/vite-vue/package.json",
    "content": "{\n  \"name\": \"vite-vue\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"vue-tsc && vite build\",\n    \"preview\": \"vite preview\"\n  },\n  \"dependencies\": {\n    \"@tanstack/vue-query\": \"catalog:\",\n    \"@wagmi/vue\": \"workspace:*\",\n    \"viem\": \"2.*\",\n    \"vue\": \"catalog:\"\n  },\n  \"devDependencies\": {\n    \"@vitejs/plugin-vue\": \"catalog:\",\n    \"buffer\": \"catalog:\",\n    \"vite\": \"catalog:\",\n    \"vue-tsc\": \"3.1.3\"\n  }\n}\n"
  },
  {
    "path": "playgrounds/vite-vue/src/App.vue",
    "content": "<script setup lang=\"ts\">\nimport Balance from './components/Balance.vue'\nimport BlockNumber from './components/BlockNumber.vue'\nimport Client from './components/Client.vue'\nimport Connect from './components/Connect.vue'\nimport Connection from './components/Connection.vue'\nimport Connections from './components/Connections.vue'\nimport ConnectorClient from './components/ConnectorClient.vue'\nimport ReadContract from './components/ReadContract.vue'\nimport SendTransaction from './components/SendTransaction.vue'\nimport SwitchChain from './components/SwitchChain.vue'\nimport SwitchConnection from './components/SwitchConnection.vue'\nimport WriteContract from './components/WriteContract.vue'\n</script>\n\n<template>\n  <Connection />\n  <Balance />\n  <Connect />\n  <Connections />\n  <SwitchConnection />\n  <SwitchChain />\n  <BlockNumber />\n  <ReadContract />\n  <SendTransaction />\n  <WriteContract />\n  <Client />\n  <ConnectorClient />\n</template>\n"
  },
  {
    "path": "playgrounds/vite-vue/src/components/Balance.vue",
    "content": "<script setup lang=\"ts\">\nimport { useBalance, useConnection } from '@wagmi/vue'\nimport { formatEther } from 'viem'\n\nconst { address } = useConnection()\nconst { data: balance } = useBalance({ address })\n</script>\n\n<template>\n  <h2>Balance</h2>\n\n  Balance: {{ formatEther(balance?.value ?? 0n) }}\n</template>\n"
  },
  {
    "path": "playgrounds/vite-vue/src/components/BlockNumber.vue",
    "content": "<script setup lang=\"ts\">\nimport { useBlockNumber } from '@wagmi/vue'\nimport { ref } from 'vue'\n\nconst watchBlockNumber = ref(false)\n\nconst { data: blockNumber } = useBlockNumber({ watch: watchBlockNumber })\n</script>\n\n<template>\n  <h2>Block Number</h2>\n\n  <div>{{ blockNumber }}</div>\n  <button type=\"button\" @click=\"watchBlockNumber = !watchBlockNumber\">\n    {{ watchBlockNumber ? 'Stop' : 'Start' }} watching\n  </button>\n</template>\n"
  },
  {
    "path": "playgrounds/vite-vue/src/components/Client.vue",
    "content": "<script setup lang=\"ts\">\nimport { useClient } from '@wagmi/vue'\n\nconst client = useClient()\n</script>\n\n<template>\n  <h2>Client</h2>\n\n  <details>\n    <summary>View</summary>\n    <pre>{{ client }}</pre>\n  </details>\n</template>\n"
  },
  {
    "path": "playgrounds/vite-vue/src/components/Connect.vue",
    "content": "<script setup lang=\"ts\">\nimport { useChainId, useConnect, useConnectors } from '@wagmi/vue'\n\nconst chainId = useChainId()\nconst connect = useConnect()\nconst connectors = useConnectors()\n</script>\n\n<template>\n  <h2>Connect</h2>\n\n  <button v-for=\"connector in connectors\" :key=\"connector.id\" type=\"button\" @click=\"connect.mutate({ connector, chainId })\">\n    {{ connector.name }}\n  </button>\n\n  <div>\n    {{ connect.status.value }}\n    {{ connect.error?.value?.message }}\n  </div>\n</template>\n"
  },
  {
    "path": "playgrounds/vite-vue/src/components/Connection.vue",
    "content": "<script setup lang=\"ts\">\nimport { useConnection, useDisconnect } from '@wagmi/vue'\n\nconst { address, chainId, status } = useConnection()\nconst disconnect = useDisconnect()\n</script>\n\n<template>\n  <h2>Connection</h2>\n\n  <div>\n    address: {{ address }}\n    <br />\n    chainId: {{ chainId }}\n    <br />\n    status: {{ status }}\n  </div>\n\n  <button v-if=\"status !== 'disconnected'\" type=\"button\" @click=\"disconnect.mutate()\">\n    Disconnect\n  </button>\n</template>\n"
  },
  {
    "path": "playgrounds/vite-vue/src/components/Connections.vue",
    "content": "<script setup lang=\"ts\">\nimport { useConnections } from '@wagmi/vue'\n\nconst connections = useConnections()\n</script>\n\n<template>\n  <h2>Connections</h2>\n\n  <div v-for=\"connection in connections\" :key=\"connection.connector.id\" type=\"button\">\n    <div>connector {{ connection.connector.name }}</div>\n    <div>accounts: {{ JSON.stringify(connection.accounts) }}</div>\n    <div>chainId: {{ connection.chainId }}</div>\n  </div>\n</template>\n"
  },
  {
    "path": "playgrounds/vite-vue/src/components/ConnectorClient.vue",
    "content": "<script setup lang=\"ts\">\nimport { useConnectorClient } from '@wagmi/vue'\n\nconst connectorClient = useConnectorClient()\n</script>\n\n<template>\n  <h2>Connector Client</h2>\n\n  <details>\n    <summary>View</summary>\n    <pre>{{ connectorClient }}</pre>\n  </details>\n</template>\n"
  },
  {
    "path": "playgrounds/vite-vue/src/components/ReadContract.vue",
    "content": "<script setup lang=\"ts\">\nimport { useReadContract } from '@wagmi/vue'\nimport { wagmiContractConfig } from '../contracts'\n\nconst { data: balance } = useReadContract({\n  ...wagmiContractConfig,\n  functionName: 'balanceOf',\n  args: ['0x03A71968491d55603FFe1b11A9e23eF013f75bCF'],\n})\n</script>\n\n<template>\n  <h2>Read Contract</h2>\n\n  <div>Balance: {{ balance?.toString() }}</div>\n</template>\n"
  },
  {
    "path": "playgrounds/vite-vue/src/components/SendTransaction.vue",
    "content": "<script setup lang=\"ts\">\nimport { useSendTransaction } from '@wagmi/vue'\nimport { type Hex, parseEther } from 'viem'\n\nconst sendTransaction = useSendTransaction()\n\nfunction onSubmit(event: any) {\n  const form = new FormData(event.target)\n  const to = form.get('address')! as Hex\n  const value = parseEther(form.get('value') as string)\n  sendTransaction.mutate({ to, value })\n}\n</script>\n\n<template>\n  <h2>\n    Send Transaction\n  </h2>\n  <form @submit.prevent=\"onSubmit\">\n    <input name=\"address\" placeholder=\"Address\" required />\n    <input name=\"value\" placeholder=\"Amount (ETH)\" type=\"number\" step=\"0.000000001\" required />\n    <button type=\"submit\">\n      Send\n    </button>\n  </form>\n  <div v-if=\"sendTransaction.isPending\">\n    Sending...\n  </div>\n  <div v-if=\"sendTransaction.data\">\n    Hash: {{ sendTransaction.data }}\n  </div>\n  <div v-if=\"sendTransaction.error\">\n    Error: {{ sendTransaction.error.value?.message }}\n  </div>\n</template>\n"
  },
  {
    "path": "playgrounds/vite-vue/src/components/SwitchChain.vue",
    "content": "<script setup lang=\"ts\">\nimport { useChainId, useChains, useSwitchChain } from '@wagmi/vue'\n\nconst chainId = useChainId()\nconst switchChain = useSwitchChain()\nconst chains = useChains()\n</script>\n\n<template>\n  <h2>Switch Chain</h2>\n\n  <div>Chain ID: {{ chainId }}</div>\n\n  <button v-for=\"chain in chains\" :key=\"chain.id\" :disabled=\"chain.id === chainId\" type=\"button\"\n    @click=\"switchChain.mutate({ chainId: chain.id })\">\n    {{ chain.name }}\n  </button>\n\n  <div>\n    {{ switchChain.status }}\n    {{ switchChain.error }}\n  </div>\n</template>\n"
  },
  {
    "path": "playgrounds/vite-vue/src/components/SwitchConnection.vue",
    "content": "<script setup lang=\"ts\">\nimport { useConnection, useConnections, useSwitchConnection } from '@wagmi/vue'\n\nconst { connector: currentConnector } = useConnection()\nconst switchConnection = useSwitchConnection()\nconst connections = useConnections()\n</script>\n\n<template>\n  <h2>Switch Connection</h2>\n\n  <button v-for=\"connection in connections\" :key=\"connection.connector.id\" :disabled=\"currentConnector?.uid === connection.connector.uid\"\n    type=\"button\" @click=\"switchConnection.mutate({ connector: connection.connector })\">\n    {{ connection.connector.name }}\n  </button>\n\n  <div>\n    {{ switchConnection.status }}\n    {{ switchConnection.error }}\n  </div>\n</template>\n"
  },
  {
    "path": "playgrounds/vite-vue/src/components/WriteContract.vue",
    "content": "<script setup lang=\"ts\">\nimport { BaseError, useWriteContract } from '@wagmi/vue'\nimport { parseAbi } from 'viem'\n\nconst writeContract = useWriteContract()\n\nfunction submit(e: any) {\n  const formData = new FormData(e.target as HTMLFormElement)\n  const tokenId = formData.get('tokenId') as string\n  writeContract.mutate({\n    address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n    abi: parseAbi(['function mint(uint256 tokenId)']),\n    functionName: 'mint',\n    args: [BigInt(tokenId)],\n  })\n}\n</script>\n\n<template>\n  <h2>Write Contract</h2>\n\n  <form @submit.prevent=\"submit\">\n    <input name=\"tokenId\" placeholder=\"Token ID\" required />\n    <button :disabled=\"writeContract.isPending.value\">Mint</button>\n  </form>\n  <div v-if=\"writeContract.data\">Transaction Hash: {{ writeContract.data }}</div>\n  <div v-if=\"writeContract.error\">Error: {{ (writeContract.error.value as BaseError)?.shortMessage || writeContract.error.value?.message }}</div>\n</template>\n"
  },
  {
    "path": "playgrounds/vite-vue/src/contracts.ts",
    "content": "export const wagmiContractConfig = {\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  abi: [\n    { inputs: [], stateMutability: 'nonpayable', type: 'constructor' },\n    {\n      anonymous: false,\n      inputs: [\n        {\n          indexed: true,\n          name: 'owner',\n          type: 'address',\n        },\n        {\n          indexed: true,\n          name: 'approved',\n          type: 'address',\n        },\n        {\n          indexed: true,\n          name: 'tokenId',\n          type: 'uint256',\n        },\n      ],\n      name: 'Approval',\n      type: 'event',\n    },\n    {\n      anonymous: false,\n      inputs: [\n        {\n          indexed: true,\n          name: 'owner',\n          type: 'address',\n        },\n        {\n          indexed: true,\n          name: 'operator',\n          type: 'address',\n        },\n        {\n          indexed: false,\n          name: 'approved',\n          type: 'bool',\n        },\n      ],\n      name: 'ApprovalForAll',\n      type: 'event',\n    },\n    {\n      anonymous: false,\n      inputs: [\n        {\n          indexed: true,\n          name: 'from',\n          type: 'address',\n        },\n        { indexed: true, name: 'to', type: 'address' },\n        {\n          indexed: true,\n          name: 'tokenId',\n          type: 'uint256',\n        },\n      ],\n      name: 'Transfer',\n      type: 'event',\n    },\n    {\n      inputs: [\n        { name: 'to', type: 'address' },\n        { name: 'tokenId', type: 'uint256' },\n      ],\n      name: 'approve',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'owner', type: 'address' }],\n      name: 'balanceOf',\n      outputs: [{ name: '', type: 'uint256' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'tokenId', type: 'uint256' }],\n      name: 'getApproved',\n      outputs: [{ name: '', type: 'address' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'owner', type: 'address' },\n        { name: 'operator', type: 'address' },\n      ],\n      name: 'isApprovedForAll',\n      outputs: [{ name: '', type: 'bool' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [],\n      name: 'mint',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [{ internalType: 'uint256', name: 'tokenId', type: 'uint256' }],\n      name: 'mint',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [],\n      name: 'name',\n      outputs: [{ name: '', type: 'string' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'tokenId', type: 'uint256' }],\n      name: 'ownerOf',\n      outputs: [{ name: '', type: 'address' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'from', type: 'address' },\n        { name: 'to', type: 'address' },\n        { name: 'tokenId', type: 'uint256' },\n      ],\n      name: 'safeTransferFrom',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'from', type: 'address' },\n        { name: 'to', type: 'address' },\n        { name: 'tokenId', type: 'uint256' },\n        { name: '_data', type: 'bytes' },\n      ],\n      name: 'safeTransferFrom',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'operator', type: 'address' },\n        { name: 'approved', type: 'bool' },\n      ],\n      name: 'setApprovalForAll',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'interfaceId', type: 'bytes4' }],\n      name: 'supportsInterface',\n      outputs: [{ name: '', type: 'bool' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [],\n      name: 'symbol',\n      outputs: [{ name: '', type: 'string' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [{ name: 'tokenId', type: 'uint256' }],\n      name: 'tokenURI',\n      outputs: [{ name: '', type: 'string' }],\n      stateMutability: 'pure',\n      type: 'function',\n    },\n    {\n      inputs: [],\n      name: 'totalSupply',\n      outputs: [{ name: '', type: 'uint256' }],\n      stateMutability: 'view',\n      type: 'function',\n    },\n    {\n      inputs: [\n        { name: 'from', type: 'address' },\n        { name: 'to', type: 'address' },\n        { name: 'tokenId', type: 'uint256' },\n      ],\n      name: 'transferFrom',\n      outputs: [],\n      stateMutability: 'nonpayable',\n      type: 'function',\n    },\n  ],\n} as const\n"
  },
  {
    "path": "playgrounds/vite-vue/src/main.ts",
    "content": "import { VueQueryPlugin } from '@tanstack/vue-query'\nimport { WagmiPlugin } from '@wagmi/vue'\nimport { Buffer } from 'buffer'\nimport { createApp } from 'vue'\n\n// `@coinbase-wallet/sdk` uses `Buffer`\nglobalThis.Buffer = Buffer\n\nimport App from './App.vue'\nimport './style.css'\nimport { config } from './wagmi'\n\nconst app = createApp(App)\n\napp.use(WagmiPlugin, { config }).use(VueQueryPlugin, {})\n\napp.mount('#app')\n"
  },
  {
    "path": "playgrounds/vite-vue/src/style.css",
    "content": ":root {\n  background-color: #181818;\n  color: rgba(255, 255, 255, 0.87);\n  color-scheme: light dark;\n  font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;\n  font-synthesis: none;\n  font-weight: 400;\n  line-height: 1.5;\n  text-rendering: optimizeLegibility;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-text-size-adjust: 100%;\n}\n\n@media (prefers-color-scheme: light) {\n  :root {\n    background-color: #f8f8f8;\n    color: #181818;\n  }\n}\n"
  },
  {
    "path": "playgrounds/vite-vue/src/vite-env.d.ts",
    "content": "/// <reference types=\"vite/client\" />\n"
  },
  {
    "path": "playgrounds/vite-vue/src/wagmi.ts",
    "content": "import { createConfig, createStorage, http } from '@wagmi/vue'\nimport { mainnet, optimism, sepolia } from '@wagmi/vue/chains'\nimport { baseAccount, metaMask, walletConnect } from '@wagmi/vue/connectors'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia, optimism],\n  connectors: [\n    walletConnect({\n      projectId: import.meta.env.VITE_WC_PROJECT_ID,\n    }),\n    baseAccount({ appName: 'Vite Vue Playground' }),\n    metaMask(),\n  ],\n  storage: createStorage({ storage: localStorage, key: 'vite-vue' }),\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n    [optimism.id]: http(),\n  },\n})\n\ndeclare module '@wagmi/vue' {\n  interface Register {\n    config: typeof config\n  }\n}\n"
  },
  {
    "path": "playgrounds/vite-vue/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2020\",\n    \"useDefineForClassFields\": true,\n    \"module\": \"ESNext\",\n    \"lib\": [\"ES2020\", \"DOM\", \"DOM.Iterable\"],\n    \"skipLibCheck\": true,\n\n    \"moduleResolution\": \"bundler\",\n    \"allowImportingTsExtensions\": true,\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"noEmit\": true,\n    \"jsx\": \"preserve\",\n\n    \"strict\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"noFallthroughCasesInSwitch\": true\n  },\n  \"include\": [\"src/**/*.ts\", \"src/**/*.tsx\", \"src/**/*.vue\"],\n  \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"
  },
  {
    "path": "playgrounds/vite-vue/tsconfig.node.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"skipLibCheck\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"bundler\",\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": true\n  },\n  \"include\": [\"vite.config.ts\"]\n}\n"
  },
  {
    "path": "playgrounds/vite-vue/vite.config.ts",
    "content": "import vue from '@vitejs/plugin-vue'\nimport { defineConfig } from 'vite'\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [vue()],\n})\n"
  },
  {
    "path": "pnpm-workspace.yaml",
    "content": "packages:\n  - packages/*\n  - '!packages/register-tests'\n  - packages/cli/src/plugins/__fixtures__/hardhat\n  - packages/register-tests/*\n  - playgrounds/*\n  - site\n\nauditConfig:\n  ignoreGhsas:\n    - GHSA-g3ch-rx76-35fx\n    - GHSA-ffrw-9mx8-89p8\n    - GHSA-qpm2-6cq5-7pq5\n    - GHSA-93m4-6634-74q7\n    - GHSA-29xp-372q-xqph\n    - GHSA-mh29-5h37-fv8m\n    - GHSA-5j98-mcp5-4vw2\n    - GHSA-92fh-27vv-894w\n    - GHSA-677m-j7p3-52f9\n\nautoInstallPeers: false\n\ncatalog:\n  '@base-org/account': 2.4.0\n  '@coinbase/wallet-sdk': 4.3.6\n  '@metamask/connect-evm': 0.9.0\n  '@nuxt/schema': 4.2.1\n  '@safe-global/safe-apps-provider': 0.18.6\n  '@safe-global/safe-apps-sdk': 9.1.0\n  '@tanstack/query-core': 5.49.1\n  '@tanstack/react-query': 5.49.2\n  '@tanstack/solid-query': 5.49.1\n  '@tanstack/vue-query': 5.49.1\n  '@types/react': ^19.2.0\n  '@types/react-dom': ^19.2.0\n  '@vitejs/plugin-react': ^4.3.3\n  '@vitejs/plugin-vue': 6.0.1\n  '@walletconnect/ethereum-provider': 2.21.1\n  buffer: 6.0.3\n  nuxt: 4.2.1\n  ox: 0.11.1\n  porto: 0.2.37\n  react: 19.2.0\n  react-dom: 19.2.0\n  solid-js: 1.9.10\n  vite: 7.2.2\n  vite-plugin-solid: 2.11.10\n  vue: 3.5.25\n\nlinkWorkspacePackages: deep\n\nminimumReleaseAge: 1440\n\nminimumReleaseAgeExclude:\n  - '@metamask/connect-evm'\n  - '@metamask/connect-multichain'\n  - '@wagmi/cli'\n  - '@wagmi/connectors'\n  - '@wagmi/core'\n  - '@wagmi/test'\n  - '@wagmi/solid'\n  - '@wagmi/vue'\n  - abitype\n  - ox\n  - porto\n  - prool\n  - wagmi\n  - viem\n\noverrides:\n  '@isaacs/brace-expansion@<=5.0.0': 5.0.1\n  axios@<=1.13.4: 1.13.5\n  cookie@<0.7.0: 0.7.0\n  bn.js@>=5.0.0 <5.2.3: 5.2.3\n  devalue@<5.6.4: 5.6.4\n  diff@<8.0.3: 8.0.3\n  elliptic@<=6.6.0: '>=6.6.1'\n  esbuild@<=0.24.2: 0.25.0\n  glob@>=10.2.0 <10.5.0: 10.5.0\n  h3@<1.15.6: 1.15.6\n  happy-dom@<20.0.2: '>=20.0.2'\n  minimatch@<3.1.4: 3.1.4\n  minimatch@>=5.0.0 <5.1.8: 5.1.8\n  minimatch@>=9.0.0 <9.0.7: 9.0.7\n  minimatch@>=10.0.0 <10.2.3: 10.2.3\n  hono@<4.12.7: 4.12.7\n  lodash@>=4.0.0 <=4.17.22: '>=4.17.23'\n  markdown-it@>=13.0.0 <14.1.1: 14.1.1\n  mdast-util-to-hast@<13.2.1: '>=13.2.1'\n  nanoid@<3.3.8: 3.3.8\n  node-forge@<1.3.2: '>=1.3.2'\n  rollup@>=4.0.0 <4.59.0: 4.59.0\n  semver@<5.7.2: '>=5.7.2'\n  serialize-javascript@<=7.0.2: 7.0.3\n  simple-git@>=3.15.0 <3.32.3: 3.32.3\n  seroval@<1.4.1: '>=1.4.1'\n  svgo@=4.0.0: 4.0.1\n  tar@<=7.5.10: 7.5.11\n  tmp@<=0.2.3: 0.2.4\n  unhead@<=2.1.10: 2.1.11\n  undici@<6.24.0: 6.24.0\n  undici@>=7.0.0 <7.24.0: 7.24.0\n  vite@>=7.1.0 <=7.1.10: '>=7.1.11'\n  wrangler@>=4.0.0 <4.59.1: '>=4.59.1'\n  ws@>=8.0.0 <8.17.1: 8.17.1\n\npeerDependencyRules:\n  ignoreMissing:\n    - '@algolia/client-search'\n    - react\n    - react-native\n    - search-insights\n\ntrustPolicy: no-downgrade\n\ntrustPolicyExclude:\n  - '@coinbase/cdp-sdk@1.38.4'\n  - '@noble/curves@1.8.0'\n  - '@noble/hashes@1.7.0'\n  - chokidar@4.0.3\n  - semver@6.3.1\n  - undici@6.22.0\n  - serialize-javascript@7.0.3\n  - simple-git@3.32.3\n  - vite@5.4.21 || 6.4.1\n"
  },
  {
    "path": "scripts/formatPackageJson.ts",
    "content": "import fs from 'node:fs/promises'\nimport path from 'node:path'\n\n// Generates package.json files to be published to NPM with only the necessary fields.\n\nconsole.log('Formatting package.json files.')\n\n// Get all package.json files\nconst packagePaths = fs.glob('packages/**/package.json', {\n  exclude: ['**/dist/**', '**/node_modules/**'],\n})\n\nlet count = 0\nfor await (const packagePath of packagePaths) {\n  type Package = Record<string, unknown> & {\n    name?: string | undefined\n    private?: boolean | undefined\n  }\n  const packageJson = JSON.parse(\n    await fs.readFile(packagePath, 'utf-8'),\n  ) as Package\n\n  // Skip private packages\n  if (packageJson.private) continue\n  if (!packageJson.name) continue\n\n  count += 1\n  console.log(`${packageJson.name} — ${path.dirname(packagePath)}`)\n\n  await fs.writeFile(\n    `${packagePath}.tmp`,\n    `${JSON.stringify(packageJson, undefined, 2)}\\n`,\n    'utf-8',\n  )\n\n  const { devDependencies: _dD, scripts: _s, ...rest } = packageJson\n  await fs.writeFile(\n    packagePath,\n    `${JSON.stringify(rest, undefined, 2)}\\n`,\n    'utf-8',\n  )\n}\n\nconsole.log(`Done. Formatted ${count} ${count === 1 ? 'file' : 'files'}.`)\n"
  },
  {
    "path": "scripts/generateProxyPackages.ts",
    "content": "import fs from 'node:fs/promises'\nimport path from 'node:path'\n\n// Generates proxy packages for package.json#exports.\n\nconsole.log('Generating proxy packages.')\n\n// Get all package.json files\nconst packagePaths = fs.glob('packages/**/package.json', {\n  exclude: ['**/dist/**', '**/node_modules/**'],\n})\n\nlet count = 0\nfor await (const packagePath of packagePaths) {\n  type Package = Record<string, unknown> & {\n    name?: string | undefined\n    private?: boolean | undefined\n    exports?:\n      | Record<string, { types: string; default: string } | string>\n      | undefined\n  }\n  const packageJson = JSON.parse(\n    await fs.readFile(packagePath, 'utf-8'),\n  ) as Package\n\n  // Skip private packages\n  if (packageJson.private) continue\n  if (!packageJson.exports) continue\n\n  count += 1\n  console.log(`${packageJson.name} — ${path.dirname(packagePath)}`)\n\n  const dir = path.resolve(path.dirname(packagePath))\n\n  for (const [key, exports] of Object.entries(packageJson.exports)) {\n    // Skip `package.json` export\n    if (/package\\.json$/.test(key)) continue\n    if (key === '.') continue\n    if (typeof exports === 'string') continue\n    if (!exports.default) continue\n\n    const proxyDir = path.resolve(dir, key)\n    await fs.mkdir(proxyDir, { recursive: true })\n\n    const types = path.relative(key, exports.types)\n    const main = path.relative(key, exports.default)\n    await fs.writeFile(\n      `${proxyDir}/package.json`,\n      `${JSON.stringify({ type: 'module', types, main }, undefined, 2)}\\n`,\n      'utf-8',\n    )\n  }\n}\n\nconsole.log(\n  `Done. Generated proxy packages for ${count} ${\n    count === 1 ? 'package' : 'packages'\n  }.`,\n)\n"
  },
  {
    "path": "scripts/preconstruct.ts",
    "content": "import fs from 'node:fs/promises'\nimport path from 'node:path'\n\n// Symlinks package sources to dist for local development\n\nconsole.log('Setting up packages for development.')\n\n// Get all package.json files\nconst packagePaths = fs.glob('**/package.json', {\n  exclude: ['**/dist/**', '**/node_modules/**'],\n})\n\nlet count = 0\nfor await (const packagePath of packagePaths) {\n  type Package = {\n    bin?: Record<string, string> | undefined\n    exports?:\n      | Record<string, { types: string; default: string } | string>\n      | undefined\n    name?: string | undefined\n    private?: boolean | undefined\n  }\n  const packageJson = JSON.parse(\n    await fs.readFile(packagePath, 'utf-8'),\n  ) as Package\n\n  // Skip private packages\n  if (packageJson.private && packageJson.name !== '@wagmi/test') continue\n  if (!packageJson.exports) continue\n  if (packageJson.bin) continue\n\n  count += 1\n  console.log(`${packageJson.name} — ${path.dirname(packagePath)}`)\n\n  const dir = path.resolve(path.dirname(packagePath))\n\n  // Empty dist directory\n  const dist = path.resolve(dir, 'dist')\n  let files: string[] = []\n  try {\n    files = await fs.readdir(dist)\n  } catch {\n    await fs.mkdir(dist)\n  }\n\n  const promises = []\n  for (const file of files) {\n    promises.push(\n      fs.rm(path.join(dist, file), { recursive: true, force: true }),\n    )\n  }\n  await Promise.all(promises)\n\n  // Link exports to dist locations\n  for (const [key, exports] of Object.entries(packageJson.exports)) {\n    // Skip `package.json` exports\n    if (/package\\.json$/.test(key)) continue\n    if (typeof exports === 'string') continue\n\n    // Link exports to dist locations\n    for (const [type, value] of Object.entries(exports) as [\n      type: 'types' | 'default',\n      value: string,\n    ][]) {\n      const srcDir = path.resolve(\n        dir,\n        path\n          .dirname(value)\n          .replace(`dist/${type === 'default' ? 'esm' : type}`, 'src'),\n      )\n      let srcFileName: string\n      if (key === '.') srcFileName = 'index.ts'\n      else srcFileName = path.basename(`${key}.ts`)\n      const srcFilePath = path.resolve(srcDir, srcFileName)\n\n      const distDir = path.resolve(dir, path.dirname(value))\n      const distFileName = path.basename(value)\n      const distFilePath = path.resolve(distDir, distFileName)\n\n      await fs.mkdir(distDir, { recursive: true })\n\n      // Symlink src to dist file\n      await fs.symlink(srcFilePath, distFilePath, 'file')\n    }\n  }\n}\n\nconsole.log(`Done. Set up ${count} ${count === 1 ? 'package' : 'packages'}.`)\n"
  },
  {
    "path": "scripts/restorePackageJson.ts",
    "content": "import fs from 'node:fs/promises'\nimport path from 'node:path'\n\n// Restores package.json files from package.json.tmp files.\n\nconsole.log('Restoring package.json files.')\n\n// Get all package.json files\nconst packagePaths = fs.glob('packages/**/package.json.tmp', {\n  exclude: ['**/dist/**', '**/node_modules/**'],\n})\n\nlet count = 0\nfor await (const packagePath of packagePaths) {\n  type Package = { name?: string | undefined } & Record<string, unknown>\n  const packageJson = JSON.parse(\n    await fs.readFile(packagePath, 'utf-8'),\n  ) as Package\n\n  count += 1\n  console.log(`${packageJson.name} — ${path.dirname(packagePath)}`)\n\n  await fs.writeFile(\n    packagePath.replace('.tmp', ''),\n    `${JSON.stringify(packageJson, undefined, 2)}\\n`,\n    'utf-8',\n  )\n  await fs.rm(packagePath)\n}\n\nconsole.log(`Done. Restored ${count} ${count === 1 ? 'file' : 'files'}.`)\n"
  },
  {
    "path": "scripts/updateBlockExplorerPluginChains.ts",
    "content": "import fs from 'node:fs/promises'\n\n// Fetches supported chains for Etherscan and Sourcify\n\nconsole.log('Updating block explorer plugins chains.')\n\nlet count = 0\n{\n  console.log('etherscan - https://api.etherscan.io/v2/chainlist')\n  const res = (await fetch('https://api.etherscan.io/v2/chainlist').then(\n    (res) => res.json(),\n  )) as {\n    totalcount: number\n    result: {\n      chainname: string\n      chainid: number\n      blockexplorer: string\n      apiurl: string\n      status: 0 | 1\n    }[]\n  }\n\n  let content = 'type ChainId =\\n'\n  for (const chain of res.result)\n    content += `  | ${chain.chainid} // ${chain.chainname}\\n`\n\n  await writeContent('./packages/cli/src/plugins/etherscan.ts', content)\n  count += 1\n}\n\n{\n  console.log('sourcify - https://sourcify.dev/server/chains')\n  const res = (await fetch('https://sourcify.dev/server/chains').then((res) =>\n    res.json(),\n  )) as {\n    name: string\n    chainId: number\n  }[]\n\n  let content = 'type ChainId =\\n'\n  for (const chain of res) content += `  | ${chain.chainId} // ${chain.name}\\n`\n\n  await writeContent('./packages/cli/src/plugins/sourcify.ts', content)\n  count += 1\n}\n\nconsole.log(`Done. Updated chains for ${count} plugins.`)\n\nasync function writeContent(pluginPath: string, content: string) {\n  const text = await fs\n    .readFile(pluginPath, 'utf8')\n    .then((text) => text.replace(/type ChainId =[\\s\\S]*$/, content))\n  await fs.writeFile(pluginPath, text, 'utf8')\n}\n"
  },
  {
    "path": "scripts/updateVersion.ts",
    "content": "import child_process from 'node:child_process'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\n\n// Updates package version.ts files (so you can use the version in code without importing package.json).\n\nconsole.log('Updating version files.')\n\n// Get all package.json files\nconst packagePaths = fs.glob('packages/**/package.json', {\n  exclude: ['**/dist/**', '**/node_modules/**'],\n})\n\nlet count = 0\nfor await (const packagePath of packagePaths) {\n  type Package = {\n    name?: string | undefined\n    private?: boolean | undefined\n    version?: string | undefined\n  }\n  const packageJson = JSON.parse(\n    await fs.readFile(packagePath, 'utf-8'),\n  ) as Package\n\n  // Skip private packages\n  if (packageJson.private) continue\n\n  const version = (() => {\n    if (process.env.PKG_PR_NEW) {\n      const gitHash = child_process\n        .execSync('git rev-parse --short HEAD')\n        .toString()\n        .trim()\n      const branch = (\n        process.env.GITHUB_HEAD_REF ||\n        child_process.execSync('git branch --show-current').toString().trim()\n      ).replace(/[^a-zA-Z0-9]/g, '-')\n      return `0.0.0-${branch}.${gitHash}`\n    }\n    return packageJson.version\n  })()\n\n  count += 1\n  console.log(`${packageJson.name} — ${version}`)\n\n  const versionFilePath = path.resolve(\n    path.dirname(packagePath),\n    'src',\n    'version.ts',\n  )\n  await fs.writeFile(\n    versionFilePath,\n    `export const version = '${version}'\\n`,\n    'utf-8',\n  )\n\n  if (process.env.PKG_PR_NEW) {\n    packageJson.version = version\n    await fs.writeFile(\n      packagePath,\n      `${JSON.stringify(packageJson, null, 2)}\\n`,\n      'utf-8',\n    )\n  }\n}\n\nconsole.log(\n  `Done. Updated version file for ${count} ${\n    count === 1 ? 'package' : 'packages'\n  }.`,\n)\n"
  },
  {
    "path": "scripts/updateViemVersion.ts",
    "content": "import fs from 'node:fs/promises'\n\n// Updates viem version in Vitest snapshots, etc.\n\nconsole.log('Updating Viem version.')\n\nconst packageJson = JSON.parse(await fs.readFile('package.json', 'utf-8'))\nconst viemVersion = packageJson.devDependencies.viem\n\n// Update Vitest snapshots\n// Get all *.test.ts files\nconst testPaths = fs.glob('packages/**/*.test.ts')\n\nlet count = 0\nfor await (const testPath of testPaths) {\n  const testFile = await fs.readFile(testPath, 'utf-8')\n\n  // Skip files that don't contain viem version\n  if (!testFile.includes('Version: viem@')) continue\n  // Skip files that contain current version\n  if (testFile.includes(`Version: viem@${viemVersion}`)) continue\n\n  const updatedTestFile = testFile.replace(\n    /Version: viem@[A-Za-z0-9\\-.]+/g,\n    `Version: viem@${viemVersion}`,\n  )\n  await fs.writeFile(testPath, updatedTestFile, 'utf-8')\n\n  count += 1\n}\n\n// // Update package.json#pnpm.overrides.viem\n// if (packageJson.pnpm?.overrides?.viem !== viemVersion) {\n//   const path = 'package.json'\n//   console.log(path)\n//   packageJson.pnpm.overrides.viem = viemVersion\n//   await fs.writeFile(path, `${JSON.stringify(packageJson, undefined, 2)}\\n`, 'utf-8')\n//   count += 1\n// }\n\nconsole.log(`Done. Updated ${count} ${count === 1 ? 'file' : 'files'}.`)\n"
  },
  {
    "path": "site/.gitignore",
    "content": ".vercel\n.env*.local\n"
  },
  {
    "path": "site/.vitepress/config.ts",
    "content": "import { createTwoslashWithInlineCache } from '@shikijs/vitepress-twoslash/cache-inline'\nimport unocss from 'unocss/vite'\nimport { defineConfig } from 'vitepress'\nimport {\n  groupIconMdPlugin,\n  groupIconVitePlugin,\n} from 'vitepress-plugin-group-icons'\nimport llmstxt, { copyOrDownloadAsMarkdownButtons } from 'vitepress-plugin-llms'\n\nimport { getSidebar } from './sidebar'\n\nconst withTwoslashInlineCache = createTwoslashWithInlineCache()\n\n// https://vitepress.dev/reference/site-config\nexport default withTwoslashInlineCache(\n  defineConfig({\n    cleanUrls: true,\n    description: 'Reactivity for Ethereum apps',\n    head: [\n      [\n        'meta',\n        {\n          name: 'keywords',\n          content:\n            'react, ethereum, typescript, react, react hooks, open source',\n        },\n      ],\n      ['link', { rel: 'icon', href: '/favicon.svg' }],\n      ['meta', { name: 'theme-color', content: '#646cff' }],\n      // Open Graph\n      ['meta', { property: 'og:type', content: 'website' }],\n      ['meta', { property: 'og:image', content: 'https://wagmi.sh/og.png' }],\n      ['meta', { property: 'og:url', content: 'https://wagmi.sh' }],\n      // Twitter\n      ['meta', { name: 'twitter:card', content: 'summary_large_image' }],\n      ['meta', { name: 'twitter:creator', content: '@wevm_dev' }],\n      ['meta', { name: 'twitter:image', content: 'https://wagmi.sh/og.png' }],\n      ['meta', { name: 'twitter:site', content: 'wagmi.sh' }],\n      // Fathom\n      [\n        'script',\n        {\n          src: 'https://cdn.usefathom.com/script.js',\n          'data-site': 'QWAXSUPT',\n          defer: '',\n        },\n      ],\n    ],\n    ignoreDeadLinks: false,\n    lang: 'en-US',\n    lastUpdated: true,\n    markdown: {\n      config(md) {\n        md.use(copyOrDownloadAsMarkdownButtons).use(groupIconMdPlugin)\n      },\n      languages: ['js', 'jsx', 'ts', 'tsx'],\n      theme: {\n        light: 'vitesse-light',\n        dark: 'vitesse-dark',\n      },\n    },\n    themeConfig: {\n      editLink: {\n        pattern: 'https://github.com/wevm/wagmi/edit/main/site/:path',\n        text: 'Suggest changes to this page',\n      },\n      footer: {\n        message:\n          'Released under the <a href=\"https://github.com/wevm/wagmi/blob/main/LICENSE\">MIT License</a>.',\n        copyright: 'Copyright © 2022-present Weth, LLC',\n      },\n      logo: {\n        light: '/logo-light.svg',\n        dark: '/logo-dark.svg',\n        alt: 'wagmi logo',\n      },\n      nav: [\n        { text: 'React', link: '/react/getting-started' },\n        { text: 'Core', link: '/core/getting-started' },\n        { text: 'Tempo', link: '/tempo/getting-started' },\n        { text: 'CLI', link: '/cli/getting-started' },\n        {\n          text: 'Frameworks',\n          items: [\n            { text: 'React', link: '/react/getting-started' },\n            { text: 'Solid', link: '/solid/getting-started' },\n            { text: 'Vue', link: '/vue/getting-started' },\n          ],\n        },\n        // { text: 'Examples', link: '/examples/connect-wallet' },\n        {\n          text: 'More',\n          items: [\n            {\n              text: 'Discussions ',\n              link: 'https://github.com/wevm/wagmi/discussions',\n            },\n            {\n              text: 'Release Notes ',\n              link: 'https://github.com/wevm/wagmi/releases',\n            },\n            {\n              text: 'Contributing ',\n              link: '/dev/contributing',\n            },\n          ],\n        },\n      ],\n      outline: [2, 3],\n      search: {\n        provider: 'local',\n        options: {\n          _render(src, env, md) {\n            const html = md.render(src, env)\n            if (env.frontmatter?.search === false) return ''\n            if (env.relativePath.startsWith('shared')) return ''\n            return html\n          },\n        },\n      },\n      sidebar: getSidebar(),\n      siteTitle: false,\n      socialLinks: [\n        { icon: 'github', link: 'https://github.com/wevm/wagmi' },\n        { icon: 'x', link: 'https://twitter.com/wevm_dev' },\n        { icon: 'bluesky', link: 'https://bsky.app/profile/wevm.dev' },\n        { icon: 'discord', link: 'https://discord.gg/9zHPXuBpqy' },\n      ],\n    },\n    title: 'Wagmi',\n    vite: {\n      plugins: [\n        llmstxt({ ignoreFiles: ['shared/'] }),\n        groupIconVitePlugin(),\n        unocss(),\n      ],\n    },\n  }),\n)\n"
  },
  {
    "path": "site/.vitepress/sidebar.ts",
    "content": "import type { DefaultTheme } from 'vitepress'\n\nexport function getSidebar() {\n  return {\n    '/react': [\n      {\n        text: 'Introduction',\n        items: [\n          { text: 'Why Wagmi', link: '/react/why' },\n          { text: 'Installation', link: '/react/installation' },\n          { text: 'Getting Started', link: '/react/getting-started' },\n          { text: 'TypeScript', link: '/react/typescript' },\n          { text: 'Comparisons', link: '/react/comparisons' },\n        ],\n      },\n      {\n        text: 'Guides',\n        items: [\n          {\n            text: 'TanStack Query',\n            link: '/react/guides/tanstack-query',\n          },\n          {\n            text: 'Viem',\n            link: '/react/guides/viem',\n          },\n          {\n            text: 'Error Handling',\n            link: '/react/guides/error-handling',\n          },\n          {\n            text: 'Ethers.js Adapters',\n            link: '/react/guides/ethers',\n          },\n          // {\n          //   text: 'Testing',\n          //   link: '/react/guides/testing',\n          // },\n          {\n            text: 'Chain Properties',\n            link: '/react/guides/chain-properties',\n          },\n          {\n            text: 'SSR',\n            link: '/react/guides/ssr',\n          },\n          {\n            text: 'Connect Wallet',\n            link: '/react/guides/connect-wallet',\n          },\n          {\n            text: 'Send Transaction',\n            link: '/react/guides/send-transaction',\n          },\n          {\n            text: 'Read from Contract',\n            link: '/react/guides/read-from-contract',\n          },\n          {\n            text: 'Write to Contract',\n            link: '/react/guides/write-to-contract',\n          },\n          {\n            text: 'FAQ / Troubleshooting',\n            link: '/react/guides/faq',\n          },\n          {\n            text: 'Migrate from v2 to v3',\n            link: '/react/guides/migrate-from-v2-to-v3',\n          },\n          {\n            text: 'Migrate from v1 to v2',\n            link: '/react/guides/migrate-from-v1-to-v2',\n          },\n        ],\n      },\n      {\n        text: 'Configuration',\n        items: [\n          { text: 'createConfig', link: '/react/api/createConfig' },\n          { text: 'createStorage', link: '/react/api/createStorage' },\n          { text: 'Chains', link: '/react/api/chains' },\n          {\n            text: 'Connectors',\n            collapsed: true,\n            link: '/react/api/connectors',\n            items: [\n              {\n                text: 'baseAccount',\n                link: '/react/api/connectors/baseAccount',\n              },\n              { text: 'injected', link: '/react/api/connectors/injected' },\n              {\n                text: 'metaMask',\n                link: '/react/api/connectors/metaMask',\n              },\n              {\n                text: 'mock',\n                link: '/react/api/connectors/mock',\n              },\n              {\n                text: 'porto',\n                link: '/react/api/connectors/porto',\n              },\n              {\n                text: 'safe',\n                link: '/react/api/connectors/safe',\n              },\n              {\n                text: 'walletConnect',\n                link: '/react/api/connectors/walletConnect',\n              },\n            ],\n          },\n          {\n            text: 'Transports',\n            collapsed: true,\n            link: '/react/api/transports',\n            items: [\n              {\n                text: 'custom (EIP-1193)',\n                link: '/react/api/transports/custom',\n              },\n              {\n                text: 'fallback',\n                link: '/react/api/transports/fallback',\n              },\n              {\n                text: 'http',\n                link: '/react/api/transports/http',\n              },\n              {\n                text: 'unstable_connector',\n                link: '/react/api/transports/unstable_connector',\n              },\n              {\n                text: 'webSocket',\n                link: '/react/api/transports/webSocket',\n              },\n            ],\n          },\n          { text: 'WagmiProvider', link: '/react/api/WagmiProvider' },\n        ],\n      },\n      {\n        text: 'Hooks',\n        link: '/react/api/hooks',\n        items: [\n          { text: 'useBalance', link: '/react/api/hooks/useBalance' },\n          {\n            text: 'useBlobBaseFee',\n            link: '/react/api/hooks/useBlobBaseFee',\n          },\n          {\n            text: 'useBlockNumber',\n            link: '/react/api/hooks/useBlockNumber',\n          },\n          {\n            text: 'useBlock',\n            link: '/react/api/hooks/useBlock',\n          },\n          {\n            text: 'useBlockTransactionCount',\n            link: '/react/api/hooks/useBlockTransactionCount',\n          },\n          {\n            text: 'useBytecode',\n            link: '/react/api/hooks/useBytecode',\n          },\n          { text: 'useCall', link: '/react/api/hooks/useCall' },\n          {\n            text: 'useCallsStatus',\n            link: '/react/api/hooks/useCallsStatus',\n          },\n          {\n            text: 'useCapabilities',\n            link: '/react/api/hooks/useCapabilities',\n          },\n          { text: 'useChainId', link: '/react/api/hooks/useChainId' },\n          { text: 'useChains', link: '/react/api/hooks/useChains' },\n          { text: 'useClient', link: '/react/api/hooks/useClient' },\n          { text: 'useConfig', link: '/react/api/hooks/useConfig' },\n          { text: 'useConnect', link: '/react/api/hooks/useConnect' },\n          { text: 'useConnection', link: '/react/api/hooks/useConnection' },\n          {\n            text: 'useConnectionEffect',\n            link: '/react/api/hooks/useConnectionEffect',\n          },\n          {\n            text: 'useConnections',\n            link: '/react/api/hooks/useConnections',\n          },\n          {\n            text: 'useConnectorClient',\n            link: '/react/api/hooks/useConnectorClient',\n          },\n          {\n            text: 'useConnectors',\n            link: '/react/api/hooks/useConnectors',\n          },\n          {\n            text: 'useContractEvents',\n            link: '/react/api/hooks/useContractEvents',\n          },\n          {\n            text: 'useDeployContract',\n            link: '/react/api/hooks/useDeployContract',\n          },\n          { text: 'useDisconnect', link: '/react/api/hooks/useDisconnect' },\n          { text: 'useEnsAddress', link: '/react/api/hooks/useEnsAddress' },\n          { text: 'useEnsAvatar', link: '/react/api/hooks/useEnsAvatar' },\n          { text: 'useEnsName', link: '/react/api/hooks/useEnsName' },\n          {\n            text: 'useEnsResolver',\n            link: '/react/api/hooks/useEnsResolver',\n          },\n          {\n            text: 'useEnsText',\n            link: '/react/api/hooks/useEnsText',\n          },\n          {\n            text: 'useFeeHistory',\n            link: '/react/api/hooks/useFeeHistory',\n          },\n          {\n            text: 'useProof',\n            link: '/react/api/hooks/useProof',\n          },\n          {\n            text: 'usePublicClient',\n            link: '/react/api/hooks/usePublicClient',\n          },\n          {\n            text: 'useEstimateFeesPerGas',\n            link: '/react/api/hooks/useEstimateFeesPerGas',\n          },\n          {\n            text: 'useEstimateGas',\n            link: '/react/api/hooks/useEstimateGas',\n          },\n          {\n            text: 'useEstimateMaxPriorityFeePerGas',\n            link: '/react/api/hooks/useEstimateMaxPriorityFeePerGas',\n          },\n          {\n            text: 'useGasPrice',\n            link: '/react/api/hooks/useGasPrice',\n          },\n          {\n            text: 'useInfiniteReadContracts',\n            link: '/react/api/hooks/useInfiniteReadContracts',\n          },\n          {\n            text: 'usePrepareTransactionRequest',\n            link: '/react/api/hooks/usePrepareTransactionRequest',\n          },\n          {\n            text: 'useReadContract',\n            link: '/react/api/hooks/useReadContract',\n          },\n          {\n            text: 'useReadContracts',\n            link: '/react/api/hooks/useReadContracts',\n          },\n          { text: 'useReconnect', link: '/react/api/hooks/useReconnect' },\n          {\n            text: 'useSendCalls',\n            link: '/react/api/hooks/useSendCalls',\n          },\n          {\n            text: 'useSendTransaction',\n            link: '/react/api/hooks/useSendTransaction',\n          },\n          {\n            text: 'useShowCallsStatus',\n            link: '/react/api/hooks/useShowCallsStatus',\n          },\n          {\n            text: 'useSignMessage',\n            link: '/react/api/hooks/useSignMessage',\n          },\n          {\n            text: 'useSignTransaction',\n            link: '/react/api/hooks/useSignTransaction',\n          },\n          {\n            text: 'useSignTypedData',\n            link: '/react/api/hooks/useSignTypedData',\n          },\n          {\n            text: 'useSimulateContract',\n            link: '/react/api/hooks/useSimulateContract',\n          },\n          {\n            text: 'useStorageAt',\n            link: '/react/api/hooks/useStorageAt',\n          },\n          {\n            text: 'useSwitchChain',\n            link: '/react/api/hooks/useSwitchChain',\n          },\n          {\n            text: 'useSwitchConnection',\n            link: '/react/api/hooks/useSwitchConnection',\n          },\n          {\n            text: 'useTransaction',\n            link: '/react/api/hooks/useTransaction',\n          },\n          {\n            text: 'useTransactionConfirmations',\n            link: '/react/api/hooks/useTransactionConfirmations',\n          },\n          {\n            text: 'useTransactionCount',\n            link: '/react/api/hooks/useTransactionCount',\n          },\n          {\n            text: 'useTransactionReceipt',\n            link: '/react/api/hooks/useTransactionReceipt',\n          },\n          {\n            text: 'useWaitForCallsStatus',\n            link: '/react/api/hooks/useWaitForCallsStatus',\n          },\n          {\n            text: 'useWaitForTransactionReceipt',\n            link: '/react/api/hooks/useWaitForTransactionReceipt',\n          },\n          {\n            text: 'useVerifyMessage',\n            link: '/react/api/hooks/useVerifyMessage',\n          },\n          {\n            text: 'useVerifyTypedData',\n            link: '/react/api/hooks/useVerifyTypedData',\n          },\n          {\n            text: 'useWalletClient',\n            link: '/react/api/hooks/useWalletClient',\n          },\n          {\n            text: 'useWatchAsset',\n            link: '/react/api/hooks/useWatchAsset',\n          },\n          {\n            text: 'useWatchBlocks',\n            link: '/react/api/hooks/useWatchBlocks',\n          },\n          {\n            text: 'useWatchBlockNumber',\n            link: '/react/api/hooks/useWatchBlockNumber',\n          },\n          {\n            text: 'useWatchContractEvent',\n            link: '/react/api/hooks/useWatchContractEvent',\n          },\n          {\n            text: 'useWatchPendingTransactions',\n            link: '/react/api/hooks/useWatchPendingTransactions',\n          },\n          {\n            text: 'useWriteContract',\n            link: '/react/api/hooks/useWriteContract',\n          },\n        ],\n      },\n      {\n        text: 'Miscellaneous',\n        items: [\n          { text: 'Actions', link: '/react/api/actions' },\n          { text: 'Errors', link: '/react/api/errors' },\n          {\n            text: 'Utilities',\n            collapsed: true,\n            items: [\n              {\n                text: 'cookieToInitialState',\n                link: '/react/api/utilities/cookieToInitialState',\n              },\n              { text: 'deserialize', link: '/react/api/utilities/deserialize' },\n              { text: 'serialize', link: '/react/api/utilities/serialize' },\n            ],\n          },\n        ],\n      },\n    ],\n    '/vue': [\n      {\n        text: 'Introduction',\n        items: [\n          { text: 'Why Wagmi', link: '/vue/why' },\n          { text: 'Installation', link: '/vue/installation' },\n          { text: 'Getting Started', link: '/vue/getting-started' },\n          { text: 'TypeScript', link: '/vue/typescript' },\n        ],\n      },\n      {\n        text: 'Guides',\n        items: [\n          {\n            text: 'TanStack Query',\n            link: '/vue/guides/tanstack-query',\n          },\n          {\n            text: 'Viem',\n            link: '/vue/guides/viem',\n          },\n          {\n            text: 'Error Handling',\n            link: '/vue/guides/error-handling',\n          },\n          {\n            text: 'Chain Properties',\n            link: '/vue/guides/chain-properties',\n          },\n          {\n            text: 'SSR',\n            link: '/vue/guides/ssr',\n          },\n          {\n            text: 'Connect Wallet',\n            link: '/vue/guides/connect-wallet',\n          },\n          {\n            text: 'Send Transaction',\n            link: '/vue/guides/send-transaction',\n          },\n          {\n            text: 'Read from Contract',\n            link: '/vue/guides/read-from-contract',\n          },\n          {\n            text: 'Write to Contract',\n            link: '/vue/guides/write-to-contract',\n          },\n          {\n            text: 'FAQ / Troubleshooting',\n            link: '/vue/guides/faq',\n          },\n        ],\n      },\n      {\n        text: 'Configuration',\n        items: [\n          { text: 'createConfig', link: '/vue/api/createConfig' },\n          { text: 'createStorage', link: '/vue/api/createStorage' },\n          { text: 'Chains', link: '/vue/api/chains' },\n          {\n            text: 'Connectors',\n            collapsed: true,\n            link: '/vue/api/connectors',\n            items: [\n              {\n                text: 'baseAccount',\n                link: '/vue/api/connectors/baseAccount',\n              },\n              { text: 'injected', link: '/vue/api/connectors/injected' },\n              {\n                text: 'metaMask',\n                link: '/vue/api/connectors/metaMask',\n              },\n              {\n                text: 'mock',\n                link: '/vue/api/connectors/mock',\n              },\n              {\n                text: 'porto',\n                link: '/vue/api/connectors/porto',\n              },\n              {\n                text: 'safe',\n                link: '/vue/api/connectors/safe',\n              },\n              {\n                text: 'walletConnect',\n                link: '/vue/api/connectors/walletConnect',\n              },\n            ],\n          },\n          {\n            text: 'Transports',\n            collapsed: true,\n            link: '/vue/api/transports',\n            items: [\n              {\n                text: 'custom (EIP-1193)',\n                link: '/vue/api/transports/custom',\n              },\n              {\n                text: 'fallback',\n                link: '/vue/api/transports/fallback',\n              },\n              {\n                text: 'http',\n                link: '/vue/api/transports/http',\n              },\n              {\n                text: 'unstable_connector',\n                link: '/vue/api/transports/unstable_connector',\n              },\n              {\n                text: 'webSocket',\n                link: '/vue/api/transports/webSocket',\n              },\n            ],\n          },\n          { text: 'WagmiPlugin', link: '/vue/api/WagmiPlugin' },\n          { text: 'Nuxt', link: '/vue/api/Nuxt' },\n        ],\n      },\n      {\n        text: 'Composables',\n        link: '/vue/api/composables',\n        items: [\n          {\n            text: 'useBalance',\n            link: '/vue/api/composables/useBalance',\n          },\n          {\n            text: 'useBlockNumber',\n            link: '/vue/api/composables/useBlockNumber',\n          },\n          {\n            text: 'useBytecode',\n            link: '/vue/api/composables/useBytecode',\n          },\n          { text: 'useChainId', link: '/vue/api/composables/useChainId' },\n          { text: 'useChains', link: '/vue/api/composables/useChains' },\n          { text: 'useClient', link: '/vue/api/composables/useClient' },\n          { text: 'useConfig', link: '/vue/api/composables/useConfig' },\n          { text: 'useConnect', link: '/vue/api/composables/useConnect' },\n          { text: 'useConnection', link: '/vue/api/composables/useConnection' },\n          {\n            text: 'useConnectionEffect',\n            link: '/vue/api/composables/useConnectionEffect',\n          },\n          {\n            text: 'useConnections',\n            link: '/vue/api/composables/useConnections',\n          },\n          {\n            text: 'useConnectorClient',\n            link: '/vue/api/composables/useConnectorClient',\n          },\n          {\n            text: 'useConnectors',\n            link: '/vue/api/composables/useConnectors',\n          },\n          {\n            text: 'useDisconnect',\n            link: '/vue/api/composables/useDisconnect',\n          },\n          {\n            text: 'useEnsAddress',\n            link: '/vue/api/composables/useEnsAddress',\n          },\n          {\n            text: 'useEnsAvatar',\n            link: '/vue/api/composables/useEnsAvatar',\n          },\n          {\n            text: 'useEstimateGas',\n            link: '/vue/api/composables/useEstimateGas',\n          },\n          {\n            text: 'useReadContract',\n            link: '/vue/api/composables/useReadContract',\n          },\n          {\n            text: 'useReconnect',\n            link: '/vue/api/composables/useReconnect',\n          },\n          {\n            text: 'useSendTransaction',\n            link: '/vue/api/composables/useSendTransaction',\n          },\n          {\n            text: 'useSignMessage',\n            link: '/vue/api/composables/useSignMessage',\n          },\n          {\n            text: 'useSignTransaction',\n            link: '/vue/api/composables/useSignTransaction',\n          },\n          {\n            text: 'useSignTypedData',\n            link: '/vue/api/composables/useSignTypedData',\n          },\n          {\n            text: 'useSimulateContract',\n            link: '/vue/api/composables/useSimulateContract',\n          },\n          {\n            text: 'useSwitchChain',\n            link: '/vue/api/composables/useSwitchChain',\n          },\n          {\n            text: 'useSwitchConnection',\n            link: '/vue/api/composables/useSwitchConnection',\n          },\n          {\n            text: 'useTransaction',\n            link: '/vue/api/composables/useTransaction',\n          },\n          {\n            text: 'useTransactionReceipt',\n            link: '/vue/api/composables/useTransactionReceipt',\n          },\n          {\n            text: 'useWaitForTransactionReceipt',\n            link: '/vue/api/composables/useWaitForTransactionReceipt',\n          },\n          {\n            text: 'useWatchBlockNumber',\n            link: '/vue/api/composables/useWatchBlockNumber',\n          },\n          {\n            text: 'useWatchContractEvent',\n            link: '/vue/api/composables/useWatchContractEvent',\n          },\n          {\n            text: 'useWriteContract',\n            link: '/vue/api/composables/useWriteContract',\n          },\n        ],\n      },\n      {\n        text: 'Miscellaneous',\n        items: [\n          { text: 'Actions', link: '/vue/api/actions' },\n          { text: 'Errors', link: '/vue/api/errors' },\n          {\n            text: 'Utilities',\n            collapsed: true,\n            items: [\n              {\n                text: 'deserialize',\n                link: '/vue/api/utilities/deserialize',\n              },\n              { text: 'serialize', link: '/vue/api/utilities/serialize' },\n            ],\n          },\n        ],\n      },\n    ],\n    '/core': [\n      {\n        text: 'Introduction',\n        items: [\n          { text: 'Why Wagmi', link: '/core/why' },\n          { text: 'Installation', link: '/core/installation' },\n          { text: 'Getting Started', link: '/core/getting-started' },\n          { text: 'TypeScript', link: '/core/typescript' },\n        ],\n      },\n      {\n        text: 'Guides',\n        items: [\n          {\n            text: 'Viem',\n            link: '/core/guides/viem',\n          },\n          {\n            text: 'Framework Adapters',\n            link: '/core/guides/framework-adapters',\n          },\n          {\n            text: 'Error Handling',\n            link: '/core/guides/error-handling',\n          },\n          {\n            text: 'Ethers.js Adapters',\n            link: '/core/guides/ethers',\n          },\n          // {\n          //   text: 'Testing',\n          //   link: '/core/guides/testing',\n          // },\n          {\n            text: 'Chain Properties',\n            link: '/core/guides/chain-properties',\n          },\n          {\n            text: 'FAQ / Troubleshooting',\n            link: '/core/guides/faq',\n          },\n          {\n            text: 'Migrate from v2 to v3',\n            link: '/core/guides/migrate-from-v2-to-v3',\n          },\n          {\n            text: 'Migrate from v1 to v2',\n            link: '/core/guides/migrate-from-v1-to-v2',\n          },\n        ],\n      },\n      {\n        text: 'Configuration',\n        items: [\n          { text: 'createConfig', link: '/core/api/createConfig' },\n          { text: 'createConnector', link: '/core/api/createConnector' },\n          { text: 'createStorage', link: '/core/api/createStorage' },\n          { text: 'Chains', link: '/core/api/chains' },\n          {\n            text: 'Connectors',\n            collapsed: true,\n            link: '/core/api/connectors',\n            items: [\n              {\n                text: 'baseAccount',\n                link: '/core/api/connectors/baseAccount',\n              },\n              { text: 'injected', link: '/core/api/connectors/injected' },\n              {\n                text: 'metaMask',\n                link: '/core/api/connectors/metaMask',\n              },\n              {\n                text: 'mock',\n                link: '/core/api/connectors/mock',\n              },\n              {\n                text: 'porto',\n                link: '/core/api/connectors/porto',\n              },\n              {\n                text: 'safe',\n                link: '/core/api/connectors/safe',\n              },\n              {\n                text: 'walletConnect',\n                link: '/core/api/connectors/walletConnect',\n              },\n            ],\n          },\n          {\n            text: 'Transports',\n            collapsed: true,\n            link: '/core/api/transports',\n            items: [\n              {\n                text: 'custom (EIP-1193)',\n                link: '/core/api/transports/custom',\n              },\n              {\n                text: 'fallback',\n                link: '/core/api/transports/fallback',\n              },\n              {\n                text: 'http',\n                link: '/core/api/transports/http',\n              },\n              {\n                text: 'unstable_connector',\n                link: '/core/api/transports/unstable_connector',\n              },\n              {\n                text: 'webSocket',\n                link: '/core/api/transports/webSocket',\n              },\n            ],\n          },\n        ],\n      },\n      {\n        text: 'Actions',\n        link: '/core/api/actions',\n        items: [\n          {\n            text: 'call',\n            link: '/core/api/actions/call',\n          },\n          { text: 'connect', link: '/core/api/actions/connect' },\n          { text: 'deployContract', link: '/core/api/actions/deployContract' },\n          { text: 'disconnect', link: '/core/api/actions/disconnect' },\n          {\n            text: 'estimateFeesPerGas',\n            link: '/core/api/actions/estimateFeesPerGas',\n          },\n          { text: 'estimateGas', link: '/core/api/actions/estimateGas' },\n          {\n            text: 'estimateMaxPriorityFeePerGas',\n            link: '/core/api/actions/estimateMaxPriorityFeePerGas',\n          },\n          { text: 'getBalance', link: '/core/api/actions/getBalance' },\n          {\n            text: 'getBlobBaseFee',\n            link: '/core/api/actions/getBlobBaseFee',\n          },\n          {\n            text: 'getBlock',\n            link: '/core/api/actions/getBlock',\n          },\n          {\n            text: 'getBlockNumber',\n            link: '/core/api/actions/getBlockNumber',\n          },\n          {\n            text: 'getBlockTransactionCount',\n            link: '/core/api/actions/getBlockTransactionCount',\n          },\n          {\n            text: 'getBytecode',\n            link: '/core/api/actions/getBytecode',\n          },\n          {\n            text: 'getCallsStatus',\n            link: '/core/api/actions/getCallsStatus',\n          },\n          {\n            text: 'getCapabilities',\n            link: '/core/api/actions/getCapabilities',\n          },\n          { text: 'getChainId', link: '/core/api/actions/getChainId' },\n          { text: 'getChains', link: '/core/api/actions/getChains' },\n          {\n            text: 'getClient',\n            link: '/core/api/actions/getClient',\n          },\n          { text: 'getConnection', link: '/core/api/actions/getConnection' },\n          {\n            text: 'getConnections',\n            link: '/core/api/actions/getConnections',\n          },\n          {\n            text: 'getConnectorClient',\n            link: '/core/api/actions/getConnectorClient',\n          },\n          {\n            text: 'getConnectors',\n            link: '/core/api/actions/getConnectors',\n          },\n          {\n            text: 'getContractEvents',\n            link: '/core/api/actions/getContractEvents',\n          },\n          {\n            text: 'getEnsAddress',\n            link: '/core/api/actions/getEnsAddress',\n          },\n          { text: 'getEnsAvatar', link: '/core/api/actions/getEnsAvatar' },\n          { text: 'getEnsName', link: '/core/api/actions/getEnsName' },\n          {\n            text: 'getEnsResolver',\n            link: '/core/api/actions/getEnsResolver',\n          },\n          {\n            text: 'getEnsText',\n            link: '/core/api/actions/getEnsText',\n          },\n          {\n            text: 'getFeeHistory',\n            link: '/core/api/actions/getFeeHistory',\n          },\n          {\n            text: 'getGasPrice',\n            link: '/core/api/actions/getGasPrice',\n          },\n          {\n            text: 'getProof',\n            link: '/core/api/actions/getProof',\n          },\n          {\n            text: 'getPublicClient',\n            link: '/core/api/actions/getPublicClient',\n          },\n          {\n            text: 'getStorageAt',\n            link: '/core/api/actions/getStorageAt',\n          },\n          {\n            text: 'getTransaction',\n            link: '/core/api/actions/getTransaction',\n          },\n          {\n            text: 'getTransactionConfirmations',\n            link: '/core/api/actions/getTransactionConfirmations',\n          },\n          {\n            text: 'getTransactionCount',\n            link: '/core/api/actions/getTransactionCount',\n          },\n          {\n            text: 'getTransactionReceipt',\n            link: '/core/api/actions/getTransactionReceipt',\n          },\n          {\n            text: 'getWalletClient',\n            link: '/core/api/actions/getWalletClient',\n          },\n          {\n            text: 'multicall',\n            link: '/core/api/actions/multicall',\n          },\n          {\n            text: 'prepareTransactionRequest',\n            link: '/core/api/actions/prepareTransactionRequest',\n          },\n          { text: 'reconnect', link: '/core/api/actions/reconnect' },\n          {\n            text: 'readContract',\n            link: '/core/api/actions/readContract',\n          },\n          {\n            text: 'readContracts',\n            link: '/core/api/actions/readContracts',\n          },\n          {\n            text: 'sendCalls',\n            link: '/core/api/actions/sendCalls',\n          },\n          {\n            text: 'sendTransaction',\n            link: '/core/api/actions/sendTransaction',\n          },\n          {\n            text: 'showCallsStatus',\n            link: '/core/api/actions/showCallsStatus',\n          },\n          {\n            text: 'signMessage',\n            link: '/core/api/actions/signMessage',\n          },\n          {\n            text: 'signTypedData',\n            link: '/core/api/actions/signTypedData',\n          },\n          {\n            text: 'simulateContract',\n            link: '/core/api/actions/simulateContract',\n          },\n          {\n            text: 'switchChain',\n            link: '/core/api/actions/switchChain',\n          },\n          {\n            text: 'switchConnection',\n            link: '/core/api/actions/switchConnection',\n          },\n          {\n            text: 'verifyMessage',\n            link: '/core/api/actions/verifyMessage',\n          },\n          {\n            text: 'verifyTypedData',\n            link: '/core/api/actions/verifyTypedData',\n          },\n          {\n            text: 'waitForCallsStatus',\n            link: '/core/api/actions/waitForCallsStatus',\n          },\n          {\n            text: 'waitForTransactionReceipt',\n            link: '/core/api/actions/waitForTransactionReceipt',\n          },\n          {\n            text: 'watchAsset',\n            link: '/core/api/actions/watchAsset',\n          },\n          {\n            text: 'watchBlocks',\n            link: '/core/api/actions/watchBlocks',\n          },\n          {\n            text: 'watchBlockNumber',\n            link: '/core/api/actions/watchBlockNumber',\n          },\n          {\n            text: 'watchChainId',\n            link: '/core/api/actions/watchChainId',\n          },\n          {\n            text: 'watchClient',\n            link: '/core/api/actions/watchClient',\n          },\n          {\n            text: 'watchConnection',\n            link: '/core/api/actions/watchConnection',\n          },\n          {\n            text: 'watchConnections',\n            link: '/core/api/actions/watchConnections',\n          },\n          {\n            text: 'watchConnectors',\n            link: '/core/api/actions/watchConnectors',\n          },\n          {\n            text: 'watchContractEvent',\n            link: '/core/api/actions/watchContractEvent',\n          },\n          {\n            text: 'watchPendingTransactions',\n            link: '/core/api/actions/watchPendingTransactions',\n          },\n          {\n            text: 'watchPublicClient',\n            link: '/core/api/actions/watchPublicClient',\n          },\n          {\n            text: 'writeContract',\n            link: '/core/api/actions/writeContract',\n          },\n        ],\n      },\n      {\n        text: 'Miscellaneous',\n        items: [\n          { text: 'Errors', link: '/core/api/errors' },\n          {\n            text: 'Utilities',\n            collapsed: true,\n            items: [\n              {\n                text: 'cookieToInitialState',\n                link: '/core/api/utilities/cookieToInitialState',\n              },\n              { text: 'deserialize', link: '/core/api/utilities/deserialize' },\n              { text: 'serialize', link: '/core/api/utilities/serialize' },\n            ],\n          },\n        ],\n      },\n    ],\n    '/cli': [\n      {\n        text: 'Introduction',\n        items: [\n          { text: 'Why Wagmi CLI', link: '/cli/why' },\n          { text: 'Installation', link: '/cli/installation' },\n          { text: 'Getting Started', link: '/cli/getting-started' },\n        ],\n      },\n      {\n        text: 'Guides',\n        items: [\n          {\n            text: 'Migrate from v1 to v2',\n            link: '/cli/guides/migrate-from-v1-to-v2',\n          },\n        ],\n      },\n      {\n        text: 'Config File',\n        items: [\n          {\n            text: 'Configuring CLI',\n            link: '/cli/config/configuring-cli',\n          },\n          { text: 'Config Options', link: '/cli/config/options' },\n        ],\n      },\n      {\n        text: 'Commands',\n        link: '/cli/api/commands',\n        items: [\n          {\n            text: 'generate',\n            link: '/cli/api/commands/generate',\n          },\n          {\n            text: 'init',\n            link: '/cli/api/commands/init',\n          },\n        ],\n      },\n      {\n        text: 'Plugins',\n        link: '/cli/api/plugins',\n        items: [\n          { text: 'actions', link: '/cli/api/plugins/actions' },\n          { text: 'blockExplorer', link: '/cli/api/plugins/blockExplorer' },\n          { text: 'etherscan', link: '/cli/api/plugins/etherscan' },\n          { text: 'fetch', link: '/cli/api/plugins/fetch' },\n          { text: 'foundry', link: '/cli/api/plugins/foundry' },\n          { text: 'hardhat', link: '/cli/api/plugins/hardhat' },\n          { text: 'react', link: '/cli/api/plugins/react' },\n          { text: 'sourcify', link: '/cli/api/plugins/sourcify' },\n        ],\n      },\n      {\n        text: 'create-wagmi',\n        link: '/cli/create-wagmi',\n      },\n    ],\n    '/solid': [\n      {\n        text: 'Introduction',\n        items: [\n          { text: 'Why Wagmi', link: '/solid/why' },\n          { text: 'Installation', link: '/solid/installation' },\n          { text: 'Getting Started', link: '/solid/getting-started' },\n          { text: 'TypeScript', link: '/solid/typescript' },\n        ],\n      },\n      {\n        text: 'Guides',\n        items: [\n          {\n            text: 'TanStack Query',\n            link: '/solid/guides/tanstack-query',\n          },\n          {\n            text: 'Viem',\n            link: '/solid/guides/viem',\n          },\n          {\n            text: 'Error Handling',\n            link: '/solid/guides/error-handling',\n          },\n          {\n            text: 'Connect Wallet',\n            link: '/solid/guides/connect-wallet',\n          },\n        ],\n      },\n      {\n        text: 'Configuration',\n        items: [\n          { text: 'createConfig', link: '/solid/api/createConfig' },\n          { text: 'createStorage', link: '/solid/api/createStorage' },\n          { text: 'Chains', link: '/solid/api/chains' },\n          {\n            text: 'Connectors',\n            collapsed: true,\n            link: '/solid/api/connectors',\n            items: [\n              {\n                text: 'baseAccount',\n                link: '/solid/api/connectors/baseAccount',\n              },\n              { text: 'injected', link: '/solid/api/connectors/injected' },\n              {\n                text: 'metaMask',\n                link: '/solid/api/connectors/metaMask',\n              },\n              {\n                text: 'mock',\n                link: '/solid/api/connectors/mock',\n              },\n              {\n                text: 'porto',\n                link: '/solid/api/connectors/porto',\n              },\n              {\n                text: 'safe',\n                link: '/solid/api/connectors/safe',\n              },\n              {\n                text: 'walletConnect',\n                link: '/solid/api/connectors/walletConnect',\n              },\n            ],\n          },\n          {\n            text: 'Transports',\n            collapsed: true,\n            link: '/solid/api/transports',\n            items: [\n              {\n                text: 'custom (EIP-1193)',\n                link: '/solid/api/transports/custom',\n              },\n              {\n                text: 'fallback',\n                link: '/solid/api/transports/fallback',\n              },\n              {\n                text: 'http',\n                link: '/solid/api/transports/http',\n              },\n              {\n                text: 'webSocket',\n                link: '/solid/api/transports/webSocket',\n              },\n            ],\n          },\n          { text: 'WagmiProvider', link: '/solid/api/WagmiProvider' },\n        ],\n      },\n      {\n        text: 'Primitives',\n        link: '/solid/api/primitives',\n        items: [\n          { text: 'useBalance', link: '/solid/api/primitives/useBalance' },\n          {\n            text: 'useBlockNumber',\n            link: '/solid/api/primitives/useBlockNumber',\n          },\n          { text: 'useChainId', link: '/solid/api/primitives/useChainId' },\n          { text: 'useChains', link: '/solid/api/primitives/useChains' },\n          { text: 'useClient', link: '/solid/api/primitives/useClient' },\n          { text: 'useConfig', link: '/solid/api/primitives/useConfig' },\n          { text: 'useConnect', link: '/solid/api/primitives/useConnect' },\n          {\n            text: 'useConnection',\n            link: '/solid/api/primitives/useConnection',\n          },\n          {\n            text: 'useConnectionEffect',\n            link: '/solid/api/primitives/useConnectionEffect',\n          },\n          {\n            text: 'useConnections',\n            link: '/solid/api/primitives/useConnections',\n          },\n          {\n            text: 'useConnectorClient',\n            link: '/solid/api/primitives/useConnectorClient',\n          },\n          {\n            text: 'useConnectors',\n            link: '/solid/api/primitives/useConnectors',\n          },\n          {\n            text: 'useDisconnect',\n            link: '/solid/api/primitives/useDisconnect',\n          },\n          { text: 'useReconnect', link: '/solid/api/primitives/useReconnect' },\n          {\n            text: 'useSwitchChain',\n            link: '/solid/api/primitives/useSwitchChain',\n          },\n          {\n            text: 'useSwitchConnection',\n            link: '/solid/api/primitives/useSwitchConnection',\n          },\n          {\n            text: 'useWatchBlockNumber',\n            link: '/solid/api/primitives/useWatchBlockNumber',\n          },\n        ],\n      },\n      {\n        text: 'Miscellaneous',\n        items: [\n          { text: 'Actions', link: '/solid/api/actions' },\n          { text: 'Errors', link: '/solid/api/errors' },\n        ],\n      },\n    ],\n    '/dev': [\n      {\n        text: 'Dev',\n        items: [\n          { text: 'Contributing', link: '/dev/contributing' },\n          { text: 'Creating Connectors', link: '/dev/creating-connectors' },\n        ],\n      },\n    ],\n    '/examples': [\n      {\n        text: 'React',\n        items: [\n          { text: 'Connect Wallet', link: '/examples/connect-wallet' },\n          { text: 'Send Transaction', link: '/examples/send-transaction' },\n          { text: 'Write Contract', link: '/examples/contract-write' },\n          {\n            text: 'Write Contract (Dynamic Args)',\n            link: '/examples/contract-write-dynamic',\n          },\n          { text: 'Sign Message', link: '/examples/sign-message' },\n          {\n            text: 'Sign In With Ethereum',\n            link: '/examples/sign-in-with-ethereum',\n          },\n        ],\n      },\n    ],\n    '/tempo': [\n      {\n        text: 'Tempo',\n        items: [\n          { text: 'Getting Started', link: '/tempo/getting-started' },\n          { text: 'Chains', link: '/tempo/chains' },\n          { text: 'Tempo Docs & Guides', link: 'https://docs.tempo.xyz' },\n        ],\n      },\n      {\n        text: 'Hooks',\n        link: '/tempo/hooks/',\n        items: [\n          {\n            text: 'AMM',\n            collapsed: true,\n            items: [\n              { text: 'useBurn', link: '/tempo/hooks/amm.useBurn' },\n              {\n                text: 'useLiquidityBalance',\n                link: '/tempo/hooks/amm.useLiquidityBalance',\n              },\n              { text: 'useMint', link: '/tempo/hooks/amm.useMint' },\n              { text: 'usePool', link: '/tempo/hooks/amm.usePool' },\n              {\n                text: 'useRebalanceSwap',\n                link: '/tempo/hooks/amm.useRebalanceSwap',\n              },\n              { text: 'useWatchBurn', link: '/tempo/hooks/amm.useWatchBurn' },\n              {\n                text: 'useWatchFeeSwap',\n                link: '/tempo/hooks/amm.useWatchFeeSwap',\n              },\n              { text: 'useWatchMint', link: '/tempo/hooks/amm.useWatchMint' },\n              {\n                text: 'useWatchRebalanceSwap',\n                link: '/tempo/hooks/amm.useWatchRebalanceSwap',\n              },\n            ],\n          },\n          {\n            text: 'DEX',\n            collapsed: true,\n            items: [\n              { text: 'useBalance', link: '/tempo/hooks/dex.useBalance' },\n              { text: 'useBuy', link: '/tempo/hooks/dex.useBuy' },\n              { text: 'useBuyQuote', link: '/tempo/hooks/dex.useBuyQuote' },\n              { text: 'useCancel', link: '/tempo/hooks/dex.useCancel' },\n              { text: 'useCreatePair', link: '/tempo/hooks/dex.useCreatePair' },\n              { text: 'useOrder', link: '/tempo/hooks/dex.useOrder' },\n              { text: 'usePlace', link: '/tempo/hooks/dex.usePlace' },\n              { text: 'usePlaceFlip', link: '/tempo/hooks/dex.usePlaceFlip' },\n              { text: 'useSell', link: '/tempo/hooks/dex.useSell' },\n              { text: 'useSellQuote', link: '/tempo/hooks/dex.useSellQuote' },\n              { text: 'useTickLevel', link: '/tempo/hooks/dex.useTickLevel' },\n              {\n                text: 'useWatchFlipOrderPlaced',\n                link: '/tempo/hooks/dex.useWatchFlipOrderPlaced',\n              },\n              {\n                text: 'useWatchOrderCancelled',\n                link: '/tempo/hooks/dex.useWatchOrderCancelled',\n              },\n              {\n                text: 'useWatchOrderFilled',\n                link: '/tempo/hooks/dex.useWatchOrderFilled',\n              },\n              {\n                text: 'useWatchOrderPlaced',\n                link: '/tempo/hooks/dex.useWatchOrderPlaced',\n              },\n              { text: 'useWithdraw', link: '/tempo/hooks/dex.useWithdraw' },\n            ],\n          },\n          {\n            text: 'Faucet',\n            collapsed: true,\n            items: [{ text: 'useFund', link: '/tempo/hooks/faucet.useFund' }],\n          },\n          {\n            text: 'Fee',\n            collapsed: true,\n            items: [\n              {\n                text: 'useSetUserToken',\n                link: '/tempo/hooks/fee.useSetUserToken',\n              },\n              { text: 'useUserToken', link: '/tempo/hooks/fee.useUserToken' },\n              {\n                text: 'useWatchSetUserToken',\n                link: '/tempo/hooks/fee.useWatchSetUserToken',\n              },\n            ],\n          },\n          {\n            text: 'Nonce',\n            collapsed: true,\n            items: [\n              { text: 'useNonce', link: '/tempo/hooks/nonce.useNonce' },\n              {\n                text: 'useNonceKeyCount',\n                link: '/tempo/hooks/nonce.useNonceKeyCount',\n              },\n              {\n                text: 'useWatchActiveKeyCountChanged',\n                link: '/tempo/hooks/nonce.useWatchActiveKeyCountChanged',\n              },\n              {\n                text: 'useWatchNonceIncremented',\n                link: '/tempo/hooks/nonce.useWatchNonceIncremented',\n              },\n            ],\n          },\n          {\n            text: 'Policy',\n            collapsed: true,\n            items: [\n              { text: 'useCreate', link: '/tempo/hooks/policy.useCreate' },\n              { text: 'useData', link: '/tempo/hooks/policy.useData' },\n              {\n                text: 'useIsAuthorized',\n                link: '/tempo/hooks/policy.useIsAuthorized',\n              },\n              {\n                text: 'useModifyBlacklist',\n                link: '/tempo/hooks/policy.useModifyBlacklist',\n              },\n              {\n                text: 'useModifyWhitelist',\n                link: '/tempo/hooks/policy.useModifyWhitelist',\n              },\n              { text: 'useSetAdmin', link: '/tempo/hooks/policy.useSetAdmin' },\n              {\n                text: 'useWatchAdminUpdated',\n                link: '/tempo/hooks/policy.useWatchAdminUpdated',\n              },\n              {\n                text: 'useWatchBlacklistUpdated',\n                link: '/tempo/hooks/policy.useWatchBlacklistUpdated',\n              },\n              {\n                text: 'useWatchCreate',\n                link: '/tempo/hooks/policy.useWatchCreate',\n              },\n              {\n                text: 'useWatchWhitelistUpdated',\n                link: '/tempo/hooks/policy.useWatchWhitelistUpdated',\n              },\n            ],\n          },\n          {\n            text: 'Reward',\n            collapsed: true,\n            items: [\n              { text: 'useClaim', link: '/tempo/hooks/reward.useClaim' },\n              {\n                text: 'useSetRecipient',\n                link: '/tempo/hooks/reward.useSetRecipient',\n              },\n              { text: 'useStart', link: '/tempo/hooks/reward.useStart' },\n              {\n                text: 'useUserRewardInfo',\n                link: '/tempo/hooks/reward.useUserRewardInfo',\n              },\n              {\n                text: 'useWatchRewardRecipientSet',\n                link: '/tempo/hooks/reward.useWatchRewardRecipientSet',\n              },\n              {\n                text: 'useWatchRewardScheduled',\n                link: '/tempo/hooks/reward.useWatchRewardScheduled',\n              },\n            ],\n          },\n          {\n            text: 'Token',\n            collapsed: true,\n            items: [\n              { text: 'useApprove', link: '/tempo/hooks/token.useApprove' },\n              { text: 'useBurn', link: '/tempo/hooks/token.useBurn' },\n              {\n                text: 'useBurnBlocked',\n                link: '/tempo/hooks/token.useBurnBlocked',\n              },\n              {\n                text: 'useChangeTransferPolicy',\n                link: '/tempo/hooks/token.useChangeTransferPolicy',\n              },\n              { text: 'useCreate', link: '/tempo/hooks/token.useCreate' },\n              {\n                text: 'useGetAllowance',\n                link: '/tempo/hooks/token.useGetAllowance',\n              },\n              {\n                text: 'useGetBalance',\n                link: '/tempo/hooks/token.useGetBalance',\n              },\n              {\n                text: 'useGetMetadata',\n                link: '/tempo/hooks/token.useGetMetadata',\n              },\n              {\n                text: 'useGrantRoles',\n                link: '/tempo/hooks/token.useGrantRoles',\n              },\n              { text: 'useHasRole', link: '/tempo/hooks/token.useHasRole' },\n              { text: 'useMint', link: '/tempo/hooks/token.useMint' },\n              { text: 'usePause', link: '/tempo/hooks/token.usePause' },\n              {\n                text: 'useRenounceRoles',\n                link: '/tempo/hooks/token.useRenounceRoles',\n              },\n              {\n                text: 'useRevokeRoles',\n                link: '/tempo/hooks/token.useRevokeRoles',\n              },\n              {\n                text: 'useSetRoleAdmin',\n                link: '/tempo/hooks/token.useSetRoleAdmin',\n              },\n              {\n                text: 'useSetSupplyCap',\n                link: '/tempo/hooks/token.useSetSupplyCap',\n              },\n              { text: 'useTransfer', link: '/tempo/hooks/token.useTransfer' },\n              { text: 'useUnpause', link: '/tempo/hooks/token.useUnpause' },\n              {\n                text: 'useWatchAdminRole',\n                link: '/tempo/hooks/token.useWatchAdminRole',\n              },\n              {\n                text: 'useWatchApprove',\n                link: '/tempo/hooks/token.useWatchApprove',\n              },\n              { text: 'useWatchBurn', link: '/tempo/hooks/token.useWatchBurn' },\n              {\n                text: 'useWatchCreate',\n                link: '/tempo/hooks/token.useWatchCreate',\n              },\n              { text: 'useWatchMint', link: '/tempo/hooks/token.useWatchMint' },\n              { text: 'useWatchRole', link: '/tempo/hooks/token.useWatchRole' },\n              {\n                text: 'useWatchTransfer',\n                link: '/tempo/hooks/token.useWatchTransfer',\n              },\n            ],\n          },\n        ],\n      },\n      {\n        text: 'Actions',\n        link: '/tempo/actions/',\n        items: [\n          {\n            text: 'AMM',\n            collapsed: true,\n            items: [\n              { text: 'burn', link: '/tempo/actions/amm.burn' },\n              {\n                text: 'getLiquidityBalance',\n                link: '/tempo/actions/amm.getLiquidityBalance',\n              },\n              { text: 'getPool', link: '/tempo/actions/amm.getPool' },\n              { text: 'mint', link: '/tempo/actions/amm.mint' },\n              {\n                text: 'rebalanceSwap',\n                link: '/tempo/actions/amm.rebalanceSwap',\n              },\n              { text: 'watchBurn', link: '/tempo/actions/amm.watchBurn' },\n              { text: 'watchFeeSwap', link: '/tempo/actions/amm.watchFeeSwap' },\n              { text: 'watchMint', link: '/tempo/actions/amm.watchMint' },\n              {\n                text: 'watchRebalanceSwap',\n                link: '/tempo/actions/amm.watchRebalanceSwap',\n              },\n            ],\n          },\n          {\n            text: 'DEX',\n            collapsed: true,\n            items: [\n              { text: 'buy', link: '/tempo/actions/dex.buy' },\n              { text: 'cancel', link: '/tempo/actions/dex.cancel' },\n              { text: 'createPair', link: '/tempo/actions/dex.createPair' },\n              { text: 'getBalance', link: '/tempo/actions/dex.getBalance' },\n              { text: 'getBuyQuote', link: '/tempo/actions/dex.getBuyQuote' },\n              { text: 'getOrder', link: '/tempo/actions/dex.getOrder' },\n              { text: 'getSellQuote', link: '/tempo/actions/dex.getSellQuote' },\n              { text: 'getTickLevel', link: '/tempo/actions/dex.getTickLevel' },\n              { text: 'place', link: '/tempo/actions/dex.place' },\n              { text: 'placeFlip', link: '/tempo/actions/dex.placeFlip' },\n              { text: 'sell', link: '/tempo/actions/dex.sell' },\n              {\n                text: 'watchFlipOrderPlaced',\n                link: '/tempo/actions/dex.watchFlipOrderPlaced',\n              },\n              {\n                text: 'watchOrderCancelled',\n                link: '/tempo/actions/dex.watchOrderCancelled',\n              },\n              {\n                text: 'watchOrderFilled',\n                link: '/tempo/actions/dex.watchOrderFilled',\n              },\n              {\n                text: 'watchOrderPlaced',\n                link: '/tempo/actions/dex.watchOrderPlaced',\n              },\n              { text: 'withdraw', link: '/tempo/actions/dex.withdraw' },\n            ],\n          },\n          {\n            text: 'Faucet',\n            collapsed: true,\n            items: [{ text: 'fund', link: '/tempo/actions/faucet.fund' }],\n          },\n          {\n            text: 'Fee',\n            collapsed: true,\n            items: [\n              { text: 'getUserToken', link: '/tempo/actions/fee.getUserToken' },\n              { text: 'setUserToken', link: '/tempo/actions/fee.setUserToken' },\n              {\n                text: 'watchSetUserToken',\n                link: '/tempo/actions/fee.watchSetUserToken',\n              },\n            ],\n          },\n          {\n            text: 'Nonce',\n            collapsed: true,\n            items: [\n              { text: 'getNonce', link: '/tempo/actions/nonce.getNonce' },\n              {\n                text: 'getNonceKeyCount',\n                link: '/tempo/actions/nonce.getNonceKeyCount',\n              },\n              {\n                text: 'watchActiveKeyCountChanged',\n                link: '/tempo/actions/nonce.watchActiveKeyCountChanged',\n              },\n              {\n                text: 'watchNonceIncremented',\n                link: '/tempo/actions/nonce.watchNonceIncremented',\n              },\n            ],\n          },\n          {\n            text: 'Policy',\n            collapsed: true,\n            items: [\n              { text: 'create', link: '/tempo/actions/policy.create' },\n              { text: 'getData', link: '/tempo/actions/policy.getData' },\n              {\n                text: 'isAuthorized',\n                link: '/tempo/actions/policy.isAuthorized',\n              },\n              {\n                text: 'modifyBlacklist',\n                link: '/tempo/actions/policy.modifyBlacklist',\n              },\n              {\n                text: 'modifyWhitelist',\n                link: '/tempo/actions/policy.modifyWhitelist',\n              },\n              { text: 'setAdmin', link: '/tempo/actions/policy.setAdmin' },\n              {\n                text: 'watchAdminUpdated',\n                link: '/tempo/actions/policy.watchAdminUpdated',\n              },\n              {\n                text: 'watchBlacklistUpdated',\n                link: '/tempo/actions/policy.watchBlacklistUpdated',\n              },\n              {\n                text: 'watchCreate',\n                link: '/tempo/actions/policy.watchCreate',\n              },\n              {\n                text: 'watchWhitelistUpdated',\n                link: '/tempo/actions/policy.watchWhitelistUpdated',\n              },\n            ],\n          },\n          {\n            text: 'Reward',\n            collapsed: true,\n            items: [\n              { text: 'claim', link: '/tempo/actions/reward.claim' },\n              {\n                text: 'getUserRewardInfo',\n                link: '/tempo/actions/reward.getUserRewardInfo',\n              },\n              {\n                text: 'setRecipient',\n                link: '/tempo/actions/reward.setRecipient',\n              },\n              { text: 'start', link: '/tempo/actions/reward.start' },\n              {\n                text: 'watchRewardRecipientSet',\n                link: '/tempo/actions/reward.watchRewardRecipientSet',\n              },\n              {\n                text: 'watchRewardScheduled',\n                link: '/tempo/actions/reward.watchRewardScheduled',\n              },\n            ],\n          },\n          {\n            text: 'Token',\n            collapsed: true,\n            items: [\n              { text: 'approve', link: '/tempo/actions/token.approve' },\n              { text: 'burn', link: '/tempo/actions/token.burn' },\n              { text: 'burnBlocked', link: '/tempo/actions/token.burnBlocked' },\n              {\n                text: 'changeTransferPolicy',\n                link: '/tempo/actions/token.changeTransferPolicy',\n              },\n              { text: 'create', link: '/tempo/actions/token.create' },\n              {\n                text: 'getAllowance',\n                link: '/tempo/actions/token.getAllowance',\n              },\n              { text: 'getBalance', link: '/tempo/actions/token.getBalance' },\n              { text: 'getMetadata', link: '/tempo/actions/token.getMetadata' },\n              { text: 'grantRoles', link: '/tempo/actions/token.grantRoles' },\n              { text: 'hasRole', link: '/tempo/actions/token.hasRole' },\n              { text: 'mint', link: '/tempo/actions/token.mint' },\n              { text: 'pause', link: '/tempo/actions/token.pause' },\n              {\n                text: 'renounceRoles',\n                link: '/tempo/actions/token.renounceRoles',\n              },\n              { text: 'revokeRoles', link: '/tempo/actions/token.revokeRoles' },\n              {\n                text: 'setRoleAdmin',\n                link: '/tempo/actions/token.setRoleAdmin',\n              },\n              {\n                text: 'setSupplyCap',\n                link: '/tempo/actions/token.setSupplyCap',\n              },\n              { text: 'transfer', link: '/tempo/actions/token.transfer' },\n              { text: 'unpause', link: '/tempo/actions/token.unpause' },\n              {\n                text: 'watchAdminRole',\n                link: '/tempo/actions/token.watchAdminRole',\n              },\n              {\n                text: 'watchApprove',\n                link: '/tempo/actions/token.watchApprove',\n              },\n              { text: 'watchBurn', link: '/tempo/actions/token.watchBurn' },\n              { text: 'watchCreate', link: '/tempo/actions/token.watchCreate' },\n              { text: 'watchMint', link: '/tempo/actions/token.watchMint' },\n              { text: 'watchRole', link: '/tempo/actions/token.watchRole' },\n              {\n                text: 'watchTransfer',\n                link: '/tempo/actions/token.watchTransfer',\n              },\n            ],\n          },\n        ],\n      },\n      {\n        text: 'Connectors',\n        link: '/tempo/connectors/',\n        items: [\n          {\n            text: 'dangerous_secp256k1',\n            link: '/tempo/connectors/dangerous_secp256k1',\n          },\n          { text: 'webAuthn', link: '/tempo/connectors/webAuthn' },\n        ],\n      },\n      {\n        text: 'Key Managers',\n        link: '/tempo/keyManagers/',\n        items: [\n          { text: 'http', link: '/tempo/keyManagers/http' },\n          { text: 'localStorage', link: '/tempo/keyManagers/localStorage' },\n        ],\n      },\n    ],\n  } satisfies DefaultTheme.Sidebar\n}\n"
  },
  {
    "path": "site/.vitepress/theme/components/AsideSponsors.vue",
    "content": "<script setup lang=\"ts\">\nimport { VPDocAsideSponsors } from 'vitepress/theme'\nimport { computed } from 'vue'\nimport { useSponsors } from '../composables/useSponsors'\n\nconst { data } = useSponsors()\n\nconst sponsors = computed(() => {\n  return (\n    data?.value\n      ?.filter(\n        (sponsor) => sponsor.type === 'platinum' || sponsor.type === 'gold',\n      )\n      .map((sponsor) => {\n        return {\n          size: sponsor.type === 'platinum' ? 'mini' : 'xmini',\n          items: sponsor.items,\n        }\n      }) ?? []\n  )\n})\n</script>\n\n<template>\n  <VPDocAsideSponsors v-if=\"data\" :data=\"sponsors\" />\n</template>\n\n"
  },
  {
    "path": "site/.vitepress/theme/components/Banner.vue",
    "content": "// TODO: Dismissable, a11y, etc.\n// https://github.com/faker-js/faker/pull/1487\n\n<template>\n  <div class=\"banner\" font-medium items-center justify-center text-center text-sm py-4 px-3 mb-8 rounded-lg>\n    Wagmi is participating in Gitcoin Grants round 21. Consider <a class=\"underline\"\n      href=\"https://explorer.gitcoin.co/#/round/42161/389/74\">supporting the project</a>. Thank you. 🙏\n  </div>\n</template>\n\n<style scoped>\n.banner {\n  background: var(--vp-c-indigo-soft);\n  text-wrap: balance;\n}\n</style>\n"
  },
  {
    "path": "site/.vitepress/theme/components/HomeBanner.vue",
    "content": "<template>\n  <div class=\"banner\" font-medium items-center justify-center text-center text-sm py-3>\n    Looking for the 2.x docs? Check out <a underline underline-dotted href=\"https://2.x.wagmi.sh\">2.x.wagmi.sh</a>.\n  </div>\n</template>\n\n<style scoped>\n.banner {\n  background: var(--vp-c-bg-soft);\n  color: var(--vp-c-text-1);\n}\n</style>\n\n"
  },
  {
    "path": "site/.vitepress/theme/components/HomePage.vue",
    "content": "<script setup lang=\"ts\">\nimport type DefaultTheme from 'vitepress/theme'\nimport { VPButton, VPSponsors, VPTeamMembers } from 'vitepress/theme'\nimport { useSponsors } from '../composables/useSponsors'\n\nconst { data: sponsors } = useSponsors()\n\nconst teamMembers = [\n  {\n    avatar: 'https://www.github.com/tmm.png',\n    name: 'tmm',\n    links: [\n      { icon: 'github', link: 'https://github.com/tmm' },\n      { icon: 'x', link: 'https://twitter.com/awkweb' },\n      { icon: 'bluesky', link: 'https://bsky.app/profile/tmm.dev' },\n    ],\n  },\n  {\n    avatar: 'https://www.github.com/jxom.png',\n    name: 'jxom',\n    links: [\n      { icon: 'github', link: 'https://github.com/jxom' },\n      { icon: 'x', link: 'https://twitter.com/_jxom' },\n      { icon: 'bluesky', link: 'https://bsky.app/profile/jxom.dev' },\n    ],\n  },\n] satisfies DefaultTheme.TeamMember[]\n</script>\n\n<template>\n  <div class=\"content\">\n    <div class=\"content-container\">\n      <main class=\"main\">\n        <div class=\"vp-doc\" flex flex-col items-center mt-10>\n          <h2 id=\"meet-the-team\" op50 font-normal p=\"t-10 b-2\">\n            Meet The Team\n          </h2>\n          <div w-full p-10>\n            <VPTeamMembers size=\"small\" :members=\"teamMembers\" />\n          </div>\n\n          <h2 id=\"sponsored-by\" op50 font-normal pt-5 pb-2>\n            Sponsored by\n          </h2>\n\n          <div w-full p-10 class=\"container\">\n            <VPSponsors v-if=\"sponsors\" :data=\"sponsors\" />\n\n            <div pt-10 text-center>\n              <VPButton theme=\"alt\" text=\"Become a sponsor\" href=\"https://github.com/sponsors/wevm\" />\n            </div>\n          </div>\n\n          <div flex flex-col gap-2 items-center pt-10>\n            <div>\n              <a href=\"https://vercel.com/?utm_source=wevm&utm_campaign=oss\">\n                <img src=\"https://www.datocms-assets.com/31049/1618983297-powered-by-vercel.svg\" alt=\"Powered by Vercel\" h8>\n              </a>\n            </div>\n\n          </div>\n        </div>\n      </main>\n    </div>\n  </div>\n</template>\n\n<style>\n.vp-doc .VPTeamMembers.small.count-2 .container {\n  max-width: calc(276px * 2 + 24px) !important;\n}\n\n.container {\n  margin: 0 auto;\n  max-width: 1152px;\n}\n\nh3.vp-sponsor-tier {\n  margin: 0;\n  margin-bottom: 4px;\n}\n\n.VercelBadge {\n  align-items: center;\n  color: var(--vp-c-text-2) !important;\n  display: flex;\n  font-size: 0.85rem;\n  font-weight: 500;\n  gap: 0.35rem;\n  justify-content: center;\n}\n\n.VercelBadge:hover {\n  text-decoration: none !important;\n}\n\n.VercelBadge svg {\n  color: var(--vp-c-text-2);\n  height: 0.85rem;\n}\n</style>\n"
  },
  {
    "path": "site/.vitepress/theme/composables/useSponsors.ts",
    "content": "import { onMounted, ref } from 'vue'\n\ntype Sponsor = {\n  name: string\n  img: string\n  url: string\n}\n\ntype Data = {\n  size: 'big' | 'medium' | 'small'\n  items: Sponsor[]\n  tier: string\n  type: 'platinum' | 'gold' | 'silver'\n}[]\n\n// shared data across instances so we load only once.\nconst data = ref<Data>()\n\n// TODO: Data powered\n// const dataHost = 'https://sponsors.vuejs.org'\n// const dataUrl = `${dataHost}/vite.json`\n\nexport function useSponsors() {\n  onMounted(async () => {\n    if (data.value) return\n\n    // const result = await fetch(dataUrl)\n    // const json = await result.json()\n    // console.log(json)\n    const sponsors = {\n      platinum: [\n        {\n          name: 'Paradigm',\n          url: 'https://paradigm.xyz',\n          img: 'paradigm-light.svg',\n        },\n        {\n          name: 'Tempo',\n          url: 'https://tempo.xyz',\n          img: 'tempo-light.svg',\n        },\n      ],\n      gold: [\n        {\n          name: 'Stripe',\n          url: 'https://www.stripe.com',\n          img: 'stripe-light.svg',\n        },\n      ],\n      silver: [\n        {\n          name: 'Family',\n          url: 'https://twitter.com/family',\n          img: 'family-light.svg',\n        },\n        {\n          name: 'Context',\n          url: 'https://twitter.com/context',\n          img: 'context-light.svg',\n        },\n        {\n          name: 'SushiSwap',\n          url: 'https://www.sushi.com',\n          img: 'sushi-light.svg',\n        },\n        {\n          name: 'Dynamic',\n          url: 'https://www.dynamic.xyz',\n          img: 'dynamic-light.svg',\n        },\n        {\n          name: 'Privy',\n          url: 'https://privy.io',\n          img: 'privy-light.svg',\n        },\n        {\n          name: 'PancakeSwap',\n          url: 'https://pancakeswap.finance',\n          img: 'pancake-light.svg',\n        },\n        {\n          name: 'Pimlico',\n          url: 'https://pimlico.io',\n          img: 'pimlico-light.svg',\n        },\n        {\n          name: 'Zora',\n          url: 'https://zora.co',\n          img: 'zora-light.svg',\n        },\n        {\n          name: 'Syndicate',\n          url: 'https://syndicate.io',\n          img: 'syndicate-light.svg',\n        },\n        {\n          name: 'Relay',\n          url: 'https://relay.link',\n          img: 'relay-light.svg',\n        },\n        {\n          name: 'Polymarket',\n          url: 'https://polymarket.com',\n          img: 'polymarket-light.svg',\n        },\n        {\n          name: 'Sequence',\n          url: 'https://sequence.xyz',\n          img: 'sequence-light.svg',\n        },\n        {\n          name: 'Web3Auth',\n          url: 'https://web3auth.io',\n          img: 'web3auth-light.svg',\n        },\n      ],\n    }\n\n    data.value = mapSponsors(sponsors)\n  })\n\n  return { data }\n}\n\nfunction mapSponsors(sponsors: {\n  platinum: Sponsor[]\n  gold: Sponsor[]\n  silver: Sponsor[]\n}) {\n  return [\n    {\n      size: 'big',\n      items: mapImgPath(sponsors.platinum),\n      tier: 'Collaborators',\n      type: 'platinum',\n    },\n    {\n      size: 'medium',\n      items: mapImgPath(sponsors.gold),\n      tier: 'Large Enterprises',\n      type: 'gold',\n    },\n    {\n      size: 'small',\n      items: mapImgPath(sponsors.silver),\n      tier: 'Small Enterprises',\n      type: 'silver',\n    },\n  ] satisfies Data\n}\n\nfunction mapImgPath(sponsors: Sponsor[]) {\n  return sponsors.map((sponsor) => ({\n    ...sponsor,\n    img: `https://raw.githubusercontent.com/wevm/.github/main/content/sponsors/${sponsor.img}`,\n  }))\n}\n"
  },
  {
    "path": "site/.vitepress/theme/index.ts",
    "content": "import TwoslashFloatingVue from '@shikijs/vitepress-twoslash/client'\nimport type { EnhanceAppContext, Theme } from 'vitepress'\nimport DefaultTheme from 'vitepress/theme'\n// https://vitepress.dev/guide/custom-theme\nimport { h } from 'vue'\n\nimport 'virtual:uno.css'\nimport 'virtual:group-icons.css'\nimport '@shikijs/vitepress-twoslash/style.css'\nimport './style.css'\n\nimport AsideSponsors from './components/AsideSponsors.vue'\n// import Banner from './components/Banner.vue'\nimport HomeBanner from './components/HomeBanner.vue'\nimport HomePage from './components/HomePage.vue'\n\nexport default {\n  extends: DefaultTheme,\n  Layout() {\n    // https://vitepress.dev/guide/extending-default-theme#layout-slots\n    return h(DefaultTheme.Layout, null, {\n      'aside-ads-before': () => h(AsideSponsors),\n      // 'doc-before': () => h(Banner),\n      'home-features-after': () => h(HomePage),\n      'home-hero-before': () => h(HomeBanner),\n    })\n  },\n  enhanceApp({ app }: EnhanceAppContext) {\n    app.use(TwoslashFloatingVue)\n  },\n} satisfies Theme\n"
  },
  {
    "path": "site/.vitepress/theme/style.css",
    "content": "/**\n * Customize default theme styling by overriding CSS variables:\n * https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css\n */\n\n/**\n * Colors\n *\n * Each colors have exact same color scale system with 3 levels of solid\n * colors with different brightness, and 1 soft color.\n *\n * - `XXX-1`: The most solid color used mainly for colored text. It must\n *   satisfy the contrast ratio against when used on top of `XXX-soft`.\n *\n * - `XXX-2`: The color used mainly for hover state of the button.\n *\n * - `XXX-3`: The color for solid background, such as bg color of the button.\n *   It must satisfy the contrast ratio with pure white (#ffffff) text on\n *   top of it.\n *\n * - `XXX-soft`: The color used for subtle background such as custom container\n *   or badges. It must satisfy the contrast ratio when putting `XXX-1` colors\n *   on top of it.\n *\n *   The soft color must be semi transparent alpha channel. This is crucial\n *   because it allows adding multiple \"soft\" colors on top of each other\n *   to create a accent, such as when having inline code block inside\n *   custom containers.\n *\n * - `default`: The color used purely for subtle indication without any\n *   special meanings attached to it such as bg color for menu hover state.\n *\n * - `brand`: Used for primary brand colors, such as link text, button with\n *   brand theme, etc.\n *\n * - `tip`: Used to indicate useful information. The default theme uses the\n *   brand color for this by default.\n *\n * - `warning`: Used to indicate warning to the users. Used in custom\n *   container, badges, etc.\n *\n * - `danger`: Used to show error, or dangerous message to the users. Used\n *   in custom container, badges, etc.\n * -------------------------------------------------------------------------- */\n\n:root {\n  --vp-c-default-1: var(--vp-c-gray-1);\n  --vp-c-default-2: var(--vp-c-gray-2);\n  --vp-c-default-3: var(--vp-c-gray-3);\n  --vp-c-default-soft: var(--vp-c-gray-soft);\n\n  --vp-c-brand-1: var(--vp-c-indigo-1);\n  --vp-c-brand-2: var(--vp-c-indigo-2);\n  --vp-c-brand-3: var(--vp-c-indigo-3);\n  --vp-c-brand-soft: var(--vp-c-indigo-soft);\n\n  --vp-c-tip-1: var(--vp-c-brand-1);\n  --vp-c-tip-2: var(--vp-c-brand-2);\n  --vp-c-tip-3: var(--vp-c-brand-3);\n  --vp-c-tip-soft: var(--vp-c-brand-soft);\n\n  --vp-c-warning-1: var(--vp-c-yellow-1);\n  --vp-c-warning-2: var(--vp-c-yellow-2);\n  --vp-c-warning-3: var(--vp-c-yellow-3);\n  --vp-c-warning-soft: var(--vp-c-yellow-soft);\n\n  --vp-c-danger-1: var(--vp-c-red-1);\n  --vp-c-danger-2: var(--vp-c-red-2);\n  --vp-c-danger-3: var(--vp-c-red-3);\n  --vp-c-danger-soft: var(--vp-c-red-soft);\n}\n\n/**\n * Component: Button\n * -------------------------------------------------------------------------- */\n\n:root {\n  --vp-button-brand-border: transparent;\n  --vp-button-brand-text: var(--vp-c-white);\n  --vp-button-brand-bg: var(--vp-c-brand-3);\n  --vp-button-brand-hover-border: transparent;\n  --vp-button-brand-hover-text: var(--vp-c-white);\n  --vp-button-brand-hover-bg: var(--vp-c-brand-2);\n  --vp-button-brand-active-border: transparent;\n  --vp-button-brand-active-text: var(--vp-c-white);\n  --vp-button-brand-active-bg: var(--vp-c-brand-1);\n}\n\n/**\n * Component: Home\n * -------------------------------------------------------------------------- */\n\n:root {\n  --vp-home-hero-name-color: transparent;\n  --vp-home-hero-name-background: -webkit-linear-gradient(\n    120deg,\n    var(--vp-c-brand-1) 30%,\n    var(--vp-c-brand-3)\n  );\n  --vp-home-hero-image-background-image: linear-gradient(\n    -45deg,\n    var(--vp-c-brand-1) 50%,\n    var(--vp-c-brand-3) 50%\n  );\n  --vp-home-hero-image-filter: blur(44px);\n}\n\n@media (min-width: 640px) {\n  :root {\n    --vp-home-hero-image-filter: blur(56px);\n  }\n}\n\n@media (min-width: 960px) {\n  :root {\n    --vp-home-hero-image-filter: blur(68px);\n  }\n}\n\n/**\n * Component: Custom Block\n * -------------------------------------------------------------------------- */\n\n:root {\n  --vp-custom-block-tip-border: transparent;\n  --vp-custom-block-tip-text: var(--vp-c-text-1);\n  --vp-custom-block-tip-bg: var(--vp-c-brand-soft);\n  --vp-custom-block-tip-code-bg: var(--vp-c-brand-soft);\n}\n\n/**\n * Component: Algolia\n * -------------------------------------------------------------------------- */\n\n.DocSearch {\n  --docsearch-primary-color: var(--vp-c-brand-1) !important;\n}\n\n.vp-doc [class*=\"language-\"] .has-focused-lines .line:not(.has-focus) {\n  filter: unset;\n  opacity: 0.3;\n}\n\n/**\n * twoslash\n * -------------------------------------------------------------------------- */\n\n.twoslash-error-line {\n  max-width: min-content;\n  white-space: wrap;\n}\n\nhtml.dark .shiki,\nhtml.dark .shiki span {\n  color: var(--shiki-dark) !important;\n  background-color: var(--shiki-dark-bg) !important;\n  /* Optional, if you also want font styles */\n  font-style: var(--shiki-dark-font-style) !important;\n  font-weight: var(--shiki-dark-font-weight) !important;\n  text-decoration: var(--shiki-dark-text-decoration) !important;\n}\n"
  },
  {
    "path": "site/AGENTS.md",
    "content": "# Agent Guidelines\n\nAgent guidance for the Wagmi documentation site.\n\n> **Communication Style**: Be brief, concise. Maximize information density, minimize tokens. Incomplete sentences acceptable when clear. Remove filler words. Prioritize clarity over grammar.\n\n## Tempo\n\n- All Tempo documentation must be added under the `/tempo` sidebar item.\n\n## Wagmi Actions\n\n- **All documentation must be based on their corresponding Wagmi actions** from `@wagmi/core/tempo` (`packages/core/src/tempo/`)\n- Make sure you update `site/tempo/actions/index.md` for new actions\n\n### Query Actions\n\n````md\n# `namespace.action`\n\ndescription\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nimport { tempoTestnet } from 'wagmi/chains'\nexport const config = {} as Config<readonly [typeof tempoTestnet]>\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst result = await Actions.amm.action(config, {\n  foo: '0x...',\n  bar: 123n,\n})\n\nconsole.log('Result:', result)\n// @log: Result: 10500000000000000000n\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Return Type\n\n`bigint`\n\ndescription\n\n## Parameters\n\n### foo\n\n- **Type:** `Address`\n\ndescription\n\n### bar\n\n- **Type:** `bigint`\n\ndescription\n\n### baz (optional)\n\n- **Type:** `Hex`\n\ndescription\n\n## Viem\n\n- [`namespace.action`](https://viem.sh/tempo/actions/namespace.action)\n````\n\n### Mutation Actions\n\n````md\n# `namespace.action`\n\ndescription\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nimport { tempoTestnet } from 'wagmi/chains'\nexport const config = {} as Config<readonly [typeof tempoTestnet]>\n// ---cut---\n// @filename: example.ts\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst result =\n  await Actions.namespace.actionSync(config, {\n    foo: '0x...',\n    bar: 123n,\n  })\n\nconsole.log('Foo:', result.foo)\n// @log: Foo: 5250000000000000000n\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `namespace.action` action and wait for inclusion manually:\n\n```ts\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { Actions } from 'wagmi/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\n\nconst hash = await Actions.namespace.action(config, {\n  foo: '0x...',\n  bar: 123n,\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args: { baz } } \n  = viem_Actions.namespace.action.extractEvent(receipt.logs)\n```\n\n## Return Type\n\ndescription\n\n```ts\ntype ReturnType = {\n  /** description */\n  baz: bigint\n}\n```\n\n## Parameters\n\n### foo\n\n- **Type:** `Address`\n\ndescription\n\n### bar\n\n- **Type:** `bigint`\n\ndescription\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`namespace.action`](https://viem.sh/tempo/actions/namespace.action)\n````\n\n### Watch Actions\n\n````md\n# `namespace.watchAction`\n\ndescription\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nimport { tempoTestnet } from 'wagmi/chains'\nexport const config = {} as Config<readonly [typeof tempoTestnet]>\n// ---cut---\n// @filename: example.ts\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst unwatch = Actions.namespace.watchAction(config, {\n  onAction(args, log) {\n    console.log('args:', args)\n  },\n})\n\n// Later, stop watching\nunwatch()\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Return Type\n\n`() => void`\n\nReturns a function to unsubscribe from the event.\n\n## Parameters\n\n### onAction\n\n- **Type:** `function`\n\n```ts\ndeclare function onBurn(args: Args, log: Log): void\n\ntype Args = {\n  /** description */\n  foo: bigint\n  /** description */\n  barBaz: bigint\n}\n```\n\nCallback to invoke when action occurs.\n\n### fromBlock (optional)\n\n- **Type:** `bigint`\n\nBlock to start listening from.\n\n### onError (optional)\n\n- **Type:** `function`\n\n```ts\ndeclare function onError(error: Error): void\n```\n\nThe callback to call when an error occurred when trying to get for a new block.\n\n### poll (optional)\n\n- **Type:** `true`\n\nEnable polling mode.\n\n### pollingInterval (optional)\n\n- **Type:** `number`\n\nPolling frequency (in ms). Defaults to Client's pollingInterval config.\n\n## Viem\n\n- [`namespace.action`](https://viem.sh/tempo/actions/namespace.action)\n````\n\n## Wagmi Hooks\n\n- **All documentation must be based on their corresponding Wagmi hooks** from `wagmi/tempo` (`packages/react/src/tempo/`)\n- Make sure you update `site/tempo/hooks/index.md` for new actions\n\n### Query Hooks\n\nAn example of a generated hook set can be found in `hooks/amm.useLiquidityBalance.ts`. Template example:\n\n````md\n# `namespace.useHook`\n\ndescription\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\nimport { Hooks } from 'wagmi/tempo'\n\nconst { data: result } = Hooks.namespace.useHook({\n  foo: '0x...',\n  bar: 123n,\n})\n\nconsole.log('Result:', resut)\n// @log: Result: ...\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Return Type\n\nSee [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `namespace.action` Return Type](/tempo/actions/namespace.action#return-type)\n\n## Parameters\n\nSee [Wagmi Action `namespace.action` Parameters](/tempo/actions/namespace.action#parameters)\n\n### query\n\nSee the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters.\n\n## Action\n\n- [`namespace.action`](/tempo/actions/namespace.action)\n````\n\n### Mutation Hooks\n\n````md\n# `namespace.useHook`\n\ndescription\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\nimport { Hooks } from 'wagmi/tempo'\n\nconst actionNameSync = Hooks.namespace.useHookSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nactionNameSync.mutate({\n  foo: '0x...',\n  bar: 123n,\n})\n\nconsole.log('Received baz:', actionNameSync.data?.baz)\n// @log: Received baz: ...\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `amm.burn` action and wait for inclusion manually:\n\n```ts\nimport { Actions } from 'viem/tempo'\nimport { Hooks } from 'wagmi/tempo'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst actionName = Hooks.namespace.useHook()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: actionName.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nactionName.mutate({\n  foo: '0x...',\n  bar: 123n,\n})\n\nif (receipt) {\n  const { args: { baz } } \n    = Actions.namespace.action.extractEvent(receipt.logs)\n}\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `namespace.action` Return Type](/tempo/actions/namespace.action#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `namespace.action` Parameters](/tempo/actions/namespace.action#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`namespace.action`](/tempo/actions/namespace.action)\n````\n\n### Watch Hooks\n\n````md\n# `namespace.useWatchHook`\n\ndescription\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\nimport { Hooks } from 'wagmi/tempo'\n\nHooks.amm.useWatchHook({\n  onAction(args, log) {\n    console.log('args:', args)\n  },\n})\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Parameters\n\nSee [Wagmi Action `namespace.watchAction` Parameters](/tempo/actions/namespace.watchAction#parameters)\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n## Action\n\n- [`namespace.action`](/tempo/actions/namespace.action)\n- [`namespace.watchAction`](/tempo/actions/namespace.watchAction)\n````\n"
  },
  {
    "path": "site/cli/api/commands/generate.md",
    "content": "# generate\n\nGenerates code based on configuration, using `contracts` and `plugins`.\n\n## Usage\n\n```bash\nwagmi generate \n```\n\n## Options\n\n### -c, --config \\<path\\>\n\n`string`\n\nPath to config file.\n\n```bash\nwagmi generate --config wagmi.config.ts\n```\n\n### -r, --root \\<path\\>\n\n`string`\n\nRoot path to resolve config from.\n\n```bash\nwagmi generate --root path/to/root\n```\n\n### -w, --watch\n\n`boolean`\n\nWatch for changes (for plugins that support watch mode).\n\n```bash\nwagmi generate --watch\n```\n\n### -h, --help\n\nDisplays help message.\n\n```bash\nwagmi generate --help\n```"
  },
  {
    "path": "site/cli/api/commands/init.md",
    "content": "# init\n\nCreates configuration file. If TypeScript is detected, the config file will use TypeScript and be named `wagmi.config.ts`. Otherwise, the config file will use JavaScript and be named `wagmi.config.js`.\n\n## Usage\n\n```bash\nwagmi init \n```\n\n## Options\n\n### -c, --config \\<path\\>\n\n`string`\n\nPath to config file.\n\n```bash\nwagmi init --config wagmi.config.ts\n```\n\n### -r, --root \\<path\\>\n\n`string`\n\nRoot path to resolve config from.\n\n```bash\nwagmi init --root path/to/root\n```\n\n### -h, --help\n\nDisplays help message.\n\n```bash\nwagmi init --help\n```\n\n"
  },
  {
    "path": "site/cli/api/commands.md",
    "content": "# Commands\n\n## Available Commands\n\n- [`init`](/cli/api/commands/init) Creates configuration file.\n- [`generate`](/cli/api/commands/generate) Generates code based on configuration, using `contracts` and `plugins`.\n\n## Display Info\n\n### `-h`, `--help`\n\nShow help message when `-h`, `--help` flags appear.\n\n::: code-group\n```bash [pnpm]\npnpm wagmi --help\n```\n\n```bash [npm]\nnpx wagmi --help\n```\n\n```bash [yarn]\nyarn wagmi --help\n```\n\n```bash [bun]\nbun wagmi --help\n```\n:::\n\n### `-v`, `--version`\n\nShow version number when `-v`, `--version` flags appear.\n\n::: code-group\n```bash [pnpm]\npnpm wagmi --version\n```\n\n```bash [npm]\nnpx wagmi --version\n```\n\n```bash [yarn]\nyarn wagmi --version\n```\n\n```bash [bun]\nbun wagmi --version\n```\n:::\n\n"
  },
  {
    "path": "site/cli/api/plugins/actions.md",
    "content": "# actions\n\nPlugin for type-safe VanillaJS actions.\n\n## Import\n\n```ts\nimport { actions } from '@wagmi/cli/plugins'\n```\n\n## Usage\n\n```ts{2,6}\nimport { defineConfig } from '@wagmi/cli'\nimport { actions } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    actions(),\n  ],\n})\n```\n\n## Configuration\n\n```ts\nimport { type ActionsConfig } from '@wagmi/cli/plugins'\n```\n\n### getActionName\n\n`` 'legacy' | ((options: { contractName: string; type: 'read' | 'simulate' | 'watch' | 'write' }) => `use${string}`) ``\n\n- Function for setting custom hook names.\n- Defaults to `` `${type}${contractName}` ``. For example, `readErc20`, `simulateErc20`, `watchErc20Event`, `writeErc20`.\n- When `'legacy'` (deprecated), hook names are set to `@wagmi/cli@1` format.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { actions } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    actions({\n      getActionName({ contractName, type }) { // [!code focus]\n        return `${contractName}__${type}` // [!code focus]\n      }, // [!code focus]\n    }),\n  ],\n})\n```\n\n### overridePackageName\n\n`'@wagmi/core' | 'wagmi'`\n\n- Override detected import source.\n- Defaults to `'wagmi'` or `'@wagmi/core'` depending on which package is installed.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { actions } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    actions({\n      overridePackageName: 'wagmi', // [!code focus]\n    }),\n  ],\n})\n```\n\n"
  },
  {
    "path": "site/cli/api/plugins/blockExplorer.md",
    "content": "# blockExplorer\n\nPlugin for fetching ABIs from block explorers that supports the `?module=contract&action=getabi` API format.\n\n## Import\n\n```ts\nimport { blockExplorer } from '@wagmi/cli/plugins'\n```\n\n## Usage\n\n```ts{2,6-14}\nimport { defineConfig } from '@wagmi/cli'\nimport { blockExplorer } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    blockExplorer({\n      baseUrl: 'https://api.etherscan.io/v2/api',\n      contracts: [\n        {\n          name: 'Wagmigotchi',\n          address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',\n        },\n      ],\n    }),\n  ],\n})\n```\n\n## Configuration\n\n```ts\nimport { type BlockExplorerConfig } from '@wagmi/cli/plugins'\n```\n\n### apiKey\n\n`string | undefined`\n\nAPI key for block explorer. Appended to the request URL as query param `&apikey=${apiKey}`.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { blockExplorer } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    blockExplorer({\n      apiKey: process.env.ETHERSCAN_API_KEY, // [!code focus]\n      baseUrl: 'https://api.etherscan.io/v2/api',\n      contracts: [\n        {\n          name: 'Wagmigotchi',\n          address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',\n        },\n      ],\n    }),\n  ],\n})\n```\n\n### baseUrl\n\n`string`\n\nBase URL for block explorer.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { blockExplorer } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    blockExplorer({\n      baseUrl: 'https://api.etherscan.io/v2/api', // [!code focus]\n      contracts: [\n        {\n          name: 'Wagmigotchi',\n          address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',\n        },\n      ],\n    }),\n  ],\n})\n```\n\n### cacheDuration\n\n`number | undefined`\n\nDuration in milliseconds to cache ABIs. Defaults to `1_800_000` (30 minutes).\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { blockExplorer } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    blockExplorer({\n      baseUrl: 'https://api.etherscan.io/v2/api',\n      cacheDuration: 300_000, // [!code focus]\n      contracts: [\n        {\n          name: 'Wagmigotchi',\n          address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',\n        },\n      ],\n    }),\n  ],\n})\n```\n\n### chainId\n\n`number | undefined`\n\nChain ID for block explorer. Appended to the request URL as query param `&chainId=${chainId}`.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { blockExplorer } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    blockExplorer({\n      apiKey: process.env.ETHERSCAN_API_KEY,\n      baseUrl: 'https://api.etherscan.io/v2/api',\n      chainId: 1, // [!code focus]\n      contracts: [\n        {\n          name: 'Wagmigotchi',\n          address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',\n        },\n      ],\n    }),\n  ],\n})\n```\n\n\n### contracts\n\n`{ name: string; address?: Address | Record<number, Address> | undefined }[]`\n\nContracts to fetch ABIs for.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { blockExplorer } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    blockExplorer({\n      baseUrl: 'https://api.etherscan.io/v2/api',\n      contracts: [ // [!code focus]\n        { // [!code focus]\n          name: 'Wagmigotchi', // [!code focus]\n          address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1', // [!code focus]\n        }, // [!code focus]\n      ], // [!code focus]\n    }),\n  ],\n})\n```\n\n### getAddress\n\n`((config: { address: Address | Record<number, Address> }) => Address) | undefined`\n\n- Function to get address from contract config.\n- Defaults to `({ address }) => typeof address === 'string' ? address : Object.values(address)[0]`.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { blockExplorer } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    blockExplorer({\n      baseUrl: 'https://api.etherscan.io/v2/api',\n      contracts: [\n        {\n          name: 'Wagmigotchi',\n          address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',\n        },\n      ],\n      getAddress({ address }) { // [!code focus]\n        if (typeof address === 'string') return address // [!code focus]\n        return Object.values(address)[0] // [!code focus]\n      }, // [!code focus]\n    }),\n  ],\n})\n```\n\n### name\n\n`string`\n\n- Name of source.\n- Defaults to `'Block Explorer'`.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { blockExplorer } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    blockExplorer({\n      baseUrl: 'https://api.etherscan.io/v2/api',\n      contracts: [\n        {\n          name: 'Wagmigotchi',\n          address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',\n        },\n      ],\n      name: 'Etherscan', // [!code focus]\n    }),\n  ],\n})\n```\n"
  },
  {
    "path": "site/cli/api/plugins/etherscan.md",
    "content": "# etherscan\n\nPlugin for fetching ABIs from [Etherscan](https://etherscan.io) and adding into `contracts` config.\n\n## Import\n\n```ts\nimport { etherscan } from '@wagmi/cli/plugins'\n```\n\n## Usage\n\n```ts{2,6-14}\nimport { defineConfig } from '@wagmi/cli'\nimport { etherscan } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    etherscan({\n      apiKey: process.env.ETHERSCAN_API_KEY,\n      chainId: 1,\n      contracts: [\n        {\n          name: 'Wagmigotchi',\n          address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',\n        },\n      ],\n    }),\n  ],\n})\n```\n\n## Configuration\n\n```ts\nimport { type EtherscanConfig } from '@wagmi/cli/plugins'\n```\n\n### apiKey\n\n`string`\n\nEtherscan API key. Etherscan API keys are specific per network and include testnets (e.g. Ethereum Mainnet and Sepolia share same API key).\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { etherscan } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    etherscan({\n      apiKey: process.env.ETHERSCAN_API_KEY, // [!code focus]\n      chainId: 1,\n      contracts: [\n        {\n          name: 'Wagmigotchi',\n          address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',\n        },\n      ],\n    }),\n  ],\n})\n```\n\n### cacheDuration\n\n`number | undefined`\n\n- Duration in milliseconds to cache ABIs.\n- Defaults to `1_800_000` (30 minutes).\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { etherscan } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    etherscan({\n      apiKey: process.env.ETHERSCAN_API_KEY,\n      cacheDuration: 300_000, // [!code focus]\n      chainId: 1,\n      contracts: [\n        {\n          name: 'Wagmigotchi',\n          address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',\n        },\n      ],\n    }),\n  ],\n})\n```\n\n### chainId\n\n`number`\n\nChain ID to use for fetching ABI. If [`address`](/cli/config/options#address) is an object, `chainId` is used to select the address.\n\nView supported chains on the [Etherscan docs](https://docs.etherscan.io/etherscan-v2/getting-started/supported-chains).\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { etherscan } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    etherscan({\n      apiKey: process.env.ETHERSCAN_API_KEY,\n      chainId: 1, // [!code focus]\n      contracts: [\n        {\n          name: 'Wagmigotchi',\n          address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',\n        },\n        {\n          name: 'EnsRegistry',\n          address: {\n            1: '0x314159265dd8dbb310642f98f50c066173c1259b',\n            5: '0x112234455c3a32fd11230c42e7bccd4a84e02010',\n          },\n        },\n      ],\n    }),\n  ],\n})\n```\n\n### contracts\n\n`{ name: string; address?: Address | Record<number, Address> | undefined }[]`\n\nContracts to fetch ABIs for.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { etherscan } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    etherscan({\n      apiKey: process.env.ETHERSCAN_API_KEY,\n      chainId: 1,\n      contracts: [ // [!code focus]\n        { // [!code focus]\n          name: 'Wagmigotchi', // [!code focus]\n          address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1', // [!code focus]\n        }, // [!code focus]\n      ], // [!code focus]\n    }),\n  ],\n})\n```\n\n### tryFetchProxyImplementation\n\n`boolean | undefined`\n\n- Whether to try fetching proxy implementation address of the contract.\n- Defaults to `false`.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { etherscan } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    etherscan({\n      apiKey: process.env.ETHERSCAN_API_KEY,\n      chainId: 1,\n      contracts: [\n        {\n          name: 'FiatToken',\n          address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n        },\n      ],\n      tryFetchProxyImplementation: true, // [!code focus]\n    }),\n  ],\n})\n```\n\n\n"
  },
  {
    "path": "site/cli/api/plugins/fetch.md",
    "content": "# fetch\n\nPlugin for fetching and parsing ABIs from network resource with `fetch`.\n\n## Import\n\n```ts\nimport { fetch } from '@wagmi/cli/plugins'\n```\n\n## Usage\n\n```ts{2,6-23}\nimport { defineConfig } from '@wagmi/cli'\nimport { fetch } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    fetch({\n      contracts: [\n        {\n          name: 'Wagmigotchi',\n          address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',\n        },\n      ],\n      request(contract) {\n        if (!contract.address) throw new Error('address is required')\n        const address =\n          typeof contract.address === 'string'\n            ? contract.address\n            : Object.values(contract.address)[0]\n        return {\n          url: `https://api.etherscan.io/api?module=contract&action=getabi&address=${address}`,\n        }\n      },\n    }),\n  ],\n})\n```\n\n\n## Configuration\n\n```ts\nimport { type FetchConfig } from '@wagmi/cli/plugins'\n```\n\n### cacheDuration\n\n`number | undefined`\n\n- Duration in milliseconds to cache ABIs.\n- Defaults to `1_800_000` (30 minutes).\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { fetch } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    fetch({\n      cacheDuration: 300_000, // [!code focus]\n      contracts: [\n        {\n          name: 'Wagmigotchi',\n          address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',\n        },\n      ],\n      request(contract) {\n        if (!contract.address) throw new Error('address is required')\n        const address =\n          typeof contract.address === 'string'\n            ? contract.address\n            : Object.values(contract.address)[0]\n        return {\n          url: `https://api.etherscan.io/api?module=contract&action=getabi&address=${address}`,\n        }\n      },\n    }),\n  ],\n})\n```\n\n### contracts\n\n`{ name: string; address?: Address | Record<number, Address> | undefined }[]`\n\nContracts to fetch ABIs for.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { fetch } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    fetch({\n      contracts: [ // [!code focus]\n        { // [!code focus]\n          name: 'Wagmigotchi', // [!code focus]\n          address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1', // [!code focus]\n        }, // [!code focus]\n      ], // [!code focus]\n      request(contract) {\n        if (!contract.address) throw new Error('address is required')\n        const address =\n          typeof contract.address === 'string'\n            ? contract.address\n            : Object.values(contract.address)[0]\n        return {\n          url: `https://api.etherscan.io/api?module=contract&action=getabi&address=${address}`,\n        }\n      },\n    }),\n  ],\n})\n\n```\n\n### getCacheKey\n\n`((config: { contract: { address: Address | Record<chainId, Address> | undefined; name: string } }) => string) | undefined`\n\n- Function for creating a cache key for contract. Contract data is cached at `~/.wagmi-cli/plugins/fetch/cache/`.\n- Defaults to `({ contract }) => JSON.stringify(contract)`.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { fetch } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    fetch({\n      contracts: [\n        {\n          name: 'wagmigotchi',\n          address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',\n        },\n      ],\n      getCacheKey({ contract }) { // [!code focus]\n        if (typeof contract.address === 'string') // [!code focus]\n          return `${name}:${contract.address}` // [!code focus]\n        return `${name}:${JSON.stringify(contract.address)}` // [!code focus]\n      }, // [!code focus]\n      request(contract) {\n        if (!contract.address) throw new Error('address is required')\n        const address =\n          typeof contract.address === 'string'\n            ? contract.address\n            : Object.values(contract.address)[0]\n        return {\n          url: `https://api.etherscan.io/api?module=contract&action=getabi&address=${address}`,\n        }\n      },\n    }),\n  ],\n})\n\n```\n\n### name\n\n`string`\n\n- Name of source.\n- Defaults to `'Fetch'`.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { fetch } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    fetch({\n      contracts: [\n        {\n          name: 'Wagmigotchi',\n          address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',\n        },\n      ],\n      name: 'Etherscan', // [!code focus]\n      request(contract) {\n        if (!contract.address) throw new Error('address is required')\n        const address =\n          typeof contract.address === 'string'\n            ? contract.address\n            : Object.values(contract.address)[0]\n        return {\n          url: `https://api.etherscan.io/api?module=contract&action=getabi&address=${address}`,\n        }\n      },\n    }),\n  ],\n})\n```\n\n### parse\n\n`((config: { response: Response }) => Abi | Promise<Abi>) | undefined`\n\n- Function for parsing ABI from fetch response.\n- Defaults to `({ response }) => response.json()`\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { fetch } from '@wagmi/cli/plugins'\n \nexport default defineConfig({\n  plugins: [\n    fetch({\n      contracts: [\n        {\n          name: 'Wagmigotchi',\n          address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',\n        },\n      ],\n      async parse({ response }) { // [!code focus]\n        const json = await response.json() // [!code focus]\n        if (json.status === '0') throw new Error(json.message) // [!code focus]\n        return json.result // [!code focus]\n      }, // [!code focus]\n      request(contract) {\n        if (!contract.address) throw new Error('address is required')\n        const address =\n          typeof contract.address === 'string'\n            ? contract.address\n            : Object.values(contract.address)[0]\n        return {\n          url: `https://api.etherscan.io/api?module=contract&action=getabi&address=${address}`,\n        }\n      },\n    }),\n  ],\n})\n```\n\n### request\n\n`(config: { address?: Address | Record<chainId, Address> | undefined }) => { url: RequestInfo; init?: RequestInit | undefined } | Promise<{ url: RequestInfo; init?: RequestInit | undefined }>`\n\nFunction for returning a request to fetch ABI from.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { fetch } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    fetch({\n      contracts: [\n        {\n          name: 'Wagmigotchi',\n          address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',\n        },\n      ],\n      request(contract) { // [!code focus]\n        if (!contract.address) throw new Error('address is required') // [!code focus]\n        const address = // [!code focus]\n          typeof contract.address === 'string' // [!code focus]\n            ? contract.address // [!code focus]\n            : Object.values(contract.address)[0] // [!code focus]\n        return { // [!code focus]\n          url: `https://api.etherscan.io/api?module=contract&action=getabi&address=${address}`, // [!code focus]\n        } // [!code focus]\n      }, // [!code focus]\n    }),\n  ],\n})\n\n```\n"
  },
  {
    "path": "site/cli/api/plugins/foundry.md",
    "content": "# foundry\n\nPlugin for resolving ABIs from [Foundry](https://github.com/foundry-rs/foundry) projects. Supports [`watch`](/cli/api/commands/generate#w-watch) mode.\n\n## Import\n\n```ts\nimport { foundry } from '@wagmi/cli/plugins'\n```\n\n## Usage\n\n```ts{2,6-8}\nimport { defineConfig } from '@wagmi/cli'\nimport { foundry } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    foundry({\n      project: '../hello_foundry',\n    }),\n  ],\n})\n```\n\n## Configuration\n\n```ts\nimport { type FoundryConfig } from '@wagmi/cli/plugins'\n```\n\n### artifacts\n\n`string | undefined`\n\n- Project's artifacts directory. Same as your `foundry.toml`/`forge`s `--out` (`-o`) option.\n- Defaults to `'out/'`.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { foundry } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    foundry({\n      artifacts: 'out/', // [!code focus]\n    }),\n  ],\n})\n```\n\n### includeBroadcasts\n\n`boolean | undefined`\n\nAutomatically detect contract deployments from Foundry's `run-latest.json` files in the `broadcast/` directory.\n\n- The `deployments` mapping can be used to override broadcast deployments for the same contract.\n- Broadcasts are read once when `wagmi generate` runs. To pick up new broadcast deployments after running deploy scripts, rerun the generate command.\n- Defaults to `false`.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { foundry } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    foundry({\n      includeBroadcasts: true, // [!code focus]\n    }),\n  ],\n})\n```\n\n### deployments\n\n`{ [key: string]: address?: Address | Record<chainId, Address> | undefined } | undefined`\n\nMapping of addresses to attach to artifacts.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { foundry } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    foundry({\n      deployments: { // [!code focus]\n        Counter: { // [!code focus]\n          1: '0x314159265dd8dbb310642f98f50c066173c1259b', // [!code focus]\n          5: '0x112234455c3a32fd11230c42e7bccd4a84e02010', // [!code focus]\n        }, // [!code focus]\n      }, // [!code focus]\n    }),\n  ],\n})\n```\n\n### exclude\n\n`string[] | undefined`\n\nArtifact files to exclude relative to `artifacts`. Supports glob patterns.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { foundry } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    foundry({\n      exclude: [ // [!code focus]\n        // the following patterns are excluded by default // [!code focus]\n        'Common.sol/**', // [!code focus]\n        'Components.sol/**', // [!code focus]\n        'Script.sol/**', // [!code focus]\n        'StdAssertions.sol/**', // [!code focus]\n        'StdInvariant.sol/**', // [!code focus]\n        'StdError.sol/**', // [!code focus]\n        'StdCheats.sol/**', // [!code focus]\n        'StdMath.sol/**', // [!code focus]\n        'StdJson.sol/**', // [!code focus]\n        'StdStorage.sol/**', // [!code focus]\n        'StdUtils.sol/**', // [!code focus]\n        'Vm.sol/**', // [!code focus]\n        'console.sol/**', // [!code focus]\n        'console2.sol/**', // [!code focus]\n        'test.sol/**', // [!code focus]\n        '**.s.sol/*.json', // [!code focus]\n        '**.t.sol/*.json', // [!code focus]\n      ], // [!code focus]\n    }),\n  ],\n})\n```\n\n### forge\n\n`{ clean?: boolean | undefined; build?: boolean | undefined; path?: string | undefined; rebuild?: boolean | undefined } | undefined`\n\nOptions for `forge`.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { foundry } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    foundry({\n      forge: {  // [!code focus]\n        clean: true,  // [!code focus]\n        build: true,  // [!code focus]\n        path: 'path/to/forge',  // [!code focus]\n        rebuild: true,  // [!code focus]\n      },  // [!code focus]\n    }),\n  ],\n})\n```\n\n#### clean\n\n- Remove build artifacts and cache directories on start up.\n- Defaults to `false`.\n\n#### build\n\n- Build Foundry project before fetching artifacts.\n- Defaults to `true`.\n\n#### path\n\n- Path to `forge` executable command.\n- Defaults to `forge`.\n\n#### rebuild\n\n- Rebuild every time a watched file or directory is changed. Used for setting up [`watch`](/cli/api/commands/generate#w-watch) mode.\n- Defaults to `true`.\n\n### include\n\n`string[] | undefined`\n\nArtifact files to include relative to `artifacts`. Supports glob patterns.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { foundry } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    foundry({\n      include: [  // [!code focus]\n        // the following patterns are included by default  // [!code focus]\n        '*.json',  // [!code focus]\n      ],  // [!code focus]\n    }),\n  ],\n})\n```\n\n### namePrefix\n\n`string | undefined`\n\nPrefix to prepend to artifact names. Useful for preventing name collisions between contracts from other sources.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { foundry } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    foundry({  // [!code focus]\n      namePrefix: 'HelloFoundry',  // [!code focus]\n    }),  // [!code focus]\n  ],\n})\n```\n\n### project\n\n`string | undefined`\n\n- Path to Foundry project.\n- Defaults to Foundry configuration using `forge config --json` command.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { foundry } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    foundry({ // [!code focus]\n      project: '../hello_foundry', // [!code focus]\n    }), // [!code focus]\n  ],\n})\n```"
  },
  {
    "path": "site/cli/api/plugins/hardhat.md",
    "content": "# hardhat\n\nPlugin for resolving ABIs from [Hardhat](https://hardhat.org) projects. Supports [`watch`](/cli/api/commands/generate#w-watch) mode.\n\n```ts\nimport { hardhat } from '@wagmi/cli/plugins'\n```\n\n## Usage\n\n```ts{2,6-8}\nimport { defineConfig } from '@wagmi/cli'\nimport { hardhat } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    hardhat({\n      project: '../hello_hardhat',\n    }),\n  ],\n})\n```\n\n## Configuration\n\n```ts\nimport { type HardhatConfig } from '@wagmi/cli/plugins'\n```\n\n### artifacts\n\n`string | undefined`\n\n- Project's artifacts directory. Same as your project's `artifacts` [path configuration](https://hardhat.org/hardhat-runner/docs/config#path-configuration) option.\n- Defaults to `'artifacts/'`.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { hardhat } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    hardhat({\n      artifacts: 'out/', // [!code focus]\n      project: '../hello_hardhat',\n    }),\n  ],\n})\n```\n\n### deployments\n\n`{ [key: string]: address?: Address | Record<chainId, Address> | undefined } | undefined`\n\nMapping of addresses to attach to artifacts.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { hardhat } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    hardhat({\n      project: '../hello_hardhat',\n      deployments: { // [!code focus]\n        Counter: { // [!code focus]\n          1: '0x314159265dd8dbb310642f98f50c066173c1259b', // [!code focus]\n          5: '0x112234455c3a32fd11230c42e7bccd4a84e02010', // [!code focus]\n        }, // [!code focus]\n      }, // [!code focus]\n    }),\n  ],\n})\n```\n\n### exclude\n\n`string[] | undefined`\n\nArtifact files to exclude relative to `artifacts`. Supports glob patterns.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { hardhat } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    hardhat({\n      exclude: [ // [!code focus]\n        // the following patterns are excluded by default // [!code focus]\n        'build-info/**', // [!code focus]\n        '*.dbg.json', // [!code focus]\n      ], // [!code focus]\n      project: '../hello_hardhat',\n    }),\n  ],\n})\n```\n\n### commands\n\n`{ clean?: string | boolean | undefined; build?: string | boolean | undefined; rebuild?: string | boolean | undefined } | undefined`\n\nHardhat command options.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { hardhat } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    hardhat({\n      commands: { // [!code focus]\n        clean: 'pnpm hardhat clean', // [!code focus]\n        build: 'pnpm hardhat compile', // [!code focus]\n        rebuild: 'pnpm hardhat compile', // [!code focus]\n      }, // [!code focus]\n      project: '../hello_hardhat',\n    }),\n  ],\n})\n```\n\n#### clean\n\n- Remove build artifacts and cache directories on start up.\n- Defaults to `'${packageManger} hardhat clean'`.\n\n#### build\n\n- Build Foundry project before fetching artifacts.\n- Defaults to `'${packageManger} hardhat compile'`.\n\n#### rebuild\n\n- Command to run when watched file or directory is changed. Used for setting up [`watch`](/cli/api/commands/generate#w-watch) mode.\n- Defaults to `'${packageManger} hardhat compile'`.\n\n### include\n\n`string[] | undefined`\n\nArtifact files to include relative to `artifacts`. Supports glob patterns.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { hardhat } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    hardhat({\n      include: [ // [!code focus]\n        // the following patterns are included by default // [!code focus]\n        '*.json', // [!code focus]\n      ], // [!code focus]\n      project: '../hello_hardhat',\n    }),\n  ],\n})\n```\n\n### namePrefix\n\n`string | undefined`\n\nPrefix to prepend to artifact names. Useful for preventing name collisions between contracts from other sources.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { hardhat } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    hardhat({\n      namePrefix: 'HelloHardhat', // [!code focus]\n      project: '../hello_hardhat',\n    }),\n  ],\n})\n```\n\n### project\n\n`string`\n\nPath to Hardhat project.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { hardhat } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    hardhat({\n      project: '../hello_hardhat', // [!code focus]\n    }),\n  ],\n})\n```"
  },
  {
    "path": "site/cli/api/plugins/react.md",
    "content": "# react\n\nPlugin for generating type-safe [Wagmi Hooks](/react/api/hooks).\n\n## Import\n\n```ts\nimport { react } from '@wagmi/cli/plugins'\n```\n\n## Usage\n\n```ts{2,6}\nimport { defineConfig } from '@wagmi/cli'\nimport { react } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    react(),\n  ],\n})\n```\n\n## Configuration\n\n```ts\nimport { type ReactConfig } from '@wagmi/cli/plugins'\n```\n\n### abiItemHooks\n\n- Boolean flag to generate abi item hooks (e.g. hooks for each abi function and events).\n- Defaults to `true`.\n\n```ts\nplugins: [\n  react({ abiItemHooks: false }), // [!code focus]\n],\n```\n\n### getHookName\n\n`` 'legacy' | ((options: { contractName: string; type: 'read' | 'simulate' | 'watch' | 'write' }) => `use${string}`) ``\n\n- Function for setting custom hook names.\n- Defaults to `` `use${type}${contractName}` ``. For example, `useReadErc20`, `useSimulateErc20`, `useWatchErc20Event`, `useWriteErc20`.\n- When `'legacy'` (deprecated), hook names are set to `@wagmi/cli@1` format.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { react } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    react({\n      getHookName({ contractName, type }) { // [!code focus]\n        return `use${contractName}__${type}` // [!code focus]\n      }, // [!code focus]\n    }),\n  ],\n})\n```\n\n"
  },
  {
    "path": "site/cli/api/plugins/sourcify.md",
    "content": "# sourcify\n\nPlugin for fetching ABIs from [Sourcify](https://sourcify.dev/). Sourcify is a decentralized, open-source, smart contract verification and metadata repository.\n\n## Import\n\n```ts\nimport { sourcify } from '@wagmi/cli/plugins'\n```\n\n## Usage\n\n```ts{2,6-13}\nimport { defineConfig } from '@wagmi/cli'\nimport { sourcify } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    sourcify({\n      contracts: [\n        {\n          name: 'deposit',\n          address: '0x00000000219ab540356cbb839cbe05303d7705fa',\n        },\n      ],\n    }),\n  ],\n})\n```\n\n## Configuration\n\n```ts\nimport { type SourcifyConfig } from '@wagmi/cli/plugins'\n```\n\n### cacheDuration\n\n`number | undefined`\n\n- Duration in milliseconds to cache ABIs.\n- Defaults to `1_800_000` (30 minutes).\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { sourcify } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    sourcify({\n      cacheDuration: 300_000, // [!code focus]\n      chainId: 100,\n      contracts: [\n        {\n          name: 'Deposit',\n          address: '0x00000000219ab540356cbb839cbe05303d7705fa',\n        },\n      ],\n    }),\n  ],\n})\n```\n\n### chainId\n\n`number`\n\nChain ID to use for fetching ABI. If `address` is an object, `chainId` is used to select the address. See [Sourcify docs](https://docs.sourcify.dev/docs/chains) for supported chains.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { sourcify } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    sourcify({\n      chainId: 100, // [!code focus]\n      contracts: [\n        {\n          name: 'Community',\n          address: {\n            100: '0xC4c622862a8F548997699bE24EA4bc504e5cA865',\n            137: '0xC4c622862a8F548997699bE24EA4bc504e5cA865',\n          },\n        },\n      ],\n    }),\n  ],\n})\n```\n\n### contracts\n\n`{ name: string; address?: Address | Record<number, Address> | undefined }[]`\n\nContracts to fetch ABIs for.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { sourcify } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    sourcify({\n      chainId: 100,\n      contracts: [ // [!code focus]\n        { // [!code focus]\n          name: 'Deposit', // [!code focus]\n          address: '0x00000000219ab540356cbb839cbe05303d7705fa', // [!code focus]\n        }, // [!code focus]\n      ], // [!code focus]\n    }),\n  ],\n})\n```\n"
  },
  {
    "path": "site/cli/api/plugins.md",
    "content": "# Plugins\n\nPlugins for managing ABIs, generating code, and more.\n\n## Import\n\nImport via the `'@wagmi/cli/plugins'` entrypoint.\n\n```ts\nimport { etherscan } from '@wagmi/cli/plugins'\n```\n\n## Available Plugins\n\n- [`actions`](/cli/api/plugins/actions) Generate type-safe VanillaJS actions from configuration `contracts`.\n- [`blockExplorer`](/cli/api/plugins/blockExplorer) Fetch ABIs from Block Explorers that support `?module=contract&action=getabi`.\n- [`etherscan`](/cli/api/plugins/etherscan) Fetch ABIs from Etherscan and add into configuration.\n- [`fetch`](/cli/api/plugins/fetch) Fetch and parse ABIs from network resource with `fetch`.\n- [`foundry`](/cli/api/plugins/foundry) Generate ABIs and watch for Foundry project changes.\n- [`hardhat`](/cli/api/plugins/hardhat) Generate ABIs and watch for Hardhat projects changes.\n- [`react`](/cli/api/plugins/react) Generate type-safe React Hooks from configuration `contracts`.\n- [`sourcify`](/cli/api/plugins/sourcify) Fetch ABIs from Sourcify from configuration `contracts`.\n\n## Create Plugin\n\nCreating plugins to hook into the CLI is quite simple. Plugins most commonly inject contracts into `contracts` config, e.g. [`etherscan`](/cli/api/plugins/etherscan), and/or generate code using the `run` option, e.g. [`react`](/cli/api/plugins/react). All you need to do is write a function that returns the `Plugin` type.\n\n```ts{3-8}\nimport { type Plugin, defineConfig } from '@wagmi/cli'\n\nfunction myPlugin(): Plugin {\n  // `name` is the only required property.\n  name: 'MyPlugin',\n  // You likely want to at least include `contracts` or `run`.\n  // ...\n}\n\nexport default defineConfig({\n  out: 'src/generated.ts',\n  plugins: [myPlugin()],\n})\n```\n"
  },
  {
    "path": "site/cli/config/configuring-cli.md",
    "content": "# Configuring CLI\n\nWhen running `wagmi` from the command line, `@wagmi/cli` will automatically try to resolve a config file named `wagmi.config.js` or `wagmi.config.ts` inside the project root. The most basic config file looks like this:\n\n::: code-group\n```js [wagmi.config.js]\nexport default {\n  // config options\n}\n```\n:::\n\nNote `@wagmi/cli` supports using ES modules syntax in the config file even if the project is not using native Node ESM, e.g. `\"type\": \"module\"` in package.json. In this case, the config file is auto pre-processed before load.\n\nYou can also explicitly specify a config file to use with the `--config`/`-c` CLI option (resolved relative to the current directory):\n\n```bash\nwagmi --config my-config.js\n```\n\nTo scaffold a config file quickly, check out the [`init`](/cli/api/commands/init) command.\n\n## Config Intellisense\n\nSince Wagmi CLI ships with TypeScript typings, you can use your editor's intellisense with [JSDoc](https://jsdoc.app) type hints:\n\n::: code-group\n```js [wagmi.config.js]\n/** @type {import('@wagmi/cli').Config} */\nexport default {\n  // ...\n}\n```\n:::\n\nAlternatively, you can use the `defineConfig` utility which should provide intellisense without the need for JSDoc annotations:\n\n::: code-group\n```js [wagmi.config.js]\nimport { defineConfig } from '@wagmi/cli'\n\nexport default defineConfig({\n  // ...\n})\n```\n:::\n\nWagmi CLI also directly supports TypeScript config files. You can use `wagmi.config.ts` with the `defineConfig` helper as well.\n\n## Conditional Config\n\nIf the config needs to conditionally determine options based on the environment, it can export a function instead:\n\n::: code-group\n```js [wagmi.config.js]\nexport default defineConfig(() => {\n  if (process.env.NODE_ENV === 'dev') {\n    return {\n      // dev specific config\n    }\n  } else {\n    return {\n      // production specific config\n    }\n  }\n})\n```\n:::\n\n## Async Config\n\nIf the config needs to call async function, it can export a async function instead:\n\n::: code-group\n```js [wagmi.config.js]\nexport default defineConfig(async () => {\n  const data = await asyncFunction()\n  return {\n    // ...\n  }\n})\n```\n:::\n\nThis can be useful for resolving external resources from the network or filesystem that are required for configuration ahead of running a command.\n\n## Array Config\n\nThe config can also be represented either as a pre-defined array or returned as an array from a function:\n\n::: code-group\n```js [wagmi.config.js]\nexport default defineConfig([\n  {\n  // config 1\n  },\n  {\n  // config 2\n  },\n])\n```\n:::\n\n## Environment Variables\n\nEnvironmental Variables can be obtained from `process.env` as usual.\n\nNote that Wagmi CLI doesn't load `.env` files by default as the files to load can only be determined after evaluating the config. However, you can use the exported `loadEnv` utility to load the specific `.env` files if needed.\n\n::: code-group\n```js [wagmi.config.js]\nimport { defineConfig, loadEnv } from '@wagmi/cli'\n\nexport default defineConfig(() => {\n  const env = loadEnv({\n    mode: process.env.NODE_ENV,\n    envDir: process.cwd(),\n  })\n  return {\n    // ...\n  }\n})\n```\n:::"
  },
  {
    "path": "site/cli/config/options.md",
    "content": "# Config Options\n\nConfiguration options for Wagmi CLI.\n\n## contracts\n\n`ContractConfig[] | undefined`\n\nArray of contracts to use when running [commands](/cli/api/commands). `abi` and `name` are required, all other properties are optional.\n\n### address\n\n`Address | Record<chainId, Address> | undefined`\n\nContract address or addresses. Accepts an object `{ [chainId]: address }` for targeting specific chains.\n\n::: code-group\n```ts {6,11-14} [wagmi.config.ts]\nexport default {\n  out: 'src/generated.ts',\n  contracts: [\n    {\n      abi: […],\n      address: '0x…',\n      name: 'MyCoolContract',\n    },\n    {\n      abi: […],\n      address: {\n        1: '0xfoo…',\n        5: '0xbar…',\n      },\n      name: 'MyCoolMultichainContract'\n    }\n  ],\n}\n```\n:::\n\n### abi\n\n`Abi`\n\nABI for contract. Used by [plugins](/cli/api/plugins) to generate code base on properties.\n\n::: code-group\n```ts {5} [wagmi.config.ts]\nexport default {\n  out: 'src/generated.ts',\n  contracts: [\n    {\n      abi: […],\n      name: 'MyCoolContract'\n    },\n  ],\n}\n```\n:::\n\n### name\n\n`string`\n\nName of contract. Must be unique. Used by [plugins](/cli/api/plugins) to name generated code.\n\n::: code-group\n```ts {6} [wagmi.config.ts]\nexport default {\n  out: 'src/generated.ts',\n  contracts: [\n    {\n      abi: […],\n      name: 'MyCoolContract'\n    },\n  ],\n}\n```\n:::\n\n## out\n\n`string`\n\nPath to output generated code. Must be unique per config. Use an [Array Config](/cli/config/configuring-cli#array-config) for multiple outputs.\n\n::: code-group\n```ts {2} [wagmi.config.ts]\nexport default {\n  out: 'src/generated.ts',\n  contracts: [\n    {\n      abi: […],\n      name: 'MyCoolContract'\n    },\n  ],\n}\n```\n:::\n\n## plugins\n\n`Plugin[] | undefined`\n\nPlugins to use and their configuration.\n\nWagmi CLI has multiple [built-in plugins](/cli/api/plugins) that are used to manage ABIs, generate code, etc.\n\n::: code-group\n```ts {1,5-20} [wagmi.config.ts]\nimport { etherscan, react } from '@wagmi/cli/plugins'\n\nexport default {\n  out: 'src/generated.js',\n  plugins: [\n    etherscan({\n      apiKey: process.env.ETHERSCAN_API_KEY,\n      chainId: 5,\n      contracts: [\n        {\n          name: 'EnsRegistry',\n          address: {\n            1: '0x314159265dd8dbb310642f98f50c066173c1259b',\n            5: '0x112234455c3a32fd11230c42e7bccd4a84e02010',\n          },\n        },\n      ],\n    }),\n    react(),\n  ],\n}\n```\n:::\n"
  },
  {
    "path": "site/cli/create-wagmi.md",
    "content": "# create-wagmi\n\n## Overview\n\ncreate-wagmi is a command line interface (CLI) for scaffolding new Wagmi projects.\n\n## Usage\n\n::: code-group\n```bash [pnpm]\npnpm create wagmi\n```\n```bash [npm]\nnpm create wagmi@latest\n```\n```bash [yarn]\nyarn create wagmi\n```\n```bash [bun]\nbun create wagmi\n```\n:::\n\n## Options\n\n### `-t`, `--template`\n\nYou can specify a custom [template](#templates) by passing the `--template`/`-t` flag:\n\n::: code-group\n```bash [pnpm]\npnpm create wagmi --template next\n```\n```bash [npm]\nnpm create wagmi@latest --template next\n```\n```bash [yarn]\nyarn create wagmi --template next\n```\n```bash [bun]\nbun create wagmi --template next\n```\n:::\n\n### `--bun`/`--npm`/`--pnpm`/`--yarn`\n\nUse a specific package manager to install dependencies. By default, `create-wagmi` will use the package manager you used to run the command.\n\n### `-h`, `--help`\n\nPrints the help message.\n\n### `-v`, `--version`\n\nPrints the CLI version.\n\n## Templates\n\n`create-wagmi` currently comes with the following templates:\n\n- `next`: A Next.js Wagmi project.\n- `nuxt`: A Nuxt Wagmi project.\n- `vite-react`: A Vite (React) Wagmi project.\n- `vite-vanilla`: A Vite Wagmi Core project.\n- `vite-vue`: A Vite (Vue) Wagmi project.\n\nIf you do not specify the template on the command line, you will be prompted to select a framework and variant.\n\n- **React** : A React project.\n  - **Vite** : A React + Vite Wagmi project (`vite-react`).\n  - **Next** : A React + Next Wagmi project (`next`).\n- **Vue**: A Vue project.\n  - **Vite**: A Vue + Vite Wagmi project (`vite-vue`).\n  - **Nuxt**: A Vue + Nuxt Wagmi project (`nuxt`).\n- **Vanilla**: A Vite Wagmi project without React (`vite-vanilla`).\n"
  },
  {
    "path": "site/cli/getting-started.md",
    "content": "# Getting Started\n\n## Overview\n\nWagmi CLI is a command line interface for managing ABIs (from Etherscan/block explorers, Foundry/Hardhat projects, etc.), generating code (e.g. React Hooks), and much more. It makes working with Ethereum easier by automating manual work so you can build faster. You can learn more about the rationale behind the project in the [Why Wagmi CLI](/cli/why) section.\n\n## Manual Installation\n\nTo manually add Wagmi CLI to your project, install the required packages.\n\n::: code-group\n```bash [pnpm]\npnpm add -D @wagmi/cli\n```\n\n```bash [npm]\nnpm install --save-dev @wagmi/cli\n```\n\n```bash [yarn]\nyarn add -D @wagmi/cli\n```\n\n```bash [bun]\nbun add -D @wagmi/cli\n```\n:::\n\n## Create Config File\n\nRun the `init` command to generate a configuration file: either `wagmi.config.ts` if TypeScript is detected, otherwise `wagmi.config.js`. You can also create the configuration file manually. See [Configuring CLI](/cli/config/configuring-cli) for more info.\n\n::: code-group\n```bash [pnpm]\npnpm wagmi init\n```\n\n```bash [npm]\nnpx wagmi init\n```\n\n```bash [yarn]\nyarn wagmi init\n```\n\n```bash [bun]\nbun wagmi init\n```\n:::\n\nThe generated configuration file will look something like this:\n\n::: code-group\n```ts [wagmi.config.ts]\nimport { defineConfig } from '@wagmi/cli'\n\nexport default defineConfig({\n  out: 'src/generated.ts',\n  contracts: [],\n  plugins: [],\n})\n```\n:::\n\n## Add Contracts And Plugins\n\nOnce the configuration file is set up, you can add contracts and plugins to it. These contracts and plugins are used to manage ABIs (fetch from block explorers, resolve from the file system, etc.), generate code (React hooks, etc.), and much more!\n\nFor example, we can add the ERC-20 contract from Viem, and the [`etherscan`](/cli/api/plugins/etherscan) and [`react`](/cli/api/plugins/react) plugins.\n\n::: code-group\n```ts{2,3,9-12,15-27,28} [wagmi.config.ts]\nimport { defineConfig } from '@wagmi/cli'\nimport { etherscan, react } from '@wagmi/cli/plugins'\nimport { erc20Abi } from 'viem'\nimport { mainnet, sepolia } from 'wagmi/chains'\n \nexport default defineConfig({\n  out: 'src/generated.ts',\n  contracts: [\n    {\n      name: 'erc20',\n      abi: erc20Abi,\n    },\n  ],\n  plugins: [\n    etherscan({\n      apiKey: process.env.ETHERSCAN_API_KEY!,\n      chainId: mainnet.id,\n      contracts: [\n        {\n          name: 'EnsRegistry',\n          address: {\n            [mainnet.id]: '0x314159265dd8dbb310642f98f50c066173c1259b',\n            [sepolia.id]: '0x112234455c3a32fd11230c42e7bccd4a84e02010',\n          },\n        },\n      ],\n    }),\n    react(),\n  ],\n})\n```\n:::\n\n## Run Code Generation\n\nNow that we added a few contracts and plugins to the configuration file, we can run the [`generate`](/cli/api/commands/generate) command to resolve ABIs and generate code to the `out` file.\n\n::: code-group\n```bash [pnpm]\npnpm wagmi generate\n```\n\n```bash [npm]\nnpx wagmi generate\n```\n\n```bash [yarn]\nyarn wagmi generate\n```\n\n```bash [bun]\nbun wagmi generate\n```\n:::\n\nIn this example, the `generate` command will do the following:\n\n- Validate the `etherscan` and `react` plugins\n- Fetch and cache the ENS Registry ABI from the Mainnet Etherscan API\n- Pull in the `erc20Abi` using the name `'ERC20'`\n- Generate React Hooks for both ABIs\n- Save ABIs, ENS Registry deployment addresses, and React Hooks to the `out` file\n\n## Use Generated Code\n\nOnce `out` is created, you can start using the generated code in your project.\n\n```ts\nimport { useReadErc20, useReadErc20BalanceOf } from './generated'\n\n// Use the generated ERC-20 read hook\nconst { data } = useReadErc20({\n  address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n  functionName: 'balanceOf',\n  args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],\n})\n\n// Use the generated ERC-20 \"balanceOf\" hook\nconst { data } = useReadErc20BalanceOf({\n  address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n  args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],\n})\n```\n\n::: tip\nInstead of committing the `out` file, you likely want to add `out` to your `.gitignore` and run `generate` during the build process or before you start your dev server in a `\"predev\"` script.\n:::\n\n## Next Steps\n\nFor more information on what to do next, check out the following topics.\n\n- [**Configuring CLI**](/cli/config/configuring-cli) Learn how to configure the CLI to work best for your project.\n- [**Commands**](/cli/api/commands) Learn more about the CLI commands and how to use them.\n- [**Plugins**](/cli/api/plugins) Browse the collection of plugins and set them up with your config.\n"
  },
  {
    "path": "site/cli/guides/migrate-from-v1-to-v2.md",
    "content": "---\ntitle: Migrate from v1 to v2\ntitleTemplate: Wagmi CLI\ndescription: Guide for migrating from Wagmi CLI v1 to v2.\n---\n\n# Migrate from v1 to v2\n\nTo get started, install the latest version of the Wagmi CLI.\n\n::: code-group\n```bash-vue [pnpm]\npnpm add @wagmi/cli\n```\n\n```bash-vue [npm]\nnpm install @wagmi/cli\n```\n\n```bash-vue [yarn]\nyarn add @wagmi/cli\n```\n\n```bash-vue [bun]\nbun add @wagmi/cli\n```\n:::\n\n::: info Not ready to migrate yet?\nThe Wagmi CLI v1 docs are still available at [1.x.wagmi.sh/cli](https://1.x.wagmi.sh/cli).\n:::\n\n## Changed generated action and hook names\n\nGenerated action and hook names now align with [Wagmi v2 naming conventions](/react/guides/migrate-from-v1-to-v2#renamed-hooks). If you want hooks to still follow Wagmi v1 naming conventions, set [`getActionName`](/cli/api/plugins/actions#getactionname) and [`getHookName`](/cli/api/plugins/react#gethookname) to `'legacy'`.\n\n```ts\nimport { defineConfig } from '@wagmi/cli'\nimport { actions, react } from '@wagmi/cli/plugins'\n\nexport default defineConfig({\n  plugins: [\n    actions({\n      getActionName: 'legacy', // [!code focus]\n    }),\n    react({\n      getHookName: 'legacy', // [!code focus]\n    }),\n  ],\n})\n```\n"
  },
  {
    "path": "site/cli/installation.md",
    "content": "# Installation\n\nInstall Wagmi CLI via your package manager.\n\n## Package Manager\n\nInstall the required package.\n\n::: code-group\n```bash [pnpm]\npnpm add @wagmi/cli\n```\n\n```bash [npm]\nnpm install @wagmi/cli\n```\n\n```bash [yarn]\nyarn add @wagmi/cli\n```\n\n```bash [bun]\nbun add @wagmi/cli\n```\n:::\n\n## Using Unreleased Commits\n\nIf you can't wait for a new release to test the latest features, you can either install from the `canary` tag (tracks the [`main`](https://github.com/wevm/wagmi/tree/main) branch).\n\n::: code-group\n```bash [pnpm]\npnpm add @wagmi/cli@canary\n```\n\n```bash [npm]\nnpm install @wagmi/cli@canary\n```\n\n```bash [yarn]\nyarn add @wagmi/cli@canary\n```\n\n```bash [bun]\nbun add @wagmi/cli@canary\n```\n:::\n\nOr clone the [Wagmi repo](https://github.com/wevm/wagmi) to your local machine, build, and link it yourself.\n\n```bash\ngit clone https://github.com/wevm/wagmi.git\ncd wagmi\npnpm install\npnpm build\ncd packages/cli\npnpm link --global\n```\n\nThen go to the project where you are using the Wagmi CLI and run `pnpm link --global @wagmi/cli` (or the package manager that you used to link Wagmi CLI globally).\n\nFinally, pull requests are continuously released via [pkg.pr.new](https://pkg.pr.new) and can be installed using the pull request number or short commit ID.\n\n::: code-group\n```bash [pnpm]\npnpm add https://pkg.pr.new/@wagmi/cli@123\n```\n\n```bash [npm]\nnpm install https://pkg.pr.new/@wagmi/cli@123\n```\n\n```bash [yarn]\nyarn add https://pkg.pr.new/@wagmi/cli@123\n```\n\n```bash [bun]\nbun add https://pkg.pr.new/@wagmi/cli@123\n```\n:::\n"
  },
  {
    "path": "site/cli/why.md",
    "content": "# Why Wagmi CLI\n\n## The Problem\n\nThe most common way to interact with smart contracts is through [Application Binary Interfaces](https://docs.soliditylang.org/en/latest/abi-spec.html). ABIs describe smart contracts' public functionality (e.g. functions, events, errors) as well as how to encode and decode related data (e.g. arguments and results).\n\nWhile ABIs are extremely powerful, there isn't a uniform way developers manage them in their apps. Developers do a bunch of different things, like:\n\n- Publish packages on npm containing ABIs\n- Write custom scripts to fetch ABIs from external sources\n- Compile contracts into application project\n- Copy and paste ABIs from local projects or block explorers\n\nAll these approaches take time that you could spend doing more important things, like interacting with your smart contracts!\n\n## The Solution\n\nThe Wagmi CLI is an attempt to automate manual work so you can build faster. In short, the CLI manages ABIs and generates code. It takes ABIs as inputs and outputs ABIs and generated code. For example, the [Etherscan plugin](/cli/api/plugins/etherscan) allows you to fetch ABIs across multiple chains and deployments and immediately start importing them into your project.\n\nCode generation is another big advantage of the CLI. Using the [React plugin](/cli/api/plugins/react), you can generate [Wagmi Hooks](/react/api/hooks) for ABIs. When you combine this with the CLI's different ABI sources, like Etherscan, Foundry/Hardhat, and more, you reduce a lot of boilerplate code.\n\n::: code-group\n```ts [Diff]\nimport { useReadContract, useWriteContract } from 'wagmi' // [!code --]\nimport { froggyFriendsAbi, froggyFriendsAddress } from './generated' // [!code --]\nimport { useReadFroggyFriends, useWriteFroggyFriends } from './generated' // [!code ++]\n\nfunction App() {\n  const { data } = useReadContract({ // [!code --]\n  const { data } = useReadFroggyFriends({ // [!code ++]\n    abi: froggyFriendsAbi, // [!code --]\n    address: froggyFriendsAddress, // [!code --]\n    functionName: 'tokenURI',\n    args: [123n],\n  })\n\n  const { write } = useWriteContract() // [!code --]\n  const { write } = useWriteFroggyFriends() // [!code ++]\n  const onClick = React.useCallback(() => {\n    write({\n      abi: froggyFriendsAbi, // [!code --]\n      address: froggyFriendsAddress, // [!code --]\n      functionName: 'mint',\n      args: ['foo', 123n],\n    })\n  }, [write])\n}\n```\n```ts [Before]\nimport { useReadContract, useWriteContract } from 'wagmi'\nimport { froggyFriendsAbi, froggyFriendsAddress } from './generated'\n\nfunction App() {\n  const { data } = useReadContract({\n    abi: froggyFriendsAbi,\n    address: froggyFriendsAddress,\n    functionName: 'tokenURI',\n    args: [123n],\n  })\n\n  const { write } = useWriteContract()\n  const onClick = React.useCallback(() => {\n    write({\n      abi: froggyFriendsAbi,\n      address: froggyFriendsAddress,\n      functionName: 'mint',\n      args: ['foo', 123n],\n    })\n  }, [write])\n}\n```\n```ts [After]\nimport { useReadFroggyFriends, useWriteFroggyFriends } from './generated'\n\nfunction App() {\n  const { data } = useReadFroggyFriends({\n    functionName: 'tokenURI',\n    args: [123n],\n  })\n\n  const { write } = useWriteFroggyFriends()\n  const onClick = React.useCallback(() => {\n    write({\n      functionName: 'mint',\n      args: ['foo', 123n],\n    })\n  }, [write])\n}\n```\n:::\n\nFinally, the Wagmi CLI supports popular smart contract development tools, [Foundry](/cli/api/plugins/foundry) and [Hardhat](/cli/api/plugins/hardhat). You can run the CLI in [watch mode](/cli/api/commands/generate#w-watch), make changes to your contracts, and the CLI will automatically pick up ABI changes and run plugins over those changes. A major boon to working a monorepo and shortening the feedback loop across your stack.\n"
  },
  {
    "path": "site/components/Browsers.vue",
    "content": "<script setup>\nconst browsers = ['chrome', 'edge', 'firefox', 'opera', 'safari']\n</script>\n\n<template>\n  <div flex my-6 gap-1.5>\n    <img v-for=\"browser of browsers\" h-16 :src=\"`/browsers/${browser}.png`\" :alt=\"browser\" />\n  </div>\n</template>\n"
  },
  {
    "path": "site/components/PackageMetadata.vue",
    "content": "<script setup>\nconst props = defineProps({\n  licenseUrl: String,\n  isOsiLicense: Boolean,\n  package: String,\n  repo: String,\n  showName: Boolean,\n})\n</script>\n\n<template>\n  <div flex flex-col gap-2>\n    <code v-if=\"props.showName\" w-fit text-sm>\n      {{props.package}}\n    </code>\n    <div flex flex-wrap mb-1 gap-1.5 items-center>\n      <a :href=\"`https://npm.im/${props.package}`\" class=\"link\">\n        <svg size-4 viewBox=\"0 0 16 16\"><path fill=\"#c12127\" d=\"M0,16V0H16V16ZM3,3V13H8V5h3v8h2V3Z\"/><path fill=\"#fff\" d=\"M3,3H13V13H11V5H8v8H3Z\"/></svg>\n        <span>npm</span>\n      </a>\n\n      <a :href=\"`https://github.com/${props.repo}`\" class=\"link\">\n        <svg size-4 viewBox=\"0 0 98 96\"><path fill=\"currentColor\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.378 1.94-9.778 5.014-13.2-.485-1.222-2.184-6.275.486-13.038 0 0 4.125-1.304 13.426 5.052a46.97 46.97 0 0 1 12.214-1.63c4.125 0 8.33.571 12.213 1.63 9.302-6.356 13.427-5.052 13.427-5.052 2.67 6.763.97 11.816.485 13.038 3.155 3.422 5.015 7.822 5.015 13.2 0 18.905-11.404 23.06-22.324 24.283 1.78 1.548 3.316 4.481 3.316 9.126 0 6.6-.08 11.897-.08 13.526 0 1.304.89 2.853 3.316 2.364 19.412-6.52 33.405-24.935 33.405-46.691C97.707 22 75.788 0 48.854 0z\" /></svg>\n        <span>GitHub</span>\n      </a>\n\n      <a :href=\"`https://socket.dev/npm/package/${props.package}`\" class=\"link\">\n        <svg h-4 w-3 viewBox=\"0 0 52 68\"><path fill=\"#553c9a\" d=\"M0 31.6519C0 48.4253 10.7045 62.696 25.6804 68C33.1488 65.3624 39.5828 60.4633 44.1335 54.1445C48.713 47.8071 51.3989 40.0479 51.3989 31.6519V9.27582L25.6897 0L0.00927239 9.27582V31.6519H0ZM21.2266 14.3964H33.1488L29.4965 26.8312H35.9893L18.2409 53.5943L22.4536 34.1638H15.4004L21.2266 14.3964Z\" /></svg>\n        <span>Socket</span>\n      </a>\n\n      <a v-if=\"props.isOsiLicense\" :href=\"props.licenseUrl\" class=\"link\">\n        <svg size-4 viewBox=\"0 0 172 166\"><path d=\"M95.6285 112.928C107.528 108.528 113.728 100.028 113.728 85.4284C113.728 70.8284 101.428 57.9284 86.0285 57.9284C69.8285 57.9284 57.5285 70.8284 57.7285 85.4284C57.9285 100.128 64.9285 109.828 76.1285 113.428L56.3285 162.228C29.8285 155.328 2.82849 124.028 2.82849 85.5284C2.82849 39.8284 39.5285 2.82837 85.5285 2.82837C131.528 2.82837 168.828 39.8284 168.828 85.5284C168.828 124.728 142.128 155.528 114.928 162.428L95.6285 112.928Z\" fill=\"#3DA638\" stroke=\"#1C511C\" stroke-width=\"5.6569\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n        <span>OSI Compliant License</span>\n      </a>\n      <a v-else :href=\"props.licenseUrl\" class=\"link\">\n        <svg size-4 viewBox=\"0 0 16 16\"><path fill-amber-800 d=\"M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736q.058.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53l.529.531l-.001.002l-.002.002l-.006.006l-.006.005l-.01.01l-.045.04q-.317.265-.686.45C14.556 10.78 13.88 11 13 11a4.5 4.5 0 0 1-2.023-.454a3.5 3.5 0 0 1-.686-.45l-.045-.04l-.016-.015l-.006-.006l-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.25.25 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.25.25 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53l.529.531l-.001.002l-.002.002l-.006.006l-.016.015l-.045.04q-.317.265-.686.45C4.556 10.78 3.88 11 3 11a4.5 4.5 0 0 1-2.023-.454a3.5 3.5 0 0 1-.686-.45l-.045-.04l-.016-.015l-.006-.006l-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.25.25 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0m2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z\"/></svg>\n        <span>Non-OSI Compliant License</span>\n      </a>\n    </div>\n  </div>\n</template>\n\n\n<style scoped>\n.link {\n  align-items: center;\n  background: var(--vp-sidebar-bg-color);\n  border-radius: 0.375rem;\n  border: 1px solid var(--vp-c-divider);\n  color: currentColor !important;\n  display: flex;\n  font-size: 0.75rem;\n  font-weight: 600;\n  gap: 0.375rem;\n  padding: 0.15rem 0.5rem;\n  text-decoration: none !important;\n  white-space: nowrap;\n}\na.link:hover {\n  border-color: var(--vp-c-brand-1);\n}\n</style>\n"
  },
  {
    "path": "site/components/SearchChains.vue",
    "content": "<script setup>\nimport * as allChains from 'viem/chains'\nimport { computed, ref } from 'vue'\n\nconst message = ref('')\nconst chains = Object.entries(allChains)\n  .map(([key, value]) => ({ ...value, import: key }))\n  .sort((a, b) => a.id - b.id)\nconst filteredChains = computed(() => {\n  const filterMessage = message.value.toLowerCase().trim()\n  return chains.filter(\n    (chain) =>\n      chain.id.toString().includes(filterMessage) ||\n      chain.import.toLowerCase().includes(filterMessage) ||\n      chain.name.toLowerCase().includes(filterMessage) ||\n      chain.nativeCurrency.symbol.toLowerCase().includes(filterMessage),\n  )\n})\n</script>\n\n<template>\n  <div relative flex=\"~ items-center\" mb-4>\n    <input class=\"Search\" h-10 w-full aria-label=\"Search chains\" placeholder=\"Search chains\" v-model=\"message\" />\n    <span absolute right-4 font-500 op-50 text-xs>{{ filteredChains.length }} {{ filteredChains.length === 1 ?\n      \"Chain\" :\n      \"Chains\"\n      }}</span>\n  </div>\n\n  <div class=\"Columns\">\n    <div v-for=\"chain of filteredChains\" class=\"Item\" h-30 flex=\"~ col items-center justify-center gap-1.5\">\n      <div mt-3 text-sm font-500 text-truncate max-w-50>{{ chain.name }}</div>\n      <code text-xs>{{ chain.import }}</code>\n      <div flex=\"~ gap-1\" op-50 text-xs>\n        <span>{{ chain.id }}</span> -\n        <span>{{ chain.nativeCurrency.symbol }}</span>\n      </div>\n    </div>\n  </div>\n</template>\n\n<style scoped>\n.Columns {\n  --grid-layout-gap: 0.5rem;\n  --grid-column-count: 8;\n  --grid-item--min-width: 200px;\n\n  /** Calculated values. */\n  --gap-count: calc(var(--grid-column-count) - 1);\n  --total-gap-width: calc(var(--gap-count) * var(--grid-layout-gap));\n  --grid-item--max-width: calc((100% - var(--total-gap-width)) / var(--grid-column-count));\n\n  display: grid;\n  grid-template-columns: repeat(auto-fill, minmax(max(var(--grid-item--min-width), var(--grid-item--max-width)), 1fr));\n  grid-gap: var(--grid-layout-gap);\n}\n\n.Item {\n  background-color: var(--vp-c-bg-soft);\n  border: 1px solid var(--vp-c-bg-soft);\n  border-radius: 8px;\n}\n\n.Search {\n  background-color: var(--vp-c-bg-alt);\n  border: 1px solid transparent;\n  border-radius: 8px;\n  outline: none;\n  padding: 16px;\n  font-size: 0.9rem;\n  font-weight: 500;\n}\n\n.Search::placeholder {\n  color: var(--vp-c-text-1);\n}\n\n.Search:hover,\n.Search:focus {\n  border-color: var(--vp-c-brand);\n}\n</style>\n"
  },
  {
    "path": "site/core/api/actions/call.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'call'\nconst typeName = 'call'\n</script>\n\n# call\n\nAction for executing a new message call immediately without submitting a transaction to the network.\n\n## Import\n\n```ts\nimport { call } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { call } from '@wagmi/core'\nimport { config } from './config'\n\nawait call(config, {\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts twoslash\n// @twoslash-cache: {\"v\":1,\"hash\":\"f9d98dd791931821ca041f2ffa5df1409ff16b6299b7878935aa5d977af43747\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808AKAQwBsBLZuASgAJMcvAMJtWABWalmAWxg1ScADwBjCGABm7AOa86NMFDjC1mnQF5jG7QD5eFka3GSZcskYBkw/M3ZgAklASUrLyKiY2ADpg7NJYEKRowqJBLvIIVHBokgyIAIwALFSsMGBaaPhIBVRZpFpyeA5Owa4KlCAcYLiIAAxUyt5SyvKV+QC+ALp90F0gMXEJvMD82DBJjikhbryjvOqkENK8AOQAAgDuzFrS7AD0qqQwR20hzEigeiVw7Gp4aAijoyAA\"}\nimport { type CallParameters } from '@wagmi/core'\n```\n\n### account\n\n`Account | Address | undefined`\n\nThe Account to call from.\n\n::: code-group\n```ts [index.ts]\nimport { call } from '@wagmi/core'\nimport { config } from './config'\n\nawait call(config, {\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', // [!code focus]\n  data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### data\n\n`` `0x${string}` | undefined ``\n\nA contract hashed method call with encoded args.\n\n::: code-group\n```ts [index.ts]\nimport { call } from '@wagmi/core'\nimport { config } from './config'\n\nawait call(config, {\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', // [!code focus]\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### to\n\n`Address | undefined`\n\nThe contract address or recipient.\n\n::: code-group\n```ts [index.ts]\nimport { call } from '@wagmi/core'\nimport { config } from './config'\n\nawait call(config, {\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### accessList\n\n`AccessList | undefined`\n\nThe access list.\n\n::: code-group\n```ts [index.ts]\nimport { call } from '@wagmi/core'\nimport { config } from './config'\n\nawait call(config, {\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  accessList: [ // [!code focus:6] \n    {\n      address: '0x1',\n      storageKeys: ['0x1'],\n    },\n  ],\n  data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### gas\n\n`bigint | undefined`\n\nThe gas provided for transaction execution.\n\n::: code-group\n```ts [index.ts]\nimport { call } from '@wagmi/core'\nimport { config } from './config'\n\nawait call(config, {\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n  gas: 1_000_000n, // [!code focus]\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### gasPrice\n\n`bigint | undefined`\n\nThe price (in wei) to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms#legacy-transaction).\n\n::: code-group\n```ts [index.ts]\nimport { call } from '@wagmi/core'\nimport { parseGwei } from 'viem'\nimport { config } from './config'\n\nawait call(config, {\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n  gasPrice: parseGwei('20'), // [!code focus]\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### maxFeePerGas\n\n`bigint | undefined`\n\nTotal fee per gas (in wei), inclusive of `maxPriorityFeePerGas`. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n```ts [index.ts]\nimport { call } from '@wagmi/core'\nimport { parseGwei } from 'viem'\nimport { config } from './config'\n\nawait call(config, {\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n  maxFeePerGas: parseGwei('20'), // [!code focus]\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### maxPriorityFeePerGas\n\n`bigint | undefined`\n\nMax priority fee per gas (in wei). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n```ts [index.ts]\nimport { call } from '@wagmi/core'\nimport { parseGwei } from 'viem'\nimport { config } from './config'\n\nawait call(config, {\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n  maxFeePerGas: parseGwei('20'),\n  maxPriorityFeePerGas: parseGwei('2'), // [!code focus]\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### nonce\n\n`number | undefined`\n\nUnique number identifying this transaction.\n\n::: code-group\n```ts [index.ts]\nimport { call } from '@wagmi/core'\nimport { config } from './config'\n\nawait call(config, {\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n  nonce: 420, // [!code focus]\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### value\n\n`bigint | undefined`\n\nValue (in wei) sent with this transaction.\n\n::: code-group\n```ts [index.ts]\nimport { call } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nawait call(config, {\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  value: parseEther('1'), // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockNumber\n\n`number | undefined`\n\nThe block number to perform the call against.\n\n::: code-group\n```ts [index.ts]\nimport { call } from '@wagmi/core'\nimport { config } from './config'\n\nawait call(config, {\n  blockNumber: 15121123n, // [!code focus]\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nThe block tag to perform the call against.\n\n::: code-group\n```ts [index.ts]\nimport { call } from '@wagmi/core'\nimport { config } from './config'\n\nawait call(config, {\n  blockTag: 'safe', // [!code focus]\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nThe block tag to perform the call against.\n\n::: code-group\n```ts [index.ts]\nimport { call } from '@wagmi/core'\nimport { config } from './config'\nimport { mainnet } from '@wagmi/core/chains'\n\nawait call(config, {\n  chainId: mainnet.id, // [!code focus]\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts twoslash\n// @twoslash-cache: {\"v\":1,\"hash\":\"21d9f77d5084c8206ac7e44980e375eda94c1b843ad4d776e3c3ed3a076f7de7\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808AKAQwBsBLZuASgAJMcvAMJtWAJRhoArqTAAVbDF4BeXsAA6YXtt5RmaZol4AJOrwA+vKWFgAzdmBhQA3JoC+m9gFssEUmmFRCWlZBRxKEDgDfyQARgAWKlYYMABzNHw4xOpmUlTJPBFWcUkZeUUIjkckAAYqAGN8XOZ6mnJEBLcAXQboXEQQb19/NX5FQOLgsrClN15bUggvXgByAAEAd2ZUr3YAenq/GBWIr0lmJFA6GjA4dggwPDQENzcgA===\"}\nimport { type CallReturnType } from '@wagmi/core'\n```\n\n`{ data: 0x${string} }`\n\nThe call data.\n\n## Error\n\n```ts twoslash\n// @twoslash-cache: {\"v\":1,\"hash\":\"b8acbdeab78439603d8a045b8f32426b8530ecc55b9057e0cccd65e1da03193a\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808AKAQwBsBLZuASgAJMcvAMJtWAUVKkIpACrYYvALy8A8gFt2aADwjW42jADGAVzTsIYCVNnyKvADohDzY3BiOAfLwBkvYPbBeIN5nVxhEXgAFZlI3AEFDQwhjMDQraTlBAB9eAEkwIjZ2KDioKFJ4OHSbbN4EpJS0AGU0ZhohCwAzDkM0yQz5Xhz8mgBzMhVTFU6AJWYwcerMhRym9gAvGDFaQxgYKDhosvYFtc2lwZyL2pa2mDi4OHZRsDUYVI6wbvZe65W8gpFKAAIQwNDgABl3qM0Pg/kNeAA6ZG8ABsAEZeGppApkYiEQBxGBoABy0C2/VIM2JxlIYGWAG4AgBfALsNRYaRoYSiP6UEBwVqkBiIdEAFiorGhsKQ6IAzFQheMRSBdOJKct+RwwLhEAAGKiGfAxZi9MiysXMgC6hvJeHZnOFfn4gzV8OZvE6UjUvAA5AABADuzFGGgA9EkKr7+W9WkhQHQaGAnhY8GgEMzmUA==\"}\nimport { type CallErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`call`](https://viem.sh/docs/actions/public/call)\n"
  },
  {
    "path": "site/core/api/actions/connect.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'connect'\nconst typeName = 'Connect'\n</script>\n\n# connect\n\nAction for connecting accounts with [connectors](/core/api/connectors).\n\n## Import\n\n```ts\nimport { connect } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { connect } from '@wagmi/core'\nimport { injected } from '@wagmi/connectors'\nimport { config } from './config'\n\nconst result = await connect(config, { connector: injected() })\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type ConnectParameters } from '@wagmi/core'\n```\n\n### chainId\n\n`number | undefined`\n\nChain ID to connect to.\n\nNot all connectors support connecting directly to a `chainId` (e.g. they don't support programmatic chain switching). In those cases, the connector will connect to whatever chain the connector's provider is connected to.\n\n::: code-group\n```ts [index.ts]\nimport { connect } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { injected } from '@wagmi/connectors'\nimport { config } from './config'\n\nconst result = await connect(config, {\n  chainId: mainnet.id, // [!code focus]\n  connector: injected(),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### connector\n\n`CreateConnectorFn | Connector`\n\n[Connector](/core/api/connectors) to connect with.\n\n::: code-group\n```ts [index.ts]\nimport { connect } from '@wagmi/core'\nimport { injected } from '@wagmi/connectors' // [!code focus]\nimport { config } from './config'\n\nconst result = await connect(config, {\n  connector: injected(), // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### withCapabilities\n\n`boolean | undefined`\n\n- Exposes [capabilities](https://eips.ethereum.org/EIPS/eip-7846#capabilities) on return type.\n- Defaults to `false`.\n\n::: code-group\n```ts [index.ts]\nimport { connect } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { injected } from '@wagmi/connectors'\nimport { config } from './config'\n\nconst result = await connect(config, {\n  connector: injected(),\n  withCapabilities: true, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type ConnectReturnType } from '@wagmi/core'\n```\n\n::: tip\nWhen [`withCapabilities: false | undefined`](#withcapabilities):\n```ts\ntype ConnectReturnType = {\n  accounts: readonly Address[]\n  // ...\n}\n```\nWhen [`withCapabilities: true`](#withcapabilities):\n```ts\ntype ConnectReturnType = {\n  accounts: readonly { address: Address; capabilities: Record<string, unknown> }[]\n  // ...\n}\n```\n:::\n\n### accounts\n\n`readonly [Address, ...Address[]]`\n\nConnected accounts from connector.\n\n### chainId\n\n`number`\n\nConnected chain ID from connector.\n\n## Error\n\n```ts\nimport { type ConnectErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/mutation-imports.md-->\n"
  },
  {
    "path": "site/core/api/actions/deployContract.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'deployContract'\nconst typeName = 'DeployContract'\n</script>\n\n# deployContract <Badge text=\"viem@>=2.8.18\" />\n\nAction for deploying a contract to the network, given bytecode, and constructor arguments.\n\n## Import\n\n```ts\nimport { deployContract } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { deployContract } from '@wagmi/core'\nimport { wagmiAbi } from './abi'\nimport { config } from './config'\n\nconst result = await deployContract(config, {\n  abi: wagmiAbi,\n  bytecode: '0x608060405260405161083e38038061083e833981016040819052610...',\n})\n```\n```ts [abi.ts]\nexport const wagmiAbi = [\n  ...\n  {\n    inputs: [],\n    stateMutability: \"nonpayable\",\n    type: \"constructor\",\n  },\n  ...\n] as const\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Deploying with Constructor Args\n\n::: code-group\n```ts [index.ts]\nimport { deployContract } from '@wagmi/core'\nimport { wagmiAbi } from './abi'\nimport { config } from './config'\n\nconst result = await deployContract(config, {\n  abi: wagmiAbi,\n  args: [69420],\n  bytecode: '0x608060405260405161083e38038061083e833981016040819052610...',\n})\n```\n```ts [abi.ts]\nexport const wagmiAbi = [\n  ...\n  {\n    inputs: [{ name: \"x\", type: \"uint32\" }],\n    stateMutability: \"nonpayable\",\n    type: \"constructor\",\n  },\n  ...\n] as const;\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n\n## Parameters\n\n```ts\nimport { type DeployContractParameters } from '@wagmi/core'\n```\n\n### abi\n\n`Abi`\n\nThe contract's ABI.\n\n::: code-group\n```ts [index.ts]\nimport { deployContract } from '@wagmi/core'\nimport { wagmiAbi } from './abi'\nimport { config } from './config'\n\nconst result = await deployContract(config, {\n  abi: wagmiAbi, // [!code focus]\n  args: [69420],\n  bytecode: '0x608060405260405161083e38038061083e833981016040819052610...',\n})\n```\n```ts [abi.ts]\nexport const wagmiAbi = [\n  ...\n  {\n    inputs: [{ name: \"x\", type: \"uint32\" }],\n    stateMutability: \"nonpayable\",\n    type: \"constructor\",\n  },\n  ...\n] as const;\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### account\n\n`Address | Account | undefined`\n\nAccount to use when deploying a contract. Throws if account is not found on [`connector`](#connector).\n\n::: code-group\n```ts [index.ts]\nimport { deployContract } from '@wagmi/core'\nimport { wagmiAbi } from './abi'\nimport { config } from './config'\n\nconst result = await deployContract(config, {\n  abi: wagmiAbi,\n  account: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n  args: [69420],\n  bytecode: '0x608060405260405161083e38038061083e833981016040819052610...',\n})\n```\n```ts [abi.ts]\nexport const wagmiAbi = [\n  ...\n  {\n    inputs: [{ name: \"x\", type: \"uint32\" }],\n    stateMutability: \"nonpayable\",\n    type: \"constructor\",\n  },\n  ...\n] as const;\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### args\n\n`readonly unknown[] | undefined`\n\n- Arguments to pass when deploying the contract.\n- Inferred from [`abi`](#abi).\n\n::: code-group\n```ts [index.ts]\nimport { deployContract } from '@wagmi/core'\nimport { wagmiAbi } from './abi'\nimport { config } from './config'\n\nconst result = await deployContract(config, {\n  abi: wagmiAbi,\n  args: [69420], // [!code focus]\n  bytecode: '0x608060405260405161083e38038061083e833981016040819052610...',\n})\n```\n```ts [abi.ts]\nexport const wagmiAbi = [\n  ...\n  {\n    inputs: [{ name: \"x\", type: \"uint32\" }],\n    stateMutability: \"nonpayable\",\n    type: \"constructor\",\n  },\n  ...\n] as const;\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### bytecode\n\n`Hex`\n\nThe contract's bytecode.\n\n::: code-group\n```ts [index.ts]\nimport { deployContract } from '@wagmi/core'\nimport { wagmiAbi } from './abi'\nimport { config } from './config'\n\nconst result = await deployContract(config, {\n  abi: wagmiAbi,\n  args: [69420],\n  bytecode: '0x608060405260405161083e38038061083e833981016040819052610...', // [!code focus]\n})\n```\n```ts [abi.ts]\nexport const wagmiAbi = [\n  ...\n  {\n    inputs: [{ name: \"x\", type: \"uint32\" }],\n    stateMutability: \"nonpayable\",\n    type: \"constructor\",\n  },\n  ...\n] as const;\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### connector\n\n`Connector | undefined`\n\n- Connector to use when deploying a contract.\n- Defaults to current connector.\n\n::: code-group\n```ts [index.ts]\nimport { getConnection, deployContract } from '@wagmi/core'\nimport { wagmiAbi } from './abi'\nimport { config } from './config'\n\nconst { connector } = getConnection(config)\nconst result = await deployContract(config, {\n  abi: wagmiAbi,\n  args: [69420],\n  bytecode: '0x608060405260405161083e38038061083e833981016040819052610...',\n  connector, // [!code focus]\n})\n```\n```ts [abi.ts]\nexport const wagmiAbi = [\n  ...\n  {\n    inputs: [{ name: \"x\", type: \"uint32\" }],\n    stateMutability: \"nonpayable\",\n    type: \"constructor\",\n  },\n  ...\n] as const;\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type DeployContractReturnType } from '@wagmi/core'\n```\n\n[`Hash`](https://viem.sh/docs/glossary/types#hash)\n\nTransaction hash.\n\n## Error\n\n```ts\nimport { type DeployContractErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Viem\n\n- [`deployContract`](https://viem.sh/docs/contract/deployContract)\n"
  },
  {
    "path": "site/core/api/actions/disconnect.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'disconnect'\nconst typeName = 'Disconnect'\n</script>\n\n# disconnect\n\nAction for disconnecting connections.\n\n## Import\n\n```ts\nimport { disconnect } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { disconnect } from '@wagmi/core'\nimport { config } from './config'\n\nawait disconnect(config)\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type DisconnectParameters } from '@wagmi/core'\n```\n\n### connector\n\n`Connector | undefined`\n\n[Connector](/core/api/connectors) to disconnect with.\n\n::: code-group\n```ts [index.ts]\nimport { disconnect, getConnection } from '@wagmi/core'\nimport { config } from './config'\n\nconst { connector } = getConnection(config)\nconst result = await disconnect(config, {\n  connector, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Error\n\n```ts\nimport { type DisconnectErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/mutation-imports.md-->\n"
  },
  {
    "path": "site/core/api/actions/estimateFeesPerGas.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'estimateFeesPerGas'\nconst typeName = 'EstimateFeesPerGas'\n</script>\n\n# estimateFeesPerGas\n\nReturns an estimate for the fees per gas (in wei) for a transaction to be likely included in the next block.\n\n## Import\n\n```ts\nimport { estimateFeesPerGas } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { estimateFeesPerGas } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await estimateFeesPerGas(config)\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type EstimateFeesPerGasParameters } from '@wagmi/core'\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```ts [index.ts]\nimport { estimateFeesPerGas } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nconst result = await estimateFeesPerGas(config, {\n  chainId: mainnet.id, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### type\n\n`'legacy' | 'eip1559'`\n\n- Fee value type.\n- Defaults to `'eip1559'`\n\n::: code-group\n```ts [index.ts]\nimport { estimateFeesPerGas } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = estimateFeesPerGas(config, {\n  type: 'legacy', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type EstimateFeesPerGasReturnType } from '@wagmi/core'\n```\n\n[`FeeValues`](https://viem.sh/docs/glossary/types#feevalues)\n\nAn estimate (in wei) for the fees per gas.\n\n### gasPrice\n\n`bigint | undefined`\n\n- Gas price.\n- When [`type`](#type) is `'eip1559'`, value is `undefined`.\n\n### maxFeePerGas\n\n`bigint | undefined`\n\n- Max fee per gas.\n- When [`type`](#type) is `'legacy'`, value is `undefined`.\n\n### maxPriorityFeePerGas\n\n`bigint | undefined`\n\n- Max priority fee per gas.\n- When [`type`](#type) is `'legacy'`, value is `undefined`.\n\n## Error\n\n```ts\nimport { type EstimateFeesPerGasErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`estimateFeesPerGas`](https://viem.sh/docs/actions/public/estimateFeesPerGas)\n"
  },
  {
    "path": "site/core/api/actions/estimateGas.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'estimateGas'\nconst typeName = 'EstimateGas'\n</script>\n\n# estimateGas\n\nAction for estimating the gas necessary to complete a transaction without submitting it to the network.\n\n## Import\n\n```ts\nimport { estimateGas } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { estimateGas } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await estimateGas(config, {\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type EstimateGasParameters } from '@wagmi/core'\n```\n\n### accessList\n\n`AccessList | undefined`\n\nThe access list.\n\n::: code-group\n```ts [index.ts]\nimport { estimateGas } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await estimateGas(config, {\n  accessList: [{ // [!code focus]\n    address: '0x1', // [!code focus]\n    storageKeys: ['0x1'], // [!code focus]\n  }], // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### account\n\n`Address | Account | undefined`\n\nAccount to use when estimating gas.\n\n::: code-group\n```ts [index.ts]\nimport { estimateGas } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await estimateGas(config, {\n  account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nChain ID to target when estimating gas.\n\n::: code-group\n```ts [index.ts]\nimport { estimateGas } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await estimateGas(config, {\n  chainId: mainnet.id, // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### connector\n\n`Connector | undefined`\n\nConnector to estimate with. If no [`account`](#account) is provided, will use default account from connector.\n\n::: code-group\n```ts [index.ts]\nimport { getConnections, estimateGas } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst connections = getConnections(config)\nconst result = await estimateGas(config, {\n  connector: connections[0]?.connector, // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### data\n\n`` `0x${string}` | undefined ``\n\nA contract hashed method call with encoded args.\n\n::: code-group\n```ts [index.ts]\nimport { estimateGas } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await estimateGas(config, {\n  data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### gas\n\n`bigint | undefined`\n\nGas provided for transaction execution.\n\n::: code-group\n```ts [index.ts]\nimport { estimateGas } from '@wagmi/core'\nimport { parseEther, parseGwei } from 'viem'\nimport { config } from './config'\n\nconst result = await estimateGas(config, {\n  gas: parseGwei('20'), // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### gasPrice\n\n`bigint | undefined`\n\nThe price in wei to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms#legacy-transaction).\n\n::: code-group\n```ts [index.ts]\nimport { estimateGas } from '@wagmi/core'\nimport { parseEther, parseGwei } from 'viem'\nimport { config } from './config'\n\nconst result = await estimateGas(config, {\n  gasPrice: parseGwei('20'), // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### maxFeePerGas\n\n`bigint | undefined`\n\nTotal fee per gas in wei, inclusive of [`maxPriorityFeePerGas`](#maxPriorityFeePerGas). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n```ts [index.ts]\nimport { estimateGas } from '@wagmi/core'\nimport { parseEther, parseGwei } from 'viem'\nimport { config } from './config'\n\nconst result = await estimateGas(config, {\n  maxFeePerGas: parseGwei('20'), // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### maxPriorityFeePerGas\n\n`bigint | undefined`\n\nMax priority fee per gas in wei. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n```ts [index.ts]\nimport { estimateGas } from '@wagmi/core'\nimport { parseEther, parseGwei } from 'viem'\nimport { config } from './config'\n\nconst result = await estimateGas(config, {\n  maxFeePerGas: parseGwei('20'),\n  maxPriorityFeePerGas: parseGwei('2'), // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### nonce\n\n`number`\n\nUnique number identifying this transaction.\n\n::: code-group\n```ts [index.ts]\nimport { estimateGas } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await estimateGas(config, {\n  nonce: 123, // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### to\n\n`Address | undefined`\n\nThe transaction recipient or contract address.\n\n::: code-group\n```ts [index.ts]\nimport { estimateGas } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await estimateGas(config, {\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### type\n\n`'legacy' | 'eip1559' | 'eip2930' | undefined`\n\nOptional transaction request type to narrow parameters.\n\n::: code-group\n```ts [index.ts]\nimport { estimateGas } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await estimateGas(config, {\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  type: 'eip1559', // [!code focus]\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### value\n\n`bigint | undefined`\n\nValue in wei sent with this transaction.\n\n::: code-group\n```ts [index.ts]\nimport { estimateGas } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await estimateGas(config, {\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', \n  value: parseEther('0.01'), // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type EstimateGasReturnType } from '@wagmi/core'\n```\n\n`bigint`\n\nThe gas estimate in wei.\n\n## Error\n\n```ts\nimport { type EstimateGasErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`estimateGas`](https://viem.sh/docs/actions/public/estimateGas)\n"
  },
  {
    "path": "site/core/api/actions/estimateMaxPriorityFeePerGas.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'estimateMaxPriorityFeePerGas'\nconst typeName = 'EstimateFeesPerGas'\n</script>\n\n# estimateMaxPriorityFeePerGas\n\nReturns an estimate for the max priority fee per gas (in wei) for a transaction to be likely included in the next block.\n\n## Import\n\n```ts\nimport { estimateMaxPriorityFeePerGas } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { estimateMaxPriorityFeePerGas } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await estimateMaxPriorityFeePerGas(config)\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type EstimateFeesPerGasParameters } from '@wagmi/core'\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```ts [index.ts]\nimport { estimateMaxPriorityFeePerGas } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nconst result = await estimateMaxPriorityFeePerGas(config, {\n  chainId: mainnet.id, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type EstimateFeesPerGasReturnType } from '@wagmi/core'\n```\n\n`bigint`\n\nAn estimate (in wei) for the max priority fee per gas.\n\n## Error\n\n```ts\nimport { type EstimateFeesPerGasErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`estimateMaxPriorityFeePerGas`](https://viem.sh/docs/actions/public/estimateMaxPriorityFeePerGas)\n"
  },
  {
    "path": "site/core/api/actions/getBalance.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'getBalance'\nconst typeName = 'GetBalance'\n</script>\n\n# getBalance\n\nAction for fetching native currency balance.\n\n## Import\n\n```ts\nimport { getBalance } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getBalance } from '@wagmi/core'\nimport { config } from './config'\n\nconst balance = getBalance(config, {\n  address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type GetBalanceParameters } from '@wagmi/core'\n```\n\n### address\n\n`Address`\n\nAddress to get balance for.\n\n::: code-group\n```ts [index.ts]\nimport { getBalance } from '@wagmi/core'\nimport { config } from './config'\n\nconst balance = getBalance(config, {\n  address: '0x4557B18E779944BFE9d78A672452331C186a9f48', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to get balance at.\n\n::: code-group\n```ts [index.ts]\nimport { getBalance } from '@wagmi/core'\nimport { config } from './config'\n\nconst balance = getBalance(config, {\n  address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n  blockNumber: 17829139n, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to get balance at.\n\n::: code-group\n```ts [index.ts]\nimport { getBalance } from '@wagmi/core'\nimport { config } from './config'\n\nconst balance = getBalance(config, {\n  address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n  blockTag: 'latest', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```ts [index.ts]\nimport { getBalance } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nconst balance = await getBalance(config, {\n  address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n  chainId: mainnet.id, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetBalanceReturnType } from '@wagmi/core'\n```\n\n### decimals\n\n`number`\n\nNumber of decimals for balance [`value`](#value).\n\n### symbol\n\n`string`\n\nSymbol of native currency.\n\n### value\n\n`bigint`\n\nRaw value of balance.\n\n## Error\n\n```ts\nimport { type GetBalanceErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`getBalance`](https://viem.sh/docs/actions/public/getBalance) for native currency balances\n- [`multicall`](https://viem.sh/docs/contract/multicall) for token balances\n"
  },
  {
    "path": "site/core/api/actions/getBlobBaseFee.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'getBlobBaseFee'\nconst typeName = 'GetBlobBaseFee'\n</script>\n\n# getBlobBaseFee\n\nAction for fetching the current blob base fee (in wei).\n\n## Import\n\n```ts\nimport { getBlobBaseFee } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getBlobBaseFee } from '@wagmi/core'\nimport { config } from './config'\n\nconst blobBaseFee = await getBlobBaseFee(config)\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type GetBlobBaseFeeParameters } from '@wagmi/core'\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```ts [index.ts]\nimport { getBlobBaseFee } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nconst blobBaseFee = await getBlobBaseFee(config, {\n  chainId: mainnet.id, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetBlobBaseFeeReturnType } from '@wagmi/core'\n```\n\n`bigint`\n\nCurrent blob base fee (in wei).\n\n## Error\n\n```ts\nimport { type GetBlobBaseFeeErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`getBlobBaseFee`](https://viem.sh/docs/actions/public/getBlobBaseFee)\n"
  },
  {
    "path": "site/core/api/actions/getBlock.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'getBlock'\nconst typeName = 'GetBlock'\n</script>\n\n# getBlock\n\nAction for fetching information about a block at a block number, hash or tag.\n\n## Import\n\n```ts\nimport { getBlock } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getBlock } from '@wagmi/core'\nimport { config } from './config'\n\nconst blockNumber = await getBlock(config)\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type GetBlockParameters } from '@wagmi/core'\n```\n\n### blockHash\n\n`` `0x${string}` ``\n\nInformation at a given block hash.\n\n::: code-group\n```ts [index.ts]\nimport { getBlock } from '@wagmi/core'\nimport { config } from './config'\n\nconst blockNumber = await getBlock(config, {\n  blockHash: '0x89644bbd5c8d682a2e9611170e6c1f02573d866d286f006cbf517eec7254ec2d' // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockNumber\n\n`` bigint ``\n\nInformation at a given block number.\n\n::: code-group\n```ts [index.ts]\nimport { getBlock } from '@wagmi/core'\nimport { config } from './config'\n\nconst blockNumber = await getBlock(config, {\n  blockNumber: 42069n // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockTag\n\n`` 'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' ``\n\nInformation at a given block tag. Defaults to `'latest'`.\n\n::: code-group\n```ts [index.ts]\nimport { getBlock } from '@wagmi/core'\nimport { config } from './config'\n\nconst blockNumber = await getBlock(config, {\n  blockTag: 'pending' // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```ts [index.ts]\nimport { getBlock } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nconst blockNumber = await getBlock(config, {\n  chainId: mainnet.id, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### includeTransactions\n\n`boolean`\n\nWhether or not to include transactions as objects.\n\n::: code-group\n```ts [index.ts]\nimport { getBlock } from '@wagmi/core'\nimport { config } from './config'\n\nconst blockNumber = await getBlock(config, {\n  includeTransactions: true // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetBlockReturnType } from '@wagmi/core'\n```\n\n[`Block`](https://viem.sh/docs/glossary/types#block)\n\nInformation about the block.\n\n## Error\n\n```ts\nimport { type GetBlockErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`getBlock`](https://viem.sh/docs/actions/public/getBlock)\n"
  },
  {
    "path": "site/core/api/actions/getBlockNumber.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'getBlockNumber'\nconst typeName = 'GetBlockNumber'\n</script>\n\n# getBlockNumber\n\nAction for fetching the number of the most recent block seen.\n\n## Import\n\n```ts\nimport { getBlockNumber } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getBlockNumber } from '@wagmi/core'\nimport { config } from './config'\n\nconst blockNumber = await getBlockNumber(config)\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type GetBlockNumberParameters } from '@wagmi/core'\n```\n\n### cacheTime\n\n`number | undefined`\n\nTime in milliseconds that cached block number will remain in memory.\n\n::: code-group\n```ts [index.ts]\nimport { getBlockNumber } from '@wagmi/core'\nimport { config } from './config'\n\nconst blockNumber = await getBlockNumber(config, {\n  cacheTime: 4_000, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```ts [index.ts]\nimport { getBlockNumber } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nconst blockNumber = await getBlockNumber(config, {\n  chainId: mainnet.id, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetBlockNumberReturnType } from '@wagmi/core'\n```\n\n`bigint`\n\nMost recent block number seen.\n\n## Error\n\n```ts\nimport { type GetBlockNumberErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`getBlockNumber`](https://viem.sh/docs/actions/public/getBlockNumber)\n- [`watchBlockNumber`](https://viem.sh/docs/actions/public/watchBlockNumber)\n"
  },
  {
    "path": "site/core/api/actions/getBlockTransactionCount.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'getBlockTransactionCount'\nconst typeName = 'GetBlockTransactionCount'\n</script>\n\n# getBlockTransactionCount\n\nAction for fetching the number of Transactions at a block number, hash or tag.\n\n## Import\n\n```ts\nimport { getBlockTransactionCount } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getBlockTransactionCount } from '@wagmi/core'\nimport { config } from './config'\n\nconst blockTransactionCount = await getBlockTransactionCount(config)\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type GetBlockTransactionCountParameters } from '@wagmi/core'\n```\n\n### cacheTime\n\n`number | undefined`\n\nTime in milliseconds that cached block transaction count will remain in memory.\n\n::: code-group\n```ts [index.ts]\nimport { getBlockTransactionCount } from '@wagmi/core'\nimport { config } from './config'\n\nconst blockTransactionCount = await getBlockTransactionCount(config, {\n  cacheTime: 4_000, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```ts [index.ts]\nimport { getBlockTransactionCount } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nconst blockTransactionCount = await getBlockTransactionCount(config, {\n  chainId: mainnet.id, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetBlockTransactionCountReturnType } from '@wagmi/core'\n```\n\n`number`\n\nThe number of Transactions at a block number\n\n## Error\n\n```ts\nimport { type GetBlockTransactionCountErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`getBlockTransactionCount`](https://viem.sh/docs/actions/public/getBlockTransactionCount)\n"
  },
  {
    "path": "site/core/api/actions/getBytecode.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'getBytecode'\nconst typeName = 'getBytecode'\n</script>\n\n# getBytecode\n\nAction for retrieving the bytecode at an address.\n\n## Import\n\n```ts\nimport { getBytecode } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getBytecode } from '@wagmi/core'\nimport { config } from './config'\n\nawait getBytecode(config, {\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type GetBytecodeParameters } from '@wagmi/core'\n```\n\n### address\n\n`Address`\n\nThe contract address.\n\n::: code-group\n```ts [index.ts]\nimport { getBytecode } from '@wagmi/core'\nimport { config } from './config'\n\nawait getBytecode(config, {\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockNumber\n\n`bigint | undefined`\n\nThe block number to check the bytecode at.\n\n::: code-group\n```ts [index.ts]\nimport { getBytecode } from '@wagmi/core'\nimport { config } from './config'\n\nawait getBytecode(config, {\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  blockNumber: 16280770n, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nThe block tag to check the bytecode at.\n\n::: code-group\n```ts [index.ts]\nimport { getBytecode } from '@wagmi/core'\nimport { config } from './config'\n\nawait getBytecode(config, {\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  blockTag: 'safe', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nThe chain ID to check the bytecode at.\n\n::: code-group\n```ts [index.ts]\nimport { getBytecode } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nawait getBytecode(config, {\n  chainId: mainnet.id, // [!code focus]\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetBytecodeReturnType } from '@wagmi/core'\n```\n\n`Hex`\n\nThe contract's bytecode.\n\n## Error\n\n```ts\nimport { type GetBytecodeErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`getCode`](https://viem.sh/docs/contract/getCode)\n"
  },
  {
    "path": "site/core/api/actions/getCallsStatus.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'getCallsStatus'\nconst typeName = 'GetCallsStatus'\n</script>\n\n# getCallsStatus\n\nAction to fetch the status and receipts of a call batch that was sent via [`sendCalls`](/core/api/actions/sendCalls).\n\n[Read more.](https://github.com/ethereum/EIPs/blob/1663ea2e7a683285f977eda51c32cec86553f585/EIPS/eip-5792.md#wallet_getcallsstatus)\n\n## Import\n\n```ts\nimport { getCallsStatus } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getCallsStatus } from '@wagmi/core'\nimport { config } from './config'\n\nconst status = await getCallsStatus(config, {\n  id: '0x1234567890abcdef',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type GetCallsStatusParameters } from '@wagmi/core'\n```\n\n### connector\n\n`Connector | undefined`\n\nConnector to get call statuses with.\n\n::: code-group\n```ts [index.ts]\nimport { getConnections, getCallsStatus } from '@wagmi/core'\nimport { config } from './config'\n\nconst connections = getConnections(config)\nconst status = await getCallsStatus(config, {\n  connector: connections[0]?.connector, // [!code focus]\n  id: '0x1234567890abcdef',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### id\n\n`string`\n\nIdentifier of the call batch.\n\n::: code-group\n```ts [index.ts]\nimport { getCallsStatus } from '@wagmi/core'\nimport { config } from './config'\n\nconst status = await getCallsStatus(config, {\n  id: '0x1234567890abcdef', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetCallsStatusReturnType } from '@wagmi/core'\n```\n\n`{ status: 'PENDING' | 'CONFIRMED', receipts: TransactionReceipt[] }`\n\nThe status and receipts of the call batch.\n\n## Error\n\n```ts\nimport { type GetCallsStatusErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`getCallsStatus`](https://viem.sh/docs/actions/wallet/getCallsStatus)\n"
  },
  {
    "path": "site/core/api/actions/getCapabilities.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'getCapabilities'\nconst typeName = 'GetCapabilities'\n</script>\n\n# getCapabilities\n\nAction to extract capabilities (grouped by chain ID) that a connected wallet supports (e.g. paymasters, session keys, etc).\n\n[Read more.](https://github.com/ethereum/EIPs/blob/815028dc634463e1716fc5ce44c019a6040f0bef/EIPS/eip-5792.md#wallet_getcapabilities)\n\n \n\n## Import\n\n```ts\nimport { getCapabilities } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getCapabilities } from '@wagmi/core'\nimport { config } from './config'\n\nconst capabilities = await getCapabilities(config)\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type GetCapabilitiesParameters } from '@wagmi/core'\n```\n\n### account\n\n`Account | Address | undefined`\n\nFetch capabilities for the provided account.\n\n::: code-group\n```ts [index.ts]\nimport { getCapabilities } from '@wagmi/core'\nimport { config } from './config'\n\nconst capabilities = await getCapabilities(config, {\n  account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### connector\n\n`Connector | undefined`\n\nConnector to get capabilities from.\n\n::: code-group\n```ts [index.ts]\nimport { getConnections, getCapabilities } from '@wagmi/core'\nimport { config } from './config'\n\nconst connections = getConnections(config)\nconst capabilities = await getCapabilities(config, {\n  connector: connections[0]?.connector, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetCapabilitiesReturnType } from '@wagmi/core'\n```\n\n`bigint`\n\nMost recent block number seen.\n\n## Error\n\n```ts\nimport { type GetCapabilitiesErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`getCapabilities`](https://viem.sh/docs/actions/wallet/getCapabilities)\n"
  },
  {
    "path": "site/core/api/actions/getChainId.md",
    "content": "# getChainId\n\nAction for getting current chain ID.\n\n\n## Import\n\n```ts\nimport { getChainId } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getChainId } from '@wagmi/core'\nimport { config } from './config'\n\nconst chainId = getChainId(config)\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetChainIdReturnType } from '@wagmi/core'\n```\n\n`number`\n\nCurrent chain ID from [`config.state.chainId`](/core/api/createConfig#chainid).\n\n::: info\nOnly returns chain IDs for chains configured via `createConfig`'s [`chains`](/core/api/createConfig#chains) parameter.\n\nIf the active [connection](/core/api/createConfig#connection) [`chainId`](/core/api/createConfig#chainid-1) is not from a chain included in your Wagmi `Config`, `getChainId` will return the last configured chain ID.\n:::\n"
  },
  {
    "path": "site/core/api/actions/getChains.md",
    "content": "# getChains\n\nAction for getting configured chains.\n\n## Import\n\n```ts\nimport { getChains } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getChains } from '@wagmi/core'\nimport { config } from './config'\n\nconst chains = getChains(config)\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetChainsReturnType } from '@wagmi/core'\n```\n\n`readonly [Chain, ...Chain[]]`\n\nChains from [`config.chains`](/core/api/createConfig#chains).\n"
  },
  {
    "path": "site/core/api/actions/getClient.md",
    "content": "# getClient\n\nAction for getting Viem [`Client`](https://viem.sh/docs/clients/custom) instance.\n\n## Import\n\n```ts\nimport { getClient } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getClient } from '@wagmi/core'\nimport { config } from './config'\n\nconst client = getClient(config)\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type GetClientParameters } from '@wagmi/core'\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when getting Viem Client.\n\n::: code-group\n```ts [index.ts]\nimport { getClient } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nconst client = await getClient(config, {\n  chainId: mainnet.id, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetClientReturnType } from '@wagmi/core'\n```\n\n`Client`\n\nViem [`Client`](https://viem.sh/docs/clients/custom) instance.\n"
  },
  {
    "path": "site/core/api/actions/getConnection.md",
    "content": "# getConnection\n\nAction for getting current connection.\n\n## Import\n\n```ts\nimport { getConnection } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getConnection } from '@wagmi/core'\nimport { config } from './config'\n\nconst connection = getConnection(config)\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetConnectionReturnType } from '@wagmi/core'\n```\n\n<!--@include: @shared/getConnection-return-type.md-->\n"
  },
  {
    "path": "site/core/api/actions/getConnections.md",
    "content": "# getConnections\n\nAction for getting active connections.\n\n## Import\n\n```ts\nimport { getConnections } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getConnections } from '@wagmi/core'\nimport { config } from './config'\n\nconst connections = getConnections(config)\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetConnectionsReturnType } from '@wagmi/core'\n```\n\n[`Connection[]`](/core/api/createConfig#connection)\n\nActive connections.\n"
  },
  {
    "path": "site/core/api/actions/getConnectorClient.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'getConnectorClient'\nconst typeName = 'GetConnectorClient'\n</script>\n\n# getConnectorClient\n\nAction for getting a Viem [`Client`](https://viem.sh/docs/clients/custom) object for the current or provided connector.\n\n## Import\n\n```ts\nimport { getConnectorClient } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getConnectorClient } from '@wagmi/core'\nimport { config } from './config'\n\nconst client = await getConnectorClient(config)\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type GetConnectorClientParameters } from '@wagmi/core'\n```\n\n### account\n\n`Address | Account | undefined`\n\nAccount to use with client. Throws if account is not found on [`connector`](#connector).\n\n::: code-group\n```ts [index.ts]\nimport { getConnectorClient } from '@wagmi/core'\nimport { config } from './config'\n\nconst client = await getConnectorClient(config, {\n  account: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use with client.\n\n::: code-group\n```ts [index.ts]\nimport { getConnectorClient } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nconst client = await getConnectorClient(config, {\n  chainId: mainnet.id, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### connector\n\n`Connector | undefined`\n\n- Connector to get client for.\n- Defaults to current connector.\n\n::: code-group\n```ts [index.ts]\nimport { getConnections, getConnectorClient } from '@wagmi/core'\nimport { config } from './config'\n\nconst connections = getConnections(config)\nconst client = await getConnectorClient(config, {\n  connector: connections[0]?.connector, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetChainIdReturnType } from '@wagmi/core'\n```\n\n`Client`\n\nViem [`Client`](https://viem.sh/docs/clients/custom) object for the current or provided connector.\n\n## Error\n\n```ts\nimport { type GetConnectorClientErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n"
  },
  {
    "path": "site/core/api/actions/getConnectors.md",
    "content": "# getConnectors\n\nAction for getting configured connectors.\n\n## Import\n\n```ts\nimport { getConnectors } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getConnectors } from '@wagmi/core'\nimport { config } from './config'\n\nconst connectors = getConnectors(config)\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetConnectorsReturnType } from '@wagmi/core'\n```\n\n`readonly Connector[]`\n\nConnectors from [`config.connectors`](/core/api/createConfig#connectors-1).\n"
  },
  {
    "path": "site/core/api/actions/getContractEvents.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'getContractEvents'\nconst typeName = 'GetContractEvents'\n</script>\n\n# getContractEvents\n\nAction for fetching a list of contract event logs matching the provided parameters.\n\n## Import\n\n```ts\nimport { getContractEvents } from '@wagmi/core'\n```\n\n## Usage\n\nBy default, `getContractEvents` returns all matched events on the ABI. In practice, you must use scoping to filter for specific events.\n\n::: code-group\n```ts [index.ts]\nimport { getContractEvents } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\n// Fetch event logs for every event on every ERC-20 contract. \nconst logs = getContractEvents(config, { abi })\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type GetContractEventsParameters } from '@wagmi/core'\n```\n\n### abi\n\n`Abi`\n\nThe contract's ABI. Check out the [TypeScript docs](/react/typescript#const-assert-abis-typed-data) for how to set up ABIs for maximum type inference and safety.\n\n::: code-group\n```ts [index.ts]\nimport { getContractEvents } from '@wagmi/core'\nimport { abi } from './abi' // [!code focus]\nimport { config } from './config'\n\nconst logs = getContractEvents(config, {\n  abi, // [!code focus]\n})\n\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### address\n\n`Address | undefined`\n\nThe contract's address.\n\n::: code-group\n```ts [index.ts]\nimport { getContractEvents } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst logs = getContractEvents(config, {\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f', // [!code focus]\n  abi,\n})\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### args\n\n`object | readonly unknown[] | undefined`\n\n- Logs can be scoped to given indexed arguments.\n- Inferred from [`abi`](#abi) and [`eventName`](#eventname).\n\n::: code-group\n```ts [index.ts]\nimport { getContractEvents } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst logs = getContractEvents(config, {\n  abi,\n  eventName: 'Transfer',\n  args: { // [!code focus]\n    from: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045', // [!code focus]\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n  }, // [!code focus]\n})\n\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\nOnly indexed arguments in `event` are candidates for `args`.\n\nAn argument can also be an array to indicate that other values can exist in the position:\n\n::: code-group\n```ts [index.ts]\nimport { getContractEvents } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst logs = getContractEvents(config, {\n  abi,\n  eventName: 'Transfer',\n  args: {\n    from: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045', \n    to: [ // [!code focus]\n      '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n      '0xa5cc3c03994db5b0d9a5eedd10cabab0813678ac', // [!code focus]\n      '0xa152f8bb749c55e9943a3a0a3111d18ee2b3f94e', // [!code focus]\n    ], // [!code focus]\n  },\n})\n\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockHash\n\n`` `0x${string}` | undefined ``\n\n- Block hash to include logs from. Mutually exclusive with `fromBlock`/`toBlock`.\n\n::: code-group\n```ts [index.ts]\nimport { getContractEvents } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst logs = getContractEvents(config, {\n  abi,\n  blockHash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', // [!code focus]\n})\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```ts [index.ts]\nimport { getContractEvents } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst logs = getContractEvents(config, {\n  abi,\n  chainId: mainnet.id, // [!code focus]\n})\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### eventName\n\n`string | undefined`\n\n- Event to filter for the contract.\n- Inferred from [`abi`](#abi).\n\n::: code-group\n```ts [index.ts]\nimport { getContractEvents } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst logs = getContractEvents(config, {\n  abi,\n  eventName: 'Approval', // [!code focus]\n})\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n\n### fromBlock\n\n`bigint | 'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\n- Block to start including logs from. Mutually exclusive with `blockHash`.\n\n::: code-group\n```ts [index.ts]\nimport { getContractEvents } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst logs = getContractEvents(config, {\n  abi,\n  fromBlock: 69420n, // [!code focus]\n})\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### strict\n\n`boolean | undefined`\n\n- Flag to only return logs that conform to the indexed & non-indexed arguments on the `event`, meaning that `args` will always be defined. Defaults to `false`.\n\n::: code-group\n```ts [index.ts]\nimport { getContractEvents } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst logs = getContractEvents(config, {\n  abi,\n  strict: true, // [!code focus]\n})\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### toBlock\n\n`bigint | 'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\n- Block to stop including logs from. Mutually exclusive with `blockHash`.\n\n\n::: code-group\n```ts [index.ts]\nimport { getContractEvents } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst logs = getContractEvents(config, {\n  abi,\n  toBlock: 70120n, // [!code focus]\n})\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetContractEventsReturnType } from '@wagmi/core'\n```\n\nA list of event logs.\n\n## Type Inference\n\nWith [`abi`](#abi) setup correctly, TypeScript will infer the correct types for [`eventName`](#eventname), [`args`](#args), and [`onLogs`](#onlogs) parameters. See the Wagmi [TypeScript docs](/core/typescript) for more information.\n\n## Error\n\n```ts\nimport { type GetContractEventsError } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`getContractEvents`](https://viem.sh/docs/contract/getContractEvents)\n"
  },
  {
    "path": "site/core/api/actions/getEnsAddress.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'getEnsAddress'\nconst typeName = 'GetEnsAddress'\n</script>\n\n# getEnsAddress\n\nAction for fetching ENS address for name.\n\n## Import\n\n```ts\nimport { getEnsAddress } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getEnsAddress } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensAddress = getEnsAddress(config, {\n  name: normalize('wevm.eth'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n::: warning\nSince ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAddress`. You can use Viem's built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n:::\n\n## Parameters\n\n```ts\nimport { type GetEnsAddressParameters } from '@wagmi/core'\n```\n\n---\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to get ENS address at.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsAddress } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensAddress = getEnsAddress(config, {\n  blockNumber: 17829139n, // [!code focus]\n  name: normalize('wevm.eth'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to get ENS address at.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsAddress } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensAddress = getEnsAddress(config, {\n  blockTag: 'latest', // [!code focus]\n  name: normalize('wevm.eth'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsAddress } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensAddress = await getEnsAddress(config, {\n  chainId: mainnet.id, // [!code focus]\n  name: normalize('wevm.eth'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### coinType\n\n`number | undefined`\n\nThe [ENSIP-9](https://docs.ens.domains/ens-improvement-proposals/ensip-9-multichain-address-resolution) coin type to fetch the address for.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsAddress } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensAddress = await getEnsAddress(config, {\n  coinType: 60, // [!code focus]\n  name: normalize('wevm.eth'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### name\n\n`string`\n\nName to get the address for.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsAddress } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensAddress = await getEnsAddress(config, {\n  name: normalize('wevm.eth'), // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### universalResolverAddress\n\n`Address | undefined`\n\n- Address of ENS Universal Resolver Contract.\n- Defaults to current chain's Universal Resolver Contract address.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsAddress } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensAddress = await getEnsAddress(config, {\n  name: normalize('wevm.eth'),\n  universalResolverAddress: '0x74E20Bd2A1fE0cdbe45b9A1d89cb7e0a45b36376', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetEnsAddressReturnType } from '@wagmi/core'\n```\n\n`string`\n\nENS address.\n\n## Error\n\n```ts\nimport { type GetEnsAddressErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`getEnsAddress`](https://viem.sh/docs/ens/actions/getEnsAddress)\n"
  },
  {
    "path": "site/core/api/actions/getEnsAvatar.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'getEnsAvatar'\nconst typeName = 'GetEnsAvatar'\n</script>\n\n# getEnsAvatar\n\nAction for fetching ENS address for avatar.\n\n## Import\n\n```ts\nimport { getEnsAvatar } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getEnsAvatar } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensAvatar = await getEnsAvatar(config, {\n  name: normalize('wevm.eth'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n::: warning\nSince ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsAvatar`. You can use Viem's built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n:::\n\n## Parameters\n\n```ts\nimport { type GetEnsAvatarParameters } from '@wagmi/core'\n```\n\n---\n\n### assetGatewayUrls <Badge text=\"viem@>=2.3.1\" />\n\n`{ ipfs?: string | undefined; arweave?: string | undefined } | undefined`\n\nGateway urls to resolve IPFS and/or Arweave assets.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsAvatar } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensAvatar = await getEnsAvatar(config, {\n  assetGatewayUrls: { // [!code focus]\n    ipfs: 'https://cloudflare-ipfs.com', // [!code focus]\n  }, // [!code focus]\n  name: normalize('wevm.eth'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to get avatar at.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsAvatar } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensAvatar = await getEnsAvatar(config, {\n  blockNumber: 17829139n, // [!code focus]\n  name: normalize('wevm.eth'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to get avatar at.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsAvatar } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensAvatar = await getEnsAvatar(config, {\n  blockTag: 'latest', // [!code focus]\n  name: normalize('wevm.eth'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsAvatar } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensAvatar = await getEnsAvatar(config, {\n  chainId: mainnet.id, // [!code focus]\n  name: normalize('wevm.eth'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### gatewayUrls\n\n`string[] | undefined`\n\nA set of Universal Resolver gateways, used for resolving CCIP-Read requests made through the ENS Universal Resolver Contract.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsAvatar } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensAvatar = await getEnsAvatar(config, {\n  gatewayUrls: ['https://cloudflare-ipfs.com'] { // [!code focus]\n  name: normalize('wevm.eth'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### name\n\n`string`\n\nName to get the avatar for.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsAvatar } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensAvatar = await getEnsAvatar(config, {\n  name: normalize('wevm.eth'), // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### universalResolverAddress\n\n`Address | undefined`\n\n- Address of ENS Universal Resolver Contract.\n- Defaults to current chain's Universal Resolver Contract address.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsAvatar } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensAvatar = await getEnsAvatar(config, {\n  name: normalize('wevm.eth'),\n  universalResolverAddress: '0x74E20Bd2A1fE0cdbe45b9A1d89cb7e0a45b36376', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetEnsAvatarReturnType } from '@wagmi/core'\n```\n\n`string | null`\n\nThe avatar URI for ENS name.\n\n## Error\n\n```ts\nimport { type getEnsAvatarError } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`getEnsAvatar`](https://viem.sh/docs/ens/actions/getEnsAvatar)\n"
  },
  {
    "path": "site/core/api/actions/getEnsName.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'getEnsName'\nconst typeName = 'GetEnsName'\n</script>\n\n# getEnsName\n\nAction for fetching primary ENS name for address.\n\n## Import\n\n```ts\nimport { getEnsName } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getEnsName } from '@wagmi/core'\nimport { config } from './config'\n\nconst ensName = getEnsName(config, {\n  address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type GetEnsNameParameters } from '@wagmi/core'\n```\n\n### address\n\n`Address`\n\nAddress to get the name for.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsName } from '@wagmi/core'\nimport { config } from './config'\n\nconst ensName = await getEnsName(config, {\n  address: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to get name at.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsName } from '@wagmi/core'\nimport { config } from './config'\n\nconst ensName = getEnsName(config, {\n  address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  blockNumber: 17829139n, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to get name at.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsName } from '@wagmi/core'\nimport { config } from './config'\n\nconst ensName = getEnsName(config, {\n  address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  blockTag: 'latest', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsName } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nconst ensName = await getEnsName(config, {\n  address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  chainId: mainnet.id, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### universalResolverAddress\n\n`Address | undefined`\n\n- Address of ENS Universal Resolver Contract.\n- Defaults to current chain's Universal Resolver Contract address.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsName } from '@wagmi/core'\nimport { config } from './config'\n\nconst ensName = await getEnsName(config, {\n  address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  universalResolverName: '0x74E20Bd2A1fE0cdbe45b9A1d89cb7e0a45b36376', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetEnsNameReturnType } from '@wagmi/core'\n```\n\n`string | null`\n\nThe primary ENS name for the address. Returns `null` if address does not have primary name assigned.\n\n## Error\n\n```ts\nimport { type GetEnsNameErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`getEnsName`](https://viem.sh/docs/ens/actions/getEnsName)\n"
  },
  {
    "path": "site/core/api/actions/getEnsResolver.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'getEnsResolver'\nconst typeName = 'GetEnsResolver'\n</script>\n\n# getEnsResolver\n\nAction for fetching ENS resolver for name.\n\n## Import\n\n```ts\nimport { getEnsResolver } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getEnsResolver } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensResolver = getEnsResolver(config, {\n  name: normalize('wevm.eth'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n::: warning\nSince ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsResolver`. You can use Viem's built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n:::\n\n## Parameters\n\n```ts\nimport { type GetEnsResolverParameters } from '@wagmi/core'\n```\n\n---\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to get resolver at.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsResolver } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensResolver = getEnsResolver(config, {\n  blockNumber: 17829139n, // [!code focus]\n  name: normalize('wevm.eth'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to get resolver at.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsResolver } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensResolver = getEnsResolver(config, {\n  blockTag: 'latest', // [!code focus]\n  name: normalize('wevm.eth'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsResolver } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensResolver = await getEnsResolver(config, {\n  chainId: mainnet.id, // [!code focus]\n  name: normalize('wevm.eth'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### name\n\n`string`\n\nName to get the resolver for.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsResolver } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensResolver = await getEnsResolver(config, {\n  name: normalize('wevm.eth'), // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### universalResolverAddress\n\n`Address | undefined`\n\n- Address of ENS Universal Resolver Contract.\n- Defaults to current chain's Universal Resolver Contract address.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsResolver } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensResolver = await getEnsResolver(config, {\n  name: normalize('wevm.eth'),\n  universalResolverAddress: '0x74E20Bd2A1fE0cdbe45b9A1d89cb7e0a45b36376', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetEnsResolverReturnType } from '@wagmi/core'\n```\n\n`Address`\n\nThe address of the resolver.\n\n## Error\n\n```ts\nimport { type getEnsResolverError } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`getEnsResolver`](https://viem.sh/docs/ens/actions/getEnsResolver)\n"
  },
  {
    "path": "site/core/api/actions/getEnsText.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'getEnsText'\nconst typeName = 'GetEnsText'\n</script>\n\n# getEnsText\n\nAction for fetching a text record for a specified ENS name and key.\n\n## Import\n\n```ts\nimport { getEnsText } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getEnsText } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensText = getEnsText(config, {\n  name: normalize('wevm.eth'),\n  key: 'com.twitter',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n::: warning\nSince ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `getEnsText`. You can use Viem's built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n:::\n\n## Parameters\n\n```ts\nimport { type GetEnsTextParameters } from '@wagmi/core'\n```\n\n---\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to get the text at.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsText } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensText = getEnsText(config, {\n  blockNumber: 17829139n, // [!code focus]\n  name: normalize('wevm.eth'),\n  key: 'com.twitter',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to get the text at.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsText } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensText = getEnsText(config, {\n  blockTag: 'latest', // [!code focus]\n  name: normalize('wevm.eth'),\n  key: 'com.twitter',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsText } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensText = await getEnsText(config, {\n  chainId: mainnet.id, // [!code focus]\n  name: normalize('wevm.eth'),\n  key: 'com.twitter',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### key\n\n`string`\n\nENS key to get Text for.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsText } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensText = await getEnsText(config, {\n  name: normalize('wevm.eth'),\n  key: 'com.twitter', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### name\n\n`string`\n\nName to get the text for.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsText } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensText = await getEnsText(config, {\n  name: normalize('wevm.eth'), // [!code focus]\n  key: 'com.twitter',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### universalResolverAddress\n\n`Address | undefined`\n\n- Address of ENS Universal Resolver Contract.\n- Defaults to current chain's Universal Resolver Contract address.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsText } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst ensText = await getEnsText(config, {\n  name: normalize('wevm.eth'),\n  key: 'com.twitter',\n  universalResolverAddress: '0x74E20Bd2A1fE0cdbe45b9A1d89cb7e0a45b36376', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetEnsTextReturnType } from '@wagmi/core'\n```\n\n`string | null`\n\nThe text record for ENS name.\n\nReturns `null` if name does not have text assigned.\n\n## Error\n\n```ts\nimport { type getEnsTextError } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`getEnsText`](https://viem.sh/docs/ens/actions/getEnsText)\n"
  },
  {
    "path": "site/core/api/actions/getFeeHistory.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'getFeeHistory'\nconst typeName = 'GetFeeHistory'\n</script>\n\n# getFeeHistory\n\nAction for fetching a collection of historical gas information.\n\n## Import\n\n```ts\nimport { getFeeHistory } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getFeeHistory } from '@wagmi/core'\nimport { config } from './config'\n\nconst feeHistory = await getFeeHistory(config, {\n  blockCount: 4,\n  rewardPercentiles: [25, 75]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type GetFeeHistoryParameters } from '@wagmi/core'\n```\n\n### blockCount\n\n`number`\n\nNumber of blocks in the requested range. Between 1 and 1024 blocks can be requested in a single query. Less than requested may be returned if not all blocks are available.\n\n::: code-group\n```ts [index.ts]\nimport { getFeeHistory } from '@wagmi/core'\nimport { config } from './config'\n\nconst feeHistory = await getFeeHistory(config, {\n  blockCount: 4, // [!code focus]\n  rewardPercentiles: [25, 75]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### rewardPercentiles\n\n`number[]`\n\nA monotonically increasing list of percentile values to sample from each block's effective priority fees per gas in ascending order, weighted by gas used.\n\n::: code-group\n```ts [index.ts]\nimport { getFeeHistory } from '@wagmi/core'\nimport { config } from './config'\n\nconst feeHistory = await getFeeHistory(config, {\n  blockCount: 4,\n  rewardPercentiles: [25, 75] // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockNumber\n\n`bigint | undefined`\n\nHighest number block of the requested range.\n\n::: code-group\n```ts [index.ts]\nimport { getFeeHistory } from '@wagmi/core'\nimport { config } from './config'\n\nconst feeHistory = await getFeeHistory(config, {\n  blockCount: 4,\n  blockNumber: 1551231n, // [!code focus]\n  rewardPercentiles: [25, 75],\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag of the highest number block of the requested range.\n\n::: code-group\n```ts [index.ts]\nimport { getFeeHistory } from '@wagmi/core'\nimport { config } from './config'\n\nconst feeHistory = await getFeeHistory(config, {\n  blockCount: 4,\n  blockTag: 'safe', // [!code focus]\n  rewardPercentiles: [25, 75],\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```ts [index.ts]\nimport { getFeeHistory } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nconst feeHistory = await getFeeHistory(config, {\n  blockCount: 4,\n  chainId: mainnet.id, // [!code focus]\n  rewardPercentiles: [25, 75],\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetFeeHistoryReturnType } from '@wagmi/core'\n```\n\n[`FeeHistory`](https://viem.sh/docs/glossary/types#feehistory)\n\nThe fee history.\n\n## Error\n\n```ts\nimport { type GetFeeHistoryErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`getFeeHistory`](https://viem.sh/docs/actions/public/getFeeHistory)\n"
  },
  {
    "path": "site/core/api/actions/getGasPrice.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'getGasPrice'\nconst typeName = 'GetGasPrice'\n</script>\n\n# getGasPrice\n\nAction for fetching the current price of gas (in wei).\n\n## Import\n\n```ts\nimport { getGasPrice } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getGasPrice } from '@wagmi/core'\nimport { config } from './config'\n\nconst gasPrice = await getGasPrice(config)\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type GetGasPriceParameters } from '@wagmi/core'\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```ts [index.ts]\nimport { getGasPrice } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nconst gasPrice = await getGasPrice(config, {\n  chainId: mainnet.id, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetGasPriceReturnType } from '@wagmi/core'\n```\n\n`bigint`\n\nCurrent price of gas (in wei).\n\n## Error\n\n```ts\nimport { type GetGasPriceErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`getGasPrice`](https://viem.sh/docs/actions/public/getGasPrice)\n"
  },
  {
    "path": "site/core/api/actions/getProof.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'getProof'\nconst typeName = 'getProof'\n</script>\n\n# getProof\n\nAction for return the account and storage values of the specified account including the Merkle-proof.\n\n## Import\n\n```ts\nimport { getProof } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getProof } from '@wagmi/core'\nimport { config } from './config'\n\nawait getProof(config, {\n  address: '0x4200000000000000000000000000000000000016',\n  storageKeys: [\n    '0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99',\n  ],\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type GetProofParameters } from '@wagmi/core'\n```\n\n### address\n\n`Address`\n\nThe account address to get the proof for.\n\n::: code-group\n```ts [index.ts]\nimport { getProof } from '@wagmi/core'\nimport { config } from './config'\n\nawait getProof(config, {\n  address: '0x4200000000000000000000000000000000000016', // [!code focus]\n  storageKeys: [\n    '0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99',\n  ],\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### storageKeys\n\n`` `0x${string}`[] ``\n\nArray of storage-keys that should be proofed and included.\n\n::: code-group\n```ts [index.ts]\nimport { getProof } from '@wagmi/core'\nimport { config } from './config'\n\nawait getProof(config, {\n  address: '0x4200000000000000000000000000000000000016',\n  storageKeys: [ // [!code focus:3]\n    '0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99',\n  ],\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockNumber\n\n`bigint | undefined`\n\nProof at a given block number.\n\n::: code-group\n```ts [index.ts]\nimport { getProof } from '@wagmi/core'\nimport { config } from './config'\n\nawait getProof(config, {\n  address: '0x4200000000000000000000000000000000000016',\n  blockNumber: 42069n, // [!code focus]\n  storageKeys: [\n    '0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99',\n  ],\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nProof at a given block tag.\n\n::: code-group\n```ts [index.ts]\nimport { getProof } from '@wagmi/core'\nimport { config } from './config'\n\nawait getProof(config, {\n  address: '0x4200000000000000000000000000000000000016',\n  blockTag: 'latest', // [!code focus]\n  storageKeys: [\n    '0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99',\n  ],\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nThe ID of chain to get the proof for.\n\n::: code-group\n```ts [index.ts]\nimport { getProof } from '@wagmi/core'\nimport { config } from './config'\nimport { optimism } from '@wagmi/core/chains'\n\nawait getProof(config, {\n  chainId: optimism.id, // [!code focus]\n  address: '0x4200000000000000000000000000000000000016',\n  storageKeys: [\n    '0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99',\n  ],\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetProofReturnType } from '@wagmi/core'\n```\n\n`Proof`\n\nProof data.\n\n## Error\n\n```ts\nimport { type GetProofErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`getProof`](https://viem.sh/docs/actions/public/getProof)\n"
  },
  {
    "path": "site/core/api/actions/getPublicClient.md",
    "content": "# getPublicClient\n\nAction for getting Viem [`PublicClient`](https://viem.sh/docs/clients/public) instance.\n\n## Import\n\n```ts\nimport { getPublicClient } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getPublicClient } from '@wagmi/core'\nimport { config } from './config'\n\nconst client = getPublicClient(config)\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n::: warning\nIf 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.\n:::\n\n## Parameters\n\n```ts\nimport { type GetClientParameters } from '@wagmi/core'\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when getting Viem Public Client.\n\n::: code-group\n```ts [index.ts]\nimport { getPublicClient } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nconst client = getPublicClient(config, {\n  chainId: mainnet.id, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetPublicClientReturnType } from '@wagmi/core'\n```\n\n`PublicClient | undefined`\n\nViem [`PublicClient`](https://viem.sh/docs/clients/public) instance.\n"
  },
  {
    "path": "site/core/api/actions/getStorageAt.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'getStorageAt'\nconst typeName = 'getStorageAt'\n</script>\n\n# getStorageAt\n\nAction for returning the value from a storage slot at a given address.\n\n## Import\n\n```ts\nimport { getStorageAt } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getStorageAt } from '@wagmi/core'\nimport { config } from './config'\n\nawait getStorageAt(config, {\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  slot: '0x0',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type GetStorageAtParameters } from '@wagmi/core'\n```\n\n### address\n\n`Address`\n\nThe contract address.\n\n::: code-group\n```ts [index.ts]\nimport { getStorageAt } from '@wagmi/core'\nimport { config } from './config'\n\nawait getStorageAt(config, {\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', // [!code focus]\n  slot: '0x0',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### slot\n\n`Hex`\n\nThe storage position (as a hex encoded value).\n\n::: code-group\n```ts [index.ts]\nimport { getStorageAt } from '@wagmi/core'\nimport { config } from './config'\n\nawait getStorageAt(config, {\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  slot: '0x0', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockNumber\n\n`bigint | undefined`\n\nThe block number to check the storage at.\n\n::: code-group\n```ts [index.ts]\nimport { getStorageAt } from '@wagmi/core'\nimport { config } from './config'\n\nawait getStorageAt(config, {\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  blockNumber: 16280770n, // [!code focus]\n  slot: '0x0',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nThe block tag to check the storage at.\n\n::: code-group\n```ts [index.ts]\nimport { getStorageAt } from '@wagmi/core'\nimport { config } from './config'\n\nawait getStorageAt(config, {\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  blockTag: 'safe', // [!code focus]\n  slot: '0x0',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nThe chain ID to check the storage at.\n\n::: code-group\n```ts [index.ts]\nimport { getStorageAt } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nawait getStorageAt(config, {\n  chainId: mainnet.id, // [!code focus]\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  slot: '0x0',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetStorageAtReturnType } from '@wagmi/core'\n```\n\n`Hex`\n\nThe value of the storage slot.\n\n## Error\n\n```ts\nimport { type GetStorageAtErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`getStorageAt`](https://viem.sh/docs/contract/getStorageAt)\n"
  },
  {
    "path": "site/core/api/actions/getTransaction.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'getTransaction'\nconst typeName = 'GetTransaction'\n</script>\n\n# getTransaction\n\nAction for fetching transactions given hashes or block identifiers.\n\n## Import\n\n```ts\nimport { getTransaction } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getTransaction } from '@wagmi/core'\nimport { config } from './config'\n\nconst transaction = getTransaction(config, {\n  hash: '0x0fa64daeae54e207aa98613e308c2ba8abfe274f75507e741508cc4db82c8cb5',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type GetTransactionParameters } from '@wagmi/core'\n```\n\n---\n\n### blockHash\n\n`bigint | undefined`\n\nBlock hash to get transaction at (with [`index`](#index)).\n\n::: code-group\n```ts [index.ts]\nimport { getTransaction } from '@wagmi/core'\nimport { config } from './config'\n\nconst transaction = getTransaction(config, {\n  blockHash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', // [!code focus]\n  index: 0,\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to get transaction at (with [`index`](#index)).\n\n::: code-group\n```ts [index.ts]\nimport { getTransaction } from '@wagmi/core'\nimport { config } from './config'\n\nconst transaction = getTransaction(config, {\n  blockNumber: 17829139n, // [!code focus]\n  index: 0,\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to get transaction at (with [`index`](#index)).\n\n::: code-group\n```ts [index.ts]\nimport { getTransaction } from '@wagmi/core'\nimport { config } from './config'\n\nconst transaction = getTransaction(config, {\n  blockTag: 'safe', // [!code focus]\n  index: 0,\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```ts [index.ts]\nimport { getTransaction } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nconst transaction = await getTransaction(config, {\n  chainId: mainnet.id, // [!code focus]\n  hash: '0x0fa64daeae54e207aa98613e308c2ba8abfe274f75507e741508cc4db82c8cb5',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### hash\n\n`` `0x${string}` | undefined ``\n\nHash to get transaction.\n\n::: code-group\n```ts [index.ts]\nimport { getTransaction } from '@wagmi/core'\nimport { config } from './config'\n\nconst transaction = getTransaction(config, {\n  hash: '0x0fa64daeae54e207aa98613e308c2ba8abfe274f75507e741508cc4db82c8cb5', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### index\n\n`number | undefined`\n\nAn index to be used with a block identifier ([hash](#blockhash), [number](#blocknumber), or [tag](#blocktag)).\n\n::: code-group\n```ts [index.ts]\nimport { getTransaction } from '@wagmi/core'\nimport { config } from './config'\n\nconst transaction = getTransaction(config, {\n  blockTag: 'safe',\n  index: 0  // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetTransactionReturnType } from '@wagmi/core'\n```\n\n[`Transaction`](https://viem.sh/docs/glossary/types#transaction)\n\n## Error\n\n```ts\nimport { type GetTransactionErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`getTransaction`](https://viem.sh/docs/actions/public/getTransaction)\n"
  },
  {
    "path": "site/core/api/actions/getTransactionConfirmations.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'getTransactionConfirmations'\nconst typeName = 'GetTransactionConfirmations'\n</script>\n\n# getTransactionConfirmations\n\nAction for fetching the number of blocks passed (confirmations) since the transaction was processed on a block. If confirmations is 0, then the Transaction has not been confirmed & processed yet.\n\n## Import\n\n```ts\nimport { getTransactionConfirmations } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getTransactionConfirmations } from '@wagmi/core'\nimport { config } from './config'\n\nconst transaction = getTransactionConfirmations(config, {\n  hash: '0x0fa64daeae54e207aa98613e308c2ba8abfe274f75507e741508cc4db82c8cb5',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type GetTransactionConfirmationsParameters } from '@wagmi/core'\n```\n\n---\n\n### hash\n\n`` `0x${string}` | undefined ``\n\nThe hash of the transaction.\n\n::: code-group\n```ts [index.ts]\nimport { getTransactionConfirmations } from '@wagmi/core'\nimport { config } from './config'\n\nconst transaction = getTransactionConfirmations(config, {\n  hash: '0x0fa64daeae54e207aa98613e308c2ba8abfe274f75507e741508cc4db82c8cb5', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### transactionReceipt\n\n`TransactionReceipt | undefined`\n\nThe transaction receipt.\n\n::: code-group\n```ts [index.ts]\nimport { getTransactionConfirmations } from '@wagmi/core'\nimport { config } from './config'\n\nconst transaction = getTransactionConfirmations(config, {\n  transactionReceipt: { ... }, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```ts [index.ts]\nimport { getTransactionConfirmations } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nconst transaction = await getTransactionConfirmations(config, {\n  chainId: mainnet.id, // [!code focus]\n  hash: '0x0fa64daeae54e207aa98613e308c2ba8abfe274f75507e741508cc4db82c8cb5',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetTransactionConfirmationsReturnType } from '@wagmi/core'\n```\n\n`bigint`\n\nThe number of blocks passed since the transaction was processed. If confirmations is 0, then the Transaction has not been confirmed & processed yet.\n\n## Error\n\n```ts\nimport { type GetTransactionConfirmationsErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`getTransactionConfirmations`](https://viem.sh/docs/actions/public/getTransactionConfirmations)\n"
  },
  {
    "path": "site/core/api/actions/getTransactionCount.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'getTransactionCount'\nconst typeName = 'GetTransactionCount'\n</script>\n\n# getTransactionCount\n\nAction for fetching the number of transactions an Account has sent.\n\n## Import\n\n```ts\nimport { getTransactionCount } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getTransactionCount } from '@wagmi/core'\nimport { config } from './config'\n\nconst transactionCount = getTransactionCount(config, {\n  address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type GetTransactionCountParameters } from '@wagmi/core'\n```\n\n---\n\n### address\n\n`Address`\n\nThe address of the account.\n\n::: code-group\n```ts [index.ts]\nimport { getTransactionCount } from '@wagmi/core'\nimport { config } from './config'\n\nconst transactionCount = getTransactionCount(config, {\n  address: '0x4557B18E779944BFE9d78A672452331C186a9f48', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### blockNumber\n\n`bigint | undefined`\n\nGet the count at a block number.\n\n::: code-group\n```ts [index.ts]\nimport { getTransactionCount } from '@wagmi/core'\nimport { config } from './config'\n\nconst transactionCount = getTransactionCount(config, {\n  address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n  blockNumber: 17829139n, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nGet the count at a block tag.\n\n::: code-group\n```ts [index.ts]\nimport { getTransactionCount } from '@wagmi/core'\nimport { config } from './config'\n\nconst transactionCount = getTransactionCount(config, {\n  address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n  blockTag: 'latest', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```ts [index.ts]\nimport { getTransactionCount } from '@wagmi/core'\nimport { config } from './config'\n\nconst transactionCount = getTransactionCount(config, {\n  address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n  chainId: mainnet.id, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n\n## Return Type\n\n```ts\nimport { type GetTransactionCountReturnType } from '@wagmi/core'\n```\n\n`number`\n\nThe number of transactions an account has sent.\n\n## Error\n\n```ts\nimport { type GetTransactionCountErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`getTransactionCount`](https://viem.sh/docs/actions/public/getTransactionCount)\n"
  },
  {
    "path": "site/core/api/actions/getTransactionReceipt.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'getTransactionReceipt'\nconst typeName = 'getTransactionReceipt'\n</script>\n\n# getTransactionReceipt\n\nAction for return the [Transaction Receipt](https://viem.sh/docs/glossary/terms#transaction-receipt) given a [Transaction](https://viem.sh/docs/glossary/terms#transaction) hash.\n\n## Import\n\n```ts\nimport { getTransactionReceipt } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getTransactionReceipt } from '@wagmi/core'\nimport { config } from './config'\n\nawait getTransactionReceipt(config, {\n  hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type GetTransactionReceiptParameters } from '@wagmi/core'\n```\n\n### hash\n\n`` `0x${string}` ``\n\nA transaction hash.\n\n::: code-group\n```ts [index.ts]\nimport { getTransactionReceipt } from '@wagmi/core'\nimport { config } from './config'\n\nawait getTransactionReceipt(config, {\n  hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nThe ID of chain to return the transaction receipt from.\n\n::: code-group\n```ts [index.ts]\nimport { getTransactionReceipt } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nawait getTransactionReceipt(config, {\n  chainId: mainnet.id, // [!code focus]\n  hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetTransactionReceiptReturnType } from '@wagmi/core'\n```\n\n[`TransactionReceipt`](https://viem.sh/docs/glossary/types#transactionreceipt)\n\nThe transaction receipt.\n\n## Error\n\n```ts\nimport { type GetTransactionReceiptErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`getTransactionReceipt`](https://viem.sh/docs/actions/public/getTransactionReceipt)\n"
  },
  {
    "path": "site/core/api/actions/getWalletClient.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'getWalletClient'\nconst typeName = 'GetWalletClient'\n</script>\n\n# getWalletClient\n\nAction for getting a Viem [`WalletClient`](https://viem.sh/docs/clients/wallet) object for the current or provided connector.\n\n## Import\n\n```ts\nimport { getWalletClient } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getWalletClient } from '@wagmi/core'\nimport { config } from './config'\n\nconst client = getWalletClient(config)\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n::: warning\nIf 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.\n:::\n\n## Parameters\n\n```ts\nimport { type GetWalletClientParameters } from '@wagmi/core'\n```\n\n### account\n\n`Address | Account | undefined`\n\nAccount to use with client. Throws if account is not found on [`connector`](#connector).\n\n::: code-group\n```ts [index.ts]\nimport { getWalletClient } from '@wagmi/core'\nimport { config } from './config'\n\nconst client = getWalletClient(config, {\n  account: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use with client.\n\n::: code-group\n```ts [index.ts]\nimport { getWalletClient } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nconst client = getWalletClient(config, {\n  chainId: mainnet.id, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### connector\n\n`Connector | undefined`\n\n- Connector to get client for.\n- Defaults to current connector.\n\n::: code-group\n```ts [index.ts]\nimport { getConnections, getWalletClient } from '@wagmi/core'\nimport { config } from './config'\n\nconst connections = getConnections(config)\nconst client = getWalletClient(config, {\n  connector: connections[0]?.connector, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type GetChainIdReturnType } from '@wagmi/core'\n```\n\n`WalletClient`\n\nViem [`WalletClient`](https://viem.sh/docs/clients/wallet) object for the current or provided connector.\n\n## Error\n\n```ts\nimport { type GetWalletClientErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->"
  },
  {
    "path": "site/core/api/actions/multicall.md",
    "content": "# multicall\n\nAction for batching up multiple functions on a contract in a single RPC call via the [Multicall3 contract](https://github.com/mds1/multicall).\n\n## Import\n\n```ts\nimport { multicall } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { multicall } from '@wagmi/core'\nimport { config } from './config'\n\nconst wagmigotchiContract = {\n  address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',\n  abi: wagmigotchiABI,\n} as const\nconst mlootContract = {\n  address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n  abi: mlootABI,\n} as const\n\nconst result = await multicall(config, {\n  contracts: [\n    {\n      ...wagmigotchiContract,\n      functionName: 'getAlive',\n    },\n    {\n      ...wagmigotchiContract,\n      functionName: 'getBoredom',\n    },\n    {\n      ...mlootContract,\n      functionName: 'getChest',\n      args: [69],\n    },\n    {\n      ...mlootContract,\n      functionName: 'getWaist',\n      args: [69],\n    },\n  ],\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type MulticallParameters } from '@wagmi/core'\n```\n\n### contracts\n\n`readonly Contract[]`\n\nSet of contracts to call.\n\n#### abi\n\n`Abi | undefined`\n\nThe contract's ABI. Check out the [TypeScript docs](/react/typescript#const-assert-abis-typed-data) for how to set up ABIs for maximum type inference and safety.\n\n::: code-group\n```tsx [index.tsx]\nimport { multicall } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await multicall(config, {\n  contracts: [\n    {\n      address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n      abi: mlootABI, // [!code hl]\n      functionName: 'getChest',\n      args: [69],\n    },\n    // ...\n  ],\n})\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n#### address\n\n`Address | undefined`\n\nThe contract's address.\n\n::: code-group\n```tsx [index.tsx]\nimport { multicall } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await multicall(config, {\n  contracts: [\n    {\n      address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df', // [!code hl]\n      abi: mlootABI,\n      functionName: 'getChest',\n      args: [69],\n    },\n    // ...\n  ],\n})\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n#### args\n\n`readonly unknown[] | undefined`\n\n- Arguments to pass when calling the contract.\n- Inferred from [`abi`](#abi) and [`functionName`](#functionname).\n\n::: code-group\n```tsx [index.tsx]\nimport { multicall } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await multicall(config, {\n  contracts: [\n    {\n      address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n      abi: mlootABI,\n      functionName: 'getChest',\n      args: [69], // [!code hl]\n    },\n    // ...\n  ],\n})\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n#### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```tsx [index.tsx]\nimport { multicall } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await multicall(config, {\n  contracts: [\n    {\n      address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n      abi: mlootABI,\n      functionName: 'getChest',\n      args: [69],\n      chainId: 1, // [!code hl]\n    },\n    // ...\n  ],\n})\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n\n#### functionName\n\n`string | undefined`\n\n- Function to call on the contract.\n- Inferred from [`abi`](#abi).\n\n::: code-group\n```tsx [index.tsx]\nimport { multicall } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await multicall(config, {\n  contracts: [\n    {\n      address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n      abi: mlootABI,\n      functionName: 'getChest', // [!code hl]\n      args: [69],\n    },\n    // ...\n  ],\n})\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### allowFailure\n\n`boolean`\n\nWhether or not the Hook should throw if a call reverts. If set to `true` (default), and a call reverts, then `multicall` will fail silently and its error will be logged in the results array. Defaults to `true`.\n\n::: code-group\n```tsx [index.tsx]\nimport { multicall } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await multicall(config, {\n  allowFailure: false, // [!code hl]\n  contracts: [\n    {\n      address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n      abi: mlootABI,\n      functionName: 'getChest',\n      args: [69],\n    },\n    // ...\n  ],\n})\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### batchSize\n\n`number`\n\nThe maximum size (in bytes) for each calldata chunk. Set to `0` to disable the size limit. Defaults to `1024`.\n\n> Note: Some RPC Providers limit the amount of calldata (`data`) that can be sent in a single `eth_call` request. It is best to check with your RPC Provider to see if there are any calldata size limits to `eth_call` requests.\n\n::: code-group\n```tsx [index.tsx]\nimport { multicall } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await multicall(config, {\n  batchSize: 1_024, // [!code hl]\n  contracts: [\n    {\n      address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n      abi: mlootABI,\n      functionName: 'getChest',\n      args: [69],\n    },\n    // ...\n  ],\n})\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockNumber\n\n`number`\n\nThe block number to perform the read against.\n\n::: code-group\n```tsx [index.tsx]\nimport { multicall } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await multicall(config, {\n  blockNumber: 69420n, // [!code hl]\n  contracts: [\n    {\n      address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n      abi: mlootABI,\n      functionName: 'getChest',\n      args: [69],\n    },\n    // ...\n  ],\n})\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to read against.\n\n::: code-group\n```tsx [index.tsx]\nimport { multicall } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await multicall(config, {\n  blockTag: 'safe', // [!code hl]\n  contracts: [\n    {\n      address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n      abi: mlootABI,\n      functionName: 'getChest',\n      args: [69],\n    },\n    // ...\n  ],\n})\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### multicallAddress\n\n`Address`\n\nAddress of multicall contract.\n\n::: code-group\n```tsx [index.tsx]\nimport { multicall } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await multicall(config, {\n  contracts: [\n    {\n      address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n      abi: mlootABI,\n      functionName: 'getChest',\n      args: [69],\n    },\n    // ...\n  ],\n  multicallAddress: '0xca11bde05977b3631167028862be2a173976ca11', // [!code hl]\n})\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n\n## Return Type\n\n```ts\nimport { type MulticallReturnType } from '@wagmi/core'\n```\n\n## Type Inference\n\nWith [`contracts[number]['abi']`](#abi) setup correctly, TypeScript will infer the correct types for [`functionName`](#functionname), [`args`](#args), and the return type. See the Wagmi [TypeScript docs](/core/typescript) for more information.\n\n## Error\n\n```ts\nimport { type MulticallErrorType } from '@wagmi/core'\n```\n\n## Viem\n\n- [`multicall`](https://viem.sh/docs/contract/multicall)\n"
  },
  {
    "path": "site/core/api/actions/prepareTransactionRequest.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'prepareTransactionRequest'\nconst typeName = 'prepareTransactionRequest'\n</script>\n\n# prepareTransactionRequest\n\nAction for preparing a transaction request for signing by populating a nonce, gas limit, fee values, and a transaction type.\n\n## Import\n\n```ts\nimport { prepareTransactionRequest } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { prepareTransactionRequest } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nawait prepareTransactionRequest(config, {\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  value: parseEther('1'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type PrepareTransactionRequestParameters } from '@wagmi/core'\n```\n\n### account\n\n`Account | Address | undefined`\n\nThe Account to send the transaction from. \n\n::: code-group\n```ts [index.ts]\nimport { prepareTransactionRequest } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nawait prepareTransactionRequest(config, {\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', // [!code focus]\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  value: parseEther('1'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### to\n\n`` `0x${string}` | undefined ``\n\nThe transaction recipient or contract address.\n\n::: code-group\n```ts [index.ts]\nimport { prepareTransactionRequest } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nawait prepareTransactionRequest(config, {\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',  // [!code focus]\n  value: parseEther('1'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### accessList\n\n`AccessList | undefined`\n\nThe access list.\n\n::: code-group\n```ts [index.ts]\nimport { prepareTransactionRequest } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nawait prepareTransactionRequest(config, {\n  accessList: [ // [!code focus:6]\n    {\n      address: '0x1',\n      storageKeys: ['0x1'],\n    },\n  ],\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  value: parseEther('1'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nChain ID to prepare the transaction request for.\n\n::: code-group\n```ts [index.ts]\nimport { prepareTransactionRequest } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nawait prepareTransactionRequest(config, {\n  chainId: mainnet.id, // [!code focus]\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  value: parseEther('1'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### data\n\n`` `0x${string}` | undefined ``\n\nA contract hashed method call with encoded args.\n\n::: code-group\n```ts [index.ts]\nimport { prepareTransactionRequest } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nawait prepareTransactionRequest(config, {\n  data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', // [!code focus]\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  value: parseEther('1'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### gasPrice\n\n`bigint | undefined`\n\nThe price (in wei) to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms#legacy-transaction).\n\n::: code-group\n```ts [index.ts]\nimport { prepareTransactionRequest } from '@wagmi/core'\nimport { parseEther, parseGwei } from 'viem'\nimport { config } from './config'\n\nawait prepareTransactionRequest(config, {\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  gasPrice: parseGwei('20'), // [!code focus]\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  value: parseEther('1'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### maxFeePerGas\n\n`bigint | undefined`\n\nTotal fee per gas (in wei), inclusive of `maxPriorityFeePerGas`. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n```ts [index.ts]\nimport { prepareTransactionRequest } from '@wagmi/core'\nimport { parseEther, parseGwei } from 'viem'\nimport { config } from './config'\n\nawait prepareTransactionRequest(config, {\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  maxFeePerGas: parseGwei('20'), // [!code focus]\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  value: parseEther('1'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### maxPriorityFeePerGas\n\n`bigint | undefined`\n\nMax priority fee per gas (in wei). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n```ts [index.ts]\nimport { prepareTransactionRequest } from '@wagmi/core'\nimport { parseEther, parseGwei } from 'viem'\nimport { config } from './config'\n\nawait prepareTransactionRequest(config, {\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  maxFeePerGas: parseGwei('20'),\n  maxPriorityFeePerGas: parseGwei('2'), // [!code focus]\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  value: parseEther('1'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### nonce\n\n`number | undefined`\n\nUnique number identifying this transaction.\n\n::: code-group\n```ts [index.ts]\nimport { prepareTransactionRequest } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nawait prepareTransactionRequest(config, {\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  value: parseEther('1'),\n  nonce: 5, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### parameters\n\n`(\"fees\" | \"gas\" | \"nonce\" | \"type\")[] | undefined`\n\nParameters to prepare.\n\nFor instance, if `[\"gas\", \"nonce\"]` is provided, then only the `gas` and `nonce` parameters will be prepared.\n\n::: code-group\n```ts [index.ts]\nimport { prepareTransactionRequest } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nawait prepareTransactionRequest(config, {\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  parameters: ['gas', 'nonce'], // [!code focus]\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  value: parseEther('1'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### value\n\n`bigint | undefined`\n\nThe transaction recipient or contract address.\n\n::: code-group\n```ts [index.ts]\nimport { prepareTransactionRequest } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nawait prepareTransactionRequest(config, {\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  value: parseEther('1'), // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type PrepareTransactionRequestReturnType } from '@wagmi/core'\n```\n\n[`TransactionRequest`](https://viem.sh/docs/glossary/types#transactionrequest)\n\nThe transaction request.\n\n## Error\n\n```ts\nimport { type PrepareTransactionRequestErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`prepareTransactionRequest`](https://viem.sh/docs/actions/wallet/prepareTransactionRequest)\n"
  },
  {
    "path": "site/core/api/actions/readContract.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'readContract'\nconst typeName = 'ReadContract'\n</script>\n\n# readContract\n\nAction for calling a **read-only** function on a contract, and returning the response.\n\nA **read-only** function (constant function) on a Solidity contract is denoted by a pure or view keyword. They can only read the state of the contract, and cannot make any changes to it. Since read-only methods do not change the state of the contract, they do not require any gas to be executed, and can be called by any user without the need to pay for gas.\n\n## Import\n\n```ts\nimport { readContract } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { readContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await readContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'totalSupply',\n})\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type ReadContractParameters } from '@wagmi/core'\n```\n\n### abi\n\n`Abi`\n\nThe contract's ABI. Check out the [TypeScript docs](/react/typescript#const-assert-abis-typed-data) for how to set up ABIs for maximum type inference and safety.\n\n::: code-group\n```ts [index.ts]\nimport { readContract } from '@wagmi/core'\nimport { abi } from './abi' // [!code focus]\nimport { config } from './config'\n\nconst result = await readContract(config, {\n  abi, // [!code focus]\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'totalSupply',\n})\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### account\n\n`Account | undefined`\n\nAccount to use when calling the contract (`msg.sender`).\n\n::: code-group\n```ts [index.ts]\nimport { readContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await readContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'balanceOf',\n  args: ['0xd2135CfB216b74109775236E36d4b433F1DF507B'],\n  account: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n})\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### address\n\n`Address`\n\nThe contract's address.\n\n::: code-group\n```ts [index.ts]\nimport { readContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await readContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f', // [!code focus]\n  functionName: 'totalSupply',\n})\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### args\n\n`readonly unknown[] | undefined`\n\n- Arguments to pass when calling the contract.\n- Inferred from [`abi`](#abi) and [`functionName`](#functionname).\n\n::: code-group\n```ts [index.ts]\nimport { readContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await readContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'balanceOf',\n  args: ['0xd2135CfB216b74109775236E36d4b433F1DF507B'], // [!code focus]\n})\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to call contract at.\n\n::: code-group\n```ts [index.ts]\nimport { readContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await readContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'totalSupply',\n  blockNumber: 17829139n, // [!code focus]\n})\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to call contract at.\n\n::: code-group\n```ts [index.ts]\nimport { readContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await readContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'totalSupply',\n  blockTag: 'safe', // [!code focus]\n})\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```ts [index.ts]\nimport { readContract } from '@wagmi/core'\nimport { mainnet } from 'wagmi/chains' // [!code focus]\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await readContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'totalSupply',\n  chainId: mainnet.id, // [!code focus]\n})\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### functionName\n\n`string`\n\n- Function to call on the contract.\n- Inferred from [`abi`](#abi).\n\n::: code-group\n```ts [index.ts]\nimport { readContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await readContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'balanceOf', // [!code focus]\n  args: ['0xd2135CfB216b74109775236E36d4b433F1DF507B'],\n})\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type ReadContractReturnType } from '@wagmi/core'\n```\n\n`unknown`\n\n- Result of contract read-only function.\n- Inferred from [`abi`](#abi), [`functionName`](#functionname), and [`args`](#args).\n\n## Type Inference\n\nWith [`abi`](#abi) setup correctly, TypeScript will infer the correct types for [`functionName`](#functionname), [`args`](#args), and the return type. See the Wagmi [TypeScript docs](/core/typescript) for more information.\n\n## Error\n\n```ts\nimport { type ReadContractErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`readContract`](https://viem.sh/docs/contract/readContract)\n"
  },
  {
    "path": "site/core/api/actions/readContracts.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'readContracts'\nconst typeName = 'ReadContracts'\n</script>\n\n# readContracts\n\nAction for calling multiple read methods on a contract.\n\n## Import\n\n```ts\nimport { readContracts } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { readContracts } from '@wagmi/core'\nimport { config } from './config'\n\nconst wagmigotchiContract = {\n  address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',\n  abi: wagmigotchiABI,\n} as const\nconst mlootContract = {\n  address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n  abi: mlootABI,\n} as const\n\nconst result = await readContracts(config, {\n  contracts: [\n    {\n      ...wagmigotchiContract,\n      functionName: 'getAlive',\n    },\n    {\n      ...wagmigotchiContract,\n      functionName: 'getBoredom',\n    },\n    {\n      ...mlootContract,\n      functionName: 'getChest',\n      args: [69],\n    },\n    {\n      ...mlootContract,\n      functionName: 'getWaist',\n      args: [69],\n    },\n  ],\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type ReadContractsParameters } from '@wagmi/core'\n```\n\n### contracts\n\n`readonly Contract[]`\n\nSet of contracts to call.\n\n#### abi\n\n`Abi | undefined`\n\nThe contract's ABI. Check out the [TypeScript docs](/react/typescript#const-assert-abis-typed-data) for how to set up ABIs for maximum type inference and safety.\n\n::: code-group\n```tsx [index.tsx]\nimport { readContracts } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await readContracts(config, {\n  contracts: [\n    {\n      address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n      abi: mlootABI, // [!code hl]\n      functionName: 'getChest',\n      args: [69],\n    },\n    // ...\n  ],\n})\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n#### address\n\n`Address | undefined`\n\nThe contract's address.\n\n::: code-group\n```tsx [index.tsx]\nimport { readContracts } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await readContracts(config, {\n  contracts: [\n    {\n      address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df', // [!code hl]\n      abi: mlootABI,\n      functionName: 'getChest',\n      args: [69],\n    },\n    // ...\n  ],\n})\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n#### args\n\n`readonly unknown[] | undefined`\n\n- Arguments to pass when calling the contract.\n- Inferred from [`abi`](#abi) and [`functionName`](#functionname).\n\n::: code-group\n```tsx [index.tsx]\nimport { readContracts } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await readContracts(config, {\n  contracts: [\n    {\n      address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n      abi: mlootABI,\n      functionName: 'getChest',\n      args: [69], // [!code hl]\n    },\n    // ...\n  ],\n})\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n#### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```tsx [index.tsx]\nimport { readContracts } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await readContracts(config, {\n  contracts: [\n    {\n      address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n      abi: mlootABI,\n      functionName: 'getChest',\n      args: [69],\n      chainId: 1, // [!code hl]\n    },\n    // ...\n  ],\n})\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n\n#### functionName\n\n`string | undefined`\n\n- Function to call on the contract.\n- Inferred from [`abi`](#abi).\n\n::: code-group\n```tsx [index.tsx]\nimport { readContracts } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await readContracts(config, {\n  contracts: [\n    {\n      address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n      abi: mlootABI,\n      functionName: 'getChest', // [!code hl]\n      args: [69],\n    },\n    // ...\n  ],\n})\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### allowFailure\n\n`boolean`\n\nWhether or not the Hook should throw if a call reverts. If set to `true` (default), and a call reverts, then `readContracts` will fail silently and its error will be logged in the results array. Defaults to `true`.\n\n::: code-group\n```tsx [index.tsx]\nimport { readContracts } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await readContracts(config, {\n  allowFailure: false, // [!code hl]\n  contracts: [\n    {\n      address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n      abi: mlootABI,\n      functionName: 'getChest',\n      args: [69],\n    },\n    // ...\n  ],\n})\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### batchSize\n\n`number`\n\nThe maximum size (in bytes) for each calldata chunk. Set to `0` to disable the size limit. Defaults to `1024`.\n\n> Note: Some RPC Providers limit the amount of calldata (`data`) that can be sent in a single `eth_call` request. It is best to check with your RPC Provider to see if there are any calldata size limits to `eth_call` requests.\n\n::: code-group\n```tsx [index.tsx]\nimport { readContracts } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await readContracts(config, {\n  batchSize: 1_024, // [!code hl]\n  contracts: [\n    {\n      address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n      abi: mlootABI,\n      functionName: 'getChest',\n      args: [69],\n    },\n    // ...\n  ],\n})\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockNumber\n\n`number`\n\nThe block number to perform the read against.\n\n::: code-group\n```tsx [index.tsx]\nimport { readContracts } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await readContracts(config, {\n  blockNumber: 69420n, // [!code hl]\n  contracts: [\n    {\n      address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n      abi: mlootABI,\n      functionName: 'getChest',\n      args: [69],\n    },\n    // ...\n  ],\n})\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to read against.\n\n::: code-group\n```tsx [index.tsx]\nimport { readContracts } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await readContracts(config, {\n  blockTag: 'safe', // [!code hl]\n  contracts: [\n    {\n      address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n      abi: mlootABI,\n      functionName: 'getChest',\n      args: [69],\n    },\n    // ...\n  ],\n})\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### multicallAddress\n\n`Address`\n\nAddress of multicall contract.\n\n::: code-group\n```tsx [index.tsx]\nimport { readContracts } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await readContracts(config, {\n  contracts: [\n    {\n      address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n      abi: mlootABI,\n      functionName: 'getChest',\n      args: [69],\n    },\n    // ...\n  ],\n  multicallAddress: '0xca11bde05977b3631167028862be2a173976ca11', // [!code hl]\n})\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type ReadContractsReturnType } from '@wagmi/core'\n```\n\n## Type Inference\n\nWith [`contracts[number]['abi']`](#abi) setup correctly, TypeScript will infer the correct types for [`functionName`](#functionname), [`args`](#args), and the return type. See the Wagmi [TypeScript docs](/core/typescript) for more information.\n\n## Error\n\n```ts\nimport { type ReadContractsErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`multicall`](https://viem.sh/docs/contract/multicall) when supported by current chain.\n- [`readContract`](https://viem.sh/docs/contract/readContract) when multicall is not supported.\n"
  },
  {
    "path": "site/core/api/actions/reconnect.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'reconnect'\nconst typeName = 'Reconnect'\n</script>\n\n# reconnect\n\nAction for reconnecting [connectors](/core/api/connectors).\n\n## Import\n\n```ts\nimport { reconnect } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { reconnect } from '@wagmi/core'\nimport { injected } from '@wagmi/connectors'\nimport { config } from './config'\n\nconst result = await reconnect(config, { connectors: [injected()] })\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type ReconnectParameters } from '@wagmi/core'\n```\n\n### connectors\n\n`(CreateConnectorFn | Connector)[] | undefined`\n\n- [Connectors](/core/api/connectors) to reconnect to.\n- Defaults to [`Config['connectors']`](/core/api/createConfig#connectors).\n\n::: code-group\n```ts [index.ts]\nimport { reconnect } from '@wagmi/core'\nimport { injected } from '@wagmi/connectors'\nimport { config } from './config'\n\nconst result = await reconnect(config, {\n    connectors: [injected()], // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type ReconnectReturnType } from '@wagmi/core'\n```\n\n`Connection[]`\n\n[Connections](/core/api/createConfig#connection) that were successfully reconnected.\n\n## Error\n\n```ts\nimport { type ReconnectErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/mutation-imports.md-->\n"
  },
  {
    "path": "site/core/api/actions/sendCalls.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'sendCalls'\nconst typeName = 'SendCalls'\n</script>\n\n# sendCalls\n\nAction that requests for the wallet to sign and broadcast a batch of calls (transactions) to the network. \n\n[Read more.](https://github.com/ethereum/EIPs/blob/815028dc634463e1716fc5ce44c019a6040f0bef/EIPS/eip-5792.md#wallet_sendcalls)\n\n \n\n## Import\n\n```ts\nimport { sendCalls } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { parseEther } from 'viem'\nimport { sendCalls } from '@wagmi/core'\nimport { config } from './config'\n\nconst id = await sendCalls(config, {\n  calls: [\n    {\n      to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n      value: parseEther('1')\n    },\n    {\n      data: '0xdeadbeef',\n      to: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n    },\n  ]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### Synchronous Usage\n\nIf you want to wait for the calls to be included in a block before returning, you can use `sendCallsSync`:\n\n::: code-group\n```ts [index.ts]\nimport { parseEther } from 'viem'\nimport { sendCallsSync } from '@wagmi/core'\nimport { config } from './config'\n\nconst receipt = await sendCallsSync(config, {\n  calls: [\n    {\n      to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n      value: parseEther('1')\n    },\n    {\n      data: '0xdeadbeef',\n      to: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n    },\n  ]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type SendCallsParameters } from '@wagmi/core'\n```\n\n### account\n\n`Account | Address | null | undefined`\n\nAccount to execute the calls. \n\nIf set to `null`, it is assumed that the wallet will handle filling the sender of the calls.\n\n::: code-group\n```ts [index.ts]\nimport { parseEther } from 'viem'\nimport { sendCalls } from '@wagmi/core'\nimport { config } from './config'\n\nconst id = await sendCalls(config, {\n  account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', // [!code focus]\n  calls: [\n    {\n      to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n      value: parseEther('1')\n    },\n    {\n      data: '0xdeadbeef',\n      to: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n    },\n  ],\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### calls\n\n`{ to: Hex, data?: Hex, value?: bigint }[]`\n\nCalls to execute.\n\n::: code-group\n```ts [index.ts]\nimport { parseEther } from 'viem'\nimport { sendCalls } from '@wagmi/core'\nimport { config } from './config'\n\nconst id = await sendCalls(config, {\n  calls: [ // [!code focus]\n    { // [!code focus]\n      to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', // [!code focus]\n      value: parseEther('1') // [!code focus]\n    }, // [!code focus]\n    { // [!code focus]\n      data: '0xdeadbeef', // [!code focus]\n      to: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC', // [!code focus]\n    }, // [!code focus]\n  ], // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### capabilities\n\n`WalletCapabilities | undefined`\n\nCapability metadata for the calls (e.g. specifying a paymaster).\n\n::: code-group\n```ts [index.ts]\nimport { parseEther } from 'viem'\nimport { sendCalls } from '@wagmi/core'\nimport { config } from './config'\n\nconst id = await sendCalls(config, {\n  calls: [\n    {\n      to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n      value: parseEther('1')\n    },\n    {\n      data: '0xdeadbeef',\n      to: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n    },\n  ],\n  capabilities: { // [!code focus]\n    paymasterService: { // [!code focus]\n      url: 'https://...' // [!code focus]\n    } // [!code focus]\n  } // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`number | undefined`\n\nThe target chain ID to broadcast the calls.\n\n::: code-group\n```ts [index.ts]\nimport { parseEther } from 'viem'\nimport { sendCalls } from '@wagmi/core'\nimport { config } from './config'\n\nconst id = await sendCalls(config, {\n  calls: [\n    {\n      to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n      value: parseEther('1')\n    },\n    {\n      data: '0xdeadbeef',\n      to: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n    },\n  ],\n  chainId: 10, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### connector\n\n`Connector | undefined`\n\nConnector to get send the calls with.\n\n::: code-group\n```ts [index.ts]\nimport { parseEther } from 'viem'\nimport { getConnections } from '@wagmi/core'\nimport { sendCalls } from '@wagmi/core'\nimport { config } from './config'\n\nconst connections = getConnections(config)\nconst id = await sendCalls(config, {\n  calls: [\n    {\n      to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n      value: parseEther('1')\n    },\n    {\n      data: '0xdeadbeef',\n      to: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n    },\n  ],\n  connector: connections[0]?.connector, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type SendCallsReturnType } from '@wagmi/core'\n```\n\n`{ id: string; capabilities?: WalletCapabilities | undefined }`\n\nIdentifier of the call batch.\n\n## Error\n\n```ts\nimport { type SendCallsErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls)\n"
  },
  {
    "path": "site/core/api/actions/sendTransaction.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'sendTransaction'\nconst typeName = 'SendTransaction'\n</script>\n\n# sendTransaction\n\nAction for creating, signing, and sending transactions to networks.\n\n## Import\n\n```ts\nimport { sendTransaction } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { sendTransaction } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await sendTransaction(config, {\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### Synchronous Usage\n\nIf you want to wait for the transaction to be included in a block before returning, you can use `sendTransactionSync`:\n\n::: code-group\n```ts [index.ts]\nimport { sendTransactionSync } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst receipt = await sendTransactionSync(config, {\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type SendTransactionParameters } from '@wagmi/core'\n```\n\n### accessList\n\n`AccessList | undefined`\n\nThe access list.\n\n::: code-group\n```ts [index.ts]\nimport { sendTransaction } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await sendTransaction(config, {\n  accessList: [{ // [!code focus]\n    address: '0x1', // [!code focus]\n    storageKeys: ['0x1'], // [!code focus]\n  }], // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### account\n\n`Address | Account | undefined`\n\nAccount to use when sending transaction. Throws if account is not found on [`connector`](#connector).\n\n::: code-group\n```ts [index.ts]\nimport { sendTransaction } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await sendTransaction(config, {\n  account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nChain ID to validate against before sending transaction.\n\n::: code-group\n```ts [index.ts]\nimport { sendTransaction } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await sendTransaction(config, {\n  chainId: mainnet.id, // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### connector\n\n`Connector | undefined`\n\n- Connector to send transaction with.\n- Defaults to current connector.\n\n::: code-group\n```ts [index.ts]\nimport { getConnections, sendTransaction } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst connections = getConnections(config)\nconst result = await sendTransaction(config, {\n  connector: connections[0]?.connector, // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### data\n\n`` `0x${string}` | undefined ``\n\nA contract hashed method call with encoded args.\n\n::: code-group\n```ts [index.ts]\nimport { sendTransaction } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await sendTransaction(config, {\n  data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### gas\n\n`bigint | undefined | null`\n\nGas provided for transaction execution.\n\n::: code-group\n```ts [index.ts]\nimport { sendTransaction } from '@wagmi/core'\nimport { parseEther, parseGwei } from 'viem'\nimport { config } from './config'\n\nconst result = await sendTransaction(config, {\n  gas: parseGwei('20'), // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### gasPrice\n\n`bigint | undefined`\n\nThe price in wei to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms#legacy-transaction).\n\n::: code-group\n```ts [index.ts]\nimport { sendTransaction } from '@wagmi/core'\nimport { parseEther, parseGwei } from 'viem'\nimport { config } from './config'\n\nconst result = await sendTransaction(config, {\n  gasPrice: parseGwei('20'), // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### maxFeePerGas\n\n`bigint | undefined`\n\nTotal fee per gas in wei, inclusive of [`maxPriorityFeePerGas`](#maxPriorityFeePerGas). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n```ts [index.ts]\nimport { sendTransaction } from '@wagmi/core'\nimport { parseEther, parseGwei } from 'viem'\nimport { config } from './config'\n\nconst result = await sendTransaction(config, {\n  maxFeePerGas: parseGwei('20'), // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### maxPriorityFeePerGas\n\n`bigint | undefined`\n\nMax priority fee per gas in wei. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n```ts [index.ts]\nimport { sendTransaction } from '@wagmi/core'\nimport { parseEther, parseGwei } from 'viem'\nimport { config } from './config'\n\nconst result = await sendTransaction(config, {\n  maxFeePerGas: parseGwei('20'),\n  maxPriorityFeePerGas: parseGwei('2'), // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### nonce\n\n`number`\n\nUnique number identifying this transaction.\n\n::: code-group\n```ts [index.ts]\nimport { sendTransaction } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await sendTransaction(config, {\n  nonce: 123, // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### to\n\n`Address`\n\nThe transaction recipient or contract address.\n\n::: code-group\n```ts [index.ts]\nimport { sendTransaction } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await sendTransaction(config, {\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### type\n\n`'legacy' | 'eip1559' | 'eip2930' | undefined`\n\nOptional transaction request type to narrow parameters.\n\n::: code-group\n```ts [index.ts]\nimport { sendTransaction } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await sendTransaction(config, {\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  type: 'eip1559', // [!code focus]\n  value: parseEther('0.01'),\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### value\n\n`bigint | undefined`\n\nValue in wei sent with this transaction.\n\n::: code-group\n```ts [index.ts]\nimport { sendTransaction } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await sendTransaction(config, {\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', \n  value: parseEther('0.01'), // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type SendTransactionReturnType } from '@wagmi/core'\n```\n\n[`Hash`](https://viem.sh/docs/glossary/types#hash)\n\nTransaction hash.\n\n## Error\n\n```ts\nimport { type SendTransactionErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Viem\n\n- [`sendTransaction`](https://viem.sh/docs/actions/wallet/sendTransaction)\n"
  },
  {
    "path": "site/core/api/actions/showCallsStatus.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'showCallsStatus'\nconst typeName = 'ShowCallsStatus'\n</script>\n\n# showCallsStatus\n\nAction to request for the wallet to show information about a call batch that was sent via `sendCalls`.\n\n[Read more.](https://github.com/ethereum/EIPs/blob/1663ea2e7a683285f977eda51c32cec86553f585/EIPS/eip-5792.md#wallet_showcallsstatus)\n\n \n\n## Import\n\n```ts\nimport { showCallsStatus } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { showCallsStatus } from '@wagmi/core'\nimport { config } from './config'\n\nawait showCallsStatus(config, {\n  id: '0x1234567890abcdef',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type ShowCallsStatusParameters } from '@wagmi/core'\n```\n\n### connector\n\n`Connector | undefined`\n\nConnector to show call statuses with.\n\n::: code-group\n```ts [index.ts]\nimport { getConnections, showCallsStatus } from '@wagmi/core'\nimport { config } from './config'\n\nconst connections = getConnections(config)\nawait showCallsStatus(config, {\n  connector: connections[0]?.connector, // [!code focus]\n  id: '0x1234567890abcdef',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### id\n\n`string`\n\nIdentifier of the call batch.\n\n::: code-group\n```ts [index.ts]\nimport { showCallsStatus } from '@wagmi/core'\nimport { config } from './config'\n\nawait showCallsStatus(config, {\n  id: '0x1234567890abcdef', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type ShowCallsStatusReturnType } from '@wagmi/core'\n```\n\n`bigint`\n\nMost recent block number seen.\n\n## Error\n\n```ts\nimport { type ShowCallsStatusErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`showCallsStatus`](https://viem.sh/docs/actions/wallet/showCallsStatus)\n"
  },
  {
    "path": "site/core/api/actions/signMessage.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'signMessage'\nconst typeName = 'SignMessage'\n</script>\n\n# signMessage\n\nAction for signing messages.\n\n## Import\n\n```ts\nimport { signMessage } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { signMessage } from '@wagmi/core'\nimport { config } from './config'\n\nawait signMessage(config, { message: 'hello world' })\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type SignMessageParameters } from '@wagmi/core'\n```\n\n### account\n\n`Address | Account | undefined`\n\nAccount to use when signing message. Throws if account is not found on [`connector`](#connector).\n\n::: code-group\n```ts [index.ts]\nimport { signMessage } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await signMessage(config, {\n  account: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n  message: 'hello world',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### connector\n\n`Connector | undefined`\n\n[Connector](/core/api/connectors) to sign message with.\n\n::: code-group\n```ts [index.ts]\nimport { getConnection, signMessage } from '@wagmi/core'\nimport { config } from './config'\n\nconst { connector } = getConnection(config)\nconst result = await signMessage(config, {\n  connector, // [!code focus]\n  message: 'hello world',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### message\n\n`string | { raw: Hex | ByteArray }`\n\nMessage to sign.\n\n::: code-group\n```ts [index.ts]\nimport { signMessage } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await signMessage(config, {\n  message: 'hello world', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n::: tip\nBy default, viem signs the UTF-8 representation of the message. To sign the data representation of the message, you can use the `raw` attribute.\n\n```ts\nimport { signMessage } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await signMessage(config, {\n  message: { raw: '0x68656c6c6f20776f726c64' }, // [!code focus]\n})\n```\n:::\n\n## Return Type\n\n```ts\nimport { type SignMessageReturnType } from '@wagmi/core'\n```\n\n[`Hex`](https://viem.sh/docs/glossary/types#hex)\n\nThe signed message.\n\n## Error\n\n```ts\nimport { type SignMessageErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Viem\n\n- [`signMessage`](https://viem.sh/docs/actions/wallet/signMessage)\n"
  },
  {
    "path": "site/core/api/actions/signTransaction.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'signTransaction'\nconst typeName = 'SignTransaction'\n</script>\n\n# signTransaction\n\nAction for creating and signing transactions to networks.\n\n## Import\n\n```ts\nimport { signTransaction } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n\n```ts [index.ts]\nimport { signTransaction } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await signTransaction(config, {\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### Synchronous Usage\n\nIf you want to wait for the transaction to be included in a block before returning, you can use `signTransactionSync`:\n\n::: code-group\n\n```ts [index.ts]\nimport { signTransactionSync } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst receipt = await signTransactionSync(config, {\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type SignTransactionParameters } from '@wagmi/core'\n```\n\n### accessList\n\n`AccessList | undefined`\n\nThe access list.\n\n::: code-group\n\n```ts [index.ts]\nimport { signTransaction } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await signTransaction(config, {\n  accessList: [{ // [!code focus]\n    address: '0x1', // [!code focus]\n    storageKeys: ['0x1'], // [!code focus]\n  }], // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### account\n\n`Address | Account | undefined`\n\nAccount to use when signing transaction. Throws if account is not found on [`connector`](#connector).\n\n::: code-group\n\n```ts [index.ts]\nimport { signTransaction } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await signTransaction(config, {\n  account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nChain ID to validate against before signing transaction.\n\n::: code-group\n\n```ts [index.ts]\nimport { signTransaction } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await signTransaction(config, {\n  chainId: mainnet.id, // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### connector\n\n`Connector | undefined`\n\n- Connector to sign transaction with.\n- Defaults to current connector.\n\n::: code-group\n\n```ts [index.ts]\nimport { getConnections, signTransaction } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst connections = getConnections(config)\nconst result = await signTransaction(config, {\n  connector: connections[0]?.connector, // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### data\n\n`` `0x${string}` | undefined ``\n\nA contract hashed method call with encoded args.\n\n::: code-group\n\n```ts [index.ts]\nimport { signTransaction } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await signTransaction(config, {\n  data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### gas\n\n`bigint | undefined | null`\n\nGas provided for transaction execution.\n\n::: code-group\n\n```ts [index.ts]\nimport { signTransaction } from '@wagmi/core'\nimport { parseEther, parseGwei } from 'viem'\nimport { config } from './config'\n\nconst result = await signTransaction(config, {\n  gas: parseGwei('20'), // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### gasPrice\n\n`bigint | undefined`\n\nThe price in wei to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms#legacy-transaction).\n\n::: code-group\n\n```ts [index.ts]\nimport { signTransaction } from '@wagmi/core'\nimport { parseEther, parseGwei } from 'viem'\nimport { config } from './config'\n\nconst result = await signTransaction(config, {\n  gasPrice: parseGwei('20'), // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### maxFeePerGas\n\n`bigint | undefined`\n\nTotal fee per gas in wei, inclusive of [`maxPriorityFeePerGas`](#maxpriorityfeepergas). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n\n```ts [index.ts]\nimport { signTransaction } from '@wagmi/core'\nimport { parseEther, parseGwei } from 'viem'\nimport { config } from './config'\n\nconst result = await signTransaction(config, {\n  maxFeePerGas: parseGwei('20'), // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### maxPriorityFeePerGas\n\n`bigint | undefined`\n\nMax priority fee per gas in wei. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n\n```ts [index.ts]\nimport { signTransaction } from '@wagmi/core'\nimport { parseEther, parseGwei } from 'viem'\nimport { config } from './config'\n\nconst result = await signTransaction(config, {\n  maxFeePerGas: parseGwei('20'),\n  maxPriorityFeePerGas: parseGwei('2'), // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### nonce\n\n`number`\n\nUnique number identifying this transaction.\n\n::: code-group\n\n```ts [index.ts]\nimport { signTransaction } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await signTransaction(config, {\n  nonce: 123, // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n```\n\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### to\n\n`Address`\n\nThe transaction recipient or contract address.\n\n::: code-group\n\n```ts [index.ts]\nimport { signTransaction } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await signTransaction(config, {\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n  value: parseEther('0.01'),\n})\n```\n\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### type\n\n`'legacy' | 'eip1559' | 'eip2930' | undefined`\n\nOptional transaction request type to narrow parameters.\n\n::: code-group\n\n```ts [index.ts]\nimport { signTransaction } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await signTransaction(config, {\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  type: 'eip1559', // [!code focus]\n  value: parseEther('0.01'),\n})\n```\n\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### value\n\n`bigint | undefined`\n\nValue in wei sent with this transaction.\n\n::: code-group\n\n```ts [index.ts]\nimport { signTransaction } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = await signTransaction(config, {\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'), // [!code focus]\n})\n```\n\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type SignTransactionReturnType } from '@wagmi/core'\n```\n\n[`Hash`](https://viem.sh/docs/glossary/types#hash)\n\nTransaction hash.\n\n## Error\n\n```ts\nimport { type SignTransactionErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Viem\n\n- [`signTransaction`](https://viem.sh/docs/actions/wallet/signTransaction)\n"
  },
  {
    "path": "site/core/api/actions/signTypedData.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'signTypedData'\nconst typeName = 'SignTypedData'\n</script>\n\n# signTypedData\n\nAction for signing typed data and calculating an Ethereum-specific [EIP-712](https://eips.ethereum.org/EIPS/eip-712) signature.\n\n## Import\n\n```ts\nimport { signTypedData } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { signTypedData } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await signTypedData(config, {\n  types: {\n    Person: [\n      { name: 'name', type: 'string' },\n      { name: 'wallet', type: 'address' },\n    ],\n    Mail: [\n      { name: 'from', type: 'Person' },\n      { name: 'to', type: 'Person' },\n      { name: 'contents', type: 'string' },\n    ],\n  },\n  primaryType: 'Mail',\n  message: {\n    from: {\n      name: 'Cow',\n      wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n    },\n    to: {\n      name: 'Bob',\n      wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n    },\n    contents: 'Hello, Bob!',\n  },\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type SignTypedDataParameters } from '@wagmi/core'\n```\n\n### account\n\n`Address | Account | undefined`\n\nAccount to use when signing data. Throws if account is not found on [`connector`](#connector).\n\n::: code-group\n```ts [index.ts]\nimport { signTypedData } from '@wagmi/core'\nimport { config } from './config'\nimport { types } from './typedData'\n\nconst result = await signTypedData(config, {\n  account: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n  types,\n  primaryType: 'Mail',\n  message: {\n    from: {\n      name: 'Cow',\n      wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n    },\n    to: {\n      name: 'Bob',\n      wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n    },\n    contents: 'Hello, Bob!',\n  },\n})\n```\n<<< @/snippets/typedData.ts[typedData.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### connector\n\n`Connector | undefined`\n\n[Connector](/core/api/connectors) to sign data with.\n\n::: code-group\n```ts [index.ts]\nimport { getConnection, signTypedData } from '@wagmi/core'\nimport { config } from './config'\nimport { types } from './typedData'\n\nconst { connector } = getConnection(config)\nconst result = await signTypedData(config, {\n  connector, // [!code focus]\n  types,\n  primaryType: 'Mail',\n  message: {\n    from: {\n      name: 'Cow',\n      wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n    },\n    to: {\n      name: 'Bob',\n      wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n    },\n    contents: 'Hello, Bob!',\n  },\n})\n```\n<<< @/snippets/typedData.ts[typedData.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### domain\n\n`TypedDataDomain | undefined`\n\n- The typed data domain.\n- If `EIP712Domain` key exists in [`types`](#types), `domain` schema is inferred from it.\n\n::: code-group\n```ts [index.ts]\nimport { signTypedData } from '@wagmi/core'\nimport { config } from './config'\nimport { types } from './typedData'\n\nconst result = await signTypedData(config, {\n  domain: { // [!code focus]\n    name: 'Ether Mail', // [!code focus]\n    chainId: 1, // [!code focus]\n    verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', // [!code focus]\n    version: '1', // [!code focus]\n  }, // [!code focus]\n  types,\n  primaryType: 'Mail',\n  message: {\n    from: {\n      name: 'Cow',\n      wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n    },\n    to: {\n      name: 'Bob',\n      wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n    },\n    contents: 'Hello, Bob!',\n  },\n})\n```\n<<< @/snippets/typedData.ts[typedData.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### message\n\n`Record<string, unknown>`\n\n- Data to sign.\n- Type inferred from [`types`](#types) and [`primaryType`](#primarytype).\n\n::: code-group\n```ts [index.ts]\nimport { signTypedData } from '@wagmi/core'\nimport { config } from './config'\nimport { types } from './typedData'\n\nconst result = await signTypedData(config, {\n  types,\n  primaryType: 'Mail',\n  message: { // [!code focus]\n    from: { // [!code focus]\n      name: 'Cow', // [!code focus]\n      wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', // [!code focus]\n    }, // [!code focus]\n    to: { // [!code focus]\n      name: 'Bob', // [!code focus]\n      wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', // [!code focus]\n    }, // [!code focus]\n    contents: 'Hello, Bob!', // [!code focus]\n  }, // [!code focus]\n})\n```\n<<< @/snippets/typedData.ts[typedData.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### primaryType\n\n`string`\n\n- The primary type to extract from [`types`](#types) and use in [`message`](#message).\n- Type inferred from [`types`](#types).\n\n::: code-group\n```ts [index.ts]\nimport { signTypedData } from '@wagmi/core'\nimport { config } from './config'\nimport { types } from './typedData'\n\nconst result = await signTypedData(config, {\n  types,\n  primaryType: 'Mail', // [!code focus]\n  message: {\n    from: {\n      name: 'Cow',\n      wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n    },\n    to: {\n      name: 'Bob',\n      wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n    },\n    contents: 'Hello, Bob!',\n  },\n})\n```\n<<< @/snippets/typedData.ts[typedData.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### types\n\n`TypedData`\n\n- The type definitions for the typed data.\n- By defining inline or adding a [const assertion](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions) to `types`, TypeScript will infer the correct types for [`message`](#message) and [`primaryType`](#primarytype). See the Wagmi [TypeScript docs](/core/typescript) for more information.\n\n::: code-group\n```ts [index.ts]\nimport { signTypedData } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await signTypedData(config, {\n  types: { // [!code focus]\n    Person: [ // [!code focus]\n      { name: 'name', type: 'string' }, // [!code focus]\n      { name: 'wallet', type: 'address' }, // [!code focus]\n    ], // [!code focus]\n    Mail: [ // [!code focus]\n      { name: 'from', type: 'Person' }, // [!code focus]\n      { name: 'to', type: 'Person' }, // [!code focus]\n      { name: 'contents', type: 'string' }, // [!code focus]\n    ], // [!code focus]\n  }, // [!code focus]\n  primaryType: 'Mail',\n  message: {\n    from: {\n      name: 'Cow',\n      wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n    },\n    to: {\n      name: 'Bob',\n      wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n    },\n    contents: 'Hello, Bob!',\n  },\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type SignTypedDataReturnType } from '@wagmi/core'\n```\n\n[`Hex`](https://viem.sh/docs/glossary/types#hex)\n\nThe signed data.\n\n## Type Inference\n\nWith [`types`](#types) setup correctly, TypeScript will infer the correct types for [`domain`](#domain), [`message`](#message), and [`primaryType`](#primarytype). See the Wagmi [TypeScript docs](/core/typescript) for more information.\n\n::: code-group\n```ts twoslash [Inline]\n// @twoslash-cache: {\"v\":1,\"hash\":\"44d90fe296d503e3675e18b904994e8969cc43a5fc5d95c28c6ca88739b0e3f3\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BjCMONAAlPgFcAbNROwAGABloASYG1IBLMAHMAvkMog2AQ1INEANiq8YCtPiR7qm+TG0gucPg31zciEVUb5N6xjXK7FFdGxnAmIyVRp6PAAKdV4ZdTgASnY4GXkwABUgqAARdTR1AB5gAB0wdgrOGHUoFl4MdgAFMjgWQS4auobUMsq+qs6wevYwdQBbGEES8HGYaYBuXv6KjtqhhswcKbU0WQUFpYr/dlLy5YG14dGJ7YB3WIM0A7Pl1a72Tcn2aZqoWzhnn1FABdRYvC7vACy6hkvHa1Uu3VO5wh6xGs22ADNSBAxoDzm80Z9ts1SK0wPijhQTod+oSrhjvtQIJS6Qj3sSmaTyazjsiCey0dcvtNmGAaOKASAwSj6RsgttpHJ5LzQWVjtNobDpgA+KJizFpQQAYRYhvk1KwngmPjggn5FU+dpp4L6cqaLTaqOGPVdAsGDJuTOFrNlguGnOmSv20tpQOpDpR3oawruDysof9iI+CqZv3+maOar9K3DDS1cOT7F9Scq7tTTOxuMLbID8q2XM9FNjJfYfLjWfeDemaBZPdrpbbOY7025LBb/d7brL6KDopYErQUplE/dkZ2exV4/OIJ3RzP7AAdNf2AAWdhjCBcK/Xi9isAwbxPgD8JpYH6/Uh2AAH3YbgwFgQ0PygMFFESQRGhxMYZDgGBCgAZTSTJsjyAoACUrG4UhsJwHUyhkMYsCfDhUnSLIcFyfJ1FUWpGAQRACDQNAsDtAB6Xj7nkZDLzgfBeOYLhePULAZCk7wZBYOBeNokiYEYgpVA0LQkAAJgARn0Qx5GMJA9IAZioApSEsawVPotTcOYxwPyQVwQHcTxvDCRB9P8QIcDwQgSHISy6GsMU2HYA0jXYU0wHNQp3RrSoACNeAgRgAGsAFFaCwdKuDJe0B0nbNIPUexiqXOsV2HEBsuMFpGHUbsLzDKciMraZ8C4njEH4qx8CalrLwUltlynaSZAAVVILrOO4vipJky9BuGsBRogZaZAXC9FAvNKMsyjIKK+PSdJES63w3UgvC3Kr2uzQw4GmsAZGCuBYgI1peGCh7dxXfN4GdaYxBgcGIfBvTbygAB2PSAA5GB0lLb1hqAAE4MZ0szYHUFLzLMgBWGBodvSHxpqqdDqy40OhoKBBBxkQEaJtmEbayp9pKqsxnsGRmt4XgzP+2t3SBuAQZAMRmr0vSUtgEQiYx2HYZSsydDMuWdFhkQdIRhGdBRmAdPUPTYbMlWdFlvTKdK94acyunqgZwRoeJjWRD0znz1pbnwWvS92Ghh8nxgF9LwvYKZExDAAAkEnwX92CifU4kMARYvT8VCkDnVLWtKwWkEAA1MgY/jxPGkL21kgAXh1JokJQtCUogCADBanVklA8DIKcGD1QTWlA9g4Fh4D18h6rZ38hgOKANHUgADEwGQYEdU0qztGJwyjBMXRLIsKwmDNNJVDiFyXDcDxbq83xib86ggkC0IQuoMLoiwHEcC0DBkidKLKsc4wDwinMlV4tVGTTBDMeSBU59zRiPHtCej0hzQJAPcIWGY4GtmzPuCW24/bFgmtmCsYDswQLwegtcIAmx4lwaQjkuZZxdl5KgwcQoMGjhbHuFhIAQHsJdGgrhtCxSbiIb2PhM4DzKlVLBLemhtBoz3sZA+RMj7WRPhxJ0F8nCmRvp5Hwukn6fFfsFcIn8OJRG/hAX+mBkggIoe8Kh9YMGwIvNIkUsiYywQ4fbUR3isGPFZF47YhDnggkUdpXQbkDD71MJomyeAQF6KvjpQxd9jGIFvKYl+HEgphFCpEaxtj7H/1XN42B0TtCwwRqokyOSknaJmBMNJzgLLuVvndbyCM8kBQKW/SxJSQA2J/mQBx05vFIOmDUpA2MGkH1vM06wZjnIdMyT03wOkdL9OCIU9+ERrBjLsRMipdVgk4LmYgOW9SQDxLUUgZZ5gtHWGFO0p5mz75ID6QEZ+AyQgWOKccspZyAH8IiSAa55lnkPMac8qyySdEv3WZ8rpRjvI6VyX8sxgygUfxGSc8pyRyFVlcVA2h9DQkrn3IInsi4mGBO2Dw3BYTOxknnPS/xVY6riIzpIxlEZ+EzPpcCaFOhYVGXhSsvAFYPmH3RVk7y2L/L7KGcCr+4y/7JDqlSqFVAtLaERnEqVSyZUcXeaixAsMvnZN+aq8xRSCUgq1ZM2lbD9U7CUaZDGkqElNJeUi/5uArU2sVVs3SuycX5MBU6o5mrTnasqcysc1ydkmv9Qi4+bzZjyruR5JVvh7XBsdYcqxozQVJvdRy7saazIZPuaatFiKWlrPufoxA+bunfJ8iIPZpbhkusTZM3lG5+WzINdvXSRM7lwrNYGlplr21Xwxra3p/a8VxvLUSsFUzFS7DkZ6w1ulYZmDnc27NeA22X2cKu8NPadI6A3bGsthLK2TO/hRTQGB7Ikg9SBJkFYJ1epiWZFmizTIGQXdYT9Yxv32XledNd2zn0AEduBkAwIOhNxL2Cwfg/wulAHNQwl4MB49iAwOzqbTcqDLaYOyDg6QH9KLl3OCQ/e7JUaHWbtfUO3DExJbqEsEA+hQC+gNiQT7dglzM6iAkFIA9ChlB7QvKOcTlRJNKfkNJ2Tgh5OSCQSpv211xT8sEFJ9U1yzI2Yg9a81IBBOfUsIhjRnHMVoYw8x7DpTXUVKc8Jr4iYxPCPOFpw8un0xybEIZ7TxnwT+z6Op0LyxwvKki9g6LCmjNCFU7SPlkoLPaYUZO71lHbONv9WG+jeAAsuatXpNzBaI0+WfQcnzFa/PJBC4mNLCgLx6eEDFxTh54uKGszoDNjyA01Y4vQ+V+tkNPLa+q51OHd19fkNZ2GfrptZteXgJdN7dJ3uaz2p90aAXtY1b54dFTBsGZG8qZQ1mMadPPQq2bmCovyrA0tvwl21X4vjbd3DyXeuMks+CB7w2cslZA8omddmG1fdHL9htZ3skqpLbxjrO6k2beuWjKb0roOHdzVairmPvIXZ4y+vH777tRf07DuLKhSsxNvAjO9H2zBfdk79551PfC05x/Tm7nW7vJAK/dFI2nrls1240u5X2ZcIEp2YYXy3x7uWgMECKHBbD2HYHXdg6h7gyBolhey6l1D6jPhaULgCUsehrYIZAA5gDJvYAAcmFD76knIfdIJ932Cgnvvc+9kwHvdvvCGh/8LScetJSUe79F7hsPv6Ex6DyAhP4f0+R9HDn3MPu89h4j5ntXJeOzB+0/npPBeqRLHw8x39vuKwB7KN3s4dWgs94HxSIfg/B99B6wOTPppbhd79INn3YhjQ5FNrjDGy83sI2yuZRfvrYbZUYErAAgilY0sNl7ZQtreHImIEY5ByAjR9M/4y0nBxPxkPuABCEAUqP/6HPsQKV38AD39gCUogDADQDwDwCIDACoCAC4CgCACf9m9wQ1dBAfc44YAhYIBqRP8UoABCH/RPMAOCVQG0ZiRAUAMKZ6BSMAK9BARQRQIAA\"}\nimport { createConfig, http, signTypedData } from '@wagmi/core'\nimport { mainnet, sepolia } from '@wagmi/core/chains'\n\nconst config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n// ---cut---\nconst result = await signTypedData(config, {\n  types: {\n    Person: [\n      { name: 'name', type: 'string' },\n      { name: 'wallet', type: 'address' },\n    ],\n    Mail: [\n      { name: 'from', type: 'Person' },\n      { name: 'to', type: 'Person' },\n      { name: 'contents', type: 'string' },\n    ],\n  },\n  primaryType: 'Mail',\n  // ^?\n\n\n  message: {\n  // ^?\n\n\n\n\n\n\n\n\n\n\n\n\n    from: {\n      name: 'Cow',\n      wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n    },\n    to: {\n      name: 'Bob',\n      wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n    },\n    contents: 'Hello, Bob!',\n  },\n})\n```\n```ts twoslash [Const-Asserted]\n// @twoslash-cache: {\"v\":1,\"hash\":\"3253afdbde057c102c6b708011549c2795dd31d2584982f81ae20a403b5bdb54\",\"data\":\"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\"}\nimport { createConfig, http, signTypedData } from '@wagmi/core'\nimport { mainnet, sepolia } from '@wagmi/core/chains'\n\nconst config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n// ---cut---\nconst types = {\n  Person: [\n    { name: 'name', type: 'string' },\n    { name: 'wallet', type: 'address' },\n  ],\n  Mail: [\n    { name: 'from', type: 'Person' },\n    { name: 'to', type: 'Person' },\n    { name: 'contents', type: 'string' },\n  ],\n} as const\n\nconst result = await signTypedData(config, {\n  types,\n  primaryType: 'Mail',\n  // ^?\n\n\n  message: {\n  // ^?\n\n\n\n\n\n\n\n\n\n\n\n\n    from: {\n      name: 'Cow',\n      wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n    },\n    to: {\n      name: 'Bob',\n      wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n    },\n    contents: 'Hello, Bob!',\n  },\n})\n```\n:::\n\n## Error\n\n```ts\nimport { type SignTypedDataErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Viem\n\n- [`signTypedData`](https://viem.sh/docs/actions/wallet/signTypedData)\n"
  },
  {
    "path": "site/core/api/actions/simulateContract.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'simulateContract'\nconst typeName = 'SimulateContract'\n</script>\n\n# simulateContract\n\nAction for simulating/validating a contract interaction.\n\n## Import\n\n```ts\nimport { simulateContract } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { simulateContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await simulateContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type SimulateContractParameters } from '@wagmi/core'\n```\n\n### abi\n\n`Abi`\n\nThe contract's ABI. Check out the [TypeScript docs](/react/typescript#const-assert-abis-typed-data) for how to set up ABIs for maximum type inference and safety.\n\n::: code-group\n```ts [index.ts]\nimport { simulateContract } from '@wagmi/core'\nimport { abi } from './abi' // [!code focus]\nimport { config } from './config'\n\nconst result = await simulateContract(config, {\n  abi, // [!code focus]\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### accessList\n\n`AccessList | undefined`\n\nThe access list.\n\n::: code-group\n```ts [index.ts]\nimport { simulateContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await simulateContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  accessList: [{ // [!code focus]\n    address: '0x1', // [!code focus]\n    storageKeys: ['0x1'], // [!code focus]\n  }], // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### account\n\n`Address | Account | undefined`\n\nAccount to use when signing data. Throws if account is not found on [`connector`](#connector).\n\n::: code-group\n```ts [index.ts]\nimport { simulateContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await simulateContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  account: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### address\n\n`Address`\n\nThe contract's address.\n\n::: code-group\n```ts [index.ts]\nimport { simulateContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await simulateContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f', // [!code focus]\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n\n### args\n\n`readonly unknown[] | undefined`\n\n- Arguments to pass when calling the contract.\n- Inferred from [`abi`](#abi) and [`functionName`](#functionname).\n\n::: code-group\n```ts [index.ts]\nimport { simulateContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await simulateContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [ // [!code focus]\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', // [!code focus]\n    123n, // [!code focus]\n  ], // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to simulate against.\n\n::: code-group\n```ts [index.ts]\nimport { simulateContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await simulateContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  blockNumber: 17829139n, // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to simulate against.\n\n::: code-group\n```ts [index.ts]\nimport { simulateContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await simulateContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  blockTag: 'safe', // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nChain ID to validate against before sending transaction.\n\n::: code-group\n```ts [index.ts]\nimport { simulateContract } from '@wagmi/core'\nimport { mainnet } from 'wagmi/chains' // [!code focus]\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await simulateContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  chainId: mainnet.id, // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### connector\n\n`Connector | undefined`\n\n[Connector](/core/api/connectors) to simulate transaction with.\n\n::: code-group\n```ts [index.ts]\nimport { getConnection, simulateContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst { connector } = getConnection(config)\nconst result = await simulateContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  connector, // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### dataSuffix\n\n`` `0x${string}` | undefined ``\n\nData to append to the end of the calldata. Useful for adding a [\"domain\" tag](https://opensea.notion.site/opensea/Seaport-Order-Attributions-ec2d69bf455041a5baa490941aad307f).\n\n::: code-group\n```ts [index.ts]\nimport { simulateContract } from '@wagmi/core'\nimport { parseGwei } from 'viem'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await simulateContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  dataSuffix: '0xdeadbeef', // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### functionName\n\n`string`\n\n- Function to call on the contract.\n- Inferred from [`abi`](#abi).\n\n::: code-group\n```ts [index.ts]\nimport { simulateContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await simulateContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'approve', // [!code focus]\n  args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', 123n]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### gas\n\n`bigint | undefined`\n\nGas provided for transaction execution.\n\n::: code-group\n```ts [index.ts]\nimport { simulateContract } from '@wagmi/core'\nimport { parseGwei } from 'viem'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await simulateContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  gas: parseGwei('20'), // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### gasPrice\n\n`bigint | undefined`\n\nThe price in wei to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms#legacy-transaction).\n\n::: code-group\n```ts [index.ts]\nimport { simulateContract } from '@wagmi/core'\nimport { parseGwei } from 'viem'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await simulateContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  gasPrice: parseGwei('20'), // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### maxFeePerGas\n\n`bigint | undefined`\n\nTotal fee per gas in wei, inclusive of [`maxPriorityFeePerGas`](#maxPriorityFeePerGas). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n```ts [index.ts]\nimport { simulateContract } from '@wagmi/core'\nimport { parseGwei } from 'viem'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await simulateContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  maxFeePerGas: parseGwei('20'), // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### maxPriorityFeePerGas\n\n`bigint | undefined`\n\nMax priority fee per gas in wei. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n```ts [index.ts]\nimport { simulateContract } from '@wagmi/core'\nimport { parseGwei } from 'viem'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await simulateContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  maxFeePerGas: parseGwei('20'),\n  maxPriorityFeePerGas: parseGwei('2'), // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### nonce\n\n`number`\n\nUnique number identifying this transaction.\n\n::: code-group\n```ts [index.ts]\nimport { simulateContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await simulateContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  nonce: 123, // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### type\n\n`'legacy' | 'eip1559' | 'eip2930' | undefined`\n\nOptional transaction request type to narrow parameters.\n\n::: code-group\n```ts [index.ts]\nimport { simulateContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await simulateContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  type: 'eip1559', // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### value\n\n`bigint | undefined`\n\nValue in wei sent with this transaction.\n\n::: code-group\n```ts [index.ts]\nimport { simulateContract } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await simulateContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  value: parseEther('0.01'), // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type SimulateContractReturnType } from '@wagmi/core'\n```\n\nThe simulation result and write request.\n\n### request\n\nWrite request that includes [parameters](#parameters).\n\n### response\n\n`unknown`\n\n- Result of contract simulation.\n- Inferred from [`abi`](#abi), [`functionName`](#functionname), and [`args`](#args).\n\n## Type Inference\n\nWith [`abi`](#abi) setup correctly, TypeScript will infer the correct types for [`functionName`](#functionname), [`args`](#args), and [`value`](#value). See the Wagmi [TypeScript docs](/core/typescript) for more information.\n\n## Error\n\n```ts\nimport { type SimulateContractErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`simulateContract`](https://viem.sh/docs/contract/simulateContract)\n"
  },
  {
    "path": "site/core/api/actions/switchChain.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'switchChain'\nconst typeName = 'SwitchChain'\n</script>\n\n# switchChain\n\nAction for switching the target chain for a connector or the Wagmi [`Config`](/core/api/createConfig#config).\n\n## Import\n\n```ts\nimport { switchChain } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { switchChain } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nawait switchChain(config, { chainId: mainnet.id })\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n::: tip\nWhen connected, `switchChain` will switch the target chain for the connector. When not connected, `switchChain` will switch the target chain for the Wagmi [`Config`](/core/api/createConfig#config).\n:::\n\n## Parameters\n\n```ts\nimport { type SwitchChainParameters } from '@wagmi/core'\n```\n\n### addEthereumChainParameter\n\n`{ chainName: string; nativeCurrency?: { name: string; symbol: string; decimals: number } | undefined; rpcUrls: readonly string[]; blockExplorerUrls?: string[] | undefined; iconUrls?: string[] | undefined } | undefined`\n\n[EIP-3085 parameters](https://eips.ethereum.org/EIPS/eip-3085) to use when adding chain to connector (when supported).\n\n::: code-group\n```ts [index.ts]\nimport { switchChain } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nconst result = await switchChain(config, {\n  addEthereumChainParameter: { // [!code focus]\n    iconUrls: ['https://example.com/icon.png'], // [!code focus]\n  }, // [!code focus]\n  chainId: mainnet.id,\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to switch to.\n\n::: code-group\n```ts [index.ts]\nimport { switchChain } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nconst result = await switchChain(config, {\n  chainId: mainnet.id, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### connector\n\n`Connector`\n\n[Connector](/core/api/connectors) to switch chain with.\n\n::: code-group\n```ts [index.ts]\nimport { getConnection, switchChain } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nconst connection = getConnection(config)\nconst result = await switchChain(config, {\n  chainId: mainnet.id,\n  connector: connection?.connector, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type SwitchChainReturnType } from '@wagmi/core'\n```\n\n`Chain`\n\nChain that was switched to.\n\n## Error\n\n```ts\nimport { type SwitchChainErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Viem\n\n- [`switchChain`](https://viem.sh/docs/actions/wallet/switchChain) when connected.\n"
  },
  {
    "path": "site/core/api/actions/switchConnection.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'switchConnection'\nconst typeName = 'SwitchConnection'\n</script>\n\n# switchConnection\n\nAction for switching the current account.\n\n## Import\n\n```ts\nimport { switchConnection } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { getConnections, switchConnection } from '@wagmi/core'\nimport { config } from './config'\n\nconst connections = getConnections(config)\nconst result = await switchConnection(config, {\n  connector: connections[0]?.connector,\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type SwitchConnectionParameters } from '@wagmi/core'\n```\n\n### connector\n\n`Connector`\n\n[Connector](/core/api/connectors) to switch to.\n\n::: code-group\n```ts [index.ts]\nimport { getConnections, switchConnection } from '@wagmi/core'\nimport { config } from './config'\n\nconst connections = getConnections(config)\nconst result = await switchConnection(config, {\n  connector: connections[0]?.connector, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type SwitchConnectionReturnType } from '@wagmi/core'\n```\n\n### accounts\n\n`readonly [Address, ...Address[]]`\n  \nConnected accounts from connector.\n\n### chainId\n\n`number`\n\nConnected chain ID from connector.\n\n## Error\n\n```ts\nimport { type SwitchConnectionErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/mutation-imports.md-->\n"
  },
  {
    "path": "site/core/api/actions/verifyMessage.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'verifyMessage'\nconst typeName = 'VerifyMessage'\n</script>\n\n# verifyMessage\n\nAction for verify that a message was signed by the provided address. It supports verifying messages that were signed by either a Smart Contract Account or Externally Owned Account.\n\n## Import\n\n```ts\nimport { verifyMessage } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { verifyMessage } from '@wagmi/core'\nimport { config } from './config'\n\nawait verifyMessage(config, {\n  address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  message: 'hello world',\n  signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type VerifyMessageParameters } from '@wagmi/core'\n```\n\n### address\n\n`Address`\n\nThe Ethereum address that signed the original message.\n\n::: code-group\n```ts [index.ts]\nimport { verifyMessage } from '@wagmi/core'\nimport { config } from './config'\n\nawait verifyMessage(config, {\n  address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', // [!code focus]\n  message: 'hello world',\n  signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### message\n\n`string | { raw: Hex | ByteArray }`\n\nThe message to be verified.\n\nBy default, wagmi verifies the UTF-8 representation of the message.\n\n::: code-group\n```ts [index.ts]\nimport { verifyMessage } from '@wagmi/core'\nimport { config } from './config'\n\nawait verifyMessage(config, {\n  address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  message: 'hello world', // [!code focus]\n  signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n::: tip\nBy default, viem signs the UTF-8 representation of the message. To sign the data representation of the message, you can use the `raw` attribute.\n\n```ts\nimport { verifyMessage } from '@wagmi/core'\nimport { config } from './config'\n\nawait verifyMessage(config, {\n  address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  message: { raw: '0x68656c6c6f20776f726c64' } // [!code focus]\n  signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n})\n```\n:::\n\n### signature\n\n`Hex | ByteArray `\n\nThe signature that was generated by signing the message with the address's signer.\n\n::: code-group\n```ts [index.ts]\nimport { verifyMessage } from '@wagmi/core'\nimport { config } from './config'\n\nawait verifyMessage(config, {\n  address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  message: 'hello world',\n  signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nOnly used when verifying a message that was signed by a Smart Contract Account. The ID of chain to check if the contract was already deployed.\n\n::: code-group\n```ts [index.ts]\nimport { verifyMessage } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nawait verifyMessage(config, {\n  chainId: mainnet.id, // [!code focus]\n  address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  message: 'hello world',\n  signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockNumber\n\n`bigint | undefined`\n\nOnly used when verifying a message that was signed by a Smart Contract Account. The block number to check if the contract was already deployed.\n\n::: code-group\n```ts [index.ts]\nimport { verifyMessage } from '@wagmi/core'\nimport { config } from './config'\n\nawait verifyMessage(config, {\n  blockNumber: 12345678n, // [!code focus]\n  address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  message: 'hello world',\n  signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nOnly used when verifying a message that was signed by a Smart Contract Account. The block tag to check if the contract was already deployed.\n\n::: code-group\n```ts [index.ts]\nimport { verifyMessage } from '@wagmi/core'\nimport { config } from './config'\n\nawait verifyMessage(config, {\n  blockTag: 'latest', // [!code focus]\n  address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  message: 'hello world',\n  signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type VerifyMessageReturnType } from '@wagmi/core'\n```\n\n`boolean`\n\nWhether the signed message is valid for the given address.\n\n## Error\n\n```ts\nimport { type VerifyMessageErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Viem\n\n- [`verifyMessage`](https://viem.sh/docs/actions/public/verifyMessage)\n"
  },
  {
    "path": "site/core/api/actions/verifyTypedData.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'verifyTypedData'\nconst typeName = 'verifyTypedData'\n</script>\n\n# verifyTypedData\n\nAction for verify that a typed data was signed by the provided address. It supports verifying typed data that were signed by either a Smart Contract Account or Externally Owned Account.\n\n## Import\n\n```ts\nimport { verifyTypedData } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { verifyTypedData } from '@wagmi/core'\nimport { domain, types } from './data'\nimport { config } from './config'\n\nconst valid = await verifyTypedData(config, {\n  domain,\n  types,\n  message: {\n    from: {\n      name: 'Cow',\n      wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n    },\n    to: {\n      name: 'Bob',\n      wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n    },\n    contents: 'Hello, Bob!',\n  },\n  primaryType: 'Mail',\n  address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n})\n// true\n```\n```ts [data.ts]\n// All properties on a domain are optional\nexport const domain = {\n  name: 'Ether Mail',\n  version: '1',\n  chainId: 1,\n  verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n} as const\n\n// The named list of all type definitions\nexport const types = {\n  Person: [\n    { name: 'name', type: 'string' },\n    { name: 'wallet', type: 'address' },\n  ],\n  Mail: [\n    { name: 'from', type: 'Person' },\n    { name: 'to', type: 'Person' },\n    { name: 'contents', type: 'string' },\n  ],\n} as const\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type VerifyTypedDataParameters } from '@wagmi/core'\n```\n\n### address\n\n`Address`\n\nThe Ethereum address that signed the original typed data.\n\n::: code-group\n```ts [index.ts]\nimport { verifyTypedData } from '@wagmi/core'\nimport { domain, types } from './data'\nimport { config } from './config'\n\nconst valid = await verifyTypedData(config, {\n  domain,\n  types,\n  message: {\n    from: {\n      name: 'Cow',\n      wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n    },\n    to: {\n      name: 'Bob',\n      wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n    },\n    contents: 'Hello, Bob!',\n  },\n  primaryType: 'Mail',\n  address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', // [!code focus]\n  signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n})\n// true\n```\n```ts [data.ts]\n// All properties on a domain are optional\nexport const domain = {\n  name: 'Ether Mail',\n  version: '1',\n  chainId: 1,\n  verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n} as const\n\n// The named list of all type definitions\nexport const types = {\n  Person: [\n    { name: 'name', type: 'string' },\n    { name: 'wallet', type: 'address' },\n  ],\n  Mail: [\n    { name: 'from', type: 'Person' },\n    { name: 'to', type: 'Person' },\n    { name: 'contents', type: 'string' },\n  ],\n} as const\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### domain\n\n`TypedDataDomain`\n\nThe typed data domain.\n\n::: code-group\n```ts [index.ts]\nimport { verifyTypedData } from '@wagmi/core'\nimport { types } from './data'\nimport { config } from './config'\n\nconst valid = await verifyTypedData(config, {\n  domain: { // [!code focus:6]\n    name: 'Ether Mail',\n    version: '1',\n    chainId: 1,\n    verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n  },\n  types,\n  message: {\n    from: {\n      name: 'Cow',\n      wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n    },\n    to: {\n      name: 'Bob',\n      wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n    },\n    contents: 'Hello, Bob!',\n  },\n  primaryType: 'Mail',\n  address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n})\n// true\n```\n```ts [data.ts]\n// The named list of all type definitions\nexport const types = {\n  Person: [\n    { name: 'name', type: 'string' },\n    { name: 'wallet', type: 'address' },\n  ],\n  Mail: [\n    { name: 'from', type: 'Person' },\n    { name: 'to', type: 'Person' },\n    { name: 'contents', type: 'string' },\n  ],\n} as const\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### types\n\nThe type definitions for the typed data.\n\n::: code-group\n```ts [index.ts]\nimport { verifyTypedData } from '@wagmi/core'\nimport { domain } from './data'\nimport { config } from './config'\n\nconst valid = await verifyTypedData(config, {\n  domain,\n  types: { // [!code focus:11]\n    Person: [\n      { name: 'name', type: 'string' },\n      { name: 'wallet', type: 'address' },\n    ],\n    Mail: [\n      { name: 'from', type: 'Person' },\n      { name: 'to', type: 'Person' },\n      { name: 'contents', type: 'string' },\n    ],\n  },\n  primaryType: 'Mail',\n  address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n})\n// true\n```\n```ts [data.ts]\n// All properties on a domain are optional\nexport const domain = {\n  name: 'Ether Mail',\n  version: '1',\n  chainId: 1,\n  verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n} as const\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### primaryType\n\n`string`\n\nThe primary `type` to extract from types and use in `value`.\n\n::: code-group\n```ts [index.ts]\nimport { verifyTypedData } from '@wagmi/core'\nimport { domain } from './data'\nimport { config } from './config'\n\nconst valid = await verifyTypedData(config, {\n  domain,\n  types: {\n    Person: [\n      { name: 'name', type: 'string' },\n      { name: 'wallet', type: 'address' },\n    ],\n    Mail: [ // [!code focus:5]\n      { name: 'from', type: 'Person' },\n      { name: 'to', type: 'Person' },\n      { name: 'contents', type: 'string' },\n    ],\n  },\n  message: {\n    from: {\n      name: 'Cow',\n      wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n    },\n    to: {\n      name: 'Bob',\n      wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n    },\n    contents: 'Hello, Bob!',\n  },\n  primaryType: 'Mail', // [!code focus]\n  address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n})\n// true\n```\n```ts [data.ts]\n// All properties on a domain are optional\nexport const domain = {\n  name: 'Ether Mail',\n  version: '1',\n  chainId: 1,\n  verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n} as const\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### message\n\nType inferred from `types` & `primaryType`.\n\nThe message to be verified.\n\n::: code-group\n```ts [index.ts]\nimport { verifyTypedData } from '@wagmi/core'\nimport { domain, types } from './data'\nimport { config } from './config'\n\nconst valid = await verifyTypedData(config, {\n  domain,\n  types,\n  message: { // [!code focus:11]\n    from: {\n      name: 'Cow',\n      wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n    },\n    to: {\n      name: 'Bob',\n      wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n    },\n    contents: 'Hello, Bob!',\n  },\n  primaryType: 'Mail',\n  address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n})\n// true\n```\n```ts [data.ts]\n// All properties on a domain are optional\nexport const domain = {\n  name: 'Ether Mail',\n  version: '1',\n  chainId: 1,\n  verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n} as const\n\n// The named list of all type definitions\nexport const types = {\n  Person: [\n    { name: 'name', type: 'string' },\n    { name: 'wallet', type: 'address' },\n  ],\n  Mail: [\n    { name: 'from', type: 'Person' },\n    { name: 'to', type: 'Person' },\n    { name: 'contents', type: 'string' },\n  ],\n} as const\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### signature\n\n`Hex | ByteArray`\n\nThe signature that was generated by signing the typed data with the address's signer.\n\n::: code-group\n```ts [index.ts]\nimport { verifyTypedData } from '@wagmi/core'\nimport { domain, types } from './data'\nimport { config } from './config'\n\nconst valid = await verifyTypedData(config, {\n  domain,\n  types,\n  message: {\n    from: {\n      name: 'Cow',\n      wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n    },\n    to: {\n      name: 'Bob',\n      wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n    },\n    contents: 'Hello, Bob!',\n  },  \n  primaryType: 'Mail',\n  address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c', // [!code focus]\n})\n// true\n```\n```ts [data.ts]\n// All properties on a domain are optional\nexport const domain = {\n  name: 'Ether Mail',\n  version: '1',\n  chainId: 1,\n  verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n} as const\n\n// The named list of all type definitions\nexport const types = {\n  Person: [\n    { name: 'name', type: 'string' },\n    { name: 'wallet', type: 'address' },\n  ],\n  Mail: [\n    { name: 'from', type: 'Person' },\n    { name: 'to', type: 'Person' },\n    { name: 'contents', type: 'string' },\n  ],\n} as const\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nOnly used when verifying a typed data that was signed by a Smart Contract Account. The ID of chain to check if the contract was already deployed.\n\n::: code-group\n```ts [index.ts]\nimport { verifyTypedData } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { domain, types } from './data'\nimport { config } from './config'\n\nconst valid = await verifyTypedData(config, {\n  chainId: mainnet.id, // [!code focus]\n  domain,\n  types,\n  message: {\n    from: {\n      name: 'Cow',\n      wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n    },\n    to: {\n      name: 'Bob',\n      wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n    },\n    contents: 'Hello, Bob!',\n  },\n  primaryType: 'Mail',\n  address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n})\n// true\n```\n```ts [data.ts]\n// All properties on a domain are optional\nexport const domain = {\n  name: 'Ether Mail',\n  version: '1',\n  chainId: 1,\n  verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n} as const\n\n// The named list of all type definitions\nexport const types = {\n  Person: [\n    { name: 'name', type: 'string' },\n    { name: 'wallet', type: 'address' },\n  ],\n  Mail: [\n    { name: 'from', type: 'Person' },\n    { name: 'to', type: 'Person' },\n    { name: 'contents', type: 'string' },\n  ],\n} as const\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockNumber\n\n`bigint | undefined`\n\nOnly used when verifying a typed data that was signed by a Smart Contract Account. The block number to check if the contract was already deployed.\n\n::: code-group\n```ts [index.ts]\nimport { verifyTypedData } from '@wagmi/core'\nimport { domain, types } from './data'\nimport { config } from './config'\n\nconst valid = await verifyTypedData(config, {\n  blockNumber: 12345678n, // [!code focus]\n  domain,\n  types,\n  message: {\n    from: {\n      name: 'Cow',\n      wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n    },\n    to: {\n      name: 'Bob',\n      wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n    },\n    contents: 'Hello, Bob!',\n  },\n  primaryType: 'Mail',\n  address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n})\n// true\n```\n```ts [data.ts]\n// All properties on a domain are optional\nexport const domain = {\n  name: 'Ether Mail',\n  version: '1',\n  chainId: 1,\n  verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n} as const\n\n// The named list of all type definitions\nexport const types = {\n  Person: [\n    { name: 'name', type: 'string' },\n    { name: 'wallet', type: 'address' },\n  ],\n  Mail: [\n    { name: 'from', type: 'Person' },\n    { name: 'to', type: 'Person' },\n    { name: 'contents', type: 'string' },\n  ],\n} as const\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nOnly used when verifying a typed data that was signed by a Smart Contract Account. The block number to check if the contract was already deployed.\n\n::: code-group\n```ts [index.ts]\nimport { verifyTypedData } from '@wagmi/core'\nimport { domain, types } from './data'\nimport { config } from './config'\n\nconst valid = await verifyTypedData(config, {\n  blockTag: 'latest', // [!code focus]\n  domain,\n  types,\n  message: {\n    from: {\n      name: 'Cow',\n      wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n    },\n    to: {\n      name: 'Bob',\n      wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n    },\n    contents: 'Hello, Bob!',\n  },\n  primaryType: 'Mail',\n  address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n  signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n})\n// true\n```\n```ts [data.ts]\n// All properties on a domain are optional\nexport const domain = {\n  name: 'Ether Mail',\n  version: '1',\n  chainId: 1,\n  verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n} as const\n\n// The named list of all type definitions\nexport const types = {\n  Person: [\n    { name: 'name', type: 'string' },\n    { name: 'wallet', type: 'address' },\n  ],\n  Mail: [\n    { name: 'from', type: 'Person' },\n    { name: 'to', type: 'Person' },\n    { name: 'contents', type: 'string' },\n  ],\n} as const\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type VerifyTypedDataReturnType } from '@wagmi/core'\n```\n\n`boolean`\n\nWhether the signed message is valid for the given address.\n\n## Type Inference\n\nWith [`types`](#types) setup correctly, TypeScript will infer the correct types for [`domain`](#domain), [`message`](#message), and [`primaryType`](#primarytype). See the Wagmi [TypeScript docs](/core/typescript) for more information.\n\n## Error\n\n```ts\nimport { type VerifyTypedDataErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Viem\n\n- [`verifyTypedData`](https://viem.sh/docs/actions/public/verifyTypedData)\n"
  },
  {
    "path": "site/core/api/actions/waitForCallsStatus.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'waitForCallsStatus'\nconst typeName = 'WaitForCallsStatus'\n</script>\n\n# waitForCallsStatus\n\nWaits for a call bundle to be confirmed & included on a block before returning the status & receipts.\n\n \n\n## Import\n\n```ts\nimport { waitForCallsStatus } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { parseEther } from 'viem'\nimport { sendCalls, waitForCallsStatus } from '@wagmi/core'\nimport { config } from './config'\n\nconst id = await sendCalls(config, {\n  calls: [{\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n    value: parseEther('1')\n  }]\n})\n\nconst { status, receipts } = await waitForCallsStatus(config, { // [!code focus]\n  id, // [!code focus]\n}) // [!code focus]\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type WaitForCallsStatusParameters } from '@wagmi/core'\n```\n\n### connector\n\n`Connector | undefined`\n\nConnector to get call statuses with.\n\n::: code-group\n```ts [index.ts]\nimport { getConnections, waitForCallsStatus } from '@wagmi/core'\nimport { config } from './config'\n\nconst connections = getConnections(config)\nconst status = await waitForCallsStatus(config, {\n  connector: connections[0]?.connector, // [!code focus]\n  id: '0x1234567890abcdef',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### id\n\n`string`\n\nIdentifier of the call batch.\n\n::: code-group\n```ts [index.ts]\nimport { waitForCallsStatus } from '@wagmi/core'\nimport { config } from './config'\n\nconst status = await waitForCallsStatus(config, {\n  id: '0x1234567890abcdef', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### pollingInterval\n\n`number`\n\nPolling interval in milliseconds.\n\n::: code-group\n```ts [index.ts]\nimport { waitForCallsStatus } from '@wagmi/core'\nimport { config } from './config'\n\nconst status = await waitForCallsStatus(config, {\n  id: '0x1234567890abcdef',\n  pollingInterval: 1_000, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### timeout\n\n`number`\n\nTimeout in milliseconds before `waitForCallsStatus` stops polling.\n\n::: code-group\n```ts [index.ts]\nimport { waitForCallsStatus } from '@wagmi/core'\nimport { config } from './config'\n\nconst status = await waitForCallsStatus(config, {\n  id: '0x1234567890abcdef',\n  timeout: 10_000, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type WaitForCallsStatusReturnType } from '@wagmi/core'\n```\n\n`{ status: 'PENDING' | 'CONFIRMED', receipts: TransactionReceipt[] }`\n\nThe status and receipts of the call batch.\n\n## Error\n\n```ts\nimport { type WaitForCallsStatusErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`waitForCallsStatus`](https://viem.sh/docs/actions/wallet/waitForCallsStatus)\n"
  },
  {
    "path": "site/core/api/actions/waitForTransactionReceipt.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'waitForTransactionReceipt'\nconst typeName = 'WaitForTransactionReceipt'\n</script>\n\n# waitForTransactionReceipt\n\nAction that waits for the transaction to be included on a block, and then returns the transaction receipt. If the transaction reverts, then the action will throw an error. Replacement detection (e.g. sped up transactions) is also supported.\n\n## Import\n\n```ts\nimport { waitForTransactionReceipt } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { waitForTransactionReceipt } from '@wagmi/core'\nimport { config } from './config'\n\nconst transactionReceipt = waitForTransactionReceipt(config, {\n  hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type WaitForTransactionReceiptParameters } from '@wagmi/core'\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```ts [index.ts]\nimport { waitForTransactionReceipt } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nconst transactionReceipt = await waitForTransactionReceipt(config, {\n  chainId: mainnet.id, // [!code focus]\n  hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### confirmations\n\n`number | undefined`\n\nThe number of confirmations (blocks that have passed) to wait before resolving.\n\n::: code-group\n```ts [index.ts]\nimport { waitForTransactionReceipt } from '@wagmi/core'\nimport { config } from './config'\n\nconst transactionReceipt = await waitForTransactionReceipt(config, {\n  confirmations: 2, // [!code focus]\n  hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### onReplaced\n\n`\n(({ reason: 'replaced' | 'repriced' | 'cancelled'; replacedTransaction: Transaction; transaction: Transaction; transactionReceipt: TransactionReceipt }) => void) | undefined\n`\n\nOptional callback to emit if the transaction has been replaced.\n\n::: code-group\n```ts [index.ts]\nimport { waitForTransactionReceipt } from '@wagmi/core'\nimport { config } from './config'\n\nconst transactionReceipt = await waitForTransactionReceipt(config, {\n  hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n  onReplaced: replacement => console.log(replacement), // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### hash\n\n`` `0x${string}` ``\n\nThe transaction hash to wait for.\n\n::: code-group\n```ts [index.ts]\nimport { waitForTransactionReceipt } from '@wagmi/core'\nimport { config } from './config'\n\nconst transactionReceipt = await waitForTransactionReceipt(config, {\n  hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### pollingInterval\n\n`number | undefined`\n\n- Polling frequency (in milliseconds).\n- Defaults to the [Config's `pollingInterval` config](/core/api/createConfig#pollinginterval).\n\n::: code-group\n```ts [index.ts]\nimport { waitForTransactionReceipt } from '@wagmi/core'\nimport { config } from './config'\n\nconst transactionReceipt = await waitForTransactionReceipt(config, {\n  hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n  pollingInterval: 1_000, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type WaitForTransactionReceiptReturnType } from '@wagmi/core'\n```\n\n[`TransactionReceipt`](https://viem.sh/docs/glossary/types#transactionreceipt)\n\nThe transaction receipt.\n\n## Error\n\n```ts\nimport { type WaitForTransactionReceiptErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`waitForTransactionReceipt`](https://viem.sh/docs/actions/public/waitForTransactionReceipt)\n"
  },
  {
    "path": "site/core/api/actions/watchAsset.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'watchAsset'\nconst typeName = 'WatchAsset'\n</script>\n\n# watchAsset\n\nAction for requesting user tracks the token in their wallet. Returns a boolean indicating if the token was successfully added.\n\n## Import\n\n```ts\nimport { watchAsset } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { watchAsset } from '@wagmi/core'\nimport { config } from './config'\n\nawait watchAsset(config, {\n  type: 'ERC20',\n  options: {\n    address: '0x0000000000000000000000000000000000000000',\n    symbol: 'WAGMI',\n    decimals: 18,\n  },\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type WatchAssetParameters } from '@wagmi/core'\n```\n\n### connector\n\n`Connector | undefined`\n\n[Connector](/core/api/connectors) to sign message with.\n\n::: code-group\n```ts [index.ts]\nimport { getConnection, watchAsset } from '@wagmi/core'\nimport { config } from './config'\n\nconst { connector } = getConnection(config)\nconst result = await watchAsset(config, {\n  connector, // [!code focus]\n  options: {\n    address: '0x0000000000000000000000000000000000000000',\n    symbol: 'WAGMI',\n    decimals: 18,\n  },\n  type: 'ERC20',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### options\n\n`{ address: string; symbol: string; decimals: number; image?: string | undefined; }`\n\nAsset options.\n\n::: code-group\n```ts [index.ts]\nimport { watchAsset } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await watchAsset(config, {\n  options: { // [!code focus]\n    address: '0x0000000000000000000000000000000000000000', // [!code focus]\n    symbol: 'WAGMI', // [!code focus]\n    decimals: 18, // [!code focus]\n  }, // [!code focus]\n  type: 'ERC20',\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### type\n\n`'ERC20'`\n\nType of asset.\n\n::: code-group\n```ts [index.ts]\nimport { watchAsset } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await watchAsset(config, {\n  options: {\n    address: '0x0000000000000000000000000000000000000000',\n    symbol: 'WAGMI',\n    decimals: 18,\n  },\n  type: 'ERC20', // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type WatchAssetReturnType } from '@wagmi/core'\n```\n\n`boolean`\n\nReturns a boolean indicating if the token was successfully added.\n\n## Error\n\n```ts\nimport { type WatchAssetErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Viem\n\n- [`watchAsset`](https://viem.sh/docs/actions/wallet/watchAsset)\n\n"
  },
  {
    "path": "site/core/api/actions/watchBlockNumber.md",
    "content": "# watchBlockNumber\n\nAction that watches for block number changes.\n\n## Import\n\n```ts\nimport { watchBlockNumber } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { watchBlockNumber } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchBlockNumber(config, {\n  onBlockNumber(blockNumber) {\n    console.log('Block number changed!', blockNumber)\n  },\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type WatchBlockNumberParameters } from '@wagmi/core'\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```ts [index.ts]\nimport { watchBlockNumber } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nconst unwatch = watchBlockNumber(config, {\n  chainId: mainnet.id, // [!code focus]\n  onBlockNumber(blockNumber) {\n    console.log('Block number changed!', blockNumber)\n  },\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### emitOnBegin\n\n`boolean | undefined`\n\nWhether or not to emit the latest block number to the callback when the subscription opens.\n\n::: code-group\n```ts [index.ts]\nimport { watchBlockNumber } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchBlockNumber(config, {\n  emitOnBegin: true, // [!code focus]\n  onBlockNumber(blockNumber) {\n    console.log('Block number changed!', blockNumber)\n  },\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### emitMissed\n\n`boolean | undefined`\n\nWhether or not to emit the missed block numbers to the callback.\n\n::: code-group\n```ts [index.ts]\nimport { watchBlockNumber } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchBlockNumber(config, {\n  emitMissed: true, // [!code focus]\n  onBlockNumber(blockNumber) {\n    console.log('Block number changed!', blockNumber)\n  },\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n\n### onBlockNumber\n\n`(blockNumber: bigint, prevBlockNumber: bigint | undefined) => void`\n\nCallback for when block number changes.\n\n::: code-group\n```ts [index.ts]\nimport { watchBlockNumber } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchBlockNumber(config, {\n  onBlockNumber(blockNumber) { // [!code focus]\n    console.log('Block number changed!', blockNumber) // [!code focus]\n  }, // [!code focus]\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### onError\n\n`((error: Error) => void) | undefined`\n\nError thrown from getting the block number.\n\n::: code-group\n```ts [index.ts]\nimport { watchBlockNumber } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchBlockNumber(config, {\n  onBlockNumber(blockNumber) { \n    console.log('Block number changed!', blockNumber) \n  }, \n  onError(error) { // [!code focus]\n    console.error('Block number error', error) // [!code focus]\n  }, // [!code focus]\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### poll\n\n`boolean | undefined`\n\n- Whether or not to use a polling mechanism to check for new blocks instead of a WebSocket subscription.\n- Defaults to `false` for WebSocket Clients, and `true` for non-WebSocket Clients.\n\n::: code-group\n```ts [index.ts]\nimport { watchBlockNumber } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchBlockNumber(config, {\n  onBlockNumber(blockNumber) { \n    console.log('Block number changed!', blockNumber) \n  }, \n  poll: true, // [!code focus]\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### pollingInterval\n\n`number | undefined`\n\n- Polling frequency (in milliseconds).\n- Defaults to the [Config's `pollingInterval` config](/core/api/createConfig#pollinginterval).\n\n::: code-group\n```ts [index.ts]\nimport { watchBlockNumber } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchBlockNumber(config, {\n  onBlockNumber(blockNumber) { \n    console.log('Block number changed!', blockNumber) \n  }, \n  pollingInterval: 1_000, // [!code focus]\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### syncConnectedChain\n\n`boolean | undefined`\n\n- Set up subscriber for connected chain changes.\n- Defaults to [`Config['syncConnectedChain']`](/core/api/createConfig#syncconnectedchain).\n\n::: code-group\n```ts [index.ts]\nimport { watchBlockNumber } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchBlockNumber(config, {\n  onBlockNumber(blockNumber) {\n    console.log('Block number changed!', blockNumber)\n  },\n  syncConnectedChain: false, // [!code focus]\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type WatchBlockNumberReturnType } from '@wagmi/core'\n```\n\nFunction for cleaning up watcher.\n\n## Viem\n\n- [`watchBlockNumber`](https://viem.sh/docs/actions/public/watchBlockNumber)\n"
  },
  {
    "path": "site/core/api/actions/watchBlocks.md",
    "content": "# watchBlocks\n\nAction that watches for block changes.\n\n## Import\n\n```ts\nimport { watchBlocks } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { watchBlocks } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchBlocks(config, {\n  onBlock(block) {\n    console.log('Block changed!', block)\n  },\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type WatchBlocksParameters } from '@wagmi/core'\n```\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized'`\n\nWatch for new blocks on a given tag. Defaults to `'latest'`.\n\n::: code-group\n```ts [index.ts]\nimport { watchBlocks } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchBlocks(config, {\n  blockTag: 'pending', // [!code focus]\n  onBlock(block) {\n    console.log('Block changed!', block)\n  },\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```ts [index.ts]\nimport { watchBlocks } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nconst unwatch = watchBlocks(config, {\n  chainId: mainnet.id, // [!code focus]\n  onBlock(block) {\n    console.log('Block changed!', block)\n  },\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### emitMissed\n\n`boolean`\n\nWhether or not to emit missed blocks to the callback. Defaults to `false`.\n\nMissed blocks may occur in instances where internet connection is lost, or the block time is lesser than the polling interval of the client.\n\n::: code-group\n```ts [index.ts]\nimport { watchBlocks } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchBlocks(config, {\n  emitMissed: true, // [!code focus]\n  onBlock(block) {\n    console.log('Block changed!', block)\n  },\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### emitOnBegin\n\n`boolean`\n\nWhether or not to emit the block to the callback when the subscription opens. Defaults to `false`.\n\n::: code-group\n```ts [index.ts]\nimport { watchBlocks } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchBlocks(config, {\n  emitOnBegin: true, // [!code focus]\n  onBlock(block) {\n    console.log('Block changed!', block)\n  },\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### onBlock\n\n`(block: Block, prevblock: Block | undefined) => void`\n\nCallback for when block changes.\n\n::: code-group\n```ts [index.ts]\nimport { watchBlocks } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchBlocks(config, {\n  onBlock(block) { // [!code focus]\n    console.log('Block changed!', block) // [!code focus]\n  }, // [!code focus]\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### onError\n\n`((error: Error) => void) | undefined`\n\nError thrown from getting the block.\n\n::: code-group\n```ts [index.ts]\nimport { watchBlocks } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchBlocks(config, {\n  onBlock(block) { \n    console.log('Block changed!', block) \n  }, \n  onError(error) { // [!code focus]\n    console.error('Block error', error) // [!code focus]\n  }, // [!code focus]\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### poll\n\n`boolean | undefined`\n\n- Whether or not to use a polling mechanism to check for new blocks instead of a WebSocket subscription.\n- Defaults to `false` for WebSocket Clients, and `true` for non-WebSocket Clients.\n\n::: code-group\n```ts [index.ts]\nimport { watchBlocks } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchBlocks(config, {\n  poll: true, // [!code focus]\n  onBlock(block) {\n    console.log('Block changed!', block)\n  },\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### pollingInterval\n\n`number | undefined`\n\n- Polling frequency (in milliseconds).\n- Defaults to the [Config's `pollingInterval` config](/core/api/createConfig#pollinginterval).\n\n::: code-group\n```ts [index.ts]\nimport { watchBlocks } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchBlocks(config, {\n  pollingInterval: 1_000, // [!code focus]\n  onBlock(block) {\n    console.log('Block changed!', block)\n  },\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### syncConnectedChain\n\n`boolean | undefined`\n\n- Set up subscriber for connected chain changes.\n- Defaults to [`Config['syncConnectedChain']`](/core/api/createConfig#syncconnectedchain).\n\n::: code-group\n```ts [index.ts]\nimport { watchBlocks } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchBlocks(config, {\n  onBlock(block) {\n    console.log('Block changed!', block)\n  },\n  syncConnectedChain: false, // [!code focus]\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type WatchBlocksReturnType } from '@wagmi/core'\n```\n\nFunction for cleaning up watcher.\n\n## Viem\n\n- [`watchBlocks`](https://viem.sh/docs/actions/public/watchBlocks)\n"
  },
  {
    "path": "site/core/api/actions/watchChainId.md",
    "content": "# watchChainId\n\nSubscribe to chain ID changes.\n\n## Import\n\n```ts\nimport { watchChainId } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { watchChainId } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchChainId(config, {\n  onChange(chainId) {\n    console.log('Chain ID changed!', chainId)\n  },\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type WatchChainIdParameters } from '@wagmi/core'\n```\n\n### onChange\n\n`onChange(chainId: GetChainIdReturnType, prevChainId: GetChainIdReturnType): void`\n\nCallback function called when chain ID changes.\n\n::: code-group\n```ts [index.ts]\nimport { watchChainId } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchChainId(config, {\n  onChange(chainId) { // [!code focus:3]\n    console.log('Chain ID changed!', chainId)\n  },\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type WatchChainIdReturnType } from '@wagmi/core'\n```\n\nFunction for cleaning up watcher."
  },
  {
    "path": "site/core/api/actions/watchClient.md",
    "content": "# watchClient\n\nSubscribe to Client changes.\n\n## Import\n\n```ts\nimport { watchClient } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { watchClient } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchClient(config, {\n  onChange(client) {\n    console.log('Client changed!', client)\n  },\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type WatchClientParameters } from '@wagmi/core'\n```\n\n### onChange\n\n`onChange(client: GetClientReturnType, prevClient: GetClientReturnType): void`\n\nCallback function called when Client changes.\n\n::: code-group\n```ts [index.ts]\nimport { watchClient } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchClient(config, {\n  onChange(client) { // [!code focus:3]\n    console.log('Client changed!', client)\n  },\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type WatchClientReturnType } from '@wagmi/core'\n```\n\nFunction for cleaning up watcher."
  },
  {
    "path": "site/core/api/actions/watchConnection.md",
    "content": "# watchConnection\n\nSubscribe to connection changes.\n\n## Import\n\n```ts\nimport { watchConnection } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { watchConnection } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchConnection(config, {\n  onChange(data) {\n    console.log('Connection changed!', data)\n  },\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type WatchConnectionParameters } from '@wagmi/core'\n```\n\n### onChange\n\n`onChange(connection: GetConnectionReturnType, prevConnection: GetConnectionReturnType): void`\n\nCallback function called when connection changes.\n\n::: code-group\n```ts [index.ts]\nimport { watchConnection } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchConnection(config, {\n  onChange(connection) { // [!code focus:3]\n    console.log('Connection changed!', connection)\n  },\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type WatchConnectionReturnType } from '@wagmi/core'\n```\n\nFunction for cleaning up watcher.\n"
  },
  {
    "path": "site/core/api/actions/watchConnections.md",
    "content": "# watchConnections\n\nSubscribe to connections changes.\n\n## Import\n\n```ts\nimport { watchConnections } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { watchConnections } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchConnections(config, {\n  onChange(data) {\n    console.log('Connections changed!', data)\n  },\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type WatchConnectionsParameters } from '@wagmi/core'\n```\n\n### onChange\n\n`onChange(connections: GetConnectionsReturnType, prevConnections: GetConnectionsReturnType): void`\n\nCallback function called when connections changes.\n\n::: code-group\n```ts [index.ts]\nimport { watchConnections } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchConnections(config, {\n  onChange(data) { // [!code focus:3]\n    console.log('Connections changed!', data)\n  },\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type WatchConnectionsReturnType } from '@wagmi/core'\n```\n\nFunction for cleaning up watcher."
  },
  {
    "path": "site/core/api/actions/watchConnectors.md",
    "content": "# watchConnectors\n\nSubscribe to connectors changes.\n\n## Import\n\n```ts\nimport { watchConnectors } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { watchConnectors } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchConnectors(config, {\n  onChange(connectors) {\n    console.log('Connectors changed!', connectors)\n  },\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type WatchConnectorsParameters } from '@wagmi/core'\n```\n\n### onChange\n\n`onChange(connectors: GetConnectorsReturnType, prevConnectors: GetConnectorsReturnType): void`\n\nCallback function called when connectors changes.\n\n::: code-group\n```ts [index.ts]\nimport { watchConnectors } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchConnectors(config, {\n  onChange(connectors) { // [!code focus:3]\n    console.log('Connectors changed!', connectors)\n  },\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type WatchConnectorsReturnType } from '@wagmi/core'\n```\n\nFunction for cleaning up watcher."
  },
  {
    "path": "site/core/api/actions/watchContractEvent.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'watchContractEvent'\nconst typeName = 'WatchContractEvent'\n</script>\n\n# watchContractEvent\n\nAction that watches and returns emitted contract event logs.\n\n## Import\n\n```ts\nimport { watchContractEvent } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { watchContractEvent } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst unwatch = watchContractEvent(config, {\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  abi,\n  eventName: 'Transfer',\n  onLogs(logs) {\n    console.log('New logs!', logs)\n  },\n})\nunwatch()\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type WatchContractEventParameters } from '@wagmi/core'\n```\n\n### abi\n\n`Abi`\n\nThe contract's ABI. Check out the [TypeScript docs](/react/typescript#const-assert-abis-typed-data) for how to set up ABIs for maximum type inference and safety.\n\n::: code-group\n```ts [index.ts]\nimport { watchContractEvent } from '@wagmi/core'\nimport { abi } from './abi' // [!code focus]\nimport { config } from './config'\n\nconst unwatch = watchContractEvent(config, {\n  abi, // [!code focus]\n  onLogs(logs) {\n    console.log('Logs changed!', logs)\n  },\n})\nunwatch()\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### address\n\n`Address | undefined`\n\nThe contract's address.\n\n::: code-group\n```ts [index.ts]\nimport { watchContractEvent } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst unwatch = watchContractEvent(config, {\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f', // [!code focus]\n  abi,\n  onLogs(logs) {\n    console.log('Logs changed!', logs)\n  },\n})\nunwatch()\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### args\n\n`object | readonly unknown[] | undefined`\n\n- Arguments to pass when calling the contract.\n- Inferred from [`abi`](#abi) and [`eventName`](#eventname).\n\n::: code-group\n```ts [index.ts]\nimport { watchContractEvent } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst unwatch = watchContractEvent(config, {\n  abi,\n  args: { // [!code focus]\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n  }, // [!code focus]\n  onLogs(logs) {\n    console.log('Logs changed!', logs)\n  },\n})\nunwatch()\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### batch\n\n`boolean | undefined`\n\n- Whether or not the events should be batched on each invocation.\n- Defaults to `true`.\n\n::: code-group\n```ts [index.ts]\nimport { watchContractEvent } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst unwatch = watchContractEvent(config, {\n  abi,\n  batch: false, // [!code focus]\n  onLogs(logs) {\n    console.log('Logs changed!', logs)\n  },\n})\nunwatch()\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```ts [index.ts]\nimport { watchContractEvent } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst unwatch = watchContractEvent(config, {\n  abi,\n  chainId: mainnet.id, // [!code focus]\n  onLogs(logs) {\n    console.log('Logs changed!', logs)\n  },\n})\nunwatch()\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### eventName\n\n`string`\n\n- Event to listen for the contract.\n- Inferred from [`abi`](#abi).\n\n::: code-group\n```ts [index.ts]\nimport { watchContractEvent } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst unwatch = watchContractEvent(config, {\n  abi,\n  eventName: 'Approval', // [!code focus]\n  onLogs(logs) {\n    console.log('Logs changed!', logs)\n  },\n})\nunwatch()\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### onError\n\n`((error: Error) => void) | undefined`\n\nError thrown from getting the block number.\n\n::: code-group\n```ts [index.ts]\nimport { watchContractEvent } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst unwatch = watchContractEvent(config, {\n  abi,\n  onLogs(logs) { \n    console.log('Logs changed!', logs) \n  }, \n  onError(error) { // [!code focus]\n    console.error('Logs error', error) // [!code focus]\n  }, // [!code focus]\n})\nunwatch()\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### onLogs\n\n`(logs: Log[], prevLogs: Log[] | undefined) => void`\n\nCallback for when logs changes.\n\n::: code-group\n```ts [index.ts]\nimport { watchContractEvent } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst unwatch = watchContractEvent(config, {\n  abi,\n  onLogs(logs) { // [!code focus]\n    console.log('Logs changed!', logs) // [!code focus]\n  }, // [!code focus]\n})\nunwatch()\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### poll\n\n`boolean | undefined`\n\n- Whether or not to use a polling mechanism to check for new blocks instead of a WebSocket subscription.\n- Defaults to `false` for WebSocket Clients, and `true` for non-WebSocket Clients.\n\n::: code-group\n```ts [index.ts]\nimport { watchContractEvent } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst unwatch = watchContractEvent(config, {\n  abi,\n  onLogs(logs) {\n    console.log('Logs changed!', logs)\n  },\n  poll: true, // [!code focus]\n})\nunwatch()\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### pollingInterval\n\n`number | undefined`\n\n- Polling frequency (in milliseconds).\n- Defaults to the [Config's `pollingInterval` config](/core/api/createConfig#pollinginterval).\n\n::: code-group\n```ts [index.ts]\nimport { watchContractEvent } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst unwatch = watchContractEvent(config, {\n  abi,\n  onLogs(logs) {\n    console.log('Logs changed!', logs)\n  },\n  pollingInterval: 1_000, // [!code focus]\n})\nunwatch()\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### strict\n\n`boolean | undefined`\n\n- Defaults to `false`.\n\n::: code-group\n```ts [index.ts]\nimport { watchContractEvent } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst unwatch = watchContractEvent(config, {\n  abi,\n  onLogs(logs) {\n    console.log('Logs changed!', logs)\n  },\n  strict: true, // [!code focus]\n})\nunwatch()\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### syncConnectedChain\n\n`boolean | undefined`\n\n- Set up subscriber for connected chain changes.\n- Defaults to [`Config['syncConnectedChain']`](/core/api/createConfig#syncconnectedchain).\n\n::: code-group\n```ts [index.ts]\nimport { watchContractEvent } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst unwatch = watchContractEvent(config, {\n  abi,\n  onLogs(logs) {\n    console.log('Logs changed!', logs)\n  },\n  syncConnectedChain: false, // [!code focus]\n})\nunwatch()\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type WatchContractEventReturnType } from '@wagmi/core'\n```\n\nFunction for cleaning up watcher.\n\n## Type Inference\n\nWith [`abi`](#abi) setup correctly, TypeScript will infer the correct types for [`eventName`](#eventname), [`args`](#args), and [`onLogs`](#onlogs) parameters. See the Wagmi [TypeScript docs](/core/typescript) for more information.\n\n## Error\n\n```ts\nimport { type WatchContractEventError } from '@wagmi/core'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`watchContractEvent`](https://viem.sh/docs/contract/watchContractEvent)\n"
  },
  {
    "path": "site/core/api/actions/watchPendingTransactions.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'watchPendingTransactions'\nconst typeName = 'WatchPendingTransactions'\n</script>\n\n# watchPendingTransactions\n\nAction that watches and returns pending transaction hashes.\n\n## Import\n\n```ts\nimport { watchPendingTransactions } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { watchPendingTransactions } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchPendingTransactions(config, {\n  onTransactions(transactions) {\n    console.log('New transactions!', transactions)\n  },\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type WatchPendingTransactionsParameters } from '@wagmi/core'\n```\n\n### batch\n\n`boolean | undefined`\n\n- Whether or not the transactions should be batched on each invocation.\n- Defaults to `true`.\n\n::: code-group\n```ts [index.ts]\nimport { watchPendingTransactions } from '@wagmi/core'\n\nconst unwatch = watchPendingTransactions(config, {\n  batch: false, // [!code focus]\n  onTransactions(transactions) {\n    console.log('New transactions!', transactions)\n  },\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```ts [index.ts]\nimport { watchPendingTransactions } from '@wagmi/core'\nimport { mainnet } from '@wagmi/core/chains'\nimport { config } from './config'\n\nconst unwatch = watchPendingTransactions(config, {\n  chainId: mainnet.id, // [!code focus]\n  onTransactions(transactions) {\n    console.log('New transactions!', transactions)\n  },\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### onError\n\n`((error: Error) => void) | undefined`\n\nError thrown from watching pending transactions.\n\n::: code-group\n```ts [index.ts]\nimport { watchPendingTransactions } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchPendingTransactions(config, {\n  onError(error) { // [!code focus]\n    console.log('Error', error) // [!code focus]\n  }, // [!code focus]\n  onTransactions(transactions) {\n    console.log('New transactions!', transactions)\n  },\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### onTransactions\n\n`(transactions: Hash[], prevTransactions: Hash[] | undefined) => void`\n\nCallback when new incoming pending transactions are detected.\n\n::: code-group\n```ts [index.ts]\nimport { watchPendingTransactions } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchPendingTransactions(config, {\n  onTransactions(transactions) { // [!code focus]\n    console.log('New transactions!', transactions) // [!code focus]\n  }, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### poll\n\n`boolean | undefined`\n\n- Whether or not to use a polling mechanism to check for new pending transactions instead of a WebSocket subscription.\n- Defaults to `false` for WebSocket Clients, and `true` for non-WebSocket Clients.\n\n::: code-group\n```ts [index.ts]\nimport { watchPendingTransactions } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchPendingTransactions(config, {\n  onTransactions(transactions) {\n    console.log('New transactions!', transactions)\n  },\n  poll: false, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### pollingInterval\n\n`number | undefined`\n\n- Polling frequency (in milliseconds).\n- Defaults to the [Config's `pollingInterval` config](/core/api/createConfig#pollinginterval).\n\n::: code-group\n```ts [index.ts]\nimport { watchPendingTransactions } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchPendingTransactions(config, {\n  onTransactions(transactions) {\n    console.log('New transactions!', transactions)\n  },\n  pollingInterval: 1_000, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### syncConnectedChain\n\n`boolean | undefined`\n\n- Set up subscriber for connected chain changes.\n- Defaults to [`Config['syncConnectedChain']`](/core/api/createConfig#syncconnectedchain).\n\n::: code-group\n```ts [index.ts]\nimport { watchPendingTransactions } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchPendingTransactions(config, {\n  onTransactions(transactions) {\n    console.log('New transactions!', transactions)\n  },\n  syncConnectedChain: false, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type WatchPendingTransactionsReturnType } from '@wagmi/core'\n```\n\nFunction to unsubscribe from pending transaction listener.\n\n## Error\n\n```ts\nimport { type WatchPendingTransactionsError } from '@wagmi/core'\n```\n\n## Viem\n\n- [`watchPendingTransactions`](https://viem.sh/docs/actions/public/watchPendingTransactions)\n"
  },
  {
    "path": "site/core/api/actions/watchPublicClient.md",
    "content": "# watchPublicClient\n\nSubscribe to Public Client changes.\n\n## Import\n\n```ts\nimport { watchPublicClient } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { watchPublicClient } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchPublicClient(config, {\n  onChange(client) {\n    console.log('Public Client changed!', client)\n  },\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type WatchPublicClientParameters } from '@wagmi/core'\n```\n\n### onChange\n\n`onChange(client: GetPublicClientReturnType, prevClient: GetPublicClientReturnType): void`\n\nCallback function called when Public Client changes.\n\n::: code-group\n```ts [index.ts]\nimport { watchPublicClient } from '@wagmi/core'\nimport { config } from './config'\n\nconst unwatch = watchPublicClient(config, {\n  onChange(client) { // [!code focus:3]\n    console.log('Public Client changed!', client)\n  },\n})\nunwatch()\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type WatchPublicClientReturnType } from '@wagmi/core'\n```\n\nFunction for cleaning up watcher."
  },
  {
    "path": "site/core/api/actions/writeContract.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core'\nconst actionName = 'writeContract'\nconst typeName = 'WriteContract'\n</script>\n\n# writeContract\n\nAction for executing a write function on a contract.\n\nA \"write\" function on a Solidity contract modifies the state of the blockchain. These types of functions require gas to be executed, hence a transaction is broadcasted in order to change the state.\n\n## Import\n\n```ts\nimport { writeContract } from '@wagmi/core'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { writeContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await writeContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n::::tip Pairing with `simulateContract`\n\nPairing [`simulateContract`](/core/api/actions/simulateContract) with `writeContract` allows you to validate if the transaction will succeed ahead of time. If the simulate succeeds, `writeContract` can execute the transaction.\n\n::: code-group\n```ts [index.ts]\nimport { simulateContract, writeContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst { request } = await simulateContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n})\nconst hash = await writeContract(config, request)\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n::::\n\n### Synchronous Usage\n\nIf you want to wait for the transaction to be included in a block before returning, you can use `writeContractSync`:\n\n::: code-group\n```ts [index.ts]\nimport { writeContractSync } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst receipt = await writeContractSync(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type WriteContractParameters } from '@wagmi/core'\n```\n\n### abi\n\n`Abi`\n\nThe contract's ABI. Check out the [TypeScript docs](/react/typescript#const-assert-abis-typed-data) for how to set up ABIs for maximum type inference and safety.\n\n::: code-group\n```ts [index.ts]\nimport { writeContract } from '@wagmi/core'\nimport { abi } from './abi' // [!code focus]\nimport { config } from './config'\n\nconst result = await writeContract(config, {\n  abi, // [!code focus]\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### accessList\n\n`AccessList | undefined`\n\nThe access list.\n\n::: code-group\n```ts [index.ts]\nimport { writeContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await writeContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  accessList: [{ // [!code focus]\n    address: '0x1', // [!code focus]\n    storageKeys: ['0x1'], // [!code focus]\n  }], // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### account\n\n`Address | Account | undefined`\n\nAccount to use when signing data. Throws if account is not found on [`connector`](#connector).\n\n::: code-group\n```ts [index.ts]\nimport { writeContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await writeContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  account: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### address\n\n`Address`\n\nThe contract's address.\n\n::: code-group\n```ts [index.ts]\nimport { writeContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await writeContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f', // [!code focus]\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n\n### args\n\n`readonly unknown[] | undefined`\n\n- Arguments to pass when calling the contract.\n- Inferred from [`abi`](#abi) and [`functionName`](#functionname).\n\n::: code-group\n```ts [index.ts]\nimport { writeContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await writeContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [ // [!code focus]\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', // [!code focus]\n    123n, // [!code focus]\n  ] // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nChain ID to validate against before sending transaction.\n\n::: code-group\n```ts [index.ts]\nimport { writeContract } from '@wagmi/core'\nimport { mainnet } from 'wagmi/chains' // [!code focus]\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await writeContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  chainId: mainnet.id, // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### connector\n\n`Connector | undefined`\n\n[Connector](/core/api/connectors) to sign data with.\n\n::: code-group\n```ts [index.ts]\nimport { getConnection, writeContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst { connector } = getConnection(config)\nconst result = await writeContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  connector, // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### dataSuffix\n\n`` `0x${string}` | undefined ``\n\nData to append to the end of the calldata. Useful for adding a [\"domain\" tag](https://opensea.notion.site/opensea/Seaport-Order-Attributions-ec2d69bf455041a5baa490941aad307f).\n\n::: code-group\n```ts [index.ts]\nimport { writeContract } from '@wagmi/core'\nimport { parseGwei } from 'viem'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await writeContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  dataSuffix: '0xdeadbeef', // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### functionName\n\n`string`\n\n- Function to call on the contract.\n- Inferred from [`abi`](#abi).\n\n::: code-group\n```ts [index.ts]\nimport { writeContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await writeContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'approve', // [!code focus]\n  args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', 123n]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n\n### gas\n\n`bigint | undefined`\n\nGas provided for transaction execution.\n\n::: code-group\n```ts [index.ts]\nimport { writeContract } from '@wagmi/core'\nimport { parseGwei } from 'viem'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await writeContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  gas: parseGwei('20'), // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### gasPrice\n\n`bigint | undefined`\n\nThe price in wei to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms#legacy-transaction).\n\n::: code-group\n```ts [index.ts]\nimport { writeContract } from '@wagmi/core'\nimport { parseGwei } from 'viem'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await writeContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  gasPrice: parseGwei('20'), // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### maxFeePerGas\n\n`bigint | undefined`\n\nTotal fee per gas in wei, inclusive of [`maxPriorityFeePerGas`](#maxPriorityFeePerGas). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n```ts [index.ts]\nimport { writeContract } from '@wagmi/core'\nimport { parseGwei } from 'viem'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await writeContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  maxFeePerGas: parseGwei('20'), // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### maxPriorityFeePerGas\n\n`bigint | undefined`\n\nMax priority fee per gas in wei. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n```ts [index.ts]\nimport { writeContract } from '@wagmi/core'\nimport { parseGwei } from 'viem'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await writeContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  maxFeePerGas: parseGwei('20'),\n  maxPriorityFeePerGas: parseGwei('2'), // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n---\n\n### nonce\n\n`number`\n\nUnique number identifying this transaction.\n\n::: code-group\n```ts [index.ts]\nimport { writeContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await writeContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  nonce: 123, // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### type\n\n`'legacy' | 'eip1559' | 'eip2930' | undefined`\n\nOptional transaction request type to narrow parameters.\n\n::: code-group\n```ts [index.ts]\nimport { writeContract } from '@wagmi/core'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await writeContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  type: 'eip1559', // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### value\n\n`bigint | undefined`\n\nValue in wei sent with this transaction.\n\n::: code-group\n```ts [index.ts]\nimport { writeContract } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = await writeContract(config, {\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  value: parseEther('0.01'), // [!code focus]\n})\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type WriteContractReturnType } from '@wagmi/core'\n```\n\n[`Hash`](https://viem.sh/docs/glossary/types#hash)\n\nThe transaction hash.\n\n## Type Inference\n\nWith [`abi`](#abi) setup correctly, TypeScript will infer the correct types for [`functionName`](#functionname), [`args`](#args), and [`value`](#value). See the Wagmi [TypeScript docs](/core/typescript) for more information.\n\n## Error\n\n```ts\nimport { type WriteContractErrorType } from '@wagmi/core'\n```\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Viem\n\n- [`writeContract`](https://viem.sh/docs/contract/writeContract)\n"
  },
  {
    "path": "site/core/api/actions/writeContracts.md",
    "content": "<script setup>\nconst packageName = '@wagmi/core/experimental'\nconst actionName = 'writeContracts'\nconst typeName = 'WriteContracts'\n</script>\n\n# writeContracts\n\nAction that requests for the wallet to sign and broadcast a batch of write contract calls (transactions) to the network.\n\n[Read more.](https://github.com/ethereum/EIPs/blob/815028dc634463e1716fc5ce44c019a6040f0bef/EIPS/eip-5792.md#wallet_sendcalls)\n\n \n\n## Import\n\n```ts\nimport { writeContracts } from '@wagmi/core/experimental'\n```\n\n## Usage\n\n::: code-group\n```ts [index.ts]\nimport { parseAbi } from 'viem'\nimport { writeContracts } from '@wagmi/core/experimental'\nimport { config } from './config'\n\nconst abi = parseAbi([\n  'function approve(address, uint256) returns (bool)',\n  'function transferFrom(address, address, uint256) returns (bool)',\n])\n\nconst id = await writeContracts(config, {\n  contracts: [\n    {\n      address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n      abi,\n      functionName: 'approve',\n      args: [\n        '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC', \n        100n\n      ],\n    },\n    {\n      address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n      abi,\n      functionName: 'transferFrom',\n      args: [\n        '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n        '0x0000000000000000000000000000000000000000',\n        100n\n      ],\n    },\n  ],\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type WriteContractsParameters } from '@wagmi/core/experimental'\n```\n\n### account\n\n`Account | Address | undefined`\n\nAccount to execute the calls.\n\n::: code-group\n```ts [index.ts]\nimport { parseAbi } from 'viem'\nimport { writeContracts } from '@wagmi/core/experimental'\nimport { config } from './config'\n\nconst abi = parseAbi([\n  'function approve(address, uint256) returns (bool)',\n  'function transferFrom(address, address, uint256) returns (bool)',\n])\n\nconst id = await writeContracts(config, {\n  account: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC', // [!code focus]\n  contracts: [\n    {\n      address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n      abi,\n      functionName: 'approve',\n      args: [\n        '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC', \n        100n\n      ],\n    },\n    {\n      address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n      abi,\n      functionName: 'transferFrom',\n      args: [\n        '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n        '0x0000000000000000000000000000000000000000',\n        100n\n      ],\n    },\n  ],\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### contracts\n\n`{ to: Hex, data?: Hex, value?: bigint }[]`\n\nCalls to execute.\n\n::: code-group\n```ts [index.ts]\nimport { parseAbi } from 'viem'\nimport { writeContracts } from '@wagmi/core/experimental'\nimport { config } from './config'\n\nconst abi = parseAbi([\n  'function approve(address, uint256) returns (bool)',\n  'function transferFrom(address, address, uint256) returns (bool)',\n])\n\nconst id = await writeContracts(config, {\n  contracts: [ // [!code focus]\n    { // [!code focus]\n      address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', // [!code focus]\n      abi, // [!code focus]\n      functionName: 'approve', // [!code focus]\n      args: [ // [!code focus]\n        '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC', // [!code focus]\n        100n // [!code focus]\n      ], // [!code focus]\n    }, // [!code focus]\n    { // [!code focus]\n      address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', // [!code focus]\n      abi, // [!code focus]\n      functionName: 'transferFrom', // [!code focus]\n      args: [ // [!code focus]\n        '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC', // [!code focus]\n        '0x0000000000000000000000000000000000000000', // [!code focus]\n        100n // [!code focus]\n      ], // [!code focus]\n    }, // [!code focus]\n  ], // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### capabilities\n\n`WalletCapabilities | undefined`\n\nCapability metadata for the calls (e.g. specifying a paymaster).\n\n::: code-group\n```ts [index.ts]\nimport { parseAbi } from 'viem'\nimport { writeContracts } from '@wagmi/core/experimental'\nimport { config } from './config'\n\nconst abi = parseAbi([\n  'function approve(address, uint256) returns (bool)',\n  'function transferFrom(address, address, uint256) returns (bool)',\n])\n\nconst id = await writeContracts(config, {\n  contracts: [\n    {\n      address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n      abi,\n      functionName: 'approve',\n      args: [\n        '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC', \n        100n\n      ],\n    },\n    {\n      address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n      abi,\n      functionName: 'transferFrom',\n      args: [\n        '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n        '0x0000000000000000000000000000000000000000',\n        100n\n      ],\n    },\n  ],\n  capabilities: { // [!code focus]\n    paymasterService: { // [!code focus]\n      url: 'https://...' // [!code focus]\n    } // [!code focus]\n  } // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`number | undefined`\n\nThe target chain ID to broadcast the calls.\n\n::: code-group\n```ts [index.ts]\nimport { parseAbi } from 'viem'\nimport { writeContracts } from '@wagmi/core/experimental'\nimport { config } from './config'\n\nconst abi = parseAbi([\n  'function approve(address, uint256) returns (bool)',\n  'function transferFrom(address, address, uint256) returns (bool)',\n])\n\nconst id = await writeContracts(config, {\n  contracts: [\n    {\n      address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n      abi,\n      functionName: 'approve',\n      args: [\n        '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC', \n        100n\n      ],\n    },\n    {\n      address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n      abi,\n      functionName: 'transferFrom',\n      args: [\n        '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n        '0x0000000000000000000000000000000000000000',\n        100n\n      ],\n    },\n  ],\n  chainId: 10, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### connector\n\n`Connector | undefined`\n\nConnector to get send the calls with.\n\n::: code-group\n```ts [index.ts]\nimport { parseAbi } from 'viem'\nimport { getConnections } from '@wagmi/core'\nimport { writeContracts } from '@wagmi/core/experimental'\nimport { config } from './config'\n\nconst abi = parseAbi([\n  'function approve(address, uint256) returns (bool)',\n  'function transferFrom(address, address, uint256) returns (bool)',\n])\n\nconst connections = getConnections(config)\nconst id = await writeContracts(config, {\n  contracts: [\n    {\n      address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n      abi,\n      functionName: 'approve',\n      args: [\n        '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC', \n        100n\n      ],\n    },\n    {\n      address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n      abi,\n      functionName: 'transferFrom',\n      args: [\n        '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n        '0x0000000000000000000000000000000000000000',\n        100n\n      ],\n    },\n  ],\n  connector: connections[0]?.connector, // [!code focus]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type WriteContractsReturnType } from '@wagmi/core/experimental'\n```\n\n`{ id: string; capabilities?: WalletCapabilities | undefined }`\n\nIdentifier of the call batch.\n\n## Error\n\n```ts\nimport { type WriteContractsErrorType } from '@wagmi/core/experimental'\n```\n\n<!--@include: @shared/query-imports.md-->\n\n## Viem\n\n- [`writeContracts`](https://viem.sh/experimental/eip5792/writeContracts)\n"
  },
  {
    "path": "site/core/api/actions.md",
    "content": "<script setup>\nimport { getSidebar } from '../../.vitepress/sidebar'\n\nconst actions = getSidebar()['/core']\n  .find(x => x.text.includes('Actions')).items\n  .sort((a, b) => a.text.localeCompare(b.text))\n</script>\n\n# Actions\n\nActions for accounts, wallets, contracts, transactions, signing, ENS, and more.\n\n## Import\n\n```ts\nimport { getConnection } from '@wagmi/core'\n```\n\n## Available Actions\n\n<ul>\n  <li v-for=\"action of actions\">\n    <a :href=\"action.link\">{{ action.text }}</a>\n  </li>\n</ul>\n"
  },
  {
    "path": "site/core/api/chains.md",
    "content": "<script setup>\nimport packageJson from '../../../package.json'\nimport SearchChains from '../../components/SearchChains.vue'\n\nconst viemVersion = packageJson.devDependencies.viem\n</script>\n\n# Chains\n\n## Import\n\nImport via the `'@wagmi/core/chains'` entrypoint (proxies all chains from `'viem/chains'`).\n\n```ts\nimport { mainnet } from '@wagmi/core/chains'\n```\n\n## Available Chains\n\nChain definitions as of `viem@{{viemVersion}}`. For `viem@latest`, visit the [Viem repo](https://github.com/wevm/viem/blob/main/src/chains/index.ts).\n\n<SearchChains />\n\n<!--@include: @shared/create-chain.md-->\n"
  },
  {
    "path": "site/core/api/connectors/baseAccount.md",
    "content": "---\ntitle: baseAccount\n---\n\n<script setup>\nimport PackageMetadata from '../../../components/PackageMetadata.vue'\nimport packageJson from '../../../../packages/connectors/package.json'\n\nconst packageName = '@wagmi/core'\nconst connectorsPackageName = '@wagmi/connectors'\nconst connectorDependencyVersion = packageJson.peerDependencies['@base-org/account']\n</script>\n\n<!-- @include: @shared/connectors/baseAccount.md -->\n"
  },
  {
    "path": "site/core/api/connectors/coinbaseWallet.md",
    "content": "<script setup>\nimport PackageMetadata from '../../../components/PackageMetadata.vue'\nimport packageJson from '../../../../packages/connectors/package.json'\n\nconst packageName = '@wagmi/core'\nconst connectorsPackageName = '@wagmi/connectors'\nconst connectorDependencyVersion = packageJson.peerDependencies['@coinbase/wallet-sdk']\n</script>\n\n<!-- @include: @shared/connectors/coinbaseWallet.md -->\n"
  },
  {
    "path": "site/core/api/connectors/injected.md",
    "content": "---\ntitle: injected\n---\n\n<script setup>\nconst docsPath = 'core'\nconst packageName = '@wagmi/core'\nconst connectorsPackageName = '@wagmi/connectors'\n</script>\n\n<!-- @include: @shared/connectors/injected.md -->\n"
  },
  {
    "path": "site/core/api/connectors/metaMask.md",
    "content": "---\ntitle: metaMask\n---\n\n<script setup>\nimport PackageMetadata from '../../../components/PackageMetadata.vue'\nimport packageJson from '../../../../packages/connectors/package.json'\n\nconst docsPath = 'core'\nconst packageName = '@wagmi/core'\nconst connectorsPackageName = '@wagmi/connectors'\nconst connectorDependencyVersion = packageJson.peerDependencies['@metamask/connect-evm']\n</script>\n\n<!-- @include: @shared/connectors/metaMask.md -->\n"
  },
  {
    "path": "site/core/api/connectors/mock.md",
    "content": "---\ntitle: mock\n---\n\n<script setup>\nconst packageName = '@wagmi/core'\nconst connectorsPackageName = '@wagmi/connectors'\n</script>\n\n<!-- @include: @shared/connectors/mock.md -->\n"
  },
  {
    "path": "site/core/api/connectors/porto.md",
    "content": "---\ntitle: porto\n---\n\n<script setup>\nimport PackageMetadata from '../../../components/PackageMetadata.vue'\nimport packageJson from '../../../../packages/connectors/package.json'\n\nconst packageName = '@wagmi/core'\nconst connectorsPackageName = '@wagmi/connectors'\nconst connectorDependencyVersion = packageJson.peerDependencies['porto']\n</script>\n\n<!-- @include: @shared/connectors/porto.md -->\n"
  },
  {
    "path": "site/core/api/connectors/safe.md",
    "content": "---\ntitle: safe\n---\n\n<script setup>\nimport PackageMetadata from '../../../components/PackageMetadata.vue'\nimport packageJson from '../../../../packages/connectors/package.json'\n\nconst packageName = '@wagmi/core'\nconst connectorsPackageName = '@wagmi/connectors'\nconst connectorDependencyVersions = [\n  packageJson.peerDependencies['@safe-global/safe-apps-provider'],\n  packageJson.peerDependencies['@safe-global/safe-apps-sdk'],\n]\n</script>\n\n<!-- @include: @shared/connectors/safe.md -->\n"
  },
  {
    "path": "site/core/api/connectors/walletConnect.md",
    "content": "---\ntitle: walletConnect\n---\n\n<script setup>\nimport PackageMetadata from '../../../components/PackageMetadata.vue'\nimport packageJson from '../../../../packages/connectors/package.json'\n\nconst packageName = '@wagmi/core'\nconst connectorsPackageName = '@wagmi/connectors'\nconst connectorDependencyVersion = packageJson.peerDependencies['@walletconnect/ethereum-provider']\n</script>\n\n<!-- @include: @shared/connectors/walletConnect.md -->\n"
  },
  {
    "path": "site/core/api/connectors.md",
    "content": "<script setup>\nimport { getSidebar } from '../../.vitepress/sidebar'\n\nconst connectors = getSidebar()['/core']\n  .find(x => x.text.includes('Configuration')).items\n  .find(x => x.text.includes('Connectors')).items\n  .sort((a, b) => a.text.localeCompare(b.text))\n</script>\n\n# Connectors\n\nConnectors for popular wallet providers and protocols.\n\n## Import\n\nAvailable via the `'@wagmi/connectors'` package.\n\n```ts\nimport { injected } from '@wagmi/connectors'\n```\n\n## Built-In Connectors\n\n::: tip\nSome connectors require third-party packages. See the \"Install\" section on each connector's page for more info on license, version, and more.\n:::\n\n<ul>\n  <li v-for=\"connector of connectors\">\n    <a :href=\"connector.link\">{{ connector.text }}</a>\n  </li>\n</ul>\n"
  },
  {
    "path": "site/core/api/createConfig.md",
    "content": "---\ntitle: createConfig\n---\n\n<script setup>\nconst docsPath = 'core'\nconst packageName = '@wagmi/core'\nconst connectorsPackageName = '@wagmi/connectors'\n</script>\n\n<!--@include: @shared/createConfig.md-->\n"
  },
  {
    "path": "site/core/api/createConnector.md",
    "content": "# createConnector\n\nCreates new [`CreateConnectorFn`](#parameters).\n\n## Import\n\n```ts\nimport { createConnector } from '@wagmi/core'\n```\n\n## Usage\n\n```ts\nimport { createConnector } from '@wagmi/core'\n\nexport type InjectedParameters = {}\n\nexport function injected(parameters: InjectedParameters = {}) {\n  return createConnector((config) => ({\n    // ...\n  }))\n}\n```\n\n## Parameters\n\n```ts\nimport { type CreateConnectorFn } from '@wagmi/core'\n```\n\nRead [Creating Connectors](/dev/creating-connectors) for more info on the `CreateConnectorFn` type."
  },
  {
    "path": "site/core/api/createStorage.md",
    "content": "---\ntitle: createStorage\n---\n\n<script setup>\nconst docsPath = \"core\"\nconst packageName = '@wagmi/core'\n</script>\n\n<!--@include: @shared/createStorage.md-->\n"
  },
  {
    "path": "site/core/api/errors.md",
    "content": "<script setup>\nconst docsPath = \"core\"\nconst packageName = '@wagmi/core'\n</script>\n\n# Errors\n\nError classes used by Wagmi.\n\n<!--@include: @shared/errors.md-->\n\n"
  },
  {
    "path": "site/core/api/transports/custom.md",
    "content": "---\ntitle: custom\n---\n\n<script setup>\nconst packageName = '@wagmi/core'\n</script>\n\n<!-- @include: @shared/transports/custom.md -->\n"
  },
  {
    "path": "site/core/api/transports/fallback.md",
    "content": "---\ntitle: fallback\n---\n\n<script setup>\nconst packageName = '@wagmi/core'\n</script>\n\n<!-- @include: @shared/transports/fallback.md -->\n"
  },
  {
    "path": "site/core/api/transports/http.md",
    "content": "---\ntitle: http\n---\n\n<script setup>\nconst packageName = '@wagmi/core'\n</script>\n\n<!-- @include: @shared/transports/http.md -->\n"
  },
  {
    "path": "site/core/api/transports/unstable_connector.md",
    "content": "---\ntitle: unstable_connector\n---\n\n<script setup>\nconst docsPath = 'core'\nconst packageName = '@wagmi/core'\n</script>\n\n<!-- @include: @shared/transports/unstable_connector.md -->\n"
  },
  {
    "path": "site/core/api/transports/webSocket.md",
    "content": "---\ntitle: webSocket\n---\n\n<script setup>\nconst packageName = '@wagmi/core'\n</script>\n\n<!-- @include: @shared/transports/webSocket.md -->\n"
  },
  {
    "path": "site/core/api/transports.md",
    "content": "<script setup>\nimport { getSidebar } from '../../.vitepress/sidebar'\n\nconst transports = getSidebar()['/core']\n  .find(x => x.text.includes('Configuration')).items\n  .find(x => x.text.includes('Transports')).items\n  .sort((a, b) => a.text.localeCompare(b.text))\n</script>\n\n# Transports\n\n[`createConfig`](/core/api/createConfig) can be instantiated with a set of Transports for each chain. A Transport is the intermediary layer that is responsible for executing outgoing JSON-RPC requests to the RPC Provider (e.g. Alchemy, Infura, etc).\n\n## Import\n\n```ts\nimport { http } from '@wagmi/core'\n```\n\n## Built-In Transports\n\nAvailable via the `'@wagmi/core'` entrypoint.\n\n<ul>\n  <li v-for=\"transport of transports\">\n    <a :href=\"transport.link\">{{ transport.text }}</a>\n  </li>\n</ul>\n"
  },
  {
    "path": "site/core/api/utilities/cookieToInitialState.md",
    "content": "---\ntitle: cookieToInitialState\n---\n\n<script setup>\nconst packageName = '@wagmi/core'\n</script>\n\n<!--@include: @shared/utilities/cookieToInitialState.md-->\n"
  },
  {
    "path": "site/core/api/utilities/deserialize.md",
    "content": "---\ntitle: deserialize\n---\n\n<script setup>\nconst packageName = '@wagmi/core'\n</script>\n\n<!--@include: @shared/utilities/deserialize.md-->\n"
  },
  {
    "path": "site/core/api/utilities/serialize.md",
    "content": "---\ntitle: serialize\n---\n\n<script setup>\nconst packageName = '@wagmi/core'\n</script>\n\n<!--@include: @shared/utilities/serialize.md-->\n"
  },
  {
    "path": "site/core/getting-started.md",
    "content": "<script setup>\nimport packageJson from '../../packages/core/package.json'\n\nconst viemVersion = packageJson.peerDependencies.viem\n</script>\n\n# Getting Started\n\n## Overview\n\nWagmi Core is a VanillaJS library for Ethereum. You can learn more about the rationale behind the project in the [Why Wagmi](/core/why) section.\n\n## Manual Installation\n\nTo manually add Wagmi to your project, install the required packages.\n\n::: code-group\n```bash-vue [pnpm]\npnpm add @wagmi/core @wagmi/connectors viem@{{viemVersion}}\n```\n\n```bash-vue [npm]\nnpm install @wagmi/core @wagmi/connectors viem@{{viemVersion}}\n```\n\n```bash-vue [yarn]\nyarn add @wagmi/core @wagmi/connectors viem@{{viemVersion}}\n```\n\n```bash-vue [bun]\nbun add @wagmi/core @wagmi/connectors viem@{{viemVersion}}\n```\n:::\n\n- [Wagmi Connectors](/core/api/connectors) is a collection of interfaces for linking accounts/wallets to Wagmi.\n- [Viem](https://viem.sh) is a TypeScript interface for Ethereum that performs blockchain operations.\n- [TypeScript](/react/typescript) is optional, but highly recommended. Learn more about [TypeScript support](/core/typescript).\n\n### Create Config\n\nCreate and export a new Wagmi config using `createConfig`.\n\n::: code-group\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\nIn this example, Wagmi is configured to use the Mainnet and Sepolia chains. Check out the [`createConfig` docs](/core/api/createConfig) for more configuration options.\n\n### Use Wagmi\n\nNow that everything is set up, you can pass the `config` to use actions.\n\n::: code-group\n```tsx [index.ts]\nimport { getConnection, getEnsName } from '@wagmi/core'\nimport { config } from './config'\n\nconst { address } = getConnection(config)\nconst ensName = await getEnsName(config, { address })\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Next Steps\n\nFor more information on what to do next, check out the following topics.\n\n- [**TypeScript**](/core/typescript) Learn how to get the most out of Wagmi's type-safety and inference for an enlightened developer experience.\n- [**Actions**](/core/api/actions) Browse the collection of actions and learn how to use them.\n- [**Framework Adapters**](/core/guides/framework-adapters) Learn how to create a Wagmi-like adapter for your favorite framework.\n- [**Viem docs**](https://viem.sh) Wagmi Core is a wrapper around Viem that manages account and client reactivity. Learn more about Viem and how to use it.\n"
  },
  {
    "path": "site/core/guides/chain-properties.md",
    "content": "# Chain Properties\n\nSome chains support additional properties related to blocks and transactions. This is powered by Viem's [formatters](https://viem.sh/docs/chains/formatters) and [serializers](https://viem.sh/docs/chains/serializers). For example, Celo, ZkSync, OP Stack chains support all additional properties. In order to use these properties in a type-safe way, there are a few things you should be aware of.\n\n## Narrowing Parameters\n\nWhen you pass your `config` to an action, you are ready to access chain-specific properties! For example, Celo's `feeCurrency` is available.\n\n::: code-group\n```ts [index.ts]\nimport { parseEther } from 'viem'\nimport { simulateContract } from '@wagmi/core'\nimport { config } from './config'\n\nconst result = await simulateContract(config, {\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n  feeCurrency: '0x…', // [!code focus]\n})\n```\n<<< @/snippets/core/config-chain-properties.ts[config.ts]\n:::\n\nThis is great, but if you have multiple chains that support additional properties, your autocomplete could be overwhelmed with all of them. By setting the `chainId` property to a specific value (e.g. `celo.id`), you can narrow parameters to a single chain.\n\n::: code-group\n```ts [index.ts]\nimport { parseEther } from 'viem'\nimport { simulateContract } from '@wagmi/core'\nimport { celo } from 'wagmi/chains'\n\nconst result = await simulateContract({\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n  chainId: celo.id, // [!code focus]\n  feeCurrency: '0x…', // [!code focus]\n  // ^? (property) feeCurrency?: `0x${string}` | undefined // [!code focus]\n})\n```\n<<< @/snippets/core/config-chain-properties.ts[config.ts]\n:::\n\n## Narrowing Return Types\n\nReturn types can also have chain-specific properties attached to them. There are a couple approaches for extracting these properties.\n\n### `chainId` Parameter\n\nNot only can you use the `chainId` parameter to [narrow parameters](#narrowing-parameters), you can also use it to narrow the return type.\n\n::: code-group\n```ts [index.tsx]\nimport { waitForTransactionReceipt } from '@wagmi/core'\nimport { zkSync } from '@wagmi/core/chains'\n\nconst result = await waitForTransactionReceipt({\n  chainId: zkSync.id,\n  hash: '0x16854fcdd0219cacf5aec5e4eb2154dac9e406578a1510a6fc48bd0b67e69ea9',\n})\n\nresult.logs\n//     ^? (property) logs: ZkSyncLog[] | undefined\n```\n<<< @/snippets/core/config-chain-properties.ts[config.ts]\n:::\n\n### `chainId` Data Property\n\nWagmi internally will set a `chainId` property on return types that you can use to narrow results. The `chainId` is determined from the `chainId` parameter or global state (e.g. connector). You can use this property to help TypeScript narrow the type.\n\n::: code-group\n```ts [index.tsx]\nimport { waitForTransactionReceipt } from '@wagmi/core'\nimport { zkSync } from '@wagmi/core/chains'\n\nconst result = await waitForTransactionReceipt({\n  hash: '0x16854fcdd0219cacf5aec5e4eb2154dac9e406578a1510a6fc48bd0b67e69ea9',\n})\n\nif (result.chainId === zkSync.id) {\n  result.logs\n  //     ^? (property) logs: ZkSyncLog[] | undefined\n}\n```\n<<< @/snippets/core/config-chain-properties.ts[config.ts]\n:::\n\n## Troubleshooting\n\nIf chain properties aren't working, make sure [TypeScript](/core/guides/faq#type-inference-doesn-t-work) is configured correctly. Not all chains have additional properties, to check which ones do, see the [Viem repo](https://github.com/wevm/viem/tree/main/src/chains) (chains that have a top-level directory under [`src/chains`](https://github.com/wevm/viem/tree/main/src/chains) support additional properties).\n\n"
  },
  {
    "path": "site/core/guides/error-handling.md",
    "content": "# Error Handling\n\nEvery module in Wagmi Core exports an accompanying error type which you can use to strongly type your `catch` statements.\n\nThese types come in the form of `<Module>ErrorType`. For example, the `getBlockNumber` action exports a `GetBlockNumberErrorType` type.\n\nUnfortunately, [TypeScript doesn't have an abstraction for typed exceptions](https://github.com/microsoft/TypeScript/issues/13219), so the most pragmatic & vanilla approach would be to explicitly cast error types in the `catch` statement.\n\n::: code-group\n```tsx [index.tsx]\nimport { type GetBlockNumberErrorType, getBlockNumber } from '@wagmi/core'\nimport { config } from './config'\n\ntry {\n  const blockNumber = await getBlockNumber(config)\n} catch (e) {\n  const error = e as GetBlockNumberErrorType\n  error.name\n  //    ^? (property) name: \"Error\" | \"ChainDisconnectedError\" | \"HttpRequestError\" | \"InternalRpcError\" | \"InvalidInputRpcError\" | \"InvalidParamsRpcError\" | \"InvalidRequestRpcError\" | \"JsonRpcVersionUnsupportedError\" | ... 16 more ... | \"WebSocketRequestError\"\n\n  if (error.name === 'InternalRpcError')\n    error.code\n    //    ^? (property) code: -32603\n\n  if (error.name === 'HttpRequestError')\n    error.headers\n    //    ^? (property) headers: Headers\n    error.status\n    //    ^? (property) status: number\n}\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n::: tip\nIf you are using [Wagmi Hooks](/react/api/hooks), errors are [already strongly typed](/react/guides/error-handling) via the `error` property.\n:::"
  },
  {
    "path": "site/core/guides/ethers.md",
    "content": "# Ethers.js Adapters\n\nIt is recommended for projects to migrate to [Viem](https://viem.sh) when using Wagmi, but there are some cases where you might still need to use [Ethers.js](https://ethers.org) in your project:\n\n- You may want to **incrementally migrate** Ethers.js usage to Viem\n- Some **third-party libraries & SDKs** may only support Ethers.js\n- Personal preference\n\nWe have provided reference implementations for Viem → Ethers.js adapters that you can copy + paste in your project.\n\n## Client → Provider\n\n### Reference Implementation\n\nCopy the following reference implementation into a file of your choice:\n\n::: code-group\n\n```ts [Ethers v5]\nimport { type Config, getClient } from '@wagmi/core'\nimport { providers } from 'ethers'\nimport type { Client, Chain, Transport } from 'viem'\n\nexport function clientToProvider(client: Client<Transport, Chain>) {\n  const { chain, transport } = client\n  const network = {\n    chainId: chain.id,\n    name: chain.name,\n    ensAddress: chain.contracts?.ensRegistry?.address,\n  }\n  if (transport.type === 'fallback')\n    return new providers.FallbackProvider(\n      (transport.transports as ReturnType<Transport>[]).map(\n        ({ value }) => new providers.JsonRpcProvider(value?.url, network),\n      ),\n    )\n  return new providers.JsonRpcProvider(transport.url, network)\n}\n\n/** Action to convert a viem Public Client to an ethers.js Provider. */\nexport function getEthersProvider(\n  config: Config,\n  { chainId }: { chainId?: number } = {},\n) {\n  const client = getClient(config, { chainId })\n  if (!client) return\n  return clientToProvider(client)\n}\n```\n\n```ts [Ethers v6]\nimport { type Config, getClient } from '@wagmi/core'\nimport { FallbackProvider, JsonRpcProvider } from 'ethers'\nimport type { Client, Chain, Transport } from 'viem'\n\nexport function clientToProvider(client: Client<Transport, Chain>) {\n  const { chain, transport } = client\n  const network = {\n    chainId: chain.id,\n    name: chain.name,\n    ensAddress: chain.contracts?.ensRegistry?.address,\n  }\n  if (transport.type === 'fallback') {\n    const providers = (transport.transports as ReturnType<Transport>[]).map(\n      ({ value }) => new JsonRpcProvider(value?.url, network),\n    )\n    if (providers.length === 1) return providers[0]\n    return new FallbackProvider(providers)\n  }\n  return new JsonRpcProvider(transport.url, network)\n}\n\n/** Action to convert a viem Client to an ethers.js Provider. */\nexport function getEthersProvider(\n  config: Config,\n  { chainId }: { chainId?: number } = {},\n) {\n  const client = getClient(config, { chainId })\n  if (!client) return\n  return clientToProvider(client)\n}\n```\n\n:::\n\n### Usage\n\nNow you can use the `getEthersProvider` function in your components:\n\n::: code-group\n\n```ts [example.ts]\nimport { getEthersProvider } from './ethers'\nimport { config } from './config'\n\nfunction example() {\n  const provider = getEthersProvider(config)\n  ...\n}\n```\n\n```ts [ethers.ts (Ethers v5)]\nimport { type Config, getClient } from '@wagmi/core'\nimport { providers } from 'ethers'\nimport type { Client, Chain, Transport } from 'viem'\n\nexport function clientToProvider(client: Client<Transport, Chain>) {\n  const { chain, transport } = client\n  const network = {\n    chainId: chain.id,\n    name: chain.name,\n    ensAddress: chain.contracts?.ensRegistry?.address,\n  }\n  if (transport.type === 'fallback')\n    return new providers.FallbackProvider(\n      (transport.transports as ReturnType<Transport>[]).map(\n        ({ value }) => new providers.JsonRpcProvider(value?.url, network),\n      ),\n    )\n  return new providers.JsonRpcProvider(transport.url, network)\n}\n\n/** Action to convert a viem Public Client to an ethers.js Provider. */\nexport function getEthersProvider(\n  config: Config,\n  { chainId }: { chainId?: number } = {},\n) {\n  const client = getClient(config, { chainId })\n  if (!client) return\n  return clientToProvider(client)\n}\n\n```\n\n```ts [ethers.ts (Ethers v6)]\nimport { type Config, getClient } from '@wagmi/core'\nimport { FallbackProvider, JsonRpcProvider } from 'ethers'\nimport type { Client, Chain, Transport } from 'viem'\n\nexport function clientToProvider(client: Client<Transport, Chain>) {\n  const { chain, transport } = client\n  const network = {\n    chainId: chain.id,\n    name: chain.name,\n    ensAddress: chain.contracts?.ensRegistry?.address,\n  }\n  if (transport.type === 'fallback') {\n    const providers = (transport.transports as ReturnType<Transport>[]).map(\n      ({ value }) => new JsonRpcProvider(value?.url, network),\n    )\n    if (providers.length === 1) return providers[0]\n    return new FallbackProvider(providers)\n  }\n  return new JsonRpcProvider(transport.url, network)\n}\n\n/** Action to convert a viem Client to an ethers.js Provider. */\nexport function getEthersProvider(\n  config: Config,\n  { chainId }: { chainId?: number } = {},\n) {\n  const client = getClient(config, { chainId })\n  if (!client) return\n  return clientToProvider(client)\n}\n```\n\n:::\n\n## Connector Client → Signer\n\n### Reference Implementation\n\nCopy the following reference implementation into a file of your choice:\n\n::: code-group\n\n```ts [Ethers v5]\nimport { Config, getConnectorClient } from '@wagmi/core'\nimport { providers } from 'ethers'\nimport type { Account, Chain, Client, Transport } from 'viem'\n\nexport function clientToSigner(client: Client<Transport, Chain, Account>) {\n  const { account, chain, transport } = client\n  const network = {\n    chainId: chain.id,\n    name: chain.name,\n    ensAddress: chain.contracts?.ensRegistry?.address,\n  }\n  const provider = new providers.Web3Provider(transport, network)\n  const signer = provider.getSigner(account.address)\n  return signer\n}\n\n/** Action to convert a Viem Client to an ethers.js Signer. */\nexport async function getEthersSigner(\n  config: Config,\n  { chainId }: { chainId?: number } = {},\n) {\n  const client = await getConnectorClient(config, { chainId })\n  return clientToSigner(client)\n}\n```\n\n```ts [Ethers v6]\nimport { Config, getConnectorClient } from '@wagmi/core'\nimport { BrowserProvider, JsonRpcSigner } from 'ethers'\nimport type { Account, Chain, Client, Transport } from 'viem'\n\nexport function clientToSigner(client: Client<Transport, Chain, Account>) {\n  const { account, chain, transport } = client\n  const network = {\n    chainId: chain.id,\n    name: chain.name,\n    ensAddress: chain.contracts?.ensRegistry?.address,\n  }\n  const provider = new BrowserProvider(transport, network)\n  const signer = new JsonRpcSigner(provider, account.address)\n  return signer\n}\n\n/** Action to convert a viem Wallet Client to an ethers.js Signer. */\nexport async function getEthersSigner(\n  config: Config,\n  { chainId }: { chainId?: number } = {},\n) {\n  const client = await getConnectorClient(config, { chainId })\n  return clientToSigner(client)\n}\n\n```\n\n:::\n\n### Usage\n\nNow you can use the `getEthersSigner` function in your components:\n\n::: code-group\n\n```ts [example.ts]\nimport { getEthersSigner } from './ethers'\nimport { config } from './config'\n\nfunction example() {\n  const provider = getEthersSigner(config)\n  ...\n}\n```\n\n```ts [ethers.ts (Ethers v5)]\nimport { Config, getConnectorClient } from '@wagmi/core'\nimport { providers } from 'ethers'\nimport type { Account, Chain, Client, Transport } from 'viem'\n\nexport function clientToSigner(client: Client<Transport, Chain, Account>) {\n  const { account, chain, transport } = client\n  const network = {\n    chainId: chain.id,\n    name: chain.name,\n    ensAddress: chain.contracts?.ensRegistry?.address,\n  }\n  const provider = new providers.Web3Provider(transport, network)\n  const signer = provider.getSigner(account.address)\n  return signer\n}\n\n/** Action to convert a Viem Client to an ethers.js Signer. */\nexport async function getEthersSigner(\n  config: Config,\n  { chainId }: { chainId?: number } = {},\n) {\n  const client = await getConnectorClient(config, { chainId })\n  return clientToSigner(client)\n}\n```\n\n```ts [ethers.ts (Ethers v6)]\nimport { Config, getConnectorClient } from '@wagmi/core'\nimport { BrowserProvider, JsonRpcSigner } from 'ethers'\nimport type { Account, Chain, Client, Transport } from 'viem'\n\nexport function clientToSigner(client: Client<Transport, Chain, Account>) {\n  const { account, chain, transport } = client\n  const network = {\n    chainId: chain.id,\n    name: chain.name,\n    ensAddress: chain.contracts?.ensRegistry?.address,\n  }\n  const provider = new BrowserProvider(transport, network)\n  const signer = new JsonRpcSigner(provider, account.address)\n  return signer\n}\n\n/** Action to convert a viem Wallet Client to an ethers.js Signer. */\nexport async function getEthersSigner(\n  config: Config,\n  { chainId }: { chainId?: number } = {},\n) {\n  const client = await getConnectorClient(config, { chainId })\n  return clientToSigner(client)\n}\n\n```\n\n:::\n"
  },
  {
    "path": "site/core/guides/faq.md",
    "content": "<script setup>\nconst docsPath = 'core'\n</script>\n\n# FAQ / Troubleshooting\n\nCollection of frequently asked questions with ideas on how to troubleshoot and resolve them.\n\n<!--@include: @shared/faq.md-->\n"
  },
  {
    "path": "site/core/guides/framework-adapters.md",
    "content": "# Framework Adapters\n\nFolks often ask if they can use Wagmi with other frameworks, like Svelte, Solid.js, and more.\n\nThe short answer is — you already can! Wagmi Core is pure VanillaJS that you can use with any framework. For some, this answer is (understandably) unsatisfying as they want a tight integration between Wagmi Core and their favorite framework's reactivity system, e.g. what Wagmi is for React and Vue.\n\nSomeday, we would love to support additional frameworks, but unfortunately the core team doesn't have time to build and support them in a high-quality way at the moment. This could change in the future with additional [sponsors](https://github.com/sponsors/wevm), reshuffling of the roadmap, or if someone from the community wants to lead the effort.\n\nIn the meantime, here are some tips on how to create tighter bonds between Wagmi Core and other frameworks.\n\n## Dependency Injection\n\nOnce you create a Wagmi Config, you'll need to make sure your framework has access to it inside your higher-level functions (e.g. hooks for React, composables for Vue). For example, Wagmi uses [React Context](https://react.dev/learn/passing-data-deeply-with-context) to inject the Config into React Hooks and update it if it changes. This makes it so your users don't need to pass a Config object every time they use a hook.\n\n## Reactivity Layer\n\nAll 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.\n\nThe 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.\n\n## TanStack Query\n\nWagmi uses [TanStack Query](https://tanstack.com/query) to enable caching, deduplication, persistence, and more in React and Vue applications. Normally, you would need to find a similar library for your framework, but the good news is TanStack Query supports other frameworks! (Svelte, Solid, and Angular at the time of writing.)\n\nTo get started with your framework, install and set up the related TanStack Query adapter. Next, import query keys/functions and mutation functions from the `'@wagmi/core/query'` entrypoint. You can plug these directly into your framework's TanStack Query adapter functions.\n\nIf you are building a library, you'll also want to make sure that you wire up generics correctly so type-inference and safety work correctly. The best way to make sure you are doing this correctly, is to see how we do this for React with Wagmi by checking out the [source code](https://github.com/wevm/wagmi/tree/main/packages/react/src/hooks).\n\n## Testing\n\nIf you are building a library, you'll want to write tests. Wagmi uses [React Testing Library](https://testing-library.com/docs/react-testing-library/intro) to test hooks. [Testing Library](https://testing-library.com) also supports other frameworks, like Svelte, Solid, and more. You can take a look at how the React tests work and do something similar for your code.\n\n## Proxy Exports\n\nWagmi proxies exports directly from Wagmi Core and [Viem](https://viem.sh) to make importing easier. You'll likely want to imitate this behavior for your framework.\n"
  },
  {
    "path": "site/core/guides/migrate-from-v1-to-v2.md",
    "content": "---\ntitle: Migrate from v1 to v2\ntitleTemplate: Wagmi Core\ndescription: Guide for migrating from Wagmi Core v1 to v2.\n---\n\n<script setup>\nimport packageJson from '../../../packages/core/package.json'\n\nconst viemVersion = packageJson.peerDependencies.viem\n</script>\n\n# Migrate from v1 to v2\n\nWagmi Core v2 redesigns the core APIs to mesh better with [Viem](https://viem.sh). This major version transforms Wagmi into a light wrapper around Viem, sprinkling in multichain support and account management. As such, there are some breaking changes and deprecations to be aware of outlined in this guide.\n\nTo get started, install the latest version of Wagmi and it's required peer dependencies.\n\n::: code-group\n```bash-vue [pnpm]\npnpm add @wagmi/core viem@{{viemVersion}} @wagmi/connectors\n```\n\n```bash-vue [npm]\nnpm install @wagmi/core viem@{{viemVersion}} @wagmi/connectors\n```\n\n```bash-vue [yarn]\nyarn add @wagmi/core viem@{{viemVersion}} @wagmi/connectors\n```\n\n```bash-vue [bun]\nbun add @wagmi/core viem@{{viemVersion}} @wagmi/connectors\n```\n:::\n\n::: info Wagmi Core v2 should be the last major version that will have this many actionable breaking changes. \nMoving forward, new functionality will be opt-in with old functionality being deprecated alongside the new features. This means upgrading to the latest major versions will not require immediate changes.\n:::\n\n::: info Not ready to migrate yet?\nThe Wagmi Core v1 docs are still available at [1.x.wagmi.sh/core](https://1.x.wagmi.sh/core).\n:::\n\n## Dependencies\n\n### Dropped CommonJS support\n\nWagmi v2 no longer publishes a separate `cjs` tag since very few people use this tag and ESM is the future. See [Sindre Sorhus' guide](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c) for more info about switching to ESM.\n\n## Actions\n\n### Removed `config` singleton\n\nBefore v2, when you called [`createConfig`](/core/api/createConfig), it set a global `config` singleton that was used internally by actions. For v2, `config` is now a required first parameter for actions.\n\n::: code-group\n```ts [index.ts]\nimport { getAccount, readContract } from '@wagmi/core'\nimport { parseAbi } from 'viem'\nimport { config } from './config' // [!code ++]\n\nconst account = getAccount() // [!code --]\nconst account = getAccount(config) // [!code ++]\n\nconst balanceOf = readContract({ // [!code --]\nconst balanceOf = readContract(config, { // [!code ++]\n  address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n  abi: parseAbi(['function balanceOf(address) view returns (uint256)']),\n  functionName: 'balanceOf',\n  args: ['0xd2135CfB216b74109775236E36d4b433F1DF507B'],\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\nThe previous global `config` singleton made it so you couldn't use multiple `Config` objects in the same project. In addition, we think passing `config` is more explicit and makes it easier to understand what's going on. Finally, types can be inferred directly from the `config`, like [chain properties](/core/guides/chain-properties) and more.\n\n### Removed `getContract`\n\nRemoved `getContract` export. Use Viem's [`getContract`](https://viem.sh/docs/contract/getContract) instead.\n\n```ts\nimport { getContract } from '@wagmi/core' // [!code --]\nimport { getContract } from 'viem' // [!code ++]\n\nconst contract = getContract() // [!code --]\nconst contract = getContract() // [!code ++]\n```\n\n### Removed `getNetwork` and `watchNetwork`\n\nThe `getNetwork` and `watchNetwork` actions were removed since the connected chain is typically based on the connected account.\n\n- Use [`config.chains`](/core/api/createConfig#chains-1) instead to get `chains`.\n\n::: code-group\n```ts [index.ts]\nimport { getNetwork } from '@wagmi/core' // [!code --]\n\nconst { chains } = getNetwork() // [!code --]\nconst chains = config.chains // [!code ++]\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n- Use [`getAccount`](/core/api/actions/getConnection) and `config.chains` instead to get `chain`.\n\n::: code-group\n```ts [index.ts]\nimport { getNetwork } from '@wagmi/core' // [!code --]\nimport { getAccount } from '@wagmi/core' // [!code ++]\nimport { config } from './config' // [!code ++]\n\nconst { chain } = getNetwork() // [!code --]\nconst { chainId } = getAccount(config) // [!code ++]\nconst chain = chains.find(chain => chain.id === chainId) // [!code ++]\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n  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.\n\n- Use `watchAccount` instead of `watchNetwork`.\n\n::: code-group\n```ts [index.ts]\nimport { watchNetwork } from '@wagmi/core' // [!code --]\nimport { watchAccount } from '@wagmi/core' // [!code ++]\nimport { config } from './config' // [!code ++]\n\nconst unwatch = watchNetwork((data) => console.log('Changed!', data)) // [!code --]\nconst unwatch = watchAccount(config, { // [!code ++]\nonChange(data) { // [!code ++]\n    const chains = config.chains // [!code ++]\n    const chain = chains.find(chain => chain.id === data.chainId) // [!code ++]\n}, // [!code ++]\n}) // [!code ++]\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### Removed `getWebSocketPublicClient` and `watchWebSocketPublicClient`\n\nViem [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.\n\nAlternatively, 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.\n\n### Removed `watchReadContract`, `watchReadContracts`, and `watchReadMulticall`\n\nUse [`watchBlockNumber`](/core/api/actions/watchBlockNumber) along with [`readContract`](/core/api/actions/readContract), [`readContracts`](/core/api/actions/readContracts), and [`multicall`](/core/api/actions/multicall) actions instead. Before v2, `watchReadContract`, `watchReadContracts`, and `watchReadMulticall` were all wrappers around `watchBlockNumber` and this simplifies the API.\n\n::: code-group\n```ts [index.ts]\nimport { watchReadContract } from '@wagmi/core' // [!code --]\nimport { watchBlockNumber, readContract } from '@wagmi/core' // [!code ++]\nimport { config } from './config' // [!code ++]\n\nconst unwatch = watchReadContract( // [!code --]\n  { // [!code --]\n    address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', // [!code --]\n    abi: parseAbi(['function balanceOf(address) view returns (uint256)']), // [!code --]\n    functionName: 'balanceOf', // [!code --]\n    args: ['0xd2135CfB216b74109775236E36d4b433F1DF507B'], // [!code --]\n  }, // [!code --]\n  (result) => console.log('Changed!', result), // [!code --]\n) // [!code --]\nconst unwatch = watchBlockNumber(config, { // [!code ++]\n  onBlockNumber() { // [!code ++]\n    const balanceOf = readContract(config, { // [!code ++]\n      address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', // [!code ++]\n      abi: parseAbi(['function balanceOf(address) view returns (uint256)']), // [!code ++]\n      functionName: 'balanceOf', // [!code ++]\n      args: ['0xd2135CfB216b74109775236E36d4b433F1DF507B'], // [!code ++]\n    }) // [!code ++]\n    console.log('Changed!', balanceOf)// [!code ++]\n  }, // [!code ++]\n}) // [!code ++]\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### Removed `fetchFeeData`\n\nRemoved `fetchFeeData`. Use [`estimateFeesPerGas`](/core/api/actions/estimateFeesPerGas) instead.\n\n::: code-group\n```ts [index.ts]\nimport { fetchFeeData } from '@wagmi/core' // [!code --]\nimport { estimateFeesPerGas } from '@wagmi/core' // [!code ++]\nimport { config } from './config' // [!code ++]\n\nconst result = await fetchFeeData() // [!code --]\nconst result = await estimateFeesPerGas(config) // [!code ++]\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### Removed `prepareWriteContract`\n\nRemoved `prepareWriteContract`. Use [`simulateContract`](/core/api/actions/simulateContract) instead.\n\n::: code-group\n```ts [index.ts]\nimport { prepareWriteContract } from '@wagmi/core' // [!code --]\nimport { simulateContract } from '@wagmi/core' // [!code ++]\nimport { config } from './config' // [!code ++]\n\nconst result = await prepareWriteContract({ ... }) // [!code --]\nconst result = await simulateContract(config, { ... }) // [!code ++]\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### Removed `prepareSendTransaction`\n\nRemoved `prepareSendTransaction`. Use [`estimateGas`](/core/api/actions/estimateGas) instead.\n\n::: code-group\n```ts [index.ts]\nimport { prepareSendTransaction } from '@wagmi/core' // [!code --]\nimport { estimateGas } from '@wagmi/core' // [!code ++]\nimport { config } from './config' // [!code ++]\n\nconst result = await prepareSendTransaction({ ... }) // [!code --]\nconst result = await estimateGas(config, { ... }) // [!code ++]\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### Updated `sendTransaction` and `writeContract` return type\n\nUpdated [`sendTransaction`](/core/api/actions/sendTransaction) and [`writeContract`](/core/api/actions/writeContract) return type from `` { hash: `0x${string}` } `` to `` `0x${string}` ``.\n\n```ts\nconst result = await sendTransaction({ hash: '0x...' })\nresult.hash // [!code --]\nresult // [!code ++]\n```\n\n### Updated `connect` return type\n\nUpdated [`connect`](/core/api/actions/connect) return type from `` { account: Address; chain: { id: number; unsupported?: boolean }; connector: Connector } `` to `` { accounts: readonly Address[]; chainId: number } ``. This better reflects the ability to have multiple accounts per connector.\n\n### Renamed parameters and return types\n\nAll hook parameters and return types follow the naming pattern of `[PascalCaseActionName]Parameters` and `[PascalCaseActionName]ReturnType`. For example, `GetAccountParameters` and `GetAccountReturnType`.\n\n```ts\nimport { GetAccountConfig, GetAccountResult } from '@wagmi/core' // [!code --]\nimport { GetAccountParameters, GetAccountReturnType } from '@wagmi/core' // [!code ++]\n```\n\n## Connectors\n\n### Moved Wagmi Connectors to peer dependencies\n\nWagmi Core v2 no longer exports connectors via the `'@wagmi/core/connectors/*'` entrypoints. Instead, you should install the `@wagmi/connectors` package.\n\n::: code-group\n```bash-vue [pnpm]\npnpm add @wagmi/connectors\n```\n\n```bash-vue [npm]\nnpm install @wagmi/connectors\n```\n\n```bash-vue [yarn]\nyarn add @wagmi/connectors\n```\n\n```bash-vue [bun]\nbun add @wagmi/connectors\n```\n:::\n\nAnd import connectors from there.\n\n```ts\nimport { injected } from '@wagmi/connectors'\n```\n\nSee the [connectors documentation](/core/api/connectors) for more information.\n\n### Updated connector API\n\nIn order to maximize type-safety and ease of creating connectors, the connector API changed. Follow the [Creating Connectors guide](/dev/creating-connectors) for more info on creating new connectors and converting Wagmi v1 connectors.\n\n### Removed individual entrypoints\n\nPreviously, each connector had its own entrypoint to optimize tree-shaking. Since all connectors now have [`package.json#sideEffects`](https://webpack.js.org/guides/tree-shaking/#mark-the-file-as-side-effect-free) enabled, this is no longer necessary and the entrypoint is unified. Use the `'@wagmi/connectors'` package instead.\n\n```ts\nimport { InjectedConnector } from '@wagmi/core/connectors/injected' // [!code --]\nimport { CoinbaseWalletConnector } from '@wagmi/core/connectors/coinbaseWallet' // [!code --]\nimport { coinbaseWallet, injected } from '@wagmi/connectors' // [!code ++]\n```\n\n### Removed `MetaMaskConnector`\n\nThe `MetaMaskConnector` was removed since it was nearly the same thing as the `InjectedConnector`. Use the [`injected`](/core/api/connectors/injected) connector instead, along with the [`target`](/core/api/connectors/injected#target) parameter set to `'metaMask'`, for the same behavior.\n\n```ts\nimport { MetaMaskConnector } from '@wagmi/core/connectors/metaMask' // [!code --]\nimport { injected } from '@wagmi/connectors' // [!code ++]\n\nconst connector = new MetaMaskConnector() // [!code --]\nconst connector = injected({ target: 'metaMask' }) // [!code ++]\n```\n\n### Renamed connectors\n\nIn Wagmi v1, connectors were classes you needed to instantiate. In Wagmi v2, connectors are functions. As a result, the API has changed. Connectors have the following new names:\n\n- `CoinbaseWalletConnector` is now [`coinbaseWallet`](/core/api/connectors/coinbaseWallet).\n- `InjectedConnector` is now [`injected`](/core/api/connectors/injected).\n- `SafeConnector` is now [`safe`](/core/api/connectors/safe).\n- `WalletConnectConnector` is now [`walletConnect`](/core/api/connectors/walletConnect).\n\nTo create a connector, you now call the connector function with parameters.\n\n```ts\nimport { WalletConnectConnector } from '@wagmi/core/connectors/walletConnect' // [!code --]\nimport { walletConnect } from '@wagmi/connectors' // [!code ++]\n\nconst connector = new WalletConnectConnector({ // [!code --]\nconst connector = walletConnect({ // [!code ++]\n  projectId: '3fcc6bba6f1de962d911bb5b5c3dba68',\n})\n```\n\n### Removed `WalletConnectLegacyConnector`\n\nWalletConnect v1 was sunset June 28, 2023. Use the [`walletConnect`](/core/api/connectors/walletConnect) connector instead.\n\n```ts\nimport { WalletConnectLegacyConnector } from '@wagmi/core/connectors/walletConnectLegacy' // [!code --]\nimport { walletConnect } from '@wagmi/connectors' // [!code ++]\n\nconst connector = new WalletConnectLegacyConnector({ // [!code --]\nconst connector = walletConnect({ // [!code ++]\n  projectId: '3fcc6bba6f1de962d911bb5b5c3dba68',\n})\n```\n\n## Chains\n\n### Updated `'@wagmi/core/chains'` entrypoint\n\nChains now live in the [Viem repository](https://github.com/wevm/viem). As a result, the `'@wagmi/core/chains'` entrypoint now proxies all chains from `'viem/chains'` directly.\n\n### Removed `mainnet` and `sepolia` from main entrypoint\n\nSince the `'@wagmi/core/chains'` entrypoint now proxies `'viem/chains'`, `mainnet` and `sepolia` were removed from the main entrypoint. Use the `'@wagmi/core/chains'` entrypoint instead.\n\n```ts\nimport { mainnet, sepolia } from '@wagmi/core' // [!code --]\nimport { mainnet, sepolia } from '@wagmi/core/chains' // [!code ++]\n```\n\n## Errors\n\nA number of errors were renamed to better reflect their functionality or replaced by Viem errors.\n\n## Miscellaneous\n\n### Removed internal ENS normalization\n\nBefore 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).\n\n\n::: code-group\n```ts [index.ts]\nimport { getEnsAddress } from '@wagmi/core'\nimport { normalize } from 'viem' // [!code ++]\nimport { config } from './config'\n\nconst result = await getEnsAddress(config, {\n  name: 'wevm.eth', // [!code --]\n  name: normalize('wevm.eth'), // [!code ++]\n})\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\nBy inverting control, Wagmi lets you choose how much normalization to do. For example, maybe your project only allows ENS names that are numeric so no normalization is not needed. Check out the [ENS documentation](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) for more information on normalizing names.\n\n### Removed `configureChains`\n\nThe Wagmi v2 `Config` now has native multichain support using the [`chains`](/core/api/createConfig) parameter so the `configureChains` function is no longer required.\n\n```ts\nimport { configureChains, createConfig } from '@wagmi/core' // [!code --]\nimport { http, createConfig } from '@wagmi/core' // [!code ++]\nimport { mainnet, sepolia } from '@wagmi/core/chains'\n\nconst { chains, publicClient } = configureChains( // [!code --]\n  [mainnet, sepolia], // [!code --]\n  [publicProvider(), publicProvider()], // [!code --]\n) // [!code --]\n\nexport const config = createConfig({\n  publicClient, // [!code --]\n  chains: [mainnet, sepolia], // [!code ++]\n  transports: { // [!code ++]\n    [mainnet.id]: http(), // [!code ++]\n    [sepolia.id]: http(), // [!code ++]\n  }, // [!code ++]\n})\n```\n\n### Removed ABI exports\n\nImport from Viem instead.\n\n```ts\nimport { erc20ABI } from '@wagmi/core' // [!code --]\nimport { erc20Abi } from 'viem' // [!code ++]\n```\n\n### Removed `'@wagmi/core/providers/*` entrypoints\n\nIt 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.\n\n```ts\nimport { alchemyProvider } from '@wagmi/core/providers/alchemy' // [!code --]\nimport { http } from 'viem' // [!code ++]\n\nconst transport = http('https://mainnet.example.com')\n```\n\n### Updated `createConfig` parameters\n\n- Removed `autoConnect`. The reconnecting behavior must be managed manually and is not related to the Wagmi `Config`. Use the [`reconnect`](/core/api/actions/reconnect) action instead.\n- Removed `publicClient` and `webSocketPublicClient`. Use [`transports`](/core/api/createConfig#transports) or [`client`](/core/api/createConfig#client) instead.\n- Removed `logger`. Wagmi no longer logs debug information to console.\n\n### Updated `Config` object\n\n- Removed `config.connector`. Use `config.state.connections.get(config.state.current)?.connector` instead.\n- Removed `config.data`. Use `config.state.connections.get(config.state.current)` instead.\n- Removed `config.error`. Was unused and not needed.\n- Removed `config.lastUsedChainId`. Use `config.state.connections.get(config.state.current)?.chainId` instead.\n- Removed `config.publicClient`. Use [`config.getClient()`](/core/api/createConfig#getclient) or [`getPublicClient`](/core/api/actions/getPublicClient) instead.\n- Removed `config.status`. Use [`config.state.status`](/core/api/createConfig#status) instead.\n- Removed `config.webSocketClient`. Use [`config.getClient()`](/core/api/createConfig#getclient) or [`getPublicClient`](/core/api/actions/getPublicClient) instead.\n- Removed `config.clearState`. Was unused and not needed.\n- Removed `config.autoConnect()`. Use [`reconnect`](/core/api/actions/reconnect) action instead.\n- Renamed `config.setConnectors`. Use `config._internal.setConnectors` instead.\n- Removed `config.setLastUsedConnector`. Use `config.storage?.setItem('recentConnectorId', connectorId)` instead.\n- Removed `getConfig`. `config` should be passed explicitly to actions instead of using global `config`.\n\n## Deprecations\n\n### Deprecated `getBalance` `token` parameter\n\nMoving forward, `getBalance` will only work for native currencies, thus the `token` parameter is no longer supported. Use [`readContracts`](/core/api/actions/readContracts) instead.\n\n```ts\nimport { getBalance } from '@wagmi/core' // [!code --]\nimport { readContracts } from '@wagmi/core' // [!code ++]\nimport { erc20Abi } from 'viem' // [!code ++]\nimport { config } from './config' // [!code ++]\n\nconst result = await getBalance(config, { // [!code --]\n  address: '0x4557B18E779944BFE9d78A672452331C186a9f48', // [!code --]\n  token: '0x6B175474E89094C44Da98b954EedeAC495271d0F', // [!code --]\n}) // [!code --]\nconst result = await readContracts(config, { // [!code ++]\n  allowFailure: false, // [!code ++]\n  contracts: [ // [!code ++]\n    { // [!code ++]\n      address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', // [!code ++]\n      abi: erc20Abi, // [!code ++]\n      functionName: 'balanceOf', // [!code ++]\n      args: ['0x4557B18E779944BFE9d78A672452331C186a9f48'], // [!code ++]\n    }, // [!code ++]\n    { // [!code ++]\n      address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', // [!code ++]\n      abi: erc20Abi, // [!code ++]\n      functionName: 'decimals', // [!code ++]\n    }, // [!code ++]\n    { // [!code ++]\n      address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', // [!code ++]\n      abi: erc20Abi, // [!code ++]\n      functionName: 'symbol', // [!code ++]\n    }, // [!code ++]\n  ] // [!code ++]\n}) // [!code ++]\n```\n\n### Deprecated `getBalance` `unit` parameter and `formatted` return value\n\nMoving forward, `getBalance` will not accept the `unit` parameter or return a `formatted` value. Instead you can call `formatUnits` from Viem directly or use another number formatting library, like [dnum](https://github.com/bpierre/dnum) instead.\n\n```ts\nimport { formatUnits } from 'viem' // [!code ++]\nimport { getBalance } from '@wagmi/core'\n\nconst result = await getBalance({\n  address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n  unit: 'ether', // [!code --]\n})\nresult.formatted // [!code --]\nformatUnits(result.value, result.decimals) // [!code ++]\n```\n\n### Deprecated `getToken`\n\nMoving forward, `getToken` is no longer supported. Use [`readContracts`](/core/api/actions/readContracts) instead.\n\n```ts\nimport { getToken } from '@wagmi/core' // [!code --]\nimport { readContracts } from '@wagmi/core' // [!code ++]\nimport { erc20Abi } from 'viem' // [!code ++]\nimport { config } from './config' // [!code ++]\n\nconst result = await getToken(config, { // [!code --]\n  address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', // [!code --]\n}) // [!code --]\nconst result = await readContracts(config, { // [!code ++]\n  allowFailure: false, // [!code ++]\n  contracts: [ // [!code ++]\n    { // [!code ++]\n      address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', // [!code ++]\n      abi: erc20Abi, // [!code ++]\n      functionName: 'decimals', // [!code ++]\n    }, // [!code ++]\n    { // [!code ++]\n      address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', // [!code ++]\n      abi: erc20Abi, // [!code ++]\n      functionName: 'name', // [!code ++]\n    }, // [!code ++]\n    { // [!code ++]\n      address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', // [!code ++]\n      abi: erc20Abi, // [!code ++]\n      functionName: 'symbol', // [!code ++]\n    }, // [!code ++]\n    { // [!code ++]\n      address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', // [!code ++]\n      abi: erc20Abi, // [!code ++]\n      functionName: 'totalSupply', // [!code ++]\n    }, // [!code ++]\n  ] // [!code ++]\n}) // [!code ++]\n```\n\n### Deprecated `formatUnits` parameters and return values\n\nThe `formatUnits` parameter and related return values (e.g. `result.formatted`) are deprecated for the following actions:\n\n- [`estimateFeesPerGas`](/core/api/actions/estimateFeesPerGas)\n- `getToken`\n\nInstead you can call `formatUnits` from Viem directly or use another number formatting library, like [dnum](https://github.com/bpierre/dnum) instead.\n\n```ts\nimport { formatUnits } from 'viem' // [!code ++]\nimport { getToken } from '@wagmi/core'\n\nconst result = await getToken({\n  address: '0x6B175474E89094C44Da98b954EedeAC495271d0F',\n  formatUnits: 'ether',\n})\nresult.totalSupply.formatted  // [!code --]\nformatUnits(result.totalSupply.value, 18)  // [!code ++]\n```\n\nThis allows us to invert control to users so they can handle number formatting however they want, taking into account precision, localization, and more.\n\n### Renamed actions\n\nThe following actions were renamed to better reflect their functionality and underlying [Viem](https://viem.sh) actions:\n\n- `fetchBalance` is now [`getBalance`](/core/api/actions/getBalance)\n- `fetchBlockNumber` is now [`getBlockNumber`](/core/api/actions/getBlockNumber)\n- `fetchEnsAddress` is now [`getEnsAddress`](/core/api/actions/getEnsAddress)\n- `fetchEnsAvatar` is now [`getEnsAvatar`](/core/api/actions/getEnsAvatar)\n- `fetchEnsName` is now [`getEnsName`](/core/api/actions/getEnsName)\n- `fetchEnsResolver` is now [`getEnsResolver`](/core/api/actions/getEnsResolver)\n- `fetchToken` is now `getToken`\n- `fetchTransaction` is now [`getTransaction`](/core/api/actions/getTransaction)\n- `switchNetwork` is now [`switchChain`](/core/api/actions/switchChain)\n- `waitForTransaction` is now [`waitForTransactionReceipt`](/core/api/actions/waitForTransactionReceipt)\n"
  },
  {
    "path": "site/core/guides/migrate-from-v2-to-v3.md",
    "content": "---\ntitle: Migrate from v2 to v3\ndescription: Guide for migrating from Wagmi v2 to v3.\n---\n\n<script setup>\nimport PackageMetadata from '../../components/PackageMetadata.vue'\nimport packageJson from '../../../packages/connectors/package.json'\nconst docsPath = 'core'\n</script>\n\n# Migrate from v2 to v3\n\n## Overview\n\nWagmi 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.\n\nThis 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\n\nTo get started, install the latest version of Wagmi.\n\n::: code-group\n```bash [pnpm]\npnpm add @wagmi/core@3\n```\n\n```bash [npm]\nnpm install @wagmi/core@3\n```\n\n```bash [yarn]\nyarn add @wagmi/core@3\n```\n\n```bash [bun]\nbun add @wagmi/core@3\n```\n:::\n\n::: info Not ready to migrate yet?\nThe Wagmi v2 docs are still available at [2.x.wagmi.sh/core](https://2.x.wagmi.sh/core).\n:::\n\n<!-- @include: @shared/migrate-from-v2-to-v3.md -->\n\n## Deprecations\n\n### Renamed Account Actions\n\nAt 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.\n\n```ts\nimport {\n  getAccount, // [!code --]\n  getConnection, // [!code ++]\n  switchAccount, // [!code --]\n  switchConnection, // [!code ++]\n  watchAccount, // [!code --]\n  watchConnection, // [!code ++]\n} from '@wagmi/core'\n```\n\n`switchAccountMutationOptions` is also updated to `switchConnectionMutationOptions`.\n\n```ts\nimport {\n  switchAccountMutationOptions, // [!code --]\n  switchConnectionMutationOptions, // [!code ++]\n} from '@wagmi/core/query'\n\n```\n"
  },
  {
    "path": "site/core/guides/testing.md",
    "content": "# Testing\n\n\n"
  },
  {
    "path": "site/core/guides/viem.md",
    "content": "# Viem\n\n[Viem](https://viem.sh) is a low-level TypeScript Interface for Ethereum that enables developers to interact with the Ethereum blockchain, including: JSON-RPC API abstractions, Smart Contract interaction, wallet & signing implementations, coding/parsing utilities and more.\n\n**Wagmi Core** is essentially a wrapper over **Viem** that provides multi-chain functionality via [Wagmi Config](/core/api/createConfig) and automatic account management via [Connectors](/core/api/connectors).\n\n## Leveraging Viem Actions\n\nAll 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).\n\nThere 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).\n\nThe example below demonstrates two different ways to utilize Viem Actions:\n\n1. **Tree-shakable Actions (recommended):** Uses `getClient` (for public actions) and `getConnectorClient` (for wallet actions).\n2. **Client Actions:** Uses `getPublicClient` (for public actions) and  `getWalletClient` (for wallet actions).\n\n::: tip\n\nIt is highly recommended to use the **tree-shakable** method to ensure that you are only pulling modules you use, and keep your bundle size low.\n\n:::\n\n::: code-group\n\n```tsx [Tree-shakable Actions]\n// 1. Import modules. \nimport { http, createConfig, getClient, getConnectorClient } from '@wagmi/core' \nimport { base, mainnet, optimism, zora } from '@wagmi/core/chains' \nimport { getLogs, watchAsset } from 'viem/actions' // [!code hl]\n\n// 2. Set up a Wagmi Config \nexport const config = createConfig({ \n  chains: [base, mainnet, optimism, zora], \n  transports: { \n    [base.id]: http(), \n    [mainnet.id]: http(), \n    [optimism.id]: http(), \n    [zora.id]: http(), \n  }, \n}) \n\n// 3. Extract a Viem Client for the current active chain.\nconst publicClient = getClient(config)\nconst logs = await getLogs(publicClient, /* ... */) // [!code hl]\n\n// 4. Extract a Viem Client for the current active chain & account.\nconst walletClient = getConnectorClient(config)\nconst success = await watchAsset(walletClient, /* ... */) // [!code hl]\n```\n\n```tsx [Client Actions]\n// 1. Import modules. \nimport { http, createConfig, getPublicClient, getWalletClient } from '@wagmi/core' \nimport { base, mainnet, optimism, zora } from '@wagmi/core/chains' \n\n// 2. Set up a Wagmi Config \nexport const config = createConfig({ \n  chains: [base, mainnet, optimism, zora], \n  transports: { \n    [base.id]: http(), \n    [mainnet.id]: http(), \n    [optimism.id]: http(), \n    [zora.id]: http(), \n  }, \n}) \n\n// 3. Extract a Viem Public Client for the current active chain.\nconst publicClient = getPublicClient(config)\nconst logs = await publicClient.getLogs(publicClient, /* ... */) // [!code hl]\n\n// 4. Extract a Viem Wallet Client for the current active chain & account.\nconst walletClient = getWalletClient(config)\nconst success = await walletClient.watchAsset(walletClient, /* ... */) // [!code hl]\n```\n\n:::\n\n## Multi-chain Viem Client\n\nThe [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.\n\nThe 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).\n\n::: code-group\n\n```tsx [Wagmi Usage]\n// 1. Import modules. \nimport { http, createConfig, getClient, getConnectorClient } from '@wagmi/core' \nimport { base, mainnet, optimism, zora } from '@wagmi/core/chains' \nimport { getBlockNumber, sendTransaction } from 'viem/actions' // [!code hl]\n\n// 2. Set up a Wagmi Config \nexport const config = createConfig({ \n  chains: [base, mainnet, optimism, zora], \n  transports: { \n    [base.id]: http(), \n    [mainnet.id]: http(), \n    [optimism.id]: http(), \n    [zora.id]: http(), \n  }, \n}) \n\n// 3. Extract a Viem Client for the current active chain.\nconst publicClient = getClient(config)\nconst blockNumber = await getBlockNumber(publicClient) // [!code hl]\n\n// 4. Extract a Viem Client for the current active chain & account.\nconst walletClient = getConnectorClient(config)\nconst hash = await sendTransaction(walletClient, /* ... */) // [!code hl]\n```\n\n```tsx [Viem Usage]\n// Manually set up Viem Clients without wagmi. Don't do this, it's only here \n// to demonstrate the amount of boilerplate required.\n\nimport { createPublicClient, createWalletClient, http } from 'viem'\nimport { base, mainnet, optimism, zora } from 'viem/chains'\n\nconst publicClient = {\n  base: createPublicClient({\n    chain: base,\n    transport: http()\n  }),\n  mainnet: createPublicClient({\n    chain: mainnet,\n    transport: http()\n  }),\n  optimism: createPublicClient({\n    chain: optimism,\n    transport: http()\n  }),\n  zora: createPublicClient({\n    chain: zora,\n    transport: http()\n  })\n} as const\n\nconst walletClient = {\n  base: createWalletClient({\n    chain: base,\n    transport: custom(window.ethereum)\n  }),\n  mainnet: createWalletClient({\n    chain: mainnet,\n    transport: custom(window.ethereum)\n  }),\n  optimism: createWalletClient({\n    chain: optimism,\n    transport: custom(window.ethereum)\n  }),\n  zora: createWalletClient({\n    chain: zora,\n    transport: custom(window.ethereum)\n  })\n} as const\n\nconst blockNumber = await publicClient.mainnet.getBlockNumber()\nconst hash = await walletClient.mainnet.sendTransaction(/* ... */)\n```\n\n:::\n\n## Private Key & Mnemonic Accounts\n\nIt 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.\n\n```tsx\nimport { http, createConfig, sendTransaction } from '@wagmi/core' \nimport { base, mainnet, optimism, zora } from '@wagmi/core/chains' \nimport { parseEther } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\n\nexport const config = createConfig({ \n  chains: [base, mainnet, optimism, zora], \n  transports: { \n    [base.id]: http(), \n    [mainnet.id]: http(), \n    [optimism.id]: http(), \n    [zora.id]: http(), \n  }, \n}) \n\nconst account = privateKeyToAccount('0x...') // [!code hl]\n\nconst hash = await sendTransaction({ \n  account, // [!code hl]\n  to: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n  value: parseEther('0.001')\n})\n```\n\n::: info\n\nWagmi currently does not support hoisting Private Key & Mnemonic Accounts to the top-level Wagmi Config – meaning you have to explicitly pass through the account to every Action. If you feel like this is a feature that should be added, please [open a discussion](https://github.com/wevm/wagmi/discussions/new?category=ideas).\n\n:::\n"
  },
  {
    "path": "site/core/installation.md",
    "content": "<script setup>\nimport packageJson from '../../packages/core/package.json'\nimport Browsers from '../components/Browsers.vue'\n\nconst docsPath = 'core'\nconst packageDir = 'core'\nconst packageName = '@wagmi/core'\nconst viemVersion = packageJson.peerDependencies.viem\n</script>\n\n# Installation\n\nInstall Wagmi Core via your package manager, a `<script>` tag, or build from source.\n\n## Package Manager\n\nInstall the required packages.\n\n::: code-group\n```bash-vue [pnpm]\npnpm add @wagmi/core viem@{{viemVersion}}\n```\n\n```bash-vue [npm]\nnpm install @wagmi/core viem@{{viemVersion}}\n```\n\n```bash-vue [yarn]\nyarn add @wagmi/core viem@{{viemVersion}}\n```\n\n```bash-vue [bun]\nbun add @wagmi/core viem@{{viemVersion}}\n```\n:::\n\n- [Viem](https://viem.sh) is a TypeScript interface for Ethereum that performs blockchain operations.\n- [TypeScript](/react/typescript) is optional, but highly recommended. Learn more about [TypeScript support](/react/typescript).\n\n## CDN\n\nIf you're not using a package manager, you can also use Wagmi Core via an ESM-compatible CDN such as [esm.sh](https://esm.sh). Simply add a `<script type=\"module\">` tag to the bottom of your HTML file with the following content.\n\n```html-vue\n<script type=\"module\">\n  import { createClient } from 'https://esm.sh/viem'\n  import { createConfig } from 'https://esm.sh/@wagmi/core@{{viemVersion}}'\n  import { injected } from 'https://esm.sh/@wagmi/connectors'\n</script>\n```\n\n<!--@include: @shared/installation.md-->\n"
  },
  {
    "path": "site/core/typescript.md",
    "content": "<script setup>\nimport packageJson from '../../packages/core/package.json'\n\nconst typescriptVersion = packageJson.peerDependencies.typescript\n</script>\n\n# TypeScript\n\n## Requirements\n\nWagmi Core is designed to be as type-safe as possible! Things to keep in mind:\n\n- Types currently require using TypeScript {{typescriptVersion}}.\n- [TypeScript doesn't follow semver](https://www.learningtypescript.com/articles/why-typescript-doesnt-follow-strict-semantic-versioning) and often introduces breaking changes in minor releases.\n- Changes to types in this repository are considered non-breaking and are usually released as patch  changes (otherwise every type enhancement would be a major version!).\n- It is highly recommended that you lock your `@wagmi/core` and `typescript` versions to specific patch releases and upgrade with the expectation that types may be fixed or upgraded between any release.\n- The non-type-related public API of Wagmi Core still follows semver very strictly.\n\nTo ensure everything works correctly, make sure your `tsconfig.json` has [`strict`](https://www.typescriptlang.org/tsconfig#strict) mode set to `true`.\n\n::: code-group\n```json [tsconfig.json]\n{\n  \"compilerOptions\": {\n    \"strict\": true\n  }\n}\n```\n:::\n\n## Const-Assert ABIs & Typed Data\n\nWagmi Core can infer types based on [ABIs](https://docs.soliditylang.org/en/latest/abi-spec.html#json) and [EIP-712](https://eips.ethereum.org/EIPS/eip-712) Typed Data definitions, powered by [Viem](https://viem.sh) and [ABIType](https://github.com/wevm/abitype). This achieves full end-to-end type-safety from your contracts to your frontend and enlightened developer experience by autocompleting ABI item names, catching misspellings, inferring argument and return types (including overloads), and more.\n\nFor this to work, you must either [const-assert](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions) ABIs and Typed Data (more info below) or define them inline. For example, `useReadContract`'s `abi` configuration parameter:\n\n```ts\nconst result = await readContract({\n  abi: […], // <--- defined inline // [!code focus]\n})\n```\n\n```ts\nconst abi = […] as const // <--- const assertion // [!code focus]\nconst result = readContract({ abi })\n```\n\nIf type inference isn't working, it's likely you forgot to add a `const` assertion or define the configuration parameter inline. Also, make sure your ABIs, Typed Data definitions, and [TypeScript configuration](#requirements) are valid and set up correctly.\n\n::: tip\nUnfortunately [TypeScript doesn't support importing JSON `as const` yet](https://github.com/microsoft/TypeScript/issues/32063). Check out the [Wagmi CLI](/cli/getting-started) to help with this! It can automatically fetch ABIs from Etherscan and other block explorers, resolve ABIs from your Foundry/Hardhat projects, and more.\n:::\n\nAnywhere you see the `abi` or `types` configuration property, you can likely use const-asserted or inline ABIs and Typed Data to get type-safety and inference. These properties are also called out in the docs.\n\nHere's what [`readContract`](/core/api/actions/readContract) looks like with and without a const-asserted `abi` property.\n\n::: code-group\n```ts twoslash [Const-Asserted]\n// @twoslash-cache: {\"v\":1,\"hash\":\"ce7669bfd8403077642e11ee62585359f9005b3491bb5cb9aa7196e861042c9f\",\"data\":\"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\"}\nimport { createConfig, http } from '@wagmi/core'\nimport { mainnet, sepolia } from '@wagmi/core/chains'\n\nconst config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n\nconst erc721Abi = [\n  {\n    name: 'balanceOf',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [{ type: 'address', name: 'owner' }],\n    outputs: [{ type: 'uint256' }],\n  },\n  {\n    name: 'isApprovedForAll',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [\n      { type: 'address', name: 'owner' },\n      { type: 'address', name: 'operator' },\n    ],\n    outputs: [{ type: 'bool' }],\n  },\n  {\n    name: 'getApproved',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [{ type: 'uint256', name: 'tokenId' }],\n    outputs: [{ type: 'address' }],\n  },\n  {\n    name: 'ownerOf',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [{ type: 'uint256', name: 'tokenId' }],\n    outputs: [{ type: 'address' }],\n  },\n  {\n    name: 'tokenURI',\n    type: 'function',\n    stateMutability: 'pure',\n    inputs: [{ type: 'uint256', name: 'tokenId' }],\n    outputs: [{ type: 'string' }],\n  },\n] as const\n// ---cut---\nimport { readContract } from '@wagmi/core'\n\nconst result = await readContract(config, {\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  abi: erc721Abi,\n  functionName: 'balanceOf',\n  // ^?\n\n\n\n  args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],\n  // ^?\n})\n\nresult\n// ^?\n```\n```ts twoslash [Not Const-Asserted]\n// @twoslash-cache: {\"v\":1,\"hash\":\"32e9700c30963257f6c79b087bc2f37aa4f1bb4bb135b24ec22d2f898493f29f\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808AKAQwBsBLZuASgAIAzAK5gAxmnYQwvUjGZQAwpLSlmYgDwjJ/dgHNedGmChxeisNp0VemsHDS9mAI3b76MIyYCCz3gB9pslCSrBi8wgDWkADuYMgAulZCouKSAHLMALYwrobGpkoqYgBiwmISYOlZak7sVgA6IFiCMg1+vA1E7DBRDQB8VjZ2DqQ6JgbueWbKqmglyeWeI3DVzvWNzTCt/h1dPZQCpSkVmTC9vYw2FojWWrpWWMwqWTSkcNcASoFThWgACo8nF7LGqJQ7lSowKyPUYDW46Xrca6/UgQDLsOAwNSfOTfGafNDNMAAFWwmJBB3maROUKWZzqYHYGSwEFI9hkOIKM0oICCIgQiAIaDQWDeAHpRVFmDo0QA6OD4UWaGSi5hYdgqsqSOCi9kKTlibl2R4MRAATiorHcOjQ+CQAEYAExUNDQmAmkC63EGi3sMC4RAABioInwALEZCQpoAvhR0KS8IQSORnQY8IM2fBBKw0NcItEwIaXaykABWIMgS1ga22xAANmdrvdMjgWYYPr9SCdIBDYZeSFrMbjOATxAjKfoTDYnB4AQ5YGm6jMFjUuuCoVQ9N4W94jlYEBE4QAorQsHuZK9rsBN9ub6uwCFeLB+MxW5frzeP7OgvfQmATtcGkPG0yDgERmDABoAG530/bc7wfZpWAAwVhTFUU3XwECwLAGUJCgmDYK/NcHDVABVUgkPaFCRUQcVVXYGUMKw8DcIgFU1XwqRYKjaCuK3HiYN3fdwiJRkYGuR0Ayk3ibxsBc0DeXgrz4j94NCdw4FIhkkzgNhPjgCBWCTN8VMItSHCgKBm0UhoA1oGAHMchy7QAFigAB2O0AA4RAdRwXPcqBTVNB0AGZYCcO1QtCksYFclynM4wjb0CYihIPeR2RoKBrjCgMvJLQqvJk7iSs/cyMlbdgwNYVhQpM5K4NSn8LKs+AbJAOywLtO1HFgAMS1Ndz3McULa1Cnra3cgMHS8rzaz8mAHWYO13NCoba26u0ksaoiWvS8JMtkbKJJcmKxoDO0yo/ASVNum8ZUe3hXN4DIWWyR6ZWupN2H4DAAAkuHwAB+a5GAuDh3BzUxIfnNRPv6XgHieN0QOuAA1MhfoBoH/hRoE+AAXl6XhkVRdFMUcCBDNkMAETaYQn19GAoF4mMlJgz62YSDmVK5+l2fMo7mBoMw/TEFkiliOJEeUh7HrZ+I1kcNhwJEGAAHl+AaKxzOQT6ZYuOFriXXR4cexHkcBNHeGxPV5x+PHrdec2ZQRJEUTRDFXd6elGWZVkvy9NseX3flqLQyVpQY+VFXe9j1RmcptU9fUQ6NYs6xLC0rRte0uyLHQ3TwVOHa5dt/S7HsfgjRAHTtQdqHjAVEzHahUwFdMbnMXQTbhFdmofDcVIO49T3ei9ebMwfQifF9swa3bzL/LJkKAzDXmwnbGvMxDkPwIUaPFJjN5YvCQGu6e5GI+jyMohoD9Q2iE8Y4DT5wiQE+3m7rvu7cDtEqvZ6DopIBmunJH4ik5awXMhpLS7AdJ6XgIZYyU8l4z1atZZCdknJOVch5byvl/KBWCmFCKjgooxTii5BKjlv5X2/A+A6wsTq8DygVIql9tx/3Khgyq2ZqpsDqovHeGC5BtTgB1LqK1er9UGsNUa41JrTVmvNRay1VrrXcptGR9CYEYOYVlFmp1zq1kulw/iv9rqfWei5V671eD8xUj9P6gN5Sg14ODEQsNobyB8T7e4AJng20xqQbGbj8BO2Ca8ImJMyZe0ptTS04F6b+EZjAbQfpWYCysNArcTiow8zyY4hWOS9oPhYTAMWMAJakClvEXohZjRIHcl5HOVY851gbCMYunc4Tcg4B2OuwZQw13IIgUKLlG6YGHC3UcyZ24TgFIwLAKIcCsgwHwcRWDeAAAM7IABJgB2DCVWKMuymmZ1NOWSs1YWndKLu6bZ7UBnMyQKFEZvZa4Ommc3Ag8zuQ0CWSAFZayyCYC2c4ERvAV7iV4Cc30OhrozLhQiqs10jQ0AALKCBdM4DgmBrhoqRTBX0TQFLQpvCiolyhEUWJhf+eFtL0UwSjPEa6EBcXkqgQRbc1KmWnJJXddlAt4iXJNK5dy7S7kTIeb0kANRXlDJcp8sZnZfmzP+UmQFHduxansGQEQ7l67eHYNC2FNLBXItJJaulMFMUwBxXi9gBKMC2pZSpMluKeWmT5TagVdrfVbgtQGj1N42VxA5Vy71lK/U4HdUK8NIqwARvFfaEsXZbmdPNNQRseBDXGrtKapV/oVXdlGTMWu7kNX+i1W3IF7pQUQHWRCikmpjhAOJWmxAdpazZwrLnGsjo5XuiSO2iEJbSyqsreMn5sYm6aoAI6CDIBgHVwKm0ts2W2o4EIE3dt7f2rNQ6C55oFGO3dJxJ2IH7dXGd6r50opHNq8cjbVnNvBdu6EcAPG7zAJECAMR4gMyMBk5mUAD1DWlZ0sthd5XfuvTmu94ZZ01rwMu1d6631go2VspYv6MF5kA9LEDTMsmQalQOjpNZYNnoVUsRD06UMPqHLW1uCyG1pn1QEFsC8wj/vzN2h0hVoM1nrLmnpTZMzZmvcO8tXzxkBjQwKDDpA12vq47YDMvHoZEZiEJkTVGZXibg1JnTsmq4VuY4GQpwZoC1v9iyewwAg5p14FGAQnteAAHIAACUc0RxxkN5+k9Iu7NlbLwQmDhJTsAzHOeSRse6WDQc8yR1xvN2SKAAIU8OtR08hmABjclAFyJYfJeTOktQ8h58qmimvweQxX+AxXcqaXy3mKDXhqNcAtJrVjXgveCRl3mVasDVprfgnXQsQVm1ub91xkCZdoJ4AM8h+Btbmr2gAIi5Rwpp9vzVrI4Es0UAw1eYC5WsK0vKhS8g6fgwm7QwG8wkAW3AZsRezPSbkzxmBIFAOMWw5Q8AKRAFGKMQA==\"}\nimport { createConfig, http } from '@wagmi/core'\nimport { mainnet, sepolia } from '@wagmi/core/chains'\n\nconst config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n\ndeclare const erc721Abi: {\n  name: string;\n  type: string;\n  stateMutability: string;\n  inputs: {\n    type: string;\n    name: string;\n  }[];\n  outputs: {\n    type: string;\n  }[];\n}[]\n// ---cut---\nimport { readContract } from '@wagmi/core'\n\nconst result = await readContract(config, {\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  abi: erc721Abi,\n  functionName: 'balanceOf',\n  // ^?\n\n\n\n  args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],\n  // ^?\n})\n\nresult\n// ^?\n```\n:::\n\nYou can prevent runtime errors and be more productive by making sure your ABIs and Typed Data definitions are set up appropriately. 🎉\n\n```ts twoslash\n// @twoslash-cache: {\"v\":1,\"hash\":\"1302572cb196fc0dde6d7e01c4f069233f8e54486c2e57cde92bd7a1bf18508b\",\"data\":\"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\"}\n// @errors: 2820\nimport { createConfig, http } from '@wagmi/core'\nimport { mainnet, sepolia } from '@wagmi/core/chains'\n\nconst config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n\nconst erc721Abi = [\n  {\n    name: 'balanceOf',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [{ type: 'address', name: 'owner' }],\n    outputs: [{ type: 'uint256' }],\n  },\n  {\n    name: 'isApprovedForAll',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [\n      { type: 'address', name: 'owner' },\n      { type: 'address', name: 'operator' },\n    ],\n    outputs: [{ type: 'bool' }],\n  },\n  {\n    name: 'getApproved',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [{ type: 'uint256', name: 'tokenId' }],\n    outputs: [{ type: 'address' }],\n  },\n  {\n    name: 'ownerOf',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [{ type: 'uint256', name: 'tokenId' }],\n    outputs: [{ type: 'address' }],\n  },\n  {\n    name: 'tokenURI',\n    type: 'function',\n    stateMutability: 'pure',\n    inputs: [{ type: 'uint256', name: 'tokenId' }],\n    outputs: [{ type: 'string' }],\n  },\n] as const\n// ---cut---\nimport { readContract } from '@wagmi/core'\n\nreadContract(config, {\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  abi: erc721Abi,\n  functionName: 'balanecOf',\n  args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],\n})\n```\n\n## Configure Internal Types\n\nFor advanced use-cases, you may want to configure wagmi's internal types. Most of wagmi's types relating to ABIs and EIP-712 Typed Data are powered by [ABIType](https://github.com/wevm/abitype). See the [ABIType docs](https://abitype.dev) for more info on how to configure types.\n"
  },
  {
    "path": "site/core/why.md",
    "content": "# Why Wagmi Core\n\n## The Problems\n\nBuilding Ethereum applications is hard. Apps need to support connecting wallets, multiple chains, signing messages and data, sending transactions, listening for events and state changes, refreshing stale blockchain data, and much more. This is all on top of solving for app-specific use-cases and providing polished user experiences.\n\nThe ecosystem is also continuously evolving, meaning you need to adapt to new improvements or get left behind. App developers should not need to worry about connecting tens of different wallets, the intricacies of multi-chain support, typos accidentally sending an order of magnitude more ETH or calling a misspelled contract function, or accidentally spamming their RPC provider, costing thousands in compute units.\n\nWagmi Core solves all these problems and more — allowing app developers to focus on building high-quality and performant experiences for Ethereum — by focusing on **developer experience**, **performance**, **feature coverage**, and **stability.**\n\n## Developer Experience\n\nWagmi Core delivers a great developer experience through modular and composable APIs, automatic type safety and inference, and comprehensive documentation.\n\nIt provides developers with intuitive building blocks to build their Ethereum apps. While Wagmi Core's APIs might seem more verbose at first, it makes Wagmi Core's modular building blocks extremely flexible. Easy to move around, change, and remove. It also allows developers to better understand Ethereum concepts as well as understand _what_ and _why_ certain properties are being passed through. Learning how to use Wagmi Core is a great way to learn how to interact with Ethereum in general.\n\nWagmi Core also provides [strongly typed APIs](/core/typescript), allowing consumers to get the best possible experience through [autocomplete](https://twitter.com/awkweb/status/1555678944770367493), [type inference](https://twitter.com/jakemoxey/status/1570244174502588417?s=20), as well as static validation. You often just need to provide an ABI and Wagmi Core can help you autocomplete your way to success, identify type errors before your users do, drill into blockchain errors [at compile and runtimes](/core/guides/error-handling) with surgical precision, and much more.\n\nThe API documentation is comprehensive and contains usage info for _every_ module in Wagmi Core. The core team uses a [documentation](https://gist.github.com/zsup/9434452) and [test driven](https://en.wikipedia.org/wiki/Test-driven_development#:~:text=Test%2Ddriven%20development%20(TDD),software%20against%20all%20test%20cases.) development approach to building modules, which leads to predictable and stable APIs.\n\n## Performance\n\nPerformance is critical for applications on all sizes. Slow page load and interactions can cause users to stop using applications. Wagmi Core uses and is built by the same team behind [Viem](https://viem.sh), the most performant production-ready Ethereum library.\n\nEnd users should not be required to download a module of over 100kB in order to interact with Ethereum. Wagmi Core is optimized for tree-shaking and dead-code elimination, allowing apps to minimize bundle size for fast page load times. \n\nData layer performance is also critical. Slow, unnecessary, and manual data fetching can make apps unusable and cost thousands in RPC compute units. Wagmi Core supports caching, deduplication, persistence, and much more through [TanStack Query](/react/guides/tanstack-query) via the `'@wagmi/core/query'` entrypoint so you can [plug it into your framework](/core/guides/framework-adapters) of choice, like Vue, Svelte, and more.\n\n## Feature Coverage\n\nWagmi Core supports the most popular and commonly-used Ethereum features out of the box with 40+ VanillaJS Actions for accounts, wallets, contracts, transactions, signing, ENS, and more. Wagmi Core also supports just about any wallet out there through its official [connectors](/core/api/connectors), [EIP-6963 support](/core/api/createConfig#multiinjectedproviderdiscovery), and [extensible API](/dev/creating-connectors).\n\nIf you need lower-level control, you can always drop down to [Viem](https://viem.sh), which Wagmi Core uses internally to perform blockchain operations. Wagmi Core also manages multi-chain support automatically so developers can focus on their applications instead of adding custom code.\n\nFinally, Wagmi Core has a [CLI](/cli/getting-started) to manage ABIs as well as a robust ecosystem of third-party libraries, like [ConnectKit](https://docs.family.co/connectkit), [Dynamic](https://www.dynamic.xyz), [Privy](https://privy.io), and many more, so you can get started quickly without needing to build everything from scratch.\n\n## Stability\n\nStability is a fundamental principle for Wagmi Core. Many organizations, large and small, rely heavily on Wagmi Core and expect it to be entirely stable for their users and applications.\n\nWagmi Core's test suite runs against forked Ethereum nodes to make sure functions work across chains. The test suite also runs type tests against many different versions of peer dependencies, like TypeScript, to ensure compatibility with the latest releases of other popular software.\n\nWagmi Core follows semver so developers can upgrade between versions with confidence. Starting with Wagmi Core v2, new functionality will be opt-in with old functionality being deprecated alongside the new features. This means upgrading to the latest major versions will not require immediate changes.\n\nLastly, the core team works full-time on Wagmi Core and [related projects](https://github.com/wevm), and is constantly improving Wagmi Core and keeping it up-to-date with industry trends and changes.\n\n"
  },
  {
    "path": "site/dev/contributing.md",
    "content": "<script setup>\nimport packageJson from '../../package.json'\n\nconst nodeVersion = packageJson.devEngines.runtime.version\nconst packageManager = packageJson.packageManager\n</script>\n\n# Contributing\n\nThanks for your interest in contributing to Wagmi! Please take a moment to review this document **before submitting a pull request.**\n\n## Overview\n\nThis guide is intended to help you get started with contributing. By following these steps, you will understand the development process and workflow. If you want to contribute, but aren't sure where to start, you can create a [new discussion](https://github.com/wevm/wagmi/discussions/new/choose).\n\n:::warning\n**Please ask first before starting work on any significant new features. This includes things like adding new hooks, actions, connectors, etc.**\n\nIt's never a fun experience to have your pull request declined after investing time and effort into a new feature. To avoid this from happening, we request that contributors first create a [feature request](https://github.com/wevm/wagmi/discussions/new?category=ideas) to discuss any API changes or significant new ideas.\n:::\n\n## 1. Cloning the repository\n\nTo start contributing to the project, clone it to your local machine using git:\n\n```bash\ngit clone https://github.com/wevm/wagmi.git\n```\n\nOr the [GitHub CLI](https://cli.github.com):\n\n```bash\ngh repo clone wevm/wagmi\n```\n\n## 2. Installing Node.js and pnpm\n\nWagmi uses Node.js with [pnpm workspaces](https://pnpm.io/workspaces) to manage multiple projects. You can run the following command in your terminal to check your local Node.js version.\n\n```bash\nnode -v\n```\n\nIf **`node@{{nodeVersion}}`** is not installed, you can install via [fnm](https://github.com/Schniz/fnm) or from the [official website](https://nodejs.org).\n\nOnce Node.js is installed, run the following to install [Corepack](https://nodejs.org/api/corepack.html). Corepack automatically installs and manages **`{{packageManager}}`**.\n\n```bash\ncorepack enable\n```\n\n## 3. Installing dependencies\n\nOnce in the project's root directory, run the following command to install pnpm (via Corepack) and the project's dependencies:\n\n```bash\npnpm install\n```\n\nAfter the install completes, pnpm links packages across the project for development and [git hooks](https://github.com/toplenboren/simple-git-hooks) are set up.\n\n## 4. Adding the env variables\n\nThe [dev playgrounds](#_5-running-the-dev-playgrounds) and [test suite](#_6-running-the-test-suite) require environment variables to be set. Copy over the following environment variables to `.env`, and fill them out.\n\n```bash\nVITE_MAINNET_FORK_URL=https://eth.merkle.io\nVITE_OPTIMISM_FORK_URL=https://mainnet.optimism.io\n\nNEXT_PUBLIC_WC_PROJECT_ID=3fbb6bba6f1de962d911bb5b5c9dba88\nNUXT_PUBLIC_WC_PROJECT_ID=3fbb6bba6f1de962d911bb5b5c9dba88\nVITE_WC_PROJECT_ID=3fbb6bba6f1de962d911bb5b5c9dba88\n\nNEXT_TELEMETRY_DISABLED=1\nNUXT_TELEMETRY_DISABLED=1\n```\n\nYou might want to change `*_FORK_URL` to a paid RPC provider for better performance.\n\n## 5. Running the dev playgrounds\n\nTo start the local development playgrounds, run one of the following commands. These commands run playground apps, located at `./playgrounds`, that are set up for trying out code while making changes.\n\n```bash\npnpm dev              # `wagmi` playground\npnpm dev:core         # `@wagmi/core` playground\npnpm dev:create-wagmi # `create-wagmi` cli tool\npnpm dev:cli          # `@wagmi/cli` tool\npnpm dev:next         # `wagmi` playground with Next.js\npnpm dev:nuxt         # `@wagmi/vue` playground with Nuxt.js\npnpm dev:react        # `wagmi` playground (same as `pnpm dev`)\npnpm dev:vue          # `@wagmi/vue` playground\n```\n\nOnce a playground dev server is running, you can make changes to any of the package source files (e.g. `packages/react`) and it will automatically update the playground.\n\n## 6. Running the test suite\n\nWagmi 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).\n\n```bash\ncurl -L https://foundry.paradigm.xyz | bash\nfoundryup\n```\n\nYou'll also need to install [Playwright](https://playwright.dev/) browser binaries:\n\n```bash\npnpm exec playwright install\n```\n\nNext, 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:\n\n- `pnpm test [package?]` — runs tests in watch mode\n- `pnpm test:cov` — runs tests and reports coverage\n\nWhen 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.\n\n## 7. Writing documentation\n\nDocumentation is crucial to helping developers of all experience levels use Wagmi. Wagmi uses [VitePress](https://vitepress.dev) for the documentation site (located at `./site`). To start the site in dev mode, run:\n\n```bash\npnpm docs:dev\n```\n\nTry to keep documentation brief and use plain language so folks of all experience levels can understand. If you think something is unclear or could be explained better, you are welcome to open a pull request.\n\n## 8. Submitting a pull request\n\nWhen you're ready to submit a pull request, you can follow these naming conventions:\n\n- Pull request titles use the [Imperative Mood](https://en.wikipedia.org/wiki/Imperative_mood) (e.g., `Add something`, `Fix something`).\n- [Changesets](#versioning) use past tense verbs (e.g., `Added something`, `Fixed something`).\n\nWhen you submit a pull request, GitHub will automatically lint, build, and test your changes. If you see an ❌, it's most likely a bug in your code. Please, inspect the logs through the GitHub UI to find the cause.\n\n**Please make sure that \"Allow edits from maintainers\" is enabled so the core team can make updates to your pull request if necessary.**\n\n## 9. Versioning\n\nWhen adding new features or fixing bugs, we'll need to bump the package versions. We use [Changesets](https://github.com/changesets/changesets) to do this.\n\n::: tip\nOnly changes to the codebase that affect the public API or existing behavior (e.g. bugs) need changesets.\n:::\n\nEach changeset defines which packages should be published and whether the change should be a major/minor/patch release, as well as providing release notes that will be added to the changelog upon release.\n\nTo create a new changeset, run `pnpm changeset`. This will run the Changesets CLI, prompting you for details about the change. You’ll be able to edit the file after it’s created — don’t worry about getting everything perfect up front.\n\nEven though you can technically use any markdown formatting you like, headings should be avoided since each changeset will ultimately be nested within a bullet list. Instead, bold text should be used as section headings.\n\nIf your PR is making changes to an area that already has a changeset (e.g. there’s an existing changeset covering theme API changes but you’re making further changes to the same API), you should update the existing changeset in your PR rather than creating a new one.\n\n### Releasing to npm\n\nThe first time a PR with a changeset is merged after a release, a new PR will automatically be created called `chore: version packages`. Any subsequent PRs with changesets will automatically update this existing version packages PR. Merging this PR triggers the release process by publishing to npm and cleaning up the changeset files.\n\n### Creating a snapshot release\n\nIf a PR has changesets, you can create a [snapshot release](https://github.com/changesets/changesets/blob/main/docs/snapshot-releases.md) by [manually dispatching](https://github.com/wevm/wagmi/actions/workflows/canary.yml) the Canary workflow. This publishes a tagged version to npm with the PR branch name and timestamp.\n\n## 10. Updating dependencies\n\nUse [Taze](https://github.com/antfu/taze) by running:\n\n```bash\npnpm deps       # prints outdated deps\npnpm deps patch # print outdated deps with new patch versions\npnpm deps -w    # updates deps (best done with clean working tree)\n```\n\nUpdate GitHub Actions via [Actions Up!](https://github.com/azat-io/actions-up) by running:\n\n```bash\npnpm deps:ci\n```\n\n[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.\n"
  },
  {
    "path": "site/dev/creating-connectors.md",
    "content": "# Creating Connectors\n\nThanks for your interest in adding a new connector to Wagmi! Please take a moment to review this document **before starting work on a new connector.**\n\n## Overview\n\nThis guide details how to create new connectors and upstream them back into Wagmi. By following these steps, you will understand the development process, workflow, and requirements for new connectors. **Not all connectors will be accepted into Wagmi** for a variety of reasons outlined in this document.\n\nIn addition, for connector requests to be accepted, the team creating the connector must [sponsor Wagmi](https://github.com/sponsors/wevm). It takes time and effort to maintain third-party connectors. Wagmi is an OSS project that depends on sponsors and grants to continue our work. Please get in touch via [dev@wevm.dev](mailto:dev@wevm.dev) if you have questions about sponsoring.\n\n::: warning **Please ask first before starting work on a new connector.**\nTo avoid having your pull request declined after investing time and effort into a new connector, we ask that contributors create a [Connector Request](https://github.com/wevm/wagmi/discussions/new?category=connector-request) before starting work. This ensures the connector solves for an important or general use-case of interest to Wagmi users and is well supported by the Wagmi and connector teams.\n:::\n\n## 1. Follow the contributing guide\n\nCheck out the [Contributing Guide](/dev/contributing) to get your local development environment set up and learn more about the contributing workflow.\n\n## 2. Create a new file for the connector\n\nCreate a new file in `packages/connectors/src` named after the connector you want to add.\n\nFor 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.\n\n## 3. Create the connector object.\n\nImport `createConnector` from `@wagmi/core` and export a new function that accepts a parameters object and returns the `createConnector` result. This is the base of all connectors. The name of the connector name should be the same as the file name.\n\n```ts\nimport { createConnector } from '@wagmi/core'\n\nexport type FooBarBazParameters = {}\n\nexport function fooBarBaz(parameters: FooBarBazParameters = {}) {\n  return createConnector((config) => ({}))\n}\n```\n\n## 4. Add the missing properties to the object\n\nNow that the base of the connector is set up, you should see a type error that looks something like this:\n\n```ts twoslash\n// @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==\"}\n// @errors: 2740\nimport { createConnector } from '@wagmi/core'\n// ---cut---\ncreateConnector((config) => ({}))\n```\n\nThe type error tells you what properties are missing from `createConnector`'s return type. Add them all in!\n\n#### Properties\n\n- `icon`: Optional icon URL for the connector.\n- `id`: The ID for the connector. This should be camel-cased and as short as possible. Example: `fooBarBaz`.\n- `name`: Human-readable name for the connector. Example: `'Foo Bar Baz'`.\n- `rdns`: Optional reverse DNS for the connector. This is used to filter out duplicate [EIP-6963](https://eips.ethereum.org/EIPS/eip-6963) injected providers when `createConfig#multiInjectedProviderDiscovery` is enabled.\n\n#### Methods\n\n- `connect`: Function for connecting the connector.\n- `disconnect`: Function for disconnecting the connector.\n- `getAccounts`: Function that returns the connected accounts for the connector.\n- `getChainId`: Function that returns the connected chain ID for the connector.\n- `getProvider`: Function that returns the underlying provider interface for internal use throughout the connector.\n- `isAuthorized`: Function that returns whether the connector has connected previously and is still authorized.\n- `setup`: Optional function for running when the connector is first created.\n- `switchChain`: Optional function for switching the connector's active chain.\n\n#### Events\n\n- `onAccountsChanged`: Function for subscribing to account changes internally in the connector.\n- `onChainChanged`: Function for subscribing to chain changes internally in the connector.\n- `onConnect`: Function for subscribing to connection events internally in the connector.\n- `onDisconnect`: Function for subscribing to disconnection events internally in the connector.\n- `onMessage`: Optional function for subscribing to messages internally in the connector.\n\n#### Parameters\n\n`createConnector` also has the following config properties you can use within the connector:\n\n- `chains`: List of chains configured by the user.\n- `emitter`: Emitter for emitting events. Used to sync connector state with Wagmi `Config`. The following events are available:\n  - `change`: Emitted when the connected accounts or chain changes.\n  - `connect`: Emitted when the connector connects.\n  - `disconnect`: Emitted when the connector disconnects.\n  - `error`: Emitted when the connector receives an error.\n  - `message`: Emitted when the connector receives a message.\n- `storage`: Optional storage configured by the user. Defaults to wrapper around localStorage.\n\n::: tip\nIf you plan to use a third-party SDK, it should have minimal dependencies (limit bundle size, supply chain attacks, etc.) and use the most permissive license possible (ideally MIT). Any third-party packages, should also have [`\"sideEffects\": false`](https://webpack.js.org/guides/tree-shaking/#mark-the-file-as-side-effect-free) in their `package.json` file for maximum tree-shakability support.\n:::\n\n::: tip\nAll address values returned and emitted by the connector should be checksummed using Viem's [`getAddress`](https://viem.sh/docs/utilities/getAddress).\n:::\n\n## 5. Export the connector\n\nExport the connector from `packages/connectors/src/exports/index.ts` in alphabetic order.\n\n```ts\nexport { fooBarBaz } from './fooBarBaz.js'\n```\n\n## 6. Try out the connector and add tests\n\nWhile building a connector, it can be useful to try it out with Wagmi. You can use the [development playgrounds](/dev/contributing#_5-running-the-dev-playgrounds) for testing your changes.\n\nIdeally, you should also be able to add tests for the connector in a `connectorName.test.ts` file. This isn't always easy so at a minimum please create a test file with instructions for how to test the connector manually. The test file should include actual tests or \"instruction tests\" for the following:\n\n- How to connect the connector.\n- How to disconnect the connector.\n- How to switch the connector's active chain (if applicable).\n\nRemember to include all info required to test the connector, like software to install (browser extension, mobile app, etc.), smart contracts to interact with/deploy, etc.\n\nFinally, you should also update the test file in `packages/connectors/src/exports/index.test.ts` to include the new connector. You can do this manually or by running:\n\n```bash\npnpm test:update packages/connectors/src/exports/index.test.ts\n```\n\n## 7. Add your team to CODEOWNERS\n\nIt is critical that connectors are updated in a timely manner and actively maintained so that users of Wagmi can rely on them in production settings.\n\nThe Wagmi core team will provide as much assistance as possible to keep connectors up-to-date with breaking changes from Wagmi, but it is your responsibility to ensure that any dependencies and issues/discussions related to the connector are handled in a timely manner. If issues are not resolved in a timely manner, the connector may be removed from Wagmi.\n\nIn support of this goal, add at least one member of your team to the [CODEOWNERS](https://github.com/wevm/wagmi/blob/main/.github/CODEOWNERS) file so that you get notified of pull requests, issues, etc. related to the connector. You can add your team like this:\n\n```\n/packages/connectors/src/fooBarBaz @tmm @jxom\n```\n\nFor more info about GitHub code owners, check out the [GitHub Documentation](https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners).\n\n## 8. Document the connector\n\nThe connector should be documented. Follow the step on [writing documentation](/dev/contributing#_7-writing-documentation) to get set up with running the docs site locally and add the required pages.\n\n## 9. Create a changeset\n\nNow that the connector works and has tests, it's time to create a changeset to prepare for release. Run the following to create a changeset:\n\n```bash\npnpm changeset\n```\n\nThe changeset should be a `patch` applied to the `@wagmi/connectors` repository with the description `Added [ConnectorName]`, For example, `Added Foo Bar Baz`.\n\n## 10. Create a pull request\n\nThe connector is ready to go! Create a [pull request](/dev/contributing#_8-submitting-a-pull-request) and the connector should make it into a future release of Wagmi after some review.\n"
  },
  {
    "path": "site/index.md",
    "content": "---\n# https://vitepress.dev/reference/default-theme-home-page\nlayout: home\n\ndescription: Type Safe, Extensible, and Modular by design. Build high-performance blockchain frontends.\ntitle: 'Wagmi | Reactivity for Ethereum apps'\ntitleTemplate: false\n\nhero:\n  name: Wagmi\n  text: Reactivity for Ethereum apps\n  tagline: Type Safe, Extensible, and Modular by design. Build high-performance blockchain frontends.\n  actions:\n    - theme: brand\n      text: Get Started\n      link: /react/getting-started\n    - theme: alt\n      text: Why Wagmi\n      link: /react/why\n    - theme: alt\n      text: View on GitHub\n      link: https://github.com/wevm/wagmi\n  image:\n    src: /logo-dark.svg\n    alt: Wagmi Logo\n\nfeatures:\n  - icon: 🚀\n    title: 20+ React Hooks\n    details: React Hooks for accounts, wallets, contracts, transactions, signing, ENS, and more.\n    link: /react/api/hooks\n    linkText: See all hooks\n  - icon: 🦄\n    title: TypeScript Ready\n    details: Infer types from ABIs and EIP-712 Typed Data and autocomplete your way to productivity.\n    link: /react/typescript\n    linkText: Learn about TypeScript support\n  - icon: 💼\n    title: Connect Wallet\n    details: Official connectors for MetaMask, EIP-6963, WalletConnect, Coinbase Wallet, and more.\n    link: /react/api/connectors\n    linkText: See all connectors\n  - icon: 👟\n    title: Caching. Deduplication. Persistence.\n    details: Built-in caching, deduplication, persistence powered by TanStack Query.\n    link: /react/guides/tanstack-query\n    linkText: How to use TanStack Query\n  - icon: 🌳\n    title: Modular By Design\n    details: Don't use React, Vue, Solid? Use VanillaJS or build an adapter for your favorite framework.\n    link: /core/getting-started\n    linkText: Learn about Wagmi Core\n  - icon: ✌️\n    title: Built on Viem\n    details: The modern, low-level TypeScript interface for Ethereum that performs blockchain operations.\n    link: https://viem.sh\n    linkText: Check out Viem\n---\n"
  },
  {
    "path": "site/package.json",
    "content": "{\n  \"name\": \"site\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"dev\": \"vitepress dev\",\n    \"build\": \"NODE_OPTIONS=\\\"--max-old-space-size=16384\\\" vitepress build\",\n    \"preview\": \"vitepress preview\"\n  },\n  \"devDependencies\": {\n    \"@shikijs/vitepress-twoslash\": \"3.20.0\",\n    \"@tanstack/query-core\": \"catalog:\",\n    \"@tanstack/react-query\": \"catalog:\",\n    \"@tanstack/vue-query\": \"catalog:\",\n    \"@types/react\": \"catalog:\",\n    \"@wagmi/connectors\": \"workspace:*\",\n    \"@wagmi/core\": \"workspace:*\",\n    \"@wagmi/solid\": \"workspace:*\",\n    \"@wagmi/vue\": \"workspace:*\",\n    \"abitype\": \"*\",\n    \"nuxt\": \"^3.19.2\",\n    \"react\": \"catalog:\",\n    \"solid-js\": \"catalog:\",\n    \"unocss\": \"^66.5.6\",\n    \"viem\": \"~2.46.0\",\n    \"vitepress\": \"1.6.3\",\n    \"vitepress-plugin-group-icons\": \"^1.6.5\",\n    \"vitepress-plugin-llms\": \"1.11.1\",\n    \"vue\": \"catalog:\",\n    \"wagmi\": \"workspace:*\"\n  }\n}\n"
  },
  {
    "path": "site/react/api/WagmiProvider.md",
    "content": "# WagmiProvider\n\nReact Context Provider for Wagmi.\n\n## Import\n\n```ts\nimport { WagmiProvider } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [app.tsx]\nimport { WagmiProvider } from 'wagmi'\nimport { config } from './config' \n\nfunction App() {\n  return (\n    <WagmiProvider config={config}> \n      {/** ... */}\n    </WagmiProvider>\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type WagmiProviderProps } from 'wagmi'\n```\n\n### config\n\n[`Config`](/react/api/createConfig#config) object to inject with context.\n\n::: code-group\n```tsx [app.tsx]\nimport { WagmiProvider } from 'wagmi'\nimport { config } from './config' \n\nfunction App() {\n  return (\n    <WagmiProvider\n      config={config} // [!code focus]\n    >\n      {/** ... */}\n    </WagmiProvider>\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### initialState\n\n`State | undefined`\n\n- Initial state to hydrate into the [Wagmi Config](/react/api/createConfig). Useful for SSR.\n\n::: code-group\n```tsx [app.tsx]\nimport { WagmiProvider } from 'wagmi'\nimport { config } from './config' \n\nfunction App() {\n  return (\n    <WagmiProvider\n      config={config}\n      initialState={/* ... /*} // [!code focus]\n    >\n      {/** ... */}\n    </WagmiProvider>\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### reconnectOnMount\n\n`boolean | undefined`\n\n- Whether or not to reconnect previously connected [connectors](/react/api/createConfig#connectors) on mount.\n- Defaults to `true`.\n\n::: code-group\n```tsx [app.tsx]\nimport { WagmiProvider } from 'wagmi'\nimport { config } from './config' \n\nfunction App() {\n  return (\n    <WagmiProvider\n      config={config}\n      reconnectOnMount={false} // [!code focus]\n    >\n      {/** ... */}\n    </WagmiProvider>\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Context\n\n```ts\nimport { type WagmiContext } from 'wagmi'\n```\n"
  },
  {
    "path": "site/react/api/actions.md",
    "content": "# Actions\n\nSometimes the declarative nature of React Hooks doesn't work for parts of your app. For those cases, you can use Wagmi Core Actions directly!\n\nAll the Wagmi Core Actions are importable using the `wagmi/actions` entrypoint. For example, you can use the `watchBlockNumber` action to watch for block number changes.\n\n::: code-group\n```ts [index.tsx]\nimport { useConfig } from 'wagmi'\nimport { watchBlockNumber } from 'wagmi/actions'\nimport { useEffect } from 'react'\n\nfunction App() {\n  const config = useConfig()\n\n  useEffect(() => {\n    return watchBlockNumber(config, {\n      onBlockNumber(blockNumber) {\n        console.log('Block number changed!', blockNumber)\n      },\n    })\n  }, [])\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\nSee the [Wagmi Core docs](/core/api/actions) for more info on what actions are available.\n"
  },
  {
    "path": "site/react/api/chains.md",
    "content": "<script setup>\nimport packageJson from '../../../package.json'\nimport SearchChains from '../../components/SearchChains.vue'\n\nconst viemVersion = packageJson.devDependencies.viem\n</script>\n\n# Chains\n\nViem `Chain` objects. More info at the [Viem docs](https://viem.sh/docs/chains/introduction).\n\n## Import\n\nImport via the `'wagmi/chains'` entrypoint (proxies all chains from `'viem/chains'`).\n\n```ts\nimport { mainnet } from 'wagmi/chains'\n```\n\n## Available Chains\n\nChain definitions as of `viem@{{viemVersion}}`. For `viem@latest`, visit the [Viem repo](https://github.com/wevm/viem/blob/main/src/chains/index.ts).\n\n<SearchChains />\n\n<!--@include: @shared/create-chain.md-->\n"
  },
  {
    "path": "site/react/api/connectors/baseAccount.md",
    "content": "---\ntitle: baseAccount\n---\n\n<script setup>\nimport PackageMetadata from '../../../components/PackageMetadata.vue'\nimport packageJson from '../../../../packages/connectors/package.json'\n\nconst packageName = 'wagmi'\nconst connectorsPackageName = 'wagmi/connectors'\nconst connectorDependencyVersion = packageJson.peerDependencies['@base-org/account']\n</script>\n\n<!-- @include: @shared/connectors/baseAccount.md -->\n"
  },
  {
    "path": "site/react/api/connectors/coinbaseWallet.md",
    "content": "<script setup>\nimport PackageMetadata from '../../../components/PackageMetadata.vue'\nimport packageJson from '../../../../packages/connectors/package.json'\n\nconst packageName = 'wagmi'\nconst connectorsPackageName = 'wagmi/connectors'\nconst connectorDependencyVersion = packageJson.peerDependencies['@coinbase/wallet-sdk']\n</script>\n\n<!-- @include: @shared/connectors/coinbaseWallet.md -->\n"
  },
  {
    "path": "site/react/api/connectors/injected.md",
    "content": "---\ntitle: injected\n---\n\n<script setup>\nconst docsPath = 'react'\nconst packageName = 'wagmi'\nconst connectorsPackageName = 'wagmi/connectors'\n</script>\n\n<!-- @include: @shared/connectors/injected.md -->\n"
  },
  {
    "path": "site/react/api/connectors/metaMask.md",
    "content": "---\ntitle: metaMask\n---\n\n<script setup>\nimport PackageMetadata from '../../../components/PackageMetadata.vue'\nimport packageJson from '../../../../packages/connectors/package.json'\n\nconst docsPath = 'react'\nconst packageName = 'wagmi'\nconst connectorsPackageName = 'wagmi/connectors'\nconst connectorDependencyVersion = packageJson.peerDependencies['@metamask/connect-evm']\n</script>\n\n<!-- @include: @shared/connectors/metaMask.md -->\n"
  },
  {
    "path": "site/react/api/connectors/mock.md",
    "content": "---\ntitle: mock\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst connectorsPackageName = 'wagmi/connectors'\n</script>\n\n<!-- @include: @shared/connectors/mock.md -->\n"
  },
  {
    "path": "site/react/api/connectors/porto.md",
    "content": "---\ntitle: porto\n---\n\n<script setup>\nimport PackageMetadata from '../../../components/PackageMetadata.vue'\nimport packageJson from '../../../../packages/connectors/package.json'\n\nconst packageName = 'wagmi'\nconst connectorsPackageName = 'wagmi/connectors'\nconst connectorDependencyVersion = packageJson.peerDependencies['porto']\n</script>\n\n<!-- @include: @shared/connectors/porto.md -->\n"
  },
  {
    "path": "site/react/api/connectors/safe.md",
    "content": "---\ntitle: safe\n---\n\n<script setup>\nimport PackageMetadata from '../../../components/PackageMetadata.vue'\nimport packageJson from '../../../../packages/connectors/package.json'\n\nconst packageName = 'wagmi'\nconst connectorsPackageName = 'wagmi/connectors'\nconst connectorDependencyVersions = [\n  packageJson.peerDependencies['@safe-global/safe-apps-provider'],\n  packageJson.peerDependencies['@safe-global/safe-apps-sdk'],\n]\n</script>\n\n<!-- @include: @shared/connectors/safe.md -->\n"
  },
  {
    "path": "site/react/api/connectors/walletConnect.md",
    "content": "---\ntitle: walletConnect\n---\n\n<script setup>\nimport PackageMetadata from '../../../components/PackageMetadata.vue'\nimport packageJson from '../../../../packages/connectors/package.json'\n\nconst packageName = 'wagmi'\nconst connectorsPackageName = 'wagmi/connectors'\nconst connectorDependencyVersion = packageJson.peerDependencies['@walletconnect/ethereum-provider']\n</script>\n\n<!-- @include: @shared/connectors/walletConnect.md -->\n"
  },
  {
    "path": "site/react/api/connectors.md",
    "content": "<script setup>\nimport { getSidebar } from '../../.vitepress/sidebar'\n\nconst connectors = getSidebar()['/react']\n  .find(x => x.text.includes('Configuration')).items\n  .find(x => x.text.includes('Connectors')).items\n  .sort((a, b) => a.text.localeCompare(b.text))\n</script>\n\n# Connectors\n\nConnectors for popular wallet providers and protocols.\n\n## Import\n\nImport via the `'wagmi/connectors'` entrypoint.\n\n```ts\nimport { injected } from 'wagmi/connectors'\n```\n\n## Available Connectors\n\n::: tip\nSome connectors require third-party packages. See the \"Install\" section on each connector's page for more info on license, version, and more.\n:::\n\n<ul>\n  <li v-for=\"connector of connectors\">\n    <a :href=\"connector.link\">{{ connector.text }}</a>\n  </li>\n</ul>\n"
  },
  {
    "path": "site/react/api/createConfig.md",
    "content": "---\ntitle: createConfig\n---\n\n<script setup>\nconst docsPath = 'react'\nconst packageName = 'wagmi'\nconst connectorsPackageName = 'wagmi/connectors'\n</script>\n\n<!--@include: @shared/createConfig.md-->\n"
  },
  {
    "path": "site/react/api/createStorage.md",
    "content": "---\ntitle: createStorage\n---\n\n<script setup>\nconst docsPath = \"react\"\nconst packageName = 'wagmi'\n</script>\n\n<!--@include: @shared/createStorage.md-->\n"
  },
  {
    "path": "site/react/api/errors.md",
    "content": "<script setup>\nconst docsPath = \"react\"\nconst packageName = 'wagmi'\n</script>\n\n# Errors\n\nError classes used by Wagmi.\n\n<!--@include: @shared/errors.md-->\n\n## React\n\n### WagmiProviderNotFoundError\n\nWhen a Wagmi hook is used outside of a [`WagmiProvider`](/react/api/WagmiProvider).\n\n```ts\nimport { WagmiProviderNotFoundError } from 'wagmi'\n```"
  },
  {
    "path": "site/react/api/hooks/useBalance.md",
    "content": "---\ntitle: useBalance\ndescription: Hook for fetching native currency balance.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'getBalance'\nconst typeName = 'GetBalance'\nconst TData = '{ decimals: number; symbol: string; value: bigint; }'\nconst TError = 'GetBalanceErrorType'\n</script>\n\n# useBalance\n\nHook for fetching native currency balance.\n\n## Import\n\n```ts\nimport { useBalance } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useBalance } from 'wagmi'\n\nfunction App() {\n  const result = useBalance({\n    address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseBalanceParameters } from 'wagmi'\n```\n\n### address\n\n`Address | undefined`\n\nAddress to get balance for. [`enabled`](#enabled) set to `false` if `address` is `undefined`.\n\n::: code-group\n```tsx [index.tsx]\nimport { useBalance } from 'wagmi'\nimport { mainnet } from 'wagmi/chains'\n\nfunction App() {\n  const result = useBalance({\n    address: '0x4557B18E779944BFE9d78A672452331C186a9f48', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n---\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to get balance at.\n\n::: code-group\n```ts [index.ts]\nimport { useBalance } from 'wagmi'\n\nfunction App() {\n  const result = useBalance({\n    address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n    blockNumber: 17829139n, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to get balance at.\n\n::: code-group\n```ts [index.ts]\nimport { useBalance } from 'wagmi'\n\nfunction App() {\n  const result = useBalance({\n    address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n    blockTag: 'latest', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```tsx [index.tsx]\nimport { useBalance } from 'wagmi'\nimport { mainnet } from 'wagmi/chains' // [!code focus]\n\nfunction App() {\n  const result = useBalance({\n    address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n    chainId: mainnet.id, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useBalance } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useBalance({\n    address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```tsx [index.tsx]\nimport { useBalance } from 'wagmi'\n\nfunction App() {\n  const result = useBalance({\n    address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n    scopeKey: 'foo', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseBalanceReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getBalance`](/core/api/actions/getBalance)\n"
  },
  {
    "path": "site/react/api/hooks/useBlobBaseFee.md",
    "content": "---\ntitle: useBlobBaseFee\ndescription: Hook for fetching the current blob base fee (in wei).\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'getBlobBaseFee'\nconst typeName = 'GetBlobBaseFee'\nconst TData = 'bigint'\nconst TError = 'GetBlobBaseFeeErrorType'\n</script>\n\n# useBlobBaseFee\n\nHook for fetching the current blob base fee (in wei).\n\n## Import\n\n```ts\nimport { useBlobBaseFee } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlobBaseFee } from 'wagmi'\n\nfunction App() {\n  const result = useBlobBaseFee()\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseBlobBaseFeeParameters } from 'wagmi'\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlobBaseFee } from 'wagmi'\nimport { mainnet } from 'wagmi/chains' // [!code focus]\n\nfunction App() {\n  const result = useBlobBaseFee({\n    chainId: mainnet.id, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlobBaseFee } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useBlobBaseFee({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlobBaseFee } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useBlobBaseFee({\n    scopeKey: 'foo', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseBlobBaseFeeReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getBlobBaseFee`](/core/api/actions/getBlobBaseFee)\n"
  },
  {
    "path": "site/react/api/hooks/useBlock.md",
    "content": "---\ntitle: useBlock\ndescription: Hook for fetching information about a block at a block number, hash or tag.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'getBlock'\nconst typeName = 'GetBlock'\nconst TData = 'GetBlockData'\nconst TError = 'GetBlockErrorType'\n</script>\n\n# useBlock\n\nHook for fetching information about a block at a block number, hash or tag.\n\n## Import\n\n```ts\nimport { useBlock } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlock } from 'wagmi'\n\nfunction App() {\n  const result = useBlock()\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseBlockParameters } from 'wagmi'\n```\n\n### blockHash\n\n`` `0x${string}` ``\n\nInformation at a given block hash.\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlock } from 'wagmi'\n\nfunction App() {\n  const result = useBlock({\n    blockHash: '0x89644bbd5c8d682a2e9611170e6c1f02573d866d286f006cbf517eec7254ec2d' // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockNumber\n\n`` bigint ``\n\nInformation at a given block number.\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlock } from 'wagmi'\n\nfunction App() {\n  const result = useBlock({\n    blockNumber: 42069n // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockTag\n\n`` 'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' ``\n\nInformation at a given block tag. Defaults to `'latest'`.\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlock } from 'wagmi'\n\nfunction App() {\n  const result = useBlock({\n    blockTag: 'pending' // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlock } from 'wagmi'\nimport { mainnet } from 'wagmi/chains' // [!code focus]\n\nfunction App() {\n  const result = useBlock({\n    chainId: mainnet.id, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlock } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useBlock({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### includeTransactions\n\n`boolean`\n\nWhether or not to include transactions as objects.\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlock } from 'wagmi'\nimport { config } from './config'\n\nfunction App() {\n  const result = useBlock({\n    includeTransactions: true // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlock } from 'wagmi'\nimport { config } from './config'\n\nfunction App() {\n  const result = useBlock({\n    scopeKey: 'foo' // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### watch\n\n`boolean | UseWatchBlockParameters | undefined`\n\n- Enables/disables listening for block changes.\n- Can pass a subset of [`UseWatchBlocksParameters`](/react/api/hooks/useWatchBlocks#parameters) directly to [`useWatchBlocks`](/react/api/hooks/useWatchBlocks).\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlock } from 'wagmi'\n\nfunction App() {\n  const result = useBlock({\n    watch: true, // [!code focus]\n  })\n}\n```\n\n```tsx [index-2.tsx]\nimport { useBlock } from 'wagmi'\n\nfunction App() {\n  const result = useBlock({\n    watch: { // [!code focus]\n      pollingInterval: 4_000, // [!code focus]\n    }, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseBlockReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getBlock`](/core/api/actions/getBlock)\n- [`watchBlockNumber`](/core/api/actions/watchBlockNumber)\n"
  },
  {
    "path": "site/react/api/hooks/useBlockNumber.md",
    "content": "---\ntitle: useBlockNumber\ndescription: Hook for fetching the number of the most recent block seen.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'getBlockNumber'\nconst typeName = 'GetBlockNumber'\nconst TData = 'bigint'\nconst TError = 'GetBlockNumberErrorType'\n</script>\n\n# useBlockNumber\n\nHook for fetching the number of the most recent block seen.\n\n## Import\n\n```ts\nimport { useBlockNumber } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlockNumber } from 'wagmi'\n\nfunction App() {\n  const result = useBlockNumber()\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseBlockNumberParameters } from 'wagmi'\n```\n\n### cacheTime\n\n`number | undefined`\n\nTime in milliseconds that cached block number will remain in memory.\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlockNumber } from 'wagmi'\n\nfunction App() {\n  const result = useBlockNumber({\n    cacheTime: 4_000, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlockNumber } from 'wagmi'\nimport { mainnet } from 'wagmi/chains' // [!code focus]\n\nfunction App() {\n  const result = useBlockNumber({\n    chainId: mainnet.id, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlockNumber } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useBlockNumber({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlockNumber } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useBlockNumber({\n    scopeKey: 'foo', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### watch\n\n`boolean | UseWatchBlockNumberParameters | undefined`\n\n- Enables/disables listening for block number changes.\n- Can pass a subset of [`UseWatchBlockNumberParameters`](/react/api/hooks/useWatchBlockNumber#parameters)directly to [`useWatchBlockNumber`](/react/api/hooks/useWatchBlockNumber).\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlockNumber } from 'wagmi'\n\nfunction App() {\n  const result = useBlockNumber({\n    watch: true, // [!code focus]\n  })\n}\n```\n\n```tsx [index-2.tsx]\nimport { useBlockNumber } from 'wagmi'\n\nfunction App() {\n  const result = useBlockNumber({\n    watch: { // [!code focus]\n      pollingInterval: 4_000, // [!code focus]\n    }, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseBlockNumberReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getBlockNumber`](/core/api/actions/getBlockNumber)\n- [`watchBlockNumber`](/core/api/actions/watchBlockNumber)\n"
  },
  {
    "path": "site/react/api/hooks/useBlockTransactionCount.md",
    "content": "---\ntitle: useBlockTransactionCount\ndescription: Hook for fetching the number of Transactions at a block number, hash or tag.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'getBlockTransactionCount'\nconst typeName = 'GetBlockTransactionCount'\nconst TData = 'bigint'\nconst TError = 'GetBlockTransactionCountErrorType'\n</script>\n\n# useBlockTransactionCount\n\nHook for fetching the number of Transactions at a block number, hash or tag.\n\n## Import\n\n```ts\nimport { useBlockTransactionCount } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlockTransactionCount } from 'wagmi'\n\nfunction App() {\n  const result = useBlockTransactionCount()\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseBlockTransactionCountParameters } from 'wagmi'\n```\n\n### blockHash\n\n`` `0x${string}` ``\n\nTransaction count at a given block hash.\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlock } from 'wagmi'\n\nfunction App() {\n  const result = useBlock({\n    blockHash: '0x89644bbd5c8d682a2e9611170e6c1f02573d866d286f006cbf517eec7254ec2d' // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockNumber\n\n`` bigint ``\n\nTransaction count at a given block number.\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlock } from 'wagmi'\n\nfunction App() {\n  const result = useBlock({\n    blockNumber: 42069n // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockTag\n\n`` 'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' ``\n\nTransaction count at a given block tag. Defaults to `'latest'`.\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlock } from 'wagmi'\n\nfunction App() {\n  const result = useBlock({\n    blockTag: 'pending' // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlock } from 'wagmi'\nimport { mainnet } from 'wagmi/chains' // [!code focus]\n\nfunction App() {\n  const result = useBlock({\n    chainId: mainnet.id, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlockTransactionCount } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useBlockTransactionCount({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlockTransactionCount } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useBlockTransactionCount({\n    scopeKey: 'foo', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseBlockTransactionCountReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getBlockTransactionCount`](/core/api/actions/getBlockTransactionCount)\n"
  },
  {
    "path": "site/react/api/hooks/useBytecode.md",
    "content": "---\ntitle: useBytecode\ndescription: Hook for retrieving the bytecode at an address.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'getBytecode'\nconst typeName = 'GetBytecode'\nconst TData = 'GetBytecodeData'\nconst TError = 'GetBytecodeErrorType'\n</script>\n\n# useBytecode\n\nHook for retrieving the bytecode at an address.\n\n## Import\n\n```ts\nimport { useBytecode } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useBytecode } from 'wagmi'\n\nfunction App() {\n  const result = useBytecode({\n    address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseBytecodeParameters } from 'wagmi'\n```\n\n### address\n\n`Address | undefined`\n\nThe contract address.\n\n::: code-group\n```tsx [index.tsx]\nimport { useBytecode } from 'wagmi'\n\nfunction App() {\n  const result = useBytecode({\n    address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockNumber\n\n`bigint | undefined`\n\nThe block number to check the bytecode at.\n\n::: code-group\n```tsx [index.tsx]\nimport { useBytecode } from 'wagmi'\n\nfunction App() {\n  const result = useBytecode({\n    address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n    blockNumber: 16280770n, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nThe block tag to check the bytecode at.\n\n::: code-group\n```tsx [index.tsx]\nimport { useBytecode } from 'wagmi'\n\nfunction App() {\n  const result = useBytecode({\n    address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n    blockTag: 'safe', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nThe chain ID to check the bytecode at.\n\n::: code-group\n```tsx [index.tsx]\nimport { useBytecode } from 'wagmi'\nimport { mainnet } from 'wagmi/chains'\n\nfunction App() {\n  const result = useBytecode({\n    chainId: mainnet.id, // [!code focus]\n    address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useBytecode } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useBytecode({\n    config, // [!code focus]\n    address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```tsx [index.tsx]\nimport { useBytecode } from 'wagmi'\nimport { config } from './config'\n\nfunction App() {\n  const result = useBytecode({\n    scopeKey: 'foo' // [!code focus]\n    address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseBytecodeReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getBytecode`](/core/api/actions/getBytecode)\n"
  },
  {
    "path": "site/react/api/hooks/useCall.md",
    "content": "---\ntitle: useCall\ndescription: Hook for executing a new message call immediately without submitting a transaction to the network.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'call'\nconst typeName = 'Call'\nconst TData = 'CallData'\nconst TError = 'CallErrorType'\n</script>\n\n# useCall\n\nHook for executing a new message call immediately without submitting a transaction to the network.\n\n## Import\n\n```ts\nimport { useCall } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useCall } from 'wagmi'\n\nfunction App() {\n  const result = useCall({\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseCallParameters } from 'wagmi'\n```\n\n### account\n\n`Account | Address | undefined`\n\nThe Account to call from.\n\n::: code-group\n```tsx [index.tsx]\nimport { useCall } from 'wagmi'\n\nfunction App() {\n  const result = useCall({\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', // [!code focus]\n    data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### data\n\n`0x${string} | undefined`\n\nA contract hashed method call with encoded args.\n\n::: code-group\n```tsx [index.tsx]\nimport { useCall } from 'wagmi'\n\nfunction App() {\n  const result = useCall({\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', // [!code focus]\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### to\n\n`Address | undefined`\n\nThe contract address or recipient.\n\n::: code-group\n```tsx [index.tsx]\nimport { useCall } from 'wagmi'\n\nfunction App() {\n  const result = useCall({\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### accessList\n\n`AccessList | undefined`\n\nThe access list.\n\n::: code-group\n```tsx [index.tsx]\nimport { useCall } from 'wagmi'\n\nfunction App() {\n  const result = useCall({\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    accessList: [ // [!code focus:6] \n      {\n        address: '0x1',\n        storageKeys: ['0x1'],\n      },\n    ],\n    data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### gas\n\n`bigint | undefined`\n\nThe gas provided for transaction execution.\n\n::: code-group\n```tsx [index.tsx]\nimport { useCall } from 'wagmi'\n\nfunction App() {\n  const result = useCall({\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n    gas: 1_000_000n, // [!code focus]\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### gasPrice\n\n`bigint | undefined`\n\nThe price (in wei) to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms#legacy-transaction).\n\n::: code-group\n```tsx [index.tsx]\nimport { useCall } from 'wagmi'\n\nfunction App() {\n  const result = useCall({\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n    gasPrice: parseGwei('20'), // [!code focus]\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### maxFeePerGas\n\n`bigint | undefined`\n\nTotal fee per gas (in wei), inclusive of `maxPriorityFeePerGas`. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n```tsx [index.tsx]\nimport { useCall } from 'wagmi'\n\nfunction App() {\n  const result = useCall({\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n    maxFeePerGas: parseGwei('20'), // [!code focus]\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### maxPriorityFeePerGas\n\n`bigint | undefined`\n\nMax priority fee per gas (in wei). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n```tsx [index.tsx]\nimport { useCall } from 'wagmi'\n\nfunction App() {\n  const result = useCall({\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n    maxFeePerGas: parseGwei('20'),\n    maxPriorityFeePerGas: parseGwei('2'), // [!code focus]\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### nonce\n\n`number | undefined`\n\nUnique number identifying this transaction.\n\n::: code-group\n```tsx [index.tsx]\nimport { useCall } from 'wagmi'\n\nfunction App() {\n  const result = useCall({\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n    nonce: 420, // [!code focus]\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### value\n\n`bigint | undefined`\n\nValue (in wei) sent with this transaction.\n\n::: code-group\n```tsx [index.tsx]\nimport { useCall } from 'wagmi'\n\nfunction App() {\n  const result = useCall({\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n    value: parseEther('1'), // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockNumber\n\n`number | undefined`\n\nThe block number to perform the call against.\n\n::: code-group\n```tsx [index.tsx]\nimport { useCall } from 'wagmi'\n\nfunction App() {\n  const result = useCall({\n    blockNumber: 15121123n, // [!code focus]\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nThe block tag to perform the call against.\n\n::: code-group\n```tsx [index.tsx]\nimport { useCall } from 'wagmi'\n\nfunction App() {\n  const result = useCall({\n    blockTag: 'safe', // [!code focus]\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nThe block tag to perform the call against.\n\n::: code-group\n```tsx [index.tsx]\nimport { useCall } from 'wagmi'\nimport { mainnet } from '@wagmi/core/chains'\n\nfunction App() {\n  const result = useCall({\n    chainId: mainnet.id, // [!code focus]\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useCall } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useCall({\n    config, // [!code focus]\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```tsx [index.tsx]\nimport { useCall } from 'wagmi'\nimport { config } from './config'\n\nfunction App() {\n  const result = useCall({\n    scopeKey: 'foo' // [!code focus]\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseCallReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`call`](/core/api/actions/call)\n"
  },
  {
    "path": "site/react/api/hooks/useCallsStatus.md",
    "content": "---\ntitle: useCallsStatus\ndescription: Hook for fetching the number of the most recent block seen.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'getCallsStatus'\nconst typeName = 'GetCallsStatus'\nconst TData = 'GetCallsStatusReturnType'\nconst TError = 'GetCallsStatusErrorType'\n</script>\n\n# useCallsStatus\n\nHook to fetch the status and receipts of a call batch that was sent via [`useSendCalls`](/react/api/hooks/useSendCalls).\n\n \n\n## Import\n\n```ts\nimport { useCallsStatus } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useCallsStatus } from 'wagmi'\n\nfunction App() {\n  const result = useCallsStatus({\n    id: '0x...', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseCallsStatusParameters } from 'wagmi'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useCallsStatus } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useCallsStatus({\n    config, // [!code focus]\n    id: '0x...',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### connector\n\n`Connector | undefined`\n\nConnector to get call statuses with.\n\n::: code-group\n```tsx [index.tsx]\nimport { useCallsStatus, useConnections } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const connections = useConnections()\n  const result = useCallsStatus({\n    connector: connections[0]?.connector, // [!code focus]\n    id: '0x...',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### id\n\n`string`\n\nIdentifier of the call batch.\n\n::: code-group\n```ts [index.ts]\nimport { useCallsStatus } from '@wagmi/core'\nimport { config } from './config'\n\nconst status = await useCallsStatus({\n  id: '0x1234567890abcdef', // [!code focus]\n})\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```tsx [index.tsx]\nimport { useCallsStatus } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useCallsStatus({\n    id: '0x...',\n    scopeKey: 'foo', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseCallsStatusReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getCallsStatus`](https://viem.sh/docs/actions/wallet/getCallsStatus)"
  },
  {
    "path": "site/react/api/hooks/useCapabilities.md",
    "content": "---\ntitle: useCapabilities\ndescription: Hook for fetching the number of the most recent block seen.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'getCapabilities'\nconst typeName = 'GetCapabilities'\nconst TData = 'GetCapabilitiesReturnType'\nconst TError = 'GetCapabilitiesErrorType'\n</script>\n\n# useCapabilities\n\nHook to extract capabilities (grouped by chain ID) that a connected wallet supports (e.g. paymasters, session keys, etc).\n\n[Read more.](https://github.com/ethereum/EIPs/blob/815028dc634463e1716fc5ce44c019a6040f0bef/EIPS/eip-5792.md#wallet_getcapabilities)\n\n## Import\n\n```ts\nimport { useCapabilities } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useCapabilities } from 'wagmi'\n\nfunction App() {\n  const result = useCapabilities()\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseCapabilitiesParameters } from 'wagmi'\n```\n\n### account\n\n`Account | Address | undefined`\n\nFetch capabilities for the provided account.\n\n::: code-group\n```ts [index.ts]\nimport { useCapabilities } from '@wagmi/core'\nimport { config } from './config'\n\nconst status = await useCapabilities({\n  account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', // [!code focus]\n})\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useCapabilities } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useCapabilities({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### connector\n\n`Connector | undefined`\n\nConnector to get call statuses with.\n\n::: code-group\n```tsx [index.tsx]\nimport { useCapabilities, useConnections } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const connections = useConnections()\n  const result = useCapabilities({\n    connector: connections[0]?.connector, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```tsx [index.tsx]\nimport { useCapabilities } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useCapabilities({\n    scopeKey: 'foo', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseCapabilitiesReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getCapabilities`](https://viem.sh/docs/actions/wallet/getCapabilities)"
  },
  {
    "path": "site/react/api/hooks/useChainId.md",
    "content": "---\ntitle: useChainId\ndescription: Hook for getting current chain ID.\n---\n\n# useChainId\n\nHook for getting current chain ID.\n\n## Import\n\n```ts\nimport { useChainId } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useChainId } from 'wagmi'\n\nfunction App() {\n  const chainId = useChainId()\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseChainIdParameters } from 'wagmi'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useChainId } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const chainId = useChainId({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type UseChainIdReturnType } from 'wagmi'\n```\n\n`number`\n\nCurrent chain ID from [`config.state.chainId`](/react/api/createConfig#chainid).\n\n::: info\nOnly returns chain IDs for chains configured via `createConfig`'s [`chains`](/react/api/createConfig#chains) parameter.\n\nIf the active [connection](/react/api/createConfig#connection) [`chainId`](/react/api/createConfig#chainid-1) is not from a chain included in your Wagmi `Config`, `useChainId` will return the last configured chain ID.\n:::\n\n## Action\n\n- [`getChainId`](/core/api/actions/getChainId)\n- [`watchChainId`](/core/api/actions/watchChainId)\n"
  },
  {
    "path": "site/react/api/hooks/useChains.md",
    "content": "---\ntitle: useChains\ndescription: Hook for getting configured chains\n---\n\n# useChains\n\nHook for getting configured chains\n\n## Import\n\n```ts\nimport { useChains } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useChains } from 'wagmi'\n\nfunction App() {\n  const chains = useChains()\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseChainsParameters } from 'wagmi'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useChains } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const chains = useChains({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type UseChainsReturnType } from 'wagmi'\n```\n\n`readonly [Chain, ...Chain[]]`\n\nChains from [`config.chains`](/react/api/createConfig#chains).\n\n## Action\n\n- [`getChains`](/core/api/actions/getChains)\n"
  },
  {
    "path": "site/react/api/hooks/useClient.md",
    "content": "---\ntitle: useClient\ndescription: Hook for getting Viem `Client` instance.\n---\n\n# useClient\n\nHook for getting Viem [`Client`](https://viem.sh/docs/clients/custom) instance.\n\n## Import\n\n```ts\nimport { useClient } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useClient } from 'wagmi'\n\nfunction App() {\n  const client = useClient()\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseClientParameters } from 'wagmi'\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when getting Viem Client.\n\n::: code-group\n```ts [index.ts]\nimport { useClient } from 'wagmi'\nimport { mainnet } from 'wagmi/chains' // [!code focus]\nimport { config } from './config'\n\nfunction App() {\n  const client = useClient({\n    chainId: mainnet.id, // [!code focus]\n  })\n}\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useClient } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const client = useClient({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type UseClientReturnType } from 'wagmi'\n```\n\n`Client | undefined`\n\nViem [`Client`](https://viem.sh/docs/clients/custom) instance.\n\n## Action\n\n- [`getClient`](/core/api/actions/getClient)\n- [`watchClient`](/core/api/actions/watchClient)\n"
  },
  {
    "path": "site/react/api/hooks/useConfig.md",
    "content": "---\ntitle: useConfig\ndescription: Hook for getting `Config` from nearest `WagmiProvider`.\n---\n\n# useConfig\n\nHook for getting [`Config`](/react/api/createConfig#config) from nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n## Import\n\n```ts\nimport { useConfig } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useConfig } from 'wagmi'\n\nfunction App() {\n  const config = useConfig()\n}\n```\n\n:::\n\n## Return Type\n\n```ts\nimport { type UseConfigReturnType } from 'wagmi'\n```\n\nIf you use TypeScript and [register your `Config`](/react/typescript#register-config), the return type will be inferred.\n\n::: code-group\n```ts twoslash [index.tsx]\n// @twoslash-cache: {\"v\":1,\"hash\":\"914af31f2d67af9b6a0eb3594b780105455023fedc851e1b259e6312534bc63b\",\"data\":\"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\"}\nimport { type Config } from 'wagmi'\nimport { mainnet, sepolia } from 'wagmi/chains'\n\ndeclare module 'wagmi' {\n  interface Register {\n    config: Config<readonly [typeof mainnet, typeof sepolia]>\n  }\n}\n// ---cut---\nimport { useConfig } from 'wagmi'\n\nfunction App() {\n  const config = useConfig()\n  //    ^?\n}\n```\n\n```ts [config.ts]\nimport { createConfig, http } from 'wagmi'\nimport { mainnet, sepolia } from 'wagmi/chains'\n\ndeclare module 'wagmi' {\n  interface Register {\n    config: typeof config\n  }\n}\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n```\n\n:::\n"
  },
  {
    "path": "site/react/api/hooks/useConnect.md",
    "content": "---\ntitle: useConnect\ndescription: Hook for connecting accounts with connectors.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'connect'\nconst typeName = 'Connect'\nconst mutate = 'connect'\nconst TData = '{ accounts: readonly [Address, ...Address[]]; chainId: number; }'\nconst TError = 'ConnectErrorType'\nconst TVariables = '{ chainId?: number | undefined; connector?: CreateConnectorFn | Connector | undefined; withCapabilities?: boolean | undefined }'\n</script>\n\n# useConnect\n\nHook for connecting accounts with [connectors](/react/api/connectors).\n\n## Import\n\n```ts\nimport { useConnect } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useConnect } from 'wagmi'\nimport { injected } from 'wagmi/connectors'\n\nfunction App() {\n  const connect = useConnect()\n  return (\n    <button onClick={() => connect.mutate({ connector: injected() })}>\n      Connect\n    </button>\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseConnectParameters } from 'wagmi'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useConnect } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const connect = useConnect({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseConnectReturnType } from 'wagmi'\n```\n\n### connectors <Badge type=\"warning\">[deprecated](/react/guides/migrate-from-v2-to-v3#removed-useconnect-connectors-usereconnect-connectors)</Badge>\n\n`readonly Connector[]`\n\nGlobally configured connectors via [`createConfig`](/react/api/createConfig#connectors). Useful for rendering a list of available connectors.\n\n::: code-group\n```tsx [index.tsx]\nimport { useConnect } from 'wagmi'\n\nfunction App() {\n  const connect = useConnect()\n\n  return (\n    <div>\n      {connect.connectors.map((connector) => (\n        <button key={connector.id} onClick={() => connect.mutate({ connector })}>\n          {connector.name}\n        </button>\n      ))}\n    </div>\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-result.md-->\n\n::: tip\nNot all connectors support connecting directly to a `chainId` (e.g. they don't support programmatic chain switching). In those cases, the connector will connect to whatever chain the connector's provider (e.g. wallet) is connected to.\n:::\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`connect`](/core/api/actions/connect)\n"
  },
  {
    "path": "site/react/api/hooks/useConnection.md",
    "content": "---\ntitle: useConnection\ndescription: Hook for getting current connection.\n---\n\n# useConnection\n\nHook for getting current connection.\n\n## Import\n\n```ts\nimport { useConnection } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useConnection } from 'wagmi'\n\nfunction App() {\n  const connection = useConnection()\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseConnectionParameters } from 'wagmi'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useConnection } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const connection = useConnection({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type UseConnectionReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/getConnection-return-type.md-->\n\n## Action\n\n- [`getConnection`](/core/api/actions/getConnection)\n"
  },
  {
    "path": "site/react/api/hooks/useConnectionEffect.md",
    "content": "---\ntitle: useConnectionEffect\ndescription: Hook for listening to connection lifecycle events.\n---\n\n# useConnectionEffect\n\nHook for listening to connection lifecycle events.\n\n## Import\n\n```ts\nimport { useConnectionEffect } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useConnectionEffect } from 'wagmi'\n\nfunction App() {\n  useConnectionEffect({\n    onConnect(data) {\n      console.log('Connected!', data)\n    },\n    onDisconnect() {\n      console.log('Disconnected!')\n    },\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseConnectionEffectParameters } from 'wagmi'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useConnectionEffect } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  useConnectionEffect({\n    config, // [!code focus]\n    onConnect(data) {\n      console.log('Connected!', data)\n    },\n    onDisconnect() {\n      console.log('Disconnected!')\n    },\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### onConnect\n\n`` ((data: { address: `0x${string}`; addresses: readonly [`0x${string}`, ...`0x${string}`[]]; chain: Chain | undefined chainId: number; connector: Connector; isReconnected: boolean }) => void) | undefined ``\n\nCallback that is called when connection is made.\n\n::: code-group\n```tsx [index.tsx]\nimport { useConnectionEffect } from 'wagmi'\n\nfunction App() {\n  useConnectionEffect({\n    onConnect(data) { // [!code focus]\n      console.log('Connected!', data) // [!code focus]\n    }, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### onDisconnect\n\n`(() => void) | undefined`\n\nCallback that is called when there no more connections.\n\n::: code-group\n```tsx [index.tsx]\nimport { useConnectionEffect } from 'wagmi'\n\nfunction App() {\n  useConnectionEffect({\n    onDisconnect() { // [!code focus]\n      console.log('Disconnected!') // [!code focus]\n    }, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Action\n\n- [`getConnection`](/core/api/actions/getConnection)\n- [`watchConnection`](/core/api/actions/watchConnection)\n"
  },
  {
    "path": "site/react/api/hooks/useConnections.md",
    "content": "---\ntitle: useConnections\ndescription: Hook for getting active connections.\n---\n\n# useConnections\n\nHook for getting active connections.\n\n## Import\n\n```ts\nimport { useConnections } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useConnections } from 'wagmi'\n\nfunction App() {\n  const connections = useConnections()\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseConnectionsParameters } from 'wagmi'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useConnections } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const connections = useConnections({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type UseConnectionsReturnType } from 'wagmi'\n```\n\n## Action\n\n- [`getConnections`](/core/api/actions/getConnections)\n- [`watchConnections`](/core/api/actions/watchConnections)\n"
  },
  {
    "path": "site/react/api/hooks/useConnectorClient.md",
    "content": "---\ntitle: useConnectorClient\ndescription: Hook for getting a Viem `Client` object for the current or provided connector.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'getConnectorClient'\nconst typeName = 'GetConnectorClient'\nconst TData = 'Client'\nconst TError = 'GetConnectorClientErrorType'\nconst hideQueryOptions = ['gcTime', 'staleTime']\n</script>\n\n# useConnectorClient\n\nHook for getting a Viem [`Client`](https://viem.sh/docs/clients/custom) object for the current or provided connector.\n\n## Import\n\n```ts\nimport { useConnectorClient } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useConnectorClient } from 'wagmi'\n\nfunction App() {\n  const result = useConnectorClient()\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseConnectorClientParameters } from 'wagmi'\n```\n\n### account\n\n`Address | Account | undefined`\n\nAccount to use with client. Throws if account is not found on [`connector`](#connector).\n\n```ts\nimport { useConnectorClient } from 'wagmi'\n\nfunction App() {\n  const result = useConnectorClient({\n    account: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n  })\n}\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use with client.\n\n```ts\nimport { useConnectorClient } from 'wagmi'\n\nfunction App() {\n  const result = useConnectorClient({\n    chainId: mainnet.id, // [!code focus]\n  })\n}\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useConnectorClient } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useConnectorClient({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### connector\n\n`Connector | undefined`\n\n- Connector to get client for.\n- Defaults to current connector.\n\n```ts\nimport { useConnections, useConnectorClient } from 'wagmi'\n\nfunction App() {\n  const connections = useConnections(config)\n  const result = useConnectorClient({\n    connector: connections[0]?.connector, // [!code focus]\n  })\n}\n```\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseConnectorClientReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getConnectorClient`](/core/api/actions/getConnectorClient)\n"
  },
  {
    "path": "site/react/api/hooks/useConnectors.md",
    "content": "---\ntitle: useConnectors\ndescription: Hook for getting configured connectors.\n---\n\n# useConnectors\n\nHook for getting configured connectors.\n\n## Import\n\n```ts\nimport { useConnectors } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useConnectors } from 'wagmi'\n\nfunction App() {\n  const connectors = useConnectors()\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type UseConnectorsReturnType } from 'wagmi'\n```\n\n`readonly Connector[]`\n\nConnectors from [`config.connectors`](/react/api/createConfig#connectors-1).\n\n## Action\n\n- [`getConnectors`](/core/api/actions/getConnectors)\n"
  },
  {
    "path": "site/react/api/hooks/useContractEvents.md",
    "content": "---\ntitle: useContractEvents\ndescription: Hook that fetches a list of contract event logs matching the provided parameters.\n---\n\n# useContractEvents\n\nHook that fetches a list of contract event logs matching the provided parameters.\n\n## Import\n\n```ts\nimport { useContractEvents } from 'wagmi'\n```\n\n## Usage\n\nBy default, `useContractEvents` returns all matched events on the ABI. In practice, you must use scoping to filter for specific events.\n\n::: code-group\n```tsx [index.tsx]\nimport { useContractEvents } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  // Fetch event logs for every event on every ERC-20 contract. \n  const result = useContractEvents({ abi })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseContractEventsParameters } from 'wagmi'\n```\n\n### abi\n\n`Abi`\n\nThe contract's ABI. Check out the [TypeScript docs](/react/typescript#const-assert-abis-typed-data) for how to set up ABIs for maximum type inference and safety.\n\n::: code-group\n```tsx [index.tsx]\nimport { useContractEvents } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n const result = useContractEvents({\n    abi, // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### address\n\n`Address | undefined`\n\nThe contract's address.\n\n::: code-group\n```tsx [index.tsx]\nimport { useContractEvents } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useContractEvents({\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f', // [!code focus]\n    abi,\n  })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### args\n\n`object | readonly unknown[] | undefined`\n\n- Logs can be scoped to given indexed arguments.\n- Inferred from [`abi`](#abi) and [`eventName`](#eventname).\n\n::: code-group\n```tsx [index.tsx]\nimport { useContractEvents } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useContractEvents({\n    abi,\n    eventName: 'Transfer',\n    args: { // [!code focus]\n      from: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045', // [!code focus]\n      to: '0xd2135CfB216b74109775236E36d4b433F1DF507B' // [!code focus]\n    } // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\nOnly indexed arguments in `event` are candidates for `args`.\n\nAn argument can also be an array to indicate that other values can exist in the position:\n\n::: code-group\n```tsx [index.tsx]\nimport { useContractEvents } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useContractEvents({\n    abi,\n    eventName: 'Transfer',\n    args: { \n      from: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045', \n      to: [ // [!code focus]\n        '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n        '0xa5cc3c03994db5b0d9a5eedd10cabab0813678ac', // [!code focus]\n        '0xa152f8bb749c55e9943a3a0a3111d18ee2b3f94e', // [!code focus]\n    ], // [!code focus]\n    }\n  })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n\n### blockHash\n\n`` `0x${string}` | undefined ``\n\n- Block hash to include logs from. Mutually exclusive with `fromBlock`/`toBlock`.\n\n::: code-group\n```tsx [index.tsx]\nimport { useContractEvents } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useContractEvents({\n    abi,\n    blockHash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```tsx [index.tsx]\nimport { useContractEvents } from 'wagmi'\nimport { mainnet } from '@wagmi/core/chains'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useContractEvents({\n    abi,\n    chainId: mainnet.id, // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useContractEvents } from 'wagmi'\nimport { abi } from './abi'\nimport { config } from './config'\n\nfunction App() {\n  const result = useContractEvents({\n    abi,\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### eventName\n\n`string | undefined`\n\n- Event to filter for the contract.\n- Inferred from [`abi`](#abi).\n\n::: code-group\n```tsx [index.tsx]\nimport { useContractEvents } from 'wagmi'\nimport { abi } from './abi'\nimport { config } from './config'\n\nfunction App() {\n  const result = useContractEvents({\n    abi,\n    eventName: 'Transfer', // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### fromBlock\n\n`bigint | 'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\n- Block to start including logs from. Mutually exclusive with `blockHash`.\n\n::: code-group\n```tsx [index.tsx]\nimport { useContractEvents } from 'wagmi'\nimport { abi } from './abi'\nimport { config } from './config'\n\nfunction App() {\n  const result = useContractEvents({\n    abi,\n    fromBlock: 69420n, // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### strict\n\n`boolean | undefined`\n\n- Flag to only return logs that conform to the indexed & non-indexed arguments on the `event`, meaning that `args` will always be defined. Defaults to `false`.\n\n::: code-group\n```tsx [index.tsx]\nimport { useContractEvents } from 'wagmi'\nimport { abi } from './abi'\nimport { config } from './config'\n\nfunction App() {\n  const result = useContractEvents({\n    abi,\n    strict: true, // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### toBlock\n\n`bigint | 'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\n- Block to stop including logs from. Mutually exclusive with `blockHash`.\n\n::: code-group\n```tsx [index.tsx]\nimport { useContractEvents } from 'wagmi'\nimport { abi } from './abi'\nimport { config } from './config'\n\nfunction App() {\n  const result = useContractEvents({\n    abi,\n    toBlock: 70120n, // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type UseContractEventsReturnType } from 'wagmi'\n```\n\nA list of event logs.\n\n## Action\n\n- [`getContractEvents`](/core/api/actions/getContractEvents)\n"
  },
  {
    "path": "site/react/api/hooks/useDeployContract.md",
    "content": "---\ntitle: useDeployContract\ndescription: Hook for deploying a contract to the network, given bytecode & constructor arguments.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'deployContract'\nconst typeName = 'DeployContract'\nconst mutate = 'mutate'\nconst TData = 'DeployContractData'\nconst TError = 'DeployContractErrorType'\nconst TVariables = 'DeployContractVariables'\n</script>\n\n# useDeployContract <Badge text=\"viem@>=2.8.18\" />\n\nHook for deploying a contract to the network, given bytecode, and constructor arguments.\n\n## Import\n\n```ts\nimport { useDeployContract } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useDeployContract } from 'wagmi'\nimport { parseEther } from 'viem'\nimport { wagmiAbi } from './abi'\n\nfunction App() {\n  const deployContract = useDeployContract()\n\n  return (\n    <button\n      onClick={() =>\n        deployContract.mutate({\n          abi: wagmiAbi,\n          bytecode: '0x608060405260405161083e38038061083e833981016040819052610...',\n        })\n      }\n    >\n      Deploy Contract\n    </button>\n  )\n}\n```\n```ts [abi.ts]\nexport const wagmiAbi = [\n  ...\n  {\n    inputs: [],\n    stateMutability: \"nonpayable\",\n    type: \"constructor\",\n  },\n  ...\n] as const\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Deploying with Constructor Args\n\n::: code-group\n```tsx [index.tsx]\nimport { useDeployContract } from 'wagmi'\nimport { parseEther } from 'viem'\nimport { wagmiAbi } from './abi'\n\nfunction App() {\n  const deployContract = useDeployContract()\n\n  return (\n    <button\n      onClick={() =>\n        deployContract.mutate({\n          abi: wagmiAbi,\n          args: [69420],\n          bytecode: '0x608060405260405161083e38038061083e833981016040819052610...',\n        })\n      }\n    >\n      Deploy Contract\n    </button>\n  )\n}\n```\n```ts [abi.ts]\nexport const wagmiAbi = [\n  ...\n  {\n    inputs: [{ name: \"x\", type: \"uint32\" }],\n    stateMutability: \"nonpayable\",\n    type: \"constructor\",\n  },\n  ...\n] as const;\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type useDeployContractParameters } from 'wagmi'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useDeployContract } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const deployContract = useDeployContract({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { type useDeployContractReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/mutation-result.md-->\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`deployContract`](/core/api/actions/deployContract)\n"
  },
  {
    "path": "site/react/api/hooks/useDisconnect.md",
    "content": "---\ntitle: useDisconnect\ndescription: Hook for disconnecting connections.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'disconnect'\nconst typeName = 'Disconnect'\nconst mutate = 'disconnect'\nconst TData = 'void'\nconst TError = 'DisconnectErrorType'\nconst TVariables = '{ connector?: Connector | undefined; }'\n</script>\n\n# useDisconnect\n\nHook for disconnecting connections.\n\n## Import\n\n```ts\nimport { useDisconnect } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useDisconnect } from 'wagmi'\n\nfunction App() {\n  const disconnect = useDisconnect()\n  return (\n    <button onClick={() => disconnect.mutate()}>\n      Disconnect\n    </button>\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseDisconnectParameters } from 'wagmi'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useDisconnect } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useDisconnect({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseDisconnectReturnType } from 'wagmi'\n```\n\n### connectors <Badge type=\"warning\">[deprecated](/react/guides/migrate-from-v2-to-v3#removed-usedisconnect-connectors-useswitchconnection-connectors)</Badge>\n\n`readonly Connector[]`\n\nConnectors that are currently connected. Useful for rendering a list of connectors to disconnect.\n\n::: code-group\n```tsx [index.tsx]\nimport { useConnectors, useDisconnect } from 'wagmi'\nimport { mainnet } from 'wagmi/chains'\n\nfunction App() {\n  const disconnect = useDisconnect()\n  const connectors = useConnectors()\n\n  return (\n    <div>\n      {connectors.map((connector) => (\n        <button key={connector.id} onClick={() => disconnect.mutate({ connector })}>\n          {connector.name}\n        </button>\n      ))}\n    </div>\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-result.md-->\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`disconnect`](/core/api/actions/disconnect)\n"
  },
  {
    "path": "site/react/api/hooks/useEnsAddress.md",
    "content": "---\ntitle: useEnsAddress\ndescription: Hook for fetching ENS address for name.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'getEnsAddress'\nconst typeName = 'GetEnsAddress'\nconst TData = 'string'\nconst TError = 'GetEnsAddressErrorType'\n</script>\n\n# useEnsAddress\n\nHook for fetching ENS address for name.\n\n## Import\n\n```ts\nimport { useEnsAddress } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useEnsAddress } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsAddress({\n    name: normalize('wevm.eth'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n::: warning\nSince ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `useEnsAddress`. You can use Viem's built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n:::\n\n## Parameters\n\n```ts\nimport { type UseEnsAddressParameters } from 'wagmi'\n```\n\n---\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to get ENS address at.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsAddress } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsAddress({\n    blockNumber: 17829139n, // [!code focus]\n    name: normalize('wevm.eth'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to get ENS address at.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsAddress } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsAddress({\n    name: normalize('wevm.eth'),\n    blockTag: 'latest', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```tsx [index.tsx]\nimport { useEnsAddress } from 'wagmi'\nimport { mainnet } from 'wagmi/chains' // [!code focus]\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsAddress({\n    chainId: mainnet.id, // [!code focus]\n    name: normalize('wevm.eth'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### coinType\n\n`number | undefined`\n\nThe [ENSIP-9](https://docs.ens.domains/ens-improvement-proposals/ensip-9-multichain-address-resolution) coin type to fetch the address for.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsAddress } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsAddress({\n    coinType: 60, // [!code focus]\n    name: normalize('wevm.eth'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useEnsAddress } from 'wagmi'\nimport { normalize } from 'viem/ens'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useEnsAddress({\n    config, // [!code focus]\n    name: normalize('wevm.eth'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### name\n\n`string | undefined`\n\nName to get the address for. [`enabled`](#enabled) set to `false` if `name` is `undefined`.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsAddress } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsAddress({\n    name: normalize('wevm.eth'), // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsAddress } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsAddress({\n    name: normalize('wevm.eth'),\n    scopeKey: 'foo', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### universalResolverAddress\n\n`Address | undefined`\n\n- Address of ENS Universal Resolver Contract.\n- Defaults to current chain's Universal Resolver Contract address.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsAddress } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsAddress({\n    name: normalize('wevm.eth'),\n    universalResolverAddress: '0x74E20Bd2A1fE0cdbe45b9A1d89cb7e0a45b36376', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseEnsAddressReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getEnsAddress`](/core/api/actions/getEnsAddress)\n"
  },
  {
    "path": "site/react/api/hooks/useEnsAvatar.md",
    "content": "---\ntitle: useEnsAvatar\ndescription: Hook for fetching ENS avatar for name.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'getEnsAvatar'\nconst typeName = 'GetEnsAvatar'\nconst TData = 'string | null'\nconst TError = 'GetEnsAvatarErrorType'\n</script>\n\n# useEnsAvatar\n\nHook for fetching ENS avatar for name.\n\n## Import\n\n```ts\nimport { useEnsAvatar } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useEnsAvatar } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsAvatar({\n    name: normalize('wevm.eth'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n::: warning\nSince ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `useEnsAvatar`. You can use Viem's built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n:::\n\n## Parameters\n\n```ts\nimport { type UseEnsAvatarParameters } from 'wagmi'\n```\n\n---\n\n### assetGatewayUrls <Badge text=\"viem@>=2.3.1\" />\n\n`{ ipfs?: string | undefined; arweave?: string | undefined } | undefined`\n\nGateway urls to resolve IPFS and/or Arweave assets.\n\n::: code-group\n```ts [index.ts]\nimport { getEnsAvatar } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nfunction App() {\n  const result = useEnsAvatar({\n    assetGatewayUrls: { // [!code focus]\n      ipfs: 'https://cloudflare-ipfs.com', // [!code focus]\n    }, // [!code focus]\n    name: normalize('wevm.eth'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to get ENS avatar at.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsAvatar } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsAvatar({\n    blockNumber: 17829139n, // [!code focus]\n    name: normalize('wevm.eth'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to get ENS avatar at.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsAvatar } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsAvatar({\n    name: normalize('wevm.eth'),\n    blockTag: 'latest', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```tsx [index.tsx]\nimport { useEnsAvatar } from 'wagmi'\nimport { mainnet } from 'wagmi/chains' // [!code focus]\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsAvatar({\n    chainId: mainnet.id, // [!code focus],\n    name: normalize('wevm.eth'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useEnsAvatar } from 'wagmi'\nimport { normalize } from 'viem/ens'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useEnsAvatar({\n    config, // [!code focus]\n    name: normalize('wevm.eth'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### gatewayUrls\n\n`string[] | undefined`\n\nA set of Universal Resolver gateways, used for resolving CCIP-Read requests made through the ENS Universal Resolver Contract.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsAvatar } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsAvatar({\n    gatewayUrls: ['https://cloudflare-ipfs.com'] { // [!code focus]\n    name: normalize('wevm.eth'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### name\n\n`string | undefined`\n\nName to get the avatar for. [`enabled`](#enabled) set to `false` if `name` is `undefined`.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsAvatar } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsAvatar({\n    name: normalize('wevm.eth'), // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsAvatar } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsAvatar({\n    name: normalize('wevm.eth'),\n    scopeKey: 'foo', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### universalResolverAddress\n\n`Address | undefined`\n\n- Address of ENS Universal Resolver Contract.\n- Defaults to current chain's Universal Resolver Contract address.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsAvatar } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsAvatar({\n    name: normalize('wevm.eth'),\n    universalResolverAddress: '0x74E20Bd2A1fE0cdbe45b9A1d89cb7e0a45b36376', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseEnsAvatarReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getEnsAvatar`](/core/api/actions/getEnsAvatar)\n"
  },
  {
    "path": "site/react/api/hooks/useEnsName.md",
    "content": "---\ntitle: useEnsName\ndescription: Hook for fetching primary ENS name for address.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'getEnsName'\nconst typeName = 'GetEnsName'\nconst TData = 'string | null'\nconst TError = 'GetEnsNameErrorType'\n</script>\n\n# useEnsName\n\nHook for fetching primary ENS name for address.\n\n## Import\n\n```ts\nimport { useEnsName } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useEnsName } from 'wagmi'\n\nfunction App() {\n  const result = useEnsName({\n    address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseEnsNameParameters } from 'wagmi'\n```\n\n### address\n\n`Address | undefined`\n\nName to get the resolver for. [`enabled`](#enabled) set to `false` if `address` is `undefined`.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsName } from 'wagmi'\n\nfunction App() {\n  const result = useEnsName({\n    address: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n---\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to get ENS name at.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsName } from 'wagmi'\n\nfunction App() {\n  const result = useEnsName({\n    address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    blockNumber: 17829139n, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to get ENS name at.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsName } from 'wagmi'\n\nfunction App() {\n  const result = useEnsName({\n    address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    blockTag: 'latest', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```tsx [index.tsx]\nimport { useEnsName } from 'wagmi'\nimport { mainnet } from 'wagmi/chains' // [!code focus]\n\nfunction App() {\n  const result = useEnsName({\n    address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    chainId: mainnet.id, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useEnsName } from 'wagmi'\nimport { normalize } from 'viem/ens'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useEnsName({\n    address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsName } from 'wagmi'\n\nfunction App() {\n  const result = useEnsName({\n    address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    scopeKey: 'foo', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### universalResolverAddress\n\n`Address | undefined`\n\n- Address of ENS Universal Resolver Contract.\n- Defaults to current chain's Universal Resolver Contract address.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsName } from 'wagmi'\n\nfunction App() {\n  const result = useEnsName({\n    address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    universalResolverAddress: '0x74E20Bd2A1fE0cdbe45b9A1d89cb7e0a45b36376', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseEnsNameReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getEnsName`](/core/api/actions/getEnsName)\n"
  },
  {
    "path": "site/react/api/hooks/useEnsResolver.md",
    "content": "---\ntitle: useEnsResolver\ndescription: Hook for fetching ENS resolver for name.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'getEnsResolver'\nconst typeName = 'GetEnsResolver'\nconst TData = 'string | null'\nconst TError = 'GetEnsResolverErrorType'\n</script>\n\n# useEnsResolver\n\nHook for fetching ENS resolver for name.\n\n## Import\n\n```ts\nimport { useEnsResolver } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useEnsResolver } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsResolver({\n    name: normalize('wevm.eth'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n::: warning\nSince ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `useEnsResolver`. You can use Viem's built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n:::\n\n## Parameters\n\n```ts\nimport { type UseEnsResolverParameters } from 'wagmi'\n```\n\n---\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to get ENS resolver at.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsResolver } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsResolver({\n    blockNumber: 17829139n, // [!code focus]\n    name: normalize('wevm.eth'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to get ENS resolver at.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsResolver } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsResolver({\n    name: normalize('wevm.eth'),\n    blockTag: 'latest', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```tsx [index.tsx]\nimport { useEnsResolver } from 'wagmi'\nimport { mainnet } from 'wagmi/chains' // [!code focus]\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsResolver({\n    chainId: mainnet.id, // [!code focus]\n    name: normalize('wevm.eth'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useEnsResolver } from 'wagmi'\nimport { normalize } from 'viem/ens'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useEnsResolver({\n    config, // [!code focus]\n    name: normalize('wevm.eth'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### name\n\n`string | undefined`\n\nName to get the resolver for. [`enabled`](#enabled) set to `false` if `name` is `undefined`.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsResolver } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsResolver({\n    name: normalize('wevm.eth'), // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsResolver } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsResolver({\n    name: normalize('wevm.eth'),\n    scopeKey: 'foo', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### universalResolverAddress\n\n`Address | undefined`\n\n- Resolver of ENS Universal Resolver Contract.\n- Defaults to current chain's Universal Resolver Contract address.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsResolver } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsResolver({\n    name: normalize('wevm.eth'),\n    universalResolverAddress: '0x74E20Bd2A1fE0cdbe45b9A1d89cb7e0a45b36376', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseEnsResolverReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getEnsResolver`](/core/api/actions/getEnsResolver)\n"
  },
  {
    "path": "site/react/api/hooks/useEnsText.md",
    "content": "---\ntitle: useEnsText\ndescription: Hook for fetching a text record for a specified ENS name and key.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'getEnsText'\nconst typeName = 'GetEnsText'\nconst TData = 'string | null'\nconst TError = 'GetEnsTextErrorType'\n</script>\n\n# useEnsText\n\nHook for fetching a text record for a specified ENS name and key.\n\n## Import\n\n```ts\nimport { useEnsText } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useEnsText } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsText({\n    name: normalize('wevm.eth'),\n    key: 'com.twitter',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n::: warning\nSince ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `useEnsText`. You can use Viem's built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n:::\n\n## Parameters\n\n```ts\nimport { type UseEnsTextParameters } from 'wagmi'\n```\n\n---\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to get the text at.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsText } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsText({\n    blockNumber: 17829139n, // [!code focus]\n    name: normalize('wevm.eth'),\n    key: 'com.twitter',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to get the text at.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsText } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsText({\n    blockTag: 'latest', // [!code focus]\n    name: normalize('wevm.eth'),\n    key: 'com.twitter',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```tsx [index.tsx]\nimport { useEnsText } from 'wagmi'\nimport { mainnet } from 'wagmi/chains' // [!code focus]\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsText({\n    chainId: mainnet.id, // [!code focus]\n    name: normalize('wevm.eth'),\n    key: 'com.twitter',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### key\n\n`string | undefined`\n\nENS key to get Text for.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsText } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsText({\n    name: normalize('wevm.eth'),\n    key: 'com.twitter', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n\n### name\n\n`string | undefined`\n\nName to get the text for. [`enabled`](#enabled) set to `false` if `name` is `undefined`.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsText } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsText({\n    name: normalize('wevm.eth'), // [!code focus]\n    key: 'com.twitter',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useEnsText } from 'wagmi'\nimport { normalize } from 'viem/ens'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useEnsText({\n    config, // [!code focus]\n    name: normalize('wevm.eth'),\n    key: 'com.twitter',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsText } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsText({\n    scopeKey: 'foo', // [!code focus]\n    name: normalize('wevm.eth'),\n    key: 'com.twitter',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### universalResolverAddress\n\n`Address | undefined`\n\n- Resolver of ENS Universal Resolver Contract.\n- Defaults to current chain's Universal Resolver Contract address.\n\n::: code-group\n```ts [index.ts]\nimport { useEnsText } from 'wagmi'\nimport { normalize } from 'viem/ens'\n\nfunction App() {\n  const result = useEnsText({\n    name: normalize('wevm.eth'),\n    key: 'com.twitter',\n    universalResolverAddress: '0x74E20Bd2A1fE0cdbe45b9A1d89cb7e0a45b36376', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseEnsTextReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getEnsText`](/core/api/actions/getEnsText)\n"
  },
  {
    "path": "site/react/api/hooks/useEstimateFeesPerGas.md",
    "content": "---\ntitle: useEstimateFeesPerGas\ndescription: Hook for fetching an estimate for the fees per gas (in wei) for a transaction to be likely included in the next block.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'estimateFeesPerGas'\nconst typeName = 'EstimateFeesPerGas'\nconst TData = '{ gasPrice: bigint | undefined; maxFeePerGas: bigint | undefined; maxPriorityFeePerGas: bigint | undefined; }'\nconst TError = 'EstimateFeesPerGasErrorType'\n</script>\n\n# useEstimateFeesPerGas\n\nHook for fetching an estimate for the fees per gas (in wei) for a transaction to be likely included in the next block.\n\n## Import\n\n```ts\nimport { useEstimateFeesPerGas } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useEstimateFeesPerGas } from 'wagmi'\n\nfunction App() {\n  const result = useEstimateFeesPerGas()\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseEstimateFeesPerGas } from 'wagmi'\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```tsx [index.tsx]\nimport { useEstimateFeesPerGas } from 'wagmi'\nimport { mainnet } from 'wagmi/chains' // [!code focus]\n\nfunction App() {\n  const result = useEstimateFeesPerGas({\n    chainId: mainnet.id, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useEstimateFeesPerGas } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useEstimateFeesPerGas({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```ts [index.ts]\nimport { useEstimateFeesPerGas } from 'wagmi'\n\nfunction App() {\n  const result = useEstimateFeesPerGas({\n    scopeKey: 'foo', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### type\n\n`'legacy' | 'eip1559'`\n\n- Defaults to `'eip1559'`\n\n::: code-group\n```ts [index.ts]\nimport { useEstimateFeesPerGas } from 'wagmi'\n\nfunction App() {\n  const result = useEstimateFeesPerGas({\n    type: 'legacy', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseEstimateFeesPerGasReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`estimateFeesPerGas`](/core/api/actions/estimateFeesPerGas)\n"
  },
  {
    "path": "site/react/api/hooks/useEstimateGas.md",
    "content": "---\ntitle: useEstimateGas\ndescription: Hook for estimating the gas necessary to complete a transaction without submitting it to the network.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'estimateGas'\nconst typeName = 'EstimateGas'\nconst TData = 'bigint'\nconst TError = 'EstimateGasErrorType'\n</script>\n\n# useEstimateGas\n\nHook for estimating the gas necessary to complete a transaction without submitting it to the network.\n\n## Import\n\n```ts\nimport { useEstimateGas } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useEstimateGas } from 'wagmi'\n\nfunction App() {\n  const result = useEstimateGas()\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseEstimateGasParameters } from 'wagmi'\n```\n\n### accessList\n\n`AccessList | undefined`\n\nThe access list.\n\n::: code-group\n```ts [index.ts]\nimport { useEstimateGas } from 'wagmi'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nfunction App() {\n  const result = useEstimateGas({\n    accessList: [{ // [!code focus]\n      address: '0x1', // [!code focus]\n      storageKeys: ['0x1'], // [!code focus]\n    }], // [!code focus]\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### account\n\n`Address | Account | undefined`\n\nAccount to use when estimating gas.\n\n::: code-group\n```ts [index.ts]\nimport { useEstimateGas } from 'wagmi'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nfunction App() {\n  const result = useEstimateGas({\n    account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', // [!code focus]\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nChain ID to target when estimating gas.\n\n::: code-group\n```ts [index.ts]\nimport { useEstimateGas } from 'wagmi'\nimport { mainnet } from '@wagmi/core/chains'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nfunction App() {\n  const result = useEstimateGas({\n    chainId: mainnet.id, // [!code focus]\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### connector\n\n`Connector | undefined`\n\nConnector to estimate with. If no [`account`](#account) is provided, will use default account from connector.\n\n::: code-group\n```ts [index.ts]\nimport { getConnections, estimateGas } from '@wagmi/core'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nfunction App() {\n  const connections = getConnections(config)\n  const result = useEstimateGas({\n    connector: connections[0]?.connector, // [!code focus]\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### data\n\n`` `0x${string}` | undefined ``\n\nA contract hashed method call with encoded function data.\n\n::: code-group\n```ts [index.ts]\nimport { useEstimateGas } from 'wagmi'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nfunction App() {\n  const result = useEstimateGas({\n    data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', // [!code focus]\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### gas\n\n`bigint | undefined`\n\nGas provided for transaction execution.\n\n::: code-group\n```ts [index.ts]\nimport { useEstimateGas } from 'wagmi'\nimport { parseEther, parseGwei } from 'viem'\nimport { config } from './config'\n\nfunction App() {\n  const result = useEstimateGas({\n    gas: parseGwei('20'), // [!code focus]\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n---\n\n### gasPrice\n\n`bigint | undefined`\n\nThe price in wei to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms#legacy-transaction).\n\n::: code-group\n```ts [index.ts]\nimport { useEstimateGas } from 'wagmi'\nimport { parseEther, parseGwei } from 'viem'\nimport { config } from './config'\n\nfunction App() {\n  const result = useEstimateGas({\n    gasPrice: parseGwei('20'), // [!code focus]\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### maxFeePerGas\n\n`bigint | undefined`\n\nTotal fee per gas in wei, inclusive of [`maxPriorityFeePerGas`](#maxPriorityFeePerGas). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n```ts [index.ts]\nimport { useEstimateGas } from 'wagmi'\nimport { parseEther, parseGwei } from 'viem'\nimport { config } from './config'\n\nfunction App() {\n  const result = useEstimateGas({\n    maxFeePerGas: parseGwei('20'), // [!code focus]\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### maxPriorityFeePerGas\n\n`bigint | undefined`\n\nMax priority fee per gas in wei. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n```ts [index.ts]\nimport { useEstimateGas } from 'wagmi'\nimport { parseEther, parseGwei } from 'viem'\nimport { config } from './config'\n\nfunction App() {\n  const result = useEstimateGas({\n    maxFeePerGas: parseGwei('20'),\n    maxPriorityFeePerGas: parseGwei('2'), // [!code focus]\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n---\n\n### nonce\n\n`number`\n\nUnique number identifying this transaction.\n\n::: code-group\n```ts [index.ts]\nimport { useEstimateGas } from 'wagmi'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nfunction App() {\n  const result = useEstimateGas({\n    nonce: 123, // [!code focus]\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```ts [index.ts]\nimport { useEstimateGas } from 'wagmi'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nfunction App() {\n  const result = useEstimateGas({\n    scopeKey: 'foo', // [!code focus]\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    value: parseEther('0.01'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### to\n\n`Address | undefined`\n\nThe transaction recipient or contract address.\n\n::: code-group\n```ts [index.ts]\nimport { useEstimateGas } from 'wagmi'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nfunction App() {\n  const result = useEstimateGas({\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n    value: parseEther('0.01'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### type\n\n`'legacy' | 'eip1559' | 'eip2930' | undefined`\n\nOptional transaction request type to narrow parameters.\n\n::: code-group\n```ts [index.ts]\nimport { useEstimateGas } from 'wagmi'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nfunction App() {\n  const result = useEstimateGas({\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    type: 'eip1559', // [!code focus]\n    value: parseEther('0.01'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### value\n\n`bigint | undefined`\n\nValue in wei sent with this transaction.\n\n::: code-group\n```ts [index.ts]\nimport { useEstimateGas } from 'wagmi'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nfunction App() {\n  const result = useEstimateGas({\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', \n    value: parseEther('0.01'), // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseEstimateGasReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`estimateGas`](/core/api/actions/estimateGas)\n"
  },
  {
    "path": "site/react/api/hooks/useEstimateMaxPriorityFeePerGas.md",
    "content": "---\ntitle: useEstimateMaxPriorityFeePerGas\ndescription: Hook for fetching an estimate for the max priority fee per gas (in wei) for a transaction to be likely included in the next block.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'estimateMaxPriorityFeePerGas'\nconst typeName = 'EstimateMaxPriorityFeePerGas'\nconst TData = 'bigint'\nconst TError = 'EstimateMaxPriorityFeePerGasErrorType'\n</script>\n\n# useEstimateMaxPriorityFeePerGas\n\nHook for fetching an estimate for the fees per gas (in wei) for a transaction to be likely included in the next block.\n\n## Import\n\n```ts\nimport { useEstimateMaxPriorityFeePerGas } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useEstimateMaxPriorityFeePerGas } from 'wagmi'\n\nfunction App() {\n  const result = useEstimateMaxPriorityFeePerGas()\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseEstimateMaxPriorityFeePerGas } from 'wagmi'\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```tsx [index.tsx]\nimport { useEstimateMaxPriorityFeePerGas } from 'wagmi'\nimport { mainnet } from 'wagmi/chains' // [!code focus]\n\nfunction App() {\n  const result = useEstimateMaxPriorityFeePerGas({\n    chainId: mainnet.id, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useEstimateMaxPriorityFeePerGas } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useEstimateMaxPriorityFeePerGas({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```ts [index.ts]\nimport { useEstimateMaxPriorityFeePerGas } from 'wagmi'\n\nfunction App() {\n  const result = useEstimateMaxPriorityFeePerGas({\n    scopeKey: 'foo', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseEstimateMaxPriorityFeePerGasReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`estimateMaxPriorityFeePerGas`](/core/api/actions/estimateMaxPriorityFeePerGas)\n"
  },
  {
    "path": "site/react/api/hooks/useFeeHistory.md",
    "content": "---\ntitle: useFeeHistory\ndescription: Hook for fetching a collection of historical gas information.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'getFeeHistory'\nconst typeName = 'GetFeeHistory'\nconst TData = 'bigint'\nconst TError = 'GetFeeHistoryErrorType'\n</script>\n\n# useFeeHistory\n\nHook for fetching a collection of historical gas information.\n\n## Import\n\n```ts\nimport { useFeeHistory } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useFeeHistory } from 'wagmi'\n\nfunction App() {\n  const result = useFeeHistory({\n    blockCount: 4,\n    rewardPercentiles: [25, 75]\n})\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseFeeHistoryParameters } from 'wagmi'\n```\n\n### blockCount\n\n`number | undefined`\n\nNumber of blocks in the requested range. Between 1 and 1024 blocks can be requested in a single query. Less than requested may be returned if not all blocks are available.\n\n::: code-group\n```tsx [index.tsx]\nimport { useFeeHistory } from 'wagmi'\n\nfunction App() {\n  const result = useFeeHistory({\n    blockCount: 4, // [!code focus]\n    rewardPercentiles: [25, 75]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### rewardPercentiles\n\n`number[] | undefined`\n\nA monotonically increasing list of percentile values to sample from each block's effective priority fees per gas in ascending order, weighted by gas used.\n\n::: code-group\n```tsx [index.tsx]\nimport { useFeeHistory } from 'wagmi'\n\nfunction App() {\n  const result = useFeeHistory({\n    blockCount: 4,\n    rewardPercentiles: [25, 75] // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockNumber\n\n`bigint | undefined`\n\nHighest number block of the requested range.\n\n\n::: code-group\n```tsx [index.tsx]\nimport { useFeeHistory } from 'wagmi'\n\nfunction App() {\n  const result = useFeeHistory({\n    blockCount: 4,\n    blockNumber: 1551231n, // [!code focus]\n    rewardPercentiles: [25, 75]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag of the highest number block of the requested range.\n\n::: code-group\n```tsx [index.tsx]\nimport { useFeeHistory } from 'wagmi'\n\nfunction App() {\n  const result = useFeeHistory({\n    blockCount: 4,\n    blockTag: 'safe', // [!code focus]\n    rewardPercentiles: [25, 75]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n\n::: code-group\n```tsx [index.tsx]\nimport { useFeeHistory } from 'wagmi'\nimport { mainnet } from '@wagmi/core/chains'\n\nfunction App() {\n  const result = useFeeHistory({\n    blockCount: 4,\n    chainId: mainnet.id, // [!code focus]\n    rewardPercentiles: [25, 75]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useFeeHistory } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useFeeHistory({\n    blockCount: 4,\n    rewardPercentiles: [25, 75]\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```tsx [index.tsx]\nimport { useFeeHistory } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useFeeHistory({\n    blockCount: 4,\n    rewardPercentiles: [25, 75]\n    scopeKey: 'foo', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseFeeHistoryReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getFeeHistory`](/core/api/actions/getFeeHistory)\n"
  },
  {
    "path": "site/react/api/hooks/useGasPrice.md",
    "content": "---\ntitle: useGasPrice\ndescription: Hook for fetching the current price of gas (in wei).\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'getGasPrice'\nconst typeName = 'GetGasPrice'\nconst TData = 'bigint'\nconst TError = 'GetGasPriceErrorType'\n</script>\n\n# useGasPrice\n\nHook for fetching the current price of gas (in wei).\n\n## Import\n\n```ts\nimport { useGasPrice } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useGasPrice } from 'wagmi'\n\nfunction App() {\n  const result = useGasPrice()\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseGasPriceParameters } from 'wagmi'\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```tsx [index.tsx]\nimport { useGasPrice } from 'wagmi'\nimport { mainnet } from 'wagmi/chains' // [!code focus]\n\nfunction App() {\n  const result = useGasPrice({\n    chainId: mainnet.id, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useGasPrice } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useGasPrice({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```tsx [index.tsx]\nimport { useGasPrice } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useGasPrice({\n    scopeKey: 'foo', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseGasPriceReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getGasPrice`](/core/api/actions/getGasPrice)\n"
  },
  {
    "path": "site/react/api/hooks/useInfiniteReadContracts.md",
    "content": "---\ntitle: useInfiniteReadContracts\ndescription: Hook for calling multiple read methods on a contract with \"infinite scroll\"/\"fetch more\" support.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst includeInfiniteQueryOptions = true\nconst TPageParam = 'number'\nconst TData = 'InfiniteReadContractsData'\nconst TError = 'ReadContractsErrorType'\n</script>\n\n# useInfiniteReadContracts\n\nHook for calling multiple contract read-only methods with \"infinite scrolling\"/\"fetch more\" support. \n\n## Import\n\n```ts\nimport { useInfiniteReadContracts } from 'wagmi'\n```\n\n## Usage\n\nThe example below shows how to demonstrate how to fetch a set of [mloot](https://etherscan.io/address/0x1dfe7ca09e99d10835bf73044a23b73fc20623df) attributes (chestwear, footwear, and handwear) with \"fetch more\" support.\n\n::: code-group\n```tsx [index.tsx]\nimport { useInfiniteReadContracts } from 'wagmi'\nimport { abi } from './abi'\n\nconst mlootContractConfig = {\n  address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n  abi,\n} as const\n\nfunction App() {\n  const result = useInfiniteReadContracts({\n    cacheKey: 'mlootAttributes',\n    contracts(pageParam) {\n      const args = [pageParam] as const\n      return [\n        { ...mlootContractConfig, functionName: 'getChest', args },\n        { ...mlootContractConfig, functionName: 'getFoot', args },\n        { ...mlootContractConfig, functionName: 'getHand', args },\n      ]\n    }\n    query: {\n      initialPageParam: 0,\n      getNextPageParam: (_lastPage, _allPages, lastPageParam) => {\n        return lastPageParam + 1\n      }\n    }\n  })\n}\n```\n<<< @/snippets/abi-infinite-read.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\nIn the above example, we are setting a few things:\n\n- [`cacheKey`](#cachekey): A unique key to store the data in the cache.\n- [`query.initialPageParam`](#initialpageparam): An initial page parameter to use when fetching the first set of contracts.\n- [`query.getNextPageParam`](#getnextpageparam): A function that returns the next page parameter to use when fetching the next set of contracts.\n- [`contracts`](#contracts): A function that provides `pageParam` (derived from the above) as an argument and expects to return an array of contracts.\n\n### Paginated Parameters\n\nWe can also leverage properties like `getNextPageParam` with a custom `limit` variable to achieve \"pagination\" of parameters. For example, we can fetch the first 10 contract functions, then fetch the next 10 contract functions, and so on.\n\n::: code-group\n```tsx [index.tsx]\nimport { useInfiniteReadContracts } from 'wagmi'\nimport { abi } from './abi'\n\nfunction Example({ limit = 10 }: { limit?: number } = {}) {\n  const result = useInfiniteReadContracts({\n    cacheKey: 'mlootAttributes',\n    contracts(pageParam) {\n      return [...new Array(limit)].map(\n        (_, i) =>\n          ({\n            address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n            abi,\n            functionName: 'getHand',\n            args: [BigInt(pageParam + i)],\n          }) as const,\n      )\n    },\n    query: {\n      initialPageParam: 1,\n      getNextPageParam(_lastPage, _allPages, lastPageParam) {\n        return lastPageParam + limit\n      },\n    }\n  })\n}\n```\n<<< @/snippets/abi-infinite-read.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n\n## Parameters\n\n```ts\nimport { type UseInfiniteReadContractsParameters } from 'wagmi'\n```\n\n### cacheKey\n\n`string`\n\nA unique key to store the data in the cache.\n\n::: code-group\n```tsx [index.tsx]\nimport { useInfiniteReadContracts } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useInfiniteReadContracts({\n    cacheKey: 'mlootAttributes', // [!code hl]\n    contracts(pageParam) {\n      // ...\n    }\n    query: {\n      initialPageParam: 0,\n      getNextPageParam: (_lastPage, _allPages, lastPageParam) => {\n        return lastPageParam + 1\n      }\n    }\n  })\n}\n```\n<<< @/snippets/abi-infinite-read.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### contracts\n\n`(pageParam: {{TPageParam}}) => Contract[]`\n\nA function that provides `pageParam` (derived from the above) as an argument and expects to return an array of contracts.\n\n#### abi\n\n`Abi | undefined`\n\nThe contract's ABI. Check out the [TypeScript docs](/react/typescript#const-assert-abis-typed-data) for how to set up ABIs for maximum type inference and safety.\n\n::: code-group\n```tsx [index.tsx]\nimport { useInfiniteReadContracts } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useInfiniteReadContracts({\n    cacheKey: 'mlootAttributes',\n    contracts(pageParam) {\n      const args = [pageParam] as const\n      return [\n        // ...\n        {  \n          address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n          abi, // [!code hl]\n          functionName: 'getChest', \n          args \n        },\n        // ...\n      ]\n    }\n    query: {\n      initialPageParam: 0,\n      getNextPageParam: (_lastPage, _allPages, lastPageParam) => {\n        return lastPageParam + 1\n      }\n    }\n  })\n}\n```\n<<< @/snippets/abi-infinite-read.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n#### address\n\n`Address | undefined`\n\nThe contract's address.\n\n::: code-group\n```tsx [index.tsx]\nimport { useInfiniteReadContracts } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useInfiniteReadContracts({\n    cacheKey: 'mlootAttributes',\n    contracts(pageParam) {\n      const args = [pageParam] as const\n      return [\n        // ...\n        {  \n          address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df', // [!code hl]\n          abi,\n          functionName: 'getChest', \n          args \n        },\n        // ...\n      ]\n    }\n    query: {\n      initialPageParam: 0,\n      getNextPageParam: (_lastPage, _allPages, lastPageParam) => {\n        return lastPageParam + 1\n      }\n    }\n  })\n}\n```\n<<< @/snippets/abi-infinite-read.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n#### functionName\n\n`string | undefined`\n\n- Function to call on the contract.\n- Inferred from [`abi`](#abi).\n\n::: code-group\n```tsx [index.tsx]\nimport { useInfiniteReadContracts } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useInfiniteReadContracts({\n    cacheKey: 'mlootAttributes',\n    contracts(pageParam) {\n      const args = [pageParam] as const\n      return [\n        // ...\n        {  \n          address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n          abi,\n          functionName: 'getChest', // [!code hl]\n          args \n        },\n        // ...\n      ]\n    }\n    query: {\n      initialPageParam: 0,\n      getNextPageParam: (_lastPage, _allPages, lastPageParam) => {\n        return lastPageParam + 1\n      }\n    }\n  })\n}\n```\n<<< @/snippets/abi-infinite-read.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n#### args\n\n`readonly unknown[] | undefined`\n\n- Arguments to pass when calling the contract.\n- Inferred from [`abi`](#abi) and [`functionName`](#functionname).\n\n::: code-group\n```tsx [index.tsx]\nimport { useInfiniteReadContracts } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useInfiniteReadContracts({\n    cacheKey: 'mlootAttributes',\n    contracts(pageParam) {\n      return [\n        // ...\n        {  \n          address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n          abi,\n          functionName: 'getChest', \n          args: [pageParam] // [!code hl]\n        },\n        // ...\n      ]\n    }\n    query: {\n      initialPageParam: 0,\n      getNextPageParam: (_lastPage, _allPages, lastPageParam) => {\n        return lastPageParam + 1\n      }\n    }\n  })\n}\n```\n<<< @/snippets/abi-infinite-read.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n#### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```tsx [index.tsx]\nimport { useInfiniteReadContracts } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useInfiniteReadContracts({\n    cacheKey: 'mlootAttributes',\n    contracts(pageParam) {\n      const args = [pageParam] as const\n      return [\n        // ...\n        {  \n          address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n          abi,\n          functionName: 'getChest', \n          args,\n          chainId: 1 // [!code hl]\n        },\n        // ...\n      ]\n    }\n    query: {\n      initialPageParam: 0,\n      getNextPageParam: (_lastPage, _allPages, lastPageParam) => {\n        return lastPageParam + 1\n      }\n    }\n  })\n}\n```\n<<< @/snippets/abi-infinite-read.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseInfiniteReadContractsReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->"
  },
  {
    "path": "site/react/api/hooks/usePrepareTransactionRequest.md",
    "content": "---\ntitle: usePrepareTransactionRequest\ndescription: Hook for preparing a transaction request for signing by populating a nonce, gas limit, fee values, and a transaction type.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'prepareTransactionRequest'\nconst typeName = 'PrepareTransactionRequest'\nconst TData = 'PrepareTransactionRequestData'\nconst TError = 'PrepareTransactionRequestErrorType'\n</script>\n\n# usePrepareTransactionRequest\n\nHook for preparing a transaction request for signing by populating a nonce, gas limit, fee values, and a transaction type.\n\n## Import\n\n```ts\nimport { usePrepareTransactionRequest } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { usePrepareTransactionRequest } from 'wagmi'\nimport { parseEther } from 'viem'\n\nfunction App() {\n  const result = usePrepareTransactionRequest({\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n    value: parseEther('1'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UsePrepareTransactionRequestParameters } from 'wagmi'\n```\n\n### account\n\n`Account | Address | undefined`\n\nThe Account to send the transaction from. \n\n::: code-group\n```tsx [index.tsx]\nimport { usePrepareTransactionRequest } from 'wagmi'\nimport { parseEther } from 'viem'\n\nfunction App() {\n  const result = usePrepareTransactionRequest({\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', // [!code focus]\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n    value: parseEther('1'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### to\n\n`` `0x${string}` | undefined ``\n\nThe transaction recipient or contract address.\n\n::: code-group\n```tsx [index.tsx]\nimport { usePrepareTransactionRequest } from 'wagmi'\nimport { parseEther } from 'viem'\n\nfunction App() {\n  const result = usePrepareTransactionRequest({\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',  // [!code focus]\n    value: parseEther('1'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### accessList\n\n`AccessList | undefined`\n\nThe access list.\n\n::: code-group\n```tsx [index.tsx]\nimport { usePrepareTransactionRequest } from 'wagmi'\nimport { parseEther } from 'viem'\n\nfunction App() {\n  const result = usePrepareTransactionRequest({\n    accessList: [ // [!code focus:6]\n      {\n        address: '0x1',\n        storageKeys: ['0x1'],\n      },\n    ],\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n    value: parseEther('1'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nChain ID to prepare the transaction request for.\n\n::: code-group\n```tsx [index.tsx]\nimport { usePrepareTransactionRequest } from 'wagmi'\nimport { parseEther } from 'viem'\n\nfunction App() {\n  const result = usePrepareTransactionRequest({\n    chainId: mainnet.id, // [!code focus]\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n    value: parseEther('1'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### data\n\n`` `0x${string}` | undefined ``\n\nA contract hashed method call with encoded args.\n\n::: code-group\n```tsx [index.tsx]\nimport { usePrepareTransactionRequest } from 'wagmi'\nimport { parseEther } from 'viem'\n\nfunction App() {\n  const result = usePrepareTransactionRequest({\n    data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', // [!code focus]\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n    value: parseEther('1'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### gasPrice\n\n`bigint | undefined`\n\nThe price (in wei) to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms#legacy-transaction).\n\n::: code-group\n```tsx [index.tsx]\nimport { usePrepareTransactionRequest } from 'wagmi'\nimport { parseEther, parseGwei } from 'viem'\n\nfunction App() {\n  const result = usePrepareTransactionRequest({\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    gasPrice: parseGwei('20'), // [!code focus]\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n    value: parseEther('1'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### maxFeePerGas\n\n`bigint | undefined`\n\nTotal fee per gas (in wei), inclusive of `maxPriorityFeePerGas`. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n```tsx [index.tsx]\nimport { usePrepareTransactionRequest } from 'wagmi'\nimport { parseEther, parseGwei } from 'viem'\n\nfunction App() {\n  const result = usePrepareTransactionRequest({\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    maxFeePerGas: parseGwei('20'), // [!code focus]\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n    value: parseEther('1'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### maxPriorityFeePerGas\n\n`bigint | undefined`\n\nMax priority fee per gas (in wei). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n```tsx [index.tsx]\nimport { usePrepareTransactionRequest } from 'wagmi'\nimport { parseEther, parseGwei } from 'viem'\n\nfunction App() {\n  const result = usePrepareTransactionRequest({\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    maxFeePerGas: parseGwei('20'),\n    maxPriorityFeePerGas: parseGwei('2'), // [!code focus]\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n    value: parseEther('1'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### nonce\n\n`number | undefined`\n\nUnique number identifying this transaction.\n\n::: code-group\n```tsx [index.tsx]\nimport { usePrepareTransactionRequest } from 'wagmi'\nimport { parseEther } from 'viem'\n\nfunction App() {\n  const result = usePrepareTransactionRequest({\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n    value: parseEther('1'),\n    nonce: 5, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### parameters\n\n`(\"fees\" | \"gas\" | \"nonce\" | \"type\")[] | undefined`\n\nParameters to prepare.\n\nFor instance, if `[\"gas\", \"nonce\"]` is provided, then only the `gas` and `nonce` parameters will be prepared.\n\n::: code-group\n```tsx [index.tsx]\nimport { usePrepareTransactionRequest } from 'wagmi'\nimport { parseEther } from 'viem'\n\nfunction App() {\n  const result = usePrepareTransactionRequest({\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    parameters: ['gas', 'nonce'], // [!code focus]\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n    value: parseEther('1'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### value\n\n`bigint | undefined`\n\nValue in wei sent with this transaction.\n\n::: code-group\n```tsx [index.tsx]\nimport { usePrepareTransactionRequest } from 'wagmi'\nimport { parseEther } from 'viem'\n\nfunction App() {\n  const result = usePrepareTransactionRequest({\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n    value: parseEther('1'), // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { usePrepareTransactionRequest } from 'wagmi'\nimport { parseEther } from 'viem'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = usePrepareTransactionRequest({\n    config, // [!code focus]\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n    value: parseEther('1'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```tsx [index.tsx]\nimport { usePrepareTransactionRequest } from 'wagmi'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nfunction App() {\n  const result = usePrepareTransactionRequest({\n    scopeKey: 'foo' // [!code focus]\n    account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n    value: parseEther('1'),\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UsePrepareTransactionRequestReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`prepareTransactionRequest`](/core/api/actions/prepareTransactionRequest)\n"
  },
  {
    "path": "site/react/api/hooks/useProof.md",
    "content": "---\ntitle: useProof\ndescription: Hook for return the account and storage values of the specified account including the Merkle-proof.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'getProof'\nconst typeName = 'GetProof'\nconst TData = 'GetProofData'\nconst TError = 'GetProofErrorType'\n</script>\n\n# useProof\n\nHook for return the account and storage values of the specified account including the Merkle-proof.\n\n## Import\n\n```ts\nimport { useProof } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useProof } from 'wagmi'\n\nfunction App() {\n  const result = useProof({\n    address: '0x4200000000000000000000000000000000000016',\n    storageKeys: [\n      '0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99',\n    ],\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseProofParameters } from 'wagmi'\n```\n\n### address\n\n`Address | undefined`\n\nThe account address to get the proof for.\n\n::: code-group\n```tsx [index.tsx]\nimport { useProof } from 'wagmi'\n\nfunction App() {\n  const result = useProof({\n    address: '0x4200000000000000000000000000000000000016', // [!code focus]\n    storageKeys: [\n      '0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99',\n    ],\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### storageKeys\n\n`` `0x${string}`[] | undefined ``\n\nArray of storage-keys that should be proofed and included.\n\n::: code-group\n```tsx [index.tsx]\nimport { useProof } from 'wagmi'\n\nfunction App() {\n  const result = useProof({\n    address: '0x4200000000000000000000000000000000000016',\n    storageKeys: [ // [!code focus:3]\n      '0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99',\n    ],\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockNumber\n\n`bigint | undefined`\n\nProof at a given block number.\n\n::: code-group\n```tsx [index.tsx]\nimport { useProof } from 'wagmi'\n\nfunction App() {\n  const result = useProof({\n    address: '0x4200000000000000000000000000000000000016',\n    blockNumber: 42069n, // [!code focus]\n    storageKeys: [\n      '0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99',\n    ],\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nProof at a given block tag.\n\n::: code-group\n```tsx [index.tsx]\nimport { useProof } from 'wagmi'\n\nfunction App() {\n  const result = useProof({\n    address: '0x4200000000000000000000000000000000000016',\n    blockTag: 'latest', // [!code focus]\n    storageKeys: [\n      '0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99',\n    ],\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nThe ID of chain to get the proof for.\n\n::: code-group\n```tsx [index.tsx]\nimport { useProof } from 'wagmi'\nimport { optimism } from 'wagmi/chains'\n\nfunction App() {\n  const result = useProof({\n    chainId: optimism.id, // [!code focus]\n    address: '0x4200000000000000000000000000000000000016',\n    storageKeys: [\n      '0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99',\n    ],\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useProof } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useProof({\n    config, // [!code focus]\n    address: '0x4200000000000000000000000000000000000016',\n    storageKeys: [\n      '0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99',\n    ],\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```tsx [index.tsx]\nimport { useProof } from 'wagmi'\nimport { config } from './config'\n\nfunction App() {\n  const result = useProof({\n    scopeKey: 'foo' // [!code focus]\n    address: '0x4200000000000000000000000000000000000016',\n    storageKeys: [\n      '0x4a932049252365b3eedbc5190e18949f2ec11f39d3bef2d259764799a1b27d99',\n    ],\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseProofReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getProof`](/core/api/actions/getProof)\n"
  },
  {
    "path": "site/react/api/hooks/usePublicClient.md",
    "content": "---\ntitle: usePublicClient\ndescription: Hook for getting Viem `PublicClient` instance.\n---\n\n# usePublicClient\n\nHook for getting Viem [`PublicClient`](https://viem.sh/docs/clients/public) instance.\n\n## Import\n\n```ts\nimport { usePublicClient } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { usePublicClient } from 'wagmi'\n\nfunction App() {\n  const client = usePublicClient()\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n::: warning\nIf 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.\n:::\n\n## Parameters\n\n```ts\nimport { type UsePublicClientParameters } from 'wagmi'\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when getting Viem Public Client.\n\n::: code-group\n```ts [index.ts]\nimport { usePublicClient } from 'wagmi'\nimport { mainnet } from 'wagmi/chains' // [!code focus]\nimport { config } from './config'\n\nfunction App() {\n  const client = usePublicClient({\n    chainId: mainnet.id, // [!code focus]\n  })\n}\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { usePublicClient } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const client = usePublicClient({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type UsePublicClientReturnType } from 'wagmi'\n```\n\n`PublicClient | undefined`\n\nViem [`PublicClient`](https://viem.sh/docs/clients/public) instance.\n\n## Action\n\n- [`getPublicClient`](/core/api/actions/getPublicClient)\n- [`watchPublicClient`](/core/api/actions/watchPublicClient)\n"
  },
  {
    "path": "site/react/api/hooks/useReadContract.md",
    "content": "---\ntitle: useReadContract\ndescription: Hook for calling a read-only function on a contract, and returning the response.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'readContract'\nconst typeName = 'ReadContract'\nconst TData = 'ReadContractReturnType'\nconst TError = 'ReadContractErrorType'\n</script>\n\n# useReadContract\n\nHook for calling a **read-only** function on a contract, and returning the response.\n\nA **read-only** function (constant function) on a Solidity contract is denoted by a pure or view keyword. They can only read the state of the contract, and cannot make any changes to it. Since read-only methods do not change the state of the contract, they do not require any gas to be executed, and can be called by any user without the need to pay for gas.\n\n## Import\n\n```ts\nimport { useReadContract } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useReadContract } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useReadContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'totalSupply',\n  })\n}\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseReadContractParameters } from 'wagmi'\n```\n\n### abi\n\n`Abi | undefined`\n\nThe contract's ABI. Check out the [TypeScript docs](/react/typescript#const-assert-abis-typed-data) for how to set up ABIs for maximum type inference and safety.\n\n::: code-group\n```tsx [index.tsx]\nimport { useReadContract } from 'wagmi'\nimport { abi } from './abi' // [!code focus]\n\nfunction App() {\n  const result = useReadContract({\n    abi, // [!code focus]\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'totalSupply',\n  })\n}\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### account\n\n`Account | undefined`\n\nAccount to use when calling the contract (`msg.sender`).\n\n::: code-group\n```tsx [index.tsx]\nimport { useReadContract } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useReadContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'balanceOf',\n    args: ['0x6b175474e89094c44da98b954eedeac495271d0f'],\n    account: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### address\n\n`Address | undefined`\n\nThe contract's address.\n\n::: code-group\n```tsx [index.tsx]\nimport { useReadContract } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useReadContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f', // [!code focus]\n    functionName: 'totalSupply',\n  })\n}\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### args\n\n`readonly unknown[] | undefined`\n\n- Arguments to pass when calling the contract.\n- Inferred from [`abi`](#abi) and [`functionName`](#functionname).\n\n::: code-group\n```tsx [index.tsx]\nimport { useReadContract } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useReadContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'balanceOf',\n    args: ['0x6b175474e89094c44da98b954eedeac495271d0f'], // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n---\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to call contract at.\n\n::: code-group\n```tsx [index.tsx]\nimport { useReadContract } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useReadContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'totalSupply',\n    blockNumber: 17829139n, // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to call contract at.\n\n::: code-group\n```tsx [index.tsx]\nimport { useReadContract } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useReadContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'totalSupply',\n    blockTag: 'safe', // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```tsx [index.tsx]\nimport { useReadContract } from 'wagmi'\nimport { mainnet } from 'wagmi/chains' // [!code focus]\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useReadContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'totalSupply',\n    chainId: mainnet.id, // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useReadContract } from 'wagmi'\nimport { abi } from './abi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useReadContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'totalSupply',\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### functionName\n\n`string | undefined`\n\n- Function to call on the contract.\n- Inferred from [`abi`](#abi).\n\n::: code-group\n```tsx [index.tsx]\nimport { useReadContract } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useReadContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'balanceOf', // [!code focus]\n    args: ['0x6b175474e89094c44da98b954eedeac495271d0f'],\n  })\n}\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```tsx [index.tsx]\nimport { useReadContract } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useReadContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'balanceOf',\n    args: ['0x6b175474e89094c44da98b954eedeac495271d0f'],\n    scopeKey: 'foo', // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseReadContractReturnType } from 'wagmi'\n```\n\nThe return type's [`data`](#data) property is inferrable via the combination of [`abi`](#abi), [`functionName`](#functionname), and [`args`](#args). Check out the [TypeScript docs](/react/typescript#const-assert-abis-typed-data) for more info.\n\n<!--@include: @shared/query-result.md-->\n\n## Type Inference\n\nWith [`abi`](#abi) setup correctly, TypeScript will infer the correct types for [`functionName`](#functionname), [`args`](#args), and the return type. See the Wagmi [TypeScript docs](/react/typescript) for more information.\n\n::: code-group\n```ts twoslash [Inline]\n// @twoslash-cache: {\"v\":1,\"hash\":\"8bfa3d1e805ee2d7a8b83c91b1e75f961b748f9d5c3b79a8bca9b7494b57cb8e\",\"data\":\"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\"}\nimport { createConfig, http, useReadContract } from 'wagmi'\nimport { mainnet, sepolia } from 'wagmi/chains'\n\nconst config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n// ---cut---\nconst result = useReadContract({\n  abi: [\n    {\n      type: 'function',\n      name: 'balanceOf',\n      stateMutability: 'view',\n      inputs: [{ name: 'account', type: 'address' }],\n      outputs: [{ type: 'uint256' }],\n    },\n    {\n      type: 'function',\n      name: 'totalSupply',\n      stateMutability: 'view',\n      inputs: [],\n      outputs: [{ name: 'supply', type: 'uint256' }],\n    },\n  ],\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'balanceOf',\n  // ^?\n\n\n  args: ['0x6b175474e89094c44da98b954eedeac495271d0f'],\n  // ^?\n})\n\nresult.data\n//     ^?\n```\n```ts twoslash [Const-Asserted]\n// @twoslash-cache: {\"v\":1,\"hash\":\"9f8b59d36cf11dedf27c45ac2abd580ec38459b071c6641a3e4025c048f71072\",\"data\":\"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\"}\nimport { createConfig, http, useReadContract } from 'wagmi'\nimport { mainnet, sepolia } from 'wagmi/chains'\n\nconst config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n// ---cut---\nconst abi = [\n  {\n    type: 'function',\n    name: 'balanceOf',\n    stateMutability: 'view',\n    inputs: [{ name: 'account', type: 'address' }],\n    outputs: [{ type: 'uint256' }],\n  },\n  {\n    type: 'function',\n    name: 'totalSupply',\n    stateMutability: 'view',\n    inputs: [],\n    outputs: [{ name: 'supply', type: 'uint256' }],\n  },\n] as const\n\nconst result = useReadContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'balanceOf',\n  // ^?\n\n\n  args: ['0x6b175474e89094c44da98b954eedeac495271d0f'],\n  // ^?\n})\n\nresult.data\n//     ^?\n```\n:::\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`readContract`](/core/api/actions/readContract)\n"
  },
  {
    "path": "site/react/api/hooks/useReadContracts.md",
    "content": "---\ntitle: useReadContracts\ndescription: Hook for calling multiple read methods on a contract.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'readContracts'\nconst typeName = 'ReadContracts'\nconst TData = 'ReadContractsReturnType'\nconst TError = 'ReadContractsErrorType'\n</script>\n\n# useReadContracts\n\nHook for calling multiple read methods on a contract.\n\n## Import\n\n```ts\nimport { useReadContracts } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useReadContracts } from 'wagmi'\n\nconst wagmigotchiContract = {\n  address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',\n  abi: wagmigotchiABI,\n} as const\nconst mlootContract = {\n  address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n  abi: mlootABI,\n} as const\n\nfunction App() {\n  const result = useReadContracts({\n    contracts: [\n      {\n        ...wagmigotchiContract,\n        functionName: 'getAlive',\n      },\n      {\n        ...wagmigotchiContract,\n        functionName: 'getBoredom',\n      },\n      {\n        ...mlootContract,\n        functionName: 'getChest',\n        args: [69],\n      },\n      {\n        ...mlootContract,\n        functionName: 'getWaist',\n        args: [69],\n      },\n    ],\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseReadContractsParameters } from 'wagmi'\n```\n\n### contracts\n\n`readonly Contract[]`\n\nSet of contracts to call.\n\n#### abi\n\n`Abi | undefined`\n\nThe contract's ABI. Check out the [TypeScript docs](/react/typescript#const-assert-abis-typed-data) for how to set up ABIs for maximum type inference and safety.\n\n::: code-group\n```tsx [index.tsx]\nimport { useReadContracts } from 'wagmi'\n\nfunction App() {\n  const result = useReadContracts({\n    contracts: [\n      {\n        address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n        abi: mlootABI, // [!code hl]\n        functionName: 'getChest',\n        args: [69],\n      },\n      // ...\n    ],\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n#### address\n\n`Address | undefined`\n\nThe contract's address.\n\n::: code-group\n```tsx [index.tsx]\nimport { useReadContracts } from 'wagmi'\n\nfunction App() {\n  const result = useReadContracts({\n    contracts: [\n      {\n        address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',  // [!code hl]\n        abi: mlootABI,\n        functionName: 'getChest',\n        args: [69],\n      },\n      // ...\n    ],\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n#### functionName\n\n`string | undefined`\n\n- Function to call on the contract.\n- Inferred from [`abi`](#abi).\n\n::: code-group\n```tsx [index.tsx]\nimport { useReadContracts } from 'wagmi'\n\nfunction App() {\n  const result = useReadContracts({\n    contracts: [\n      {\n        address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n        abi: mlootABI,\n        functionName: 'getChest', // [!code hl]\n        args: [69],\n      },\n      // ...\n    ],\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n#### args\n\n`readonly unknown[] | undefined`\n\n- Arguments to pass when calling the contract.\n- Inferred from [`abi`](#abi) and [`functionName`](#functionname).\n\n::: code-group\n```tsx [index.tsx]\nimport { useReadContracts } from 'wagmi'\n\nfunction App() {\n  const result = useReadContracts({\n    contracts: [\n      {\n        address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n        abi: mlootABI,\n        functionName: 'getChest',\n        args: [69], // [!code hl]\n      },\n      // ...\n    ],\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n#### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```tsx [index.tsx]\nimport { useReadContracts } from 'wagmi'\n\nfunction App() {\n  const result = useReadContracts({\n    contracts: [\n      {\n        address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n        abi: mlootABI,\n        functionName: 'getChest',\n        args: [69],\n        chainId: 1  // [!code hl]\n      },\n      // ...\n    ],\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n\n### allowFailure\n\n`boolean`\n\nWhether or not the Hook should throw if a call reverts. If set to `true` (default), and a call reverts, then `useReadContracts` will fail silently and its error will be logged in the results array. Defaults to `true`.\n\n::: code-group\n```tsx [index.tsx]\nimport { useReadContracts } from 'wagmi'\n\nfunction App() {\n  const result = useReadContracts({\n    allowFailure: false, // [!code hl]\n    contracts: [\n      {\n        address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n        abi: mlootABI,\n        functionName: 'getChest',\n        args: [69]\n      },\n      // ...\n    ],\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n\n### batchSize\n\n`number`\n\nThe maximum size (in bytes) for each calldata chunk. Set to `0` to disable the size limit. Defaults to `1024`.\n\n> Note: Some RPC Providers limit the amount of calldata (`data`) that can be sent in a single `eth_call` request. It is best to check with your RPC Provider to see if there are any calldata size limits to `eth_call` requests.\n\n::: code-group\n```tsx [index.tsx]\nimport { useReadContracts } from 'wagmi'\n\nfunction App() {\n  const result = useReadContracts({\n    batchSize: 1024, // [!code hl]\n    contracts: [\n      {\n        address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n        abi: mlootABI,\n        functionName: 'getChest',\n        args: [69]\n      },\n      // ...\n    ],\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockNumber\n\n`number`\n\nThe block number to perform the read against.\n\n::: code-group\n```tsx [index.tsx]\nimport { useReadContracts } from 'wagmi'\n\nfunction App() {\n  const result = useReadContracts({\n    blockNumber: 69420n, // [!code hl]\n    contracts: [\n      {\n        address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n        abi: mlootABI,\n        functionName: 'getChest',\n        args: [69]\n      },\n      // ...\n    ],\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to read against.\n\n::: code-group\n```tsx [index.tsx]\nimport { useReadContracts } from 'wagmi'\n\nfunction App() {\n  const result = useReadContracts({\n    blockTag: 'safe', // [!code hl]\n    contracts: [\n      {\n        address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n        abi: mlootABI,\n        functionName: 'getChest',\n        args: [69]\n      },\n      // ...\n    ],\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useReadContracts } from 'wagmi'\nimport { config } from './config'\n\nfunction App() {\n  const result = useReadContracts({\n    config, // [!code hl]\n    contracts: [\n      {\n        address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n        abi: mlootABI,\n        functionName: 'getChest',\n        args: [69]\n      },\n      // ...\n    ],\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### multicallAddress\n\n`Address`\n\nAddress of multicall contract.\n\n::: code-group\n```tsx [index.tsx]\nimport { useReadContracts } from 'wagmi'\n\nfunction App() {\n  const result = useReadContracts({\n    contracts: [\n      {\n        address: '0x1dfe7ca09e99d10835bf73044a23b73fc20623df',\n        abi: mlootABI,\n        functionName: 'getChest',\n        args: [69]\n      },\n      // ...\n    ],\n    multicallAddress: '0xca11bde05977b3631167028862be2a173976ca11', // [!code hl]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseReadContractsReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`readContracts`](/core/api/actions/readContracts)\n"
  },
  {
    "path": "site/react/api/hooks/useReconnect.md",
    "content": "---\ntitle: useReconnect\ndescription: Hook for reconnecting connectors.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'reconnect'\nconst typeName = 'Reconnect'\nconst mutate = 'reconnect'\nconst TData = '{ accounts: readonly [Address, ...Address[]]; chainId: number; connector: Connector }'\nconst TError = 'ReconnectErrorType'\nconst TVariables = '{ connectors?: (CreateConnectorFn | Connector)[] | undefined; }'\n</script>\n\n# useReconnect\n\nHook for reconnecting [connectors](/core/api/connectors).\n\n## Import\n\n```ts\nimport { useReconnect } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useReconnect } from 'wagmi'\nimport { useEffect } from 'react'\n\nfunction App() {\n  const reconnect = useReconnect()\n  useEffect(() => {\n    reconnect.mutate()\n  }, [])\n}\n```\n\n:::\n\n::: tip\nWhen [`WagmiProvider['reconnectOnMount']`](/react/api/WagmiProvider#reconnectonmount) is `true`, `reconnect` is called automatically on mount.\n:::\n\n## Parameters\n\n```ts\nimport { type UseReconnectParameters } from 'wagmi'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useReconnect } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const reconnect = useReconnect({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseReconnectReturnType } from 'wagmi'\n```\n\n### connectors <Badge type=\"warning\">[deprecated](/react/guides/migrate-from-v2-to-v3#removed-useconnect-connectors-usereconnect-connectors)</Badge>\n\n`readonly Connector[]`\n\nGlobally configured connectors via [`createConfig`](/react/api/createConfig#connectors).\n\n::: code-group\n```tsx [index.tsx]\nimport { useReconnect } from 'wagmi'\nimport { mainnet } from 'wagmi/chains'\nimport { useEffect } from 'react'\n\nfunction App() {\n  const reconnect = useReconnect()\n\n  useEffect(() => {\n    reconnect.mutate({ connectors: reconnect.connectors })\n  }, [])\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-result.md-->\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`reconnect`](/core/api/actions/reconnect)\n"
  },
  {
    "path": "site/react/api/hooks/useSendCalls.md",
    "content": "---\ntitle: useSendCalls\ndescription: Hook that requests for the wallet to sign and broadcast a batch of calls (transactions) to the network. \n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'sendCalls'\nconst typeName = 'SendCalls'\nconst mutate = 'sendCalls'\nconst TData = 'SendCallsData'\nconst TError = 'SendCallsErrorType'\nconst TVariables = 'SendCallsVariables'\n</script>\n\n# useSendCalls\n\nHook that requests for the wallet to sign and broadcast a batch of calls (transactions) to the network. \n\n[Read more.](https://github.com/ethereum/EIPs/blob/815028dc634463e1716fc5ce44c019a6040f0bef/EIPS/eip-5792.md#wallet_sendcalls)\n\n## Import\n\n```ts\nimport { useSendCalls } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useSendCalls } from 'wagmi'\nimport { parseEther } from 'viem'\n\nfunction App() {\n  const sendCalls = useSendCalls()\n  return (\n    <button\n      onClick={() =>\n        sendCalls.mutate({\n          calls: [\n            {\n              to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n              value: parseEther('1')\n            },\n            {\n              data: '0xdeadbeef',\n              to: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n            },\n          ]\n        })\n      }\n    >\n      Send calls\n    </button>\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### Synchronous Usage\n\nIf you want to wait for the calls to be included in a block, you can use `useSendCallsSync`:\n\n::: code-group\n```tsx [index.tsx]\nimport { useSendCallsSync } from 'wagmi'\nimport { parseEther } from 'viem'\n\nfunction App() {\n  const sendCallsSync = useSendCallsSync()\n  return (\n    <button\n      onClick={() =>\n        sendCallsSync.mutate({\n          calls: [\n            {\n              to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n              value: parseEther('1')\n            },\n            {\n              data: '0xdeadbeef',\n              to: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n            },\n          ]\n        })\n      }\n    >\n      Send calls\n    </button>\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseSendCallsParameters } from 'wagmi'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useSendCalls } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const sendCalls = useSendCalls({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseSendCallsReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/mutation-result.md-->\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`sendCalls`](/core/api/actions/sendCalls)\n"
  },
  {
    "path": "site/react/api/hooks/useSendTransaction.md",
    "content": "---\ntitle: useSendTransaction\ndescription: Hook for creating, signing, and sending transactions to networks.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'sendTransaction'\nconst typeName = 'SendTransaction'\nconst mutate = 'sendTransaction'\nconst TData = 'SendTransactionData'\nconst TError = 'SendTransactionErrorType'\nconst TVariables = 'SendTransactionVariables'\n</script>\n\n# useSendTransaction\n\nHook for creating, signing, and sending transactions to networks.\n\n## Import\n\n```ts\nimport { useSendTransaction } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useSendTransaction } from 'wagmi'\nimport { parseEther } from 'viem'\n\nfunction App() {\n  const sendTransaction = useSendTransaction()\n  return (\n    <button\n      onClick={() =>\n        sendTransaction.mutate({\n          to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n          value: parseEther('0.01'),\n        })\n      }\n    >\n      Send transaction\n    </button>\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### Synchronous Usage\n\nIf you want to wait for the transaction to be included in a block, you can use `useSendTransactionSync`:\n\n::: code-group\n```tsx [index.tsx]\nimport { useSendTransactionSync } from 'wagmi'\nimport { parseEther } from 'viem'\n\nfunction App() {\n  const sendTransactionSync = useSendTransactionSync()\n  return (\n    <button\n      onClick={() =>\n        sendTransactionSync.mutate({\n          to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n          value: parseEther('0.01'),\n        })\n      }\n    >\n      Send transaction\n    </button>\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseSendTransactionParameters } from 'wagmi'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useSendTransaction } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const sendTransaction = useSendTransaction({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseSendTransactionReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/mutation-result.md-->\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`sendTransaction`](/core/api/actions/sendTransaction)\n"
  },
  {
    "path": "site/react/api/hooks/useShowCallsStatus.md",
    "content": "---\ntitle: useShowCallsStatus\ndescription: Action to request for the wallet to show information about a call batch\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'showCallsStatus'\nconst typeName = 'ShowCallsStatus'\nconst mutate = 'showCallsStatus'\nconst TData = 'ShowCallsStatusData'\nconst TError = 'ShowCallsStatusErrorType'\nconst TVariables = 'ShowCallsStatusVariables'\n</script>\n\n# useShowCallsStatus\n\nAction to request for the wallet to show information about a call batch that was sent via `useSendCalls`.\n\n[Read more.](https://github.com/ethereum/EIPs/blob/1663ea2e7a683285f977eda51c32cec86553f585/EIPS/eip-5792.md#wallet_showcallsstatus)\n\n \n\n## Import\n\n```ts\nimport { useShowCallsStatus } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useShowCallsStatus } from 'wagmi'\nimport { parseEther } from 'viem'\n\nfunction App() {\n  const showCallsStatus = useShowCallsStatus()\n  return (\n    <button\n      onClick={() =>\n        showCallsStatus.mutate({\n          id: '0x1234567890abcdef',\n        })\n      }\n    >\n      Show calls status\n    </button>\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseShowCallsStatusParameters } from 'wagmi'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useShowCallsStatus } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const showCallsStatus = useShowCallsStatus({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseShowCallsStatusReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/mutation-result.md-->\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`showCallsStatus`](/core/api/actions/showCallsStatus)\n"
  },
  {
    "path": "site/react/api/hooks/useSignMessage.md",
    "content": "---\ntitle: useSignMessage\ndescription: Hook for signing messages.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'signMessage'\nconst typeName = 'SignMessage'\nconst mutate = 'signMessage'\nconst TData = 'SignMessageData'\nconst TError = 'SignMessageErrorType'\nconst TVariables = 'SignMessageVariables'\n</script>\n\n# useSignMessage\n\nHook for signing messages.\n\n## Import\n\n```ts\nimport { useSignMessage } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useSignMessage } from 'wagmi'\n\nfunction App() {\n  const signMessage = useSignMessage()\n  return (\n    <button onClick={() => signMessage.mutate({ message: 'hello world' })}>\n      Sign message\n    </button>\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseSignMessageParameters } from 'wagmi'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useSignMessage } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const signMessage = useSignMessage({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseSignMessageReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/mutation-result.md-->\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`signMessage`](/core/api/actions/signMessage)\n"
  },
  {
    "path": "site/react/api/hooks/useSignTransaction.md",
    "content": "---\ntitle: useSignTransaction\ndescription: Hook for signing transactions.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'signTransaction'\nconst typeName = 'SignTransaction'\nconst mutate = 'signTransaction'\nconst TData = 'SignTransactionData'\nconst TError = 'SignTransactionErrorType'\nconst TVariables = 'SignTransactionVariables'\n</script>\n\n# useSignTransaction\n\nHook for signing transactions.\n\n## Import\n\n```ts\nimport { useSignTransaction } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useSignTransaction } from 'wagmi'\nimport { parseEther } from 'viem'\n\nfunction App() {\n  const signTransaction = useSignTransaction()\n  return (\n    <button\n      onClick={() =>\n        signTransaction.mutate({\n          to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n          value: parseEther('0.01'),\n        })\n      }\n    >\n      Sign transaction\n    </button>\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseSignTransactionParameters } from 'wagmi'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useSignTransaction } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const signTransaction = useSignTransaction({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseSignTransactionReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/mutation-result.md-->\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`signTransaction`](/core/api/actions/signTransaction)\n"
  },
  {
    "path": "site/react/api/hooks/useSignTypedData.md",
    "content": "---\ntitle: useSignTypedData\ndescription: Hook for signing typed data and calculating an Ethereum-specific EIP-712 signature.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'signTypedData'\nconst typeName = 'SignTypedData'\nconst mutate = 'signTypedData'\nconst TData = 'SignTypedDataData'\nconst TError = 'SignTypedDataErrorType'\nconst TVariables = 'SignTypedDataVariables'\n</script>\n\n# useSignTypedData\n\nHook for signing typed data and calculating an Ethereum-specific [EIP-712](https://eips.ethereum.org/EIPS/eip-712) signature.\n\n## Import\n\n```ts\nimport { useSignTypedData } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useSignTypedData } from 'wagmi'\n\nfunction App() {\n  const signTypedData = useSignTypedData()\n  return (\n    <button\n      onClick={() =>\n        signTypedData.mutate({\n          types: {\n            Person: [\n              { name: 'name', type: 'string' },\n              { name: 'wallet', type: 'address' },\n            ],\n            Mail: [\n              { name: 'from', type: 'Person' },\n              { name: 'to', type: 'Person' },\n              { name: 'contents', type: 'string' },\n            ],\n          },\n          primaryType: 'Mail',\n          message: {\n            from: {\n              name: 'Cow',\n              wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n            },\n            to: {\n              name: 'Bob',\n              wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n            },\n            contents: 'Hello, Bob!',\n          },\n        })\n      }\n    >\n      Sign message\n    </button>\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseSignTypedDataParameters } from 'wagmi'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useSignTypedData } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const signTypedData = useSignTypedData({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseSignTypedDataReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/mutation-result.md-->\n\n## Type Inference\n\nWith [`types`](/core/api/actions/signTypedData#types) setup correctly, TypeScript will infer the correct types for [`domain`](/core/api/actions/signTypedData#domain), [`message`](/core/api/actions/signTypedData#message), and [`primaryType`](/core/api/actions/signTypedData#primarytype). See the Wagmi [TypeScript docs](/react/typescript) for more information.\n\n::: code-group\n```ts twoslash [Inline]\n// @twoslash-cache: {\"v\":1,\"hash\":\"d2bde2039b22db2dad4de0b0b1a903198c36d1f3885f32042523a928c54eac6c\",\"data\":\"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\"}\nimport { useSignTypedData } from 'wagmi'\n// ---cut---\nconst signTypedData = useSignTypedData()\n\nsignTypedData.mutate({\n  types: {\n    Person: [\n      { name: 'name', type: 'string' },\n      { name: 'wallet', type: 'address' },\n    ],\n    Mail: [\n      { name: 'from', type: 'Person' },\n      { name: 'to', type: 'Person' },\n      { name: 'contents', type: 'string' },\n    ],\n  },\n  primaryType: 'Mail',\n  // ^?\n\n\n  message: {\n  // ^?\n\n\n\n\n\n\n\n\n\n\n\n\n    from: {\n      name: 'Cow',\n      wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n    },\n    to: {\n      name: 'Bob',\n      wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n    },\n    contents: 'Hello, Bob!',\n  },\n})\n```\n```ts twoslash [Const-Asserted]\n// @twoslash-cache: {\"v\":1,\"hash\":\"8427c5e54a9e414e6af6101fcf5a4a859fe80517a66aac11a86d69f45d4b46b5\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BjCMONAAkxzkXeAB0w7Ye1IwAhlBYAbDOwAKZOC15jJMuakEidoiVLCz2YcQFsYvfuDMwrAbm27hag0a4X2VtqQCWYAOb2jsIAvhR8wbouGsY2liAA7uLS0jBoQUJOeuqGcu7xklBicHAZOiEAug6ZzvoxALLiPtKqdbnsWjVRbUYm5vEAZqQQpmVZ0e35niCKpMpgY6HhAl06E71x02gQi905btgeVrPzu2ERqyLrcn1HIMxgNI+lINVZ2a55h/HefoGvkUq1RClBAbHEpAYiAAbFRUgE0PgkABWKhoCH+NJ4dwIOF+XCIAAMVEY+Ah4kYNHIMLC6EOeEIJHIaLoUJAAAosMMcJCMABKBRKFQfGKdNY9G6bKy3XbXTjfaa/AIZc4rcX7SX9aZJFJpWUS+U4ApQIrwF7Aiqg8GQpAARgAHHCYAikTC0RisYgZkKwKDpPi7SSyaQKVSkAAmWnUelexlkUE0eh4TncsiYAW3eIykBW9E2xAAZgALE6XUgS9QPWzbn6A4hw0HyZT4zSKHScAziPGWUmvSmIDz04a7kr/rmIVCi46QPD/Ijy+7SJi2e5a2ACQ37sHQy3w4So6vY13mdRWcmuQO0/zYlqrDrUukc1RrVCAOyb2fzxAVvPLvA1vF1yQAtGxDZtqWhA8YwIY8EzPPsL0Ha8pisQpihecd83tadP1dH8q2xelAIJECtybMN60jNtow7I8mTg3sOUQq8BUaZpWg1Do1SuA1M2mIYRn1TiUO9OYWBVZZIjlPirG2ITPmHeITnEgEwFVKTeKle4WCeNBzQ04SFS8NBfGVVTKkwqFbVtCtcIXSsl09EA2OkNcCVRMiwIoqj2wJGD6J7Nl+yQjMtIE0YnzBPMrPDHDnTnPDFz/L0AJnOtYU8ncIKg2j/O7U9GOCljFOmZSFkil87SLD94q/fDHJXIi0qAt1MvAiN92ow88pPRMguY3lQtvagdgq6K7WhDK7O/JKnNS/0WtfUCsqQSCuuguNevgpjU0Gkrjh9KxLLtV84rLGaHOSmjcGIpAlraiiHRyvzNoY/rdqHGTtMeZ09KO59xvrQkavO+qrvmutp1JciWzW3zOwCgr3svPaRNHf6oonCM91LBL7N/JzV1uxAoe3dr6yLZ6EfyvrCJwdgHjYdgAF4LnVBSyo4hSxXGTThuzN5ecMo1FRMv4zkky5ak4r77z1VT3jlES0LNM4qgMhSXK50VuKcaSwuGCLBb1g0RLKiW2aFhSvrkhWrZiM3DrtpZLZNmWtIeXT9KlkVJiMqLTP+Y32CBQQQQBrGKbOvHEA8gm2UZhhidtYkHpbZEqbomntsT9g4B8fwwAAFUOKAABFxHRXgAFU4BgABlAvi9Liv0QAJTSABXUhm5wAAeTuwAAa0gBIwAAPmO+toVtXGv1tUj47wfPC5LnBy8r8Q3LtTdoa82HM56t7k2SHxxDgAVO7rxvV5bzeB+H0eJ85clzCpOAAH5eF1hmWAGAuv7sAAMJ/wLuwAAPuwQesB/7rigMHUwnd0RoB8CwQBP8dAsHqEgyuMBAHsnZEQCEZ8ABGqQeCu3eMOChGCqHCGQLQXgo4Kja3aGvGAG90TyFfmkMgyB1Y+3eAw3gAADUcyAAAkwBRyVBESwqBYAYH4ngZEOh9DGHsBEQMQelJUFgEkdIsWARZHyOgTAWBHDg5qI6BokRKsSgGJkRUORvAzEWJUYIrIwjNEkIgBAaQjijH+BMa4xR5jlFWLUd4kRJCMA0DgIEwOISFFKLgZEuh0TYnxPDIkv4yS3ERNUVE2xWT4AFlycY5xpiwnuPSVQzJcT4C2gqcEqpoTUmWKKRkkpjS4BFhafkmphTPFOAafE5EAy2kpPCWkrp9SenxOhJMlx0zalzKEQs+Ar5lnVI6R46xOgxnwHtDs9pMzOkjN0EcuAABOU5qzhkHJENclO9yCmzMuYczZcBrJvKGR8p56jRGlJ+TkqRTiVnvIuYCmxwLekLz+XsupGy4XxJsoi85+zAUvImeCoJgykXrK8d820Sy8VJKmVCrFTyXnbPJXkyl/zoXYpJSc+llTIVMupQcl5dz2WtM5YSz5zzvl7gxWs4VQKfG9PDM0/lBLMXIuJai+A4YwWGIpYKxVRLRmivKfKxlQqYXXPDP0g1WqJXGtFbijVDKLWPJZSquA4YyW2o5bs7VkrYXSuyXSt1AqPWWsdT61VbL/UKqDTS0VfLw2Gs9Vap1BZCTiodVGxNcrY32oBcGmJvSCzqohYG1NPLbF+DQCm7NabNFlrDYWs5kaS2iLLaSitzKq0iLLaa1t3LrHRLLfm7tSrdVNseEWZN5qi2VsbdW0dtb8Vxobb20tjxkSurrQ8qdS6R1oGhGazNk623To7Y8d8g6dVXOXWge047931uLVumdV652aoPT24p26blrvnVmw9D7j1oBTnu9dVKh0Xu3dZAt37X2ga+eBsVE672bvfY+20sUz1er7Y8BeX6X2Id/ch/9NkgNQbw2+7p4HkSQdwxu/D5GUPQhvcBrlMGRXgehM+u10Hz2wZQ6+HDnHSMsalYR+0xHqMge46xlDNyqMCZo2R+Z269yMZI/JoT3r/17g4+6wTknhOdpbQhtTemNOdq7UZiTGHL3hgHRZ5jJnMNoFNSp8T9mrNKanOhhNj7wyrq8zmzuZb/PtsC48bTAbdPuc0aFgD/GdPGaiyImL5nb0Je80l/tsn4uWfSzFsdwWj15fCxG+9BGYt+bs0agLZbd0Fb/TF09lX43VbCy5uTOWWtPrq2Vstn7ut0Yy1hwkYn2tudy821D/XFPRebfB1LHWQuzeKwu0rA2YvYamyimbWGiwjey2NzrtpKObeVdt2LN72AADpruCB8KYLAEBIRQOvk3dhnCt5UCkIwBAsY0BoCwDwAA9IDpI/hTA+Eu3AfAgO1CUkB+ILAPhAeEAgEPOAgOr4N1e3fdEU9wyvnutNUls02SY5vr3DhrcPvNQJKh5a5M1WH1eoFJgLAmYrwp+9muL3b7rypx3NA3cKcPxHhAMek8I75nDDcwntVXQLxJ8vbHfPN7b0QDZenFFOrwyzltQqA0hyIOQR4PuP85Sc19kYHmbtrZaQFnMpW/t0bOxDpLRWfM7hy0fHUx3ItUImnQmrYOcotaW80LQ6WtvhrhV2OzB2/tzYu/Uj7fWw1bY+9Ngnp2wdk/u/dsNT2v1vZ54UmjIJQew7hCsC5Kw49CHEPEGQ+A39Ig4hbyng0Fu5TW6oanu49vLm+5HOXl35Q3dqL7/EL3sf7Z+z9yAexxesihw75xUP3eI97Cj3cGPo/Z8HHn4nupueJ8e/iOn89Q+lLZ7mSfuhk/piF+eDPm38f5/O+PwI8owdruXfYEWdgUwR7GAK7a7YOB4dcSkR7QBEBMASA7YUgCBBLc4AcFBNnQBbBY3AAeSwDQNYD7l/3HiQKpQFGZiIKIAgB8CgCngLGsjnldAyiXi9CN1wTVw1zTmpBsiZ1ghZwQg+mQkOBoQ1hiC7wNB7zj3aC+gHxLzf2H0Dgtk3wfzvGSAfBfzD32gXwD1ViTy/x4jXyaBaHUPEL0O30GENjUKv1Khvy6Dvy3xiBtlGgz2FjuCP0BHH1f0kI9h0iLwsMz3fxHxzwEXDkxnzHzRBhjjjgIi9BxDYI8j3hWnrG4MRlpj4JRiHC5DuwhAwHYWvzEnKiQOrwMIxkqkLFoPoLtFnkuicgyNMCyPYTYIyniIZ0PgAEdO4yAMBj5UiQp2Aai6is88irACjnIiixpI4CwyiZw5cKjFcvQ+jSBsimoFpadGiyZvIkjs59d+CBRzAShxBMR28dBwpDisg+JRw6kvdRFCRaB5UREc9g5tgTinAzigkLiVC0gribjw07jARwDvDngmFXiw4aDV1yjEB7omCQBdi4B9iboac7QblNddxWj2iFiuido0jrxoTYSnj2BjjKEdAXjA43jdQ0BPjbj7jW8IBcTCTNhzi5lLjNFriKTfjIgn89JATiTgTJcoQCxQSpjzoISoioSzRYS2DESOCIwNi9dkYej8Sf4iS/hg5GSRFmTvjgQaD7RSJpowYnJwo1d80kTqRKZ1pcpmckZzxtibwPBRwaCZcwTdTqwbADTSImiKI4ZrpqYZTLTMSBQVS1SZEREp4ixicBSY5GDhSvcDSKw3SD5TSXoeCLTujipHjKFFSAhlT3iySmSvjAyNSeTyx7RKjppNxITtgDTViYZjTpT0Sio9p0z/BgybltTpiLpISIYWoCx7pYzsp4yvTayDdrx/Tcz8UgyCzY46cwyvwIyGo8AoziYCxSYqzVoazeCMSej2SKFbTxzkQCcwTpxITNy1cx0jTyxKgSRoA/Jc4cQWZLYLdkBIhgBrTeAAByW4F88IKYF80cF813R8589gF8r3D8kqF8xfX8sIRwCoCgRwUPB8roJ8viF88KECr8sqCCmChCgCl87YVChUF89Cv8rCpCzcvCkWb8oJDCqCzCkIdgc+X+VgdIBYMAXODnN7KnW8snZXSnTedkPkQQQQNinHcQS7FgmgdkbiHETC4QeYxY8ilyD8gS5i4QbEg4i4JSjS5izSzSo4w2Gk7CkBBIRSy4Rkl864oBMucMcQAsKAG5AAMWbPtAAFEF4LKbkixXwnLGBCRkQABBEhIBV8Oypy18YsMuAYe0MuMue0F1YysfKk/SpCgAIQgBITit0FMuuJISSuyqSrypIVypyoKqKqKuKpytKuysqtyuyvSqWDZP+I5MAoAAkYAUgIBwgUqSEABCdKyCtSPkUEN+LeRAUAVkZ0fOFgbEBAEIEIIAA==\"}\nimport { useSignTypedData } from 'wagmi'\n// ---cut---\nconst types = {\n  Person: [\n    { name: 'name', type: 'string' },\n    { name: 'wallet', type: 'address' },\n  ],\n  Mail: [\n    { name: 'from', type: 'Person' },\n    { name: 'to', type: 'Person' },\n    { name: 'contents', type: 'string' },\n  ],\n} as const\n\nconst signTypedData = useSignTypedData()\n\nsignTypedData.mutate({\n  types,\n  primaryType: 'Mail',\n  // ^?\n\n\n  message: {\n  // ^?\n\n\n\n\n\n\n\n\n\n\n\n\n    from: {\n      name: 'Cow',\n      wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n    },\n    to: {\n      name: 'Bob',\n      wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n    },\n    contents: 'Hello, Bob!',\n  },\n})\n```\n:::\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`signTypedData`](/core/api/actions/signTypedData)\n"
  },
  {
    "path": "site/react/api/hooks/useSimulateContract.md",
    "content": "---\ntitle: useSimulateContract\ndescription: Hook for simulating/validating a contract interaction.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'simulateContract'\nconst typeName = 'SimulateContract'\nconst TData = 'SimulateContractReturnType'\nconst TError = 'SimulateContractErrorType'\n</script>\n\n# useSimulateContract\n\nHook for simulating/validating a contract interaction.\n\n## Import\n\n```ts\nimport { useSimulateContract } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useSimulateContract } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useSimulateContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'transferFrom',\n    args: [\n      '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      123n,\n    ],\n  })\n}\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n\n::: details Composing with `useWriteContract`\n\n`useSimulateContract` can be combined with [`useWriteContract`](/react/api/hooks/useWriteContract) to reduce the amount of validation required by wallets.\n\n::: code-group\n```tsx [index.tsx]\nimport { useSimulateContract, useWriteContract } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const { data } = useSimulateContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'transferFrom',\n    args: [\n      '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      123n,\n    ],\n  })\n  const { writeContract } = useWriteContract()\n  return (\n    <button\n      disabled={!data?.request}\n      onClick={() => writeContract(data!.request)}\n    >\n      Transfer\n    </button>\n  )\n}\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseSimulateContractParameters } from 'wagmi'\n```\n\n### abi\n\n`Abi | undefined`\n\nThe contract's ABI. Check out the [TypeScript docs](/react/typescript#const-assert-abis-typed-data) for how to set up ABIs for maximum type inference and safety.\n\n::: code-group\n```tsx [index.tsx]\nimport { useSimulateContract } from 'wagmi'\nimport { abi } from './abi' // [!code focus]\n\nfunction App() {\n  const result = useSimulateContract({\n    abi, // [!code focus]\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'transferFrom',\n    args: [\n      '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      123n,\n    ],\n  })\n}\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### accessList\n\n`AccessList | undefined`\n\nThe access list.\n\n::: code-group\n```tsx [index.ts]\nimport { useSimulateContract } from 'wagmi'\nimport { abi } from './abi'\nimport { config } from './config'\n\nfunction App() {\n  const result = useSimulateContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'transferFrom',\n    args: [\n      '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      123n,\n    ],\n    accessList: [{ // [!code focus]\n      address: '0x1', // [!code focus]\n      storageKeys: ['0x1'], // [!code focus]\n    }], // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### account\n\n`Account | undefined`\n\nAccount to use when calling the contract (`msg.sender`). Throws if account is not found on [`connector`](#connector).\n\n::: code-group\n```tsx [index.tsx]\nimport { useSimulateContract } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useSimulateContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'transferFrom',\n    args: [\n      '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      123n,\n    ],\n    account: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### address\n\n`Address | undefined`\n\nThe contract's address.\n\n::: code-group\n```tsx [index.tsx]\nimport { useSimulateContract } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useSimulateContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f', // [!code focus]\n    functionName: 'transferFrom',\n    args: [\n      '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      123n,\n    ],\n  })\n}\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### args\n\n`readonly unknown[] | undefined`\n\n- Arguments to pass when calling the contract.\n- Inferred from [`abi`](#abi) and [`functionName`](#functionname).\n\n::: code-group\n```tsx [index.tsx]\nimport { useSimulateContract } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useSimulateContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f', \n    functionName: 'transferFrom',\n    args: [ // [!code focus]\n      '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n      '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', // [!code focus]\n      123n, // [!code focus]\n    ], // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n---\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to call contract at.\n\n::: code-group\n```tsx [index.tsx]\nimport { useSimulateContract } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useSimulateContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f', \n    functionName: 'transferFrom',\n    args: [\n      '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      123n,\n    ],\n    blockNumber: 17829139n, // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to call contract at.\n\n::: code-group\n```tsx [index.tsx]\nimport { useSimulateContract } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useSimulateContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f', \n    functionName: 'transferFrom',\n    args: [\n      '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      123n,\n    ],\n    blockTag: 'safe', // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```tsx [index.tsx]\nimport { useSimulateContract } from 'wagmi'\nimport { mainnet } from 'wagmi/chains' // [!code focus]\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useSimulateContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f', \n    functionName: 'transferFrom',\n    args: [\n      '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      123n,\n    ],\n    chainId: mainnet.id, // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useSimulateContract } from 'wagmi'\nimport { abi } from './abi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useSimulateContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f', \n    functionName: 'transferFrom',\n    args: [\n      '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      123n,\n    ],\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### connector\n\n`Connector | undefined`\n\n[Connector](/react/api/connectors) to simulate transaction with.\n\n::: code-group\n```tsx [index.ts]\nimport { useConnectorClient, useSimulateContract } from 'wagmi'\nimport { abi } from './abi'\nimport { config } from './config'\n\nfunction App() {\n  const { data: connector } = useConnectorClient()\n  const result = useSimulateContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'transferFrom',\n    args: [\n      '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      123n,\n    ],\n    connector, // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### dataSuffix\n\n`` `0x${string}` | undefined ``\n\nData to append to the end of the calldata. Useful for adding a [\"domain\" tag](https://opensea.notion.site/opensea/Seaport-Order-Attributions-ec2d69bf455041a5baa490941aad307f).\n\n::: code-group\n```tsx [index.ts]\nimport { useSimulateContract } from 'wagmi'\nimport { parseGwei } from 'viem'\nimport { abi } from './abi'\nimport { config } from './config'\n\nfunction App() {\n  const result = useSimulateContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'transferFrom',\n    args: [\n      '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      123n,\n    ],\n    dataSuffix: '0xdeadbeef', // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### functionName\n\n`string | undefined`\n\n- Function to call on the contract.\n- Inferred from [`abi`](#abi).\n\n::: code-group\n```tsx [index.tsx]\nimport { useSimulateContract } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const result = useSimulateContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f', \n    functionName: 'transferFrom', // [!code focus]\n    args: [\n      '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      123n,\n    ],\n  })\n}\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### gas\n\n`bigint | undefined`\n\nGas provided for transaction execution.\n\n::: code-group\n```tsx [index.ts]\nimport { useSimulateContract } from 'wagmi'\nimport { parseGwei } from 'viem'\nimport { abi } from './abi'\nimport { config } from './config'\n\nfunction App() {\n  const result = useSimulateContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'transferFrom',\n    args: [\n      '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      123n,\n    ],\n    gas: parseGwei('20'), // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n---\n\n### gasPrice\n\n`bigint | undefined`\n\nThe price in wei to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms#legacy-transaction).\n\n::: code-group\n```tsx [index.ts]\nimport { useSimulateContract } from 'wagmi'\nimport { parseGwei } from 'viem'\nimport { abi } from './abi'\nimport { config } from './config'\n\nfunction App() {\n  const result = useSimulateContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'transferFrom',\n    args: [\n      '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      123n,\n    ],\n    gasPrice: parseGwei('20'), // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### maxFeePerGas\n\n`bigint | undefined`\n\nTotal fee per gas in wei, inclusive of [`maxPriorityFeePerGas`](#maxPriorityFeePerGas). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n```tsx [index.ts]\nimport { useSimulateContract } from 'wagmi'\nimport { parseGwei } from 'viem'\nimport { abi } from './abi'\nimport { config } from './config'\n\nfunction App() {\n  const result = useSimulateContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'transferFrom',\n    args: [\n      '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      123n,\n    ],\n    maxFeePerGas: parseGwei('20'), // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### maxPriorityFeePerGas\n\n`bigint | undefined`\n\nMax priority fee per gas in wei. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n```tsx [index.ts]\nimport { useSimulateContract } from 'wagmi'\nimport { parseGwei } from 'viem'\nimport { abi } from './abi'\nimport { config } from './config'\n\nfunction App() {\n  const result = useSimulateContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'transferFrom',\n    args: [\n      '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      123n,\n    ],\n    maxFeePerGas: parseGwei('20'),\n    maxPriorityFeePerGas: parseGwei('2'), // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n---\n\n### nonce\n\n`number`\n\nUnique number identifying this transaction.\n\n::: code-group\n```tsx [index.ts]\nimport { useSimulateContract } from 'wagmi'\nimport { abi } from './abi'\nimport { config } from './config'\n\nfunction App() {\n  const result = useSimulateContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'transferFrom',\n    args: [\n      '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      123n,\n    ],\n    nonce: 123, // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### type\n\n`'legacy' | 'eip1559' | 'eip2930' | undefined`\n\nOptional transaction request type to narrow parameters.\n\n::: code-group\n```tsx [index.ts]\nimport { useSimulateContract } from 'wagmi'\nimport { abi } from './abi'\nimport { config } from './config'\n\nfunction App() {\n  const result = useSimulateContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'transferFrom',\n    args: [\n      '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      123n,\n    ],\n    type: 'eip1559', // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### value\n\n`bigint | undefined`\n\nValue in wei sent with this transaction.\n\n::: code-group\n```tsx [index.ts]\nimport { useSimulateContract } from 'wagmi'\nimport { parseEther } from 'viem'\nimport { abi } from './abi'\nimport { config } from './config'\n\nfunction App() {\n  const result = useSimulateContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'transferFrom',\n    args: [\n      '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      123n,\n    ],\n    value: parseEther('0.01'), // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```tsx [index.ts]\nimport { useSimulateContract } from 'wagmi'\nimport { abi } from './abi'\nimport { config } from './config'\n\nfunction App() {\n  const result = useSimulateContract({\n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'transferFrom',\n    args: [\n      '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      123n,\n    ],\n    scopeKey: 'foo', // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseSimulateContractReturnType } from 'wagmi'\n```\n\nThe return type's [`data`](#data) property is inferrable via the combination of [`abi`](#abi), [`functionName`](#functionname), and [`args`](#args). Check out the [TypeScript docs](/react/typescript#const-assert-abis-typed-data) for more info.\n\n<!--@include: @shared/query-result.md-->\n\n## Type Inference\n\nWith [`abi`](#abi) setup correctly, TypeScript will infer the correct types for [`functionName`](#functionname), [`args`](#args), and [`value`](#value). See the Wagmi [TypeScript docs](/react/typescript) for more information.\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`simulateContract`](/core/api/actions/simulateContract)\n"
  },
  {
    "path": "site/react/api/hooks/useStorageAt.md",
    "content": "---\ntitle: useStorageAt\ndescription: Hook for returning the value from a storage slot at a given address.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'getStorageAt'\nconst typeName = 'GetStorageAt'\nconst TData = 'GetStorageAtData'\nconst TError = 'GetStorageAtErrorType'\n</script>\n\n# useStorageAt\n\nHook for returning the value from a storage slot at a given address.\n\n## Import\n\n```ts\nimport { useStorageAt } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useStorageAt } from 'wagmi'\n\nfunction App() {\n  const result = useStorageAt({\n    address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n    slot: '0x0',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseStorageAtParameters } from 'wagmi'\n```\n\n### address\n\n`Address | undefined`\n\nThe contract address.\n\n::: code-group\n```tsx [index.tsx]\nimport { useStorageAt } from 'wagmi'\n\nfunction App() {\n  const result = useStorageAt({\n    address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', // [!code focus]\n    slot: '0x0',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### slot\n\n`Hex | undefined`\n\nThe storage position (as a hex encoded value).\n\n::: code-group\n```tsx [index.tsx]\nimport { useStorageAt } from 'wagmi'\n\nfunction App() {\n  const result = useStorageAt({\n    address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n    slot: '0x0', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## blockNumber\n\n`bigint | undefined`\n\nThe block number to check the storage at.\n\n::: code-group\n```tsx [index.tsx]\nimport { useStorageAt } from 'wagmi'\n\nfunction App() {\n  const result = useStorageAt({\n    address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n    blockNumber: 16280770n, // [!code focus]\n    slot: '0x0',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nThe block tag to check the storage at.\n\n::: code-group\n```tsx [index.tsx]\nimport { useStorageAt } from 'wagmi'\n\nfunction App() {\n  const result = useStorageAt({\n    address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n    blockTag: 'safe', // [!code focus]\n    slot: '0x0',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nThe chain ID to check the storage at.\n\n::: code-group\n```tsx [index.tsx]\nimport { useStorageAt } from 'wagmi'\nimport { mainnet } from '@wagmi/core/chains'\n\nfunction App() {\n  const result = useStorageAt({\n    chainId: mainnet.id, // [!code focus]\n    address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n    slot: '0x0',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useStorageAt } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useStorageAt({\n    config, // [!code focus]\n    address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n    slot: '0x0',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```tsx [index.tsx]\nimport { useStorageAt } from 'wagmi'\nimport { config } from './config'\n\nfunction App() {\n  const result = useStorageAt({\n    scopeKey: 'foo' // [!code focus]\n    address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n    slot: '0x0',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseStorageAtReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getStorageAt`](/core/api/actions/getStorageAt)\n"
  },
  {
    "path": "site/react/api/hooks/useSwitchChain.md",
    "content": "---\ntitle: useSwitchChain\ndescription: Hook for switching the target chain for a connector or the Wagmi `Config`.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'switchChain'\nconst typeName = 'SwitchChain'\nconst mutate = 'switchChain'\nconst TData = 'SwitchChainData'\nconst TError = 'SwitchChainErrorType'\nconst TVariables = 'SwitchChainVariables'\n</script>\n\n# useSwitchChain\n\nHook for switching the target chain for a connector or the Wagmi [`Config`](/react/api/createConfig#config).\n\n## Import\n\n```ts\nimport { useSwitchChain } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useChains, useSwitchChain } from 'wagmi'\n\nfunction App() {\n  const switchChain = useSwitchChain()\n  const chains = useChains()\n  return (\n    <div>\n      {chains.map((chain) => (\n        <button key={chain.id} onClick={() => switchChain.mutate({ chainId: chain.id })}>\n          {chain.name}\n        </button>\n      ))}\n    </div>\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n::: tip\nWhen connected, `switchChain` will switch the target chain for the connector. When not connected, `switchChain` will switch the target chain for the Wagmi [`Config`](/react/api/createConfig#config).\n:::\n\n## Parameters\n\n```ts\nimport { type UseSwitchChainParameters } from 'wagmi'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useSwitchChain } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const switchChain = useSwitchChain({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseSwitchChainReturnType } from 'wagmi'\n```\n\n### chains <Badge type=\"warning\">[deprecated](/react/guides/migrate-from-v2-to-v3#removed-useswitchchain-chains)</Badge>\n\n`readonly [Chain, ...Chain[]]`\n\nGlobally configured chains. Useful for rendering a list of available chains to switch to.\n\n::: code-group\n```tsx [index.tsx]\nimport { useSwitchChain } from 'wagmi'\n\nfunction App() {\n  const switchChain = useSwitchChain()\n  return (\n    <div>\n      {switchChain.chains.map((chain) => (\n        <button key={chain.id} onClick={() => switchChain({ chainId: chain.id })}>\n          {chain.name}\n        </button>\n      ))}\n    </div>\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-result.md-->\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`switchChain`](/core/api/actions/switchChain)\n"
  },
  {
    "path": "site/react/api/hooks/useSwitchConnection.md",
    "content": "---\ntitle: useSwitchConnection\ndescription: Hook for switching the current connection.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'switchConnection'\nconst typeName = 'SwitchConnection'\nconst mutate = 'switchConnection'\nconst TData = 'SwitchConnectionData'\nconst TError = 'SwitchConnectionErrorType'\nconst TVariables = 'SwitchConnectionVariables'\n</script>\n\n# useSwitchConnection\n\nHook for switching the current connection.\n\n## Import\n\n```ts\nimport { useSwitchConnection } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useConnections, useSwitchConnection } from 'wagmi'\n\nfunction App() {\n  const switchConnection = useSwitchConnection()\n  const connections = useConnections()\n  return (\n    <div>\n      {connections.map((connection) => (\n        <button key={connection.id} onClick={() => switchConnection.mutate({ connector: connection.connector })}>\n          {connection.connector.name}\n        </button>\n      ))}\n    </div>\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseSwitchConnectionParameters } from 'wagmi'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useSwitchConnection } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useSwitchConnection({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseSwitchConnectionReturnType } from 'wagmi'\n```\n\n### connectors <Badge type=\"warning\">[deprecated](/react/guides/migrate-from-v2-to-v3#removed-usedisconnect-connectors-useswitchconnection-connectors)</Badge>\n\n`readonly Connector[]`\n\nGlobally configured and actively connected connectors. Useful for rendering a list of available connectors to switch to.\n\n::: code-group\n```tsx [index.tsx]\nimport { useSwitchConnection } from 'wagmi'\n\nfunction App() {\n  const switchConnection = useSwitchConnection()\n\n  return (\n    <div>\n      {switchConnection.connectors.map((connector) => (\n        <button key={connector.id} onClick={() => switchConnection.mutate({ connector })}>\n          {connector.name}\n        </button>\n      ))}\n    </div>\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-result.md-->\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`switchConnection`](/core/api/actions/switchConnection)\n"
  },
  {
    "path": "site/react/api/hooks/useTransaction.md",
    "content": "---\ntitle: useTransaction\ndescription: Hook for fetching transactions given hashes or block identifiers.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'getTransaction'\nconst typeName = 'GetTransaction'\nconst TData = 'GetTransactionData'\nconst TError = 'GetTransactionErrorType'\n</script>\n\n# useTransaction\n\nHook for fetching transactions given hashes or block identifiers.\n\n## Import\n\n```ts\nimport { useTransaction } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useTransaction } from 'wagmi'\n\nfunction App() {\n  const result = useTransaction({\n    hash: '0x0fa64daeae54e207aa98613e308c2ba8abfe274f75507e741508cc4db82c8cb5',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseTransactionParameters } from 'wagmi'\n```\n\n---\n\n### blockHash\n\n`bigint | undefined`\n\nBlock hash to get transaction at (with [`index`](#index)).\n\n```ts\nimport { useTransaction } from 'wagmi'\n\nfunction App() {\n  const result = useTransaction({\n    blockHash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', // [!code focus]\n    index: 0,\n  })\n}\n```\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to get transaction at (with [`index`](#index)).\n\n```ts\nimport { useTransaction } from 'wagmi'\n\nfunction App() {\n  const result = useTransaction({\n    blockNumber: 17829139n, // [!code focus]\n    index: 0,\n  })\n}\n```\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to get transaction at (with [`index`](#index)).\n\n```ts\nimport { useTransaction } from 'wagmi'\n\nfunction App() {\n  const result = useTransaction({\n    blockTag: 'safe', // [!code focus]\n    index: 0,\n  })\n}\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n```ts\nimport { useTransaction } from 'wagmi'\nimport { mainnet } from 'wagmi/chains'\n\nfunction App() {\n  const result = useTransaction({\n    chainId: mainnet.id, // [!code focus]\n    hash: '0x0fa64daeae54e207aa98613e308c2ba8abfe274f75507e741508cc4db82c8cb5',\n  })\n}\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useTransaction } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useTransaction({\n    hash: '0x0fa64daeae54e207aa98613e308c2ba8abfe274f75507e741508cc4db82c8cb5',\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### hash\n\n`` `0x${string}` | undefined ``\n\nHash to get transaction. [`enabled`](#enabled) set to `false` if `hash` and [`index`](#index) are `undefined`.\n\n```ts\nimport { useTransaction } from 'wagmi'\n\nfunction App() {\n  const result = useTransaction({\n    hash: '0x0fa64daeae54e207aa98613e308c2ba8abfe274f75507e741508cc4db82c8cb5', // [!code focus]\n  })\n}\n```\n\n### index\n\n`number | undefined`\n\nAn index to be used with a block identifier ([hash](#blockhash), [number](#blocknumber), or [tag](#blocktag)). [`enabled`](#enabled) set to `false` if `index` and [`hash`](#hash) are `undefined`.\n\n```ts\nimport { useTransaction } from 'wagmi'\n\nfunction App() {\n  const result = useTransaction({\n    blockTag: 'safe',\n    index: 0  // [!code focus]\n  })\n}\n```\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseTransactionReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getTransaction`](/core/api/actions/getTransaction)\n"
  },
  {
    "path": "site/react/api/hooks/useTransactionConfirmations.md",
    "content": "---\ntitle: useTransactionConfirmations\ndescription: Hook for fetching the number of blocks passed (confirmations) since the transaction was processed on a block.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'getTransactionConfirmations'\nconst typeName = 'GetTransactionConfirmations'\nconst TData = 'GetTransactionConfirmationsData'\nconst TError = 'GetTransactionConfirmationsErrorType'\n</script>\n\n# useTransactionConfirmations\n\nHook for fetching the number of blocks passed (confirmations) since the transaction was processed on a block. If confirmations is 0, then the Transaction has not been confirmed & processed yet.\n\n## Import\n\n```ts\nimport { useTransactionConfirmations } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useTransactionConfirmations } from 'wagmi'\n\nfunction App() {\n  const result = useTransactionConfirmations({\n    hash: '0x0fa64daeae54e207aa98613e308c2ba8abfe274f75507e741508cc4db82c8cb5',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseTransactionConfirmationsParameters } from 'wagmi'\n```\n\n---\n\n### hash\n\n`` `0x${string}` | undefined ``\n\nThe hash of the transaction.\n\n```ts\nimport { useTransactionConfirmations } from 'wagmi'\n\nfunction App() {\n  const result = useTransactionConfirmations({\n    hash: '0x0fa64daeae54e207aa98613e308c2ba8abfe274f75507e741508cc4db82c8cb5', // [!code focus]\n  })\n}\n```\n\n### transactionReceipt\n\n`TransactionReceipt | undefined`\n\nThe transaction receipt.\n\n```ts\nimport { useTransactionConfirmations } from 'wagmi'\n\nfunction App() {\n  const result = useTransactionConfirmations({\n    transactionReceipt: { ... }, // [!code focus]\n  })\n}\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n```ts\nimport { useTransactionConfirmations } from 'wagmi'\nimport { mainnet } from 'wagmi/chains'\n\nfunction App() {\n  const result = useTransactionConfirmations({\n    chainId: mainnet.id, // [!code focus]\n    hash: '0x0fa64daeae54e207aa98613e308c2ba8abfe274f75507e741508cc4db82c8cb5',\n  })\n}\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useTransactionConfirmations } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useTransactionConfirmations({\n    config, // [!code focus]\n    hash: '0x0fa64daeae54e207aa98613e308c2ba8abfe274f75507e741508cc4db82c8cb5',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlock } from 'wagmi'\nimport { config } from './config'\n\nfunction App() {\n  const result = useTransactionConfirmations({\n    scopeKey: 'foo' // [!code focus]\n    hash: '0x0fa64daeae54e207aa98613e308c2ba8abfe274f75507e741508cc4db82c8cb5',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseTransactionConfirmationsReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getTransactionConfirmations`](/core/api/actions/getTransactionConfirmations)\n"
  },
  {
    "path": "site/react/api/hooks/useTransactionCount.md",
    "content": "---\ntitle: useTransactionCount\ndescription: Hook for fetching the number of transactions an Account has broadcast / sent.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'getTransactionCount'\nconst typeName = 'GetTransactionCount'\nconst TData = 'number'\nconst TError = 'GetTransactionCountErrorType'\n</script>\n\n# useTransactionCount\n\nHook for fetching the number of transactions an Account has sent.\n\n## Import\n\n```ts\nimport { useTransactionCount } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useTransactionCount } from 'wagmi'\n\nfunction App() {\n  const result = useTransactionCount({\n    address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseTransactionCountParameters } from 'wagmi'\n```\n\n### address\n\n`Address | undefined`\n\nAddress to get the transaction count for. [`enabled`](#enabled) set to `false` if `address` is `undefined`.\n\n::: code-group\n```tsx [index.tsx]\nimport { useTransactionCount } from 'wagmi'\nimport { mainnet } from 'wagmi/chains'\n\nfunction App() {\n  const result = useTransactionCount({\n    address: '0x4557B18E779944BFE9d78A672452331C186a9f48', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n---\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to get the transaction count at.\n\n::: code-group\n```ts [index.ts]\nimport { useTransactionCount } from 'wagmi'\n\nfunction App() {\n  const result = useTransactionCount({\n    address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n    blockNumber: 17829139n, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to get the transaction count at.\n\n::: code-group\n```ts [index.ts]\nimport { useTransactionCount } from 'wagmi'\n\nfunction App() {\n  const result = useTransactionCount({\n    address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n    blockTag: 'latest', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```tsx [index.tsx]\nimport { useTransactionCount } from 'wagmi'\nimport { mainnet } from 'wagmi/chains' // [!code focus]\n\nfunction App() {\n  const result = useTransactionCount({\n    address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n    chainId: mainnet.id, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useTransactionCount } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useTransactionCount({\n    address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```tsx [index.tsx]\nimport { useTransactionCount } from 'wagmi'\n\nfunction App() {\n  const result = useTransactionCount({\n    address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n    scopeKey: 'foo', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseTransactionCountReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getTransactionCount`](/core/api/actions/getTransactionCount)\n"
  },
  {
    "path": "site/react/api/hooks/useTransactionReceipt.md",
    "content": "---\ntitle: useTransactionReceipt\ndescription: Hook for return the Transaction Receipt given a Transaction hash.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'getTransactionReceipt'\nconst typeName = 'GetTransactionReceipt'\nconst TData = 'GetTransactionReceiptData'\nconst TError = 'GetTransactionReceiptErrorType'\n</script>\n\n# useTransactionReceipt\n\nHook for return the [Transaction Receipt](https://viem.sh/docs/glossary/terms#transaction-receipt) given a [Transaction](https://viem.sh/docs/glossary/terms#transaction) hash.\n\n## Import\n\n```ts\nimport { useTransactionReceipt } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useTransactionReceipt } from 'wagmi'\n\nfunction App() {\n  const result = useTransactionReceipt({\n    hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseTransactionReceiptParameters } from 'wagmi'\n```\n\n### hash\n\n`` `0x${string}` | undefined ``\n\nA transaction hash.\n\n::: code-group\n```tsx [index.tsx]\nimport { useTransactionReceipt } from 'wagmi'\n\nfunction App() {\n  const result = useTransactionReceipt({\n    hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nThe ID of chain to return the transaction receipt from.\n\n::: code-group\n```tsx [index.tsx]\nimport { useTransactionReceipt } from 'wagmi'\nimport { mainnet } from 'wagmi/chains'\n\n\nfunction App() {\n  const result = useTransactionReceipt({\n    chainId: mainnet.id, // [!code focus]\n    hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useTransactionReceipt } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useTransactionReceipt({\n    config, // [!code focus]\n    hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```tsx [index.tsx]\nimport { useTransactionReceipt } from 'wagmi'\nimport { config } from './config'\n\nfunction App() {\n  const result = useTransactionReceipt({\n    scopeKey: 'foo' // [!code focus]\n    hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseTransactionReceiptReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getTransactionReceipt`](/core/api/actions/getTransactionReceipt)\n"
  },
  {
    "path": "site/react/api/hooks/useVerifyMessage.md",
    "content": "---\ntitle: useVerifyMessage\ndescription: Hook for verify that a message was signed by the provided address.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'verifyMessage'\nconst typeName = 'VerifyMessage'\nconst TData = 'VerifyMessageData'\nconst TError = 'VerifyMessageErrorType'\n</script>\n\n# useVerifyMessage\n\nHook for verify that a message was signed by the provided address. It supports verifying messages that were signed by either a Smart Contract Account or Externally Owned Account.\n\n## Import\n\n```ts\nimport { useVerifyMessage } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useVerifyMessage } from 'wagmi'\n\nfunction App() {\n  const result = useVerifyMessage({\n    address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    message: 'hello world',\n    signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseVerifyMessageParameters } from 'wagmi'\n```\n\n### address\n\n`Address | undefined`\n\nThe Ethereum address that signed the original message.\n\n::: code-group\n```tsx [index.tsx]\nimport { useVerifyMessage } from 'wagmi'\n\nfunction App() {\n  const result = useVerifyMessage({\n    address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', // [!code focus]\n    message: 'hello world',\n    signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### message\n\n`string | { raw: Hex | ByteArray } | undefined`\n\nThe message to be verified.\n\nBy default, wagmi verifies the UTF-8 representation of the message.\n\n::: code-group\n```tsx [index.tsx]\nimport { useVerifyMessage } from 'wagmi'\n\nfunction App() {\n  const result = useVerifyMessage({\n    address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    message: 'hello world', // [!code focus]\n    signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n::: tip\nBy default, viem signs the UTF-8 representation of the message. To sign the data representation of the message, you can use the `raw` attribute.\n\n```ts\nimport { useVerifyMessage } from 'wagmi'\n\nfunction App() {\n  const result = useVerifyMessage({\n    address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    message: { raw: '0x68656c6c6f20776f726c64' } // [!code focus]\n    signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n  })\n}\n```\n:::\n\n### signature\n\n`Hex | ByteArray | undefined`\n\nThe signature that was generated by signing the message with the address's signer.\n\n::: code-group\n```tsx [index.tsx]\nimport { useVerifyMessage } from 'wagmi'\n\nfunction App() {\n  const result = useVerifyMessage({\n    address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    message: 'hello world',\n    signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nOnly used when verifying a message that was signed by a Smart Contract Account. The ID of chain to check if the contract was already deployed.\n\n::: code-group\n```tsx [index.tsx]\nimport { useVerifyMessage } from 'wagmi'\nimport { mainnet } from 'wagmi/chains'\n\nfunction App() {\n  const result = useVerifyMessage({\n    chainId: mainnet.id, // [!code focus]\n    address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    message: 'hello world',\n    signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockNumber\n\n`bigint | undefined`\n\nOnly used when verifying a message that was signed by a Smart Contract Account. The block number to check if the contract was already deployed.\n\n::: code-group\n```tsx [index.tsx]\nimport { useVerifyMessage } from 'wagmi'\nimport { mainnet } from 'wagmi/chains'\n\nfunction App() {\n  const result = useVerifyMessage({\n    blockNumber: 12345678n, // [!code focus]\n    address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    message: 'hello world',\n    signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nOnly used when verifying a message that was signed by a Smart Contract Account. The block tag to check if the contract was already deployed.\n\n::: code-group\n```tsx [index.tsx]\nimport { useVerifyMessage } from 'wagmi'\nimport { mainnet } from 'wagmi/chains'\n\nfunction App() {\n  const result = useVerifyMessage({\n    blockTag: 'pending', // [!code focus]\n    address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    message: 'hello world',\n    signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useVerifyMessage } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useVerifyMessage({\n    config, // [!code focus]\n    address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    message: 'hello world',\n    signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```tsx [index.tsx]\nimport { useVerifyMessage } from 'wagmi'\nimport { config } from './config'\n\nfunction App() {\n  const result = useVerifyMessage({\n    scopeKey: 'foo' // [!code focus]\n    address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    message: 'hello world',\n    signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseVerifyMessageReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`verifyMessage`](/core/api/actions/verifyMessage)\n"
  },
  {
    "path": "site/react/api/hooks/useVerifyTypedData.md",
    "content": "---\ntitle: useVerifyTypedData\ndescription: Hook for verify that a typed data was signed by the provided address.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'verifyTypedData'\nconst typeName = 'VerifyTypedData'\nconst TData = 'VerifyTypedDataData'\nconst TError = 'VerifyTypedDataErrorType'\n</script>\n\n# useVerifyTypedData\n\nHook for verify that a typed data was signed by the provided address. It supports verifying typed data that were signed by either a Smart Contract Account or Externally Owned Account.\n\n## Import\n\n```ts\nimport { useVerifyTypedData } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { domain, types } from './data'\nimport { useVerifyTypedData } from 'wagmi'\n\nfunction App() {\n  const result = useVerifyTypedData({\n    domain,\n    types,\n    message: {\n      from: {\n        name: 'Cow',\n        wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n      },\n      to: {\n        name: 'Bob',\n        wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n      },\n      contents: 'Hello, Bob!',\n    },\n    primaryType: 'Mail',\n    address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n  })\n}\n```\n```ts [data.ts]\n// All properties on a domain are optional\nexport const domain = {\n  name: 'Ether Mail',\n  version: '1',\n  chainId: 1,\n  verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n} as const\n\n// The named list of all type definitions\nexport const types = {\n  Person: [\n    { name: 'name', type: 'string' },\n    { name: 'wallet', type: 'address' },\n  ],\n  Mail: [\n    { name: 'from', type: 'Person' },\n    { name: 'to', type: 'Person' },\n    { name: 'contents', type: 'string' },\n  ],\n} as const\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseVerifyTypedDataParameters } from 'wagmi'\n```\n\n### address\n\n`Address | undefined`\n\nThe Ethereum address that signed the original typed data.\n\n::: code-group\n```tsx [index.tsx]\nimport { domain, types } from './data'\nimport { useVerifyTypedData } from 'wagmi'\n\nfunction App() {\n  const result = useVerifyTypedData({\n    domain,\n    types,\n    message: {\n      from: {\n        name: 'Cow',\n        wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n      },\n      to: {\n        name: 'Bob',\n        wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n      },\n      contents: 'Hello, Bob!',\n    },\n    primaryType: 'Mail',\n    address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', // [!code focus]\n    signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n  })\n}\n```\n```ts [data.ts]\n// All properties on a domain are optional\nexport const domain = {\n  name: 'Ether Mail',\n  version: '1',\n  chainId: 1,\n  verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n} as const\n\n// The named list of all type definitions\nexport const types = {\n  Person: [\n    { name: 'name', type: 'string' },\n    { name: 'wallet', type: 'address' },\n  ],\n  Mail: [\n    { name: 'from', type: 'Person' },\n    { name: 'to', type: 'Person' },\n    { name: 'contents', type: 'string' },\n  ],\n} as const\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### domain\n\n`TypedDataDomain | undefined`\n\nThe typed data domain.\n\n::: code-group\n```tsx [index.tsx]\nimport { types } from './data'\nimport { useVerifyTypedData } from 'wagmi'\n\nfunction App() {\n  const result = useVerifyTypedData({\n    domain: { // [!code focus:6]\n      name: 'Ether Mail',\n      version: '1',\n      chainId: 1,\n      verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n    },\n    types,\n    message: {\n      from: {\n        name: 'Cow',\n        wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n      },\n      to: {\n        name: 'Bob',\n        wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n      },\n      contents: 'Hello, Bob!',\n    },\n    primaryType: 'Mail',\n    address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n  })\n}\n```\n```ts [data.ts]\n// The named list of all type definitions\nexport const types = {\n  Person: [\n    { name: 'name', type: 'string' },\n    { name: 'wallet', type: 'address' },\n  ],\n  Mail: [\n    { name: 'from', type: 'Person' },\n    { name: 'to', type: 'Person' },\n    { name: 'contents', type: 'string' },\n  ],\n} as const\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### types\n\nThe type definitions for the typed data.\n\n::: code-group\n```tsx [index.tsx]\nimport { domain } from './data'\nimport { useVerifyTypedData } from 'wagmi'\n\nfunction App() {\n  const result = useVerifyTypedData({\n    domain,\n    types: { // [!code focus:11]\n      Person: [\n        { name: 'name', type: 'string' },\n        { name: 'wallet', type: 'address' },\n      ],\n      Mail: [\n        { name: 'from', type: 'Person' },\n        { name: 'to', type: 'Person' },\n        { name: 'contents', type: 'string' },\n      ],\n    },\n    message: {\n      from: {\n        name: 'Cow',\n        wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n      },\n      to: {\n        name: 'Bob',\n        wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n      },\n      contents: 'Hello, Bob!',\n    },\n    primaryType: 'Mail',\n    address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n  })\n}\n```\n```ts [data.ts]\n// All properties on a domain are optional\nexport const domain = {\n  name: 'Ether Mail',\n  version: '1',\n  chainId: 1,\n  verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n} as const\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### primaryType\n\n`string | undefined`\n\nThe primary `type` to extract from types and use in `value`.\n\n::: code-group\n```tsx [index.tsx]\nimport { domain } from './data'\nimport { useVerifyTypedData } from 'wagmi'\n\nfunction App() {\n  const result = useVerifyTypedData({\n    domain,\n    types: {\n      Person: [\n        { name: 'name', type: 'string' },\n        { name: 'wallet', type: 'address' },\n      ],\n      Mail: [ // [!code focus:5]\n        { name: 'from', type: 'Person' },\n        { name: 'to', type: 'Person' },\n        { name: 'contents', type: 'string' },\n      ],\n    },\n    primaryType: 'Mail', // [!code focus]\n    message: {\n      from: {\n        name: 'Cow',\n        wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n      },\n      to: {\n        name: 'Bob',\n        wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n      },\n      contents: 'Hello, Bob!',\n    },\n    address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n  })\n}\n```\n```ts [data.ts]\n// All properties on a domain are optional\nexport const domain = {\n  name: 'Ether Mail',\n  version: '1',\n  chainId: 1,\n  verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n} as const\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### message\n\nType inferred from `types` & `primaryType`.\n\nThe message to be verified.\n\n::: code-group\n```tsx [index.tsx]\nimport { domain, types } from './data'\nimport { useVerifyTypedData } from 'wagmi'\n\nfunction App() {\n  const result = useVerifyTypedData({\n    domain,\n    types,\n    message: { // [!code focus:11]\n      from: {\n        name: 'Cow',\n        wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n      },\n      to: {\n        name: 'Bob',\n        wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n      },\n      contents: 'Hello, Bob!',\n    },\n    primaryType: 'Mail',\n    address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n  })\n}\n```\n```ts [data.ts]\n// All properties on a domain are optional\nexport const domain = {\n  name: 'Ether Mail',\n  version: '1',\n  chainId: 1,\n  verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n} as const\n\n// The named list of all type definitions\nexport const types = {\n  Person: [\n    { name: 'name', type: 'string' },\n    { name: 'wallet', type: 'address' },\n  ],\n  Mail: [\n    { name: 'from', type: 'Person' },\n    { name: 'to', type: 'Person' },\n    { name: 'contents', type: 'string' },\n  ],\n} as const\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### signature\n\n`Hex | ByteArray | undefined`\n\nThe signature that was generated by signing the typed data with the address's signer.\n\n::: code-group\n```tsx [index.tsx]\nimport { domain, types } from './data'\nimport { useVerifyTypedData } from 'wagmi'\n\nfunction App() {\n  const result = useVerifyTypedData({\n    domain,\n    types,\n    message: {\n      from: {\n        name: 'Cow',\n        wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n      },\n      to: {\n        name: 'Bob',\n        wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n      },\n      contents: 'Hello, Bob!',\n    },\n    primaryType: 'Mail',\n    address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c', // [!code focus]\n  })\n}\n```\n```ts [data.ts]\n// All properties on a domain are optional\nexport const domain = {\n  name: 'Ether Mail',\n  version: '1',\n  chainId: 1,\n  verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n} as const\n\n// The named list of all type definitions\nexport const types = {\n  Person: [\n    { name: 'name', type: 'string' },\n    { name: 'wallet', type: 'address' },\n  ],\n  Mail: [\n    { name: 'from', type: 'Person' },\n    { name: 'to', type: 'Person' },\n    { name: 'contents', type: 'string' },\n  ],\n} as const\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nOnly used when verifying a typed data that was signed by a Smart Contract Account. The ID of chain to check if the contract was already deployed.\n\n::: code-group\n```tsx [index.tsx]\nimport { domain, types } from './data'\nimport { useVerifyTypedData } from 'wagmi'\nimport { mainnet } from 'wagmi/chains'\n\nfunction App() {\n  const result = useVerifyTypedData({\n    chainId: mainnet.id, // [!code focus]\n    domain,\n    types,\n    message: {\n      from: {\n        name: 'Cow',\n        wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n      },\n      to: {\n        name: 'Bob',\n        wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n      },\n      contents: 'Hello, Bob!',\n    },\n    primaryType: 'Mail',\n    address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n  })\n}\n```\n```ts [data.ts]\n// All properties on a domain are optional\nexport const domain = {\n  name: 'Ether Mail',\n  version: '1',\n  chainId: 1,\n  verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n} as const\n\n// The named list of all type definitions\nexport const types = {\n  Person: [\n    { name: 'name', type: 'string' },\n    { name: 'wallet', type: 'address' },\n  ],\n  Mail: [\n    { name: 'from', type: 'Person' },\n    { name: 'to', type: 'Person' },\n    { name: 'contents', type: 'string' },\n  ],\n} as const\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockNumber\n\n`bigint | undefined`\n\nOnly used when verifying a typed data that was signed by a Smart Contract Account. The block number to check if the contract was already deployed.\n\n::: code-group\n```tsx [index.tsx]\nimport { domain, types } from './data'\nimport { useVerifyTypedData } from 'wagmi'\n\nfunction App() {\n  const result = useVerifyTypedData({\n    blockNumber: 12345678n, // [!code focus]\n    domain,\n    types,\n    message: {\n      from: {\n        name: 'Cow',\n        wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n      },\n      to: {\n        name: 'Bob',\n        wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n      },\n      contents: 'Hello, Bob!',\n    },\n    primaryType: 'Mail',\n    address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n  })\n}\n```\n```ts [data.ts]\n// All properties on a domain are optional\nexport const domain = {\n  name: 'Ether Mail',\n  version: '1',\n  chainId: 1,\n  verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n} as const\n\n// The named list of all type definitions\nexport const types = {\n  Person: [\n    { name: 'name', type: 'string' },\n    { name: 'wallet', type: 'address' },\n  ],\n  Mail: [\n    { name: 'from', type: 'Person' },\n    { name: 'to', type: 'Person' },\n    { name: 'contents', type: 'string' },\n  ],\n} as const\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nOnly used when verifying a typed data that was signed by a Smart Contract Account. The block tag to check if the contract was already deployed.\n\n::: code-group\n```tsx [index.tsx]\nimport { domain, types } from './data'\nimport { useVerifyTypedData } from 'wagmi'\n\nfunction App() {\n  const result = useVerifyTypedData({\n    blockTag: 'latest', // [!code focus]\n    domain,\n    types,\n    message: {\n      from: {\n        name: 'Cow',\n        wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n      },\n      to: {\n        name: 'Bob',\n        wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n      },\n      contents: 'Hello, Bob!',\n    },\n    primaryType: 'Mail',\n    address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n  })\n}\n```\n```ts [data.ts]\n// All properties on a domain are optional\nexport const domain = {\n  name: 'Ether Mail',\n  version: '1',\n  chainId: 1,\n  verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n} as const\n\n// The named list of all type definitions\nexport const types = {\n  Person: [\n    { name: 'name', type: 'string' },\n    { name: 'wallet', type: 'address' },\n  ],\n  Mail: [\n    { name: 'from', type: 'Person' },\n    { name: 'to', type: 'Person' },\n    { name: 'contents', type: 'string' },\n  ],\n} as const\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { domain, types } from './data'\nimport { useVerifyTypedData } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useVerifyTypedData({\n    config, // [!code focus]\n    domain,\n    types,\n    message: {\n      from: {\n        name: 'Cow',\n        wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n      },\n      to: {\n        name: 'Bob',\n        wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n      },\n      contents: 'Hello, Bob!',\n    },\n    primaryType: 'Mail',\n    address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n  })\n}\n```\n```ts [data.ts]\n// All properties on a domain are optional\nexport const domain = {\n  name: 'Ether Mail',\n  version: '1',\n  chainId: 1,\n  verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n} as const\n\n// The named list of all type definitions\nexport const types = {\n  Person: [\n    { name: 'name', type: 'string' },\n    { name: 'wallet', type: 'address' },\n  ],\n  Mail: [\n    { name: 'from', type: 'Person' },\n    { name: 'to', type: 'Person' },\n    { name: 'contents', type: 'string' },\n  ],\n} as const\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```tsx [index.tsx]\nimport { domain, types } from './data'\nimport { useVerifyTypedData } from 'wagmi'\n\nfunction App() {\n  const result = useVerifyTypedData({\n    scopeKey: 'foo' // [!code focus]\n    domain,\n    types,\n    message: {\n      from: {\n        name: 'Cow',\n        wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n      },\n      to: {\n        name: 'Bob',\n        wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n      },\n      contents: 'Hello, Bob!',\n    },\n    primaryType: 'Mail',\n    address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',\n    signature: '0x66edc32e2ab001213321ab7d959a2207fcef5190cc9abb6da5b0d2a8a9af2d4d2b0700e2c317c4106f337fd934fbbb0bf62efc8811a78603b33a8265d3b8f8cb1c',\n  })\n}\n```\n```ts [data.ts]\n// All properties on a domain are optional\nexport const domain = {\n  name: 'Ether Mail',\n  version: '1',\n  chainId: 1,\n  verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n} as const\n\n// The named list of all type definitions\nexport const types = {\n  Person: [\n    { name: 'name', type: 'string' },\n    { name: 'wallet', type: 'address' },\n  ],\n  Mail: [\n    { name: 'from', type: 'Person' },\n    { name: 'to', type: 'Person' },\n    { name: 'contents', type: 'string' },\n  ],\n} as const\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseVerifyTypedDataReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n## Type Inference\n\nWith [`types`](#types) setup correctly, TypeScript will infer the correct types for [`domain`](#domain), [`message`](#message), and [`primaryType`](#primarytype). See the Wagmi [TypeScript docs](/react/typescript) for more information.\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`verifyTypedData`](/core/api/actions/verifyTypedData)\n"
  },
  {
    "path": "site/react/api/hooks/useWaitForCallsStatus.md",
    "content": "---\ntitle: useWaitForCallsStatus\ndescription: Waits for a call bundle to be confirmed & included on a block.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'waitForCallsStatus'\nconst typeName = 'WaitForCallsStatus'\nconst TData = 'WaitForCallsStatusReturnType'\nconst TError = 'WaitForCallsStatusErrorType'\n</script>\n\n# useWaitForCallsStatus\n\nWaits for a call bundle to be confirmed & included on a block before returning the status & receipts.\n\n \n\n## Import\n\n```ts\nimport { useWaitForCallsStatus } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useWaitForCallsStatus } from 'wagmi'\n\nfunction App() {\n  const result = useWaitForCallsStatus({\n    id: '0x...', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseWaitForCallsStatusParameters } from 'wagmi'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useWaitForCallsStatus } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useWaitForCallsStatus({\n    config, // [!code focus]\n    id: '0x...',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### connector\n\n`Connector | undefined`\n\nConnector to get call statuses with.\n\n::: code-group\n```tsx [index.tsx]\nimport { useWaitForCallsStatus, useConnections } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const connections = useConnections()\n  const result = useWaitForCallsStatus({\n    connector: connections[0]?.connector, // [!code focus]\n    id: '0x...',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### id\n\n`string`\n\nIdentifier of the call batch.\n\n::: code-group\n```ts [index.ts]\nimport { useWaitForCallsStatus } from '@wagmi/core'\nimport { config } from './config'\n\nconst status = await useWaitForCallsStatus({\n  id: '0x1234567890abcdef', // [!code focus]\n})\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### pollingInterval\n\n`number | undefined`\n\nPolling interval in milliseconds.\n\n::: code-group\n```ts [index.ts]\nimport { useWaitForCallsStatus } from '@wagmi/core'\nimport { config } from './config'\n\nconst status = await useWaitForCallsStatus({\n  id: '0x1234567890abcdef',\n  pollingInterval: 1_000, // [!code focus]\n})\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```tsx [index.tsx]\nimport { useWaitForCallsStatus } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useWaitForCallsStatus({\n    id: '0x...',\n    scopeKey: 'foo', // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### timeout\n\n`number | undefined`\n\nTimeout in milliseconds.\n\n::: code-group\n```ts [index.ts]\nimport { useWaitForCallsStatus } from '@wagmi/core'\nimport { config } from './config'\n\nconst status = await useWaitForCallsStatus({\n  id: '0x1234567890abcdef',\n  timeout: 10_000, // [!code focus]\n})\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseWaitForCallsStatusReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`waitForCallsStatus`](https://viem.sh/docs/actions/wallet/waitForCallsStatus)"
  },
  {
    "path": "site/react/api/hooks/useWaitForTransactionReceipt.md",
    "content": "---\ntitle: useWaitForTransactionReceipt\ndescription: Hook that waits for the transaction to be included on a block, and then returns the transaction receipt. If the transaction reverts, then the action will throw an error. Replacement detection (e.g. sped up transactions) is also supported.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'waitForTransactionReceipt'\nconst typeName = 'WaitForTransactionReceipt'\nconst TData = 'WaitForTransactionReceiptData'\nconst TError = 'WaitForTransactionReceiptErrorType'\n</script>\n\n# useWaitForTransactionReceipt\n\nHook that waits for the transaction to be included on a block, and then returns the transaction receipt. If the transaction reverts, then the action will throw an error. Replacement detection (e.g. sped up transactions) is also supported.\n\n## Import\n\n```ts\nimport { useWaitForTransactionReceipt } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nfunction App() {\n  const result = useWaitForTransactionReceipt({\n    hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseWaitForTransactionReceiptParameters } from 'wagmi'\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n```ts [index.ts]\nimport { useWaitForTransactionReceipt } from 'wagmi'\nimport { mainnet } from 'wagmi/chains'\n\nfunction App() {\n  const result = useWaitForTransactionReceipt({\n    chainId: mainnet.id, // [!code focus]\n    hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n  })\n}\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useWaitForTransactionReceipt } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useWaitForTransactionReceipt({\n    hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### confirmations\n\n`number | undefined`\n\nThe number of confirmations (blocks that have passed) to wait before resolving.\n\n```ts [index.ts]\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nfunction App() {\n  const result = useWaitForTransactionReceipt({\n    confirmations: 2, // [!code focus]\n    hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n  })\n}\n```\n\n### onReplaced\n\n`\n(({ reason: 'replaced' | 'repriced' | 'cancelled'; replacedTransaction: Transaction; transaction: Transaction; transactionReceipt: TransactionReceipt }) => void) | undefined\n`\n\nOptional callback to emit if the transaction has been replaced.\n\n```ts [index.ts]\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nfunction App() {\n  const result = useWaitForTransactionReceipt({\n    hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n    onReplaced: replacement => console.log(replacement), // [!code focus]\n  })\n}\n```\n\n### pollingInterval\n\n`number | undefined`\n\n- Polling frequency (in milliseconds).\n- Defaults to the [Config's `pollingInterval` config](/react/api/createConfig#pollinginterval).\n\n```ts [index.ts]\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nfunction App() {\n  const result = useWaitForTransactionReceipt({\n    hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n    pollingInterval: 1_000, // [!code focus]\n  })\n}\n```\n\n### hash\n\n`` `0x${string}` | undefined ``\n\nThe transaction hash to wait for. [`enabled`](#enabled) set to `false` if `hash` is `undefined`.\n\n```ts [index.ts]\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nfunction App() {\n  const result = useWaitForTransactionReceipt({\n    hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', // [!code focus]\n  })\n}\n```\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseWaitForTransactionReceiptReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`waitForTransactionReceipt`](/core/api/actions/waitForTransactionReceipt)\n"
  },
  {
    "path": "site/react/api/hooks/useWalletClient.md",
    "content": "---\ntitle: useWalletClient\ndescription: Hook for getting a Viem `WalletClient` object for the current or provided connector.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'getWalletClient'\nconst typeName = 'GetWalletClient'\nconst TData = 'WalletClient'\nconst TError = 'GetWalletClientErrorType'\nconst hideQueryOptions = ['gcTime', 'staleTime']\n</script>\n\n# useWalletClient\n\nHook for getting a Viem [`WalletClient`](https://viem.sh/docs/clients/wallet) object for the current or provided connector.\n\n## Import\n\n```ts\nimport { useWalletClient } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useWalletClient } from 'wagmi'\n\nfunction App() {\n  const result = useWalletClient()\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n::: warning\nIf you want to optimize bundle size, you should use [`useConnectorClient`](/react/api/hooks/useConnectorClient) 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.\n:::\n\n## Parameters\n\n```ts\nimport { type UseWalletClientParameters } from 'wagmi'\n```\n\n### account\n\n`Address | Account | undefined`\n\nAccount to use with client. Throws if account is not found on [`connector`](#connector).\n\n```ts\nimport { useWalletClient } from 'wagmi'\n\nfunction App() {\n  const result = useWalletClient({\n    account: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n  })\n}\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use with client.\n\n```ts\nimport { useWalletClient } from 'wagmi'\n\nfunction App() {\n  const result = useWalletClient({\n    chainId: mainnet.id, // [!code focus]\n  })\n}\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useWalletClient } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useWalletClient({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### connector\n\n`Connector | undefined`\n\n- Connector to get client for.\n- Defaults to current connector.\n\n```ts\nimport { useConnections, useWalletClient } from 'wagmi'\n\nfunction App() {\n  const connections = useConnections(config)\n  const result = useWalletClient({\n    connector: connections[0]?.connector, // [!code focus]\n  })\n}\n```\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseWalletClientReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getWalletClient`](/core/api/actions/getWalletClient)\n"
  },
  {
    "path": "site/react/api/hooks/useWatchAsset.md",
    "content": "---\ntitle: useWatchAsset\ndescription: Hook for requesting user tracks the token in their wallet. Returns a boolean indicating if the token was successfully added.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'watchAsset'\nconst typeName = 'WatchAsset'\nconst mutate = 'watchAsset'\nconst TData = 'WatchAssetData'\nconst TError = 'WatchAssetErrorType'\nconst TVariables = 'WatchAssetVariables'\n</script>\n\n# useWatchAsset\n\nHook for requesting user tracks the token in their wallet. Returns a boolean indicating if the token was successfully added.\n\n## Import\n\n```ts\nimport { useWatchAsset } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchAsset } from 'wagmi'\n\nfunction App() {\n  const { watchAsset } = useWatchAsset()\n\n  return (\n    <button\n      onClick={() => watchAsset({\n        type: 'ERC20',\n        options: {\n          address: '0x0000000000000000000000000000000000000000',\n          symbol: 'WAGMI',\n          decimals: 18,\n        },\n      })}\n    >\n      Watch asset\n    </button>\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseWatchAssetParameters } from 'wagmi'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchAsset } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useWatchAsset({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseWatchAssetReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/mutation-result.md-->\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`watchAsset`](/core/api/actions/watchAsset)\n"
  },
  {
    "path": "site/react/api/hooks/useWatchBlockNumber.md",
    "content": "---\ntitle: useWatchBlockNumber\ndescription: Hook that watches for block number changes.\n---\n\n# useWatchBlockNumber\n\nHook that watches for block number changes.\n\n## Import\n\n```ts\nimport { useWatchBlockNumber } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchBlockNumber } from 'wagmi'\n\nfunction App() {\n  useWatchBlockNumber({\n    onBlockNumber(blockNumber) {\n      console.log('Block number changed!', blockNumber)\n    },\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseWatchBlockNumberParameters } from 'wagmi'\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to watch blocks at.\n\n::: code-group\n```ts [index.ts]\nimport { useWatchBlockNumber } from 'wagmi'\n\nfunction App() {\n  useWatchBlockNumber({\n    chainId: 1, // [!code focus]\n    onBlockNumber(blockNumber) {\n      console.log('New block number', blockNumber)\n    },\n  })\n}\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```ts [index.ts]\nimport { useWatchBlockNumber } from 'wagmi'\nimport { config } from './config'\n\nfunction App() {\n  useWatchBlockNumber({\n    config, // [!code focus]\n    onBlockNumber(blockNumber) {\n      console.log('New block number', blockNumber)\n    },\n  })\n}\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### emitMissed\n\n`boolean`\n\nWhether or not to emit missed blocks to the callback. Defaults to `false`.\n\nMissed blocks may occur in instances where internet connection is lost, or the block time is lesser than the polling interval of the client.\n\n::: code-group\n```ts [index.ts]\nimport { useWatchBlockNumber } from 'wagmi'\n\nfunction App() {\n  useWatchBlockNumber({\n    emitMissed: true, // [!code focus]\n    onBlockNumber(blockNumber) {\n      console.log('New block number', blockNumber)\n    },\n  })\n}\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### emitOnBegin\n\n`boolean`\n\nWhether or not to emit the block to the callback when the subscription opens. Defaults to `false`.\n\n::: code-group\n```ts [index.ts]\nimport { useWatchBlockNumber } from 'wagmi'\n\nfunction App() {\n  useWatchBlockNumber({\n    emitOnBegin: true, // [!code focus]\n    onBlockNumber(blockNumber) {\n      console.log('New block number', blockNumber)\n    },\n  })\n}\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### enabled\n\n`boolean`\n\nWhether or not to watch for blocks. Defaults to `true`.\n\n::: code-group\n```ts [index.ts]\nimport { useWatchBlockNumber } from 'wagmi'\n\nfunction App() {\n  useWatchBlockNumber({\n    enabled: false, // [!code focus]\n    onBlockNumber(blockNumber) {\n      console.log('New block number', blockNumber)\n    },\n  })\n}\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### onBlockNumber\n\n`(block: Block, prevblock: Block | undefined) => void`\n\nCallback for when block changes.\n\n::: code-group\n```ts [index.ts]\nimport { useWatchBlockNumber } from 'wagmi'\n\nfunction App() {\n  useWatchBlockNumber({\n    onBlockNumber(blockNumber) { // [!code focus]\n      console.log('New block number', blockNumber) // [!code focus]\n    }, // [!code focus]\n  })\n}\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### onError\n\n`((error: Error) => void) | undefined`\n\nError thrown from getting the block.\n\n::: code-group\n```ts [index.ts]\nimport { useWatchBlockNumber } from 'wagmi'\n\nfunction App() {\n  useWatchBlockNumber({\n    onBlockNumber(blockNumber) { \n      console.log('New block number', blockNumber) \n    }, \n    onError(error) { // [!code focus]\n      console.error('Block error', error) // [!code focus]\n    }, // [!code focus]\n  })\n}\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### poll\n\n`boolean | undefined`\n\n- Whether or not to use a polling mechanism to check for new blocks instead of a WebSocket subscription.\n- Defaults to `false` for WebSocket Clients, and `true` for non-WebSocket Clients.\n\n::: code-group\n```ts [index.ts]\nimport { useWatchBlockNumber } from 'wagmi'\n\nfunction App() {\n  useWatchBlockNumber({\n    onBlockNumber(blockNumber) { \n      console.log('New block number', blockNumber) \n    }\n    poll: true, // [!code focus]\n  })\n}\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### pollingInterval\n\n`number | undefined`\n\n- Polling frequency (in milliseconds).\n- Defaults to the [Config's `pollingInterval` config](/core/api/createConfig#pollinginterval).\n\n::: code-group\n```ts [index.ts]\nimport { useWatchBlockNumber } from 'wagmi'\n\nfunction App() {\n  useWatchBlockNumber({\n    onBlockNumber(blockNumber) { \n      console.log('New block number', blockNumber) \n    }\n    pollingInterval: 1_000, // [!code focus]\n  })\n}\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### syncConnectedChain\n\n`boolean | undefined`\n\n- Set up subscriber for connected chain changes.\n- Defaults to [`Config['syncConnectedChain']`](/core/api/createConfig#syncconnectedchain).\n\n::: code-group\n```ts [index.ts]\nimport { useWatchBlockNumber } from 'wagmi'\n\nfunction App() {\n  useWatchBlockNumber({\n    onBlockNumber(blockNumber) { \n      console.log('New block number', blockNumber) \n    }\n    syncConnectedChain: false, // [!code focus]\n  })\n}\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type UseWatchBlockNumberReturnType } from 'wagmi'\n```\n\nFunction for cleaning up watcher.\n\n## Action\n\n- [`watchBlockNumber`](/core/api/actions/watchBlockNumber)\n"
  },
  {
    "path": "site/react/api/hooks/useWatchBlocks.md",
    "content": "---\ntitle: useWatchBlocks\ndescription: Hook that watches for block changes.\n---\n\n# useWatchBlocks\n\nHook that watches for block changes.\n\n## Import\n\n```ts\nimport { useWatchBlocks } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchBlocks } from 'wagmi'\n\nfunction App() {\n  useWatchBlocks({\n    onBlock(block) {\n      console.log('New block', block.number)\n    },\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseWatchBlocksParameters } from 'wagmi'\n```\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to watch blocks at.\n\n::: code-group\n```ts [index.ts]\nimport { useWatchBlocks } from 'wagmi'\n\nfunction App() {\n  useWatchBlocks({\n    blockTag: 'latest', // [!code focus]\n    onBlock(block) {\n      console.log('New block', block.number)\n    },\n  })\n}\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to watch blocks at.\n\n::: code-group\n```ts [index.ts]\nimport { useWatchBlocks } from 'wagmi'\n\nfunction App() {\n  useWatchBlocks({\n    chainId: 1, // [!code focus]\n    onBlock(block) {\n      console.log('New block', block.number)\n    },\n  })\n}\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```ts [index.ts]\nimport { useWatchBlocks } from 'wagmi'\nimport { config } from './config'\n\nfunction App() {\n  useWatchBlocks({\n    config, // [!code focus]\n    onBlock(block) {\n      console.log('New block', block.number)\n    },\n  })\n}\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### emitMissed\n\n`boolean`\n\nWhether or not to emit missed blocks to the callback. Defaults to `false`.\n\nMissed blocks may occur in instances where internet connection is lost, or the block time is lesser than the polling interval of the client.\n\n::: code-group\n```ts [index.ts]\nimport { useWatchBlocks } from 'wagmi'\n\nfunction App() {\n  useWatchBlocks({\n    emitMissed: true, // [!code focus]\n    onBlock(block) {\n      console.log('New block', block.number)\n    },\n  })\n}\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### emitOnBegin\n\n`boolean`\n\nWhether or not to emit the block to the callback when the subscription opens. Defaults to `false`.\n\n::: code-group\n```ts [index.ts]\nimport { useWatchBlocks } from 'wagmi'\n\nfunction App() {\n  useWatchBlocks({\n    emitOnBegin: true, // [!code focus]\n    onBlock(block) {\n      console.log('New block', block.number)\n    },\n  })\n}\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### enabled\n\n`boolean`\n\nWhether or not to watch for blocks. Defaults to `true`.\n\n::: code-group\n```ts [index.ts]\nimport { useWatchBlocks } from 'wagmi'\n\nfunction App() {\n  useWatchBlocks({\n    enabled: false, // [!code focus]\n    onBlock(block) {\n      console.log('New block', block.number)\n    },\n  })\n}\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### includeTransactions\n\n`boolean`\n\nWhether or not to unwrap transactions as objects (instead of hashes) in blocks. Defaults to `false`.\n\n::: code-group\n```ts [index.ts]\nimport { useWatchBlocks } from 'wagmi'\n\nfunction App() {\n  useWatchBlocks({\n    includeTransactions: true, // [!code focus]\n    onBlock(block) {\n      console.log('New block', block.number)\n    },\n  })\n}\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### onBlock\n\n`(block: Block, prevblock: Block | undefined) => void`\n\nCallback for when block changes.\n\n::: code-group\n```ts [index.ts]\nimport { useWatchBlocks } from 'wagmi'\n\nfunction App() {\n  useWatchBlocks({\n    onBlock(block) { // [!code focus]\n      console.log('New block', block.number) // [!code focus]\n    }, // [!code focus]\n  })\n}\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### onError\n\n`((error: Error) => void) | undefined`\n\nError thrown from getting the block.\n\n::: code-group\n```ts [index.ts]\nimport { useWatchBlocks } from 'wagmi'\n\nfunction App() {\n  useWatchBlocks({\n    onBlock(block) { \n      console.log('New block', block.number) \n    }, \n    onError(error) { // [!code focus]\n      console.error('Block error', error) // [!code focus]\n    }, // [!code focus]\n  })\n}\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### poll\n\n`boolean | undefined`\n\n- Whether or not to use a polling mechanism to check for new blocks instead of a WebSocket subscription.\n- Defaults to `false` for WebSocket Clients, and `true` for non-WebSocket Clients.\n\n::: code-group\n```ts [index.ts]\nimport { useWatchBlocks } from 'wagmi'\n\nfunction App() {\n  useWatchBlocks({\n    onBlock(block) { \n      console.log('New block', block.number) \n    }\n    poll: true, // [!code focus]\n  })\n}\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### pollingInterval\n\n`number | undefined`\n\n- Polling frequency (in milliseconds).\n- Defaults to the [Config's `pollingInterval` config](/core/api/createConfig#pollinginterval).\n\n::: code-group\n```ts [index.ts]\nimport { useWatchBlocks } from 'wagmi'\n\nfunction App() {\n  useWatchBlocks({\n    onBlock(block) { \n      console.log('New block', block.number) \n    }\n    pollingInterval: 1_000, // [!code focus]\n  })\n}\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n### syncConnectedChain\n\n`boolean | undefined`\n\n- Set up subscriber for connected chain changes.\n- Defaults to [`Config['syncConnectedChain']`](/core/api/createConfig#syncconnectedchain).\n\n::: code-group\n```ts [index.ts]\nimport { useWatchBlocks } from 'wagmi'\n\nfunction App() {\n  useWatchBlocks({\n    onBlock(block) { \n      console.log('New block', block.number) \n    }\n    syncConnectedChain: false, // [!code focus]\n  })\n}\n```\n<<< @/snippets/core/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type UseWatchBlocksReturnType } from 'wagmi'\n```\n\n## Action\n\n- [`watchBlocks`](/core/api/actions/watchBlocks)\n"
  },
  {
    "path": "site/react/api/hooks/useWatchContractEvent.md",
    "content": "---\ntitle: useWatchContractEvent\ndescription: Hook that watches and returns emitted contract event logs.\n---\n\n# useWatchContractEvent\n\nHook that watches and returns emitted contract event logs.\n\n## Import\n\n```ts\nimport { useWatchContractEvent } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchContractEvent } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  useWatchContractEvent({\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    abi,\n    eventName: 'Transfer',\n    onLogs(logs) {\n      console.log('New logs!', logs)\n    },\n  })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseWatchContractEventParameters } from 'wagmi'\n```\n\n### abi\n\n`Abi`\n\nThe contract's ABI. Check out the [TypeScript docs](/react/typescript#const-assert-abis-typed-data) for how to set up ABIs for maximum type inference and safety.\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchContractEvent } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  useWatchContractEvent({\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    abi, // [!code focus]\n    eventName: 'Transfer',\n    onLogs(logs) {\n      console.log('New logs!', logs)\n    },\n  })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### address\n\n`Address | undefined`\n\nThe contract's address.\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchContractEvent } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  useWatchContractEvent({\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f', // [!code focus]\n    abi,\n    eventName: 'Transfer',\n    onLogs(logs) {\n      console.log('New logs!', logs)\n    },\n  })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### args\n\n`object | readonly unknown[] | undefined`\n\n- Arguments to pass when calling the contract.\n- Inferred from [`abi`](#abi) and [`eventName`](#eventname).\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchContractEvent } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  useWatchContractEvent({\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    abi,\n    args: { // [!code focus]\n      to: '0xd2135CfB216b74109775236E36d4b433F1DF507B' // [!code focus]\n    } // [!code focus]\n    eventName: 'Transfer',\n    onLogs(logs) {\n      console.log('New logs!', logs)\n    },\n  })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### batch\n\n`boolean | undefined`\n\n- Whether or not the events should be batched on each invocation.\n- Defaults to `true`.\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchContractEvent } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  useWatchContractEvent({\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    abi,\n    batch: false, // [!code focus]\n    eventName: 'Transfer',\n    onLogs(logs) {\n      console.log('New logs!', logs)\n    },\n  })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchContractEvent } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  useWatchContractEvent({\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    abi,\n    chainId: 1, // [!code focus]\n    eventName: 'Transfer',\n    onLogs(logs) {\n      console.log('New logs!', logs)\n    },\n  })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchContractEvent } from 'wagmi'\nimport { abi } from './abi'\nimport { config } from './config'\n\nfunction App() {\n  useWatchContractEvent({\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    abi,\n    config, // [!code focus]\n    eventName: 'Transfer',\n    onLogs(logs) {\n      console.log('New logs!', logs)\n    },\n  })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### eventName\n\n`string`\n\n- Event to listen for the contract.\n- Inferred from [`abi`](#abi).\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchContractEvent } from 'wagmi'\nimport { abi } from './abi'\nimport { config } from './config'\n\nfunction App() {\n  useWatchContractEvent({\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    abi,\n    eventName: 'Transfer', // [!code focus]\n    onLogs(logs) {\n      console.log('New logs!', logs)\n    },\n  })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### onError\n\n`((error: Error) => void) | undefined`\n\nError thrown from getting the block number.\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchContractEvent } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  useWatchContractEvent({\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    abi,\n    eventName: 'Transfer',\n    onLogs(logs) {\n      console.log('New logs!', logs)\n    },\n    onError(error) { // [!code focus]\n      console.log('Error', error) // [!code focus]\n    } // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### onLogs\n\n`(logs: Log[], prevLogs: Log[] | undefined) => void`\n\nCallback for when logs changes.\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchContractEvent } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  useWatchContractEvent({\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    abi,\n    eventName: 'Transfer',\n    onLogs(logs) { // [!code focus]\n      console.log('New logs!', logs) // [!code focus]\n    } // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### poll\n\n`boolean | undefined`\n\n- Whether or not to use a polling mechanism to check for new blocks instead of a WebSocket subscription.\n- Defaults to `false` for WebSocket Clients, and `true` for non-WebSocket Clients.\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchContractEvent } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  useWatchContractEvent({\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    abi,\n    eventName: 'Transfer',\n    onLogs(logs) {\n      console.log('New logs!', logs)\n    },\n    poll: true // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### pollingInterval\n\n`number | undefined`\n\n- Polling frequency (in milliseconds).\n- Defaults to the [Config's `pollingInterval` config](/core/api/createConfig#pollinginterval).\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchContractEvent } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  useWatchContractEvent({\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    abi,\n    eventName: 'Transfer',\n    onLogs(logs) {\n      console.log('New logs!', logs)\n    },\n    pollingInterval: 1_000 // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### strict\n\n`boolean | undefined`\n\n- Defaults to `false`.\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchContractEvent } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  useWatchContractEvent({\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    abi,\n    eventName: 'Transfer',\n    onLogs(logs) {\n      console.log('New logs!', logs)\n    },\n    strict: true // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### syncConnectedChain\n\n`boolean | undefined`\n\n- Set up subscriber for connected chain changes.\n- Defaults to [`Config['syncConnectedChain']`](/core/api/createConfig#syncconnectedchain).\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchContractEvent } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  useWatchContractEvent({\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    abi,\n    eventName: 'Transfer',\n    onLogs(logs) {\n      console.log('New logs!', logs)\n    },\n    syncConnectedChain: true // [!code focus]\n  })\n}\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type UseWatchContractEventReturnType } from 'wagmi'\n```\n\nHook returns `void`\n\n## Action\n\n- [`watchContractEvent`](/core/api/actions/watchContractEvent)\n"
  },
  {
    "path": "site/react/api/hooks/useWatchPendingTransactions.md",
    "content": "---\ntitle: useWatchPendingTransactions\ndescription: Hook that watches and returns pending transaction hashes.\n---\n\n# useWatchPendingTransactions\n\nHook that watches and returns pending transaction hashes.\n\n## Import\n\n```ts\nimport { useWatchPendingTransactions } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchPendingTransactions } from 'wagmi'\n\nfunction App() {\n  useWatchPendingTransactions({\n    onTransactions(transactions) {\n      console.log('New transactions!', transactions)\n    },\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseWatchPendingTransactionsParameters } from 'wagmi'\n```\n\n### batch\n\n`boolean | undefined`\n\n- Whether or not the transactions should be batched on each invocation.\n- Defaults to `true`.\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchPendingTransactions } from 'wagmi'\n\nfunction App() {\n  useWatchPendingTransactions({\n    batch: true // [!code focus]\n    onTransactions(transactions) {\n      console.log('New transactions!', transactions)\n    },\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchPendingTransactions } from 'wagmi'\n\nfunction App() {\n  useWatchPendingTransactions({\n    chainId: 1 // [!code focus]\n    onTransactions(transactions) {\n      console.log('New transactions!', transactions)\n    },\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchPendingTransactions } from 'wagmi'\nimport { config } from './config'\n\nfunction App() {\n  useWatchPendingTransactions({\n    config // [!code focus]\n    onTransactions(transactions) {\n      console.log('New transactions!', transactions)\n    },\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### onError\n\n`((error: Error) => void) | undefined`\n\nError thrown from watching pending transactions.\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchPendingTransactions } from 'wagmi'\n\nfunction App() {\n  useWatchPendingTransactions({\n    onError(error) { // [!code focus]\n      console.log('Error', error) // [!code focus]\n    }, // [!code focus]\n    onTransactions(transactions) {\n      console.log('New transactions!', transactions)\n    },\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### onTransactions\n\n`(transactions: Hash[], prevTransactions: Hash[] | undefined) => void`\n\nCallback when new incoming pending transactions are detected.\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchPendingTransactions } from 'wagmi'\n\nfunction App() {\n  useWatchPendingTransactions({\n    onTransactions(transactions) { // [!code focus]\n      console.log('New transactions!', transactions) // [!code focus]\n    }, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### poll\n\n`boolean | undefined`\n\n- Whether or not to use a polling mechanism to check for new pending transactions instead of a WebSocket subscription.\n- Defaults to `false` for WebSocket Clients, and `true` for non-WebSocket Clients.\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchPendingTransactions } from 'wagmi'\n\nfunction App() {\n  useWatchPendingTransactions({\n    onTransactions(transactions) {\n      console.log('New transactions!', transactions)\n    },\n    poll: true, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### pollingInterval\n\n`number | undefined`\n\n- Polling frequency (in milliseconds).\n- Defaults to the [Config's `pollingInterval` config](/core/api/createConfig#pollinginterval).\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchPendingTransactions } from 'wagmi'\n\nfunction App() {\n  useWatchPendingTransactions({\n    onTransactions(transactions) {\n      console.log('New transactions!', transactions)\n    },\n    pollingInterval: 1_000, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### syncConnectedChain\n\n`boolean | undefined`\n\n- Set up subscriber for connected chain changes.\n- Defaults to [`Config['syncConnectedChain']`](/core/api/createConfig#syncconnectedchain).\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchPendingTransactions } from 'wagmi'\n\nfunction App() {\n  useWatchPendingTransactions({\n    onTransactions(transactions) {\n      console.log('New transactions!', transactions)\n    },\n    syncConnectedChain: false, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type UseWatchPendingTransactionsReturnType } from 'wagmi'\n```\n\n## Action\n\n- [`watchPendingTransactions`](/core/api/actions/watchPendingTransactions)\n"
  },
  {
    "path": "site/react/api/hooks/useWriteContract.md",
    "content": "---\ntitle: useWriteContract\ndescription: Action for executing a write function on a contract.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'writeContract'\nconst typeName = 'WriteContract'\nconst mutate = 'writeContract'\nconst TData = 'WriteContractReturnType'\nconst TError = 'WriteContractErrorType'\nconst TVariables = 'WriteContractVariables'\n</script>\n\n# useWriteContract\n\nAction for executing a write function on a contract.\n\nA \"write\" function on a Solidity contract modifies the state of the blockchain. These types of functions require gas to be executed, hence a transaction is broadcasted in order to change the state.\n\n## Import\n\n```ts\nimport { useWriteContract } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n\n```tsx [index.tsx]\nimport { useWriteContract } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const writeContract = useWriteContract()\n  return (\n    <button \n      onClick={() => \n        writeContract.mutate({ \n          abi,\n          address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n          functionName: 'transferFrom',\n          args: [\n            '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n            '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n            123n,\n          ],\n       })\n      }\n    >\n      Transfer\n    </button>\n  )\n}\n```\n\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### Synchronous Usage\n\nIf you want to wait for the transaction to be included in a block, you can use `useWriteContractSync`:\n\n::: code-group\n\n```tsx [index.tsx]\nimport { useWriteContractSync } from 'wagmi'\nimport { abi } from './abi'\n\nfunction App() {\n  const writeContractSync = useWriteContractSync()\n  return (\n    <button \n      onClick={() => \n        writeContractSync.mutate({ \n          abi,\n          address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n          functionName: 'transferFrom',\n          args: [\n            '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n            '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n            123n,\n          ],\n       })\n      }\n    >\n      Transfer\n    </button>\n  )\n}\n```\n\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!-- TODO: Usage for simulating before -->\n\n<!-- TODO: Usage for estimating gas before -->\n\n## Parameters\n\n```ts\nimport { type UseWriteContractParameters } from 'wagmi'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n\n```tsx [index.tsx]\nimport { useWriteContract } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const writeContract = useWriteContract({\n    config, // [!code focus]\n  })\n}\n```\n\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseWriteContractReturnType } from 'wagmi'\n```\n\nThe return type's [`data`](#data) property is inferrable via the combination of [`abi`](#abi), [`functionName`](#functionname), and [`args`](#args). Check out the [TypeScript docs](/react/typescript#const-assert-abis-typed-data) for more info.\n\n<!--@include: @shared/mutation-result.md-->\n\n## Type Inference\n\nWith [`abi`](/core/api/actions/writeContract#abi) setup correctly, TypeScript will infer the correct types for [`functionName`](/core/api/actions/writeContract#functionname), [`args`](/core/api/actions/writeContract#args), and the [`value`](/core/api/actions/writeContract##value). See the Wagmi [TypeScript docs](/react/typescript) for more information.\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`writeContract`](/core/api/actions/writeContract)\n"
  },
  {
    "path": "site/react/api/hooks/useWriteContracts.md",
    "content": "---\ntitle: useWriteContracts\ndescription: Hook that requests for the wallet to sign and broadcast a batch of calls (transactions) to the network. \n---\n\n<script setup>\nconst packageName = 'wagmi/experimental'\nconst actionName = 'writeContracts'\nconst typeName = 'WriteContracts'\nconst mutate = 'writeContracts'\nconst TData = 'WriteContractsData'\nconst TError = 'WriteContractsErrorType'\nconst TVariables = 'WriteContractsVariables'\n</script>\n\n# useWriteContracts\n\nHook that requests for the wallet to sign and broadcast a batch of write contract calls (transactions) to the network.\n\n[Read more.](https://github.com/ethereum/EIPs/blob/815028dc634463e1716fc5ce44c019a6040f0bef/EIPS/eip-5792.md#wallet_sendcalls)\n\n## Import\n\n```ts\nimport { useWriteContracts } from 'wagmi/experimental'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useWriteContracts } from 'wagmi/experimental'\nimport { parseAbi } from 'viem'\n\nconst abi = parseAbi([\n  'function approve(address, uint256) returns (bool)',\n  'function transferFrom(address, address, uint256) returns (bool)',\n])\n\nfunction App() {\n  const { writeContracts } = useWriteContracts()\n\n  return (\n    <button\n      onClick={() =>\n        writeContracts({\n          contracts: [\n            {\n              address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n              abi,\n              functionName: 'approve',\n              args: [\n                '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC', \n                100n\n              ],\n            },\n            {\n              address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n              abi,\n              functionName: 'transferFrom',\n              args: [\n                '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n                '0x0000000000000000000000000000000000000000',\n                100n\n              ],\n            },\n          ],\n        })\n      }\n    >\n      Send calls\n    </button>\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseWriteContractsParameters } from 'wagmi/experimental'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```tsx [index.tsx]\nimport { useWriteContracts } from 'wagmi/experimental'\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  const result = useWriteContracts({\n    config, // [!code focus]\n  })\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseWriteContractsReturnType } from 'wagmi/experimental'\n```\n\n<!--@include: @shared/mutation-result.md-->\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`writeContracts`](/core/api/actions/writeContracts)\n"
  },
  {
    "path": "site/react/api/hooks.md",
    "content": "<script setup>\nimport { getSidebar } from '../../.vitepress/sidebar'\n\nconst hooks = getSidebar()['/react']\n  .find(x => x.text === 'Hooks').items\n  .sort((a, b) => a.text.localeCompare(b.text))\n</script>\n\n# Hooks\n\nReact Hooks for accounts, wallets, contracts, transactions, signing, ENS, and more.\n\n## Import\n\n```ts\nimport { useConnection } from 'wagmi'\n```\n\n## Available Hooks\n\n<ul>\n  <li v-for=\"hook of hooks\">\n    <a :href=\"hook.link\">{{ hook.text }}</a>\n  </li>\n</ul>\n"
  },
  {
    "path": "site/react/api/transports/custom.md",
    "content": "---\ntitle: custom\n---\n\n<script setup>\nconst packageName = 'wagmi'\n</script>\n\n<!-- @include: @shared/transports/custom.md -->\n"
  },
  {
    "path": "site/react/api/transports/fallback.md",
    "content": "---\ntitle: fallback\n---\n\n<script setup>\nconst packageName = 'wagmi'\n</script>\n\n<!-- @include: @shared/transports/fallback.md -->\n"
  },
  {
    "path": "site/react/api/transports/http.md",
    "content": "---\ntitle: http\n---\n\n<script setup>\nconst packageName = 'wagmi'\n</script>\n\n<!-- @include: @shared/transports/http.md -->\n"
  },
  {
    "path": "site/react/api/transports/unstable_connector.md",
    "content": "---\ntitle: unstable_connector\n---\n\n<script setup>\nconst docsPath = 'react'\nconst packageName = 'wagmi'\n</script>\n\n<!-- @include: @shared/transports/unstable_connector.md -->\n"
  },
  {
    "path": "site/react/api/transports/webSocket.md",
    "content": "---\ntitle: webSocket\n---\n\n<script setup>\nconst packageName = 'wagmi'\n</script>\n\n<!-- @include: @shared/transports/webSocket.md -->\n"
  },
  {
    "path": "site/react/api/transports.md",
    "content": "<script setup>\nimport { getSidebar } from '../../.vitepress/sidebar'\n\nconst transports = getSidebar()['/core']\n  .find(x => x.text.includes('Configuration')).items\n  .find(x => x.text.includes('Transports')).items\n  .sort((a, b) => a.text.localeCompare(b.text))\n</script>\n\n# Transports\n\n[`createConfig`](/react/api/createConfig) can be instantiated with a set of Transports for each chain. A Transport is the intermediary layer that is responsible for executing outgoing JSON-RPC requests to the RPC Provider (e.g. Alchemy, Infura, etc).\n\n## Import\n\n```ts\nimport { http } from 'wagmi'\n```\n\n## Built-In Transports\n\nAvailable via the `'wagmi'` entrypoint.\n\n<ul>\n  <li v-for=\"transport of transports\">\n    <a :href=\"transport.link\">{{ transport.text }}</a>\n  </li>\n</ul>\n"
  },
  {
    "path": "site/react/api/utilities/cookieToInitialState.md",
    "content": "---\ntitle: cookieToInitialState\n---\n\n<script setup>\nconst packageName = 'wagmi'\n</script>\n\n<!--@include: @shared/utilities/cookieToInitialState.md-->\n"
  },
  {
    "path": "site/react/api/utilities/deserialize.md",
    "content": "---\ntitle: deserialize\n---\n\n<script setup>\nconst packageName = 'wagmi'\n</script>\n\n<!--@include: @shared/utilities/deserialize.md-->\n"
  },
  {
    "path": "site/react/api/utilities/serialize.md",
    "content": "---\ntitle: serialize\n---\n\n<script setup>\nconst packageName = 'wagmi'\n</script>\n\n<!--@include: @shared/utilities/serialize.md-->\n"
  },
  {
    "path": "site/react/comparisons.md",
    "content": "# Comparison\n\nThere are multiple options when it comes to React libraries for Ethereum that help manage wallet connections, provide utility methods/hooks, etc.\n\n::: tip\nComparisons strive to be as accurate and as unbiased as possible. If you use any of these libraries and feel the information could be improved, feel free to suggest changes.\n:::\n\n## Overview\n\n|                      | [wagmi](https://github.com/wagmi-dev/wagmi)                                                     | [web3-react](https://github.com/NoahZinsmeister/web3-react)                                             | [useDApp](https://github.com/EthWorks/useDApp)                                                     |\n| -------------------- | :---------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------- |\n| GitHub Stars         | ![wagmi star count](https://img.shields.io/github/stars/wagmi-dev/wagmi?colorB=27292E&label=)   | ![web3-react star count](https://img.shields.io/github/stars/Uniswap/web3-react?colorB=27292E&label=)   | ![useDApp star count](https://img.shields.io/github/stars/EthWorks/useDApp?colorB=27292E&label=)   |\n| Open Issues          | ![wagmi issue count](https://img.shields.io/github/issues/wagmi-dev/wagmi?colorB=27292E&label=) | ![web3-react issue count](https://img.shields.io/github/issues/Uniswap/web3-react?colorB=27292E&label=) | ![useDApp issue count](https://img.shields.io/github/issues/EthWorks/useDApp?colorB=27292E&label=) |\n| Downloads            | ![wagmi downloads](https://img.shields.io/npm/dw/wagmi?colorB=27292E&label=)                    | ![web3-react downloads](https://img.shields.io/npm/dw/@web3-react/core?colorB=27292E&label=)            | ![useDApp downloads](https://img.shields.io/npm/dw/@usedapp/core?colorB=27292E&label=)             |\n| License              | ![wagmi license](https://img.shields.io/github/license/wagmi-dev/wagmi?colorB=27292E&label=)    | ![web3-react license](https://img.shields.io/github/license/Uniswap/web3-react?colorB=27292E&label=)    | ![useDApp license](https://img.shields.io/github/license/EthWorks/useDApp?colorB=27292E&label=)    |\n| Their Comparison     | –                                                                                               | none                                                                                                    | none                                                                                               |\n| Supported Frameworks | React, Vanilla JS                                                                               | React                                                                                                   | React                                                                                              |\n| Documentation        | ✅                                                                                              | 🛑                                                                                                      | ✅                                                                                                 |\n| TypeScript           | ✅                                                                                              | 🔶                                                                                                      | 🔶                                                                                                 |\n| EIP-6963 Support     | ✅                                                                                              | 🔴                                                                                                      | 🔴                                                                                                 |\n| Test Suite           | ✅                                                                                              | 🔶                                                                                                      | 🔶                                                                                                 |\n| Examples             | ✅                                                                                              | 🔶                                                                                                      | ✅                                                                                                 |\n\n::: details Comparison Key\n\n1. Documentation\n  - Comprehensive documentation for all library features ✅\n  - No documentation 🔴\n2. Typescript\n  - Infer types from ABIs, EIP-712 Typed Data, etc. ✅\n  - Can add types with explicit generics, type annotations, etc. 🔶\n3. Test Suite\n  - Runs against forked Ethereum network(s) ✅\n  - Mocking functionality (i.e. RPC calls) is 🔶\n4. EIP-6963 Support\n  - Fully compatible with EIP-6963 ✅\n  - Not compatible with EIP-6963 🔴\n5. Examples\n  - Has multiple examples ✅\n  - Has single example 🔶\n:::\n\n## [Wagmi](https://github.com/wagmi-dev/wagmi)\n\n### Pros\n\n- 20+ hooks for working with wallets, ENS, contracts, transactions, signing, etc.\n- Built-in wallet connectors for injected providers (EIP-6963 support), WalletConnect, MetaMask, Coinbase Wallet\n- Caching, request deduplication, and persistence powered by TanStack Query\n- Auto-refresh data on wallet, block, and network changes\n- Multicall support\n- Test suite running against forked Ethereum networks\n- TypeScript ready (infer types from ABIs and EIP-712 Typed Data)\n- Extensive documentation and examples\n- Used by Coinbase, Stripe, Shopify, Uniswap, Optimism, ENS, Sushi, and [many more](https://github.com/wagmi-dev/wagmi/discussions/201)\n- MIT License\n\n### Cons\n\n- Not as many built-in connectors as `web3-react`\n\n## [web3-react](https://github.com/Uniswap/web3-react)\n\n### Pros\n\n- Supports many different connectors (conceptually similar to Wagmi's connectors)\n- Basic hooks for managing account\n\n### Cons\n\n- Need to set up connectors and method for connecting wallet on your own\n- Need to install connectors separately\n- Almost no tests or documentation; infrequent updates\n- GPL-3.0 License\n\n## [useDApp](https://github.com/EthWorks/useDApp)\n\n### Pros\n\n- Auto-refresh on new blocks and wallet changes\n- Multicall support\n- Transaction notifications\n- Chrome extension and Firefox add-on\n- MIT License\n\n### Cons\n\n- Non-standard hook API\n\n"
  },
  {
    "path": "site/react/getting-started.md",
    "content": "<script setup>\nimport packageJson from '../../packages/react/package.json'\n\nconst viemVersion = packageJson.peerDependencies.viem\n</script>\n\n# Getting Started\n\n## Overview\n\nWagmi is a React Hooks library for Ethereum. You can learn more about the rationale behind the project in the [Why Wagmi](/react/why) section.\n\n## Automatic Installation\n\nFor new projects, it is recommended to set up your Wagmi app using the [`create-wagmi`](/cli/create-wagmi) command line interface (CLI). This will create a new Wagmi project using TypeScript and install the required dependencies.\n\n::: code-group\n```bash [pnpm]\npnpm create wagmi\n```\n\n```bash [npm]\nnpm create wagmi@latest\n```\n\n```bash [yarn]\nyarn create wagmi\n```\n\n```bash [bun]\nbun create wagmi\n```\n:::\n\nOnce the command runs, you'll see some prompts to complete.\n\n```ansi\nProject name: wagmi-project\nSelect a framework: React / Vanilla\n...\n```\n\nAfter the prompts, `create-wagmi` will create a directory with your project name and install the required dependencies. Check out the `README.md` for further instructions (if required).\n\n## Manual Installation\n\nTo manually add Wagmi to your project, install the required packages.\n\n::: code-group\n```bash-vue [pnpm]\npnpm add wagmi viem@{{viemVersion}} @tanstack/react-query\n```\n\n```bash-vue [npm]\nnpm install wagmi viem@{{viemVersion}} @tanstack/react-query\n```\n\n```bash-vue [yarn]\nyarn add wagmi viem@{{viemVersion}} @tanstack/react-query\n```\n\n```bash-vue [bun]\nbun add wagmi viem@{{viemVersion}} @tanstack/react-query\n```\n:::\n\n- [Viem](https://viem.sh) is a TypeScript interface for Ethereum that performs blockchain operations.\n- [TanStack Query](https://tanstack.com/query/v5) is an async state manager that handles requests, caching, and more.\n- [TypeScript](/react/typescript) is optional, but highly recommended. Learn more about [TypeScript support](/react/typescript).\n\n### Create Config\n\nCreate and export a new Wagmi config using `createConfig`.\n\n::: code-group\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\nIn this example, Wagmi is configured to use the Mainnet and Sepolia chains, and `injected` connector. Check out the [`createConfig` docs](/react/api/createConfig) for more configuration options.\n\n\n::: details TypeScript Tip\nIf you are using TypeScript, you can \"register\" the Wagmi config or use the hook `config` property to get strong type-safety across React Context in places that wouldn't normally have type info.\n\n::: code-group\n```ts twoslash [register config]\n// @twoslash-cache: {\"v\":1,\"hash\":\"1e950b442ed7db157508f31fce13aca96913b67241b30d5521468ad652cad085\",\"data\":\"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=\"}\n// @errors: 2322\nimport { type Config } from 'wagmi'\nimport { mainnet, sepolia } from 'wagmi/chains'\n\ndeclare const config: Config<readonly [typeof mainnet, typeof sepolia]>\n// ---cut---\nimport { useBlockNumber } from 'wagmi'\n\nuseBlockNumber({ chainId: 123 })\n\ndeclare module 'wagmi' {\n  interface Register {\n    config: typeof config\n  }\n}\n```\n\n```ts twoslash [hook config property]\n// @twoslash-cache: {\"v\":1,\"hash\":\"849a5652cb34072baf13797118507e525565a80b04851946389914c2dc341926\",\"data\":\"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\"}\n// @errors: 2322\nimport { type Config } from 'wagmi'\nimport { mainnet, sepolia } from 'wagmi/chains'\n\ndeclare const config: Config<readonly [typeof mainnet, typeof sepolia]>\n// ---cut---\nimport { useBlockNumber } from 'wagmi'\n\nuseBlockNumber({ chainId: 123, config })\n```\n\nBy registering or using the hook `config` property, `useBlockNumber`'s `chainId` is strongly typed to only allow Mainnet and Sepolia IDs. Learn more by reading the [TypeScript docs](/react/typescript#config-types).\n:::\n\n### Wrap App in Context Provider\n\nWrap your app in the `WagmiProvider` React Context Provider and pass the `config` you created earlier to the `config` property.\n\n::: code-group\n```tsx [app.tsx]\nimport { WagmiProvider } from 'wagmi' // [!code focus]\nimport { config } from './config' // [!code focus]\n\nfunction App() {\n  return (\n    <WagmiProvider config={config}> // [!code focus]\n      {/** ... */} // [!code focus]\n    </WagmiProvider> // [!code focus]\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\nCheck out the [`WagmiProvider` docs](/react/api/WagmiProvider) to learn more about React Context in Wagmi.\n\n### Setup TanStack Query\n\nInside the `WagmiProvider`, wrap your app in a TanStack Query React Context Provider, e.g. `QueryClientProvider`, and pass a new `QueryClient` instance to the `client` property.\n\n::: code-group\n```tsx [app.tsx]\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query' // [!code focus]\nimport { WagmiProvider } from 'wagmi'\nimport { config } from './config'\n\nconst queryClient = new QueryClient() // [!code focus]\n\nfunction App() {\n  return (\n    <WagmiProvider config={config}>\n      <QueryClientProvider client={queryClient}> // [!code focus]\n        {/** ... */} // [!code focus]\n      </QueryClientProvider> // [!code focus]\n    </WagmiProvider>\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\nCheck out the [TanStack Query docs](https://tanstack.com/query/latest/docs/framework/react/overview) to learn about the library, APIs, and more.\n\n### Use Wagmi\n\nNow that everything is set up, every component inside the Wagmi and TanStack Query Providers can use Wagmi React Hooks.\n\n::: code-group\n```tsx [profile.tsx]\nimport { useConnection, useEnsName } from 'wagmi'\n\nexport function Profile() {\n  const { address } = useConnection()\n  const { data, error, status } = useEnsName({ address })\n  if (status === 'pending') return <div>Loading ENS name</div>\n  if (status === 'error')\n    return <div>Error fetching ENS name: {error.message}</div>\n  return <div>ENS name: {data}</div>\n}\n```\n\n```tsx [app.tsx]\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { WagmiProvider } from 'wagmi'\nimport { config } from './config'\nimport { Profile } from './profile'\n\nconst queryClient = new QueryClient()\n\nfunction App() {\n  return (\n    <WagmiProvider config={config}>\n      <QueryClientProvider client={queryClient}>\n        <Profile />\n      </QueryClientProvider>\n    </WagmiProvider>\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Next Steps\n\nFor more information on what to do next, check out the following topics.\n\n- [**TypeScript**](/react/typescript) Learn how to get the most out of Wagmi's type-safety and inference for an enlightened developer experience.\n- [**Connect Wallet**](/react/guides/connect-wallet) Learn how to enable wallets to connect to and disconnect from your apps and display information about connected accounts.\n- [**React Hooks**](/react/api/hooks) Browse the collection of React Hooks and learn how to use them.\n- [**Viem**](/react/guides/viem) Learn about Viem and how it works with Wagmi.\n"
  },
  {
    "path": "site/react/guides/chain-properties.md",
    "content": "# Chain Properties\n\nSome chains support additional properties related to blocks and transactions. This is powered by Viem's [formatters](https://viem.sh/docs/chains/formatters) and [serializers](https://viem.sh/docs/chains/serializers). For example, Celo, ZkSync, OP Stack chains all support additional properties. In order to use these properties in a type-safe way, there are a few things you should be aware of.\n\n<br/>\n\n::: tip\nMake sure you follow the TypeScript guide's [Config Types](/react/typescript#config-types) section before moving on. The easiest way to do this is to use [Declaration Merging](/react/typescript#declaration-merging) to \"register\" your `config` globally with TypeScript.\n\n<<< @/snippets/react/config-chain-properties.ts[config.ts]\n:::\n\n## Narrowing Parameters\n\nOnce your Config is registered with TypeScript, you are ready to access chain-specific properties! For example, Celo's `feeCurrency` is available.\n\n::: code-group\n```ts [index.tsx]\nimport { parseEther } from 'viem'\nimport { useSimulateContract } from 'wagmi'\n\nconst result = useSimulateContract({\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n  feeCurrency: '0x…', // [!code focus]\n})\n```\n<<< @/snippets/react/config-chain-properties.ts[config.ts]\n:::\n\nThis is great, but if you have multiple chains that support additional properties, your autocomplete could be overwhelmed with all of them. By setting the `chainId` property to a specific value (e.g. `celo.id`), you can narrow parameters to a single chain.\n\n::: code-group\n```ts [index.tsx]\nimport { parseEther } from 'viem'\nimport { useSimulateContract } from 'wagmi'\nimport { celo } from 'wagmi/chains'\n\nconst result = useSimulateContract({\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n  chainId: celo.id, // [!code focus]\n  feeCurrency: '0x…', // [!code focus]\n  // ^? (property) feeCurrency?: `0x${string}` | undefined // [!code focus]\n})\n```\n<<< @/snippets/react/config-chain-properties.ts[config.ts]\n:::\n\n## Narrowing Return Types\n\nReturn types can also have chain-specific properties attached to them. There are a couple approaches for extracting these properties.\n\n### `chainId` Parameter\n\nNot only can you use the `chainId` parameter to [narrow parameters](#narrowing-parameters), you can also use it to narrow the return type.\n\n::: code-group\n```ts [index.tsx]\nimport { useWaitForTransactionReceipt } from 'wagmi'\nimport { zkSync } from 'wagmi/chains'\n\nconst { data } = useWaitForTransactionReceipt({\n  chainId: zkSync.id,\n  hash: '0x16854fcdd0219cacf5aec5e4eb2154dac9e406578a1510a6fc48bd0b67e69ea9',\n})\n\ndata?.logs\n//    ^? (property) logs: ZkSyncLog[] | undefined\n```\n<<< @/snippets/react/config-chain-properties.ts[config.ts]\n:::\n\n### `chainId` Data Property\n\nWagmi internally will set a `chainId` property on return types that you can use to narrow results. The `chainId` is determined from the `chainId` parameter or global state (e.g. connector). You can use this property to help TypeScript narrow the type.\n\n::: code-group\n```ts [index.tsx]\nimport { useWaitForTransactionReceipt } from 'wagmi'\nimport { zkSync } from 'wagmi/chains'\n\nconst { data } = useWaitForTransactionReceipt({\n  hash: '0x16854fcdd0219cacf5aec5e4eb2154dac9e406578a1510a6fc48bd0b67e69ea9',\n})\n\nif (data?.chainId === zkSync.id) {\n  data?.logs\n  //    ^? (property) logs: ZkSyncLog[] | undefined\n}\n```\n<<< @/snippets/react/config-chain-properties.ts[config.ts]\n:::\n\n## Troubleshooting\n\nIf chain properties aren't working, make sure [TypeScript](/react/guides/faq#type-inference-doesn-t-work) is configured correctly. Not all chains have additional properties, to check which ones do, see the [Viem repo](https://github.com/wevm/viem/tree/main/src/chains) (chains that have a top-level directory under [`src/chains`](https://github.com/wevm/viem/tree/main/src/chains) support additional properties).\n"
  },
  {
    "path": "site/react/guides/connect-wallet.md",
    "content": "# Connect Wallet\n\nThe ability for a user to connect their wallet is a core function for any Dapp. It allows users to perform tasks such as: writing to contracts, signing messages, or sending transactions.\n\nWagmi contains everything you need to get started with building a Connect Wallet module. To get started, you can either use a [third-party library](#third-party-libraries) or [build your own](#build-your-own).\n\n## Third-party Libraries\n\nYou can use a pre-built Connect Wallet module from a third-party library such as:\n\n- [ConnectKit](https://docs.family.co/connectkit) - [Guide](https://docs.family.co/connectkit/getting-started)\n- [Dynamic](https://www.dynamic.xyz/) - [Guide](https://docs.dynamic.xyz/quickstart)\n- [Privy](https://privy.io) - [Guide](https://docs.privy.io/guide/react/wallets/usage/wagmi)\n\nThe above libraries are all built on top of Wagmi, handle all the edge cases around wallet connection, and provide a seamless Connect Wallet UX that you can use in your Dapp.\n\n## Build Your Own\n\nWagmi provides you with the Hooks to get started building your own Connect Wallet module. \n\nIt takes less than five minutes to get up and running with Browser Wallets, WalletConnect, and Coinbase Wallet.\n\n### 1. Configure Wagmi\n\nBefore we get started with building the functionality of the Connect Wallet module, we will need to set up the Wagmi configuration.\n\nLet's create a `config.ts` file and export a `config` object.\n\n::: code-group\n\n```tsx [config.ts]\nimport { http, createConfig } from 'wagmi'\nimport { base, mainnet, optimism } from 'wagmi/chains'\nimport { injected, metaMask, safe, walletConnect } from 'wagmi/connectors'\n\nconst projectId = '<WALLETCONNECT_PROJECT_ID>'\n\nexport const config = createConfig({\n  chains: [mainnet, base],\n  connectors: [\n    injected(),\n    walletConnect({ projectId }),\n    metaMask(),\n    safe(),\n  ],\n  transports: {\n    [mainnet.id]: http(),\n    [base.id]: http(),\n  },\n})\n```\n\n:::\n\nIn the above configuration, we want to set up connectors for Injected (browser), WalletConnect (browser + mobile), MetaMask, and Safe wallets. This configuration uses the **Mainnet** and **Base** chains, but you can use whatever you want.\n\n::: warning\n\nMake sure to replace the `projectId` with your own WalletConnect Project ID, if you wish to use WalletConnect! \n\n[Get your Project ID](https://cloud.reown.com/)\n\n:::\n\n### 2. Wrap App in Context Provider\n\nNext, we will need to wrap our React App with Context so that our application is aware of Wagmi & React Query's reactive state and in-memory caching.\n\n::: code-group\n\n```tsx [app.tsx]\n // 1. Import modules\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { WagmiProvider } from 'wagmi'\nimport { config } from './config'\n\n// 2. Set up a React Query client.\nconst queryClient = new QueryClient()\n\nfunction App() {\n  // 3. Wrap app with Wagmi and React Query context.\n  return (\n    <WagmiProvider config={config}>\n      <QueryClientProvider client={queryClient}> \n        {/** ... */} \n      </QueryClientProvider> \n    </WagmiProvider>\n  )\n}\n```\n\n```tsx [config.ts]\nimport { http, createConfig } from 'wagmi'\nimport { base, mainnet, optimism } from 'wagmi/chains'\nimport { injected, metaMask, safe, walletConnect } from 'wagmi/connectors'\n\nconst projectId = '<WALLETCONNECT_PROJECT_ID>'\n\nexport const config = createConfig({\n  chains: [mainnet, base],\n  connectors: [\n    injected(),\n    walletConnect({ projectId }),\n    metaMask(),\n    safe(),\n  ],\n  transports: {\n    [mainnet.id]: http(),\n    [base.id]: http(),\n  },\n})\n```\n\n:::\n\n### 3. Display Wallet Options\n\nAfter that, we will create a `WalletOptions` component that will display our connectors. This will allow users to select a wallet and connect.\n\nBelow, we are rendering a list of `connectors` retrieved from `useConnect`. When the user clicks on a connector, the `connect` function will connect the users' wallet.\n\n::: code-group\n\n```tsx [wallet-options.tsx]\nimport * as React from 'react'\nimport { Connector, useConnect, useConnectors } from 'wagmi'\n\nexport function WalletOptions() {\n  const { connect } = useConnect()\n  const connectors = useConnectors()\n\n  return connectors.map((connector) => (\n    <button key={connector.uid} onClick={() => connect({ connector })}>\n      {connector.name}\n    </button>\n  ))\n}\n```\n\n```tsx [app.tsx]\n // 1. Import modules\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { WagmiProvider } from 'wagmi'\nimport { config } from './config'\n\n// 2. Set up a React Query client.\nconst queryClient = new QueryClient()\n\nfunction App() {\n  // 3. Wrap app with Wagmi and React Query context.\n  return (\n    <WagmiProvider config={config}>\n      <QueryClientProvider client={queryClient}> \n        {/* ... */}\n      </QueryClientProvider> \n    </WagmiProvider>\n  )\n}\n```\n\n```tsx [config.ts]\nimport { http, createConfig } from 'wagmi'\nimport { base, mainnet, optimism } from 'wagmi/chains'\nimport { injected, metaMask, safe, walletConnect } from 'wagmi/connectors'\n\nconst projectId = '<WALLETCONNECT_PROJECT_ID>'\n\nexport const config = createConfig({\n  chains: [mainnet, base],\n  connectors: [\n    injected(),\n    walletConnect({ projectId }),\n    metaMask(),\n    safe(),\n  ],\n  transports: {\n    [mainnet.id]: http(),\n    [base.id]: http(),\n  },\n})\n```\n\n:::\n\n### 4. Display Connection\n\nLastly, if an connection is made, we want to show some basic information, like the connected address and ENS name and avatar.\n\nBelow, we are using hooks like `useConnection`, `useEnsAvatar` and `useEnsName` to extract this information.\n\nWe are also utilizing `useDisconnect` to show a \"Disconnect\" button so a user can disconnect their wallet.\n\n::: code-group\n\n```tsx [connection.tsx]\nimport { useConnection, useDisconnect, useEnsAvatar, useEnsName } from 'wagmi'\n\nexport function Connection() {\n  const { address } = useConnection()\n  const { disconnect } = useDisconnect()\n  const { data: ensName } = useEnsName({ address })\n  const { data: ensAvatar } = useEnsAvatar({ name: ensName! })\n\n  return (\n    <div>\n      {ensAvatar && <img alt=\"ENS Avatar\" src={ensAvatar} />}\n      {address && <div>{ensName ? `${ensName} (${address})` : address}</div>}\n      <button onClick={() => disconnect()}>Disconnect</button>\n    </div>\n  )\n}\n```\n\n```tsx [wallet-options.tsx]\nimport * as React from 'react'\nimport { Connector, useConnect, useConnectors } from 'wagmi'\n\nexport function WalletOptions() {\n  const { connect } = useConnect()\n  const connectors = useConnectors()\n\n  return connectors.map((connector) => (\n    <WalletOption\n      key={connector.uid}\n      connector={connector}\n      onClick={() => connect({ connector })}\n    />\n  ))\n}\n\nfunction WalletOption({\n  connector,\n  onClick,\n}: {\n  connector: Connector\n  onClick: () => void\n}) {\n  const [ready, setReady] = React.useState(false)\n\n  React.useEffect(() => {\n    ;(async () => {\n      const provider = await connector.getProvider()\n      setReady(!!provider)\n    })()\n  }, [connector])\n\n  return (\n    <button disabled={!ready} onClick={onClick}>\n      {connector.name}\n    </button>\n  )\n}\n```\n\n```tsx [app.tsx]\n // 1. Import modules\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { WagmiProvider } from 'wagmi'\nimport { config } from './config'\n\n// 2. Set up a React Query client.\nconst queryClient = new QueryClient()\n\nfunction App() {\n  // 3. Wrap app with Wagmi and React Query context.\n  return (\n    <WagmiProvider config={config}>\n      <QueryClientProvider client={queryClient}> \n        {/* ... */}\n      </QueryClientProvider> \n    </WagmiProvider>\n  )\n}\n```\n\n```tsx [config.ts]\nimport { http, createConfig } from 'wagmi'\nimport { base, mainnet, optimism } from 'wagmi/chains'\nimport { injected, metaMask, safe, walletConnect } from 'wagmi/connectors'\n\nconst projectId = '<WALLETCONNECT_PROJECT_ID>'\n\nexport const config = createConfig({\n  chains: [mainnet, base],\n  connectors: [\n    injected(),\n    walletConnect({ projectId }),\n    metaMask(),\n    safe(),\n  ],\n  transports: {\n    [mainnet.id]: http(),\n    [base.id]: http(),\n  },\n})\n```\n\n:::\n\n### 5. Wire it up!\n\nFinally, we can wire up our Wallet Options and Connection components to our application's entrypoint.\n\n::: code-group\n\n```tsx [app.tsx]\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { WagmiProvider, useConnection } from 'wagmi'\nimport { config } from './config'\nimport { Connection } from './connection' // [!code ++]\nimport { WalletOptions } from './wallet-options' // [!code ++]\n\nconst queryClient = new QueryClient()\n\nfunction ConnectWallet() { // [!code ++]\n  const { isConnected } = useConnection() // [!code ++]\n  if (isConnected) return <Connection /> // [!code ++]\n  return <WalletOptions /> // [!code ++]\n} // [!code ++]\n\nfunction App() {\n  return (\n    <WagmiProvider config={config}>\n      <QueryClientProvider client={queryClient}> \n        <ConnectWallet /> // [!code ++]\n      </QueryClientProvider> \n    </WagmiProvider>\n  )\n}\n```\n\n```tsx [connection.tsx]\nimport { useConnection, useDisconnect, useEnsAvatar, useEnsName } from 'wagmi'\n\nexport function Connection() {\n  const { address } = useConnection()\n  const { disconnect } = useDisconnect()\n  const { data: ensName } = useEnsName({ address })\n  const { data: ensAvatar } = useEnsAvatar({ name: ensName! })\n\n  return (\n    <div>\n      {ensAvatar && <img alt=\"ENS Avatar\" src={ensAvatar} />}\n      {address && <div>{ensName ? `${ensName} (${address})` : address}</div>}\n      <button onClick={() => disconnect()}>Disconnect</button>\n    </div>\n  )\n}\n```\n\n```tsx [wallet-options.tsx]\nimport * as React from 'react'\nimport { Connector, useConnect, useConnectors } from 'wagmi'\n\nexport function WalletOptions() {\n  const { connect } = useConnect()\n  const connectors = useConnectors()\n\n  return connectors.map((connector) => (\n    <WalletOption\n      key={connector.uid}\n      connector={connector}\n      onClick={() => connect({ connector })}\n    />\n  ))\n}\n\nfunction WalletOption({\n  connector,\n  onClick,\n}: {\n  connector: Connector\n  onClick: () => void\n}) {\n  const [ready, setReady] = React.useState(false)\n\n  React.useEffect(() => {\n    ;(async () => {\n      const provider = await connector.getProvider()\n      setReady(!!provider)\n    })()\n  }, [connector])\n\n  return (\n    <button disabled={!ready} onClick={onClick}>\n      {connector.name}\n    </button>\n  )\n}\n```\n\n```tsx [config.ts]\nimport { http, createConfig } from 'wagmi'\nimport { base, mainnet, optimism } from 'wagmi/chains'\nimport { injected, metaMask, safe, walletConnect } from 'wagmi/connectors'\n\nconst projectId = '<WALLETCONNECT_PROJECT_ID>'\n\nexport const config = createConfig({\n  chains: [mainnet, base],\n  connectors: [\n    injected(),\n    walletConnect({ projectId }),\n    metaMask(),\n    safe(),\n  ],\n  transports: {\n    [mainnet.id]: http(),\n    [base.id]: http(),\n  },\n})\n```\n\n:::\n\n### Playground\n\nWant to see the above steps all wired up together in an end-to-end example? Check out the below StackBlitz playground.\n\n<br/>\n\n<iframe frameborder=\"0\" width=\"100%\" height=\"500px\" src=\"https://stackblitz.com/edit/vitejs-vite-ujbsuv?embed=1&file=src%2FApp.tsx&hideExplorer=1&view=preview\"></iframe>\n"
  },
  {
    "path": "site/react/guides/error-handling.md",
    "content": "# Error Handling\n\nThe `error` property in Wagmi Hooks is strongly typed with it's corresponding error type. This enables you to have granular precision with handling errors in your application.\n\nYou can discriminate the error type by using the `name` property on the error object.\n\n::: code-group\n```tsx twoslash [index.tsx]\n// @twoslash-cache: {\"v\":1,\"hash\":\"f5cf0003ac91d32dabedd71106481b4f3cd10de7f641dff78f479b328c2716e9\",\"data\":\"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\"}\n// @noErrors\nimport { useBlockNumber } from 'wagmi'\n\nfunction App() {\n  const { data, error } = useBlockNumber()\n  //            ^?\n\n  error?.name\n  //     ^?\n\n\n\n\n\n\n  if (error?.name === 'HttpRequestError') {\n    const { status } = error\n    //      ^?      \n\n\n    return <div>A HTTP error occurred. Status: {status}</div>\n  }\n  if (error?.name === 'LimitExceededRpcError') {\n    const { code } = error\n    //      ^?\n\n    \n    return <div>Rate limit exceeded. Code: {code}</div>\n  }\n  // ...\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n"
  },
  {
    "path": "site/react/guides/ethers.md",
    "content": "# Ethers.js Adapters\n\nIt is recommended for projects to migrate to [Viem](https://viem.sh) when using Wagmi, but there are some cases where you might still need to use [Ethers.js](https://ethers.org) in your project:\n\n- You may want to **incrementally migrate** Ethers.js usage to Viem\n- Some **third-party libraries & SDKs** may only support Ethers.js\n- Personal preference\n\nWe have provided reference implementations for Viem → Ethers.js adapters that you can copy + paste in your project.\n\n## Client → Provider\n\n### Reference Implementation\n\nCopy the following reference implementation into a file of your choice:\n\n::: code-group\n\n```ts [Ethers v5]\nimport { providers } from 'ethers'\nimport { useMemo } from 'react'\nimport type { Chain, Client, Transport } from 'viem'\nimport { Config, useClient } from 'wagmi'\n\nexport function clientToProvider(client: Client<Transport, Chain>) {\n  const { chain, transport } = client\n  const network = {\n    chainId: chain.id,\n    name: chain.name,\n    ensAddress: chain.contracts?.ensRegistry?.address,\n  }\n  if (transport.type === 'fallback')\n    return new providers.FallbackProvider(\n      (transport.transports as ReturnType<Transport>[]).map(\n        ({ value }) => new providers.JsonRpcProvider(value?.url, network),\n      ),\n    )\n  return new providers.JsonRpcProvider(transport.url, network)\n}\n\n/** Hook to convert a viem Client to an ethers.js Provider. */\nexport function useEthersProvider({\n  chainId,\n}: { chainId?: number | undefined } = {}) {\n  const client = useClient<Config>({ chainId })\n  return useMemo(() => (client ? clientToProvider(client) : undefined), [client])\n}\n```\n\n```ts [Ethers v6]\nimport { FallbackProvider, JsonRpcProvider } from 'ethers'\nimport { useMemo } from 'react'\nimport type { Chain, Client, Transport } from 'viem'\nimport { type Config, useClient } from 'wagmi'\n\nexport function clientToProvider(client: Client<Transport, Chain>) {\n  const { chain, transport } = client\n  const network = {\n    chainId: chain.id,\n    name: chain.name,\n    ensAddress: chain.contracts?.ensRegistry?.address,\n  }\n  if (transport.type === 'fallback') {\n    const providers = (transport.transports as ReturnType<Transport>[]).map(\n      ({ value }) => new JsonRpcProvider(value?.url, network),\n    )\n    if (providers.length === 1) return providers[0]\n    return new FallbackProvider(providers)\n  }\n  return new JsonRpcProvider(transport.url, network)\n}\n\n/** Action to convert a viem Client to an ethers.js Provider. */\nexport function useEthersProvider({ chainId }: { chainId?: number } = {}) {\n  const client = useClient<Config>({ chainId })\n  return useMemo(() => (client ? clientToProvider(client) : undefined), [client])\n}\n```\n\n:::\n\n### Usage\n\nNow you can use the `useEthersProvider` function in your components:\n\n::: code-group\n\n```ts [example.ts]\nimport { useEthersProvider } from './ethers'\n\nfunction Example() {\n  const provider = useEthersProvider()\n  ...\n}\n```\n\n```ts [ethers.ts (Ethers v5)]\nimport { providers } from 'ethers'\nimport { useMemo } from 'react'\nimport type { Chain, Client, Transport } from 'viem'\nimport { Config, useClient } from 'wagmi'\n\nexport function clientToProvider(client: Client<Transport, Chain>) {\n  const { chain, transport } = client\n  const network = {\n    chainId: chain.id,\n    name: chain.name,\n    ensAddress: chain.contracts?.ensRegistry?.address,\n  }\n  if (transport.type === 'fallback')\n    return new providers.FallbackProvider(\n      (transport.transports as ReturnType<Transport>[]).map(\n        ({ value }) => new providers.JsonRpcProvider(value?.url, network),\n      ),\n    )\n  return new providers.JsonRpcProvider(transport.url, network)\n}\n\n/** Hook to convert a viem Client to an ethers.js Provider. */\nexport function useEthersProvider({\n  chainId,\n}: { chainId?: number | undefined } = {}) {\n  const client = useClient<Config>({ chainId })\n  return useMemo(() => (client ? clientToProvider(client) : undefined), [client])\n}\n```\n\n```ts [ethers.ts (Ethers v6)]\nimport { FallbackProvider, JsonRpcProvider } from 'ethers'\nimport { useMemo } from 'react'\nimport type { Chain, Client, Transport } from 'viem'\nimport { type Config, useClient } from 'wagmi'\n\nexport function clientToProvider(client: Client<Transport, Chain>) {\n  const { chain, transport } = client\n  const network = {\n    chainId: chain.id,\n    name: chain.name,\n    ensAddress: chain.contracts?.ensRegistry?.address,\n  }\n  if (transport.type === 'fallback') {\n    const providers = (transport.transports as ReturnType<Transport>[]).map(\n      ({ value }) => new JsonRpcProvider(value?.url, network),\n    )\n    if (providers.length === 1) return providers[0]\n    return new FallbackProvider(providers)\n  }\n  return new JsonRpcProvider(transport.url, network)\n}\n\n/** Action to convert a viem Client to an ethers.js Provider. */\nexport function useEthersProvider({ chainId }: { chainId?: number } = {}) {\n  const client = useClient<Config>({ chainId })\n  return useMemo(() => (client ? clientToProvider(client) : undefined), [client])\n}\n```\n\n:::\n\n## Connector Client → Signer\n\n### Reference Implementation\n\nCopy the following reference implementation into a file of your choice:\n\n::: code-group\n\n```ts [Ethers v5]\nimport { providers } from 'ethers'\nimport { useMemo } from 'react'\nimport type { Account, Chain, Client, Transport } from 'viem'\nimport { Config, useConnectorClient } from 'wagmi'\n\nexport function clientToSigner(client: Client<Transport, Chain, Account>) {\n  const { account, chain, transport } = client\n  const network = {\n    chainId: chain.id,\n    name: chain.name,\n    ensAddress: chain.contracts?.ensRegistry?.address,\n  }\n  const provider = new providers.Web3Provider(transport, network)\n  const signer = provider.getSigner(account.address)\n  return signer\n}\n\n/** Hook to convert a Viem Client to an ethers.js Signer. */\nexport function useEthersSigner({ chainId }: { chainId?: number } = {}) {\n  const { data: client } = useConnectorClient<Config>({ chainId })\n  return useMemo(() => (client ? clientToSigner(client) : undefined), [client])\n}\n```\n\n```ts [Ethers v6]\nimport { BrowserProvider, JsonRpcSigner } from 'ethers'\nimport { useMemo } from 'react'\nimport type { Account, Chain, Client, Transport } from 'viem'\nimport { type Config, useConnectorClient } from 'wagmi'\n\nexport function clientToSigner(client: Client<Transport, Chain, Account>) {\n  const { account, chain, transport } = client\n  const network = {\n    chainId: chain.id,\n    name: chain.name,\n    ensAddress: chain.contracts?.ensRegistry?.address,\n  }\n  const provider = new BrowserProvider(transport, network)\n  const signer = new JsonRpcSigner(provider, account.address)\n  return signer\n}\n\n/** Hook to convert a viem Wallet Client to an ethers.js Signer. */\nexport function useEthersSigner({ chainId }: { chainId?: number } = {}) {\n  const { data: client } = useConnectorClient<Config>({ chainId })\n  return useMemo(() => (client ? clientToSigner(client) : undefined), [client])\n}\n```\n\n:::\n\n### Usage\n\nNow you can use the `useEthersSigner` function in your components:\n\n::: code-group\n\n```ts [example.ts]\nimport { useEthersSigner } from './ethers'\n\nfunction example() {\n  const signer = useEthersSigner()\n  ...\n}\n```\n\n```ts [ethers.ts (Ethers v5)]\nimport { providers } from 'ethers'\nimport { useMemo } from 'react'\nimport type { Account, Chain, Client, Transport } from 'viem'\nimport { Config, useConnectorClient } from 'wagmi'\n\nexport function clientToSigner(client: Client<Transport, Chain, Account>) {\n  const { account, chain, transport } = client\n  const network = {\n    chainId: chain.id,\n    name: chain.name,\n    ensAddress: chain.contracts?.ensRegistry?.address,\n  }\n  const provider = new providers.Web3Provider(transport, network)\n  const signer = provider.getSigner(account.address)\n  return signer\n}\n\n/** Action to convert a Viem Client to an ethers.js Signer. */\nexport function useEthersSigner({ chainId }: { chainId?: number } = {}) {\n  const { data: client } = useConnectorClient<Config>({ chainId })\n  return useMemo(() => (client ? clientToSigner(client) : undefined), [client])\n}\n```\n\n```ts [ethers.ts (Ethers v6)]\nimport { BrowserProvider, JsonRpcSigner } from 'ethers'\nimport { useMemo } from 'react'\nimport type { Account, Chain, Client, Transport } from 'viem'\nimport { type Config, useConnectorClient } from 'wagmi'\n\nexport function clientToSigner(client: Client<Transport, Chain, Account>) {\n  const { account, chain, transport } = client\n  const network = {\n    chainId: chain.id,\n    name: chain.name,\n    ensAddress: chain.contracts?.ensRegistry?.address,\n  }\n  const provider = new BrowserProvider(transport, network)\n  const signer = new JsonRpcSigner(provider, account.address)\n  return signer\n}\n\n/** Hook to convert a viem Wallet Client to an ethers.js Signer. */\nexport function useEthersSigner({ chainId }: { chainId?: number } = {}) {\n  const { data: client } = useConnectorClient<Config>({ chainId })\n  return useMemo(() => (client ? clientToSigner(client) : undefined), [client])\n}\n```\n\n:::\n"
  },
  {
    "path": "site/react/guides/faq.md",
    "content": "<script setup>\nconst docsPath = 'react'\n</script>\n\n# FAQ / Troubleshooting\n\nCollection of frequently asked questions with ideas on how to troubleshoot and resolve them.\n\n<!--@include: @shared/faq.md-->\n\n## How does Wagmi work?\n\nUntil there's a more in-depth write-up about Wagmi internals, here is the gist:\n\n- Wagmi is essentially a wrapper around [Viem](https://viem.sh) and TanStack Query that adds connector and multichain support.\n- [Connectors](/react/api/connectors) allow Wagmi and Ethereum accounts to communicate with each other.\n- The Wagmi [`Config`](/react/api/createConfig#config) manages connections established between Wagmi and Connectors, as well as some global state. [Connections](/react/api/createConfig#connection) come with one or more addresses and a chain ID.\n  - If there are connections, the Wagmi `Config` listens for connection changes and updates the [`chainId`](/react/api/createConfig#chainid) based on the [\"current\" connection](/react/api/createConfig#current). (The Wagmi `Config` can have [many connections established](/react/api/createConfig#connections) at once, but only one connection can be the \"current\" connection. Usually this is the connection from the last connector that is connected, but can change based on event emitted from other connectors or through the [`useSwitchConnection`](/react/api/hooks/useSwitchConnection) hook and [`switchConnection`](/core/api/actions/switchConnection) action.)\n  - If there are no connections, the Wagmi `Config` defaults the global state `chainId` to the first chain it was created with or last established connection.\n  - The global `chainId` can be changed directly using the [`useSwitchChain`](/react/api/hooks/useSwitchChain) hook and [`switchChain`](/core/api/actions/switchChain) action. This works when there are no connections as well as for most connectors (not all connectors support chain switching).\n- Wagmi uses the global `chainId` (from the \"current\" connection or global state) to internally create Viem Client's, which are used by hooks and actions.\n- Hooks are constructed by TanStack Query options helpers, exported by the `'@wagmi/core/query'` entrypoint, and some additional code to wire up type parameters, hook into React Context, etc.\n- There are three types of hooks: query hooks, mutation hooks, and config hooks. Query hooks, like [`useCall`](/react/api/hooks/useCall), generally read blockchain state and mutation hooks, like [`useSendTransaction`](/react/api/hooks/useSendTransaction), usually change state through sending transactions via the \"current\" connection. Config hooks are for getting data from and managing the Wagmi `Config` instance, e.g. [`useChainId`](/react/api/hooks/useChainId) and `useSwitchConnection`. Query and mutation hooks usually have corresponding [Viem actions.](https://viem.sh)\n\n"
  },
  {
    "path": "site/react/guides/migrate-from-v1-to-v2.md",
    "content": "---\ntitle: Migrate from v1 to v2\ndescription: Guide for migrating from Wagmi v1 to v2.\n---\n\n<script setup>\nimport packageJson from '../../../packages/react/package.json'\n\nconst viemVersion = packageJson.peerDependencies.viem\n</script>\n\n# Migrate from v1 to v2\n\n## Overview\n\nWagmi v2 redesigns the core APIs to mesh better with [Viem](https://viem.sh) and [TanStack Query](https://tanstack.com/query/v5/docs/react). This major version transforms Wagmi into a light wrapper around these libraries, sprinkling in multichain support and account management. As such, there are some breaking changes and deprecations to be aware of outlined in this guide.\n\nTo get started, install the latest version of Wagmi and it's required peer dependencies.\n\n::: code-group\n```bash-vue [pnpm]\npnpm add wagmi viem@{{viemVersion}} @tanstack/react-query\n```\n\n```bash-vue [npm]\nnpm install wagmi viem@{{viemVersion}} @tanstack/react-query\n```\n\n```bash-vue [yarn]\nyarn add wagmi viem@{{viemVersion}} @tanstack/react-query\n```\n\n```bash-vue [bun]\nbun add wagmi viem@{{viemVersion}} @tanstack/react-query\n```\n:::\n\n::: info Wagmi v2 should be the last major version that will have this many actionable breaking changes. \nMoving forward after Wagmi v2, new functionality will be opt-in with old functionality being deprecated alongside the new features. This means upgrading to the latest major versions will not require immediate changes.\n:::\n\n::: info Not ready to migrate yet?\nThe Wagmi v1 docs are still available at [1.x.wagmi.sh/react](https://1.x.wagmi.sh/react).\n:::\n\n## Dependencies\n\n### Moved TanStack Query to peer dependencies\n\nWagmi uses [TanStack Query](https://tanstack.com/query/v5/docs/react) to manage async state, handling requests, caching, and more. With Wagmi v1, TanStack Query was an internal implementation detail. With Wagmi v2, TanStack Query is a peer dependency. A lot of Wagmi users also use TanStack Query in their apps so making it a peer dependency gives them more control and removes some custom Wagmi code internally.\n\nIf you don't normally use TanStack Query, all you need to do is set it up and mostly forget about it (we'll provide guidance around version updates).\n\n::: code-group\n```tsx [app.tsx]\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query' // [!code ++]\nimport { WagmiProvider } from 'wagmi'\nimport { config } from './config'\n\nconst queryClient = new QueryClient() // [!code ++]\n\nfunction App() {\n  return (\n    <WagmiProvider config={config}>\n      <QueryClientProvider client={queryClient}> // [!code ++]\n        {/** ... */}\n      </QueryClientProvider> // [!code ++]\n    </WagmiProvider>\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\nFor more information on setting up TanStack Query for Wagmi, follow the [Getting Started docs](/react/getting-started#setup-tanstack-query). If you want to set up persistence for your query cache (default behavior before Wagmi v2), check out the [TanStack Query docs](https://tanstack.com/query/v5/docs/react/plugins/persistQueryClient#usage-with-react).\n\n### Dropped CommonJS support\n\nWagmi v2 no longer publishes a separate `cjs` tag since very few people use this tag and ESM is the future. See [Sindre Sorhus' guide](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c) for more info about switching to ESM.\n\n## Hooks\n\n### Removed mutation setup arguments\n\nMutation hooks are hooks that change network or application state, sign data, or perform write operations through mutation functions. With Wagmi v1, you could pass arguments directly to these hooks instead of using them with their mutation functions. For example:\n\n```ts{3}\n// Wagmi v1\nconst { signMessage } = useSignMessage({\n  message: 'foo bar baz',\n})\n```\n\nWith Wagmi v2, you must pass arguments to the mutation function instead. This follows the same behavior as [TanStack Query](https://tanstack.com/query/v5/docs/react/guides/mutations) mutations and improves type-safety.\n\n```tsx\nimport { useSignMessage } from 'wagmi'\n\nconst { signMessage } = useSignMessage({ message: 'foo bar baz' }) // [!code --]\nconst { signMessage } = useSignMessage() // [!code ++]\n\n<button\n  onClick={() => signMessage()} // [!code --]\n  onClick={() => signMessage({ message: 'foo bar baz' })} // [!code ++]\n>\n  Sign message\n</button>\n```\n\n### Moved TanStack Query parameters to `query` property\n\nPreviously, you could pass TanStack Query parameters, like `enabled` and `staleTime`, directly to hooks. In Wagmi v2, TanStack Query parameters are now moved to the `query` property. This allows Wagmi to better support TanStack Query type inference, control for future breaking changes since [TanStack Query is now a peer dependency](#moved-tanstack-query-to-peer-dependencies), and expose Wagmi-related hook property at the top-level of editor features, like autocomplete.\n\n```tsx\nuseReadContract({\n  enabled: false, // [!code --]\n  staleTime: 1_000, // [!code --]\n  query: { // [!code ++]\n    enabled: false, // [!code ++]\n    staleTime: 1_000, // [!code ++]\n  }, // [!code ++]\n})\n```\n\n### Removed watch property\n\nThe `watch` property was removed from all hooks besides [`useBlock`](/react/api/hooks/useBlock) and [`useBlockNumber`](/react/api/hooks/useBlockNumber). This property allowed hooks to internally listen for block changes and automatically refresh their data. In Wagmi v2, you can compose `useBlock` or `useBlockNumber` along with [`React.useEffect`](https://react.dev/reference/react/useEffect) to achieve the same behavior. Two different approaches are outlined for `useBalance` below.\n\n::: code-group\n```ts [invalidateQueries]\nimport { useQueryClient } from '@tanstack/react-query' // [!code ++]\nimport { useEffect } from 'react' // [!code ++]\nimport { useBlockNumber, useBalance } from 'wagmi' // [!code ++]\n\nconst queryClient = useQueryClient() // [!code ++]\nconst { data: blockNumber } = useBlockNumber({ watch: true }) // [!code ++]\nconst { data: balance, queryKey } = useBalance({ // [!code ++]\n  address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n  watch: true, // [!code --]\n})\n\nuseEffect(() => { // [!code ++]\n  queryClient.invalidateQueries({ queryKey }) // [!code ++]\n}, [blockNumber, queryClient]) // [!code ++]\n```\n```ts [refetch]\nimport { useEffect } from 'react' // [!code ++]\nimport { useBlockNumber, useBalance } from 'wagmi' // [!code ++]\n\nconst { data: blockNumber } = useBlockNumber({ watch: true }) // [!code ++]\nconst { data: balance, refetch } = useBalance({\n  address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n  watch: true, // [!code --]\n})\n\nuseEffect(() => { // [!code ++]\n  refetch() // [!code ++]\n}, [blockNumber]) // [!code ++]\n```\n:::\n\nThis is a bit more code, but removes a lot of internal code from hooks that can slow down your app when not used and gives you more control. For example, you can easily refresh data every five blocks instead of every block.\n\n```ts\nconst { data: blockNumber } = useBlockNumber({ watch: true })\nconst { data: balance, queryKey } = useBalance({\n  address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n})\n\nuseEffect(() => {\n  if (blockNumber && blockNumber % 5n === 0n) // [!code focus]\n    queryClient.invalidateQueries({ queryKey }) // [!code focus]\n}, [blockNumber, queryClient])\n```\n\n### Removed suspense property\n\nWagmi used to support an experimental `suspense` property via TanStack Query. Since TanStack Query [removed `suspense`](https://tanstack.com/query/v5/docs/react/guides/migrating-to-v5#new-hooks-for-suspense) from its `useQuery` hook, it is no longer supported by Wagmi Hooks.\n\nInstead, you can use `useSuspenseQuery` along with TanStack Query-related exports from the `'wagmi/query'` entrypoint.\n\n```ts\nimport { useSuspenseQuery } from '@tanstack/react-query' // [!code ++]\nimport { useConfig } from 'wagmi' // [!code ++]\nimport { getBalanceQueryOptions } from 'wagmi/query' // [!code ++]\nimport { useBalance } from 'wagmi' // [!code --]\n\nconst config = useConfig() // [!code ++]\nconst options = getBalanceQueryOptions(config, { address: '0x…' }) // [!code ++]\nconst result = useSuspenseQuery(options) // [!code ++]\nconst result = useBalance({ // [!code --]\n  address: '0x…', // [!code --]\n  suspense: true, // [!code --]\n}) // [!code --]\n```\n\n### Removed prepare hooks\n\n`usePrepareContractWrite` and `usePrepareSendTransaction` were removed and replaced with idiomatic Viem alternatives. For `usePrepareContractWrite`, use [`useSimulateContract`](/react/api/hooks/useSimulateContract). Similar to `usePrepareContractWrite`, `useSimulateContract` composes well with `useWriteContract`\n\n```tsx\nimport { usePrepareContractWrite, useWriteContract } from 'wagmi' // [!code --]\nimport { useSimulateContract, useWriteContract } from 'wagmi' // [!code ++]\n\nconst { config } = usePrepareContractWrite({ // [!code --]\nconst { data } = useSimulateContract({ // [!code ++]\n  address: '0x',\n  abi: [{\n    type: 'function',\n    name: 'transferFrom',\n    stateMutability: 'nonpayable',\n    inputs: [\n      { name: 'sender', type: 'address' },\n      { name: 'recipient', type: 'address' },\n      { name: 'amount', type: 'uint256' },\n    ],\n    outputs: [{ type: 'bool' }],\n  }],\n  functionName: 'transferFrom',\n  args: ['0x', '0x', 123n],\n})\nconst { write } = useWriteContract(config) // [!code --]\nconst { writeContract } = useWriteContract() // [!code ++]\n\n<button\n  disabled={!Boolean(write)} // [!code --]\n  onClick={() => write()} // [!code --]\n  disabled={!Boolean(data?.request)} // [!code ++]\n  onClick={() => writeContract(data!.request)} // [!code ++]\n>\n  Write contract\n</button>\n```\n\nInstead of `usePrepareSendTransaction`, use [`useEstimateGas`](/react/api/hooks/useEstimateGas). You can pass `useEstimateGas` `data` to `useSendTransaction` to compose the two hooks.\n\n```tsx\nimport { usePrepareSendTransaction, useSendTransaction } from 'wagmi' // [!code --]\nimport { useEstimateGas, useSendTransaction } from 'wagmi' // [!code ++]\nimport { parseEther } from 'viem'\n\nconst { config } = usePrepareSendTransaction({ // [!code --]\nconst { data } = useEstimateGas({ // [!code ++]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\nconst { sendTransaction } = useSendTransaction(config) // [!code --]\nconst { sendTransaction } = useSendTransaction() // [!code ++]\n\n<button\n  disabled={!Boolean(sendTransaction)} // [!code --]\n  onClick={() => sendTransaction()} // [!code --]\n  disabled={!Boolean(data)} // [!code ++]\n  onClick={() => sendTransaction({ // [!code ++]\n    gas: data, // [!code ++]\n    to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code ++]\n    value: parseEther('0.01'), // [!code ++]\n  })} // [!code ++]\n>\n  Send transaction\n</button>\n```\n\nThis might seem like more work, but it gives you more control and is more accurate representation of what is happening under the hood.\n\n### Removed `useNetwork` hook\n\nThe `useNetwork` hook was removed since the connected chain is typically based on the connected account. Use [`useAccount`](/react/api/hooks/useConnection) to get the connected `chain`.\n\n```ts\nimport { useNetwork } from 'wagmi' // [!code --]\nimport { useAccount } from 'wagmi' // [!code ++]\n\nconst { chain } = useNetwork() // [!code --]\nconst { chain } = useAccount() // [!code ++]\n```\n\nUse `useConfig` for the list of `chains` set up with the Wagmi [`Config`](/react/api/createConfig#chains).\n\n```ts\nimport { useNetwork } from 'wagmi' // [!code --]\nimport { useConfig } from 'wagmi' // [!code ++]\n\nconst { chains } = useNetwork() // [!code --]\nconst { chains } = useConfig() // [!code ++]\n```\n\n### Removed `onConnect` and `onDisconnect` callbacks from `useAccount`\n\nThe `onConnect` and `onDisconnect` callbacks were removed from the `useAccount` hook since it is frequently used without these callbacks so it made sense to extract these into a new API, [`useAccountEffect`](/react/api/hooks/useConnectionEffect), rather than clutter the `useAccount` hook.\n\n```ts\nimport { useAccount } from 'wagmi' // [!code --]\nimport { useAccountEffect } from 'wagmi' // [!code ++]\n\nuseAccount({ // [!code --]\nuseAccountEffect({ // [!code ++]\n  onConnect(data) {\n    console.log('connected', data)\n  },\n  onDisconnect() {\n    console.log('disconnected')\n  },\n}) \n```\n\n### Removed `useWebSocketPublicClient`\n\nThe Wagmi [`Config`](/react/api/createConfig) does not separate transport types anymore. Simply use Viem's [`webSocket`](https://viem.sh/docs/clients/transports/websocket) transport instead when setting up your Wagmi `Config`. You can get Viem `Client` instance with this transport attached by using [`useClient`](/react/api/hooks/useClient) or [`usePublicClient`](/react/api/hooks/usePublicClient).\n\n### Removed `useInfiniteReadContracts` `paginatedIndexesConfig`\n\nIn the spirit of removing unnecessary abstractions, `paginatedIndexesConfig` was removed. Use `useInfiniteReadContracts`'s `initialPageParam` and `getNextPageParam` parameters along with `fetchNextPage`/`fetchPreviousPage` from the result instead or copy `paginatedIndexesConfig`'s implementation to your codebase.\n\nSee the [TanStack Query docs](https://tanstack.com/query/v5/docs/react/guides/infinite-queries) for more information on infinite queries.\n\n### Updated `useSendTransaction` and `useWriteContract` return type\n\nUpdated [`useSendTransaction`](/react/api/hooks/useSendTransaction) and [`useWriteContract`](/react/api/hooks/useWriteContract) return type from `` { hash: `0x${string}` } `` to `` `0x${string}` ``.\n\n```ts\nconst result = useSendTransaction()\nresult.data?.hash // [!code --]\nresult.data // [!code ++]\n```\n\n### Updated `useConnect` return type\n\nUpdated [`useConnect`](/react/api/hooks/useConnect) return type from `` { account: Address; chain: { id: number; unsupported?: boolean }; connector: Connector } `` to `` { accounts: readonly Address[]; chainId: number } ``. This better reflects the ability to have multiple accounts per connector.\n\n### Renamed parameters and return types\n\nAll hook parameters and return types follow the naming pattern of `[PascalCaseHookName]Parameters` and `[PascalCaseHookName]ReturnType`. For example, `UseAccountParameters` and `UseAccountReturnType`.\n\n```ts\nimport { UseAccountConfig, UseAccountResult } from 'wagmi' // [!code --]\nimport { UseAccountParameters, UseAccountReturnType } from 'wagmi' // [!code ++]\n```\n\n## Connectors\n\n### Updated connector API\n\nIn order to maximize type-safety and ease of creating connectors, the connector API changed. Follow the [Creating Connectors guide](/dev/creating-connectors) for more info on creating new connectors and converting Wagmi v1 connectors.\n\n### Removed individual entrypoints\n\nPreviously, each connector had it's own entrypoint to optimize tree-shaking. Since all connectors now have [`package.json#sideEffects`](https://webpack.js.org/guides/tree-shaking/#mark-the-file-as-side-effect-free) enabled, this is no longer necessary and the entrypoint is unified. Use the `'wagmi/connectors'` entrypoint instead.\n\n```ts\nimport { InjectedConnector } from 'wagmi/connectors/injected' // [!code --]\nimport { CoinbaseWalletConnector } from 'wagmi/connectors/coinbaseWallet' // [!code --]\nimport { coinbaseWallet, injected } from 'wagmi/connectors' // [!code ++]\n```\n\n### Removed `MetaMaskConnector`\n\nThe `MetaMaskConnector` was removed since it was nearly the same thing as the `InjectedConnector`. Use the [`injected`](/react/api/connectors/injected) connector instead, along with the [`target`](/react/api/connectors/injected#target) parameter set to `'metaMask'`, for the same behavior.\n\n```ts\nimport { MetaMaskConnector } from 'wagmi/connectors/metaMask' // [!code --]\nimport { injected } from 'wagmi/connectors' // [!code ++]\n\nconst connector = new MetaMaskConnector() // [!code --]\nconst connector = injected({ target: 'metaMask' }) // [!code ++]\n```\n### Renamed connectors\n\nIn Wagmi v1, connectors were classes you needed to instantiate. In Wagmi v2, connectors are functions. As a result, the API has changed. Connectors have the following new names:\n\n- `CoinbaseWalletConnector` is now [`coinbaseWallet`](/react/api/connectors/coinbaseWallet).\n- `InjectedConnector` is now [`injected`](/react/api/connectors/injected).\n- `SafeConnector` is now [`safe`](/react/api/connectors/safe).\n- `WalletConnectConnector` is now [`walletConnect`](/react/api/connectors/walletConnect).\n\nTo create a connector, you now call the connector function with parameters.\n\n```ts\nimport { WalletConnectConnector } from 'wagmi/connectors/walletConnect' // [!code --]\nimport { walletConnect } from 'wagmi/connectors' // [!code ++]\n\nconst connector = new WalletConnectConnector({ // [!code --]\nconst connector = walletConnect({ // [!code ++]\n  projectId: '3fcc6bba6f1de962d911bb5b5c3dba68',\n})\n```\n\n### Removed `WalletConnectLegacyConnector`\n\nWalletConnect v1 was sunset June 28, 2023. Use the [`walletConnect`](/react/api/connectors/walletConnect) connector instead.\n\n```ts\nimport { WalletConnectLegacyConnector } from 'wagmi/connectors/walletConnectLegacy' // [!code --]\nimport { walletConnect } from 'wagmi/connectors' // [!code ++]\n\nconst connector = new WalletConnectLegacyConnector({ // [!code --]\nconst connector = walletConnect({ // [!code ++]\n  projectId: '3fcc6bba6f1de962d911bb5b5c3dba68',\n})\n```\n\n## Chains\n\n### Updated `'wagmi/chains'` entrypoint\n\nChains now live in the [Viem repository](https://github.com/wevm/viem). As a result, the `'wagmi/chains'` entrypoint now proxies all chains from `'viem/chains'` directly.\n\n### Removed `mainnet` and `sepolia` from main entrypoint\n\nSince the `'wagmi/chains'` entrypoint now proxies `'viem/chains'`, `mainnet` and `sepolia` were removed from the main entrypoint. Use the `'wagmi/chains'` entrypoint instead.\n\n```ts\nimport { mainnet, sepolia } from 'wagmi' // [!code --]\nimport { mainnet, sepolia } from 'wagmi/chains' // [!code ++]\n```\n\n## Errors\n\nA number of errors were renamed to better reflect their functionality or replaced by Viem errors.\n\n## Miscellaneous\n\n### Removed internal ENS name normalization\n\nBefore v2, Wagmi handled ENS name normalization internally for `useEnsAddress`, `useEnsAvatar`, and `useEnsResolver`, 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 hooks. You can use Viem's `normalize` function or any other function that performs [UTS-46 normalization](https://unicode.org/reports/tr46).\n\n```ts\nimport { useEnsAddress } from 'wagmi'\nimport { normalize } from 'viem/ens' // [!code ++]\n\nconst result = useEnsAddress({\n  name: 'wevm.eth', // [!code --]\n  name: normalize('wevm.eth'), // [!code ++]\n})\n```\n\nBy inverting control, Wagmi let's you choose how much normalization to do. For example, maybe your project only allows ENS names that are numeric so no normalization is not needed. Check out the [ENS documentation](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) for more information on normalizing names.\n\n### Removed `configureChains`\n\nThe Wagmi v2 `Config` now has native multichain support using the [`chains`](/react/api/createConfig) parameter so the `configureChains` function is no longer required.\n\n```ts\nimport { configureChains, createConfig } from 'wagmi' // [!code --]\nimport { http, createConfig } from 'wagmi' // [!code ++]\nimport { mainnet, sepolia } from 'wagmi/chains'\n\nconst { chains, publicClient } = configureChains( // [!code --]\n  [mainnet, sepolia], // [!code --]\n  [publicProvider(), publicProvider()], // [!code --]\n) // [!code --]\n\nexport const config = createConfig({\n  publicClient, // [!code --]\n  chains: [mainnet, sepolia], // [!code ++]\n  transports: { // [!code ++]\n    [mainnet.id]: http(), // [!code ++]\n    [sepolia.id]: http(), // [!code ++]\n  }, // [!code ++]\n})\n```\n\n### Removed ABI exports\n\nImport from Viem instead.\n\n```ts\nimport { erc20ABI } from 'wagmi' // [!code --]\nimport { erc20Abi } from 'viem' // [!code ++]\n```\n\n### Removed `'wagmi/providers/*` entrypoints\n\nIt 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.\n\n```ts\nimport { alchemyProvider } from 'wagmi/providers/alchemy' // [!code --]\nimport { http } from 'viem' // [!code ++]\n\nconst transport = http('https://mainnet.example.com')\n```\n\n### Updated `createConfig` parameters\n\n- Removed `autoConnect`. The reconnecting behavior is now managed by React and not related to the Wagmi `Config`. Use `WagmiProvider` [`reconnectOnMount`](/react/api/WagmiProvider#reconnectonmount) or [`useReconnect`](/react/api/hooks/useReconnect) hook instead.\n- Removed `publicClient` and `webSocketPublicClient`. Use [`transports`](/react/api/createConfig#transports) or [`client`](/react/api/createConfig#client) instead.\n- Removed `logger`. Wagmi no longer logs debug information to console.\n\n### Updated `Config` object\n\n- Removed `config.connector`. Use `config.state.connections.get(config.state.current)?.connector` instead.\n- Removed `config.data`. Use `config.state.connections.get(config.state.current)` instead.\n- Removed `config.error`. Was unused and not needed.\n- Removed `config.lastUsedChainId`. Use `config.state.connections.get(config.state.current)?.chainId` instead.\n- Removed `config.publicClient`. Use [`config.getClient()`](/react/api/createConfig#getclient) or [`getPublicClient`](/core/api/actions/getPublicClient) instead.\n- Removed `config.status`. Use [`config.state.status`](/react/api/createConfig#status) instead.\n- Removed `config.webSocketClient`. Use [`config.getClient()`](/react/api/createConfig#getclient) or [`getPublicClient`](/core/api/actions/getPublicClient) instead.\n- Removed `config.clearState`. Was unused and not needed.\n- Removed `config.autoConnect()`. Use [`reconnect`](/core/api/actions/reconnect) action instead.\n- Renamed `config.setConnectors`. Use `config._internal.setConnectors` instead.\n- Removed `config.setLastUsedConnector`. Use `config.storage?.setItem('recentConnectorId', connectorId)` instead.\n- Removed `getConfig`. `config` should be passed explicitly to actions instead of using global `config`.\n\n## Deprecations\n\n### Renamed `WagmiConfig`\n\n`WagmiConfig` was renamed to [`WagmiProvider`](/react/api/WagmiProvider) to reduce confusion with the Wagmi [`Config`](/react/api/createConfig) type. React Context Providers usually follow the naming schema `*Provider` so this is a more idiomatic name. Now that Wagmi no longer uses Ethers.js (since Wagmi v1), the term \"Provider\" is less overloaded.\n\n::: code-group\n```tsx [app.tsx]\nimport { WagmiConfig } from 'wagmi' // [!code --]\nimport { WagmiProvider } from 'wagmi' // [!code ++]\nimport { config } from './config'\n\nfunction App() {\n  return (\n    <WagmiConfig config={config}> // [!code --]\n    <WagmiProvider config={config}> // [!code ++]\n      {/** ... */}\n    </WagmiProvider> // [!code ++]\n    </WagmiConfig> // [!code --]\n  )\n}\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### Deprecated `useBalance` `token` parameter\n\nMoving forward, `useBalance` will only work for native currencies, thus the `token` parameter is no longer supported. Use [`useReadContracts`](/react/api/hooks/useReadContracts) instead.\n\n```ts\nimport { useBalance } from 'wagmi' // [!code --]\nimport { useReadContracts } from 'wagmi' // [!code ++]\nimport { erc20Abi } from 'viem' // [!code ++]\n\nconst result = useBalance({ // [!code --]\n  address: '0x4557B18E779944BFE9d78A672452331C186a9f48', // [!code --]\n  token: '0x6B175474E89094C44Da98b954EedeAC495271d0F', // [!code --]\n}) // [!code --]\nconst result = useReadContracts({ // [!code ++]\n  allowFailure: false, // [!code ++]\n  contracts: [ // [!code ++]\n    { // [!code ++]\n      address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', // [!code ++]\n      abi: erc20Abi, // [!code ++]\n      functionName: 'balanceOf', // [!code ++]\n      args: ['0x4557B18E779944BFE9d78A672452331C186a9f48'], // [!code ++]\n    }, // [!code ++]\n    { // [!code ++]\n      address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', // [!code ++]\n      abi: erc20Abi, // [!code ++]\n      functionName: 'decimals', // [!code ++]\n    }, // [!code ++]\n    { // [!code ++]\n      address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', // [!code ++]\n      abi: erc20Abi, // [!code ++]\n      functionName: 'symbol', // [!code ++]\n    }, // [!code ++]\n  ] // [!code ++]\n}) // [!code ++]\n```\n\n### Deprecated `useBalance` `unit` parameter and `formatted` return value\n\nMoving forward, `useBalance` will not accept the `unit` parameter or return a `formatted` value. Instead you can call `formatUnits` from Viem directly or use another number formatting library, like [dnum](https://github.com/bpierre/dnum) instead.\n\n```ts\nimport { formatUnits } from 'viem' // [!code ++]\nimport { useBalance } from 'wagmi'\n\nconst result = useBalance({\n  address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n  unit: 'ether', // [!code --]\n})\nresult.data!.formatted // [!code --]\nformatUnits(result.data!.value, result.data!.decimals) // [!code ++]\n```\n\n### Deprecated `useToken`\n\nMoving forward, `useToken` is no longer supported. Use [`useReadContracts`](/react/api/hooks/useReadContracts) instead.\n\n```ts\nimport { useToken } from 'wagmi' // [!code --]\nimport { useReadContracts } from 'wagmi' // [!code ++]\nimport { erc20Abi } from 'viem' // [!code ++]\n\nconst result = useToken({ // [!code --]\n  address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', // [!code --]\n}) // [!code --]\nconst result = useReadContracts({ // [!code ++]\n  allowFailure: false, // [!code ++]\n  contracts: [ // [!code ++]\n    { // [!code ++]\n      address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', // [!code ++]\n      abi: erc20Abi, // [!code ++]\n      functionName: 'decimals', // [!code ++]\n    }, // [!code ++]\n    { // [!code ++]\n      address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', // [!code ++]\n      abi: erc20Abi, // [!code ++]\n      functionName: 'name', // [!code ++]\n    }, // [!code ++]\n    { // [!code ++]\n      address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', // [!code ++]\n      abi: erc20Abi, // [!code ++]\n      functionName: 'symbol', // [!code ++]\n    }, // [!code ++]\n    { // [!code ++]\n      address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', // [!code ++]\n      abi: erc20Abi, // [!code ++]\n      functionName: 'totalSupply', // [!code ++]\n    }, // [!code ++]\n  ] // [!code ++]\n}) // [!code ++]\n```\n\n### Deprecated `formatUnits` parameters and return values\n\nThe `formatUnits` parameter and related return values (e.g. `result.formatted`) are deprecated for the following hooks:\n\n- [`useEstimateFeesPerGas`](/react/api/hooks/useEstimateFeesPerGas)\n- `useToken`\n\nInstead you can call `formatUnits` from Viem directly or use another number formatting library, like [dnum](https://github.com/bpierre/dnum) instead.\n\n```ts\nimport { formatUnits } from 'viem' // [!code ++]\n\nconst result = useToken({\n  address: '0x6B175474E89094C44Da98b954EedeAC495271d0F',\n  formatUnits: 'ether',\n})\nresult.data!.totalSupply.formatted  // [!code --]\nformatUnits(result.data!.totalSupply.value, 18)  // [!code ++]\n```\n\nThis allows us to invert control to users so they can handle number formatting however they want, taking into account precision, localization, and more.\n\n### Renamed hooks\n\nThe following hooks were renamed to better reflect their functionality and underlying [Viem](https://viem.sh) actions:\n\n- `useContractRead` is now [`useReadContract`](/react/api/hooks/useReadContract)\n- `useContractReads` is now [`useReadContracts`](/react/api/hooks/useReadContracts)\n- `useContractWrite` is now [`useWriteContract`](/react/api/hooks/useWriteContract)\n- `useContractEvent` is now [`useWatchContractEvent`](/react/api/hooks/useWatchContractEvent)\n- `useContractInfiniteReads` is now [`useInfiniteReadContracts`](/react/api/hooks/useInfiniteReadContracts)\n- `useFeeData` is now [`useEstimateFeesPerGas`](/react/api/hooks/useEstimateFeesPerGas)\n- `useSwitchNetwork` is now [`useSwitchChain`](/react/api/hooks/useSwitchChain)\n- `useWaitForTransaction` is now [`useWaitForTransactionReceipt`](/react/api/hooks/useWaitForTransactionReceipt)\n\n### Miscellaneous\n\n- `WagmiConfigProps` renamed to [`WagmiProviderProps`](/react/api/WagmiProvider#parameters).\n- `Context` renamed to [`WagmiContext`](/react/api/WagmiProvider#context)."
  },
  {
    "path": "site/react/guides/migrate-from-v2-to-v3.md",
    "content": "---\ntitle: Migrate from v2 to v3\ndescription: Guide for migrating from Wagmi v2 to v3.\n---\n\n<script setup>\nimport PackageMetadata from '../../components/PackageMetadata.vue'\nimport packageJson from '../../../packages/connectors/package.json'\nconst docsPath = 'react'\n</script>\n\n# Migrate from v2 to v3\n\n## Overview\n\nWagmi 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.\n\nThis 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\n\nTo get started, install the latest version of Wagmi.\n\n::: code-group\n```bash [pnpm]\npnpm add wagmi@3\n```\n\n```bash [npm]\nnpm install wagmi@3\n```\n\n```bash [yarn]\nyarn add wagmi@3\n```\n\n```bash [bun]\nbun add wagmi@3\n```\n:::\n\n::: info Not ready to migrate yet?\nThe Wagmi v2 docs are still available at [2.x.wagmi.sh/react](https://2.x.wagmi.sh/react).\n:::\n\n<!-- @include: @shared/migrate-from-v2-to-v3.md -->\n\n## Deprecations\n\n### Renamed Account Hooks\n\nAt the core of Wagmi are connections between apps and Ethereum providers (e.g. EIP-1193), `useAccount`, `useAccountEffect`, and `useSwitchAccount` are renamed to `useConnection`, `useConnectionEffect`, and `useSwitchConnection` to more accurately represent to how Wagmi works.\n\n```ts\nimport {\n  useAccount, // [!code --]\n  useConnection, // [!code ++]\n  useAccountEffect, // [!code --]\n  useConnectionEffect, // [!code ++]\n  useSwitchAccount, // [!code --]\n  useSwitchConnection, // [!code ++]\n} from 'wagmi'\n```\n\n### Renamed mutateFn\n\nRenamed custom mutate function names to `mutate`/`mutateAsync` to reduce destructure key renaming fatigue and align with TanStack Query terminology.\n\n##### Before\n\nHad to destructure hook result and often rename keys when using multiple of the same hook. Could decide not to destructure, but syntax becomes awkward for mutate functions (e.g. `connect.connect` or `connect.connectAsync`).\n\n```ts\nconst { connect, isPending: connectIsPending } = useConnect()\nconst { writeContract: transfer, error: transferError, isPending: transferIsPending } = useWriteContract()\nconst { writeContract: approve, error: approveError } = useWriteContract()\n```\n\n##### After\n\nAllows you to name the hook result whatever you want and not worry about also renaming properties.\n\n```ts\nconst connect = useConnect() // connect.mutate, connect.isPending\nconst transfer = useWriteContract() // transfer.mutate, transfer.error, transfer.isPending\nconst approve = useWriteContract() // approve.mutate, approve.error\n```\n\n### Removed `useConnect().connectors` & `useReconnect().connectors`\n\nMoving forward, `useConnect().connectors` and `useReconnect().connectors` are no longer supported. Use [`useConnectors`](/react/api/hooks/useConnectors) instead.\n\n```ts\nimport { useConnect, useReconnect } from 'wagmi' // [!code --]\nimport { useConnectors } from 'wagmi' // [!code ++]\n\nconst { connectors } = useConnect() // [!code --]\nconst { connectors } = useReconnect() // [!code --]\nconst connectors = useConnectors() // [!code ++]\n```\n\n### Removed `useDisconnect().connectors` & `useSwitchConnection().connectors`\n\nMoving forward, `useDisconnect().connectors` and `useSwitchConnection().connectors` are no longer supported. Use [`useConnections`](/react/api/hooks/useConnections) instead.\n\n```ts\nimport { useDisconnect, useSwitchConnection } from 'wagmi' // [!code --]\nimport { useConnections } from 'wagmi' // [!code ++]\n\nconst { connectors } = useDisconnect() // [!code --]\nconst { connectors } = useSwitchConnection() // [!code --]\nconst connections = useConnections() // [!code ++]\nconst connectors = connections.map((connection) => connection.connector) // [!code ++]\n```\n\n### Removed `useSwitchChain().chains`\n\nMoving forward, `useSwitchChain().chains` is no longer supported. Use [`useChains`](/react/api/hooks/useChains) instead.\n\n```ts\nimport { useSwitchChain } from 'wagmi' // [!code --]\nimport { useChains } from 'wagmi' // [!code ++]\n\nconst { chains } = useSwitchChain() // [!code --]\nconst chains = useChains() // [!code ++]\n```\n\n"
  },
  {
    "path": "site/react/guides/read-from-contract.md",
    "content": "# Read from Contract\n\nThe [`useReadContract` Hook](/react/api/hooks/useReadContract) allows you to read data on a smart contract, from a `view` or `pure` (read-only) function. They can only read the state of the contract, and cannot make any changes to it. Since read-only methods do not change the state of the contract, they do not require any gas to be executed, and can be called by any user without the need to pay for gas.\n\nThe component below shows how to retrieve the token balance of an address from the [Wagmi Example](https://etherscan.io/token/0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2) contract\n\n:::code-group\n```tsx [read-contract.tsx]\nimport { useReadContract } from 'wagmi'\nimport { wagmiContractConfig } from './contracts'\n\nfunction ReadContract() {\n  const { data: balance } = useReadContract({\n    ...wagmiContractConfig,\n    functionName: 'balanceOf',\n    args: ['0x03A71968491d55603FFe1b11A9e23eF013f75bCF'],\n  })\n\n  return (\n    <div>Balance: {balance?.toString()}</div>\n  )\n}\n```\n```ts [contracts.ts]\nexport const wagmiContractConfig = {\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  abi: [\n    {\n      type: 'function',\n      name: 'balanceOf',\n      stateMutability: 'view',\n      inputs: [{ name: 'account', type: 'address' }],\n      outputs: [{ type: 'uint256' }],\n    },\n    {\n      type: 'function',\n      name: 'totalSupply',\n      stateMutability: 'view',\n      inputs: [],\n      outputs: [{ name: 'supply', type: 'uint256' }],\n    },\n  ],\n} as const\n```\n:::\n\nIf `useReadContract` depends on another value (`address` in the example below), you can use the [`query.enabled`](/react/api/hooks/useReadContract#enabled) option to prevent the query from running until the dependency is ready.\n\n```tsx\nconst { data: balance } = useReadContract({\n  ...wagmiContractConfig,\n  functionName: 'balanceOf',\n  args: [address],\n  query: { // [!code focus]\n    enabled: !!address, // [!code focus]\n  }, // [!code focus]\n})\n```\n\n## Loading & Error States\n\nThe [`useReadContract` Hook](/react/api/hooks/useReadContract) also returns loading & error states, which can be used to display a loading indicator while the data is being fetched, or an error message if contract execution reverts.\n\n:::code-group\n\n```tsx [read-contract.tsx]\nimport { type BaseError, useReadContract } from 'wagmi'\n\nfunction ReadContract() {\n  const { \n    data: balance,\n    error, // [!code ++]\n    isPending // [!code ++]\n  } = useReadContract({\n    ...wagmiContractConfig,\n    functionName: 'balanceOf',\n    args: ['0x03A71968491d55603FFe1b11A9e23eF013f75bCF'],\n  })\n\n  if (isPending) return <div>Loading...</div> // [!code ++]\n\n  if (error) // [!code ++]\n    return ( // [!code ++]\n      <div> // [!code ++]\n        Error: {(error as BaseError).shortMessage || error.message} // [!code ++]\n      </div> // [!code ++]\n    )  // [!code ++]\n\n  return (\n    <div>Balance: {balance?.toString()}</div>\n  )\n}\n```\n\n## Refetching On Blocks\n\nThe [`useBlockNumber` Hook](/react/api/hooks/useBlockNumber) can be utilized to refetch or [invalidate](https://tanstack.com/query/latest/docs/framework/react/guides/query-invalidation) the contract data on a specific block interval.\n\n:::code-group\n```tsx [read-contract.tsx (refetch)]\nimport { useEffect } from 'react'\nimport { useBlockNumber, useReadContract } from 'wagmi'\n\nfunction ReadContract() {\n  const { data: balance, refetch } = useReadContract({\n    ...wagmiContractConfig,\n    functionName: 'balanceOf',\n    args: ['0x03A71968491d55603FFe1b11A9e23eF013f75bCF'],\n  })\n  const { data: blockNumber } = useBlockNumber({ watch: true })\n\n  useEffect(() => {\n    // want to refetch every `n` block instead? use the modulo operator!\n    // if (blockNumber % 5 === 0) refetch() // refetch every 5 blocks\n    refetch()\n  }, [blockNumber])\n\n  return (\n    <div>Balance: {balance?.toString()}</div>\n  )\n}\n```\n```tsx [read-contract.tsx (invalidate)]\nimport { useQueryClient } from '@tanstack/react-query'\nimport { useEffect } from 'react'\nimport { useBlockNumber, useReadContract } from 'wagmi'\n\nfunction ReadContract() {\n  const queryClient = useQueryClient()\n  const { data: balance, refetch } = useReadContract({\n    ...wagmiContractConfig,\n    functionName: 'balanceOf',\n    args: ['0x03A71968491d55603FFe1b11A9e23eF013f75bCF'],\n  })\n  const { data: blockNumber } = useBlockNumber({ watch: true })\n\n  useEffect(() => {\n    // if `useReadContract` is in a different hook/component,\n    // you can import `readContractQueryKey` from `'wagmi/query'` and\n    // construct a one-off query key to use for invalidation\n    queryClient.invalidateQueries({ queryKey })\n  }, [blockNumber, queryClient])\n\n  return (\n    <div>Balance: {balance?.toString()}</div>\n  )\n}\n```\n:::\n\n## Calling Multiple Functions\n\nWe can use the [`useReadContract` Hook](/react/api/hooks/useReadContract) multiple times in a single component to call multiple functions on the same contract, but this ends up being hard to manage as the number of functions increases, especially when we also want to deal with loading & error states. \n\nLuckily, to make this easier, we can use the [`useReadContracts` Hook](/react/api/hooks/useReadContracts) to call multiple functions in a single call.\n\n:::code-group\n\n```tsx [read-contract.tsx]\nimport { type BaseError, useReadContracts } from 'wagmi'\n\nfunction ReadContract() {\n  const { \n    data,\n    error,\n    isPending\n  } = useReadContracts({ \n    contracts: [{ \n      ...wagmiContractConfig,\n      functionName: 'balanceOf',\n      args: ['0x03A71968491d55603FFe1b11A9e23eF013f75bCF'],\n    }, { \n      ...wagmiContractConfig, \n      functionName: 'ownerOf', \n      args: [69n], \n    }, { \n      ...wagmiContractConfig, \n      functionName: 'totalSupply', \n    }] \n  }) \n  const [balance, ownerOf, totalSupply] = data || [] \n\n  if (isPending) return <div>Loading...</div>\n\n  if (error)\n    return (\n      <div>\n        Error: {(error as BaseError).shortMessage || error.message}\n      </div>\n    ) \n\n  return (\n    <>\n      <div>Balance: {balance?.toString()}</div>\n      <div>Owner of Token 69: {ownerOf?.toString()}</div> \n      <div>Total Supply: {totalSupply?.toString()}</div> \n    </>\n  )\n}\n```\n\n:::\n"
  },
  {
    "path": "site/react/guides/send-transaction.md",
    "content": "# Send Transaction\n\nThe following guide teaches you how to send transactions in Wagmi. The example below builds on the [Connect Wallet guide](/react/guides/connect-wallet) and uses the [useSendTransaction](/react/api/hooks/useSendTransaction) & [useWaitForTransactionReceipt](/react/api/hooks/useWaitForTransactionReceipt) hooks. \n\n## Example\n\nFeel free to check out the example before moving on:\n\n<iframe frameborder=\"0\" width=\"100%\" height=\"500px\" src=\"https://stackblitz.com/edit/vitejs-vite-zkzqj7?embed=1&file=src%2FApp.tsx&hideExplorer=1&view=preview\"></iframe>\n\n## Steps\n\n### 1. Connect Wallet\n\nFollow the [Connect Wallet guide](/react/guides/connect-wallet) guide to get this set up.\n\n### 2. Create a new component\n\nCreate your `SendTransaction` component that will contain the send transaction logic.\n\n::: code-group\n\n```tsx [send-transaction.tsx]\nimport * as React from 'react'\n \nexport function SendTransaction() {\n  return (\n    <form>\n      <input name=\"address\" placeholder=\"0xA0Cf…251e\" required />\n      <input name=\"value\" placeholder=\"0.05\" required />\n      <button type=\"submit\">Send</button>\n    </form>\n  )\n}\n```\n\n:::\n\n### 3. Add a form handler\n\nNext, we will need to add a handler to the form that will send the transaction when the user hits \"Send\". This will be a basic handler in this step.\n\n::: code-group\n\n```tsx [send-transaction.tsx]\nimport * as React from 'react'\n \nexport function SendTransaction() {\n  async function submit(e: React.FormEvent<HTMLFormElement>) { // [!code ++]\n    e.preventDefault() // [!code ++]\n    const formData = new FormData(e.target as HTMLFormElement) // [!code ++]\n    const to = formData.get('address') as `0x${string}` // [!code ++]\n    const value = formData.get('value') as string // [!code ++]\n  } // [!code ++]\n\n  return (\n    <form> // [!code --]\n    <form onSubmit={submit}> // [!code ++]\n      <input name=\"address\" placeholder=\"0xA0Cf…251e\" required />\n      <input name=\"value\" placeholder=\"0.05\" required />\n      <button type=\"submit\">Send</button>\n    </form>\n  )\n}\n```\n\n:::\n\n### 4. Hook up the `useSendTransaction` Hook\n\nNow that we have the form handler, we can hook up the [`useSendTransaction` Hook](/react/api/hooks/useSendTransaction) to send the transaction.\n\n::: code-group\n\n```tsx [send-transaction.tsx]\nimport * as React from 'react'\nimport { useSendTransaction } from 'wagmi' // [!code ++]\nimport { parseEther } from 'viem' // [!code ++]\n \nexport function SendTransaction() {\n  const { data: hash, sendTransaction } = useSendTransaction() // [!code ++]\n\n  async function submit(e: React.FormEvent<HTMLFormElement>) { \n    e.preventDefault() \n    const formData = new FormData(e.target as HTMLFormElement) \n    const to = formData.get('address') as `0x${string}` \n    const value = formData.get('value') as string \n    sendTransaction({ to, value: parseEther(value) }) // [!code ++]\n  } \n\n  return (\n    <form onSubmit={submit}>\n      <input name=\"address\" placeholder=\"0xA0Cf…251e\" required />\n      <input name=\"value\" placeholder=\"0.05\" required />\n      <button type=\"submit\">Send</button>\n      {hash && <div>Transaction Hash: {hash}</div>} // [!code ++]\n    </form>\n  )\n}\n```\n\n:::\n\n### 5. Add loading state (optional)\n\nWe can optionally add a loading state to the \"Send\" button while we are waiting confirmation from the user's wallet.\n\n::: code-group\n\n```tsx [send-transaction.tsx]\nimport * as React from 'react'\nimport { useSendTransaction } from 'wagmi' \nimport { parseEther } from 'viem' \n \nexport function SendTransaction() {\n  const { \n    data: hash, \n    isPending, // [!code ++]\n    sendTransaction \n  } = useSendTransaction() \n\n  async function submit(e: React.FormEvent<HTMLFormElement>) { \n    e.preventDefault() \n    const formData = new FormData(e.target as HTMLFormElement) \n    const to = formData.get('address') as `0x${string}` \n    const value = formData.get('value') as string \n    sendTransaction({ to, value: parseEther(value) }) \n  } \n\n  return (\n    <form onSubmit={submit}>\n      <input name=\"address\" placeholder=\"0xA0Cf…251e\" required />\n      <input name=\"value\" placeholder=\"0.05\" required />\n      <button \n        disabled={isPending} // [!code ++]\n        type=\"submit\"\n      >\n        Send // [!code --]\n        {isPending ? 'Confirming...' : 'Send'} // [!code ++]\n      </button>\n      {hash && <div>Transaction Hash: {hash}</div>} \n    </form>\n  )\n}\n```\n\n:::\n\n### 6. Wait for transaction receipt (optional)\n\nWe can also display the transaction confirmation status to the user by using the [`useWaitForTransactionReceipt` Hook](/react/api/hooks/useWaitForTransactionReceipt). \n\n::: code-group\n\n```tsx [send-transaction.tsx]\nimport * as React from 'react'\nimport { \n  useSendTransaction, \n  useWaitForTransactionReceipt // [!code ++]\n} from 'wagmi' \nimport { parseEther } from 'viem' \n \nexport function SendTransaction() {\n  const { \n    data: hash, \n    isPending, \n    sendTransaction \n  } = useSendTransaction() \n\n  async function submit(e: React.FormEvent<HTMLFormElement>) { \n    e.preventDefault() \n    const formData = new FormData(e.target as HTMLFormElement) \n    const to = formData.get('address') as `0x${string}` \n    const value = formData.get('value') as string \n    sendTransaction({ to, value: parseEther(value) }) \n  } \n\n  const { isLoading: isConfirming, isSuccess: isConfirmed } = // [!code ++]\n    useWaitForTransactionReceipt({ // [!code ++]\n      hash, // [!code ++]\n    }) // [!code ++]\n\n  return (\n    <form onSubmit={submit}>\n      <input name=\"address\" placeholder=\"0xA0Cf…251e\" required />\n      <input name=\"value\" placeholder=\"0.05\" required />\n      <button \n        disabled={isPending} \n        type=\"submit\"\n      >\n        {isPending ? 'Confirming...' : 'Send'} \n      </button>\n      {hash && <div>Transaction Hash: {hash}</div>} \n      {isConfirming && <div>Waiting for confirmation...</div>} // [!code ++]\n      {isConfirmed && <div>Transaction confirmed.</div>} // [!code ++]\n    </form>\n  )\n}\n```\n\n:::\n\n### 7. Handle errors (optional)\n\nIf the user rejects the transaction, or the user does not have enough funds to cover the transaction, we can display an error message to the user.\n\n::: code-group\n\n```tsx [send-transaction.tsx]\nimport * as React from 'react'\nimport { \n  type BaseError, // [!code ++]\n  useSendTransaction, \n  useWaitForTransactionReceipt \n} from 'wagmi' \nimport { parseEther } from 'viem' \n \nexport function SendTransaction() {\n  const { \n    data: hash,\n    error, // [!code ++] \n    isPending, \n    sendTransaction \n  } = useSendTransaction() \n\n  async function submit(e: React.FormEvent<HTMLFormElement>) { \n    e.preventDefault() \n    const formData = new FormData(e.target as HTMLFormElement) \n    const to = formData.get('address') as `0x${string}` \n    const value = formData.get('value') as string \n    sendTransaction({ to, value: parseEther(value) }) \n  } \n\n  const { isLoading: isConfirming, isSuccess: isConfirmed } = \n    useWaitForTransactionReceipt({ \n      hash, \n    }) \n\n  return (\n    <form onSubmit={submit}>\n      <input name=\"address\" placeholder=\"0xA0Cf…251e\" required />\n      <input name=\"value\" placeholder=\"0.05\" required />\n      <button \n        disabled={isPending} \n        type=\"submit\"\n      >\n        {isPending ? 'Confirming...' : 'Send'} \n      </button>\n      {hash && <div>Transaction Hash: {hash}</div>} \n      {isConfirming && <div>Waiting for confirmation...</div>} \n      {isConfirmed && <div>Transaction confirmed.</div>} \n      {error && ( // [!code ++]\n        <div>Error: {(error as BaseError).shortMessage || error.message}</div> // [!code ++]\n      )} // [!code ++]\n    </form>\n  )\n}\n```\n\n:::\n\n### 8. Wire it up!\n\nFinally, we can wire up our Send Transaction component to our application's entrypoint.\n\n::: code-group\n\n```tsx [app.tsx]\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { WagmiProvider } from 'wagmi'\nimport { config } from './config'\nimport { SendTransaction } from './send-transaction' // [!code ++]\n\nconst queryClient = new QueryClient()\n\nfunction App() {\n  return (\n    <WagmiProvider config={config}>\n      <QueryClientProvider client={queryClient}> \n        <SendTransaction /> // [!code ++]\n      </QueryClientProvider> \n    </WagmiProvider>\n  )\n}\n```\n\n```tsx [send-transaction.tsx]\nimport * as React from 'react'\nimport { \n  type BaseError, \n  useSendTransaction, \n  useWaitForTransactionReceipt \n} from 'wagmi' \nimport { parseEther } from 'viem' \n \nexport function SendTransaction() {\n  const { \n    data: hash,\n    error, \n    isPending, \n    sendTransaction \n  } = useSendTransaction() \n\n  async function submit(e: React.FormEvent<HTMLFormElement>) { \n    e.preventDefault() \n    const formData = new FormData(e.target as HTMLFormElement) \n    const to = formData.get('address') as `0x${string}` \n    const value = formData.get('value') as string \n    sendTransaction({ to, value: parseEther(value) }) \n  } \n\n  const { isLoading: isConfirming, isSuccess: isConfirmed } = \n    useWaitForTransactionReceipt({ \n      hash, \n    }) \n\n  return (\n    <form onSubmit={submit}>\n      <input name=\"address\" placeholder=\"0xA0Cf…251e\" required />\n      <input name=\"value\" placeholder=\"0.05\" required />\n      <button \n        disabled={isPending} \n        type=\"submit\"\n      >\n        {isPending ? 'Confirming...' : 'Send'} \n      </button>\n      {hash && <div>Transaction Hash: {hash}</div>} \n      {isConfirming && <div>Waiting for confirmation...</div>} \n      {isConfirmed && <div>Transaction confirmed.</div>} \n      {error && ( \n        <div>Error: {(error as BaseError).shortMessage || error.message}</div> \n      )} \n    </form>\n  )\n}\n```\n\n```tsx [config.ts]\nimport { http, createConfig } from 'wagmi'\nimport { base, mainnet, optimism } from 'wagmi/chains'\nimport { injected, metaMask, safe, walletConnect } from 'wagmi/connectors'\n\nconst projectId = '<WALLETCONNECT_PROJECT_ID>'\n\nexport const config = createConfig({\n  chains: [mainnet, base],\n  connectors: [\n    injected(),\n    walletConnect({ projectId }),\n    metaMask(),\n    safe(),\n  ],\n  transports: {\n    [mainnet.id]: http(),\n    [base.id]: http(),\n  },\n})\n```\n\n:::\n\n[See the Example.](#example)\n"
  },
  {
    "path": "site/react/guides/ssr.md",
    "content": "---\noutline: deep\n---\n\n# SSR\n\nWagmi uses client-only external stores (such as `localStorage` and `mipd`) to show the user the most relevant data as quickly as possible on first render.\n\nHowever, the caveat of using these external client stores is that frameworks which incorporate SSR (such as Next.js) will throw hydration warnings on the client when it identifies mismatches between the server-rendered HTML and the client-rendered HTML.\n\nTo stop this from happening, you can toggle on the [`ssr`](/react/api/createConfig#ssr) property in the Wagmi Config.\n\n```tsx\nimport { createConfig, http } from 'wagmi'\nimport { mainnet, sepolia } from 'wagmi/chains'\n\nconst config = createConfig({ // [!code focus:99]\n  chains: [mainnet, sepolia],\n  ssr: true, // [!code ++]\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n```\n\nTurning on the `ssr` property means that content from the external stores will be hydrated on the client after the initial mount.\n\n## Persistence using Cookies\n\nAs a result of turning on the `ssr` property, external persistent stores like `localStorage` will be hydrated on the client **after the initial mount**.\n\nThis means that you will still see a flash of \"empty\" data on the client (e.g. a `\"disconnected\"` account instead of a `\"reconnecting\"` account, or an empty address instead of the last connected address) until after the first mount, when the store hydrates.\n\nIn order to persist data between the server and the client, you can use cookies.\n\n### 1. Set up cookie storage\n\nFirst, we will set up cookie storage in the Wagmi Config.\n\n```tsx\nimport { \n  createConfig, \n  http, \n  cookieStorage, // [!code ++]\n  createStorage // [!code ++]\n} from 'wagmi'\nimport { mainnet, sepolia } from 'wagmi/chains'\n\nexport function getConfig() {\n  return createConfig({\n    chains: [mainnet, sepolia],\n    ssr: true,\n    storage: createStorage({  // [!code ++]\n      storage: cookieStorage, // [!code ++]\n    }),  // [!code ++]\n    transports: {\n      [mainnet.id]: http(),\n      [sepolia.id]: http(),\n    },\n  })\n}\n```\n\n### 2. Hydrate the cookie\n\nNext, we will need to add some mechanisms to hydrate the stored cookie in Wagmi.\n\n#### Next.js App Directory\n\nIn our `app/layout.tsx` file (a [Server Component](https://nextjs.org/docs/app/building-your-application/rendering/server-components)), we will need to extract the cookie from the `headers` function and pass it to [`cookieToInitialState`](/react/api/utilities/cookieToInitialState). \n\nWe will need to pass this result to the [`initialState` property](/react/api/WagmiProvider#initialstate) of the `WagmiProvider`. The `WagmiProvider` **must** be in a Client Component tagged with `\"use client\"` (see `app/providers.tsx` tab).\n\n::: code-group\n```tsx [app/layout.tsx]\nimport { type ReactNode } from 'react'\nimport { headers } from 'next/headers' // [!code ++]\nimport { cookieToInitialState } from 'wagmi' // [!code ++]\n\nimport { getConfig } from './config'\nimport { Providers } from './providers'\n\nexport default async function Layout({ children }: { children: ReactNode }) {\n  const initialState = cookieToInitialState( // [!code ++]\n    getConfig(), // [!code ++]\n    (await headers()).get('cookie') // [!code ++]\n  ) // [!code ++]\n  return (\n    <html lang=\"en\">\n      <body>\n        <Providers> // [!code --]\n        <Providers initialState={initialState}> // [!code ++]\n          {children}\n        </Providers>\n      </body>\n    </html>\n  )\n}\n\n```\n\n```tsx [app/providers.tsx]\n'use client'\n\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { type ReactNode, useState } from 'react'\nimport { type State, WagmiProvider } from 'wagmi'\n\nimport { getConfig } from './config'\n\ntype Props = {\n  children: ReactNode,\n  initialState: State | undefined, // [!code ++]\n}\n\nexport function Providers({ children }: Props) {  // [!code --]\nexport function Providers({ children, initialState }: Props) {  // [!code ++]\n  const [config] = useState(() => getConfig())\n  const [queryClient] = useState(() => new QueryClient())\n\n  return (\n    <WagmiProvider config={config}> // [!code --]\n    <WagmiProvider config={config} initialState={initialState}> // [!code ++]\n      <QueryClientProvider client={queryClient}>\n        {children}\n      </QueryClientProvider>\n    </WagmiProvider>\n  )\n}\n\n```\n\n```tsx [app/config.ts]\nimport { \n  createConfig, \n  http, \n  cookieStorage,\n  createStorage \n} from 'wagmi'\nimport { mainnet, sepolia } from 'wagmi/chains'\n\nexport function getConfig() {\n  return createConfig({\n    chains: [mainnet, sepolia],\n    ssr: true,\n    storage: createStorage({  // [!code ++]\n      storage: cookieStorage, // [!code ++]\n    }),  // [!code ++]\n    transports: {\n      [mainnet.id]: http(),\n      [sepolia.id]: http(),\n    },\n  })\n}\n```\n:::\n\n#### Next.js Pages Directory\n\nWould you like to contribute this content? Feel free to [open a Pull Request](https://github.com/wevm/wagmi/pulls)!\n<!-- TODO -->\n\n#### Vanilla SSR\n\nWould you like to contribute this content? Feel free to [open a Pull Request](https://github.com/wevm/wagmi/pulls)!\n<!-- TODO -->\n\n"
  },
  {
    "path": "site/react/guides/tanstack-query.md",
    "content": "# TanStack Query\n\nWagmi Hooks are not only a wrapper around the core [Wagmi Actions](/core/api/actions), but they also utilize [TanStack Query](https://tanstack.com/query/v5) to enable trivial and intuitive fetching, caching, synchronizing, and updating of asynchronous data in your React applications.\n\nWithout an asynchronous data fetching abstraction, you would need to handle all the negative side-effects that comes as a result, such as: representing finite states (loading, error, success), handling race conditions, caching against a deterministic identifier, etc.\n\n## Queries & Mutations\n\nWagmi Hooks represent either a **Query** or a **Mutation**. \n\n**Queries** are used for fetching data (e.g. fetching a block number, reading from a contract, etc), and are typically invoked on mount by default. All queries are coupled to a unique [Query Key](#query-keys), and can be used for further operations such as refetching, prefetching, or modifying the cached data.\n\n**Mutations** are used for mutating data (e.g. connecting/disconnecting accounts, writing to a contract, switching chains, etc), and are typically invoked in response to a user interaction. Unlike **Queries**, they are not coupled with a query key.\n\n## Terms\n\n- **Query**: An asynchronous data fetching (e.g. read data) operation that is tied against a unique Query Key.\n- **Mutation**: An asynchronous mutating (e.g. create/update/delete data or side-effect) operation.\n- **Query Key**: A unique identifier that is used to deterministically identify a query. It is typically a tuple of the query name and the query arguments.\n- **Stale Data**: Data that is unused or inactive after a certain period of time.\n- **Query Fetching**: The process of invoking an async query function.\n- **Query Refetching**: The process of refetching **rendered** queries.\n- **[Query Invalidation](https://tanstack.com/query/v5/docs/react/guides/query-invalidation)**: The process of marking query data as stale (e.g. inactive/unused), and refetching **rendered** queries.\n- **[Query Prefetching](https://tanstack.com/query/v5/docs/react/guides/prefetching)**: The process of prefetching queries and seeding the cache.\n\n## Persistence via External Stores\n\nBy default, TanStack Query persists all query data in-memory. This means that if you refresh the page, all in-memory query data will be lost. \n\nIf you want to persist query data to an external storage, you can utilize TanStack Query's [`createSyncStoragePersister`](https://tanstack.com/query/v5/docs/react/plugins/createSyncStoragePersister) or [`createAsyncStoragePersister`](https://tanstack.com/query/v5/docs/react/plugins/createAsyncStoragePersister) to plug external storage like `localStorage`, `sessionStorage`, [IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API) or [`AsyncStorage`](https://reactnative.dev/docs/asyncstorage) (React Native).\n\n### Sync Storage\n\nBelow is an example of how to set up Wagmi + TanStack Query with sync external storage like `localStorage` or `sessionStorage`.\n\n#### Install\n\n::: code-group\n```bash [pnpm]\npnpm i @tanstack/query-sync-storage-persister @tanstack/react-query-persist-client\n```\n\n```bash [npm]\nnpm i @tanstack/query-sync-storage-persister @tanstack/react-query-persist-client\n```\n\n```bash [yarn]\nyarn add @tanstack/query-sync-storage-persister @tanstack/react-query-persist-client\n```\n\n```bash [bun]\nbun i @tanstack/query-sync-storage-persister @tanstack/react-query-persist-client\n```\n:::\n\n#### Usage\n\n```tsx\n// 1. Import modules. // [!code hl]\nimport { createSyncStoragePersister } from '@tanstack/query-sync-storage-persister' // [!code hl]\nimport { QueryClient } from '@tanstack/react-query' // [!code hl]\nimport { PersistQueryClientProvider } from '@tanstack/react-query-persist-client' // [!code hl]\nimport { WagmiProvider, deserialize, serialize } from 'wagmi' // [!code hl]\n\n// 2. Create a new Query Client with a default `gcTime`. // [!code hl]\nconst queryClient = new QueryClient({ // [!code hl]\n  defaultOptions: { // [!code hl]\n    queries: { // [!code hl]\n      gcTime: 1_000 * 60 * 60 * 24, // 24 hours // [!code hl]\n    }, // [!code hl] \n  }, // [!code hl]\n}) // [!code hl]\n\n// 3. Set up the persister. // [!code hl]\nconst persister = createSyncStoragePersister({ // [!code hl]\n  serialize, // [!code hl]\n  storage: window.localStorage, // [!code hl]\n  deserialize, // [!code hl]\n}) // [!code hl]\n\nfunction App() {\n  return (\n    <WagmiProvider config={config}>\n      {/* 4. Wrap app in PersistQueryClientProvider */} // [!code hl]\n      <PersistQueryClientProvider // [!code hl]\n        client={queryClient} // [!code hl]\n        persistOptions={{ persister }} // [!code hl]\n      > // [!code hl]\n        {/* ... */}\n      </PersistQueryClientProvider> // [!code hl]\n    </WagmiProvider>\n  )\n}\n```\n\nRead more about [Sync Storage Persistence](https://tanstack.com/query/v5/docs/react/plugins/createSyncStoragePersister).\n\n### Async Storage\n\nBelow is an example of how to set up Wagmi + TanStack Query with async external storage like [`IndexedDB`](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API) or [`AsyncStorage`](https://reactnative.dev/docs/asyncstorage).\n\n#### Install\n\n::: code-group\n```bash [pnpm]\npnpm i @tanstack/query-async-storage-persister @tanstack/react-query-persist-client\n```\n\n```bash [npm]\nnpm i @tanstack/query-async-storage-persister @tanstack/react-query-persist-client\n```\n\n```bash [yarn]\nyarn add @tanstack/query-async-storage-persister @tanstack/react-query-persist-client\n```\n\n```bash [bun]\nbun i @tanstack/query-async-storage-persister @tanstack/react-query-persist-client\n```\n:::\n\n#### Usage\n\n```tsx\n// 1. Import modules. // [!code hl]\nimport AsyncStorage from '@react-native-async-storage/async-storage' // [!code hl]\nimport { createAsyncStoragePersister } from '@tanstack/query-async-storage-persister' // [!code hl]\nimport { QueryClient } from '@tanstack/react-query' // [!code hl]\nimport { PersistQueryClientProvider } from '@tanstack/react-query-persist-client' // [!code hl]\nimport { WagmiProvider, deserialize, serialize } from 'wagmi' // [!code hl]\n\n// 2. Create a new Query Client with a default `gcTime`. // [!code hl]\nconst queryClient = new QueryClient({ // [!code hl]\n  defaultOptions: { // [!code hl]\n    queries: { // [!code hl]\n      gcTime: 1_000 * 60 * 60 * 24, // 24 hours // [!code hl]\n    }, // [!code hl] \n  }, // [!code hl]\n}) // [!code hl]\n\n// 3. Set up the persister. // [!code hl]\nconst persister = createAsyncStoragePersister({ // [!code hl]\n  serialize, // [!code hl]\n  storage: AsyncStorage, // [!code hl]\n  deserialize, // [!code hl]\n}) // [!code hl]\n\nfunction App() {\n  return (\n    <WagmiProvider config={config}>\n      {/* 4. Wrap app in PersistQueryClientProvider */} // [!code hl]\n      <PersistQueryClientProvider // [!code hl]\n        client={queryClient} // [!code hl]\n        persistOptions={{ persister }} // [!code hl]\n      > // [!code hl]\n        {/* ... */}\n      </PersistQueryClientProvider> // [!code hl]\n    </WagmiProvider>\n  )\n}\n```\n\nRead more about [Async Storage Persistence](https://tanstack.com/query/v5/docs/react/plugins/createAsyncStoragePersister).\n\n## Query Keys\n\nQuery Keys are typically used to perform advanced operations on the query such as: invalidation, refetching, prefetching, etc. \n\nWagmi exports Query Keys for every Hook, and they can be retrieved via the [Hook (React)](#hook-react) or via an [Import (Vanilla JS)](#import-vanilla-js).\n\nRead more about **Query Keys** on the [TanStack Query docs.](https://tanstack.com/query/v5/docs/react/guides/query-keys)\n\n### Hook (React)\n\nEach Hook returns a `queryKey` value. You would use this approach when you want to utilize the query key in a React component as it handles reactivity for you, unlike the [Import](#import-vanilla-js) method below.\n\n```ts \nimport { useBlock } from 'wagmi' // [!code hl]\n\nfunction App() {\n  const { queryKey } = useBlock() // [!code hl]\n}\n```\n\n### Import (Vanilla JS)\n\nEach Hook has a corresponding `get<X>QueryOptions` function that returns a query key. You would use this method when you want to utilize the query key outside of a React component in a Vanilla JS context, like in a utility function. \n\n```ts \nimport { getBlockQueryOptions } from 'wagmi/query' // [!code hl]\nimport { config } from './config'\n\nfunction perform() {\n  const { queryKey } = getBlockQueryOptions(config, { // [!code hl]\n    chainId: config.state.chainId // [!code hl]\n  }) // [!code hl]\n}\n```\n\n::: warning\n\nThe caveat of this method is that it does not handle reactivity for you (e.g. active account/chain changes, argument changes, etc). You would need to handle this yourself by explicitly passing through the arguments to `get<X>QueryOptions`.\n\n:::\n\n## Invalidating Queries\n\nInvalidating a query is the process of marking the query data as stale (e.g. inactive/unused), and refetching the queries that are already rendered.\n\nRead more about **Invalidating Queries** on the [TanStack Query docs.](https://tanstack.com/query/v5/docs/react/guides/query-invalidation)\n\n#### Example: Watching a Users' Balance\n\nYou may want to \"watch\" a users' balance, and invalidate the balance after each incoming block. We can invoke `invalidateQueries` inside a `useEffect` with the block number as it's only dependency – this will refetch all rendered balance queries when the `blockNumber` changes.\n\n```tsx\nimport { useQueryClient } from '@tanstack/react-query' \nimport { useEffect } from 'react' \nimport { useBlockNumber, useBalance } from 'wagmi' \n\nfunction App() {\n  const queryClient = useQueryClient()\n  const { data: blockNumber } = useBlockNumber({ watch: true }) // [!code hl]\n  const { data: balance, queryKey } = useBalance() // [!code hl]\n  \n  useEffect(() => { // [!code hl]\n    queryClient.invalidateQueries({ queryKey }) // [!code hl]\n  }, [blockNumber]) // [!code hl]\n\n  return <div>{balance}</div>\n}\n```\n\n#### Example: After User Interaction\n\nMaybe you want to invalidate a users' balance after some interaction. This would mark the balance as stale, and consequently refetch all rendered balance queries.\n\n```tsx\nimport { useBalance } from 'wagmi'\n\nfunction App() {\n  // 1. Extract `queryKey` from the useBalance Hook. // [!code hl]\n  const { queryKey } = useBalance() // [!code hl]\n\n  return (\n    <button\n      onClick={async () => {\n        // 2. Invalidate the query when the user clicks \"Invalidate\". // [!code hl]\n        await queryClient.invalidateQueries({ queryKey }) // [!code hl]\n      }}\n    >\n      Invalidate\n    </button>\n  )\n}\n\nfunction Example() {\n  // 3. Other `useBalance` Hooks in your rendered React tree will be refetched! // [!code hl]\n  const { data: balance } = useBalance() // [!code hl]\n\n  return <div>{balance}</div>\n}\n```\n\n## Fetching Queries\n\nFetching a query is the process of invoking the query function to retrieve data. If the query exists and the data is not invalidated or older than a given `staleTime`, then the data from the cache will be returned. Otherwise, the query will fetch for the latest data.\n\n::: code-group\n```tsx [example.tsx]\nimport { getBlockQueryOptions } from 'wagmi'\nimport { queryClient } from './app'\nimport { config } from './config'\n\nexport async function fetchBlockData() {\n  return queryClient.fetchQuery( // [!code hl]\n    getBlockQueryOptions(config, { // [!code hl]\n      chainId: config.state.chainId, // [!code hl]\n    } // [!code hl]\n  )) // [!code hl]\n}\n```\n<<< @/snippets/react/app.tsx[app.tsx]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Retrieving & Updating Query Data\n\nYou can retrieve and update query data imperatively with `getQueryData` and `setQueryData`. This is useful for scenarios where you want to retrieve or update a query outside of a React component.\n\nNote that these functions do not invalidate or refetch queries.\n\n::: code-group\n```tsx [example.tsx]\nimport { getBlockQueryOptions } from 'wagmi'\nimport type { Block } from 'viem'\nimport { queryClient } from './app'\nimport { config } from './config'\n\nexport function getPendingBlockData() {\n  return queryClient.getQueryData( // [!code hl]\n    getBlockQueryOptions(config, { // [!code hl]\n      chainId: config.state.chainId, // [!code hl]\n      tag: 'pending' // [!code hl]\n    } // [!code hl]\n  )) // [!code hl]\n}\n\nexport function setPendingBlockData(data: Block) {\n  return queryClient.setQueryData( // [!code hl]\n    getBlockQueryOptions(config, { // [!code hl]\n      chainId: config.state.chainId, // [!code hl]\n      tag: 'pending' // [!code hl]\n    }, // [!code hl]\n    data // [!code hl]\n  )) // [!code hl]\n}\n```\n<<< @/snippets/react/app.tsx[app.tsx]\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Prefetching Queries\n\nPrefetching a query is the process of fetching the data ahead of time and seeding the cache with the returned data. This is useful for scenarios where you want to fetch data before the user navigates to a page, or fetching data on the server to be reused on client hydration.\n\nRead more about **Prefetching Queries** on the [TanStack Query docs.](https://tanstack.com/query/v5/docs/react/guides/prefetching)\n\n#### Example: Prefetching in Event Handler\n\n```tsx\nimport { Link } from 'next/link'\nimport { getBlockQueryOptions } from 'wagmi'\n\nfunction App() {\n  const config = useConfig()\n  const chainId = useChainId()\n\n  // 1. Set up a function to prefetch the block data. // [!code hl]\n  const prefetch = () => // [!code hl]\n    queryClient.prefetchQuery(getBlockQueryOptions(config, { chainId })) // [!code hl]\n  \n\n  return (\n    <Link\n      // 2. Add event handlers to prefetch the block data // [!code hl] \n      // when user hovers over or focuses on the button. // [!code hl]\n      onMouseEnter={prefetch} // [!code hl]\n      onFocus={prefetch} // [!code hl]\n      to=\"/block-details\"\n    >\n      Block details\n    </Link>\n  )\n}\n```\n\n## SSR\n\nIt is possible to utilize TanStack Query's SSR strategies with Wagmi Hooks & Query Keys. Check out the [Server Rendering & Hydration](https://tanstack.com/query/v5/docs/react/guides/ssr) & [Advanced Server Rendering](https://tanstack.com/query/v5/docs/react/guides/advanced-ssr) guides.\n\n## Devtools\n\nTanStack Query includes dedicated [Devtools](https://tanstack.com/query/latest/docs/framework/react/devtools) that assist in visualizing and debugging your queries, their cache states, and much more. You will have to pass a custom `queryKeyFn` to your `QueryClient` for Devtools to correctly serialize BigInt values for display. Alternatively, You can use the `hashFn` from `@wagmi/core/query`, which already handles this serialization.\n\n#### Install\n\n::: code-group\n```bash [pnpm]\npnpm i @tanstack/react-query-devtools\n```\n\n```bash [npm]\nnpm i @tanstack/react-query-devtools\n```\n\n```bash [yarn]\nyarn add @tanstack/react-query-devtools\n```\n\n```bash [bun]\nbun i @tanstack/react-query-devtools\n```\n:::\n\n#### Usage\n\n```tsx\nimport {\n  QueryClient,\n  QueryClientProvider,\n} from \"@tanstack/react-query\";\nimport { ReactQueryDevtools } from \"@tanstack/react-query-devtools\"; // [!code hl]\nimport { hashFn } from \"@wagmi/core/query\"; // [!code hl]\n\nconst queryClient = new QueryClient({\n  defaultOptions: { // [!code hl]\n    queries: { // [!code hl]\n      queryKeyHashFn: hashFn, // [!code hl]\n    }, // [!code hl]\n  }, // [!code hl]\n});\n```\n"
  },
  {
    "path": "site/react/guides/testing.md",
    "content": "# Testing\n\n"
  },
  {
    "path": "site/react/guides/viem.md",
    "content": "# Viem\n\n[Viem](https://viem.sh) is a low-level TypeScript Interface for Ethereum that enables developers to interact with the Ethereum blockchain, including: JSON-RPC API abstractions, Smart Contract interaction, wallet & signing implementations, coding/parsing utilities and more.\n\n**Wagmi Core** is essentially a wrapper over **Viem** that provides multi-chain functionality via [Wagmi Config](/react/api/createConfig) and automatic account management via [Connectors](/react/api/connectors).\n\n## Leveraging Viem Actions\n\nAll of the core [Wagmi Hooks](/react/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](/react/api/createConfig).\n\nThere may be cases where you might want to dig deeper and utilize Viem Actions directly (maybe a Hook doesn't exist in Wagmi yet). In these cases, you can create your own custom Wagmi Hook by importing Viem Actions directly via `viem/actions` and plugging in a Viem Client returned by the [`useClient` Hook](/react/api/hooks/useClient).\n\nThe example below demonstrates two different ways to utilize Viem Actions:\n\n1. **Tree-shakable Actions (recommended):** Uses `useClient` (for public actions) and `useConnectorClient` (for wallet actions).\n2. **Client Actions:** Uses `usePublicClient` (for public actions) and  `useWalletClient` (for wallet actions).\n\n::: tip\n\nIt is highly recommended to use the **tree-shakable** method to ensure that you are only pulling modules you use, and keep your bundle size low.\n\n:::\n\n::: code-group\n\n```tsx [Tree-shakable Actions]\n// 1. Import modules. \nimport { useMutation, useQuery } from '@tanstack/react-query'\nimport { http, createConfig, useClient, useConnectorClient } from 'wagmi' \nimport { base, mainnet, optimism, zora } from 'wagmi/chains' \nimport { getLogs, watchAsset } from 'viem/actions'\n\n// 2. Set up a Wagmi Config \nexport const config = createConfig({ \n  chains: [base, mainnet, optimism, zora], \n  transports: { \n    [base.id]: http(), \n    [mainnet.id]: http(), \n    [optimism.id]: http(), \n    [zora.id]: http(), \n  }, \n}) \n\nfunction Example() {\n  // 3. Extract a Viem Client for the current active chain. // [!code hl]\n  const publicClient = useClient({ config }) // [!code hl]\n\n  // 4. Create a \"custom\" Query Hook that utilizes the Client. // [!code hl]\n  const { data: logs } = useQuery({ // [!code hl]\n    queryKey: ['logs', publicClient.uid], // [!code hl]\n    queryFn: () => getLogs(publicClient, /* ... */) // [!code hl]\n  }) // [!code hl]\n  \n  // 5. Extract a Viem Client for the current active chain & account. // [!code hl]\n  const { data: walletClient } = useConnectorClient({ config }) // [!code hl]\n\n  // 6. Create a \"custom\" Mutation Hook that utilizes the Client. // [!code hl]\n  const { mutate } = useMutation({ // [!code hl]\n    mutationFn: (asset) => watchAsset(walletClient, asset) // [!code hl]\n  }) // [!code hl]\n\n  return (\n    <div>\n      {/* ... */}\n    </div>\n  )\n}\n```\n\n```tsx [Client Actions]\n// 1. Import modules. \nimport { useMutation, useQuery } from '@tanstack/react-query'\nimport { http, createConfig, useClient, useConnectorClient } from 'wagmi' \nimport { base, mainnet, optimism, zora } from 'wagmi/chains' \n\n// 2. Set up a Wagmi Config \nexport const config = createConfig({ \n  chains: [base, mainnet, optimism, zora], \n  transports: { \n    [base.id]: http(), \n    [mainnet.id]: http(), \n    [optimism.id]: http(), \n    [zora.id]: http(), \n  }, \n}) \n\nfunction Example() {\n  // 3. Extract a Viem Client for the current active chain. // [!code hl]\n  const publicClient = useClient({ config }) // [!code hl]\n\n  // 4. Create a \"custom\" Query Hook that utilizes the Client. // [!code hl]\n  const { data: logs } = useQuery({ // [!code hl]\n    queryKey: ['logs', publicClient.uid], // [!code hl]\n    queryFn: () => publicClient.getLogs(/* ... */) // [!code hl]\n  }) // [!code hl]\n  \n  // 5. Extract a Viem Client for the current active chain & account. // [!code hl]\n  const { data: walletClient } = useConnectorClient({ config }) // [!code hl]\n\n  // 6. Create a \"custom\" Mutation Hook that utilizes the Client. // [!code hl]\n  const { mutate } = useMutation({ // [!code hl]\n    mutationFn: (asset) => walletClient.watchAsset(asset) // [!code hl]\n  }) // [!code hl]\n\n  return (\n    <div>\n      {/* ... */}\n    </div>\n  )\n}\n```\n\n:::\n\n## Private Key & Mnemonic Accounts\n\nIt 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.\n\n```tsx\nimport { http, createConfig, useSendTransaction } from 'wagmi' \nimport { base, mainnet, optimism, zora } from 'wagmi/chains' \nimport { parseEther } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\n\nexport const config = createConfig({ \n  chains: [base, mainnet, optimism, zora], \n  transports: { \n    [base.id]: http(), \n    [mainnet.id]: http(), \n    [optimism.id]: http(), \n    [zora.id]: http(), \n  }, \n}) \n\nconst account = privateKeyToAccount('0x...') // [!code hl]\n\nfunction Example() {\n  const { data: hash } = useSendTransaction({\n    account, // [!code hl]\n    to: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n    value: parseEther('0.001')\n  })\n}\n```\n\n::: info\n\nWagmi currently does not support hoisting Private Key & Mnemonic Accounts to the top-level Wagmi Config – meaning you have to explicitly pass through the account to every Action. If you feel like this is a feature that should be added, please [open a discussion](https://github.com/wevm/wagmi/discussions/new?category=ideas).\n\n:::\n"
  },
  {
    "path": "site/react/guides/write-to-contract.md",
    "content": "# Write to Contract\n\nThe [`useWriteContract` Hook](/react/api/hooks/useWriteContract) allows you to mutate data on a smart contract, from a `payable` or `nonpayable` (write) function. These types of functions require gas to be executed, hence a transaction is broadcasted in order to change the state.\n\nIn the guide below, we will teach you how to implement a \"Mint NFT\" form that takes in a dynamic argument (token ID) using Wagmi. The example below builds on the [Connect Wallet guide](/react/guides/connect-wallet) and uses the [useWriteContract](/react/api/hooks/useWriteContract) & [useWaitForTransactionReceipt](/react/api/hooks/useWaitForTransactionReceipt) hooks. \n\nIf you have already completed the [Sending Transactions guide](/react/guides/send-transaction), this guide will look very similar! That's because writing to a contract internally broadcasts & sends a transaction.\n\n## Example\n\nFeel free to check out the example before moving on:\n\n<iframe frameborder=\"0\" width=\"100%\" height=\"500px\" src=\"https://stackblitz.com/edit/vitejs-vite-f5uwlm?embed=1&file=src%2FApp.tsx&hideExplorer=1&view=preview\"></iframe>\n\n## Steps\n\n### 1. Connect Wallet\n\nFollow the [Connect Wallet guide](/react/guides/connect-wallet) guide to get this set up.\n\n### 2. Create a new component\n\nCreate your `MintNFT` component that will contain the Mint NFT logic.\n\n::: code-group\n\n```tsx [mint-nft.tsx]\nimport * as React from 'react'\n \nexport function MintNFT() {\n  return (\n    <form>\n      <input name=\"tokenId\" placeholder=\"69420\" required />\n      <button type=\"submit\">Mint</button>\n    </form>\n  )\n}\n```\n\n:::\n\n### 3. Add a form handler\n\nNext, we will need to add a handler to the form that will send the transaction when the user hits \"Mint\". This will be a basic handler in this step.\n\n::: code-group\n\n```tsx [mint-nft.tsx]\nimport * as React from 'react'\n \nexport function MintNFT() {\n  async function submit(e: React.FormEvent<HTMLFormElement>) { // [!code ++]\n    e.preventDefault() // [!code ++]\n    const formData = new FormData(e.target as HTMLFormElement) // [!code ++]\n    const tokenId = formData.get('tokenId') as string // [!code ++]\n  } // [!code ++]\n\n  return (\n    <form> // [!code --]\n    <form onSubmit={submit}> // [!code ++]\n      <input name=\"tokenId\" placeholder=\"69420\" required />\n      <button type=\"submit\">Mint</button>\n    </form>\n  )\n}\n```\n\n:::\n\n### 4. Hook up the `useWriteContract` Hook\n\nNow that we have the form handler, we can hook up the [`useWriteContract` Hook](/react/api/hooks/useWriteContract) to send the transaction.\n\n::: code-group\n\n```tsx [mint-nft.tsx]\nimport * as React from 'react'\nimport { useWriteContract } from 'wagmi' // [!code ++]\nimport { abi } from './abi' // [!code ++]\n \nexport function MintNFT() {\n  const { data: hash, writeContract } = useWriteContract() // [!code ++]\n\n  async function submit(e: React.FormEvent<HTMLFormElement>) { \n    e.preventDefault() \n    const formData = new FormData(e.target as HTMLFormElement) \n    const tokenId = formData.get('tokenId') as string \n    writeContract({ // [!code ++]\n      address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', // [!code ++]\n      abi, // [!code ++]\n      functionName: 'mint', // [!code ++]\n      args: [BigInt(tokenId)], // [!code ++]\n    }) // [!code ++]\n  } \n\n  return (\n    <form onSubmit={submit}>\n      <input name=\"tokenId\" placeholder=\"69420\" required />\n      <button type=\"submit\">Mint</button>\n      {hash && <div>Transaction Hash: {hash}</div>} // [!code ++]\n    </form>\n  )\n}\n```\n\n```ts [abi.ts]\nexport const abi = [\n  {\n    name: 'mint',\n    type: 'function',\n    stateMutability: 'nonpayable',\n    inputs: [{ internalType: 'uint32', name: 'tokenId', type: 'uint32' }],\n    outputs: [],\n  },\n] as const\n```\n\n:::\n\n### 5. Add loading state (optional)\n\nWe can optionally add a loading state to the \"Mint\" button while we are waiting confirmation from the user's wallet.\n\n::: code-group\n\n```tsx [mint-nft.tsx]\nimport * as React from 'react'\nimport { useWriteContract } from 'wagmi'\nimport { abi } from './abi'\n \nexport function MintNFT() {\n  const { \n    data: hash, \n    isPending, // [!code ++]\n    writeContract \n  } = useWriteContract() \n\n  async function submit(e: React.FormEvent<HTMLFormElement>) { \n    e.preventDefault() \n    const formData = new FormData(e.target as HTMLFormElement) \n    const tokenId = formData.get('tokenId') as string \n    writeContract({\n      address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n      abi,\n      functionName: 'mint',\n      args: [BigInt(tokenId)],\n    })\n  } \n\n  return (\n    <form onSubmit={submit}>\n      <input name=\"tokenId\" placeholder=\"69420\" required />\n      <button \n        disabled={isPending} // [!code ++]\n        type=\"submit\"\n      >\n        Mint // [!code --]\n        {isPending ? 'Confirming...' : 'Mint'} // [!code ++]\n      </button>\n      {hash && <div>Transaction Hash: {hash}</div>}\n    </form>\n  )\n}\n```\n\n```ts [abi.ts]\nexport const abi = [\n  {\n    name: 'mint',\n    type: 'function',\n    stateMutability: 'nonpayable',\n    inputs: [{ internalType: 'uint32', name: 'tokenId', type: 'uint32' }],\n    outputs: [],\n  },\n] as const\n```\n\n:::\n\n### 6. Wait for transaction receipt (optional)\n\nWe can also display the transaction confirmation status to the user by using the [`useWaitForTransactionReceipt` Hook](/react/api/hooks/useWaitForTransactionReceipt). \n\n::: code-group\n\n```tsx [mint-nft.tsx]\nimport * as React from 'react'\nimport { \n  useWaitForTransactionReceipt, // [!code ++]\n  useWriteContract \n} from 'wagmi'\nimport { abi } from './abi'\n \nexport function MintNFT() {\n  const { \n    data: hash, \n    isPending, \n    writeContract \n  } = useWriteContract() \n\n  async function submit(e: React.FormEvent<HTMLFormElement>) { \n    e.preventDefault() \n    const formData = new FormData(e.target as HTMLFormElement) \n    const tokenId = formData.get('tokenId') as string \n    writeContract({\n      address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n      abi,\n      functionName: 'mint',\n      args: [BigInt(tokenId)],\n    })\n  } \n\n  const { isLoading: isConfirming, isSuccess: isConfirmed } = // [!code ++]\n    useWaitForTransactionReceipt({ // [!code ++]\n      hash, // [!code ++]\n    }) // [!code ++]\n\n  return (\n    <form onSubmit={submit}>\n      <input name=\"tokenId\" placeholder=\"69420\" required />\n      <button \n        disabled={isPending} \n        type=\"submit\"\n      >\n        {isPending ? 'Confirming...' : 'Mint'} \n      </button>\n      {hash && <div>Transaction Hash: {hash}</div>}\n      {isConfirming && <div>Waiting for confirmation...</div>} // [!code ++]\n      {isConfirmed && <div>Transaction confirmed.</div>} // [!code ++]\n    </form>\n  )\n}\n```\n\n```ts [abi.ts]\nexport const abi = [\n  {\n    name: 'mint',\n    type: 'function',\n    stateMutability: 'nonpayable',\n    inputs: [{ internalType: 'uint32', name: 'tokenId', type: 'uint32' }],\n    outputs: [],\n  },\n] as const\n```\n\n:::\n\n### 7. Handle errors (optional)\n\nIf the user rejects the transaction, or the contract reverts, we can display an error message to the user.\n\n::: code-group\n\n```tsx [mint-nft.tsx]\nimport * as React from 'react'\nimport { \n  type BaseError, // [!code ++]\n  useWaitForTransactionReceipt, \n  useWriteContract \n} from 'wagmi'\nimport { abi } from './abi'\n \nexport function MintNFT() {\n  const { \n    data: hash,\n    error, // [!code ++]  \n    isPending, \n    writeContract \n  } = useWriteContract() \n\n  async function submit(e: React.FormEvent<HTMLFormElement>) { \n    e.preventDefault() \n    const formData = new FormData(e.target as HTMLFormElement) \n    const tokenId = formData.get('tokenId') as string \n    writeContract({\n      address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n      abi,\n      functionName: 'mint',\n      args: [BigInt(tokenId)],\n    })\n  } \n\n  const { isLoading: isConfirming, isSuccess: isConfirmed } = \n    useWaitForTransactionReceipt({ \n      hash, \n    }) \n\n  return (\n    <form onSubmit={submit}>\n      <input name=\"tokenId\" placeholder=\"69420\" required />\n      <button \n        disabled={isPending} \n        type=\"submit\"\n      >\n        {isPending ? 'Confirming...' : 'Mint'} \n      </button>\n      {hash && <div>Transaction Hash: {hash}</div>}\n      {isConfirming && <div>Waiting for confirmation...</div>} \n      {isConfirmed && <div>Transaction confirmed.</div>} \n      {error && ( // [!code ++]\n        <div>Error: {(error as BaseError).shortMessage || error.message}</div> // [!code ++]\n      )} // [!code ++]\n    </form>\n  )\n}\n```\n\n```ts [abi.ts]\nexport const abi = [\n  {\n    name: 'mint',\n    type: 'function',\n    stateMutability: 'nonpayable',\n    inputs: [{ internalType: 'uint32', name: 'tokenId', type: 'uint32' }],\n    outputs: [],\n  },\n] as const\n```\n\n:::\n\n### 8. Wire it up!\n\nFinally, we can wire up our Mint NFT component to our application's entrypoint.\n\n::: code-group\n\n```tsx [app.tsx]\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { WagmiProvider } from 'wagmi'\nimport { config } from './config'\nimport { MintNft } from './mint-nft' // [!code ++]\n\nconst queryClient = new QueryClient()\n\nfunction App() {\n  return (\n    <WagmiProvider config={config}>\n      <QueryClientProvider client={queryClient}> \n        <MintNft /> // [!code ++]\n      </QueryClientProvider> \n    </WagmiProvider>\n  )\n}\n```\n\n```tsx [mint-nft.tsx]\nimport * as React from 'react'\nimport { \n  type BaseError, \n  useWaitForTransactionReceipt, \n  useWriteContract \n} from 'wagmi'\nimport { abi } from './abi'\n \nexport function MintNFT() {\n  const { \n    data: hash,\n    error,   \n    isPending, \n    writeContract \n  } = useWriteContract() \n\n  async function submit(e: React.FormEvent<HTMLFormElement>) { \n    e.preventDefault() \n    const formData = new FormData(e.target as HTMLFormElement) \n    const tokenId = formData.get('tokenId') as string \n    writeContract({\n      address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n      abi,\n      functionName: 'mint',\n      args: [BigInt(tokenId)],\n    })\n  } \n\n  const { isLoading: isConfirming, isSuccess: isConfirmed } = \n    useWaitForTransactionReceipt({ \n      hash, \n    }) \n\n  return (\n    <form onSubmit={submit}>\n      <input name=\"tokenId\" placeholder=\"69420\" required />\n      <button \n        disabled={isPending} \n        type=\"submit\"\n      >\n        {isPending ? 'Confirming...' : 'Mint'} \n      </button>\n      {hash && <div>Transaction Hash: {hash}</div>}\n      {isConfirming && <div>Waiting for confirmation...</div>} \n      {isConfirmed && <div>Transaction confirmed.</div>} \n      {error && ( \n        <div>Error: {(error as BaseError).shortMessage || error.message}</div> \n      )} \n    </form>\n  )\n}\n```\n\n```ts [abi.ts]\nexport const abi = [\n  {\n    name: 'mint',\n    type: 'function',\n    stateMutability: 'nonpayable',\n    inputs: [{ internalType: 'uint32', name: 'tokenId', type: 'uint32' }],\n    outputs: [],\n  },\n] as const\n```\n\n```tsx [config.ts]\nimport { http, createConfig } from 'wagmi'\nimport { base, mainnet, optimism } from 'wagmi/chains'\nimport { injected, metaMask, safe, walletConnect } from 'wagmi/connectors'\n\nconst projectId = '<WALLETCONNECT_PROJECT_ID>'\n\nexport const config = createConfig({\n  chains: [mainnet, base],\n  connectors: [\n    injected(),\n    walletConnect({ projectId }),\n    metaMask(),\n    safe(),\n  ],\n  transports: {\n    [mainnet.id]: http(),\n    [base.id]: http(),\n  },\n})\n```\n\n:::\n\n[See the Example.](#example)\n"
  },
  {
    "path": "site/react/installation.md",
    "content": "<script setup>\nimport packageJson from '../../packages/react/package.json'\nimport Browsers from '../components/Browsers.vue'\n\nconst docsPath = 'react'\nconst packageDir = 'react'\nconst packageName = 'wagmi'\nconst viemVersion = packageJson.peerDependencies.viem\n</script>\n\n# Installation\n\nInstall Wagmi via your package manager, a `<script>` tag, or build from source.\n\n## Package Manager\n\nInstall the required packages.\n\n::: code-group\n```bash-vue [pnpm]\npnpm add wagmi viem@{{viemVersion}} @tanstack/react-query\n```\n\n```bash-vue [npm]\nnpm install wagmi viem@{{viemVersion}} @tanstack/react-query\n```\n\n```bash-vue [yarn]\nyarn add wagmi viem@{{viemVersion}} @tanstack/react-query\n```\n\n```bash-vue [bun]\nbun add wagmi viem@{{viemVersion}} @tanstack/react-query\n```\n:::\n\n- [Viem](https://viem.sh) is a TypeScript interface for Ethereum that performs blockchain operations.\n- [TanStack Query](https://tanstack.com/query/v5) is an async state manager that handles requests, caching, and more.\n- [TypeScript](/react/typescript) is optional, but highly recommended. Learn more about [TypeScript support](/react/typescript).\n\n## CDN\n\nIf you're not using a package manager, you can also use Wagmi via an ESM-compatible CDN such as [esm.sh](https://esm.sh). Simply add a `<script type=\"module\">` tag to the bottom of your HTML file with the following content.\n\n```html-vue\n<script type=\"module\">\n  import React from 'https://esm.sh/react@18.2.0'\n  import { QueryClient } from 'https://esm.sh/@tanstack/react-query'\n  import { createClient } from 'https://esm.sh/viem@{{viemVersion}}'\n  import { createConfig } from 'https://esm.sh/wagmi'\n</script>\n```\n\nCheck out the React docs for info on how to use [React without JSX](https://react.dev/reference/react/createElement#creating-an-element-without-jsx).\n\n<!--@include: @shared/installation.md-->\n"
  },
  {
    "path": "site/react/typescript.md",
    "content": "<script setup>\nimport packageJson from '../../packages/react/package.json'\n\nconst typescriptVersion = packageJson.peerDependencies.typescript\n</script>\n\n# TypeScript\n\n## Requirements\n\nWagmi is designed to be as type-safe as possible! Things to keep in mind:\n\n- Types currently require using TypeScript {{typescriptVersion}}.\n- [TypeScript doesn't follow semver](https://www.learningtypescript.com/articles/why-typescript-doesnt-follow-strict-semantic-versioning) and often introduces breaking changes in minor releases.\n- Changes to types in this repository are considered non-breaking and are usually released as patch changes (otherwise every type enhancement would be a major version!).\n- It is highly recommended that you lock your `wagmi` and `typescript` versions to specific patch releases and upgrade with the expectation that types may be fixed or upgraded between any release.\n- The non-type-related public API of Wagmi still follows semver very strictly.\n\nTo ensure everything works correctly, make sure your `tsconfig.json` has [`strict`](https://www.typescriptlang.org/tsconfig#strict) mode set to `true`.\n\n::: code-group\n```json [tsconfig.json]\n{\n  \"compilerOptions\": {\n    \"strict\": true\n  }\n}\n```\n:::\n\n## Config Types\n\nBy default React Context does not work well with type inference. To support strong type-safety across the React Context boundary, there are two options available:\n\n- Declaration merging to \"register\" your `config` globally with TypeScript.\n- `config` property to pass your `config` directly to hooks.\n\n### Declaration Merging\n\n[Declaration merging](https://www.typescriptlang.org/docs/handbook/declaration-merging.html) allows you to \"register\" your `config` globally with TypeScript. The `Register` type enables Wagmi to infer types in places that wouldn't normally have access to type info via React Context alone. \n\nTo set this up, add the following declaration to your project. Below, we co-locate the declaration merging and the `config` set up.\n\n```ts\nimport { createConfig, http } from 'wagmi'\nimport { mainnet, sepolia } from 'wagmi/chains'\n\ndeclare module 'wagmi' { // [!code focus]\n  interface Register { // [!code focus]\n    config: typeof config // [!code focus]\n  } // [!code focus]\n} // [!code focus]\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n```\n\nSince the `Register` type is global, you only need to add it once in your project. Once set up, you will get strong type-safety across your entire project. For example, query hooks will type `chainId` based on your `config`'s `chains`. \n\n```ts twoslash\n// @twoslash-cache: {\"v\":1,\"hash\":\"296ef5d0fbed904e9f4bc9bf96c55b1f47345dcdd993965e6d5420eb1c6583d7\",\"data\":\"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=\"}\n// @errors: 2322\nimport { type Config } from 'wagmi'\nimport { mainnet, sepolia } from 'wagmi/chains'\n\ndeclare module 'wagmi' {\n  interface Register {\n    config: Config<readonly [typeof mainnet, typeof sepolia]>\n  }\n}\n// ---cut---\nimport { useBlockNumber } from 'wagmi'\n\nuseBlockNumber({ chainId: 123 })\n```\n\nYou just saved yourself a runtime error and you didn't even need to pass your `config`. 🎉\n\n### Hook `config` Property\n\nFor cases where you have more than one Wagmi `config` or don't want to use the declaration merging approach, you can pass a specific `config` directly to hooks via the `config` property.\n\n```ts\nimport { createConfig, http } from 'wagmi'\nimport { mainnet, optimism } from 'wagmi/chains'\n\nexport const configA = createConfig({ // [!code focus]\n  chains: [mainnet], // [!code focus]\n  transports: { // [!code focus]\n    [mainnet.id]: http(), // [!code focus]\n  }, // [!code focus]\n}) // [!code focus]\n\nexport const configB = createConfig({ // [!code focus]\n  chains: [optimism], // [!code focus]\n  transports: { // [!code focus]\n    [optimism.id]: http(), // [!code focus]\n  }, // [!code focus]\n}) // [!code focus]\n```\n\nAs you expect, `chainId` is inferred correctly for each `config`.\n\n```ts twoslash\n// @twoslash-cache: {\"v\":1,\"hash\":\"11543ad9699c8fdbef7c0ce7ac938f71b77d113989b5f3a8de83d428479463c3\",\"data\":\"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\"}\n// @errors: 2322\nimport { type Config } from 'wagmi'\nimport { mainnet, optimism } from 'wagmi/chains'\n\ndeclare const configA: Config<readonly [typeof mainnet]>\ndeclare const configB: Config<readonly [typeof optimism]>\n// ---cut---\nimport { useBlockNumber } from 'wagmi'\n\nuseBlockNumber({ chainId: 123, config: configA })\nuseBlockNumber({ chainId: 123, config: configB })\n```\n\nThis approach is more explicit, but works well for advanced use-cases, if you don't want to use React Context or declaration merging, etc.\n\n## Const-Assert ABIs & Typed Data\n\nWagmi can infer types based on [ABIs](https://docs.soliditylang.org/en/latest/abi-spec.html#json) and [EIP-712](https://eips.ethereum.org/EIPS/eip-712) Typed Data definitions, powered by [Viem](https://viem.sh) and [ABIType](https://github.com/wevm/abitype). This achieves full end-to-end type-safety from your contracts to your frontend and enlightened developer experience by autocompleting ABI item names, catching misspellings, inferring argument and return types (including overloads), and more.\n\nFor this to work, you must either [const-assert](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions) ABIs and Typed Data (more info below) or define them inline. For example, `useReadContract`'s `abi` configuration parameter:\n\n```ts\nconst { data } = useReadContract({\n  abi: […], // <--- defined inline // [!code focus]\n})\n```\n\n```ts\nconst abi = […] as const // <--- const assertion // [!code focus]\nconst { data } = useReadContract({ abi })\n```\n\nIf type inference isn't working, it's likely you forgot to add a `const` assertion or define the configuration parameter inline. Also, make sure your ABIs, Typed Data definitions, and [TypeScript configuration](#requirements) are valid and set up correctly.\n\n::: tip\nUnfortunately [TypeScript doesn't support importing JSON `as const` yet](https://github.com/microsoft/TypeScript/issues/32063). Check out the [Wagmi CLI](/cli/getting-started) to help with this! It can automatically fetch ABIs from Etherscan and other block explorers, resolve ABIs from your Foundry/Hardhat projects, generate React Hooks, and more.\n:::\n\nAnywhere you see the `abi` or `types` configuration property, you can likely use const-asserted or inline ABIs and Typed Data to get type-safety and inference. These properties are also called out in the docs.\n\nHere's what [`useReadContract`](/react/api/hooks/useReadContract) looks like with and without a const-asserted `abi` property.\n\n::: code-group\n```ts twoslash [Const-Asserted]\n// @twoslash-cache: {\"v\":1,\"hash\":\"d7475b91e63cc31608c546a0ebb47f73a765bd7e10587f2f8d3a8df8fdf837c6\",\"data\":\"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\"}\nconst erc721Abi = [\n  {\n    name: 'balanceOf',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [{ type: 'address', name: 'owner' }],\n    outputs: [{ type: 'uint256' }],\n  },\n  {\n    name: 'isApprovedForAll',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [\n      { type: 'address', name: 'owner' },\n      { type: 'address', name: 'operator' },\n    ],\n    outputs: [{ type: 'bool' }],\n  },\n  {\n    name: 'getApproved',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [{ type: 'uint256', name: 'tokenId' }],\n    outputs: [{ type: 'address' }],\n  },\n  {\n    name: 'ownerOf',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [{ type: 'uint256', name: 'tokenId' }],\n    outputs: [{ type: 'address' }],\n  },\n  {\n    name: 'tokenURI',\n    type: 'function',\n    stateMutability: 'pure',\n    inputs: [{ type: 'uint256', name: 'tokenId' }],\n    outputs: [{ type: 'string' }],\n  },\n] as const\n// ---cut---\nimport { useReadContract } from 'wagmi'\n\nconst { data } = useReadContract({\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  abi: erc721Abi,\n  functionName: 'balanceOf',\n  // ^?\n\n\n\n  args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],\n  // ^?\n})\n\ndata\n// ^?\n```\n```ts twoslash [Not Const-Asserted]\n// @twoslash-cache: {\"v\":1,\"hash\":\"8afd1fa05b7ad31ca46677e8331b056e5b32b376177ca9b18ff226265a7cdaaa\",\"data\":\"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\"}\ndeclare const erc721Abi: {\n  name: string;\n  type: string;\n  stateMutability: string;\n  inputs: {\n    type: string;\n    name: string;\n  }[];\n  outputs: {\n    type: string;\n  }[];\n}[]\n// ---cut---\nimport { useReadContract } from 'wagmi'\n\nconst { data } = useReadContract({\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  abi: erc721Abi,\n  functionName: 'balanceOf',\n  // ^?\n\n\n\n  args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],\n  // ^?\n})\n\ndata\n// ^?\n```\n:::\n\n<br/>\n<br/>\n\nYou can prevent runtime errors and be more productive by making sure your ABIs and Typed Data definitions are set up appropriately. 🎉\n\n```ts twoslash\n// @twoslash-cache: {\"v\":1,\"hash\":\"0a7ec06948f56913d5c1a0817fa61f890c5a7843c9839243ebabed5019be8a0e\",\"data\":\"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\"}\n// @errors: 2820\nconst erc721Abi = [\n  {\n    name: 'balanceOf',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [{ type: 'address', name: 'owner' }],\n    outputs: [{ type: 'uint256' }],\n  },\n  {\n    name: 'isApprovedForAll',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [\n      { type: 'address', name: 'owner' },\n      { type: 'address', name: 'operator' },\n    ],\n    outputs: [{ type: 'bool' }],\n  },\n  {\n    name: 'getApproved',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [{ type: 'uint256', name: 'tokenId' }],\n    outputs: [{ type: 'address' }],\n  },\n  {\n    name: 'ownerOf',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [{ type: 'uint256', name: 'tokenId' }],\n    outputs: [{ type: 'address' }],\n  },\n  {\n    name: 'tokenURI',\n    type: 'function',\n    stateMutability: 'pure',\n    inputs: [{ type: 'uint256', name: 'tokenId' }],\n    outputs: [{ type: 'string' }],\n  },\n] as const\n// ---cut---\nimport { useReadContract } from 'wagmi'\n\nuseReadContract({\n  abi: erc721Abi,\n  functionName: 'balanecOf',\n})\n```\n\n## Configure Internal Types\n\nFor advanced use-cases, you may want to configure Wagmi's internal types. Most of Wagmi's types relating to ABIs and EIP-712 Typed Data are powered by [ABIType](https://github.com/wevm/abitype). See the [ABIType docs](https://abitype.dev) for more info on how to configure types.\n"
  },
  {
    "path": "site/react/why.md",
    "content": "# Why Wagmi\n\n## The Problems\n\nBuilding Ethereum applications is hard. Apps need to support connecting wallets, multiple chains, signing messages and data, sending transactions, listening for events and state changes, refreshing stale blockchain data, and much more. This is all on top of solving for app-specific use-cases and providing polished user experiences.\n\nThe ecosystem is also continuously evolving, meaning you need to adapt to new improvements or get left behind. App developers should not need to worry about connecting tens of different wallets, the intricacies of multi-chain support, typos accidentally sending an order of magnitude more ETH or calling a misspelled contract function, or accidentally spamming their RPC provider, costing thousands in compute units.\n\nWagmi solves all these problems and more — allowing app developers to focus on building high-quality and performant experiences for Ethereum — by focusing on **developer experience**, **performance**, **feature coverage**, and **stability.**\n\n## Developer Experience\n\nWagmi delivers a great developer experience through modular and composable APIs, automatic type safety and inference, and comprehensive documentation.\n\nIt provides developers with intuitive building blocks to build their Ethereum apps. While Wagmi's APIs might seem more verbose at first, it makes Wagmi's modular building blocks extremely flexible. Easy to move around, change, and remove. It also allows developers to better understand Ethereum concepts as well as understand _what_ and _why_ certain properties are being passed through. Learning how to use Wagmi is a great way to learn how to interact with Ethereum in general.\n\nWagmi also provides [strongly typed APIs](/react/typescript), allowing consumers to get the best possible experience through [autocomplete](https://twitter.com/awkweb/status/1555678944770367493), [type inference](https://twitter.com/jakemoxey/status/1570244174502588417?s=20), as well as static validation. You often just need to provide an ABI and Wagmi can help you autocomplete your way to success, identify type errors before your users do, drill into blockchain errors [at compile and runtimes](/react/guides/error-handling) with surgical precision, and much more.\n\nThe API documentation is comprehensive and contains usage info for _every_ module in Wagmi. The core team uses a [documentation](https://gist.github.com/zsup/9434452) and [test driven](https://en.wikipedia.org/wiki/Test-driven_development#:~:text=Test%2Ddriven%20development%20(TDD),software%20against%20all%20test%20cases.) development approach to building modules, which leads to predictable and stable APIs.\n\n## Performance\n\nPerformance is critical for applications on all sizes. Slow page load and interactions can cause users to stop using applications. Wagmi uses and is built by the same team behind [Viem](https://viem.sh), the most performant production-ready Ethereum library.\n\nEnd users should not be required to download a module of over 100kB in order to interact with Ethereum. Wagmi is optimized for tree-shaking and dead-code elimination, allowing apps to minimize bundle size for fast page load times. \n\nData layer performance is also critical. Slow, unnecessary, and manual data fetching can make apps unusable and cost thousands in RPC compute units. Wagmi supports caching, deduplication, persistence, and much more through [TanStack Query](/react/guides/tanstack-query).\n\n## Feature Coverage\n\nWagmi supports the most popular and commonly-used Ethereum features out of the box with 40+ React Hooks for accounts, wallets, contracts, transactions, signing, ENS, and more. Wagmi also supports just about any wallet out there through official [connectors](/react/api/connectors), [EIP-6963 support](/react/api/createConfig#multiinjectedproviderdiscovery), and [extensible API](/dev/creating-connectors).\n\nIf you need lower-level control, you can always drop down to [Wagmi Core](/core/getting-started) or [Viem](https://viem.sh), which Wagmi uses internally to perform blockchain operations. Wagmi also manages multi-chain support automatically so developers can focus on their applications instead of adding custom code.\n\nFinally, Wagmi has a [CLI](/cli/getting-started) to manage ABIs as well as a robust ecosystem of third-party libraries, like [ConnectKit](https://docs.family.co/connectkit), [Dynamic](https://www.dynamic.xyz), [Privy](https://privy.io), and many more, so you can get started quickly without needing to build everything from scratch.\n\n## Stability\n\nStability is a fundamental principle for Wagmi. Many organizations, large and small, rely heavily on Wagmi and expect it to be entirely stable for their users and applications.\n\nWagmi's test suite runs against forked Ethereum nodes to make sure functions work across chains. The test suite also runs type tests against many different versions of peer dependencies, like TypeScript, to ensure compatibility with the latest releases of other popular software.\n\nWagmi follows semver so developers can upgrade between versions with confidence. Starting with Wagmi v2, new functionality will be opt-in with old functionality being deprecated alongside the new features. This means upgrading to the latest major versions will not require immediate changes.\n\nLastly, the core team works full-time on Wagmi and [related projects](https://github.com/wevm), and is constantly improving Wagmi and keeping it up-to-date with industry trends and changes.\n\n"
  },
  {
    "path": "site/shared/connectors/baseAccount.md",
    "content": "<!-- <script setup>\nconst packageName = 'wagmi'\nconst connectorsPackageName = 'wagmi/connectors'\nconst connectorDependencyVersion = 'x.y.z'\n</script> -->\n\n# baseAccount\n\nConnector for the [Base Account SDK](https://github.com/base/account-sdk).\n\n## Import\n\n```ts-vue\nimport { baseAccount } from '{{connectorsPackageName}}'\n```\n\n## Install\n\n<PackageMetadata package=\"@base-org/account\" repo=\"base/account-sdk\" isOsiLicense licenseUrl=\"https://github.com/base/account-sdk/blob/master/packages/account-sdk/LICENSE\" />\n\n::: code-group\n```bash-vue [pnpm]\npnpm add @base-org/account@{{connectorDependencyVersion}}\n```\n\n```bash-vue [npm]\nnpm install @base-org/account@{{connectorDependencyVersion}}\n```\n\n```bash-vue [yarn]\nyarn add @base-org/account@{{connectorDependencyVersion}}\n```\n\n```bash-vue [bun]\nbun add @base-org/account@{{connectorDependencyVersion}}\n```\n:::\n\n## Usage\n\n```ts-vue\nimport { createConfig, http } from '{{packageName}}'\nimport { mainnet, sepolia } from '{{packageName}}/chains'\nimport { baseAccount } from '{{connectorsPackageName}}' // [!code hl]\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  connectors: [baseAccount()], // [!code hl]\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n```\n\n:::warning\nBefore going to production, it is highly recommended to set an [`appName`](#appname) and [`appLogoUrl`](#applogourl) for your application that can be displayed upon connection to the wallet.\n:::\n\n## Parameters\n\n```ts-vue\nimport { type baseAccountParameters } from '{{connectorsPackageName}}'\n```\n\nCheck out the [Base Account SDK docs](https://www.base.org/build/base-account) for more info.\n\n### appName\n\n`string`\n\nApplication name.\n\n```ts-vue\nimport { baseAccount } from '{{connectorsPackageName}}'\n\nconst connector = baseAccount({\n  appName: 'My Wagmi App', // [!code focus]\n})\n```\n\n### appLogoUrl\n\n`string | null | undefined`\n\nApplication logo image URL; favicon is used if unspecified.\n\n```ts-vue\nimport { baseAccount } from '{{connectorsPackageName}}'\n\nconst connector = baseAccount({\n  appName: 'My Wagmi App',\n  appLogoUrl: 'https://example.com/myLogoUrl.png', // [!code focus]\n})\n```\n\n"
  },
  {
    "path": "site/shared/connectors/coinbaseWallet.md",
    "content": "<!-- <script setup>\nconst packageName = 'wagmi'\nconst connectorsPackageName = 'wagmi/connectors'\nconst connectorDependencyVersion = 'x.y.z'\n</script> -->\n\n# coinbaseWallet\n\nConnector for the [Coinbase Wallet SDK](https://github.com/coinbase/coinbase-wallet-sdk).\n\n## Import\n\n```ts-vue\nimport { coinbaseWallet } from '{{connectorsPackageName}}'\n```\n\n## Install\n\n<PackageMetadata package=\"@coinbase/wallet-sdk\" repo=\"coinbase/coinbase-wallet-sdk\" isOsiLicense licenseUrl=\"https://github.com/coinbase/coinbase-wallet-sdk/blob/master/packages/wallet-sdk/LICENSE\" />\n\n::: code-group\n```bash-vue [pnpm]\npnpm add @coinbase/wallet-sdk@{{connectorDependencyVersion}}\n```\n\n```bash-vue [npm]\nnpm install @coinbase/wallet-sdk@{{connectorDependencyVersion}}\n```\n\n```bash-vue [yarn]\nyarn add @coinbase/wallet-sdk@{{connectorDependencyVersion}}\n```\n\n```bash-vue [bun]\nbun add @coinbase/wallet-sdk@{{connectorDependencyVersion}}\n```\n:::\n\n## Usage\n\n```ts-vue\nimport { createConfig, http } from '{{packageName}}'\nimport { mainnet, sepolia } from '{{packageName}}/chains'\nimport { coinbaseWallet } from '{{connectorsPackageName}}' // [!code hl]\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  connectors: [coinbaseWallet()], // [!code hl]\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n```\n\n:::warning\nBefore going to production, it is highly recommended to set an [`appName`](#appname) and [`appLogoUrl`](#applogourl) for your application that can be displayed upon connection to the wallet.\n:::\n\n## Parameters\n\n```ts-vue\nimport { type CoinbaseWalletParameters } from '{{connectorsPackageName}}'\n```\n\nCheck out the [Coinbase Wallet SDK docs](https://github.com/coinbase/coinbase-wallet-sdk) for more info.\n\n### appName\n\n`string`\n\nApplication name.\n\n```ts-vue\nimport { coinbaseWallet } from '{{connectorsPackageName}}'\n\nconst connector = coinbaseWallet({\n  appName: 'My Wagmi App', // [!code focus]\n})\n```\n\n### appLogoUrl\n\n`string | null | undefined`\n\nApplication logo image URL; favicon is used if unspecified.\n\n```ts-vue\nimport { coinbaseWallet } from '{{connectorsPackageName}}'\n\nconst connector = coinbaseWallet({\n  appName: 'My Wagmi App',\n  appLogoUrl: 'https://example.com/myLogoUrl.png', // [!code focus]\n})\n```\n\n### preference <Badge text=\">=2.9.0\" />\n\nPreference for the type of wallet to display.\n\n```ts-vue\nimport { coinbaseWallet } from '{{connectorsPackageName}}'\n\nconst connector = coinbaseWallet({\n  appName: 'My Wagmi App',\n  preference: { // [!code focus]\n    options: 'smartWalletOnly' // [!code focus]\n  }, // [!code focus]\n})\n```\n\n#### attribution <Badge text=\">=2.12.33\" />\n\n`` { auto?: boolean | undefined; dataSuffix?: `0x${string}` | undefined } ``\n\nThis option only applies to Coinbase Smart Wallet. When a valid data suffix is supplied, it is appended to the `initCode` and `executeBatch` calldata. Coinbase Smart Wallet expects a 16 byte hex string. If the data suffix is not a 16 byte hex string, the Smart Wallet will ignore the property. If auto is true, the Smart Wallet will generate a 16 byte hex string from the apps origin.\n\n#### keysUrl <Badge text=\">=2.12.33\" />\n\n`string`\n\n- The URL for the keys popup.\n- By default, `https://keys.coinbase.com/connect` is used for production. Use `https://keys-dev.coinbase.com/connect` for development environments.\n\n#### options <Badge text=\">=2.12.33\" />\n\n`\"all\" | \"eoaOnly\" | \"smartWalletOnly\"`\n\nPreference for the type of wallet to display.\n\n- `'eoaOnly'`: Uses EOA Browser Extension or Mobile Coinbase Wallet.\n- `'smartWalletOnly'`: Displays Smart Wallet popup.\n- `'all'` (default): Supports both `'eoaOnly'` and `'smartWalletOnly'` based on context.\n\n"
  },
  {
    "path": "site/shared/connectors/injected.md",
    "content": "<!-- <script setup>\nconst docsPath = 'react'\nconst packageName = 'wagmi'\nconst connectorsPackageName = 'wagmi/connectors'\n</script> -->\n\n# injected\n\nConnector for [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193) Ethereum Providers.\n\n## Import\n\n```ts-vue\nimport { injected } from '{{connectorsPackageName}}'\n```\n\n## Usage\n\n```ts-vue{3,7}\nimport { createConfig, http } from '{{packageName}}'\nimport { mainnet, sepolia } from '{{packageName}}/chains'\nimport { injected } from '{{connectorsPackageName}}'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  connectors: [injected()],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n```\n\n## Parameters\n\n```ts-vue\nimport { type InjectedParameters } from '{{connectorsPackageName}}'\n```\n\n### shimDisconnect\n\n`boolean | undefined`\n\n- MetaMask and other injected providers do not support programmatic disconnect.\n- This flag simulates the disconnect behavior by keeping track of connection status in storage. See [GitHub issue](https://github.com/MetaMask/metamask-extension/issues/10353) for more info.\n- Defaults to `true`.\n\n```ts-vue\nimport { injected } from '{{connectorsPackageName}}'\n\nconst connector = injected({\n  shimDisconnect: false, // [!code focus]\n})\n```\n\n### target\n\n`TargetId | (TargetMap[TargetId] & { id: string }) | (() => (TargetMap[TargetId] & { id: string }) | undefined) | undefined`\n\n- [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193) Ethereum Provider to target.\n- [EIP-6963](https://eips.ethereum.org/EIPS/eip-6963) supported via `createConfig`'s <a :href=\"`/${docsPath}/api/createConfig#multiinjectedproviderdiscovery`\">`multiInjectedProviderDiscovery`</a> property.\n\n```ts-vue\nimport { injected } from '{{connectorsPackageName}}'\n\nconst connector = injected({\n  target() { // [!code focus]\n    return { // [!code focus]\n      id: 'windowProvider', // [!code focus]\n      name: 'Window Provider', // [!code focus]\n      provider: window.ethereum, // [!code focus]\n    } // [!code focus]\n  }, // [!code focus]\n})\n```\n\n### unstable_shimAsyncInject\n\n`boolean | number | undefined`\n\nWatches for async provider injection via the `ethereum#initialized` event. When `true`, defaults to `1_000` milliseconds. Otherwise, uses a provided value of milliseconds.\n\n```ts-vue\nimport { injected } from '{{connectorsPackageName}}'\n\nconst connector = injected({\n  unstable_shimAsyncInject: 2_000, // [!code focus]\n})\n```\n"
  },
  {
    "path": "site/shared/connectors/metaMask.md",
    "content": "<!-- <script setup>\nconst packageName = 'wagmi'\nconst connectorsPackageName = 'wagmi/connectors'\nconst connectorDependencyVersion = 'x.y.z'\n</script> -->\n\n# metaMask\n\nConnector for [MetaMask Connect](https://github.com/MetaMask/connect-monorepo).\n\n## Import\n\n```ts-vue\nimport { metaMask } from '{{connectorsPackageName}}'\n```\n\n## Install\n\n<PackageMetadata package=\"@metamask/connect-evm\" repo=\"MetaMask/connect-monorepo\" isOsiLicense licenseUrl=\"https://github.com/MetaMask/connect-monorepo/blob/main/packages/connect-evm/LICENSE\" />\n\n::: code-group\n```bash-vue [pnpm]\npnpm add @metamask/connect-evm@{{connectorDependencyVersion}}\n```\n\n```bash-vue [npm]\nnpm install @metamask/connect-evm@{{connectorDependencyVersion}}\n```\n\n```bash-vue [yarn]\nyarn add @metamask/connect-evm@{{connectorDependencyVersion}}\n```\n\n```bash-vue [bun]\nbun add @metamask/connect-evm@{{connectorDependencyVersion}}\n```\n:::\n\n## Usage\n\n```ts-vue{3,7}\nimport { createConfig, http } from '{{packageName}}'\nimport { mainnet, sepolia } from '{{packageName}}/chains'\nimport { metaMask } from '{{connectorsPackageName}}'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  connectors: [metaMask()],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n```\n\n## Parameters\n\n```ts-vue\nimport { type MetaMaskParameters } from '{{connectorsPackageName}}'\n```\n\nCheck out the [MetaMask Connect docs](https://docs.metamask.io/wallet/connect/3rd-party-libraries/wagmi/) for more info. A few options are omitted that Wagmi manages internally.\n\n### dapp\n\n`DappMetadata | undefined`\n\nMetadata is used to fill details for the UX on confirmation screens in MetaMask, including the following fields:\n\n- `name`: `string` - The name of the dapp.\n- `url`: `string` - URL of the dapp (defaults to `window.location.origin`).\n- `iconUrl`: `string` - URL to the dapp's favicon or icon.\n\nDefaults to `{ name: window.location.hostname }`.\n\n```ts-vue\nimport { metaMask } from '{{connectorsPackageName}}'\n\nconst connector = metaMask({\n  dapp: { // [!code focus]\n    name: 'My Wagmi App', // [!code focus]\n    url: 'https://example.com', // [!code focus]\n    iconUrl: 'https://example.com/favicon.ico', // [!code focus]\n  }\n})\n```\n\n### debug\n\n`boolean | undefined`\n\nEnables debug mode for the MetaMask SDK. When enabled, provides additional logging and debugging information.\n\n```ts-vue\nimport { metaMask } from '{{connectorsPackageName}}'\n\nconst connector = metaMask({\n  debug: true // [!code focus]\n})\n```\n\n### connectAndSign\n\n`string | undefined`\n\nShortcut to connect and sign a message in a single operation. When provided, the connector will connect to MetaMask and immediately prompt the user to sign the specified message.\n\nThis parameter is mutually exclusive with `connectWith` - only one can be used at a time.\n\n```ts-vue\nimport { metaMask } from '{{connectorsPackageName}}'\n\nconst connector = metaMask({\n  connectAndSign: 'Sign this message to connect', // [!code focus]\n})\n```\n\n### connectWith\n\n`{ method: string; params: unknown[] } | undefined`\n\nAllows connecting with any RPC method. When provided, the connector will connect to MetaMask and immediately call the specified RPC method with the given parameters.\n\nThis parameter is mutually exclusive with `connectAndSign` - only one can be used at a time.\n\n```ts-vue\nimport { metaMask } from '{{connectorsPackageName}}'\n\nconst connector = metaMask({\n  connectWith: { // [!code focus]\n    method: 'eth_requestAccounts', // [!code focus]\n    params: [], // [!code focus]\n  }\n})\n```\n\n## Advanced\n\nBy default, if the EIP-6963 MetaMask injected provider is detected, this connector will replace it.\n\nEIP-6963 defines a standard way for dapps to interact with multiple wallets simultaneously by injecting providers into the browser. Wallets that implement this standard can make their presence known to dapps in a consistent and predictable manner.\n\n\nSee the [`rdns` property](https://wagmi.sh/dev/creating-connectors#properties) for more information.\n"
  },
  {
    "path": "site/shared/connectors/mock.md",
    "content": "<!-- <script setup>\nconst packageName = 'wagmi'\nconst connectorsPackageName = 'wagmi/connectors'\n</script> -->\n\n# mock\n\nConnector for mocking Wagmi functionality.\n\n## Import\n\n```ts-vue\nimport { mock } from '{{connectorsPackageName}}'\n```\n\n## Usage\n\n```ts-vue{3,8-14}\nimport { createConfig, http } from '{{packageName}}'\nimport { mainnet, sepolia } from '{{packageName}}/chains'\nimport { mock } from '{{connectorsPackageName}}'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  connectors: [\n    mock({\n      accounts: [\n        '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',\n        '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n        '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC',\n      ],\n    }),\n  ],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n```\n\n## Parameters\n\n```ts-vue\nimport { type MockParameters } from '{{connectorsPackageName}}'\n```\n\n### accounts\n\n`readonly [Address, ...Address[]]`\n\nAccounts to use with the connector.\n\n```ts-vue\nimport { mock } from '{{connectorsPackageName}}'\n\nconst connector = mock({\n  accounts: [ // [!code focus]\n    '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', // [!code focus]\n    '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', // [!code focus]\n    '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC', // [!code focus]\n    '0x90F79bf6EB2c4f870365E785982E1f101E93b906', // [!code focus]\n    '0x15d34aaf54267db7d7c367839aaf71a00a2c6a65', // [!code focus]\n    '0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc', // [!code focus]\n    '0x976EA74026E726554dB657fA54763abd0C3a0aa9', // [!code focus]\n    '0x14dC79964da2C08b23698B3D3cc7Ca32193d9955', // [!code focus]\n    '0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f', // [!code focus]\n    '0xa0Ee7A142d267C1f36714E4a8F75612F20a79720', // [!code focus]\n  ], // [!code focus]\n})\n```\n\n### features\n\n`{ connectError?: boolean | Error | undefined; reconnect?: boolean | undefined; signMessageError?: boolean | Error | undefined; signTypedDataError?: boolean | Error | undefined; switchChainError?: boolean | Error | undefined; } | undefined`\n\nFeature flags that change behavior of Wagmi internals.\n\n```ts-vue\nimport { mock } from '{{connectorsPackageName}}'\nimport { UserRejectedRequestError } from 'viem'\n\nconst connector = mock({\n  accounts: [\n    '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',\n    '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n    '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC',\n  ],\n  features: { // [!code focus]\n    connectError: new UserRejectedRequestError(new Error('Failed to connect.')), // [!code focus]\n    reconnect: false, // [!code focus]\n  }, // [!code focus]\n})\n```\n#### defaultConnected\n\n`boolean | undefined`\n\nWhether the connector is connected by default.\n\n#### connectError\n\n`boolean | Error | undefined`\n\nWhether to throw an error when `connector.connect` is called.\n\n#### reconnect\n\n`boolean | undefined`\n\nEnables reconnecting to connector.\n\n#### signMessageError\n\n`boolean | Error | undefined`\n\nWhether to throw an error when `'personal_sign'` is called.\n\n#### signTypedDataError\n\n`boolean | Error | undefined`\n\nWhether to throw an error when `'eth_signTypedData_v4'` is called.\n\n#### switchChainError\n\n`boolean | Error | undefined`\n\nWhether to throw an error when `connector.switchChain` is called.\n"
  },
  {
    "path": "site/shared/connectors/porto.md",
    "content": "<!-- <script setup>\nconst packageName = 'wagmi'\nconst connectorsPackageName = 'wagmi/connectors'\nconst connectorDependencyVersion = 'x.y.z'\n</script> -->\n\n# porto\n\nConnector for [Porto](https://porto.sh).\n\n## Import\n\n```ts-vue\nimport { porto } from '{{connectorsPackageName}}'\n```\n\n## Install\n\n<PackageMetadata package=\"porto\" repo=\"ithacaxyz/porto\" isOsiLicense licenseUrl=\"https://github.com/ithacaxyz/porto/blob/main/LICENSE-MIT\" />\n\n::: code-group\n```bash-vue [pnpm]\npnpm add porto@{{connectorDependencyVersion}}\n```\n\n```bash-vue [npm]\nnpm install porto@{{connectorDependencyVersion}}\n```\n\n```bash-vue [yarn]\nyarn add porto@{{connectorDependencyVersion}}\n```\n\n```bash-vue [bun]\nbun add porto@{{connectorDependencyVersion}}\n```\n:::\n\n## Usage\n\n```ts-vue\nimport { createConfig, http } from '{{packageName}}'\nimport { mainnet, sepolia } from '{{packageName}}/chains'\nimport { porto } from '{{connectorsPackageName}}' // [!code hl]\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  connectors: [porto()], // [!code hl]\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n```\n\n## Parameters\n\n```ts-vue\nimport { type PortoParameters } from '{{connectorsPackageName}}'\n```\n\nSee [`Porto.create` Parameters](https://porto.sh/sdk/api/porto/create#parameters)\n"
  },
  {
    "path": "site/shared/connectors/safe.md",
    "content": "<!-- <script setup>\nconst packageName = 'wagmi'\nconst connectorsPackageName = 'wagmi/connectors'\nconst connectorDependencyVersions = ['x.y.z', 'x.y.z']\n</script> -->\n\n# safe\n\nConnector for [Safe Apps SDK](https://github.com/safe-global/safe-apps-sdk).\n\n## Import\n\n```ts-vue\nimport { safe } from '{{connectorsPackageName}}'\n```\n\n## Install\n\n<PackageMetadata package=\"@safe-global/safe-apps-provider\" repo=\"safe-global/safe-apps-sdk/tree/main/packages/safe-apps-provider\" isOsiLicense showName licenseUrl=\"https://github.com/safe-global/safe-apps-sdk/blob/main/LICENSE.md\" />\n<PackageMetadata package=\"@safe-global/safe-apps-sdk\" repo=\"safe-global/safe-apps-sdk/tree/main/packages/safe-apps-sdk\" isOsiLicense showName licenseUrl=\"https://github.com/safe-global/safe-apps-sdk/blob/main/LICENSE.md\" />\n\n::: code-group\n```bash-vue [pnpm]\npnpm add @safe-global/safe-apps-provider@{{connectorDependencyVersions?.[0]}} @safe-global/safe-apps-sdk@{{connectorDependencyVersions?.[1]}}\n```\n\n```bash-vue [npm]\nnpm install @safe-global/safe-apps-provider@{{connectorDependencyVersions?.[0]}} @safe-global/safe-apps-sdk@{{connectorDependencyVersions?.[1]}}\n```\n\n```bash-vue [yarn]\nyarn add @safe-global/safe-apps-provider@{{connectorDependencyVersions?.[0]}} @safe-global/safe-apps-sdk@{{connectorDependencyVersions?.[1]}}\n```\n\n```bash-vue [bun]\nbun add @safe-global/safe-apps-provider@{{connectorDependencyVersions?.[0]}} @safe-global/safe-apps-sdk@{{connectorDependencyVersions?.[1]}}\n```\n:::\n\n## Usage\n\n```ts-vue{3,7}\nimport { createConfig, http } from '{{packageName}}'\nimport { mainnet, sepolia } from '{{packageName}}/chains'\nimport { safe } from '{{connectorsPackageName}}'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  connectors: [safe()],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n```\n\n## Parameters\n\n```ts-vue\nimport { type SafeParameters } from '{{connectorsPackageName}}'\n```\n\nCheck out the [Safe docs](https://github.com/safe-global/safe-apps-sdk/tree/main/packages/safe-apps-sdk) for more info.\n### allowedDomains\n\n`RegExp[] | undefined`\n\n```ts-vue\nimport { safe } from '{{connectorsPackageName}}'\n\nconst connector = safe({\n  allowedDomains: [/app.safe.global$/], // [!code focus]\n})\n```\n\n### debug\n\n`boolean | undefined`\n\n```ts-vue\nimport { safe } from '{{connectorsPackageName}}'\n\nconst connector = safe({\n  debug: true, // [!code focus]\n})\n```\n\n### shimDisconnect\n\n`boolean | undefined`\n\n- This flag simulates disconnect behavior by keeping track of connection status in storage.\n- Defaults to `false`.\n\n```ts-vue\nimport { safe } from '{{connectorsPackageName}}'\n\nconst connector = safe({\n  shimDisconnect: true, // [!code focus]\n})\n```\n"
  },
  {
    "path": "site/shared/connectors/walletConnect.md",
    "content": "<!-- <script setup>\nconst packageName = 'wagmi'\nconst connectorsPackageName = 'wagmi/connectors'\nconst connectorDependencyVersion = 'x.y.z'\n</script> -->\n\n# walletConnect\n\nConnector for [WalletConnect](https://walletconnect.com).\n\n## Import\n\n```ts-vue\nimport { walletConnect } from '{{connectorsPackageName}}'\n```\n\n## Install\n\n<PackageMetadata package=\"@walletconnect/ethereum-provider\" repo=\"WalletConnect/walletconnect-monorepo\" licenseUrl=\"https://github.com/WalletConnect/walletconnect-monorepo/blob/v2.0/providers/ethereum-provider/LICENSE.md\" />\n\n::: code-group\n```bash-vue [pnpm]\npnpm add @walletconnect/ethereum-provider@{{connectorDependencyVersion}}\n```\n\n```bash-vue [npm]\nnpm install @walletconnect/ethereum-provider@{{connectorDependencyVersion}}\n```\n\n```bash-vue [yarn]\nyarn add @walletconnect/ethereum-provider@{{connectorDependencyVersion}}\n```\n\n```bash-vue [bun]\nbun add @walletconnect/ethereum-provider@{{connectorDependencyVersion}}\n```\n:::\n\n## Usage\n\n```ts-vue{3,8-10}\nimport { createConfig, http } from '{{packageName}}'\nimport { mainnet, sepolia } from '{{packageName}}/chains'\nimport { walletConnect } from '{{connectorsPackageName}}'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  connectors: [\n    walletConnect({\n      projectId: '3fcc6bba6f1de962d911bb5b5c3dba68',\n    }),\n  ],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n```\n\n## Parameters\n\n```ts-vue\nimport { type WalletConnectParameters } from '{{connectorsPackageName}}'\n```\n\nCheck out the [WalletConnect docs](https://github.com/WalletConnect/walletconnect-monorepo/tree/v2.0/providers/ethereum-provider) for more info. A few options are omitted that Wagmi manages internally.\n\n### customStoragePrefix <Badge :text=\"`${packageName === '@wagmi/core' ? '@wagmi/connectors@>=5.1.8' : `${packageName}@>=${packageName === 'wagmi' ? '2.12.8' : packageName === '@wagmi/vue' ? '0.0.40' : ''}`}`\" />\n\n`string | undefined`\n\nCustom storage prefix for persisting provider state.\n\n```ts-vue\nimport { walletConnect } from '{{connectorsPackageName}}'\n\nconst connector = walletConnect({\n  customStoragePrefix: 'wagmi', // [!code focus]\n  projectId: '3fcc6bba6f1de962d911bb5b5c3dba68',\n})\n```\n\n### disableProviderPing\n\n`boolean | undefined`\n\n```ts-vue\nimport { walletConnect } from '{{connectorsPackageName}}'\n\nconst connector = walletConnect({\n  disableProviderPing: false, // [!code focus]\n  projectId: '3fcc6bba6f1de962d911bb5b5c3dba68',\n})\n```\n\n### isNewChainsStale\n\n`boolean | undefined`\n\n- If a new chain is added to a previously existing configured connector `chains`, this flag\nwill determine if that chain should be considered as stale. A stale chain is a chain that\nWalletConnect has yet to establish a relationship with (e.g. the user has not approved or\nrejected the chain).\n- Defaults to `true`.\n\n```ts-vue\nimport { walletConnect } from '{{connectorsPackageName}}'\n\nconst connector = walletConnect({\n  isNewChainsStale: true, // [!code focus]\n  projectId: '3fcc6bba6f1de962d911bb5b5c3dba68',\n})\n```\n\n::: details More info\nPreface: Whereas WalletConnect v1 supported dynamic chain switching, WalletConnect v2 requires\nthe user to pre-approve a set of chains up-front. This comes with consequent UX nuances (see below) when\na user tries to switch to a chain that they have not approved.\n\nThis flag mainly affects the behavior when a wallet does not support dynamic chain authorization\nwith WalletConnect v2.\n\nIf `true` (default), the new chain will be treated as a stale chain. If the user\nhas yet to establish a relationship (approved/rejected) with this chain in their WalletConnect\nsession, the connector will disconnect upon the dapp auto-connecting, and the user will have to\nreconnect to the dapp (revalidate the chain) in order to approve the newly added chain.\nThis is the default behavior to avoid an unexpected error upon switching chains which may\nbe a confusing user experience (e.g. the user will not know they have to reconnect\nunless the dapp handles these types of errors).\n\nIf `false`, the new chain will be treated as a validated chain. This means that if the user\nhas yet to establish a relationship with the chain in their WalletConnect session, wagmi will successfully\nauto-connect the user. This comes with the trade-off that the connector will throw an error\nwhen attempting to switch to the unapproved chain. This may be useful in cases where a dapp constantly\nmodifies their configured chains, and they do not want to disconnect the user upon\nauto-connecting. If the user decides to switch to the unapproved chain, it is important that the\ndapp handles this error and prompts the user to reconnect to the dapp in order to approve\nthe newly added chain.\n:::\n\n### metadata\n\n`CoreTypes.Metadata | undefined`\n\nMetadata related to the app requesting the connection.\n\n```ts-vue\nimport { walletConnect } from '{{connectorsPackageName}}'\n\nconst connector = walletConnect({\n  projectId: '3fcc6bba6f1de962d911bb5b5c3dba68',\n  metadata: { // [!code focus]\n    name: 'Example', // [!code focus]\n    description: 'Example website', // [!code focus]\n    url: 'https://example.com', // [!code focus]\n  }, // [!code focus]\n})\n```\n\n### projectId\n\n`string`\n\nWalletConnect Cloud project identifier. You can find your `projectId` on your [WalletConnect dashboard](https://cloud.reown.com/sign-in).\n\n```ts-vue\nimport { walletConnect } from '{{connectorsPackageName}}'\n\nconst connector = walletConnect({\n  projectId: '3fcc6bba6f1de962d911bb5b5c3dba68', // [!code focus]\n})\n```\n\n### qrModalOptions\n\n`QrModalOptions | undefined`\n\nOptions for rendering QR modal.\n\n```ts-vue\nimport { walletConnect } from '{{connectorsPackageName}}'\n\nconst connector = walletConnect({\n  projectId: '3fcc6bba6f1de962d911bb5b5c3dba68',\n  qrModalOptions: { // [!code focus]\n    themeMode: 'dark', // [!code focus]\n  }, // [!code focus]\n})\n```\n\n### relayUrl\n\n`string | undefined`\n\n- WalletConnect relay URL to use.\n- Defaults to `'wss://relay.walletconnect.com'`.\n\n```ts-vue\nimport { walletConnect } from '{{connectorsPackageName}}'\n\nconst connector = walletConnect({\n  projectId: '3fcc6bba6f1de962d911bb5b5c3dba68',\n  relayUrl: 'wss://relay.walletconnect.org', // [!code focus]\n})\n```\n\n### storageOptions\n\n`KeyValueStorageOptions | undefined`\n\n```ts-vue\nimport { walletConnect } from '{{connectorsPackageName}}'\n\nconst connector = walletConnect({\n  projectId: '3fcc6bba6f1de962d911bb5b5c3dba68',\n  storageOptions: {}, // [!code focus]\n})\n```\n\n### showQrModal\n\n`boolean | undefined`\n\n- Whether to show the QR code modal upon calling `connector.connect()`.\n- Defaults to `true`.\n\n```ts-vue\nimport { walletConnect } from '{{connectorsPackageName}}'\n\nconst connector = walletConnect({\n  projectId: '3fcc6bba6f1de962d911bb5b5c3dba68',\n  showQrModal: true, // [!code focus]\n})\n```\n\n::: tip\nThis can be disabled and you can listen for a `'message'` event with payload `{ type: 'display_uri'; data: string }` if you want to render your own QR code.\n:::\n"
  },
  {
    "path": "site/shared/create-chain.md",
    "content": "## Create Chain\n\nImport the `Chain` type from Viem and create a new object that is asserted `as const` and `satisfies` the type. You can also use the `defineChain` function from Viem.\n\n::: code-group\n```ts twoslash [as const satisfies Chain]\n// @twoslash-cache: {\"v\":1,\"hash\":\"b104f720769e0d28b42cc38edb3952d146e5b9902d8a7bead95767460071c100\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808AKAQwBsBLZuASgAJMcvAML5m7MAB4AZhFIBbZmhqk4vOjTBRVIsWABishUrKqAPrwCummFPEwovALzDR4g/MXKzl67bD2KXgBjCzg0CDk1ehhNVQAlGCDZKAkw0nEAc0CrAGtIAHcwAD5ecytYP3snXgSk0hS0zOywPIhCkrLfOygS52AAHTBeYd4AI1YIIJyAUVosCdITAH5EXgGhkc3kHJgMVcawDIBdVZ1xACEJqdn52TIAbkHNzYrmC1Y0U9cwS8mZuYWDyeIwAvqUfBVuo8NsMkmA0KRmEE0HAVrwAAqLJTsKQYCTrZ4jba7fYIzInFy6IQQeGI5HggmE57IOAQCykIIwACSUFWYAsclGZApZzA1NpSLQ4PKNihwMJYM6kP8UGhmzBADI1vLnjE4AkMuw0hg0aLxQjJdKuiq1Uy9QBVMDsEgqNgJVmsF2m77mulSpWym06zZyd5odhBNisADM3qpNIt9IDlVVOpBHQhgfstuGADp87wAJy8OR3Xj53M53hSGDwONuWtwaSGTwmK3K+wZmUp6EgwbsORYWRS0WUEBhZikBiIACMABYqKwYhk0PgkABWKhoScZGDTkCjxd2JAABioQVEfrISHnIIo6GwuEQBGI1636jwcLCJd0/k+axBMcJynJA5wADkXZdVyQAB2Lcdz3PAFHEP8xw4fwkAAJnPS9JWvWdozvB8cDwQgXTHGh6DwAQYGCGlvz6QCqGA6cADYFxAJdDmgxBN2oBD9y/BgjwwxBsJAC9Jzw8gxMLIjqEfPAyFIWQgO3EDEBgs9OKgtdEELc9oCfGdo1Y7TbC45g5CfEBxFgWhcxRMd2CgJTSFIABaEyzI8sCYI8wsKI/Z8ABVH14AByYAQQi3goAgeBeEgKU4EUI1cX4fBaLoHBkSqGjItFCLc2BMLBCimLeCNEsjTgTJMtomRWAmfJ6qwFScCndhEqkFTIgKiKitWFzAjAKyYFGtKSCEdlFjAIIMECUgsCCe1SFYBBIJIVg3JU8gRKfcTJKvGTo3XeSaNI199uoYKQBYDguD4ArRWbDxjBUKINC0Sk3BbD7vG7bpqlFdwjC8dssygQIQjCCIvpiH7amSVIyUOZpWnaSGU2qZH6lR9J0Z8THimx7pem1GExiuf5bkWFQ0UZQliT2XgDmOL5dF+a4ATuUgqxeGw3g+TmLhpm5AX5tMyaDKm4UTFE0UxPdw1xfFgyJHZWfZkUfQTP0GQ15nWXZTkeT5AUhVIXX4wlJNMx7I3eEVB25SpzVKaZNQwH1GBDWNesxX1y1kzdr2HSdF1UtYd0IE9MhA99EPXdlr3Qw+CMo1jUWg7t/0U+zNMu2tQuqYrIsSzLCsqxrOsc70Rs3vBttQ5VYuO1TMA+ydQdh1+sA1MnacwO0riVz0vj1N3fdD0448xJwqS8pkudzqOQzYDwAchynNZ+HC0VnerPrIqIbq5AiwZBhyvuhJ/FC92qaLeC4OifZStK4FsRLZ+s7ckFAOoPU7AaTUQQCCEEQA=\"}\n// @errors: 1360\nimport { type Chain } from 'viem'\n\nexport const mainnet = {} as const satisfies Chain\n```\n```ts twoslash [defineChain]\n// @twoslash-cache: {\"v\":1,\"hash\":\"51816265e78622b289e1e5f943b76d80bfbe0a867d81b51ec6327613f6e28499\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808AKAQwBsBLZuASgAIAzAK5gAxmnYQwvWP3ZgYAYXzM5AHn4RSAW2ZoapOLzo0wUQ0pVgAYpp16ycCrxGS4aZ8rlH6MU+c9g6ra6+nAAfGGMIgGIHpbcsQAKpDB67PwYqgCCcHDsAOaBFmrCMnIwUGFO0ZYRADpg7FpYmu5l8sVglCBuzKQMiACcVKy++Wj4SACMU1RoffmpeO2KAd0c8kgADFQ1pMxiZEiDAL4U6Ni4iATER3PGeC5gbrw6cvJoscANvL+8AEasCAiADWAFFaFggSkDAB+L4/P5I5AgmAYWJuUhyfIAXVinQAQkDQRCoZoyABuRFI34yZiCVifXiE4ngyHQynU3gnXgAH14pRgsnkUD5AtMQvKUCpUj+TzQ+zEcHhvG+sppvGQtAxCuxeOZAQUkgVB3c/LVGo1yDgEEEpBEMAAklBYmBBFp/mR9Z0jWATWIxYLhRUZZbuYGJcHpVykb44AAlGD5diYjAqn3GxVm8UraPqmlxgCqjRIBjYiZtrFL6cNmdNEdzoctWgZ4hEbFYAGYa5Zff7s0GpU3fjz+YORcPeOwXbw3R7OfmAHTL3gADle5N4y8Xk/4MHgPbkVn3cFU27CDclE4aJ26vX6SAALMMQKMwONJogAOxzBZLa5vGAHzrOUSAAEy7MoWZHIgUydmcFw4HghClt0ND0EwbCcDw0hXqsliqJ0NjaCEDhOJ0hEBMRdihBEUQxAaBFEcE9gGGECSqlygLAmyZIwsqCL5siqLorwmJ6viAREjxpIcqQk5InSraSZY0kkuy5LyVyo45nhopjpGQ5cvKWYCZxQl/FqOpYu+3q1n6WZihaYaWTadoOs6rrup6pB2b2dYBgZjYxn8OnjiGIW/HGibJqmh5gH2jlBXpCl/EWJYOOW8AQFWZDxYl9bJVGqW/C2jLsO2rBdvlAUDoZ175mF9URUuK6DBuKRbsuu4nvFx7wGey4XkVRlgCcDRNC0/S4cGnR3vMD6IAArC+b4ftMszUH+AwgCsc0jKBiAQSAeymjBYHwec1CXHgZCkJo819AMX6bWtEzgbs0BXBdj5LVQshvswWhXCAciwLQi5oAgVDTrdpCkAAtD9S0I6uq5I2hDzXFkpD5O6vjuBA/C8JgOC8AA5MAJzk1OhiQO4XB5IUzCAjAJMQLwWB9EDqRkLwRMk5cFMUcxJGseE5OLoiAAqQuU9TtOvCmeTviT+BsxoVUQAA7tinP3Tg/TsPAAj3Vogtk+TItUSxtHk7E05OGAPNO7o7AkAodopKIGBOKQWAiIWpCsNDr4wCQrBw/d5AHZsR2QdzhzkIgnZLScOKfbAeCTa0qozeUnThvwZsU0QxtaOTDQNHQU3uE8LyAR8vAALz5x0ASMFT3DdMD8xIKAxhxhIXTXFDIAnCcQA==\"}\n// @errors: 2345\nimport { defineChain } from 'viem'\n\nexport const mainnet = defineChain({})\n```\n:::\n\nNow, add the missing required properties to the object until the error goes away.\n\n::: code-group\n```ts twoslash [as const satisfies Chain]\n// @twoslash-cache: {\"v\":1,\"hash\":\"7eb538e5797ec32b451699fd0f71747694cdee2f09698daad95d805d237f68ce\",\"data\":\"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=\"}\nimport { type Chain } from 'viem'\n\nexport const mainnet = {\n  id: 1,\n  name: 'Ethereum',\n  nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n  rpcUrls: {\n    default: { http: ['https://eth.merkle.io'] },\n  },\n  blockExplorers: {\n    default: { name: 'Etherscan', url: 'https://etherscan.io' },\n  },\n  contracts: {\n    ensRegistry: {\n      address: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n    },\n    ensUniversalResolver: {\n      address: '0xE4Acdd618deED4e6d2f03b9bf62dc6118FC9A4da',\n      blockCreated: 16773775,\n    },\n    multicall3: {\n      address: '0xca11bde05977b3631167028862be2a173976ca11',\n      blockCreated: 14353601,\n    },\n  },\n} as const satisfies Chain\n```\n```ts twoslash [defineChain]\n// @twoslash-cache: {\"v\":1,\"hash\":\"9dd120cd705dc697124cfe3fa80116ed4046ca81c57ffb5daa2cfd0b2775f253\",\"data\":\"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\"}\nimport { defineChain } from 'viem'\n\nexport const mainnet = defineChain({\n  id: 1,\n  name: 'Ethereum',\n  nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n  rpcUrls: {\n    default: { http: ['https://eth.merkle.io'] },\n  },\n  blockExplorers: {\n    default: { name: 'Etherscan', url: 'https://etherscan.io' },\n  },\n  contracts: {\n    ensRegistry: {\n      address: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',\n    },\n    ensUniversalResolver: {\n      address: '0xE4Acdd618deED4e6d2f03b9bf62dc6118FC9A4da',\n      blockCreated: 16773775,\n    },\n    multicall3: {\n      address: '0xca11bde05977b3631167028862be2a173976ca11',\n      blockCreated: 14353601,\n    },\n  },\n})\n```\n:::\n\nThe more properties you add, the better the chain will be to use with Wagmi. Most of these attributes exist within the [`ethereum-lists/chains` repository](https://github.com/ethereum-lists/chains/tree/3fbd4eeac7ce116579634bd042b84e2b1d89886a/_data/chains).\n\n- `id`: The chain ID for the network. This can be found by typing the network name into [ChainList](https://chainlist.org). Example: \"Ethereum Mainnet\" has a Chain ID of `1`.\n- `name`: Human-readable name for the chain. Example: \"Ethereum Mainnet\"\n- `nativeCurrency`: The native currency of the chain. Found from [`ethereum-lists/chains`](https://github.com/ethereum-lists/chains/blob/3fbd4eeac7ce116579634bd042b84e2b1d89886a/_data/chains/eip155-56.json#L20-L24).\n- `rpcUrls`: At least one public, credible RPC URL. Found from [`ethereum-lists/chains`](https://github.com/ethereum-lists/chains/blob/3fbd4eeac7ce116579634bd042b84e2b1d89886a/_data/chains/eip155-56.json#L4-L18).\n- `blockExplorers`: A set of block explorers for the chain. Found from [`ethereum-lists/chains`](https://github.com/ethereum-lists/chains/blob/3fbd4eeac7ce116579634bd042b84e2b1d89886a/_data/chains/eip155-56.json#L30-L36).\n- `contracts`: A set of deployed contracts for the chain. If you are deploying one of the following contracts yourself, make sure it is verified.\n  - `multicall3` is optional, but it's address is most likely `0xca11bde05977b3631167028862be2a173976ca11` – you can find the deployed block number on the block explorer. Check out [`mds1/multicall`](https://github.com/mds1/multicall#multicall3-contract-addresses) for more info.\n  - `ensRegistry` is optional – not all Chains have a ENS Registry. See [ENS Deployments](https://docs.ens.domains/ens-deployments) for more info.\n  - `ensUniversalResolver` is optional – not all Chains have a ENS Universal Resolver.\n- `sourceId`: Source Chain ID (e.g. the L1 chain).\n- `testnet`: Whether or not the chain is a testnet."
  },
  {
    "path": "site/shared/createConfig.md",
    "content": "<!--\n<script setup>\nconst docsPath = 'react'\nconst packageName = 'wagmi'\nconst connectorsPackageName = 'wagmi/connectors'\n</script>\n-->\n\n# createConfig\n\nCreates new [`Config`](#config) object.\n\n## Import\n\n```ts-vue\nimport { createConfig } from '{{packageName}}'\n```\n\n## Usage\n\n```ts-vue\nimport { createConfig, http } from '{{packageName}}'\nimport { mainnet, sepolia } from '{{packageName}}/chains'\n\nconst config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http('https://mainnet.example.com'),\n    [sepolia.id]: http('https://sepolia.example.com'),\n  },\n})\n```\n\n::: tip Integrating a Viem Client\n\nInstead of using [`transports`](#transports), it's possible to provide a function that returns a Viem [`Client`](https://viem.sh/docs/clients/custom) via the [`client`](#client) property for more fine-grained control over Wagmi's internal `Client` creation.\n\n```ts-vue {3,7-9}\nimport { createConfig, http } from '{{packageName}}'\nimport { mainnet, sepolia } from '{{packageName}}/chains'\nimport { createClient } from 'viem'\n\nconst config = createConfig({\n  chains: [mainnet, sepolia],\n  client({ chain }) {\n    return createClient({ chain, transport: http() })\n  },\n})\n```\n:::\n\n## Parameters\n\n```ts-vue\nimport { type CreateConfigParameters } from '{{packageName}}'\n```\n\n### chains\n\n`readonly [Chain, ...Chain[]]`\n\n- Chains used by the `Config`.\n- See <a :href=\"`/${docsPath}/api/chains`\">Chains</a> for more details about built-in chains and the `Chain` type.\n\n```ts-vue\nimport { createConfig, http } from '{{packageName}}'\nimport { mainnet, sepolia } from '{{packageName}}/chains'\n\nconst config = createConfig({\n  chains: [mainnet, sepolia], // [!code focus]\n  transports: {\n    [mainnet.id]: http('https://mainnet.example.com'),\n    [sepolia.id]: http('https://sepolia.example.com'),\n  },\n})\n```\n\n### connectors\n\n`CreateConnectorFn[] | undefined`\n\n<a :href=\"`/${docsPath}/api/connectors`\">Connectors</a> used by the `Config`.\n\n```ts-vue\nimport { createConfig, http } from '{{packageName}}'\nimport { mainnet, sepolia } from '{{packageName}}/chains'\nimport { injected } from '{{connectorsPackageName}}' // [!code focus]\n\nconst config = createConfig({\n  chains: [mainnet, sepolia],\n  connectors: [injected()], // [!code focus]\n  transports: {\n    [mainnet.id]: http('https://mainnet.example.com'),\n    [sepolia.id]: http('https://sepolia.example.com'),\n  },\n})\n```\n\n### multiInjectedProviderDiscovery\n\n`boolean | undefined`\n\n- Enables discovery of injected providers via [EIP-6963](https://eips.ethereum.org/EIPS/eip-6963) using the [`mipd`](https://github.com/wevm/mipd) library and converting to <a :href=\"`/${docsPath}/api/connectors/injected`\">injected</a> connectors.\n- Defaults to `true`.\n\n```ts-vue\nimport { createConfig, http } from '{{packageName}}'\nimport { mainnet, sepolia } from '{{packageName}}/chains'\n\nconst config = createConfig({\n  chains: [mainnet, sepolia],\n  multiInjectedProviderDiscovery: false, // [!code focus]\n  transports: {\n    [mainnet.id]: http('https://mainnet.example.com'),\n    [sepolia.id]: http('https://sepolia.example.com'),\n  },\n})\n```\n\n### ssr\n\n`boolean | undefined`\n\nFlag to indicate if the config is being used in a server-side rendering environment. Defaults to `false`.\n\n```ts-vue\nimport { createConfig, http } from '{{packageName}}' // [!code focus]\nimport { mainnet, sepolia } from '{{packageName}}/chains'\n\nconst config = createConfig({\n  chains: [mainnet, sepolia],\n  ssr: true, // [!code focus]\n  transports: {\n    [mainnet.id]: http('https://mainnet.example.com'),\n    [sepolia.id]: http('https://sepolia.example.com'),\n  },\n})\n```\n\n### storage\n\n`Storage | null | undefined`\n\n- <a :href=\"`/${docsPath}/api/createStorage#storage`\">`Storage`</a> used by the config. Persists `Config`'s [`State`](#state-1) between sessions.\n- Defaults to `createStorage({ storage: typeof window !== 'undefined' && window.localStorage ? window.localStorage : noopStorage })`.\n\n```ts-vue\nimport { createConfig, createStorage, http } from '{{packageName}}' // [!code focus]\nimport { mainnet, sepolia } from '{{packageName}}/chains'\n\nconst config = createConfig({\n  chains: [mainnet, sepolia],\n  storage: createStorage({ storage: window.localStorage }), // [!code focus]\n  transports: {\n    [mainnet.id]: http('https://mainnet.example.com'),\n    [sepolia.id]: http('https://sepolia.example.com'),\n  },\n})\n```\n\n### syncConnectedChain\n\n`boolean | undefined`\n\n- Keep the [`State['chainId']`](#chainid) in sync with the current connection.\n- Defaults to `true`.\n\n```ts-vue\nimport { createConfig, http } from '{{packageName}}'\nimport { mainnet, sepolia } from '{{packageName}}/chains'\n\nconst config = createConfig({\n  chains: [mainnet, sepolia],\n  syncConnectedChain: false, // [!code focus]\n  transports: {\n    [mainnet.id]: http('https://mainnet.example.com'),\n    [sepolia.id]: http('https://sepolia.example.com'),\n  },\n})\n```\n\n---\n\n### batch\n\n`{ multicall?: boolean | { batchSize?: number | undefined; wait?: number | undefined } | undefined } | { [_ in chains[number][\"id\"]]?: { multicall?: boolean | { batchSize?: number | undefined; wait?: number | undefined } | undefined } | undefined } | undefined`\n\n- Batch settings. See [Viem docs](https://viem.sh/docs/clients/custom#batch-optional) for more info.\n- Defaults to `{ multicall: true }`.\n\n```ts-vue\nimport { createConfig, http } from '{{packageName}}'\nimport { mainnet, sepolia } from '{{packageName}}/chains'\n\nconst config = createConfig({\n  chains: [mainnet, sepolia],\n  batch: { multicall: true }, // [!code focus]\n  transports: {\n    [mainnet.id]: http('https://mainnet.example.com'),\n    [sepolia.id]: http('https://sepolia.example.com'),\n  },\n})\n```\n\n### cacheTime\n\n`number | { [_ in chains[number]['id']]?: number | undefined } | undefined`\n\n- Frequency in milliseconds for polling enabled features. See [Viem docs](https://viem.sh/docs/clients/public#cachetime-optional) for more info.\n- Defaults to [`pollingInterval`](#pollinginterval) or `4_000`.\n\n```ts-vue\nimport { createConfig, http } from '{{packageName}}'\nimport { mainnet, sepolia } from '{{packageName}}/chains'\n\nconst config = createConfig({\n  chains: [mainnet, sepolia],\n  cacheTime: 4_000, // [!code focus]\n  transports: {\n    [mainnet.id]: http('https://mainnet.example.com'),\n    [sepolia.id]: http('https://sepolia.example.com'),\n  },\n})\n```\n\n### pollingInterval\n\n`number | { [_ in chains[number]['id']]?: number | undefined } | undefined`\n\n- Frequency in milliseconds for polling enabled features. See [Viem docs](https://viem.sh/docs/clients/custom#pollinginterval-optional) for more info.\n- Defaults to `4_000`.\n\n```ts-vue\nimport { createConfig, http } from '{{packageName}}'\nimport { mainnet, sepolia } from '{{packageName}}/chains'\n\nconst config = createConfig({\n  chains: [mainnet, sepolia],\n  pollingInterval: 4_000, // [!code focus]\n  transports: {\n    [mainnet.id]: http('https://mainnet.example.com'),\n    [sepolia.id]: http('https://sepolia.example.com'),\n  },\n})\n```\n\n### transports\n\n`Record<chains[number]['id'], Transport>`\n\nMapping of [chain IDs](#chains) to <a :href=\"`/${docsPath}/api/transports`\">`Transport`</a>s. This mapping is used internally when creating chain-aware Viem [`Client`](https://viem.sh/docs/clients/custom) objects. See the <a :href=\"`/${docsPath}/api/transports`\">Transport docs</a> for more info.\n\n```ts-vue\nimport { createConfig, fallback, http } from '{{packageName}}' // [!code focus]\nimport { mainnet, sepolia } from '{{packageName}}/chains'\n\nconst config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: { // [!code focus]\n    [mainnet.id]: fallback([ // [!code focus]\n      http('https://...'), // [!code focus]\n      http('https://...'), // [!code focus]\n    ]), // [!code focus]\n    [sepolia.id]: http('https://...'), // [!code focus]\n  }, // [!code focus]\n})\n```\n\n---\n\n### client\n\n`(parameters: { chain: chains[number] }) => Client<Transport, chains[number]>`\n\nFunction for creating new Viem [`Client`](https://viem.sh/docs/clients/custom) to be used internally. Exposes more control over the internal `Client` creation logic versus using the [`transports`](#transports) property.\n\n```ts-vue\nimport { createClient, http } from 'viem' // [!code focus]\nimport { createConfig } from '{{packageName}}'\nimport { mainnet, sepolia } from '{{packageName}}/chains'\n\nconst config = createConfig({\n  chains: [mainnet, sepolia],\n  client({ chain }) { // [!code focus]\n    return createClient({ chain, transport: http('https://...') }) // [!code focus]\n  }, // [!code focus]\n})\n```\n\n::: warning\nWhen using this option, you likely want to pass `parameters.chain` straight through to [`createClient`](https://viem.sh/docs/clients/custom#createclient) to ensure the Viem `Client` is in sync with any active connections.\n:::\n\n## Return Type\n\n```ts-vue\nimport { type Config } from '{{packageName}}'\n```\n\n## Config\n\nObject responsible for managing Wagmi state and internals.\n\n```ts-vue\nimport { type Config } from '{{packageName}}'\n```\n\n### chains\n\n`readonly [Chain, ...Chain[]]`\n\n[`chains`](#chains) passed to `createConfig`.\n\n### connectors\n\n`readonly Connector[]`\n\nConnectors set up from passing [`connectors`](#connectors) and [`multiInjectedProviderDiscovery`](#multiinjectedproviderdiscovery) to `createConfig`.\n\n### state\n\n`State<chains>`\n\nThe `Config` object's internal state. See [`State`](#state-1) for more info.\n\n### storage\n\n`Storage | null`\n\n[`storage`](#storage) passed to `createConfig`.\n\n### getClient\n\n`(parameters?: { chainId?: chainId | chains[number]['id'] | undefined }): Client<transports[chainId], Extract<chains[number], { id: chainId }>>`\n\nCreates new Viem [`Client`](https://viem.sh/docs/clients/custom) object.\n\n::: code-group\n```ts-vue [index.ts]\nimport { config } from './config'\n\nconst client = config.getClient({ chainId: 1 })\n```\n\n```ts-vue [config.ts]\nimport { createConfig, http } from '{{packageName}}'\nimport { mainnet, sepolia } from '{{packageName}}/chains'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http('https://mainnet.example.com'),\n    [sepolia.id]: http('https://sepolia.example.com'),\n  },\n})\n```\n\n:::\n\n### setState\n\n`(value: State<chains> | ((state: State<chains>) => State<chains>)) => void`\n\nUpdates the `Config` object's internal state. See [`State`](#state-1) for more info.\n\n::: code-group\n```ts-vue [index.ts]\nimport { mainnet } from '{{packageName}}/chains'\nimport { config } from './config'\n\nconfig.setState((x) => ({\n  ...x,\n  chainId: x.current ? x.chainId : mainnet.id,\n}))\n```\n\n```ts-vue [config.ts]\nimport { createConfig, http } from '{{packageName}}'\nimport { mainnet, sepolia } from '{{packageName}}/chains'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http('https://mainnet.example.com'),\n    [sepolia.id]: http('https://sepolia.example.com'),\n  },\n})\n```\n\n:::\n\n::: warning\nExercise caution when using this method. It is intended for internal and advanced use-cases only. Manually setting state can cause unexpected behavior.\n:::\n\n### subscribe\n\n`(selector: (state: State<chains>) => state, listener: (selectedState: state, previousSelectedState: state) => void, options?: { emitImmediately?: boolean | undefined; equalityFn?: ((a: state, b: state) => boolean) | undefined } | undefined) => (() => void)`\n\nListens for state changes matching the `selector` function. Returns a function that can be called to unsubscribe the listener.\n\n::: code-group\n```ts-vue [index.ts]\nimport { config } from './config'\n\nconst unsubscribe = config.subscribe(\n  (state) => state.chainId,\n  (chainId) => console.log(`Chain ID changed to ${chainId}`),\n)\nunsubscribe()\n```\n\n```ts-vue [config.ts]\nimport { createConfig, http } from '{{packageName}}'\nimport { mainnet, sepolia } from '{{packageName}}/chains'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http('https://mainnet.example.com'),\n    [sepolia.id]: http('https://sepolia.example.com'),\n  },\n})\n```\n\n:::\n\n## State\n\n```ts-vue\nimport { type State } from '{{packageName}}'\n```\n\n### chainId\n\n`chains[number]['id']`\n\nCurrent chain ID. When `syncConnectedChain` is `true`, `chainId` is kept in sync with the current connection. Defaults to first chain in [`chains`](#chains).\n\n### connections\n\n`Map<string, Connection>`\n\nMapping of unique connector identifier to [`Connection`](#connection) object.\n\n### current\n\n`string | undefined`\n\nUnique identifier of the current connection.\n\n### status\n\n`'connected' | 'connecting' | 'disconnected' | 'reconnecting'`\n\nCurrent connection status.\n\n- `'connecting'` attempting to establish connection.\n- `'reconnecting'` attempting to re-establish connection to one or more connectors.\n- `'connected'` at least one connector is connected.\n- `'disconnected'` no connection to any connector.\n\n## Connection\n\n```ts-vue\nimport { type Connection } from '{{packageName}}'\n```\n\n### accounts\n\n`readonly [Address, ...Address[]]`\n\nArray of addresses associated with the connection.\n\n### chainId\n\n`number`\n\nChain ID associated with the connection.\n\n### connector\n\n`Connector`\n\nConnector associated with the connection.\n"
  },
  {
    "path": "site/shared/createStorage.md",
    "content": "<!--\n<script setup>\nconst docsPath = 'react'\nconst packageName = 'wagmi'\n</script>\n-->\n\n# createStorage\n\nCreates new [`Storage`](#storage) object.\n\n## Import\n\n```ts-vue\nimport { createStorage } from '{{packageName}}'\n```\n\n## Usage\n\n```ts-vue\nimport { createStorage } from '{{packageName}}'\n\nconst storage = createStorage({ storage: localStorage })\n```\n\n## Parameters\n\n```ts-vue\nimport { type CreateStorageParameters } from '{{packageName}}'\n```\n\n### deserialize\n\n`(<T>(value: string) => T) | undefined`\n\n- Function to deserialize data from storage.\n- Defaults to <a :href=\"`/${docsPath}/api/utilities/deserialize`\">`deserialize`</a>.\n\n```ts-vue\nimport { createStorage, deserialize } from '{{packageName}}' // [!code focus]\n\nconst storage = createStorage({\n  deserialize, // [!code focus]\n  storage: localStorage,\n})\n```\n\n::: warning\nIf you use a custom `deserialize` function, make sure it can handle `bigint` and `Map` values.\n:::\n\n### key\n\n`string | undefined`\n\n- Key prefix to use when persisting data.\n- Defaults to `'wagmi'`.\n\n```ts-vue\nimport { createStorage } from '{{packageName}}'\n\nconst storage = createStorage({\n  key: 'my-app', // [!code focus]\n  storage: localStorage,\n})\n```\n\n### serialize\n\n`(<T>(value: T) => string) | undefined`\n\n- Function to serialize data for storage.\n- Defaults to <a :href=\"`/${docsPath}/api/utilities/serialize`\">`serialize`</a>.\n\n```ts-vue\nimport { createStorage, serialize } from '{{packageName}}' // [!code focus]\n\nconst storage = createStorage({\n  serialize, // [!code focus]\n  storage: localStorage,\n})\n```\n\n::: warning\nIf you use a custom `serialize` function, make sure it can handle `bigint` and `Map` values.\n:::\n\n### storage\n\n`{ getItem(key: string): string | null | undefined | Promise<string | null | undefined>; setItem(key: string, value: string): void | Promise<void>; removeItem(key: string): void | Promise<void>; }`\n\n- Storage interface to use for persisting data.\n- Defaults to `localStorage`.\n- Supports synchronous and asynchronous storage methods.\n\n```ts-vue\nimport { createStorage } from '{{packageName}}'\n// Using IndexedDB via https://github.com/jakearchibald/idb-keyval // [!code focus]\nimport { del, get, set } from 'idb-keyval' // [!code focus]\n\nconst storage = createStorage({\n  storage: { // [!code focus]\n    async getItem(name) { // [!code focus]\n      return get(name)// [!code focus]\n    }, // [!code focus]\n    async setItem(name, value) { // [!code focus]\n      await set(name, value) // [!code focus]\n    }, // [!code focus]\n    async removeItem(name) { // [!code focus]\n      await del(name) // [!code focus]\n    }, // [!code focus]\n  }, // [!code focus]\n})\n```\n\n## Return Type\n\n```ts-vue\nimport { type Storage } from '{{packageName}}'\n```\n\n## Storage\n\nObject responsible for persisting Wagmi <a :href=\"`/${docsPath}/api/createConfig#state-1`\">`State`</a> and other data.\n\n```ts-vue\nimport { type Storage } from '{{packageName}}'\n```\n\n### getItem\n\n`getItem(key: string, defaultValue?: value | null | undefined): value | null | Promise<value | null>`\n\n```ts-vue\nimport { createStorage } from '{{packageName}}'\n\nconst storage = createStorage({ storage: localStorage })\nconst recentConnectorId = storage.getItem('recentConnectorId') // [!code focus]\n```\n\n### setItem\n\n`setItem(key: string, value: any): void | Promise<void>`\n\n```ts-vue\nimport { createStorage } from '{{packageName}}'\n\nconst storage = createStorage({ storage: localStorage })\nstorage.setItem('recentConnectorId', 'foo') // [!code focus]\n```\n\n### removeItem\n\n`removeItem(key: string): void | Promise<void>`\n\n```ts-vue\nimport { createStorage } from '{{packageName}}'\n\nconst storage = createStorage({ storage: localStorage })\nstorage.removeItem('recentConnectorId') // [!code focus]\n```"
  },
  {
    "path": "site/shared/errors.md",
    "content": "<!--\n<script setup>\nconst docsPath = 'react'\nconst packageName = 'wagmi'\n</script>\n-->\n\n## BaseError\n\nError class extended by all errors.\n\n```ts-vue\nimport { BaseError } from '{{packageName}}'\n```\n\n## Config\n\n### ConnectorAccountNotFoundError\n\nWhen an account does not exist on the connector or is unable to be used.\n\n```ts-vue\nimport { ConnectorAccountNotFoundError } from '{{packageName}}'\n```\n\n### ConnectorAlreadyConnectedError\n\nWhen a connector is already connected.\n\n```ts-vue\nimport { ConnectorAlreadyConnectedError } from '{{packageName}}'\n```\n\n### ConnectorChainMismatchError\n\nWhen the Wagmi Config is out-of-sync with the connector's active chain ID. This is rare and likely an upstream wallet issue.\n\n```ts-vue\nimport { ConnectorChainMismatchError } from '{{packageName}}'\n```\n\n### ChainNotConfiguredError\n\nWhen a chain is not configured. You likely need to add the chain to <a :href=\"`/${docsPath}/api/createConfig#chains`\">`Config['chains']`</a>.\n\n```ts-vue\nimport { ChainNotConfiguredError } from '{{packageName}}'\n```\n\n### ConnectorNotConnectedError\n\nWhen a connector is not connected.\n\n```ts-vue\nimport { ConnectorNotConnectedError } from '{{packageName}}'\n```\n\n### ConnectorNotFoundError\n\nWhen a connector is not found or able to be used.\n\n```ts-vue\nimport { ConnectorNotFoundError } from '{{packageName}}'\n```\n\n### ConnectorUnavailableReconnectingError\n\nDuring the reconnection step, the only connector methods guaranteed to be available are: `id`, `name`, `type`, `uuid`. All other methods are not guaranteed to be available until reconnection completes and connectors are fully restored. This error commonly occurs for connectors that asynchronously inject after reconnection has already started.\n\n```ts-vue\nimport { ConnectorUnavailableReconnectingError } from '{{packageName}}'\n```\n\n## Connector\n\n### ProviderNotFoundError\n\nWhen a connector's provider is not found or able to be used.\n\n```ts-vue\nimport { ProviderNotFoundError } from '{{packageName}}'\n```\n\n### SwitchChainNotSupportedError\n\nWhen switching chains is not supported by connectors.\n\n```ts-vue\nimport { SwitchChainNotSupportedError } from '{{packageName}}'\n```\n"
  },
  {
    "path": "site/shared/faq.md",
    "content": "<!--\n<script setup>\nconst docsPath = 'react'\n</script>\n-->\n\n## How do I support the project?\n\nWagmi is an open source software project and free to use. If you enjoy using Wagmi or would like to support Wagmi development, you can:\n\n- [Become a sponsor on GitHub](https://github.com/sponsors/wevm)\n- Send us crypto\n  - Mainnet: 0x4557B18E779944BFE9d78A672452331C186a9f48\n  - Multichain: 0xd2135CfB216b74109775236E36d4b433F1DF507B\n- [Become a supporter on Drips](https://www.drips.network/app/projects/github/wevm/wagmi)\n\nIf you use Wagmi at work, **consider asking your company to sponsor Wagmi**. This may not be easy, but **business sponsorships typically make a much larger impact on the sustainability of OSS projects** than individual donations, so you will help us much more if you succeed.\n\n## Type inference doesn't work\n\n- Check that you set up TypeScript correctly with `\"strict\": true` in your `tsconfig.json` (<a :href=\"`/${docsPath}/typescript#requirements`\">TypeScript docs</a>)\n- Check that you <a :href=\"`/${docsPath}/typescript#const-assert-abis-typed-data`\">const-asserted any ABIs or Typed Data</a> you are using.\n- Restart your language server or IDE, and check for type errors in your code.\n\n## My wallet doesn't work\n\nIf you run into issues with a specific wallet, try another before opening up an issue. There are many different wallets and it's likely that the issue is with the wallet itself, not Wagmi. For example, if you are using Wallet X and sending a transaction doesn't work, try Wallet Y and see if it works.\n\n## `BigInt` Serialization\n\nUsing native `BigInt` with `JSON.stringify` will raise a `TypeError` as\n[`BigInt` values are not serializable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt#use_within_json). There are two techniques to mitigate this:\n\n#### Lossless serialization\n\nLossless serialization means that `BigInt` will be converted to a format that can be deserialized later (e.g. `69420n` → `\"#bigint.69420\"`). The trade-off is that these values are not human-readable and are not intended to be displayed to the user.\n\nLossless serialization can be achieved with wagmi's <a :href=\"`/${docsPath}/api/utilities/serialize`\">`serialize`</a> and <a :href=\"`/${docsPath}/api/utilities/deserialize`\">`deserialize`</a> utilities.\n\n```tsx\nimport { serialize, deserialize } from 'wagmi'\n\nconst serialized = serialize({ value: 69420n })\n// '{\"value\":\"#bigint.69420\"}'\n\nconst deserialized = deserialize(serialized)\n// { value: 69420n }\n```\n\n#### Lossy serialization\n\nLossy serialization means that the `BigInt` will be converted to a normal display string (e.g. `69420n` → `'69420'`).\nThe trade-off is that you will not be able to deserialize the `BigInt` with `JSON.parse` as it can not distinguish between a normal string and a `BigInt`.\n\nThis method can be achieved by modifying `JSON.stringify` to include a BigInt `replacer`:\n\n```tsx\nconst replacer = (key, value) =>\n  typeof value === 'bigint' ? value.toString() : value\n\nJSON.stringify({ value: 69420n }, replacer)\n// '{\"value\":\"69420\"}'\n```\n\n## Is Wagmi production ready?\n\nYes. Wagmi is very stable and is used in production by thousands of organizations, like [Stripe](https://stripe.com), [Shopify](https://shopify.com), [Coinbase](https://coinbase.com), [Uniswap](https://uniswap.org), [ENS](https://ens.domains), [Optimism](https://optimism.com).\n\n## Is Wagmi strict with semver?\n\nYes, Wagmi is very strict with [semantic versioning](https://semver.org) and we will never introduce breaking changes to the runtime API in a minor version bump.\n\nFor exported types, we try our best to not introduce breaking changes in non-major versions, however, [TypeScript doesn't follow semver](https://www.learningtypescript.com/articles/why-typescript-doesnt-follow-strict-semantic-versioning) and often introduces breaking changes in minor releases that can cause Wagmi type issues. See the <a :href=\"`/${docsPath}/typescript#requirements`\">TypeScript docs</a> for more information.\n\n## How can I contribute to Wagmi?\n\nThe Wagmi team accepts all sorts of contributions. Check out the [Contributing](/dev/contributing) guide to get started. If you are interested in adding a new connector to Wagmi, check out the [Creating Connectors](/dev/creating-connectors) guide.\n\n## Anything else you want to know?\n\nPlease create a new [GitHub Discussion thread](https://github.com/wevm/wagmi). You're also free to suggest changes to this or any other page on the site using the \"Suggest changes to this page\" button at the bottom of the page.\n"
  },
  {
    "path": "site/shared/getConnection-return-type.md",
    "content": "<!--\n<script setup>\nconst TVariables = 'TVariables'\n</script>\n-->\n\n### address\n\n`Address | undefined`\n\n- Connected address from connector.\n- Defaults to first address in [`addresses`](#addresses).\n\n### addresses\n\n`readonly Address[] | undefined`\n\nConnected addresses from connector.\n\n### chain\n\n`Chain | undefined`\n\nConnected chain from connector. If chain is not configured by config, it will be `undefined`.\n\n### chainId\n\n`number | undefined`\n\nConnected chain id from connector.\n\n### connector\n\n`Connector | undefined`\n\nConnected connector.\n\n### isConnecting / isReconnecting / isConnected / isDisconnected\n\n`boolean`\n\nBoolean variables derived from [`status`](#status).\n\n### status\n\n`'connecting' | 'reconnecting' | 'connected' | 'disconnected'`\n\n- `'connecting'` attempting to establish connection.\n- `'reconnecting'` attempting to re-establish connection to one or more connectors.\n- `'connected'` at least one connector is connected.\n- `'disconnected'` no connection to any connector.\n\n::: info You can use `status` to narrow the return type. \nFor example, when `status` is `'connected'` properties like `address` are guaranteed to be defined.\n\n```ts twoslash\n// @twoslash-cache: {\"v\":1,\"hash\":\"70621ff7ba048810d10cff60e35c82126a2beb12177fb38b972d09b620d6367c\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BjCMONAAmbDBkbQEsWidgHEYaAMIsefQWABK4gK6kwAFWy4qbAIakGiACxUANjDABzNPiQBGAAxU0ei+KbTeAlpRAn+PJEcQRnw9HT4yJEMAXwp0TTxCEnInOgMQAAosUggcfQwASnZdNCU4YQAdECh+OC4ZGigq9gAfdir6zxgmkFb2kFJeD1lLZraO4YFRkB9dfTsAVlNzKxtEADYnFzdEEBKynz8AxCCQsIjyRFsF2PicROJI1Pp3Vg5O2SF2YAqwdn/2DooFBBnByuwAILA0FwADcvwBgOh8Dg8GEgyBLBMGHYyChIJRFHYADpSfiYcgALqU+F/AFnfzCCShfx9JRgWAAM383VpiIZYAAklBhGAlABbABGZD59MmEFITPlpFl/1qUm4XRF7DQpCUMFV7HVk38FmEnJ0JlRhtqABFah9GubLdaEQDaopHabnVaDW7/vtwRNNREerTorNnPMjABmZaWax2IJR1zpL3eUw8uxUM6kcI0S4AJlu1ASuwAjvrSBgfDQXrsuGxOCavj86f8gQSwcJySjDZ2YWj2BioFicXjkWCiaTib2wVSaf7OCywEyV2yOTBuTwoIaBcLRRLpSql46FUqQ2gFTa4BqGt1hLr9Te755vewLb6b/a6pMHx+XT9dsjTgT0TUsH1XWAwNKmCP8w1+CNtCjAxDDjXwVkTK5k22NMWzAQ4syuHNQjzC4kGLSkc2gXBdn4Tl2AydMwGJQN2AAXk49gAHJHW6biijbf5mN+USwDEiTxKkyTJKQkBxXEHQkFANJzDgOQ8DQBBomiIA===\"}\nimport { type GetConnectionReturnType } from '@wagmi/core'\nconst connection = {} as GetConnectionReturnType\n// ---cut---\nif (connection.status === 'connected') {\n  connection\n  // ^?\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n}\n```\n\nOr when status is `'disconnected'` properties like `address` are guaranteed to be `undefined`:\n\n```ts twoslash\n// @twoslash-cache: {\"v\":1,\"hash\":\"03f1cafa2983888b08080373baa176953254622dd97feb972d42875fedc5dd86\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BjCMONAAmbDBkbQEsWidgHEYaAMIsefQWABK4gK6kwAFWy4qbAIakGiACxUANjDABzNPiQBGAAxU0ei+KbTeAlpRAn+PJEcQRnw9HT4yJEMAXwp0TTxCEnInOgMQAAosUggcfQwASnZdNCU4YQAdECh+OC4ZGigq9gAfdir6zxgmkFb2kFJeD1lLZraO4YFRkB9dfTsAVlNzKxtEADYnFzdEEBKynz8AxCCQsIjyRFsF2PicROJI1Pp3Vg5O2SF2YAqwdn/2DooFBBnByuwlGBYAAzfzdADcvwBgOBoLg8GEkJhcKgiL+ALO/kxUJgsJ4uKRBNC/gAklBidjyXjkR80BBSAzSTjmQDalJuF16exoToTOief9aopWf4LMIRWKYBL2HzJrL5aLxZTJXAACK1VndYRoUhKJXa4rOUrgqo1OqTbpVPHRWbOeZGTa+FbWOxBN2udIy7ymOF2KhnUjhGiXABMt2oCV2AEczaQMD4aC9dlw2Jw1V8fvj/kCQfBwViuUyLSW0RiISSyQiLYSwJzGxSi5xqWA6W3uc3Juy+1XO6qBREhQqtaO4NK1ZYNYrlWOGurhZrzTP9fbx41jabN8j9jbqgaHT1na69AZDJ6zJYfVc/dtA/mwIdQ1dw6FIxckHGAF1w2gXBdn4aF2AyIMwAAOmPdgAF4kPYAByO1DSgFCikLf5oN+fCwAIojCJI4jiJdKgAFtxB0JBQDScw4DkPA0AQaJoiAA\"}\nimport { type GetConnectionReturnType } from '@wagmi/core'\nconst connection = {} as GetConnectionReturnType\n// ---cut---\nif (connection.status === 'disconnected') {\n  connection\n  // ^?\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n}\n```\n:::\n"
  },
  {
    "path": "site/shared/installation.md",
    "content": "<!--\n<script setup>\nimport Browsers from '../components/Browsers.vue'\nconst docsPath = 'react'\nconst packageDir = 'react'\nconst packageName = 'wagmi'\n</script>\n-->\n\n## Requirements\n\nWagmi is optimized for modern browsers. It is compatible with the latest versions of the following browsers.\n\n<Browsers />\n\n::: tip\nDepending on your environment, you might need to add polyfills. See [Viem Platform Compatibility](https://viem.sh/docs/compatibility) for more info.\n:::\n\n## Using Unreleased Commits\n\nIf you can't wait for a new release to test the latest features, you can either install from the `canary` tag (tracks the [`main`](https://github.com/wevm/wagmi/tree/main) branch).\n\n::: code-group\n```bash-vue [pnpm]\npnpm add {{packageName}}@canary\n```\n\n```bash-vue [npm]\nnpm install {{packageName}}@canary\n```\n\n```bash-vue [yarn]\nyarn add {{packageName}}@canary\n```\n\n```bash-vue [bun]\nbun add {{packageName}}@canary\n```\n:::\n\nOr clone the [Wagmi repo](https://github.com/wevm/wagmi) to your local machine, build, and link it yourself.\n\n```bash-vue\ngh repo clone wevm/wagmi\ncd wagmi\npnpm install\npnpm build\ncd packages/{{packageDir}}\npnpm link --global\n```\n\nThen go to the project where you are using Wagmi and run `pnpm link --global {{packageName}}` (or the package manager that you used to link Wagmi globally). Make sure you installed any [required peer dependencies](#package-manager) and their versions are correct.\n\nFinally, pull requests are continuously released via [pkg.pr.new](https://pkg.pr.new) and can be installed using the pull request number or short commit ID.\n\n::: code-group\n```bash-vue [pnpm]\npnpm add https://pkg.pr.new/{{packageName}}@123\n```\n\n```bash-vue [npm]\nnpm install https://pkg.pr.new/{{packageName}}@123\n```\n\n```bash-vue [yarn]\nyarn add https://pkg.pr.new/{{packageName}}@123\n```\n\n```bash-vue [bun]\nbun add https://pkg.pr.new/{{packageName}}@123\n```\n:::\n\n## Security\n\nEthereum-related projects are often targeted in attacks to steal users' assets. Make sure you follow security best-practices for your project. Some quick things to get started.\n\n- Pin package versions, upgrade mindfully, and inspect lockfile changes to minimize the risk of [supply-chain attacks](https://nodejs.org/en/guides/security/#supply-chain-attacks).\n- Use [npm](https://docs.npmjs.com)'s [`min-release-age`](https://docs.npmjs.com/cli/v11/using-npm/config#min-release-age) or [pnpm](https://pnpm.io)'s [`minimumReleaseAge`](https://pnpm.io/settings#minimumreleaseage) and [`trustPolicy`](https://pnpm.io/settings#trustpolicy) to mitigate against supply-chain attacks.\n- Install the [Socket](https://socket.dev) [GitHub App](https://github.com/apps/socket-security) to help detect and block supply-chain attacks.\n- Add a [Content Security Policy](https://cheatsheetseries.owasp.org/cheatsheets/Content_Security_Policy_Cheat_Sheet.html) to defend against external scripts running in your app.\n- Pin [GitHub Action](https://x.com/paulmillr/status/1900948425325031448) versions to commits instead of tags. [Actions Up](https://github.com/azat-io/actions-up) is a good tool for using commits instead of tags.\n"
  },
  {
    "path": "site/shared/migrate-from-v2-to-v3.md",
    "content": "<!--\n<script setup>\nimport PackageMetadata from '../../components/PackageMetadata.vue'\nimport packageJson from '../../../packages/connectors/package.json'\nconst docsPath = 'react'\n</script>\n-->\n\n## Install Connector Dependencies\n\nAll 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. \n\nFor example, if you are using the <a :href=\"`/${docsPath}/api/connectors/porto`\">`porto`</a> connector, you also need to install the `porto` npm package. Required connector dependencies are listed below (along with links to npm, GitHub, [Socket](https://socket.dev), and licenses) and on docs pages under the \"Install\" section.\n\n:::tip Secure your supply-chain\nSince you are now responsible for managing connector dependencies, take a look at Wagmi's <a :href=\"`/${docsPath}/installation#security`\">Security Getting Started</a> section to brush up on some best practices.\n:::\n\n:::tip Building a developer tool on top of Wagmi?\nIf you are developing a library with Wagmi, you should decide if you want to install connector dependencies as part of your library (\"batteries-included\" approach) or pass the responsibility onto your users (more flexibility and control).\n:::\n\n### baseAccount\n\n<a :href=\"`/${docsPath}/api/connectors/baseAccount`\">`baseAccount`</a> requires `@base-org/account`\n\n<PackageMetadata package=\"@base-org/account\" repo=\"base/account-sdk\" isOsiLicense licenseUrl=\"https://github.com/base/account-sdk/blob/master/packages/account-sdk/LICENSE\" />\n\n::: code-group\n```bash-vue [pnpm]\npnpm add @base-org/account@{{packageJson?.peerDependencies?.['@base-org/account']}}\n```\n\n```bash-vue [npm]\nnpm install @base-org/account@{{packageJson?.peerDependencies?.['@base-org/account']}}\n```\n\n```bash-vue [yarn]\nyarn add @base-org/account@{{packageJson?.peerDependencies?.['@base-org/account']}}\n```\n\n```bash-vue [bun]\nbun add @base-org/account@{{packageJson?.peerDependencies?.['@base-org/account']}}\n```\n:::\n\n### coinbaseWallet\n\n<a :href=\"`/${docsPath}/api/connectors/coinbaseWallet`\">`coinbaseWallet`</a> requires `@coinbase/wallet-sdk`\n\n<PackageMetadata package=\"@coinbase/wallet-sdk\" repo=\"coinbase/coinbase-wallet-sdk\" isOsiLicense licenseUrl=\"https://github.com/coinbase/coinbase-wallet-sdk/blob/master/packages/wallet-sdk/LICENSE\" />\n\n::: code-group\n```bash-vue [pnpm]\npnpm add @coinbase/wallet-sdk@{{packageJson?.peerDependencies?.['@coinbase/wallet-sdk']}}\n```\n\n```bash-vue [npm]\nnpm install @coinbase/wallet-sdk@{{packageJson?.peerDependencies?.['@coinbase/wallet-sdk']}}\n```\n\n```bash-vue [yarn]\nyarn add @coinbase/wallet-sdk@{{packageJson?.peerDependencies?.['@coinbase/wallet-sdk']}}\n```\n\n```bash-vue [bun]\nbun add @coinbase/wallet-sdk@{{packageJson?.peerDependencies?.['@coinbase/wallet-sdk']}}\n```\n:::\n\n### metaMask\n\n<a :href=\"`/${docsPath}/api/connectors/metaMask`\">`metaMask`</a> requires `@metamask/sdk`\n\n<PackageMetadata package=\"@metamask/sdk\" repo=\"MetaMask/metamask-sdk\" licenseUrl=\"https://github.com/MetaMask/metamask-sdk/blob/main/packages/sdk/LICENSE\" />\n\n::: code-group\n```bash-vue [pnpm]\npnpm add @metamask/sdk@{{packageJson?.peerDependencies?.['@metamask/sdk']}}\n```\n\n```bash-vue [npm]\nnpm install @metamask/sdk@{{packageJson?.peerDependencies?.['@metamask/sdk']}}\n```\n\n```bash-vue [yarn]\nyarn add @metamask/sdk@{{packageJson?.peerDependencies?.['@metamask/sdk']}}\n```\n\n```bash-vue [bun]\nbun add @metamask/sdk@{{packageJson?.peerDependencies?.['@metamask/sdk']}}\n```\n:::\n\n### porto\n\n<a :href=\"`/${docsPath}/api/connectors/porto`\">`porto`</a> requires `porto`\n\n<PackageMetadata package=\"porto\" repo=\"ithacaxyz/porto\" isOsiLicense licenseUrl=\"https://github.com/ithacaxyz/porto/blob/main/LICENSE-MIT\" />\n\n::: code-group\n```bash-vue [pnpm]\npnpm add porto@{{packageJson?.peerDependencies?.['porto']}}\n```\n\n```bash-vue [npm]\nnpm install porto@{{packageJson?.peerDependencies?.['porto']}}\n```\n\n```bash-vue [yarn]\nyarn add porto@{{packageJson?.peerDependencies?.['porto']}}\n```\n\n```bash-vue [bun]\nbun add porto@{{packageJson?.peerDependencies?.['porto']}}\n```\n:::\n\n### safe\n\n<a :href=\"`/${docsPath}/api/connectors/safe`\">`safe`</a> requires `@safe-global/safe-apps-provider` and `@safe-global/safe-apps-sdk`\n\n<PackageMetadata package=\"@safe-global/safe-apps-provider\" repo=\"safe-global/safe-apps-sdk/tree/main/packages/safe-apps-provider\" isOsiLicense showName licenseUrl=\"https://github.com/safe-global/safe-apps-sdk/blob/main/LICENSE.md\" />\n<PackageMetadata package=\"@safe-global/safe-apps-sdk\" repo=\"safe-global/safe-apps-sdk/tree/main/packages/safe-apps-sdk\" isOsiLicense showName licenseUrl=\"https://github.com/safe-global/safe-apps-sdk/blob/main/LICENSE.md\" />\n\n::: code-group\n```bash-vue [pnpm]\npnpm add @safe-global/safe-apps-provider@{{packageJson?.peerDependencies?.['@safe-global/safe-apps-provider']}} @safe-global/safe-apps-sdk@{{packageJson?.peerDependencies?.['@safe-global/safe-apps-sdk']}} \n```\n\n```bash-vue [npm]\nnpm install @safe-global/safe-apps-provider@{{packageJson?.peerDependencies?.['@safe-global/safe-apps-provider']}} @safe-global/safe-apps-sdk@{{packageJson?.peerDependencies?.['@safe-global/safe-apps-sdk']}} \n```\n\n```bash-vue [yarn]\nyarn add @safe-global/safe-apps-provider@{{packageJson?.peerDependencies?.['@safe-global/safe-apps-provider']}} @safe-global/safe-apps-sdk@{{packageJson?.peerDependencies?.['@safe-global/safe-apps-sdk']}} \n```\n\n```bash-vue [bun]\nbun add @safe-global/safe-apps-provider@{{packageJson?.peerDependencies?.['@safe-global/safe-apps-provider']}} @safe-global/safe-apps-sdk@{{packageJson?.peerDependencies?.['@safe-global/safe-apps-sdk']}} \n```\n:::\n\n### walletConnect\n\n<a :href=\"`/${docsPath}/api/connectors/walletConnect`\">`walletConnect`</a> requires `@walletconnect/ethereum-provider`\n\n<PackageMetadata package=\"@walletconnect/ethereum-provider\" repo=\"WalletConnect/walletconnect-monorepo\" licenseUrl=\"https://github.com/WalletConnect/walletconnect-monorepo/blob/v2.0/providers/ethereum-provider/LICENSE.md\" />\n\n::: code-group\n```bash-vue [pnpm]\npnpm add @walletconnect/ethereum-provider@{{packageJson?.peerDependencies?.['@walletconnect/ethereum-provider']}}\n```\n\n```bash-vue [npm]\nnpm install @walletconnect/ethereum-provider@{{packageJson?.peerDependencies?.['@walletconnect/ethereum-provider']}}\n```\n\n```bash-vue [yarn]\nyarn add @walletconnect/ethereum-provider@{{packageJson?.peerDependencies?.['@walletconnect/ethereum-provider']}}\n```\n\n```bash-vue [bun]\nbun add @walletconnect/ethereum-provider@{{packageJson?.peerDependencies?.['@walletconnect/ethereum-provider']}}\n```\n:::\n\n\n## Bumped Minimum TypeScript Version\n\nThe minimum supported TypeScript version is now `5.7.3` instead of `5.0.4`. Older versions of TypeScript should continue to work, but since [TypeScript doesn't follow semver](https://www.learningtypescript.com/articles/why-typescript-doesnt-follow-strict-semantic-versioning) we recommend you update to at least `5.7.3`. This should be relatively simple as there haven't been any breaking changes since `5.0.4`.\n\n## Migrate v2 Deprecations\n\n<a :href=\"`/${docsPath}/guides/migrate-from-v1-to-v2#deprecations`\">v2 deprecations</a> Review the <a :href=\"`/${docsPath}/guides/migrate-from-v1-to-v2#deprecations`\">v2 migration guide</a> for more information.\n"
  },
  {
    "path": "site/shared/mutation-imports.md",
    "content": "<!--\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'connect'\nconst typeName = 'Connect'\n</script>\n-->\n\n## TanStack Query\n\n```ts-vue\nimport {\n  type {{typeName}}Data,\n  type {{typeName}}Variables,\n  type {{typeName}}Mutate,\n  type {{typeName}}MutateAsync,\n  {{actionName}}MutationOptions,\n} from '{{packageName}}/query'\n```"
  },
  {
    "path": "site/shared/mutation-options.md",
    "content": "<!--\n<script setup>\nconst mutate = 'mutationFn'\nconst TData = 'TData'\nconst TError = 'TError'\nconst TVariables = 'TVariables'\n</script>\n-->\n\n<br />\n\n---\n\n### mutation\n\nTanStack Query parameters. See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/react/reference/useMutation) for more info.\n\n::: info Wagmi does not support passing all TanStack Query parameters\nTanStack Query parameters, like `mutationFn` and `mutationKey`, are used internally to make Wagmi work and you cannot override them. Check out the [source](https://github.com/wevm/wagmi/blob/main/packages/react/src/utils/query.ts#L30) to see what parameters are not supported. All parameters listed below are supported.\n:::\n\n#### gcTime\n\n`number | Infinity | undefined`\n\n- The time in milliseconds that unused/inactive cache data remains in memory. When a mutation's cache becomes unused or inactive, that cache data will be garbage collected after this duration. When different cache times are specified, the longest one will be used.\n- If set to `Infinity`, will disable garbage collection\n\n#### meta\n\n`Record<string, unknown> | undefined`\n\nIf set, stores additional information on the mutation cache entry that can be used as needed. It will be accessible wherever [`{{mutate}}`](#mutate) is available (e.g. [`onError`](#onerror), [`onSuccess`](#onsuccess) functions).\n\n#### networkMode\n\n`'online' | 'always' | 'offlineFirst' | undefined`\n\n- defaults to `'online'`\n- see [Network Mode](https://tanstack.com/query/v5/docs/react/guides/network-mode) for more information.\n\n#### onError\n\n`((error: {{TError}}, variables: {{TVariables}}, context?: context | undefined) => Promise<unknown> | unknown) | undefined`\n\nThis function will fire if the mutation encounters an error and will be passed the error.\n\n#### onMutate\n\n`((variables: {{TVariables}}) => Promise<context | void> | context | void) | undefined`\n\n- This function will fire before the mutation function is fired and is passed the same variables the mutation function would receive\n- Useful to perform optimistic updates to a resource in hopes that the mutation succeeds\n- The value returned from this function will be passed to both the `onError` and `onSettled` functions in the event of a mutation failure and can be useful for rolling back optimistic updates.\n\n#### onSuccess\n\n`((data: {{TData}}, variables: {{TVariables}}, context?: context | undefined) => Promise<unknown> | unknown) | undefined`\n\nThis function will fire when the mutation is successful and will be passed the mutation's result.\n\n#### onSettled\n\n`((data: {{TData}}, error: {{TError}}, variables: {{TVariables}}, context?: context | undefined) => Promise<unknown> | unknown) | undefined`\n\nThis function will fire when the mutation is either successfully fetched or encounters an error and be passed either the data or error\n\n#### queryClient\n\n`QueryClient`\n\nUse this to use a custom `QueryClient`. Otherwise, the one from the nearest context will be used.\n\n#### retry\n\n`boolean | number | ((failureCount: number, error: {{TError}}) => boolean) | undefined`\n\n- Defaults to `0`.\n- If `false`, failed mutations will not retry.\n- If `true`, failed mutations will retry infinitely.\n- If set to an `number`, e.g. `3`, failed mutations will retry until the failed mutations count meets that number.\n\n#### retryDelay\n\n`number | ((retryAttempt: number, error: {{TError}}) => number) | undefined`\n\n- This function receives a `retryAttempt` integer and the actual Error and returns the delay to apply before the next attempt in milliseconds.\n- A function like `attempt => Math.min(attempt > 1 ? 2 ** attempt * 1000 : 1000, 30 * 1000)` applies exponential backoff.\n- A function like `attempt => attempt * 1000` applies linear backoff.\n"
  },
  {
    "path": "site/shared/mutation-result.md",
    "content": "<!--\n<script setup>\nconst mutate = 'mutationFn'\nconst TData = 'TData'\nconst TError = 'TError'\nconst TVariables = 'TVariables'\n</script>\n-->\n\n<br />\n\n---\n\n[TanStack Query mutation docs](https://tanstack.com/query/v5/docs/react/reference/useMutation)\n\n### mutate\n\n`(variables: {{TVariables}}, { onSuccess, onSettled, onError }) => void`\n\nThe mutation function you can call with variables to trigger the mutation and optionally hooks on additional callback options.\n\n- #### variables\n\n  `{{TVariables}}`\n\n  The variables object to pass to the <a :href=\"`/core/api/actions/${mutate}#parameters`\">`{{mutate}}`</a> action.\n\n- #### onSuccess\n\n  `(data: {{TData}}, variables: {{TVariables}}, context: TContext) => void`\n\n  This function will fire when the mutation is successful and will be passed the mutation's result.\n\n- #### onError\n\n  `(error: {{TError}}, variables: {{TVariables}}, context: TContext | undefined) => void`\n\n  This function will fire if the mutation encounters an error and will be passed the error.\n\n- #### onSettled\n\n  `(data: {{TData}} | undefined, error: {{TError}} | null, variables: {{TVariables}}, context: TContext | undefined) => void`\n\n  - This function will fire when the mutation is either successfully fetched or encounters an error and be passed either the data or error\n  - If you make multiple requests, `onSuccess` will fire only after the latest call you've made.\n\n### mutateAsync\n\n`(variables: {{TVariables}}, { onSuccess, onSettled, onError }) => Promise<{{TData}}>`\n\nSimilar to [`mutate`](#mutate) but returns a promise which can be awaited.\n\n### data\n\n`{{TData}} | undefined`\n\n- <a :href=\"`/core/api/actions/${mutate}#return-type`\">`{{mutate}}` return type</a>\n- Defaults to `undefined`\n- The last successfully resolved data for the mutation.\n\n### error\n\n`{{TError}} | null`\n\nThe error object for the mutation, if an error was encountered.\n\n### failureCount\n\n`number`\n\n- The failure count for the mutation.\n- Incremented every time the mutation fails.\n- Reset to `0` when the mutation succeeds.\n\n### failureReason\n\n`{{TError}} | null`\n\n- The failure reason for the mutation retry.\n- Reset to `null` when the mutation succeeds.\n\n### isError / isIdle / isPending / isSuccess\n\n`boolean`\n\nBoolean variables derived from [`status`](#status).\n\n### isPaused\n\n`boolean`\n\n- will be `true` if the mutation has been `paused`.\n- see [Network Mode](https://tanstack.com/query/v5/docs/react/guides/network-mode) for more information.\n\n### reset\n\n`() => void`\n\nA function to clean the mutation internal state (e.g. it resets the mutation to its initial state).\n\n### status\n\n`'idle' | 'pending' | 'error' | 'success'`\n\n- `'idle'` initial status prior to the mutation function executing.\n- `'pending'` if the mutation is currently executing.\n- `'error'` if the last mutation attempt resulted in an error.\n- `'success'` if the last mutation attempt was successful.\n\n### submittedAt\n\n`number`\n\n- The timestamp for when the mutation was submitted.\n- Defaults to `0`.\n\n### variables\n\n`{{TVariables}} | undefined`\n\n- The variables object passed to [`mutate`](#mutate).\n- Defaults to `undefined`.\n"
  },
  {
    "path": "site/shared/query-imports.md",
    "content": "<!--\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'getBalance'\nconst typeName = 'GetBalance'\n</script>\n-->\n\n## TanStack Query\n\n```ts-vue\nimport {\n  type {{typeName}}Data,\n  type {{typeName}}Options,\n  type {{typeName}}QueryFnData,\n  type {{typeName}}QueryKey,\n  {{actionName}}QueryKey,\n  {{actionName}}QueryOptions,\n} from '{{packageName}}/query'\n```"
  },
  {
    "path": "site/shared/query-options.md",
    "content": "<!--\n<script setup>\nconst TData = 'TData'\nconst TError = 'TError'\nconst TPageParam = number\nconst hideQueryOptions = []\nconst includeInfiniteQueryOptions = false\n</script>\n-->\n\n<br />\n\n---\n\n### query\n\nTanStack Query parameters. See the [TanStack Query query docs](https://tanstack.com/query/v5/docs/react/reference/useQuery) for more info.\n\n::: info Wagmi does not support passing all TanStack Query parameters\nTanStack Query parameters, like `queryFn` and `queryKey`, are used internally to make Wagmi work and you cannot override them. Check out the [source](https://github.com/wevm/wagmi/blob/main/packages/react/src/types/properties.ts#L27) to see what parameters are not supported. All parameters listed below are supported.\n:::\n\n#### enabled\n\n`boolean | undefined`\n\n- Set this to `false` to disable this query from automatically running.\n- Can be used for [Dependent Queries](https://tanstack.com/query/v5/docs/react/guides/dependent-queries).\n\n<div v-if=\"!hideQueryOptions?.includes('gcTime')\">\n\n#### gcTime\n\n`number | Infinity | undefined`\n\n- Defaults to `5 * 60 * 1000` (5 minutes) or `Infinity` during SSR\n- The time in milliseconds that unused/inactive cache data remains in memory. When a query's cache becomes unused or inactive, that cache data will be garbage collected after this duration. When different garbage collection times are specified, the longest one will be used.\n- If set to `Infinity`, will disable garbage collection\n\n</div>\n\n#### initialData\n\n`{{TData}} | (() => {{TData}}) | undefined`\n\n- If set, this value will be used as the initial data for the query cache (as long as the query hasn't been created or cached yet)\n- If set to a function, the function will be called **once** during the shared/root query initialization, and be expected to synchronously return the initialData\n- Initial data is considered stale by default unless a `staleTime` has been set.\n- `initialData` **is persisted** to the cache\n\n#### initialDataUpdatedAt\n\n`number | ((() => number | undefined)) | undefined`\n\nIf set, this value will be used as the time (in milliseconds) of when the `initialData` itself was last updated.\n\n<div v-if=\"includeInfiniteQueryOptions\">\n\n#### initialPageParam\n\n`{{TPageParam}}`\n\nThe initial page parameter to be passed to the query function.\n\n#### getPreviousPageParam\n\nThis function can be set to automatically get the previous cursor for infinite queries.\nThe result will also be used to determine the value of `hasPreviousPage`.\n\n`(firstPage: {{TData}}, allPages: {{TData}}[], firstPageParam: {{TPageParam}}, allPageParams: {{TPageParam}}[]) => {{TPageParam}} | undefined | null`\n\n#### getNextPageParam\n\nThis function can be set to automatically get the previous cursor for infinite queries.\nThe result will also be used to determine the value of `hasPreviousPage`.\n\n`(lastPage: {{TData}}, allPages: {{TData}}[], lastPageParam: {{TPageParam}}, allPageParams: {{TPageParam}}[]) => {{TPageParam}} | undefined | null`\n\n</div>\n\n#### meta\n\n`Record<string, unknown> | undefined`\n\nIf set, stores additional information on the query cache entry that can be used as needed. It will be accessible wherever the `query` is available, and is also part of the `QueryFunctionContext` provided to the `queryFn`.\n\n#### networkMode\n\n`online' | 'always' | 'offlineFirst' | undefined`\n\n- Defaults to `'online'`\n- see [Network Mode](https://tanstack.com/query/v5/docs/react/guides/network-mode) for more information.\n\n#### notifyOnChangeProps\n\n`string[] | 'all' | (() => string[] | 'all') | undefined`\n\n- If set, the component will only re-render if any of the listed properties change.\n- If set to `['data', 'error']` for example, the component will only re-render when the `data` or `error` properties change.\n- If set to `'all'`, the component will opt-out of smart tracking and re-render whenever a query is updated.\n- If set to a function, the function will be executed to compute the list of properties.\n- By default, access to properties will be tracked, and the component will only re-render when one of the tracked properties change.\n\n#### placeholderData\n\n`{{TData}} | ((previousValue: {{TData}} | undefined; previousQuery: Query | undefined) => {{TData}}) | undefined`\n\n- If set, this value will be used as the placeholder data for this particular query observer while the query is still in the `pending` state.\n- `placeholderData` is **not persisted** to the cache\n- If you provide a function for `placeholderData`, as a first argument you will receive previously watched query data if available, and the second argument will be the complete previousQuery instance.\n\n#### queryClient\n\n`QueryClient | undefined`\n\nUse this to use a custom `QueryClient`. Otherwise, the one from the nearest context will be used.\n\n#### refetchInterval\n\n`number | false | ((data: {{TData}} | undefined, query: Query) => number | false | undefined) | undefined`\n\n- If set to a number, all queries will continuously refetch at this frequency in milliseconds\n- If set to a function, the function will be executed with the latest data and query to compute a frequency\n\n#### refetchIntervalInBackground\n\n`boolean | undefined`\n\nIf set to `true`, queries that are set to continuously refetch with a `refetchInterval` will continue to refetch while their tab/window is in the background\n\n#### refetchOnMount\n\n`boolean | 'always' | ((query: Query) => boolean | 'always') | undefined`\n\n- Defaults to `true`\n- If set to `true`, the query will refetch on mount if the data is stale.\n- If set to `false`, the query will not refetch on mount.\n- If set to `'always'`, the query will always refetch on mount.\n- If set to a function, the function will be executed with the query to compute the value\n\n#### refetchOnReconnect\n\n`boolean | 'always' | ((query: Query) => boolean | 'always') | undefined`\n\n- Defaults to `true`\n- If set to `true`, the query will refetch on reconnect if the data is stale.\n- If set to `false`, the query will not refetch on reconnect.\n- If set to `'always'`, the query will always refetch on reconnect.\n- If set to a function, the function will be executed with the query to compute the value\n\n#### refetchOnWindowFocus\n\n`boolean | 'always' | ((query: Query) => boolean | 'always') | undefined`\n\n- Defaults to `true`\n- If set to `true`, the query will refetch on window focus if the data is stale.\n- If set to `false`, the query will not refetch on window focus.\n- If set to `'always'`, the query will always refetch on window focus.\n- If set to a function, the function will be executed with the query to compute the value\n\n#### retry\n\n`boolean | number | ((failureCount: number, error: {{TError}}) => boolean) | undefined`\n\n- If `false`, failed queries will not retry by default.\n- If `true`, failed queries will retry infinitely.\n- If set to a `number`, e.g. `3`, failed queries will retry until the failed query count meets that number.\n- Defaults to `3` on the client and `0` on the server\n\n#### retryDelay\n\n`number | ((retryAttempt: number, error: {{TError}}) => number) | undefined`\n\n- This function receives a `retryAttempt` integer and the actual Error and returns the delay to apply before the next attempt in milliseconds.\n- A function like `attempt => Math.min(attempt > 1 ? 2 ** attempt * 1000 : 1000, 30 * 1000)` applies exponential backoff.\n- A function like `attempt => attempt * 1000` applies linear backoff.\n\n#### retryOnMount\n\n`boolean | undefined`\n\nIf set to `false`, the query will not be retried on mount if it contains an error. Defaults to `true`.\n\n#### select\n\n`((data: {{TData}}) => unknown) | undefined`\n\nThis option can be used to transform or select a part of the data returned by the query function. It affects the returned `data` value, but does not affect what gets stored in the query cache.\n\n<div v-if=\"!hideQueryOptions?.includes('staleTime')\">\n\n#### staleTime\n\n`number | Infinity | undefined`\n\n- Defaults to `0`\n- The time in milliseconds after data is considered stale. This value only applies to the hook it is defined on.\n- If set to `Infinity`, the data will never be considered stale\n\n</div>\n\n#### structuralSharing\n\n`boolean | (((oldData: {{TData}} | undefined, newData: {{TData}}) => {{TData}})) | undefined`\n\n- Defaults to `true`\n- If set to `false`, structural sharing between query results will be disabled.\n- If set to a function, the old and new data values will be passed through this function, which should combine them into resolved data for the query. This way, you can retain references from the old data to improve performance even when that data contains non-serializable values.\n"
  },
  {
    "path": "site/shared/query-result.md",
    "content": "<!--\n<script setup>\nconst TData = 'TData'\nconst TError = 'TError'\nconst includeInfiniteQueryResult = false\n</script>\n-->\n\n<br />\n\n---\n\n[TanStack Query query docs](https://tanstack.com/query/v5/docs/react/reference/useQuery)\n\n### data\n\n`{{TData}}`\n\n- The last successfully resolved data for the query.\n- Defaults to `undefined`.\n\n### dataUpdatedAt\n\n`number`\n\nThe timestamp for when the query most recently returned the `status` as `'success'`.\n\n### error\n\n`null | {{TError}}`\n\n- The error object for the query, if an error was thrown.\n- Defaults to `null`\n\n### errorUpdatedAt\n\n`number`\n\nThe timestamp for when the query most recently returned the `status` as `'error'`.\n\n### errorUpdateCount\n\n`number`\n\nThe sum of all errors.\n\n### failureCount\n\n`number`\n\n- The failure count for the query.\n- Incremented every time the query fails.\n- Reset to `0` when the query succeeds.\n\n### failureReason\n\n`null | {{TError}}`\n\n- The failure reason for the query retry.\n- Reset to `null` when the query succeeds.\n\n<div v-if=\"includeInfiniteQueryOptions\">\n\n### fetchNextPage\n\n`(options?: FetchNextPageOptions) => Promise<InfiniteQueryObserverResult<{{TData}}, {{TError}}>>`\n\nThis function allows you to fetch the next \"page\" of results.\n\n### fetchPreviousPage\n\n`(options?: FetchPreviousPageOptions) => Promise<InfiniteQueryObserverResult<TData, TError>>`\n\nThis function allows you to fetch the previous \"page\" of results.\n\n### hasNextPage\n\n`boolean`\n\nThis will be `true` if there is a next page to be fetched (known via the `getNextPageParam` option).\n\n### hasPreviousPage\n\n`boolean`\n\nThis will be `true` if there is a previous page to be fetched (known via the `getPreviousPageParam` option).\n\n### isFetchingNextPage\n\n`boolean`\n\nWill be `true` while fetching the next page with `fetchNextPage`.\n\n### isFetchingPreviousPage\n\n`boolean`\n\nWill be `true` while fetching the previous page with `fetchPreviousPage`.\n\n</div>\n\n### fetchStatus\n\n`'fetching' | 'idle' | 'paused'`\n\n- `fetching` Is `true` whenever the queryFn is executing, which includes initial `pending` as well as background refetches.\n- `paused` The query wanted to fetch, but has been `paused`.\n- `idle` The query is not fetching.\n- See [Network Mode](https://tanstack.com/query/v5/docs/react/guides/network-mode) for more information.\n\n### isError / isPending / isSuccess\n\n`boolean`\n\nBoolean variables derived from [`status`](#status).\n\n### isFetched\n\n`boolean`\n\nWill be `true` if the query has been fetched.\n\n### isFetchedAfterMount\n\n`boolean`\n\n- Will be `true` if the query has been fetched after the component mounted.\n- This property can be used to not show any previously cached data.\n\n### isFetching / isPaused\n\n`boolean`\n\nBoolean variables derived from [`fetchStatus`](#fetchstatus).\n\n### isLoading\n\n`boolean`\n\n- Is `true` whenever the first fetch for a query is in-flight\n- Is the same as `isFetching && isPending`\n\n### isLoadingError\n\n`boolean`\n\nWill be `true` if the query failed while fetching for the first time.\n\n### isPlaceholderData\n\n`boolean`\n\nWill be `true` if the data shown is the placeholder data.\n\n### isRefetchError\n\n`boolean`\n\nWill be `true` if the query failed while refetching.\n\n### isRefetching\n\n`boolean`\n\n- Is `true` whenever a background refetch is in-flight, which _does not_ include initial `'pending'`.\n- Is the same as `isFetching && !isPending`\n\n### isStale\n\n`boolean`\n\nWill be `true` if the data in the cache is invalidated or if the data is older than the given `staleTime`.\n\n### refetch\n\n`(options: { cancelRefetch?: boolean | undefined; throwOnError?: boolean | undefined }) => Promise<UseQueryResult<{{TData}}, {{TError}}>>`\n\n- A function to manually refetch the query.\n- `throwOnError`\n  - When set to `true`, an error will be thrown if the query fails.\n  - When set to `false`, an error will be logged if the query fails.\n- `cancelRefetch`\n  - When set to `true`, a currently running request will be cancelled before a new request is made.\n  - When set to `false`, no refetch will be made if there is already a request running.\n  - Defaults to `true`\n\n### status\n\n`'error' | 'pending' | 'success'`\n\n- `pending` if there's no cached data and no query attempt was finished yet.\n- `error` if the query attempt resulted in an error. The corresponding `error` property has the error received from the attempted fetch\n- `success` if the query has received a response with no errors and is ready to display its data. The corresponding `data` property on the query is the data received from the successful fetch or if the query's `enabled` property is set to `false` and has not been fetched yet `data` is the first `initialData` supplied to the query on initialization.\n"
  },
  {
    "path": "site/shared/tempo-write-parameters.md",
    "content": "### account (optional)\n\n- **Type:** `Account | Address`\n\nAccount that will be used to send the transaction. Defaults to connected Wagmi account.\n\n### feeToken (optional)\n\n- **Type:** `Address | bigint`\n\nFee token for the transaction. \n\nCan be a TIP-20 token address or ID.\n\n### feePayer (optional)\n\n- **Type:** `Account | true`\n\nFee payer for the transaction. \n\nCan be a [Viem Account](https://viem.sh/docs/accounts/local/privateKeyToAccount), or `true` if a [Fee Payer Service](https://docs.tempo.xyz/sdk/typescript/server/handler.feePayer) will be used.\n\n### gas (optional)\n\n- **Type:** `bigint`\n\nGas limit for the transaction.\n\n### maxFeePerGas (optional)\n\n- **Type:** `bigint`\n\nMax fee per gas for the transaction.\n\n### maxPriorityFeePerGas (optional)\n\n- **Type:** `bigint`\n\nMax priority fee per gas for the transaction.\n\n### nonce (optional)\n\n- **Type:** `number`\n\nNonce for the transaction.\n\n### nonceKey (optional)\n\n- **Type:** `'expiring' | bigint`\n\nNonce key for the transaction. \n\n### validBefore (optional)\n\n- **Type:** `number`\n\nUnix timestamp before which the transaction must be included.\n\n### validAfter (optional)\n\n- **Type:** `number`\n\nUnix timestamp after which the transaction can be included.\n\n### throwOnReceiptRevert (optional)\n\n- **Type:** `boolean`\n- **Default:** `true`\n\nWhether to throw an error if the transaction receipt indicates a revert. Only applicable to `*Sync` actions.\n"
  },
  {
    "path": "site/shared/transports/custom.md",
    "content": "<!-- <script setup>\nconst packageName = 'wagmi'\n</script> -->\n\n# custom\n\nThe `custom` Transport connects to a JSON-RPC API via custom. Wraps Viem's [`custom` Transport](https://viem.sh/docs/clients/transports/custom).\n\n## Import\n\n```ts-vue\nimport { custom } from '{{packageName}}'\n```\n\n## Usage\n\n```ts-vue\nimport { \n  createConfig, \n  custom // [!code hl]\n} from '{{packageName}}'\nimport { mainnet } from '{{packageName}}/chains'\nimport { customRpc } from './rpc'\n\nexport const config = createConfig({\n  chains: [mainnet],\n  connectors: [injected()],\n  transports: {\n    [mainnet.id]: custom({ // [!code hl]\n      async request({ method, params }) { // [!code hl]\n        const response = await customRpc.request(method, params) // [!code hl]\n        return response // [!code hl]\n      } // [!code hl]\n    }) // [!code hl]\n  },\n})\n```\n\n## Parameters\n\n### provider\n\n`{ request({ method: string, params: unknown[] }): Promise<unknown> }`\n\nAn [EIP-1193 `request` function](https://eips.ethereum.org/EIPS/eip-1193#request) function.\n\n```ts\nimport { customRpc } from './rpc'\n\nconst transport = custom({\n  async request({ method, params }) { // [!code focus:3]\n    const response = await customRpc.request(method, params)\n    return response\n  }\n})\n```\n\n### key (optional)\n\n`string`\n\nA key for the Transport. Defaults to `\"custom\"`.\n\n```ts\nconst transport = custom(\n  provider,\n  { \n    key: 'windowProvider', // [!code focus]\n  }\n)\n```\n\n### name (optional)\n\n`string`\n\nA name for the Transport. Defaults to `\"Ethereum Provider\"`.\n\n```ts\nconst transport = custom(\n  provider,\n  { \n    name: 'Window Ethereum Provider', // [!code focus]\n  }\n)\n```\n\n### retryCount (optional)\n\n`number`\n\nThe max number of times to retry when a request fails. Defaults to `3`.\n\n```ts\nconst transport = custom(provider, {\n  retryCount: 5, // [!code focus]\n})\n```\n\n### retryDelay (optional)\n\n`number`\n\nThe base delay (in ms) between retries. By default, the Transport will use [exponential backoff](https://en.wikipedia.org/wiki/Exponential_backoff) (`~~(1 << count) * retryDelay`), which means the time between retries is not constant.\n\n```ts\nconst transport = custom(provider, {\n  retryDelay: 100, // [!code focus]\n})\n```"
  },
  {
    "path": "site/shared/transports/fallback.md",
    "content": "<!-- <script setup>\nconst packageName = 'wagmi'\n</script> -->\n\n# fallback\n\nThe `fallback` Transport consumes **multiple** Transports. If a Transport request fails, it will fall back to the next one in the list. Wraps Viem's [`fallback` Transport](https://viem.sh/docs/clients/transports/fallback).\n\n## Import\n\n```ts-vue\nimport { fallback } from '{{packageName}}'\n```\n\n## Usage\n\n```ts-vue\nimport { \n  createConfig, \n  fallback, // [!code hl]\n  http,\n} from '{{packageName}}'\nimport { mainnet } from '{{packageName}}/chains'\n\nexport const config = createConfig({\n  chains: [mainnet],\n  connectors: [injected()],\n  transports: {\n    [mainnet.id]: fallback([ // [!code hl]\n      http('https://foo-bar-baz.quiknode.pro/...'), // [!code hl]\n      http('https://mainnet.infura.io/v3/...'), // [!code hl]\n    ]) // [!code hl]\n  },\n})\n```\n\n"
  },
  {
    "path": "site/shared/transports/http.md",
    "content": "<!-- <script setup>\nconst packageName = 'wagmi'\n</script> -->\n\n# http\n\nThe `http` Transport connects to a JSON-RPC API via HTTP. Wraps Viem's [`http` Transport](https://viem.sh/docs/clients/transports/http).\n\n## Import\n\n```ts-vue\nimport { http } from '{{packageName}}'\n```\n\n## Usage\n\n```ts-vue\nimport { \n  createConfig, \n  http // [!code hl]\n} from '{{packageName}}'\nimport { mainnet, sepolia } from '{{packageName}}/chains'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  connectors: [injected()],\n  transports: {\n    [mainnet.id]: http('https://foo-bar-baz.quiknode.pro/...'), // [!code hl]\n    [sepolia.id]: http('https://foo-bar-sep.quiknode.pro/...'), // [!code hl]\n  },\n})\n```\n\n::: warning\nIf no URL is provided, then the transport will fall back to a public RPC URL on the chain. It is highly recommended to provide an authenticated RPC URL to prevent rate-limiting.\n:::\n\n### Batch JSON-RPC\n\nThe `http` Transport supports Batch JSON-RPC. This means that multiple JSON-RPC requests can be sent in a single HTTP request.\n\nThe Transport will batch up Actions over a given period and execute them in a single Batch JSON-RPC HTTP request. By default, this period is a [zero delay](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Event_loop#zero_delays) meaning that the batch request will be executed at the end of the current [JavaScript message queue](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Event_loop#queue). Consumers can specify a custom time period `wait` (in ms).\n\nYou can enable Batch JSON-RPC by setting the `batch` flag to `true`:\n\n```ts \nconst transport = http('https://foo-bar-baz.quiknode.pro/...', {\n  batch: true // [!code hl]\n})\n```\n\n## Parameters\n\n### url\n\n`string`\n\nURL of the JSON-RPC API. Defaults to `chain.rpcUrls.default.http[0]`.\n\n```ts\nconst transport = http('https://foo-bar-baz.quiknode.pro/...')\n```\n\n### batch\n\n`boolean | BatchOptions`\n\nToggle to enable Batch JSON-RPC. Defaults to `false`\n\n```ts \nconst transport = http('https://foo-bar-baz.quiknode.pro/...', {\n  batch: true // [!code focus]\n})\n```\n\n### batch.batchSize\n\n`number`\n\nThe maximum number of JSON-RPC requests to send in a batch. Defaults to `1_000`.\n\n```ts \nconst transport = http('https://foo-bar-baz.quiknode.pro/...', {\n  batch: {\n    batchSize: 2_000 // [!code focus]\n  }\n})\n```\n\n### batch.wait\n\n`number`\n\nThe maximum number of milliseconds to wait before sending a batch. Defaults to `0` ([zero delay](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Event_loop#zero_delays)).\n\n```ts \nconst transport = http('https://foo-bar-baz.quiknode.pro/...', {\n  batch: {\n    wait: 16 // [!code focus]\n  }\n})\n```\n\n### fetchOptions\n\n[`RequestInit`](https://developer.mozilla.org/en-US/docs/Web/API/fetch)\n\n[Fetch options](https://developer.mozilla.org/en-US/docs/Web/API/fetch) to pass to the internal `fetch` function. Useful for passing auth headers or cache options.\n\n```ts\nconst transport = http('https://foo-bar-baz.quiknode.pro/...', {\n  fetchOptions: { // [!code focus:5]\n    headers: {\n      'Authorization': 'Bearer ...'\n    }\n  }\n})\n```\n\n### key\n\n`string`\n\nA key for the Transport. Defaults to `\"http\"`.\n\n```ts\nconst transport = http('https://foo-bar-baz.quiknode.pro/...', {\n  key: 'alchemy', // [!code focus]\n})\n```\n\n### name\n\n`string`\n\nA name for the Transport. Defaults to `\"HTTP JSON-RPC\"`.\n\n```ts\nconst transport = http('https://foo-bar-baz.quiknode.pro/...', {\n  name: 'Alchemy HTTP Provider', // [!code focus]\n})\n```\n\n### retryCount\n\n`number`\n\nThe max number of times to retry when a request fails. Defaults to `3`.\n\n```ts\nconst transport = http('https://foo-bar-baz.quiknode.pro/...', {\n  retryCount: 5, // [!code focus]\n})\n```\n\n### retryDelay\n\n`number`\n\nThe base delay (in ms) between retries. By default, the Transport will use [exponential backoff](https://en.wikipedia.org/wiki/Exponential_backoff) (`~~(1 << count) * retryDelay`), which means the time between retries is not constant.\n\n```ts\nconst transport = http('https://foo-bar-baz.quiknode.pro/...', {\n  retryDelay: 100, // [!code focus]\n})\n```\n\n### timeout\n\n`number`\n\nThe timeout for requests. Defaults to `10_000`.\n\n```ts\nconst transport = http('https://foo-bar-baz.quiknode.pro/...', {\n  timeout: 60_000, // [!code focus]\n})\n```\n"
  },
  {
    "path": "site/shared/transports/unstable_connector.md",
    "content": "<!-- <script setup>\nconst docsPath = 'core'\nconst packageName = 'wagmi'\n</script> -->\n\n# unstable_connector\n\nThe `unstable_connector` Transport connects to a JSON-RPC API via the provided <a :href=\"`/${docsPath}/api/connectors`\">Connector</a>. \n\nFor example, if the provided Connector is <a :href=\"`/${docsPath}/api/connectors/injected`\">`injected`</a> and the end-user uses MetaMask, then outgoing JSON-RPC requests will be sent via the MetaMask EIP-1193 Provider (`window.ethereum`).\n\n## Import\n\n```ts-vue\nimport { unstable_connector } from '{{packageName}}'\n```\n\n## Usage\n\n```ts-vue\nimport { \n  createConfig, \n  fallback,\n  unstable_connector, // [!code hl]\n} from '{{packageName}}'\nimport { mainnet } from '{{packageName}}/chains'\n\nexport const config = createConfig({\n  chains: [mainnet],\n  connectors: [injected()],\n  transports: {\n    [mainnet.id]: fallback([\n      unstable_connector(injected), // [!code hl]\n      http('https://foo-bar-baz.quiknode.pro/...')\n    ])\n  },\n})\n```\n\n::: warning\nIt is **highly recommended** to use the `unstable_connector` Transport inside of a <a :href=\"`/${docsPath}/api/transports/fallback`\">`fallback` Transport</a>. This ensures that if the Connector request fails, the Transport will fall back to a different Transport in the fallback set. \n\nSome common cases for a Connector request to fail are: \n\n- Chain ID mismatches,\n- Connector RPC not supporting the requested method and/or only supporting a subset of methods for connected accounts,\n- Rate-limiting of Connector RPC.\n:::\n\n## Parameters\n\n### connector\n\n`Connector`\n\nThe Connector to use for the Transport.\n\n```ts\nimport { unstable_connector } from 'wagmi'\nimport { safe } from 'wagmi/connectors'\n\nconst transport = unstable_connector(safe) // [!code focus]\n```\n\n### key (optional)\n\n`string`\n\nA key for the Transport. Defaults to `\"connector\"`.\n\n```ts\nimport { unstable_connector } from 'wagmi'\nimport { injected } from 'wagmi/connectors'\n\nconst transport = unstable_connector(injected, { \n  key: 'injected',  // [!code focus]\n})\n```\n\n### name (optional)\n\n`string`\n\nA name for the Transport. Defaults to `\"Connector\"`.\n\n```ts\nimport { unstable_connector } from 'wagmi'\nimport { injected } from 'wagmi/connectors'\n\nconst transport = unstable_connector(injected, { \n  name: 'Injected',  // [!code focus]\n})\n```\n\n### retryCount (optional)\n\n`number`\n\nThe max number of times to retry when a request fails. Defaults to `3`.\n\n```ts\nimport { unstable_connector } from 'wagmi'\nimport { injected } from 'wagmi/connectors'\n\nconst transport = unstable_connector(injected, {\n  retryCount: 5, // [!code focus]\n})\n```\n\n### retryDelay (optional)\n\n`number`\n\nThe base delay (in ms) between retries. By default, the Transport will use [exponential backoff](https://en.wikipedia.org/wiki/Exponential_backoff) (`~~(1 << count) * retryDelay`), which means the time between retries is not constant.\n\n```ts\nimport { unstable_connector } from 'wagmi'\nimport { injected } from 'wagmi/connectors'\n\nconst transport = unstable_connector(injected, {\n  retryDelay: 100, // [!code focus]\n})\n```\n"
  },
  {
    "path": "site/shared/transports/webSocket.md",
    "content": "<!-- <script setup>\nconst packageName = 'wagmi'\n</script> -->\n\n# webSocket\n\nThe `webSocket` Transport connects to a JSON-RPC API via a WebSocket. Wraps Viem's [`webSocket` Transport](https://viem.sh/docs/clients/transports/websocket).\n\n## Import\n\n```ts-vue\nimport { webSocket } from '{{packageName}}'\n```\n\n## Usage\n\n```ts-vue\nimport { \n  createConfig, \n  webSocket // [!code hl]\n} from '{{packageName}}'\nimport { mainnet, sepolia } from '{{packageName}}/chains'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  connectors: [injected()],\n  transports: {\n    [mainnet.id]: webSocket('wss://foo-bar-baz.quiknode.pro/...'), // [!code hl]\n    [sepolia.id]: webSocket('wss://foo-bar-sep.quicknode.pro/...'), // [!code hl]\n  },\n})\n```\n\n::: warning\nIf no URL is provided, then the transport will fall back to a public RPC URL on the chain. It is highly recommended to provide an authenticated RPC URL to prevent rate-limiting.\n:::\n\n## Parameters\n\n### url\n\n`string`\n\nURL of the JSON-RPC API.\n\n```ts\nconst transport = webSocket('wss://foo-bar-baz.quiknode.pro/...')\n```\n\n### key (optional)\n\n`string`\n\nA key for the Transport. Defaults to `\"webSocket\"`.\n\n```ts\nconst transport = webSocket('wss://foo-bar-baz.quiknode.pro/...', { \n  key: 'alchemy',  // [!code focus]\n})\n```\n\n### name (optional)\n\n`string`\n\nA name for the Transport. Defaults to `\"WebSocket JSON-RPC\"`.\n\n```ts\nconst transport = webSocket('wss://foo-bar-baz.quiknode.pro/...', { \n  name: 'Alchemy WebSocket Provider',  // [!code focus]\n})\n```\n\n### retryCount (optional)\n\n`number`\n\nThe max number of times to retry when a request fails. Defaults to `3`.\n\n```ts\nconst transport = webSocket('wss://foo-bar-baz.quiknode.pro/...', {\n  retryCount: 5, // [!code focus]\n})\n```\n\n### retryDelay (optional)\n\n`number`\n\nThe base delay (in ms) between retries. By default, the Transport will use [exponential backoff](https://en.wikipedia.org/wiki/Exponential_backoff) (`~~(1 << count) * retryDelay`), which means the time between retries is not constant.\n\n```ts\nconst transport = webSocket('wss://foo-bar-baz.quiknode.pro/...', {\n  retryDelay: 100, // [!code focus]\n})\n```\n\n### timeout (optional)\n\n`number`\n\nThe timeout for async WebSocket requests. Defaults to `10_000`.\n\n```ts\nconst transport = webSocket('wss://foo-bar-baz.quiknode.pro/...', {\n  timeout: 60_000, // [!code focus]\n})\n```\n"
  },
  {
    "path": "site/shared/utilities/cookieToInitialState.md",
    "content": "<!--\n<script setup>\nconst packageName = 'wagmi'\n</script>\n-->\n\n# cookieToInitialState\n\nHelper to convert a cookie string into [initial state](/react/api/WagmiProvider#initialstate).\n\n## Import\n\n```ts-vue\nimport { cookieToInitialState } from '{{packageName}}'\n```\n\n## Usage\n\n::: code-group\n\n```ts-vue [server.ts]\nimport { cookieToInitialState } from '{{packageName}}'\nimport config from './config'\n\nfunction handler(req: Request) {\n  const initialState = cookieToInitialState(config, req.headers.cookie)\n  // ...\n}\n```\n\n```ts-vue [config.ts]\nimport { \n  createConfig, \n  http, \n  cookieStorage,\n  createStorage\n} from '{{packageName}}'\nimport { mainnet, sepolia } from '{{packageName}}/chains'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  ssr: true,\n  storage: createStorage({ \n    storage: cookieStorage,\n  }), \n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n```\n\n:::\n\n## Parameters\n\n### config\n\n`Config`\n\nWagmi Config\n\n\n### cookie\n\n`string | null | undefined`\n\nThe cookie string.\n\n## Return Type\n\n`State`\n\nInitial state."
  },
  {
    "path": "site/shared/utilities/deserialize.md",
    "content": "<!--\n<script setup>\nconst packageName = 'wagmi'\n</script>\n-->\n\n# deserialize\n\nDeserialize function that supports `bigint` and `Map`.\n\n## Import\n\n```ts-vue\nimport { deserialize } from '{{packageName}}'\n```\n\n## Usage\n\n```ts-vue\nimport { deserialize } from '{{packageName}}'\n\nconst result = deserialize('{\"foo\":\"wagmi\",\"bar\":{\"__type\":\"bigint\",\"value\":\"123\"}}')\n```\n\n## Parameters\n\n### value\n\n`string`\n\nThe string to deserialize.\n\n\n### reviver\n\n`(key: string, value: any) => any`\n\nA custom reviver function for handling standard values.\n\n## Return Type\n\n`unknown`\n\nParsed value."
  },
  {
    "path": "site/shared/utilities/serialize.md",
    "content": "<!--\n<script setup>\nconst packageName = 'wagmi'\n</script>\n-->\n\n# serialize\n\nSerialize function that supports `bigint` and `Map`.\n\n## Import\n\n```ts-vue\nimport { serialize } from '{{packageName}}'\n```\n\n## Usage\n\n```ts-vue\nimport { serialize } from '{{packageName}}'\n\nconst result = serialize({ foo: 'wagmi', bar: 123n })\n```\n\n## Parameters\n\n### value\n\n`any`\n\nThe value to stringify.\n\n### replacer\n\n`(key: string, value: any) => any`\n\nA custom replacer function for handling standard values.\n\n### indent\n\n`number | null | undefined`\n\nThe number of spaces to indent the output by.\n\n### circularReplacer\n\nA custom replacer function for handling circular values.\n\n## Return Type\n\n`string`\n\nStringified value."
  },
  {
    "path": "site/snippets/abi-event.ts",
    "content": "export const abi = [\n  {\n    type: 'event',\n    name: 'Approval',\n    inputs: [\n      { indexed: true, name: 'owner', type: 'address' },\n      { indexed: true, name: 'spender', type: 'address' },\n      { indexed: false, name: 'value', type: 'uint256' },\n    ],\n  },\n  {\n    type: 'event',\n    name: 'Transfer',\n    inputs: [\n      { indexed: true, name: 'from', type: 'address' },\n      { indexed: true, name: 'to', type: 'address' },\n      { indexed: false, name: 'value', type: 'uint256' },\n    ],\n  },\n] as const\n"
  },
  {
    "path": "site/snippets/abi-infinite-read.ts",
    "content": "export const abi = [\n  {\n    inputs: [{ internalType: 'uint256', name: 'tokenId', type: 'uint256' }],\n    name: 'getChest',\n    outputs: [{ internalType: 'string', name: '', type: 'string' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [{ internalType: 'uint256', name: 'tokenId', type: 'uint256' }],\n    name: 'getFoot',\n    outputs: [{ internalType: 'string', name: '', type: 'string' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [{ internalType: 'uint256', name: 'tokenId', type: 'uint256' }],\n    name: 'getHand',\n    outputs: [{ internalType: 'string', name: '', type: 'string' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n] as const\n"
  },
  {
    "path": "site/snippets/abi-read.ts",
    "content": "export const abi = [\n  {\n    type: 'function',\n    name: 'balanceOf',\n    stateMutability: 'view',\n    inputs: [{ name: 'account', type: 'address' }],\n    outputs: [{ type: 'uint256' }],\n  },\n  {\n    type: 'function',\n    name: 'totalSupply',\n    stateMutability: 'view',\n    inputs: [],\n    outputs: [{ name: 'supply', type: 'uint256' }],\n  },\n] as const\n"
  },
  {
    "path": "site/snippets/abi-write.ts",
    "content": "export const abi = [\n  {\n    type: 'function',\n    name: 'approve',\n    stateMutability: 'nonpayable',\n    inputs: [\n      { name: 'spender', type: 'address' },\n      { name: 'amount', type: 'uint256' },\n    ],\n    outputs: [{ type: 'bool' }],\n  },\n  {\n    type: 'function',\n    name: 'transferFrom',\n    stateMutability: 'nonpayable',\n    inputs: [\n      { name: 'sender', type: 'address' },\n      { name: 'recipient', type: 'address' },\n      { name: 'amount', type: 'uint256' },\n    ],\n    outputs: [{ type: 'bool' }],\n  },\n] as const\n"
  },
  {
    "path": "site/snippets/core/config-chain-properties.ts",
    "content": "import { createConfig, http } from '@wagmi/core'\nimport { base, celo, mainnet } from '@wagmi/core/chains'\n\nexport const config = createConfig({\n  chains: [base, celo, mainnet],\n  transports: {\n    [base.id]: http(),\n    [celo.id]: http(),\n    [mainnet.id]: http(),\n  },\n})\n"
  },
  {
    "path": "site/snippets/core/config-tempo.ts",
    "content": "import { createConfig, http } from '@wagmi/core'\nimport { tempoTestnet } from '@wagmi/core/chains'\nimport { KeyManager, webAuthn } from '@wagmi/core/tempo'\n\nexport const config = createConfig({\n  connectors: [\n    webAuthn({\n      keyManager: KeyManager.localStorage(),\n    }),\n  ],\n  chains: [tempoTestnet],\n  multiInjectedProviderDiscovery: false,\n  transports: {\n    [tempoTestnet.id]: http(),\n  },\n})\n"
  },
  {
    "path": "site/snippets/core/config.ts",
    "content": "import { createConfig, http } from '@wagmi/core'\nimport { mainnet, sepolia } from '@wagmi/core/chains'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n"
  },
  {
    "path": "site/snippets/react/app.tsx",
    "content": "import { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport * as React from 'react'\nimport { WagmiProvider } from 'wagmi'\nimport { config } from './config'\n\nexport const queryClient = new QueryClient()\n\nexport function App() {\n  return (\n    <WagmiProvider config={config}>\n      <QueryClientProvider client={queryClient}>\n        {/** ... */}\n      </QueryClientProvider>\n    </WagmiProvider>\n  )\n}\n"
  },
  {
    "path": "site/snippets/react/config-chain-properties.ts",
    "content": "import { createConfig, http } from 'wagmi'\nimport { base, celo, mainnet } from 'wagmi/chains'\n\nexport const config = createConfig({\n  chains: [base, celo, mainnet],\n  transports: {\n    [base.id]: http(),\n    [celo.id]: http(),\n    [mainnet.id]: http(),\n  },\n})\n\ndeclare module 'wagmi' {\n  interface Register {\n    config: typeof config\n  }\n}\n"
  },
  {
    "path": "site/snippets/react/config-tempo.ts",
    "content": "import { createConfig, http } from 'wagmi'\nimport { tempoTestnet } from 'wagmi/chains'\nimport { KeyManager, webAuthn } from 'wagmi/tempo'\n\nexport const config = createConfig({\n  connectors: [\n    webAuthn({\n      keyManager: KeyManager.localStorage(),\n    }),\n  ],\n  chains: [tempoTestnet],\n  multiInjectedProviderDiscovery: false,\n  transports: {\n    [tempoTestnet.id]: http(),\n  },\n})\n"
  },
  {
    "path": "site/snippets/react/config.ts",
    "content": "import { createConfig, http } from 'wagmi'\nimport { mainnet, sepolia } from 'wagmi/chains'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n"
  },
  {
    "path": "site/snippets/solid/config.ts",
    "content": "import { createConfig, http } from '@wagmi/solid'\nimport { mainnet, sepolia } from '@wagmi/solid/chains'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n"
  },
  {
    "path": "site/snippets/typedData.ts",
    "content": "import type { TypedData } from 'viem'\n\nexport const types = {\n  Person: [\n    { name: 'name', type: 'string' },\n    { name: 'wallet', type: 'address' },\n  ],\n  Mail: [\n    { name: 'from', type: 'Person' },\n    { name: 'to', type: 'Person' },\n    { name: 'contents', type: 'string' },\n  ],\n} as const satisfies TypedData\n"
  },
  {
    "path": "site/snippets/vue/App.vue",
    "content": "<script setup lang=\"ts\">\n</script>\n\n<template>\n</template>"
  },
  {
    "path": "site/snippets/vue/config-chain-properties.ts",
    "content": "import { createConfig, http } from '@wagmi/vue'\nimport { base, celo, mainnet } from '@wagmi/vue/chains'\n\nexport const config = createConfig({\n  chains: [base, celo, mainnet],\n  transports: {\n    [base.id]: http(),\n    [celo.id]: http(),\n    [mainnet.id]: http(),\n  },\n})\n\ndeclare module '@wagmi/vue' {\n  interface Register {\n    config: typeof config\n  }\n}\n"
  },
  {
    "path": "site/snippets/vue/config.ts",
    "content": "import { createConfig, http } from '@wagmi/vue'\nimport { mainnet, sepolia } from '@wagmi/vue/chains'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n"
  },
  {
    "path": "site/snippets/vue/main.ts",
    "content": "import { QueryClient, VueQueryPlugin } from '@tanstack/vue-query'\nimport { WagmiPlugin } from '@wagmi/vue'\nimport { createApp } from 'vue'\n\nimport App from './App.vue'\nimport { config } from './config'\n\nexport const queryClient = new QueryClient()\n\ncreateApp(App)\n  .use(WagmiPlugin, { config })\n  .use(VueQueryPlugin, { queryClient })\n  .mount('#app')\n"
  },
  {
    "path": "site/solid/api/WagmiProvider.md",
    "content": "# WagmiProvider\n\nSolid Context Provider for Wagmi.\n\n## Import\n\n```ts\nimport { WagmiProvider } from '@wagmi/solid'\n```\n\n## Usage\n\n```tsx\nimport { WagmiProvider } from '@wagmi/solid'\nimport { config } from './config'\n\nfunction App() {\n  return (\n    <WagmiProvider config={config}>\n      {/** ... */}\n    </WagmiProvider>\n  )\n}\n```\n\n## Parameters\n\n```ts\nimport { type WagmiProviderProps } from '@wagmi/solid'\n```\n\n### config\n\n[`Config`](/solid/api/createConfig#config) object to inject with context.\n\n```tsx\nimport { WagmiProvider } from '@wagmi/solid'\nimport { config } from './config'\n\nfunction App() {\n  return (\n    <WagmiProvider\n      config={config} // [!code focus]\n    >\n      {/** ... */}\n    </WagmiProvider>\n  )\n}\n```\n\n### initialState\n\n`State | undefined`\n\n- Initial state to hydrate into the [Wagmi Config](/solid/api/createConfig). Useful for SSR.\n\n```tsx\nimport { WagmiProvider } from '@wagmi/solid'\nimport { config } from './config'\n\nfunction App() {\n  return (\n    <WagmiProvider\n      config={config}\n      initialState={/* ... */} // [!code focus]\n    >\n      {/** ... */}\n    </WagmiProvider>\n  )\n}\n```\n\n### reconnectOnMount\n\n`boolean | undefined`\n\n- Whether or not to reconnect previously connected [connectors](/solid/api/createConfig#connectors) on mount.\n- Defaults to `true`.\n\n```tsx\nimport { WagmiProvider } from '@wagmi/solid'\nimport { config } from './config'\n\nfunction App() {\n  return (\n    <WagmiProvider\n      config={config}\n      reconnectOnMount={false} // [!code focus]\n    >\n      {/** ... */}\n    </WagmiProvider>\n  )\n}\n```\n\n## Context\n\n```ts\nimport { type WagmiContext } from '@wagmi/solid'\n```\n"
  },
  {
    "path": "site/solid/api/actions.md",
    "content": "# Actions\n\n`@wagmi/solid` exports all of the actions from `@wagmi/core`. These actions can be used for lower-level control or when you need to interact with Wagmi outside of Solid components.\n\n## Import\n\n```ts\nimport { getBalance, sendTransaction } from '@wagmi/solid/actions'\n```\n\n## Usage\n\n```ts\nimport { getBalance } from '@wagmi/solid/actions'\nimport { config } from './config'\n\nconst balance = await getBalance(config, {\n  address: '0x...',\n})\n```\n\n## Available Actions\n\nSee the [`@wagmi/core` Actions docs](/core/api/actions) for the full list of available actions and their documentation.\n\n## When to Use Actions vs Primitives\n\n**Use Primitives when:**\n- You need reactive data in your Solid components\n- You want automatic caching and refetching\n- You're building UI that displays blockchain data\n\n**Use Actions when:**\n- You need imperative control over when data is fetched\n- You're working outside of Solid components\n- You need to chain multiple operations together\n- You're building utilities or helper functions\n\n## Example: Using Actions with Primitives\n\n```tsx\nimport { useConnection } from '@wagmi/solid'\nimport { signMessage } from '@wagmi/solid/actions'\nimport { config } from './config'\n\nfunction SignMessage() {\n  const connection = useConnection()\n\n  const handleSign = async () => {\n    if (!connection.address) return\n    \n    const signature = await signMessage(config, {\n      message: 'Hello, World!',\n    })\n    console.log('Signature:', signature)\n  }\n\n  return (\n    <button onClick={handleSign}>\n      Sign Message\n    </button>\n  )\n}\n```\n"
  },
  {
    "path": "site/solid/api/chains.md",
    "content": "<script setup>\nimport packageJson from '../../../package.json'\nimport SearchChains from '../../components/SearchChains.vue'\n\nconst viemVersion = packageJson.devDependencies.viem\n</script>\n\n# Chains\n\nViem `Chain` objects. More info at the [Viem docs](https://viem.sh/docs/chains/introduction).\n\n## Import\n\nImport via the `'@wagmi/solid/chains'` entrypoint (proxies all chains from `'viem/chains'`).\n\n```ts\nimport { mainnet } from '@wagmi/solid/chains'\n```\n\n## Available Chains\n\nChain definitions as of `viem@{{viemVersion}}`. For `viem@latest`, visit the [Viem repo](https://github.com/wevm/viem/blob/main/src/chains/index.ts).\n\n<SearchChains />\n\n<!--@include: @shared/create-chain.md-->\n"
  },
  {
    "path": "site/solid/api/connectors/baseAccount.md",
    "content": "---\ntitle: baseAccount\n---\n\n<script setup>\nconst docsPath = 'solid'\nconst packageName = '@wagmi/solid'\nconst connectorsPackageName = '@wagmi/solid/connectors'\n</script>\n\n<!-- @include: @shared/connectors/baseAccount.md -->\n"
  },
  {
    "path": "site/solid/api/connectors/injected.md",
    "content": "---\ntitle: injected\n---\n\n<script setup>\nconst docsPath = 'solid'\nconst packageName = '@wagmi/solid'\nconst connectorsPackageName = '@wagmi/solid/connectors'\n</script>\n\n<!-- @include: @shared/connectors/injected.md -->\n"
  },
  {
    "path": "site/solid/api/connectors/metaMask.md",
    "content": "---\ntitle: metaMask\n---\n\n<script setup>\nconst docsPath = 'solid'\nconst packageName = '@wagmi/solid'\nconst connectorsPackageName = '@wagmi/solid/connectors'\n</script>\n\n<!-- @include: @shared/connectors/metaMask.md -->\n"
  },
  {
    "path": "site/solid/api/connectors/mock.md",
    "content": "---\ntitle: mock\n---\n\n<script setup>\nconst docsPath = 'solid'\nconst packageName = '@wagmi/solid'\nconst connectorsPackageName = '@wagmi/solid/connectors'\n</script>\n\n<!-- @include: @shared/connectors/mock.md -->\n"
  },
  {
    "path": "site/solid/api/connectors/porto.md",
    "content": "---\ntitle: porto\n---\n\n<script setup>\nconst docsPath = 'solid'\nconst packageName = '@wagmi/solid'\nconst connectorsPackageName = '@wagmi/solid/connectors'\n</script>\n\n<!-- @include: @shared/connectors/porto.md -->\n"
  },
  {
    "path": "site/solid/api/connectors/safe.md",
    "content": "---\ntitle: safe\n---\n\n<script setup>\nconst docsPath = 'solid'\nconst packageName = '@wagmi/solid'\nconst connectorsPackageName = '@wagmi/solid/connectors'\n</script>\n\n<!-- @include: @shared/connectors/safe.md -->\n"
  },
  {
    "path": "site/solid/api/connectors/walletConnect.md",
    "content": "---\ntitle: walletConnect\n---\n\n<script setup>\nconst docsPath = 'solid'\nconst packageName = '@wagmi/solid'\nconst connectorsPackageName = '@wagmi/solid/connectors'\n</script>\n\n<!-- @include: @shared/connectors/walletConnect.md -->\n"
  },
  {
    "path": "site/solid/api/connectors.md",
    "content": "<script setup>\nimport { getSidebar } from '../../.vitepress/sidebar'\n\nconst connectors = getSidebar()['/solid']\n  .find(x => x.text.includes('Configuration')).items\n  .find(x => x.text.includes('Connectors')).items\n  .sort((a, b) => a.text.localeCompare(b.text))\n</script>\n\n# Connectors\n\nConnectors for popular wallet providers and protocols.\n\n## Import\n\nImport via the `'@wagmi/solid/connectors'` entrypoint.\n\n```ts\nimport { injected } from '@wagmi/solid/connectors'\n```\n\n## Available Connectors\n\n::: tip\nSome connectors require third-party packages. See the \"Install\" section on each connector's page for more info on license, version, and more.\n:::\n\n<ul>\n  <li v-for=\"connector of connectors\">\n    <a :href=\"connector.link\">{{ connector.text }}</a>\n  </li>\n</ul>\n"
  },
  {
    "path": "site/solid/api/createConfig.md",
    "content": "---\ntitle: createConfig\n---\n\n<script setup>\nconst docsPath = 'solid'\nconst packageName = '@wagmi/solid'\nconst connectorsPackageName = '@wagmi/solid/connectors'\n</script>\n\n<!--@include: @shared/createConfig.md-->\n"
  },
  {
    "path": "site/solid/api/createStorage.md",
    "content": "---\ntitle: createStorage\n---\n\n<script setup>\nconst docsPath = 'solid'\nconst packageName = '@wagmi/solid'\n</script>\n\n<!--@include: @shared/createStorage.md-->\n"
  },
  {
    "path": "site/solid/api/errors.md",
    "content": "# Errors\n\n`@wagmi/solid` exports error types that can be used for type-safe error handling.\n\n## Import\n\n```ts\nimport { \n  BaseError,\n  ChainNotConfiguredError,\n  ConnectorNotFoundError,\n  // ...\n} from '@wagmi/solid'\n```\n\n## Base Error\n\nAll Wagmi errors extend from `BaseError`:\n\n```ts\nimport { BaseError } from '@wagmi/solid'\n\ntry {\n  // Wagmi operation\n} catch (error) {\n  if (error instanceof BaseError) {\n    console.error('Wagmi error:', error.message)\n    console.error('Details:', error.details)\n  }\n}\n```\n\n## Available Errors\n\n### ChainNotConfiguredError\n\nThrown when trying to use a chain that isn't configured in your Wagmi config.\n\n```ts\nimport { ChainNotConfiguredError } from '@wagmi/solid'\n\ntry {\n  // Operation with unconfigured chain\n} catch (error) {\n  if (error instanceof ChainNotConfiguredError) {\n    console.error('Chain not configured:', error.message)\n  }\n}\n```\n\n### ConnectorNotFoundError\n\nThrown when trying to use a connector that doesn't exist or isn't available.\n\n```ts\nimport { ConnectorNotFoundError } from '@wagmi/solid'\n\ntry {\n  // Connect operation\n} catch (error) {\n  if (error instanceof ConnectorNotFoundError) {\n    console.error('Wallet not installed')\n  }\n}\n```\n\n### ConnectorAlreadyConnectedError\n\nThrown when trying to connect with a connector that's already connected.\n\n```ts\nimport { ConnectorAlreadyConnectedError } from '@wagmi/solid'\n\ntry {\n  // Connect operation\n} catch (error) {\n  if (error instanceof ConnectorAlreadyConnectedError) {\n    console.error('Already connected')\n  }\n}\n```\n\n### ProviderNotFoundError\n\nThrown when the connector's provider is not found.\n\n```ts\nimport { ProviderNotFoundError } from '@wagmi/solid'\n\ntry {\n  // Provider operation\n} catch (error) {\n  if (error instanceof ProviderNotFoundError) {\n    console.error('Provider not found')\n  }\n}\n```\n\n### SwitchChainNotSupportedError\n\nThrown when the connector doesn't support programmatic chain switching.\n\n```ts\nimport { SwitchChainNotSupportedError } from '@wagmi/solid'\n\ntry {\n  // Switch chain operation\n} catch (error) {\n  if (error instanceof SwitchChainNotSupportedError) {\n    console.error('Chain switching not supported')\n  }\n}\n```\n\n## More Errors\n\nSee the [`@wagmi/core` Errors docs](/core/api/errors) for the full list of available error types.\n"
  },
  {
    "path": "site/solid/api/primitives/useBalance.md",
    "content": "---\ntitle: useBalance\ndescription: Primitive for fetching native currency balance.\n---\n\n<script setup>\nconst packageName = '@wagmi/solid'\nconst actionName = 'getBalance'\nconst typeName = 'GetBalance'\nconst TData = '{ decimals: number; symbol: string; value: bigint; }'\nconst TError = 'GetBalanceErrorType'\n</script>\n\n# useBalance\n\nPrimitive for fetching native currency balance.\n\n## Import\n\n```ts\nimport { useBalance } from '@wagmi/solid'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useBalance } from '@wagmi/solid'\n\nfunction App() {\n  const balance = useBalance(() => ({\n    address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n  }))\n}\n```\n<<< @/snippets/solid/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { useBalance } from '@wagmi/solid'\n\nuseBalance.Parameters\nuseBalance.SolidParameters\n```\n\nParameters are passed as a getter function to maintain Solid reactivity.\n\n```ts\nuseBalance(() => ({\n  address: '0x...',\n  // other parameters...\n}))\n```\n\n### address\n\n`Address | undefined`\n\nAddress to get balance for. [`enabled`](#enabled) set to `false` if `address` is `undefined`.\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to get balance at.\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to get balance at.\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n### config\n\n`Config | undefined`\n\n[`Config`](/solid/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/solid/api/WagmiProvider).\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Primitives that have identical context will share the same cache.\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { useBalance } from '@wagmi/solid'\n\nuseBalance.ReturnType\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getBalance`](/core/api/actions/getBalance)\n"
  },
  {
    "path": "site/solid/api/primitives/useBlockNumber.md",
    "content": "---\ntitle: useBlockNumber\ndescription: Primitive for fetching the current block number.\n---\n\n# useBlockNumber\n\nPrimitive for fetching the current block number.\n\n## Import\n\n```ts\nimport { useBlockNumber } from '@wagmi/solid'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useBlockNumber } from '@wagmi/solid'\n\nfunction App() {\n  const blockNumber = useBlockNumber()\n}\n```\n<<< @/snippets/solid/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { useBlockNumber } from '@wagmi/solid'\n\nuseBlockNumber.Parameters\nuseBlockNumber.SolidParameters\n```\n\nParameters are passed as a getter function to maintain Solid reactivity.\n\n```ts\nuseBlockNumber(() => ({\n  chainId: 1,\n  // other parameters...\n}))\n```\n\n### cacheTime\n\n`number | undefined`\n\nTime in milliseconds that cached block number will remain in memory.\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n### config\n\n`Config | undefined`\n\n[`Config`](/solid/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/solid/api/WagmiProvider).\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Primitives that have identical context will share the same cache.\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { useBlockNumber } from '@wagmi/solid'\n\nuseBlockNumber.ReturnType\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getBlockNumber`](/core/api/actions/getBlockNumber)\n"
  },
  {
    "path": "site/solid/api/primitives/useChainId.md",
    "content": "---\ntitle: useChainId\ndescription: Primitive for getting current chain ID.\n---\n\n# useChainId\n\nPrimitive for getting current chain ID.\n\n## Import\n\n```ts\nimport { useChainId } from '@wagmi/solid'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useChainId } from '@wagmi/solid'\n\nfunction App() {\n  const chainId = useChainId()\n  \n  return <p>Chain ID: {chainId()}</p>\n}\n```\n<<< @/snippets/solid/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { useChainId } from '@wagmi/solid'\n\nuseChainId.Parameters\nuseChainId.SolidParameters\n```\n\nParameters are passed as a getter function to maintain Solid reactivity.\n\n```ts\nuseChainId(() => ({\n  config,\n}))\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/solid/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/solid/api/WagmiProvider).\n\n## Return Type\n\n```ts\nimport { useChainId } from '@wagmi/solid'\n\nuseChainId.ReturnType\n```\n\n`Accessor<number>`\n\nReturns an accessor containing the current chain ID from the config state.\n\n::: info\nOnly returns chain IDs for chains configured via `createConfig`'s [`chains`](/solid/api/createConfig#chains) parameter.\n\nIf the active [connection](/solid/api/createConfig#connection) [`chainId`](/solid/api/createConfig#chainid-1) is not from a chain included in your Wagmi `Config`, `useChainId` will return the last configured chain ID.\n:::\n\n## Action\n\n- [`getChainId`](/core/api/actions/getChainId)\n- [`watchChainId`](/core/api/actions/watchChainId)\n"
  },
  {
    "path": "site/solid/api/primitives/useChains.md",
    "content": "---\ntitle: useChains\ndescription: Primitive for getting configured chains.\n---\n\n# useChains\n\nPrimitive for getting configured chains.\n\n## Import\n\n```ts\nimport { useChains } from '@wagmi/solid'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useChains } from '@wagmi/solid'\nimport { For } from 'solid-js'\n\nfunction App() {\n  const chains = useChains()\n  \n  return (\n    <ul>\n      <For each={chains()}>\n        {(chain) => <li>{chain.name}</li>}\n      </For>\n    </ul>\n  )\n}\n```\n<<< @/snippets/solid/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { useChains } from '@wagmi/solid'\n\nuseChains.Parameters\nuseChains.SolidParameters\n```\n\nParameters are passed as a getter function to maintain Solid reactivity.\n\n```ts\nuseChains(() => ({\n  config,\n}))\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/solid/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/solid/api/WagmiProvider).\n\n## Return Type\n\n```ts\nimport { useChains } from '@wagmi/solid'\n\nuseChains.ReturnType\n```\n\n`Accessor<readonly Chain[]>`\n\nReturns an accessor containing the configured chains.\n\n## Action\n\n- [`getChains`](/core/api/actions/getChains)\n"
  },
  {
    "path": "site/solid/api/primitives/useClient.md",
    "content": "---\ntitle: useClient\ndescription: Primitive for getting Viem Client.\n---\n\n# useClient\n\nPrimitive for getting [Viem Client](https://viem.sh/docs/clients/intro) instance.\n\n## Import\n\n```ts\nimport { useClient } from '@wagmi/solid'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useClient } from '@wagmi/solid'\n\nfunction App() {\n  const client = useClient()\n}\n```\n<<< @/snippets/solid/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { useClient } from '@wagmi/solid'\n\nuseClient.Parameters\nuseClient.SolidParameters\n```\n\nParameters are passed as a getter function to maintain Solid reactivity.\n\n```ts\nuseClient(() => ({\n  chainId: 1,\n}))\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when getting the client.\n\n### config\n\n`Config | undefined`\n\n[`Config`](/solid/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/solid/api/WagmiProvider).\n\n## Return Type\n\n```ts\nimport { useClient } from '@wagmi/solid'\n\nuseClient.ReturnType\n```\n\n`Accessor<Client | undefined>`\n\nReturns an accessor containing the Viem Client instance, or `undefined` if not available.\n\n## Action\n\n- [`getClient`](/core/api/actions/getClient)\n"
  },
  {
    "path": "site/solid/api/primitives/useConfig.md",
    "content": "---\ntitle: useConfig\ndescription: Primitive for getting Wagmi Config.\n---\n\n# useConfig\n\nPrimitive for getting the current Wagmi [`Config`](/solid/api/createConfig#config).\n\n## Import\n\n```ts\nimport { useConfig } from '@wagmi/solid'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useConfig } from '@wagmi/solid'\n\nfunction App() {\n  const config = useConfig()\n}\n```\n<<< @/snippets/solid/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { useConfig } from '@wagmi/solid'\n\nuseConfig.Parameters\nuseConfig.SolidParameters\n```\n\nParameters are passed as a getter function to maintain Solid reactivity.\n\n```ts\nuseConfig(() => ({\n  config: customConfig,\n}))\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/solid/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/solid/api/WagmiProvider).\n\n## Return Type\n\n```ts\nimport { useConfig } from '@wagmi/solid'\n\nuseConfig.ReturnType\n```\n\n`Accessor<Config>`\n\nReturns an accessor containing the Wagmi Config.\n"
  },
  {
    "path": "site/solid/api/primitives/useConnect.md",
    "content": "---\ntitle: useConnect\ndescription: Primitive for connecting accounts with connectors.\n---\n\n<script setup>\nconst packageName = '@wagmi/solid'\nconst actionName = 'connect'\nconst typeName = 'Connect'\nconst TData = '{ accounts: readonly [Address, ...Address[]]; chainId: number; }'\nconst TError = 'ConnectErrorType'\nconst TVariables = '{ chainId?: number | undefined; connector?: CreateConnectorFn | Connector | undefined; }'\n</script>\n\n# useConnect\n\nPrimitive for connecting accounts with [connectors](/solid/api/connectors).\n\n## Import\n\n```ts\nimport { useConnect } from '@wagmi/solid'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useConnect } from '@wagmi/solid'\nimport { injected } from '@wagmi/solid/connectors'\n\nfunction App() {\n  const connect = useConnect()\n  \n  return (\n    <button onClick={() => connect.mutate({ connector: injected() })}>\n      Connect\n    </button>\n  )\n}\n```\n<<< @/snippets/solid/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { useConnect } from '@wagmi/solid'\n\nuseConnect.Parameters\nuseConnect.SolidParameters\n```\n\nParameters are passed as a getter function to maintain Solid reactivity.\n\n```ts\nuseConnect(() => ({\n  config,\n  // mutation options...\n}))\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/solid/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/solid/api/WagmiProvider).\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { useConnect } from '@wagmi/solid'\n\nuseConnect.ReturnType\n```\n\n<!--@include: @shared/mutation-result.md-->\n\n<!--@include: @shared/mutation-imports.md-->\n\n::: tip\nNot all connectors support connecting directly to a `chainId` (e.g. they don't support programmatic chain switching). In those cases, the connector will connect to whatever chain the connector's provider (e.g. wallet) is connected to.\n:::\n\n## Action\n\n- [`connect`](/core/api/actions/connect)\n"
  },
  {
    "path": "site/solid/api/primitives/useConnection.md",
    "content": "---\ntitle: useConnection\ndescription: Primitive for getting current connection.\n---\n\n# useConnection\n\nPrimitive for getting current connection.\n\n## Import\n\n```ts\nimport { useConnection } from '@wagmi/solid'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useConnection } from '@wagmi/solid'\nimport { Show } from 'solid-js'\n\nfunction App() {\n  const connection = useConnection()\n  \n  return (\n    <Show when={connection.isConnected} fallback={<p>Not connected</p>}>\n      <p>Address: {connection.address}</p>\n      <p>Chain ID: {connection.chainId}</p>\n    </Show>\n  )\n}\n```\n<<< @/snippets/solid/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { useConnection } from '@wagmi/solid'\n\nuseConnection.Parameters\nuseConnection.SolidParameters\n```\n\nParameters are passed as a getter function to maintain Solid reactivity.\n\n```ts\nuseConnection(() => ({\n  config,\n}))\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/solid/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/solid/api/WagmiProvider).\n\n## Return Type\n\n```ts\nimport { useConnection } from '@wagmi/solid'\n\nuseConnection.ReturnType\n```\n\n### address\n\n`Address | undefined`\n\nThe connected account address.\n\n### addresses\n\n`readonly Address[] | undefined`\n\nAll connected account addresses.\n\n### chain\n\n`Chain | undefined`\n\nThe connected chain.\n\n### chainId\n\n`number | undefined`\n\nThe connected chain ID.\n\n### connector\n\n`Connector | undefined`\n\nThe active connector.\n\n### isConnected\n\n`boolean`\n\nWhether an account is connected.\n\n### isConnecting\n\n`boolean`\n\nWhether a connection is in progress.\n\n### isDisconnected\n\n`boolean`\n\nWhether the account is disconnected.\n\n### isReconnecting\n\n`boolean`\n\nWhether a reconnection is in progress.\n\n### status\n\n`'connected' | 'connecting' | 'disconnected' | 'reconnecting'`\n\nThe current connection status.\n\n## Action\n\n- [`getConnection`](/core/api/actions/getConnection)\n"
  },
  {
    "path": "site/solid/api/primitives/useConnectionEffect.md",
    "content": "---\ntitle: useConnectionEffect\ndescription: Primitive for reacting to connection state changes.\n---\n\n# useConnectionEffect\n\nPrimitive for reacting to connection state changes.\n\n## Import\n\n```ts\nimport { useConnectionEffect } from '@wagmi/solid'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useConnectionEffect } from '@wagmi/solid'\n\nfunction App() {\n  useConnectionEffect(() => ({\n    onConnect(data) {\n      console.log('Connected!', data)\n    },\n    onDisconnect() {\n      console.log('Disconnected!')\n    },\n  }))\n\n  return <div>...</div>\n}\n```\n<<< @/snippets/solid/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { useConnectionEffect } from '@wagmi/solid'\n\nuseConnectionEffect.Parameters\nuseConnectionEffect.SolidParameters\n```\n\nParameters are passed as a getter function to maintain Solid reactivity.\n\n```ts\nuseConnectionEffect(() => ({\n  onConnect(data) { /* ... */ },\n  onDisconnect() { /* ... */ },\n}))\n```\n\n### onConnect\n\n`((data: { address: Address; addresses: readonly Address[]; chain: Chain | undefined; chainId: number; connector: Connector; isReconnected: boolean }) => void) | undefined`\n\nCallback that is called when accounts are connected.\n\n### onDisconnect\n\n`(() => void) | undefined`\n\nCallback that is called when no more accounts are connected.\n\n### config\n\n`Config | undefined`\n\n[`Config`](/solid/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/solid/api/WagmiProvider).\n\n## Return Type\n\n```ts\nimport { useConnectionEffect } from '@wagmi/solid'\n\nuseConnectionEffect.ReturnType\n```\n\n`void`\n\n## Action\n\n- [`watchConnection`](/core/api/actions/watchConnection)\n"
  },
  {
    "path": "site/solid/api/primitives/useConnections.md",
    "content": "---\ntitle: useConnections\ndescription: Primitive for getting all active connections.\n---\n\n# useConnections\n\nPrimitive for getting all active connections.\n\n## Import\n\n```ts\nimport { useConnections } from '@wagmi/solid'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useConnections } from '@wagmi/solid'\nimport { For } from 'solid-js'\n\nfunction App() {\n  const connections = useConnections()\n  \n  return (\n    <ul>\n      <For each={connections()}>\n        {(connection) => (\n          <li>\n            {connection.connector.name}: {connection.accounts[0]}\n          </li>\n        )}\n      </For>\n    </ul>\n  )\n}\n```\n<<< @/snippets/solid/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { useConnections } from '@wagmi/solid'\n\nuseConnections.Parameters\nuseConnections.SolidParameters\n```\n\nParameters are passed as a getter function to maintain Solid reactivity.\n\n```ts\nuseConnections(() => ({\n  config,\n}))\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/solid/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/solid/api/WagmiProvider).\n\n## Return Type\n\n```ts\nimport { useConnections } from '@wagmi/solid'\n\nuseConnections.ReturnType\n```\n\n`Accessor<readonly Connection[]>`\n\nReturns an accessor containing all active connections. Each connection includes:\n\n- `accounts`: Connected account addresses\n- `chainId`: Connected chain ID\n- `connector`: The connector instance\n\n## Action\n\n- [`getConnections`](/core/api/actions/getConnections)\n"
  },
  {
    "path": "site/solid/api/primitives/useConnectorClient.md",
    "content": "---\ntitle: useConnectorClient\ndescription: Primitive for getting Viem Wallet Client from the active connector.\n---\n\n# useConnectorClient\n\nPrimitive for getting a [Viem Wallet Client](https://viem.sh/docs/clients/wallet) from the active connector.\n\n## Import\n\n```ts\nimport { useConnectorClient } from '@wagmi/solid'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useConnectorClient } from '@wagmi/solid'\n\nfunction App() {\n  const client = useConnectorClient()\n  \n  // client() returns the Wallet Client when connected\n}\n```\n<<< @/snippets/solid/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { useConnectorClient } from '@wagmi/solid'\n\nuseConnectorClient.Parameters\nuseConnectorClient.SolidParameters\n```\n\nParameters are passed as a getter function to maintain Solid reactivity.\n\n```ts\nuseConnectorClient(() => ({\n  chainId: 1,\n  connector: myConnector,\n}))\n```\n\n### account\n\n`Address | undefined`\n\nAccount to use for the client.\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use for the client.\n\n### config\n\n`Config | undefined`\n\n[`Config`](/solid/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/solid/api/WagmiProvider).\n\n### connector\n\n`Connector | undefined`\n\nConnector to get the client for. Defaults to the active connector.\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { useConnectorClient } from '@wagmi/solid'\n\nuseConnectorClient.ReturnType\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getConnectorClient`](/core/api/actions/getConnectorClient)\n"
  },
  {
    "path": "site/solid/api/primitives/useConnectors.md",
    "content": "---\ntitle: useConnectors\ndescription: Primitive for getting configured connectors.\n---\n\n# useConnectors\n\nPrimitive for getting configured connectors.\n\n## Import\n\n```ts\nimport { useConnectors } from '@wagmi/solid'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useConnect, useConnectors } from '@wagmi/solid'\nimport { For } from 'solid-js'\n\nfunction App() {\n  const connectors = useConnectors()\n  const connect = useConnect()\n  \n  return (\n    <ul>\n      <For each={connectors()}>\n        {(connector) => (\n          <li>\n            <button onClick={() => connect.mutate({ connector })}>\n              {connector.name}\n            </button>\n          </li>\n        )}\n      </For>\n    </ul>\n  )\n}\n```\n```ts [config.ts]\nimport { http, createConfig } from '@wagmi/solid'\nimport { mainnet, sepolia } from '@wagmi/solid/chains'\nimport { injected, walletConnect } from '@wagmi/solid/connectors'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  connectors: [injected(), walletConnect({ projectId: '...' })],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n```\n:::\n\n## Parameters\n\n```ts\nimport { useConnectors } from '@wagmi/solid'\n\nuseConnectors.Parameters\nuseConnectors.SolidParameters\n```\n\nParameters are passed as a getter function to maintain Solid reactivity.\n\n```ts\nuseConnectors(() => ({\n  config,\n}))\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/solid/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/solid/api/WagmiProvider).\n\n## Return Type\n\n```ts\nimport { useConnectors } from '@wagmi/solid'\n\nuseConnectors.ReturnType\n```\n\n`Accessor<readonly Connector[]>`\n\nReturns an accessor containing all configured connectors.\n\n## Action\n\n- [`getConnectors`](/core/api/actions/getConnectors)\n"
  },
  {
    "path": "site/solid/api/primitives/useDisconnect.md",
    "content": "---\ntitle: useDisconnect\ndescription: Primitive for disconnecting connections.\n---\n\n<script setup>\nconst packageName = '@wagmi/solid'\nconst actionName = 'disconnect'\nconst typeName = 'Disconnect'\nconst TData = 'void'\nconst TError = 'DisconnectErrorType'\nconst TVariables = '{ connector?: Connector | undefined; }'\n</script>\n\n# useDisconnect\n\nPrimitive for disconnecting connections.\n\n## Import\n\n```ts\nimport { useDisconnect } from '@wagmi/solid'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useDisconnect } from '@wagmi/solid'\n\nfunction App() {\n  const disconnect = useDisconnect()\n  \n  return (\n    <button onClick={() => disconnect.mutate()}>\n      Disconnect\n    </button>\n  )\n}\n```\n<<< @/snippets/solid/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { useDisconnect } from '@wagmi/solid'\n\nuseDisconnect.Parameters\nuseDisconnect.SolidParameters\n```\n\nParameters are passed as a getter function to maintain Solid reactivity.\n\n```ts\nuseDisconnect(() => ({\n  config,\n  // mutation options...\n}))\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/solid/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/solid/api/WagmiProvider).\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { useDisconnect } from '@wagmi/solid'\n\nuseDisconnect.ReturnType\n```\n\n<!--@include: @shared/mutation-result.md-->\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`disconnect`](/core/api/actions/disconnect)\n"
  },
  {
    "path": "site/solid/api/primitives/useReconnect.md",
    "content": "---\ntitle: useReconnect\ndescription: Primitive for reconnecting to previously connected connectors.\n---\n\n<script setup>\nconst packageName = '@wagmi/solid'\nconst actionName = 'reconnect'\nconst typeName = 'Reconnect'\nconst TData = 'readonly Connection[]'\nconst TError = 'ReconnectErrorType'\nconst TVariables = '{ connectors?: readonly Connector[] | undefined; }'\n</script>\n\n# useReconnect\n\nPrimitive for reconnecting to previously connected connectors.\n\n## Import\n\n```ts\nimport { useReconnect } from '@wagmi/solid'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useReconnect } from '@wagmi/solid'\n\nfunction App() {\n  const reconnect = useReconnect()\n  \n  return (\n    <button onClick={() => reconnect.mutate()}>\n      Reconnect\n    </button>\n  )\n}\n```\n<<< @/snippets/solid/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { useReconnect } from '@wagmi/solid'\n\nuseReconnect.Parameters\nuseReconnect.SolidParameters\n```\n\nParameters are passed as a getter function to maintain Solid reactivity.\n\n```ts\nuseReconnect(() => ({\n  config,\n  // mutation options...\n}))\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/solid/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/solid/api/WagmiProvider).\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { useReconnect } from '@wagmi/solid'\n\nuseReconnect.ReturnType\n```\n\n<!--@include: @shared/mutation-result.md-->\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`reconnect`](/core/api/actions/reconnect)\n"
  },
  {
    "path": "site/solid/api/primitives/useSwitchChain.md",
    "content": "---\ntitle: useSwitchChain\ndescription: Primitive for switching chains.\n---\n\n<script setup>\nconst packageName = '@wagmi/solid'\nconst actionName = 'switchChain'\nconst typeName = 'SwitchChain'\nconst TData = 'Chain'\nconst TError = 'SwitchChainErrorType'\nconst TVariables = '{ chainId: number; connector?: Connector | undefined; }'\n</script>\n\n# useSwitchChain\n\nPrimitive for switching chains.\n\n## Import\n\n```ts\nimport { useSwitchChain } from '@wagmi/solid'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useSwitchChain } from '@wagmi/solid'\nimport { mainnet, sepolia } from '@wagmi/solid/chains'\nimport { For } from 'solid-js'\n\nfunction App() {\n  const switchChain = useSwitchChain()\n  \n  return (\n    <div>\n      <For each={[mainnet, sepolia]}>\n        {(chain) => (\n          <button\n            disabled={switchChain.isPending}\n            onClick={() => switchChain.mutate({ chainId: chain.id })}\n          >\n            {chain.name}\n          </button>\n        )}\n      </For>\n    </div>\n  )\n}\n```\n<<< @/snippets/solid/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { useSwitchChain } from '@wagmi/solid'\n\nuseSwitchChain.Parameters\nuseSwitchChain.SolidParameters\n```\n\nParameters are passed as a getter function to maintain Solid reactivity.\n\n```ts\nuseSwitchChain(() => ({\n  config,\n  // mutation options...\n}))\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/solid/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/solid/api/WagmiProvider).\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { useSwitchChain } from '@wagmi/solid'\n\nuseSwitchChain.ReturnType\n```\n\n<!--@include: @shared/mutation-result.md-->\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`switchChain`](/core/api/actions/switchChain)\n"
  },
  {
    "path": "site/solid/api/primitives/useSwitchConnection.md",
    "content": "---\ntitle: useSwitchConnection\ndescription: Primitive for switching between connections.\n---\n\n<script setup>\nconst packageName = '@wagmi/solid'\nconst actionName = 'switchConnection'\nconst typeName = 'SwitchConnection'\nconst TData = 'void'\nconst TError = 'SwitchConnectionErrorType'\nconst TVariables = '{ connector: Connector; }'\n</script>\n\n# useSwitchConnection\n\nPrimitive for switching between connections when multiple wallets are connected.\n\n## Import\n\n```ts\nimport { useSwitchConnection } from '@wagmi/solid'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useConnections, useSwitchConnection } from '@wagmi/solid'\nimport { For } from 'solid-js'\n\nfunction App() {\n  const connections = useConnections()\n  const switchConnection = useSwitchConnection()\n  \n  return (\n    <div>\n      <For each={connections()}>\n        {(connection) => (\n          <button\n            onClick={() => switchConnection.mutate({ connector: connection.connector })}\n          >\n            Switch to {connection.connector.name}\n          </button>\n        )}\n      </For>\n    </div>\n  )\n}\n```\n<<< @/snippets/solid/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { useSwitchConnection } from '@wagmi/solid'\n\nuseSwitchConnection.Parameters\nuseSwitchConnection.SolidParameters\n```\n\nParameters are passed as a getter function to maintain Solid reactivity.\n\n```ts\nuseSwitchConnection(() => ({\n  config,\n  // mutation options...\n}))\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/solid/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/solid/api/WagmiProvider).\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { useSwitchConnection } from '@wagmi/solid'\n\nuseSwitchConnection.ReturnType\n```\n\n<!--@include: @shared/mutation-result.md-->\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`switchConnection`](/core/api/actions/switchConnection)\n"
  },
  {
    "path": "site/solid/api/primitives/useWatchBlockNumber.md",
    "content": "---\ntitle: useWatchBlockNumber\ndescription: Primitive for watching block number changes.\n---\n\n# useWatchBlockNumber\n\nPrimitive for watching block number changes.\n\n## Import\n\n```ts\nimport { useWatchBlockNumber } from '@wagmi/solid'\n```\n\n## Usage\n\n::: code-group\n```tsx [index.tsx]\nimport { useWatchBlockNumber } from '@wagmi/solid'\nimport { createSignal } from 'solid-js'\n\nfunction App() {\n  const [blockNumber, setBlockNumber] = createSignal<bigint>()\n  \n  useWatchBlockNumber(() => ({\n    onBlockNumber(blockNumber) {\n      setBlockNumber(blockNumber)\n    },\n  }))\n  \n  return <p>Block number: {blockNumber()?.toString()}</p>\n}\n```\n<<< @/snippets/solid/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { useWatchBlockNumber } from '@wagmi/solid'\n\nuseWatchBlockNumber.Parameters\nuseWatchBlockNumber.SolidParameters\n```\n\nParameters are passed as a getter function to maintain Solid reactivity.\n\n```ts\nuseWatchBlockNumber(() => ({\n  onBlockNumber(blockNumber) {\n    // Handle new block number\n  },\n}))\n```\n\n### onBlockNumber\n\n`(blockNumber: bigint, prevBlockNumber: bigint | undefined) => void`\n\nCallback function called when the block number changes.\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when watching.\n\n### config\n\n`Config | undefined`\n\n[`Config`](/solid/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/solid/api/WagmiProvider).\n\n### emitMissed\n\n`boolean | undefined`\n\nWhether or not to emit missed block numbers to the callback. Defaults to `false`.\n\nMissed block numbers may occur in instances where internet connection is lost, or the block time is lesser than the polling interval of the client.\n\n### emitOnBegin\n\n`boolean | undefined`\n\nWhether or not to emit the current block number when the watcher starts. Defaults to `false`.\n\n### enabled\n\n`boolean | undefined`\n\nWhether or not to enable the watcher. Defaults to `true`.\n\n### onError\n\n`((error: Error) => void) | undefined`\n\nError handler called when an error occurs.\n\n### poll\n\n`boolean | undefined`\n\nWhether or not to use polling. Defaults to the transport's `pollingInterval`.\n\n### pollingInterval\n\n`number | undefined`\n\nPolling frequency (in ms). Defaults to the transport's `pollingInterval`.\n\n### syncConnectedChain\n\n`boolean | undefined`\n\nWhether or not to sync the chain with the connected chain. Defaults to `true`.\n\n## Return Type\n\n```ts\nimport { useWatchBlockNumber } from '@wagmi/solid'\n\nuseWatchBlockNumber.ReturnType\n```\n\n`void`\n\n## Action\n\n- [`watchBlockNumber`](/core/api/actions/watchBlockNumber)\n"
  },
  {
    "path": "site/solid/api/primitives.md",
    "content": "<script setup>\nimport { getSidebar } from '../../.vitepress/sidebar'\n\nconst primitives = getSidebar()['/solid']\n  .find(x => x.text === 'Primitives').items\n  .sort((a, b) => a.text.localeCompare(b.text))\n</script>\n\n# Primitives\n\nSolid Primitives for accounts, wallets, contracts, transactions, signing, and more.\n\n## Import\n\n```ts\nimport { useConnection } from '@wagmi/solid'\n```\n\n## Reactive Parameters\n\nIn Solid, primitive parameters are passed as getter functions (accessors) to maintain reactivity. This is different from React where parameters are passed directly as objects.\n\n```ts\n// Solid style\nuseBlockNumber(() => ({ chainId: 1 }))\n```\n\n## Available Primitives\n\n<ul>\n  <li v-for=\"primitive of primitives\">\n    <a :href=\"primitive.link\">{{ primitive.text }}</a>\n  </li>\n</ul>\n"
  },
  {
    "path": "site/solid/api/transports/custom.md",
    "content": "---\ntitle: custom\n---\n\n<script setup>\nconst packageName = '@wagmi/solid'\n</script>\n\n<!-- @include: @shared/transports/custom.md -->\n"
  },
  {
    "path": "site/solid/api/transports/fallback.md",
    "content": "---\ntitle: fallback\n---\n\n<script setup>\nconst packageName = '@wagmi/solid'\n</script>\n\n<!-- @include: @shared/transports/fallback.md -->\n"
  },
  {
    "path": "site/solid/api/transports/http.md",
    "content": "---\ntitle: http\n---\n\n<script setup>\nconst packageName = '@wagmi/solid'\n</script>\n\n<!-- @include: @shared/transports/http.md -->\n"
  },
  {
    "path": "site/solid/api/transports/webSocket.md",
    "content": "---\ntitle: webSocket\n---\n\n<script setup>\nconst packageName = '@wagmi/solid'\n</script>\n\n<!-- @include: @shared/transports/webSocket.md -->\n"
  },
  {
    "path": "site/solid/api/transports.md",
    "content": "<script setup>\nimport { getSidebar } from '../../.vitepress/sidebar'\n\nconst transports = getSidebar()['/core']\n  .find(x => x.text.includes('Configuration')).items\n  .find(x => x.text.includes('Transports')).items\n  .sort((a, b) => a.text.localeCompare(b.text))\n</script>\n\n# Transports\n\n[`createConfig`](/solid/api/createConfig) can be instantiated with a set of Transports for each chain. A Transport is the intermediary layer that is responsible for executing outgoing JSON-RPC requests to the RPC Provider (e.g. Alchemy, Infura, etc).\n\n## Import\n\n```ts\nimport { http } from '@wagmi/solid'\n```\n\n## Built-In Transports\n\nAvailable via the `'@wagmi/solid'` entrypoint.\n\n<ul>\n  <li v-for=\"transport of transports\">\n    <a :href=\"transport.link\">{{ transport.text }}</a>\n  </li>\n</ul>\n"
  },
  {
    "path": "site/solid/getting-started.md",
    "content": "<script setup>\nimport packageJson from '../../packages/solid/package.json'\n\nconst viemVersion = packageJson.peerDependencies.viem\n</script>\n\n# Getting Started\n\n## Overview\n\n`@wagmi/solid` is a collection of Solid primitives for Ethereum. You can learn more about the rationale behind the project in the [Why Wagmi](/solid/why) section.\n\n## Manual Installation\n\nTo manually add `@wagmi/solid` to your project, install the required packages.\n\n::: code-group\n```bash-vue [pnpm]\npnpm add @wagmi/solid viem@{{viemVersion}} @tanstack/solid-query\n```\n\n```bash-vue [npm]\nnpm install @wagmi/solid viem@{{viemVersion}} @tanstack/solid-query\n```\n\n```bash-vue [yarn]\nyarn add @wagmi/solid viem@{{viemVersion}} @tanstack/solid-query\n```\n\n```bash-vue [bun]\nbun add @wagmi/solid viem@{{viemVersion}} @tanstack/solid-query\n```\n:::\n\n- [Viem](https://viem.sh) is a TypeScript interface for Ethereum that performs blockchain operations.\n- [TanStack Query](https://tanstack.com/query/v5) is an async state manager that handles requests, caching, and more.\n- [TypeScript](/solid/typescript) is optional, but highly recommended. Learn more about [TypeScript support](/solid/typescript).\n\n### Create Config\n\nCreate and export a new Wagmi config using `createConfig`.\n\n::: code-group\n```ts [config.ts]\nimport { http, createConfig } from '@wagmi/solid'\nimport { mainnet, sepolia } from '@wagmi/solid/chains'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n```\n:::\n\nIn this example, Wagmi is configured to use the Mainnet and Sepolia chains, and `injected` connector. Check out the [`createConfig` docs](/solid/api/createConfig) for more configuration options.\n\n::: details TypeScript Tip\nIf you are using TypeScript, you can \"register\" the Wagmi config or use the hook `config` property to get strong type-safety across Solid Context in places that wouldn't normally have type info.\n\n::: code-group\n```ts twoslash [register config]\n// @twoslash-cache: {\"v\":1,\"hash\":\"5a265a7585bba6cc64f83e9dd43093d209786bd39bd0106c74836c3c3bff74f8\",\"data\":\"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\"}\n// @errors: 2345\nimport { type Config } from '@wagmi/solid'\nimport { mainnet, sepolia } from '@wagmi/solid/chains'\n\ndeclare const config: Config<readonly [typeof mainnet, typeof sepolia]>\n// ---cut---\nimport { useBlockNumber } from '@wagmi/solid'\n\nuseBlockNumber(() => ({ chainId: 123 }))\n\ndeclare module '@wagmi/solid' {\n  interface Register {\n    config: typeof config\n  }\n}\n```\n\n```ts twoslash [hook config property]\n// @twoslash-cache: {\"v\":1,\"hash\":\"f81e0bbbae23a2914d38755afa1fcae7b27d59df3ac778f5d55a5f0a3952daf7\",\"data\":\"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=\"}\n// @errors: 2345\nimport { type Config } from '@wagmi/solid'\nimport { mainnet, sepolia } from '@wagmi/solid/chains'\n\ndeclare const config: Config<readonly [typeof mainnet, typeof sepolia]>\n// ---cut---\nimport { useBlockNumber } from '@wagmi/solid'\n\nuseBlockNumber(() => ({ chainId: 123, config }))\n```\n\nBy registering or using the hook `config` property, `useBlockNumber`'s `chainId` is strongly typed to only allow Mainnet and Sepolia IDs. Learn more by reading the [TypeScript docs](/solid/typescript#config-types).\n:::\n\n\n### Wrap App in Context Provider\n\nWrap your app in the `WagmiProvider` Solid Context Provider and pass the `config` you created earlier to the `config` property.\n\n::: code-group\n```tsx [App.tsx]\nimport { WagmiProvider } from '@wagmi/solid'\nimport { config } from './config'\n\nfunction App() {\n  return (\n    <WagmiProvider config={config}>\n      {/** ... */}\n    </WagmiProvider>\n  )\n}\n```\n```ts [config.ts]\nimport { http, createConfig } from '@wagmi/solid'\nimport { mainnet, sepolia } from '@wagmi/solid/chains'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n```\n:::\n\nCheck out the [`WagmiProvider` docs](/solid/api/WagmiProvider) to learn more about Solid Context in Wagmi.\n\n### Setup TanStack Query\n\nInside the `WagmiProvider`, wrap your app in a TanStack Query Solid Context Provider, e.g. `QueryClientProvider`, and pass a new `QueryClient` instance to the `client` property.\n\n::: code-group\n```tsx [App.tsx]\nimport { QueryClient, QueryClientProvider } from '@tanstack/solid-query'\nimport { WagmiProvider } from '@wagmi/solid'\nimport { config } from './config'\n\nconst queryClient = new QueryClient()\n\nfunction App() {\n  return (\n    <WagmiProvider config={config}>\n      <QueryClientProvider client={queryClient}>\n        {/** ... */}\n      </QueryClientProvider>\n    </WagmiProvider>\n  )\n}\n```\n```ts [config.ts]\nimport { http, createConfig } from '@wagmi/solid'\nimport { mainnet, sepolia } from '@wagmi/solid/chains'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n```\n:::\n\nCheck out the [TanStack Query docs](https://tanstack.com/query/latest/docs/framework/solid/overview) to learn about the library, APIs, and more.\n\n### Use Wagmi\n\nNow that everything is set up, every component inside the Wagmi and TanStack Query Providers can use Wagmi Solid Primitives.\n\n::: code-group\n```tsx [Profile.tsx]\nimport { useConnection } from '@wagmi/solid'\n\nexport function Profile() {\n  const connection = useConnection()\n\n  return (\n    <div>\n      <p>Address: {connection.address}</p>\n      <p>Status: {connection.status}</p>\n    </div>\n  )\n}\n```\n\n```tsx [App.tsx]\nimport { QueryClient, QueryClientProvider } from '@tanstack/solid-query'\nimport { WagmiProvider } from '@wagmi/solid'\nimport { config } from './config'\nimport { Profile } from './Profile'\n\nconst queryClient = new QueryClient()\n\nfunction App() {\n  return (\n    <WagmiProvider config={config}>\n      <QueryClientProvider client={queryClient}>\n        <Profile />\n      </QueryClientProvider>\n    </WagmiProvider>\n  )\n}\n```\n```ts [config.ts]\nimport { http, createConfig } from '@wagmi/solid'\nimport { mainnet, sepolia } from '@wagmi/solid/chains'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n```\n:::\n\n## Next Steps\n\nFor more information on what to do next, check out the following topics.\n\n- [**TypeScript**](/solid/typescript) Learn how to get the most out of Wagmi's type-safety and inference for an enlightened developer experience.\n- [**Connect Wallet**](/solid/guides/connect-wallet) Learn how to enable wallets to connect to and disconnect from your apps and display information about connected accounts.\n- [**Solid Primitives**](/solid/api/primitives) Browse the collection of Solid Primitives and learn how to use them.\n- [**Viem**](/solid/guides/viem) Learn about Viem and how it works with Wagmi.\n"
  },
  {
    "path": "site/solid/guides/connect-wallet.md",
    "content": "# Connect Wallet\n\nThis guide covers how to connect and disconnect wallets using `@wagmi/solid`.\n\n## Overview\n\nConnecting a wallet allows your app to interact with the user's Ethereum accounts. Wagmi provides primitives to handle the entire connection flow.\n\n## Connecting\n\nUse the `useConnect` primitive to connect a wallet:\n\n```tsx\nimport { useConnect } from '@wagmi/solid'\nimport { injected } from '@wagmi/solid/connectors'\n\nfunction Connect() {\n  const connect = useConnect()\n\n  return (\n    <button\n      disabled={connect.isPending}\n      onClick={() => connect.mutate({ connector: injected() })}\n    >\n      {connect.isPending ? 'Connecting...' : 'Connect Wallet'}\n    </button>\n  )\n}\n```\n\n## Displaying Available Connectors\n\nUse the `useConnectors` primitive to get a list of configured connectors:\n\n```tsx\nimport { useConnect, useConnectors } from '@wagmi/solid'\nimport { For } from 'solid-js'\n\nfunction Connect() {\n  const connect = useConnect()\n  const connectors = useConnectors()\n\n  return (\n    <div>\n      <For each={connectors()}>\n        {(connector) => (\n          <button\n            disabled={connect.isPending}\n            onClick={() => connect.mutate({ connector })}\n          >\n            {connector.name}\n          </button>\n        )}\n      </For>\n    </div>\n  )\n}\n```\n\n## Checking Connection Status\n\nUse the `useConnection` primitive to check if a wallet is connected:\n\n```tsx\nimport { useConnection } from '@wagmi/solid'\nimport { Show } from 'solid-js'\n\nfunction ConnectionStatus() {\n  const connection = useConnection()\n\n  return (\n    <Show\n      when={connection.isConnected}\n      fallback={<p>Not connected</p>}\n    >\n      <p>Connected to {connection.address}</p>\n    </Show>\n  )\n}\n```\n\n## Disconnecting\n\nUse the `useDisconnect` primitive to disconnect:\n\n```tsx\nimport { useDisconnect } from '@wagmi/solid'\n\nfunction Disconnect() {\n  const disconnect = useDisconnect()\n\n  return (\n    <button\n      disabled={disconnect.isPending}\n      onClick={() => disconnect.mutate()}\n    >\n      Disconnect\n    </button>\n  )\n}\n```\n\n## Complete Example\n\nHere's a complete example combining all the pieces:\n\n```tsx\nimport { useConnect, useConnection, useConnectors, useDisconnect } from '@wagmi/solid'\nimport { For, Show } from 'solid-js'\n\nfunction WalletConnection() {\n  const connection = useConnection()\n  const connectors = useConnectors()\n  const connect = useConnect()\n  const disconnect = useDisconnect()\n\n  return (\n    <div>\n      <Show\n        when={connection.isConnected}\n        fallback={\n          <div>\n            <p>Connect your wallet:</p>\n            <For each={connectors()}>\n              {(connector) => (\n                <button\n                  disabled={connect.isPending}\n                  onClick={() => connect.mutate({ connector })}\n                >\n                  {connector.name}\n                </button>\n              )}\n            </For>\n            {connect.isError && <p>Error: {connect.error?.message}</p>}\n          </div>\n        }\n      >\n        <div>\n          <p>Connected: {connection.address}</p>\n          <p>Chain ID: {connection.chainId}</p>\n          <button onClick={() => disconnect.mutate()}>\n            Disconnect\n          </button>\n        </div>\n      </Show>\n    </div>\n  )\n}\n```\n\n## Connection Effects\n\nUse `useConnectionEffect` to react to connection state changes:\n\n```tsx\nimport { useConnectionEffect } from '@wagmi/solid'\n\nfunction ConnectionLogger() {\n  useConnectionEffect(() => ({\n    onConnect(data) {\n      console.log('Connected!', data)\n    },\n    onDisconnect() {\n      console.log('Disconnected!')\n    },\n  }))\n\n  return null\n}\n```\n\n## Next Steps\n\n- [useConnect](/solid/api/primitives/useConnect) - Learn more about the connect primitive\n- [useDisconnect](/solid/api/primitives/useDisconnect) - Learn more about the disconnect primitive\n- [useConnection](/solid/api/primitives/useConnection) - Learn more about connection state\n"
  },
  {
    "path": "site/solid/guides/error-handling.md",
    "content": "# Error Handling\n\n`@wagmi/solid` provides comprehensive error handling through typed errors and TanStack Query's error states.\n\n## Query Errors\n\nWhen using query primitives, errors are available through the `error` property:\n\n```tsx\nimport { useBalance } from '@wagmi/solid'\n\nfunction Balance() {\n  const balance = useBalance(() => ({\n    address: '0x...',\n  }))\n\n  return (\n    <div>\n      {balance.isError && (\n        <p>Error: {balance.error?.message}</p>\n      )}\n      {balance.isSuccess && (\n        <p>Balance: {balance.data?.formatted}</p>\n      )}\n    </div>\n  )\n}\n```\n\n## Mutation Errors\n\nFor mutation primitives like `useConnect` or `useDisconnect`, you can handle errors similarly:\n\n```tsx\nimport { useConnect } from '@wagmi/solid'\nimport { injected } from '@wagmi/solid/connectors'\n\nfunction Connect() {\n  const connect = useConnect()\n\n  const handleConnect = () => {\n    connect.mutate(\n      { connector: injected() },\n      {\n        onError(error) {\n          console.error('Failed to connect:', error.message)\n        },\n      }\n    )\n  }\n\n  return (\n    <div>\n      <button onClick={handleConnect}>Connect</button>\n      {connect.isError && <p>Error: {connect.error?.message}</p>}\n    </div>\n  )\n}\n```\n\n## Error Types\n\nWagmi exports specific error types that you can use for more granular error handling:\n\n```tsx\nimport { useConnect, ConnectorNotFoundError } from '@wagmi/solid'\n\nfunction Connect() {\n  const connect = useConnect()\n\n  const handleConnect = () => {\n    connect.mutate(\n      { connector: injected() },\n      {\n        onError(error) {\n          if (error instanceof ConnectorNotFoundError) {\n            console.error('Wallet not installed')\n          } else {\n            console.error('Unknown error:', error.message)\n          }\n        },\n      }\n    )\n  }\n\n  // ...\n}\n```\n\n## Common Errors\n\n### ConnectorNotFoundError\n\nThrown when trying to use a connector that isn't available (e.g., MetaMask not installed).\n\n### ChainNotConfiguredError\n\nThrown when trying to use a chain that isn't configured in your Wagmi config.\n\n### ConnectorAlreadyConnectedError\n\nThrown when trying to connect with a connector that's already connected.\n\n## Further Reading\n\n- [Wagmi Errors](/solid/api/errors)\n- [TanStack Query Error Handling](https://tanstack.com/query/latest/docs/framework/solid/guides/queries#error-handling)\n"
  },
  {
    "path": "site/solid/guides/tanstack-query.md",
    "content": "# TanStack Query\n\n[TanStack Query](https://tanstack.com/query/latest) is a powerful asynchronous state management library for Solid. It provides features like caching, deduplication, background refetching, and more.\n\n## Overview\n\n`@wagmi/solid` uses TanStack Query under the hood to handle data fetching, caching, and state management. This means you get all the benefits of TanStack Query while using Wagmi primitives.\n\n## Setup\n\nTo use `@wagmi/solid`, you need to wrap your app with both `WagmiProvider` and `QueryClientProvider`:\n\n```tsx\nimport { QueryClient, QueryClientProvider } from '@tanstack/solid-query'\nimport { WagmiProvider } from '@wagmi/solid'\nimport { config } from './config'\n\nconst queryClient = new QueryClient()\n\nfunction App() {\n  return (\n    <WagmiProvider config={config}>\n      <QueryClientProvider client={queryClient}>\n        {/* Your app */}\n      </QueryClientProvider>\n    </WagmiProvider>\n  )\n}\n```\n\n## Query States\n\nWhen using Wagmi query primitives like `useBalance` or `useBlockNumber`, you have access to TanStack Query's state properties:\n\n```tsx\nimport { useBalance } from '@wagmi/solid'\n\nfunction Balance() {\n  const balance = useBalance(() => ({\n    address: '0x...',\n  }))\n\n  return (\n    <div>\n      {balance.isPending && <p>Loading...</p>}\n      {balance.isError && <p>Error: {balance.error?.message}</p>}\n      {balance.isSuccess && <p>Balance: {balance.data?.formatted}</p>}\n    </div>\n  )\n}\n```\n\n## Query Options\n\nWagmi primitives accept TanStack Query options through the `query` parameter:\n\n```tsx\nimport { useBalance } from '@wagmi/solid'\n\nfunction Balance() {\n  const balance = useBalance(() => ({\n    address: '0x...',\n    query: {\n      enabled: true,\n      refetchInterval: 5000, // Refetch every 5 seconds\n      staleTime: 1000, // Consider data stale after 1 second\n    },\n  }))\n\n  // ...\n}\n```\n\n## Further Reading\n\nFor more information about TanStack Query, check out:\n\n- [TanStack Query Solid Documentation](https://tanstack.com/query/latest/docs/framework/solid/overview)\n- [Query Basics](https://tanstack.com/query/latest/docs/framework/solid/guides/queries)\n- [Mutations](https://tanstack.com/query/latest/docs/framework/solid/guides/mutations)\n"
  },
  {
    "path": "site/solid/guides/viem.md",
    "content": "# Viem\n\n[Viem](https://viem.sh) is a TypeScript interface for Ethereum that provides low-level primitives for interacting with Ethereum. `@wagmi/solid` is built on top of Viem.\n\n## Overview\n\nWagmi uses Viem internally to perform blockchain operations like sending transactions, reading from contracts, and more. You can also use Viem directly alongside Wagmi when you need lower-level control.\n\n## Using Viem with Wagmi\n\n### Getting the Viem Client\n\nYou can get a Viem Public Client or Wallet Client using Wagmi primitives:\n\n```tsx\nimport { useClient, useConnectorClient } from '@wagmi/solid'\n\nfunction Example() {\n  // Get a Public Client for read operations\n  const publicClient = useClient()\n\n  // Get a Wallet Client for write operations (requires connected account)\n  const walletClient = useConnectorClient()\n\n  // Use the clients...\n}\n```\n\n### Using Viem Actions Directly\n\nOnce you have a client, you can use Viem actions directly:\n\n```tsx\nimport { useClient } from '@wagmi/solid'\nimport { getBlockNumber } from 'viem/actions'\nimport { createEffect } from 'solid-js'\n\nfunction Example() {\n  const client = useClient()\n\n  createEffect(async () => {\n    const clientValue = client()\n    if (clientValue) {\n      const blockNumber = await getBlockNumber(clientValue)\n      console.log('Block number:', blockNumber)\n    }\n  })\n\n  // ...\n}\n```\n\n## Viem Concepts\n\n### Public Client vs Wallet Client\n\n- **Public Client**: Used for read-only operations (e.g., getting block numbers, reading contract state)\n- **Wallet Client**: Used for write operations that require signing (e.g., sending transactions, signing messages)\n\n### Transports\n\nWagmi uses Viem's transport system to communicate with Ethereum nodes. Common transports include:\n\n- `http`: HTTP JSON-RPC transport\n- `webSocket`: WebSocket transport for real-time updates\n- `fallback`: Fallback transport for reliability\n\n## Further Reading\n\nFor more information about Viem, check out:\n\n- [Viem Documentation](https://viem.sh)\n- [Viem Actions](https://viem.sh/docs/actions/public/introduction)\n- [Viem Clients](https://viem.sh/docs/clients/intro)\n"
  },
  {
    "path": "site/solid/installation.md",
    "content": "<script setup>\nimport packageJson from '../../packages/solid/package.json'\n\nconst docsPath = 'solid'\nconst packageDir = 'solid'\nconst packageName = '@wagmi/solid'\nconst viemVersion = packageJson.peerDependencies.viem\n</script>\n\n# Installation\n\nInstall `@wagmi/solid` via your package manager.\n\n## Package Manager\n\nInstall the required packages.\n\n::: code-group\n```bash-vue [pnpm]\npnpm add @wagmi/solid viem@{{viemVersion}} @tanstack/solid-query\n```\n\n```bash-vue [npm]\nnpm install @wagmi/solid viem@{{viemVersion}} @tanstack/solid-query\n```\n\n```bash-vue [yarn]\nyarn add @wagmi/solid viem@{{viemVersion}} @tanstack/solid-query\n```\n\n```bash-vue [bun]\nbun add @wagmi/solid viem@{{viemVersion}} @tanstack/solid-query\n```\n:::\n\n- [Viem](https://viem.sh) is a TypeScript interface for Ethereum that performs blockchain operations.\n- [TanStack Query](https://tanstack.com/query/v5) is an async state manager that handles requests, caching, and more.\n- [TypeScript](/solid/typescript) is optional, but highly recommended. Learn more about [TypeScript support](/solid/typescript).\n\n<!--@include: @shared/installation.md-->\n"
  },
  {
    "path": "site/solid/typescript.md",
    "content": "<script setup>\nimport packageJson from '../../packages/solid/package.json'\n\nconst typescriptVersion = packageJson.peerDependencies.typescript\n</script>\n\n# TypeScript\n\n## Requirements\n\n`@wagmi/solid` is designed to be as type-safe as possible! Things to keep in mind:\n\n- Types currently require using TypeScript {{typescriptVersion}}.\n- [TypeScript doesn't follow semver](https://www.learningtypescript.com/articles/why-typescript-doesnt-follow-strict-semantic-versioning) and often introduces breaking changes in minor releases.\n- Changes to types in this repository are considered non-breaking and are usually released as patch changes (otherwise every type enhancement would be a major version!).\n- It is highly recommended that you lock your `@wagmi/solid` and `typescript` versions to specific patch releases and upgrade with the expectation that types may be fixed or upgraded between any release.\n- The non-type-related public API of Wagmi still follows semver very strictly.\n\nTo ensure everything works correctly, make sure your `tsconfig.json` has [`strict`](https://www.typescriptlang.org/tsconfig#strict) mode set to `true`.\n\n::: code-group\n```json [tsconfig.json]\n{\n  \"compilerOptions\": {\n    \"strict\": true\n  }\n}\n```\n:::\n\n## Config Types\n\nBy default Solid Context does not work well with type inference. To support strong type-safety across the Solid Context boundary, there are two options available:\n\n- Declaration merging to \"register\" your `config` globally with TypeScript.\n- `config` property to pass your `config` directly to primitives.\n\n### Declaration Merging\n\n[Declaration merging](https://www.typescriptlang.org/docs/handbook/declaration-merging.html) allows you to \"register\" your `config` globally with TypeScript. The `Register` type enables Wagmi to infer types in places that wouldn't normally have access to type info via Solid Context alone.\n\nTo set this up, add the following declaration to your project. Below, we co-locate the declaration merging and the `config` set up.\n\n```ts\nimport { http, createConfig } from '@wagmi/solid'\nimport { mainnet, sepolia } from '@wagmi/solid/chains'\n\ndeclare module '@wagmi/solid' { // [!code focus]\n  interface Register { // [!code focus]\n    config: typeof config // [!code focus]\n  } // [!code focus]\n} // [!code focus]\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n```\n\nSince the `Register` type is global, you only need to add it once in your project. Once set up, you will get strong type-safety across your entire project. For example, query primitives will type `chainId` based on your `config`'s `chains`.\n\n```ts twoslash\n// @twoslash-cache: {\"v\":1,\"hash\":\"27f72e6eb6261410d5ea826717da884abdb710c1600590e05d55d49a8093f14a\",\"data\":\"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=\"}\n// @errors: 2345\nimport { type Config } from '@wagmi/solid'\nimport { mainnet, sepolia } from '@wagmi/solid/chains'\n\ndeclare module '@wagmi/solid' {\n  interface Register {\n    config: Config<readonly [typeof mainnet, typeof sepolia]>\n  }\n}\n// ---cut---\nimport { useBlockNumber } from '@wagmi/solid'\n\nuseBlockNumber(() => ({ chainId: 123 }))\n```\n\n### Primitive `config` Property\n\nFor cases where you have more than one Wagmi `config` or don't want to use the declaration merging approach, you can pass a specific `config` directly to primitives via the `config` property.\n\n```ts\nimport { http, createConfig } from '@wagmi/solid'\nimport { mainnet, optimism } from '@wagmi/solid/chains'\n\nexport const configA = createConfig({ // [!code focus]\n  chains: [mainnet], // [!code focus]\n  transports: { // [!code focus]\n    [mainnet.id]: http(), // [!code focus]\n  }, // [!code focus]\n}) // [!code focus]\n\nexport const configB = createConfig({ // [!code focus]\n  chains: [optimism], // [!code focus]\n  transports: { // [!code focus]\n    [optimism.id]: http(), // [!code focus]\n  }, // [!code focus]\n}) // [!code focus]\n```\n\nAs you expect, `chainId` is inferred correctly for each `config`.\n\n```ts twoslash\n// @twoslash-cache: {\"v\":1,\"hash\":\"6db931da3d5d995c7840071ad1e449e536b2569da9cadac7a5f1a18cd2f5e66d\",\"data\":\"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\"}\n// @errors: 2345\nimport { type Config } from '@wagmi/solid'\nimport { mainnet, optimism } from '@wagmi/solid/chains'\n\ndeclare const configA: Config<readonly [typeof mainnet]>\ndeclare const configB: Config<readonly [typeof optimism]>\n// ---cut---\nimport { useBlockNumber } from '@wagmi/solid'\n\nuseBlockNumber(() => ({ chainId: 123, config: configA }))\nuseBlockNumber(() => ({ chainId: 123, config: configB }))\n```\n\nThis approach is more explicit, but works well for advanced use-cases, if you don't want to use Solid Context or declaration merging, etc.\n\n## Reactive Parameters\n\nIn Solid, primitive parameters are passed as getter functions (accessors) to maintain reactivity. This is different from React where parameters are passed directly as objects.\n\n```ts\n// React style (NOT used in @wagmi/solid)\nuseBlockNumber({ chainId: 1 })\n\n// Solid style (used in @wagmi/solid)\nuseBlockNumber(() => ({ chainId: 1 }))\n```\n\nThis allows Wagmi to react to changes in your parameters automatically when using Solid's reactive primitives like `createSignal`.\n\n```ts\nimport { createSignal } from 'solid-js'\nimport { useBlockNumber } from '@wagmi/solid'\n\nconst [chainId, setChainId] = createSignal(1)\n\n// Block number will automatically update when chainId changes\nuseBlockNumber(() => ({ chainId: chainId() }))\n```\n\n## Configure Internal Types\n\nFor advanced use-cases, you may want to configure Wagmi's internal types. Most of Wagmi's types relating to ABIs and EIP-712 Typed Data are powered by [ABIType](https://github.com/wevm/abitype). See the [ABIType docs](https://abitype.dev) for more info on how to configure types.\n"
  },
  {
    "path": "site/solid/why.md",
    "content": "# Why Wagmi\n\nPlease see the [React \"Why Wagmi\"](/react/why) page for more information on the rationale behind the Wagmi project. The same principles apply to `@wagmi/solid`.\n\n## Why Solid?\n\n[Solid](https://www.solidjs.com/) is a declarative JavaScript library for building user interfaces. It compiles templates to real DOM nodes and updates them with fine-grained reactions. Solid combines the best ideas from React, Vue, and Svelte while providing excellent performance and a small bundle size.\n\n`@wagmi/solid` brings the same great developer experience from Wagmi to Solid applications, allowing you to build Ethereum applications with Solid's reactive primitives.\n"
  },
  {
    "path": "site/tempo/actions/amm.burn.md",
    "content": "# `amm.burn`\n\nBurns liquidity tokens and receives the underlying token pair. [Learn more about the Fee AMM](https://docs.tempo.xyz/protocol/fees/spec-fee-amm)\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"15a04714fe58dc0283f87db9029cec245122d1b5c43e71becacad49ab6778a83\",\"data\":\"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=\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { config } from './config'\n\nconst { amountUserToken, amountValidatorToken, receipt } =\n  await Actions.amm.burnSync(config, {\n    liquidity: parseUnits('10.5', 18),\n    to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n    userToken: '0x20c0000000000000000000000000000000000000',\n    validatorToken: '0x20c0000000000000000000000000000000000001',\n  })\n\nconsole.log('Received user tokens:', amountUserToken)\n// @log: Received user tokens: 5250000000000000000n\nconsole.log('Received validator tokens:', amountValidatorToken)\n// @log: Received validator tokens: 5250000000000000000n\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `amm.burn` action and wait for inclusion manually:\n\n```ts\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { Actions } from 'wagmi/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\nimport { parseUnits } from 'viem'\n\nconst hash = await Actions.amm.burn(config, {\n  liquidity: parseUnits('10.5', 18),\n  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  userToken: '0x20c0000000000000000000000000000000000000',\n  validatorToken: '0x20c0000000000000000000000000000000000001',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args: { amountUserToken, amountValidatorToken } } \n  = viem_Actions.amm.burn.extractEvent(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Amount of user tokens received */\n  amountUserToken: bigint\n  /** Amount of validator tokens received */\n  amountValidatorToken: bigint\n  /** Amount of liquidity tokens burned */\n  liquidity: bigint\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n  /** Address that initiated the burn */\n  sender: Address\n  /** Address that received the underlying tokens */\n  to: Address\n  /** Address of the user token */\n  userToken: Address\n  /** Address of the validator token */\n  validatorToken: Address\n}\n```\n\n## Parameters\n\n### liquidity\n\n- **Type:** `bigint`\n\nAmount of LP tokens to burn.\n\n### to\n\n- **Type:** `Address`\n\nAddress to send tokens to.\n\n### userToken\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the user token.\n\n### validatorToken\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the validator token.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`amm.burn`](https://viem.sh/tempo/actions/amm.burn)\n"
  },
  {
    "path": "site/tempo/actions/amm.getLiquidityBalance.md",
    "content": "# `amm.getLiquidityBalance`\n\nGets the liquidity balance for an address in a specific pool.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"685594825d16d8c180f2d81984cf6bf8e0a654c6d4ca8ae78262e8340a1d1fb4\",\"data\":\"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=\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst balance = await Actions.amm.getLiquidityBalance(config, {\n  address: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  userToken: '0x20c0000000000000000000000000000000000000',\n  validatorToken: '0x20c0000000000000000000000000000000000001',\n})\n\nconsole.log('Liquidity balance:', balance)\n// @log: Liquidity balance: 10500000000000000000n\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Return Type\n\n`bigint`\n\nLiquidity balance.\n\n## Parameters\n\n### address\n\n- **Type:** `Address`\n\nAddress to check balance for.\n\n### poolId (optional)\n\n- **Type:** `Hex`\n\nPool ID.\n\n### userToken (optional)\n\n- **Type:** `Address | bigint`\n\nUser token.\n\n### validatorToken (optional)\n\n- **Type:** `Address | bigint`\n\nValidator token.\n\n## Viem\n\n- [`amm.getLiquidityBalance`](https://viem.sh/tempo/actions/amm.getLiquidityBalance)\n"
  },
  {
    "path": "site/tempo/actions/amm.getPool.md",
    "content": "# `amm.getPool`\n\nGets the reserves for a liquidity pool.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"7dda7bb1ad17e8af2b2215af2a34e1eccb912d3acf16ffbd8338a2da0631fe20\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst pool = await Actions.amm.getPool(config, {\n  userToken: '0x20c0000000000000000000000000000000000000',\n  validatorToken: '0x20c0000000000000000000000000000000000001',\n})\n\nconsole.log('User token reserve:', pool.reserveUserToken)\n// @log: User token reserve: 1000000000000000000000n\nconsole.log('Validator token reserve:', pool.reserveValidatorToken)\n// @log: Validator token reserve: 1000000000000000000000n\nconsole.log('Total supply:', pool.totalSupply)\n// @log: Total supply: 1000000000000000000000n\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Reserve of user token */\n  reserveUserToken: bigint\n  /** Reserve of validator token */\n  reserveValidatorToken: bigint\n  /** Total supply of LP tokens */\n  totalSupply: bigint\n}\n```\n\n## Parameters\n\n### userToken\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the user token.\n\n### validatorToken\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the validator token.\n\n## Viem\n\n- [`amm.getPool`](https://viem.sh/tempo/actions/amm.getPool)\n"
  },
  {
    "path": "site/tempo/actions/amm.mint.md",
    "content": "# `amm.mint`\n\nMints liquidity tokens by providing a token pair. [Learn more about the Fee AMM](https://docs.tempo.xyz/protocol/fees/spec-fee-amm)\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"8c8d9e3a10d7fc7ac97a66b8da388430eb2e46abfa5de1aeb9fd7c017dfd2448\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { config } from './config'\n\nconst { liquidity, receipt } = await Actions.amm.mintSync(config, {\n  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  userTokenAddress: '0x20c0000000000000000000000000000000000000',\n  validatorTokenAddress: '0x20c0000000000000000000000000000000000001',\n  validatorTokenAmount: parseUnits('100', 6),\n})\n\nconsole.log('Liquidity minted:', liquidity)\n// @log: Liquidity minted: 100000000n\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `amm.mint` action and wait for inclusion manually:\n\n```ts\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { Actions } from 'wagmi/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\nimport { parseUnits } from 'viem'\n\nconst hash = await Actions.amm.mint(config, {\n  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  userTokenAddress: '0x20c0000000000000000000000000000000000000',\n  validatorTokenAddress: '0x20c0000000000000000000000000000000000001',\n  validatorTokenAmount: parseUnits('100', 6),\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args: { liquidity } } \n  = viem_Actions.amm.mint.extractEvent(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Amount of user tokens provided */\n  amountUserToken: bigint\n  /** Amount of validator tokens provided */\n  amountValidatorToken: bigint\n  /** Amount of liquidity tokens minted */\n  liquidity: bigint\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n  /** Address that initiated the mint */\n  sender: Address\n  /** Address of the user token */\n  userToken: Address\n  /** Address of the validator token */\n  validatorToken: Address\n}\n```\n\n## Parameters\n\n### to\n\n- **Type:** `Address`\n\nAddress to mint the liquidity tokens to.\n\n### userTokenAddress\n\n- **Type:** `Address | bigint`\n\nUser token address.\n\n### validatorTokenAddress\n\n- **Type:** `Address | bigint`\n\nValidator token address.\n\n### validatorTokenAmount\n\n- **Type:** `bigint`\n\nAmount of validator tokens to provide.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`amm.mint`](https://viem.sh/tempo/actions/amm.mint)\n"
  },
  {
    "path": "site/tempo/actions/amm.rebalanceSwap.md",
    "content": "# `amm.rebalanceSwap`\n\nPerforms a rebalance swap between user and validator tokens. [Learn more about the Fee AMM](https://docs.tempo.xyz/protocol/fees/spec-fee-amm)\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"e399d67fb11f22f03c5401507bb51f3428c3c4c6a5e925ed4f4bc4e8e55c065a\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { config } from './config'\n\nconst { amountIn, receipt } = await Actions.amm.rebalanceSwapSync(config, {\n  amountOut: parseUnits('10.5', 6),\n  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  userToken: '0x20c0000000000000000000000000000000000000',\n  validatorToken: '0x20c0000000000000000000000000000000000001',\n})\n\nconsole.log('Amount in:', amountIn)\n// @log: 10605000n\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `amm.rebalanceSwap` action and wait for inclusion manually:\n\n```ts\nimport { Actions } from 'wagmi/tempo'\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\nimport { parseUnits } from 'viem'\n\nconst hash = await Actions.amm.rebalanceSwap(config, {\n  amountOut: parseUnits('10.5', 6),\n  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  userToken: '0x20c0000000000000000000000000000000000000',\n  validatorToken: '0x20c0000000000000000000000000000000000001',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args: { amountIn } } \n  = viem_Actions.amm.rebalanceSwap.extractEvent(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Amount of tokens required for the swap */\n  amountIn: bigint\n  /** Amount of output tokens received */\n  amountOut: bigint\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n  /** Address that initiated the swap */\n  swapper: Address\n  /** Address of the user token */\n  userToken: Address\n  /** Address of the validator token */\n  validatorToken: Address\n}\n```\n\n## Parameters\n\n### amountOut\n\n- **Type:** `bigint`\n\nAmount of user token to receive.\n\n### to\n\n- **Type:** `Address`\n\nAddress to send the user token to.\n\n### userToken\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the user token.\n\n### validatorToken\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the validator token.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`amm.rebalanceSwap`](https://viem.sh/tempo/actions/amm.rebalanceSwap)\n"
  },
  {
    "path": "site/tempo/actions/amm.watchBurn.md",
    "content": "# `amm.watchBurn`\n\nWatches for liquidity burn events on the Fee AMM.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"88643edeaab8a1c3858658b1397de9291730cd2a4ec09f2bcb6ee2f76ce6d305\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst unwatch = Actions.amm.watchBurn(config, {\n  onBurn(args, log) {\n    console.log('args:', args)\n  },\n})\n\n// Later, stop watching\nunwatch()\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Return Type\n\n`() => void`\n\nReturns a function to unsubscribe from the event.\n\n## Parameters\n\n### onBurn\n\n- **Type:** `function`\n\n```ts\ndeclare function onBurn(args: Args, log: Log): void\n\ntype Args = {\n  /** Amount of user token received */\n  amountUserToken: bigint\n  /** Amount of validator token received */\n  amountValidatorToken: bigint\n  /** Amount of LP tokens burned */\n  liquidity: bigint\n  /** Address that removed liquidity */\n  sender: Address\n  /** Address that received the tokens */\n  to: Address\n  /** Address of the user token */\n  userToken: Address\n  /** Address of the validator token */\n  validatorToken: Address\n}\n```\n\nCallback to invoke when liquidity is removed.\n\n### args (optional)\n\n- **Type:** `object`\n\n```ts\ntype Args = {\n  /** Filter by sender address */\n  sender?: Address | Address[] | null\n  /** Filter by user token address */\n  userToken?: Address | Address[] | null\n  /** Filter by validator token address */\n  validatorToken?: Address | Address[] | null\n}\n```\n\nFilter events by indexed parameters.\n\n### userToken (optional)\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the user token to filter events.\n\n### validatorToken (optional)\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the validator token to filter events.\n\n### fromBlock (optional)\n\n- **Type:** `bigint`\n\nBlock to start listening from.\n\n### onError (optional)\n\n- **Type:** `function`\n\n```ts\ndeclare function onError(error: Error): void\n```\n\nThe callback to call when an error occurred when trying to get for a new block.\n\n### poll (optional)\n\n- **Type:** `true`\n\nEnable polling mode.\n\n### pollingInterval (optional)\n\n- **Type:** `number`\n\nPolling frequency (in ms). Defaults to Client's pollingInterval config.\n\n## Viem\n\n- [`amm.watchBurn`](https://viem.sh/tempo/actions/amm.watchBurn)\n"
  },
  {
    "path": "site/tempo/actions/amm.watchMint.md",
    "content": "# `amm.watchMint`\n\nWatches for liquidity mint events on the Fee AMM.  \n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"3e678dc18ce9b1b0888b0e3f1b0a2e9e066a3d862bdcaf011c8c115c0b244c46\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIBBAYzUYQwCKnDQBDDkgCcVADYwwAczT4kAdioTSSmA0Qg+AoSJBzGYXIgAMVXvknj+ZGQF8K6bFYLEXWuvogABTi5uJwAJScvCZcMWAAZoxKiJwAwkJJSgA6YCxsHNGZyZQgYpL6ACyaZooqaogAbFqSuoHxWaXmlkgAjHYOpE405IjS7p44eIQk5P70ePFinACuYADu4mj2qQDqW/YZYGhD/ACiJMcASnorpGAAKl6l5VKI6rK1yqoaLTp6eDWm22ankFisAGYBo5nKNGhNqM8DDM/NQAkxWOwuEZBMIXtp9AAOT4Kb4NGraNp4HEmLrgpBQkD2GEjPrwjyIqbI3xzNELAz5LGccTMZj4ioyGqk+oMv5UgwisVgnqIRnM06sxAAJkqCMwXJ8s1KNH5IASa34uM4wPsAFkLGgADxHLIAPiCHWSqRdyQonCwjmYejIcFSNOEADpFRGbfh7ccIwAFQPB0hwZ3FJSuiJ7A74I4nYYXRRoG5oO6PLy5MAi+AB3gwa15+MMKhQCC8BAGfYg+CcBLsTjmACOK0YUEYmE4zAdnBglzQcAjxvESi7yGQIDoIqwClKAAND4vcoLCsBoqQYFsYD6lH78Gg0FhOK5+6QIMxOAByAACmyUM4APQxJeX4npiZ6cDQmIvm+H7fn+q5ASBMDAQ4FhwGBeQQVw57hnAsEJO+n6/v+yHsKh0FsFhuRLHEmacAAvBeV40LeQTALknDROhwipMgVEQA88BoJYaAALoUFxUFDMIBSLqknFgNx3ECTAmIRuO4mpA+T5BBEUnKS+hmuBEuS0bEqwbHmTE8JaJhRqKMbNg6HqZn6SncUILapCEOhwH6cgQEoUSMa6nCeSpSwQAoEZBUoQRfgAMowo7jpOGDClAsBQIgX5+q0kTSe4uSmbkh77iAkmbgGQxKkyDEALTpJmy7VSAtUiqUnVBiMBHNcmdWpkuVUUJul7lvcpjcP2FrGMpaAQFZcArAARnAvCkIwq2NkR8GqI284lm1kllASfTWP0XwymMcoAgYsYtnSKpqoMwwuNqhJ6kihqoiagQhGEkRFMI9GJF6LXgzk2HySDnSiOdiC9Mj8h1D8TR3e0mbPZC0Iah9EJfRy+reCivL/XgQRYO+OAcBgUTeQ6vmFakj0OhG3D+YFwWsy5CZJcFoXhUQEDjqU7adngaShHIq1OAA1lBS0WCL8uNus+CKEOqVjhOU6MAR4jZTAUDLgjEpI1qjLSujzTUK090gIzxw40glR4+9oxat9Bpk8a6IGFTKYjFELNNiCLYc/54pvL0EK2Nd6Pu/b/yBIVruIMn6qe24xM/X78wAz1qZRPFvMR+zAtKDH+hx3bNsNIylKO/FGdZ29sJ9AArD7pM8v7po1kGcD1o20UKLkRCSCDcAxTA3omHP4sdl2IAPJrnD7uPMD7tO0ArAo/rvkQ459uInBwPkh+wKtKxKEoFhKDPc9QQ4XAGxfLCMHI0+La/MC5AAFLiCngAZU2owLAYNZ6HyDMyPIcBPzU2IKfKAnBVqZXWDAVa6D3zrDgCGCM5lHgb2YPvQ+dB5IETQOsJaI8YC8EYEkXgRRMSWGOKGYhAAqHgm8jgwJ3tEH+cACLrEnPgacehCBQAIitewwoCJb0XrFeK+l9x+iUcIOeEYyDvlIGo4UYA0GaIEc5e4BjVBbGiOIZSO1VgELQX/dYW0aBK0MZlAActAGAEYABWsiThXmYEQsAPCZpKCCnLOQm9t67wwhIMADY4bJDuCbNxzjJyNj/sgfcyCGwiIjGIdsKw0D7nEkEXSWBQyAUApAWA/iIzsCUIBCWcBAI/xoGIRqRAdQRloIBcQWBGCATyfAJcD5mByAAMSjJEUUiAJTQ5GNyDk2ZS4im6LKRUx8VTEA1LqTABpTSWkr3adeLpPTKh9IGUMkZ758njLQJMmZ9yxkbNIKQCIEZODr0bBEiAUSYnKMEbwGx6DGwrAcdacRCz344Ufv/TeBzECxL3lAA+PjiEAH0uFcP2PcR+uKsWpF+Zwf5gLt6cABb4hhaAvwEV6tIw2l5OCWHEWQGeBsaDHDkBgXIcAMCJPwO+SAkLtZq0RatPBBDSA8ETAASWoZrTKl4CHMFWgoP0kBZWSCycqzlYgSy8tyOEQV9gRULIIuYCVMsqUHVlV42AfiAmXhFEuTgoCYB6sbDkyArihBHw7GMzg8rAIAHktmVOqbU7xRydAnM7GczpaBum9P6YM4ZayIwTOmeIRqfqYCNSEI1NZjVBBRAHKQXIZCWUWErcwLYuIQm5DOLQHch9IUIoOmSyJoQgVaIUPuRAxCKr+IsgOnxqivyazkEFa07A5BQC/BEAA3LkGpnBExbQ4TpGAs6lq0NIIuv0f95klPHaYqdM650AFJMJ+i/Iexdy611gA3Vuh0oZODXoPQuqAJ66FoGKWgC92jdHsCCJYdYnAzgfIg1+XYhAIBVL9LPRlCK5ZoIcFgHAlgl0RFXeuwCm7t2LjnHB2Vw84CrkbDYtB5ReCK0LEk09QHdHDrfcR7isG9F7CQyhi+H4pEYaNt+wZuGTZEZUtxKxyB5yhG0l3JGXcpPSaseAraUCIykDWPKkhBsCwBE4JB7xiAiDMCRhCLUSNCRmU49J4UXAw2rRpfwbTun9NwEM/QYzyLzOqmsNIVUtnVMqSscih0ZAaxyDuUGkRgE6AMJKbid46gkbSFCzJrgcmp5yHEo1Zx4myBNG1FqTLjm5y5Y05ArgJnYCIEi/cUIsWHkJdoEl+a7xGhNGsHZjdamuAReOFF5rDaLAJdy1isQ26UhW1VMQuirLay2QQ9/aJVwAUYSEF+V928zFgCCPuAAIjY3QsqAAkwAh4wFcAAQk4Cd5QZBbv7kI/Zj9O6HunY5bsNbnANurS22Ae7j2zu3YAxfNjHzyqHmIa29tELL7KERfufhc9d68GEZwsAMP9xjsSZZWFtk2igMCSKUBQnCDrH0rtyyujid6FJ665gFOgxU5pxergzAMBo8PsxKDz9Yq85gEEWFfpdFverTz4FcVgqJR/fOo9+HX3vtI1+hXT7/1uNhVL4XsuErTr3be+935Ncvqkx9hS36je/qVxDnXYBud6/A/ogXPH4OIYgMhgKgn0PI8w2JnDigTbLre6rz9/F3ekD417gTaHhP+9E9hiTUBJJuN0Qtyy12Vu/dnf9zbWiwA7d1zLzY5jjvfYu1d2sd2vtPdIC9sPxHLdftBz9v7AOgcg8r+D9P0OwAVRXGuJAG4yhetKMgWedwGzlKjXswCD9VBrQjDEZgMb6ltIOYBDVALAKXOueYVawEZf+IiFVU6rxa7VFRmSX4Kd5QNQnRnLuHtO6Z17tMfuhdKaMugFEPXqiVGNGAA/KkDYhgH6BGFAchvNKEING6mAWABgMgOJDmJwCLOOMZgANS9BUqzBBRGxn5tgrx4At5uL7hnqlLQqqCsowDrDdA+KcC2gHwCC7i0Y6ArBBgcLWK2KNgBgiImx+hiI0EHS5BJBphcCQppLhCIrUwsCSCZRAG6CGJoK2pGx6y4h9pSGqGyJrRiCTjJZCCTyhArB9iXwzg/yyrZK5KkYJBBAQgRCRo7Lz4NpgDqCNLxrdArD9KuElo0ZtKuEQh3IOgJARgQjZpPJyB2ZBDdqtCcEljMq0Z578FQrWHJZyARj1pbBqKz47LRoHJxrNKtJJoiSppXLpq3LpERHPLpFZFoB1GNSFQEbNoD6Hj46LYxBrBcDMRdy04Tr66JSdHHCpA3pLp+hDFoBN4kYR5FBdGpAv5uKUGgYqJy5fgTF5TjELLHBTEt6pDrGcALGsbAa47EKeo+r7hVF1E5HbJPj5GxpLjHLFEdKlH74VHDJVE5pTK1HsANr1E/FbCNH+QVqDg1qNh1r/HzRmz2zD4oCbhI4NilBEDWARi9AonWDWDn7myxxdwv6JyNyYx4CtzKhWC4nZxv69Dex5y+xf58hFzBxkChz+Tlx2jsyczD5Ym1yNCEg343TJzNxpzRzElICkkdyahag9xUl9xGjf4GCLZAh5i+RCzoGixQA1xIBajWBShozkgEkGDykggZy9AJxkmajWCuCnQxCwAYiwx4T2TCCETESm5ITDKCRYSni4TJJPyvh7QkQRjH5Qw0QE6gxWSxi2T4SOTBJszHBuRQweTSTOxoB+RrjcwhQRTSTcR7ZTosz5TChAnFQmR2ZSZJTXikCoaLTPixiPy5D6n2D6SlC9TiBICgABCKCXxCB4CLggCuCuBAA=\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst unwatch = Actions.amm.watchMint(config, {\n  onMint(args, log) {\n    console.log('args:', args)\n  },\n})\n\n// Later, stop watching\nunwatch()\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n```ts\ntype ReturnType = () => void\n```\n\nReturns a function to unsubscribe from the event.\n\n## Parameters\n\n### onMint\n\n- **Type:**\n\n```ts\ndeclare function onMint(args: Args, log: Log): void\n\ntype Args = {\n  /** Amount of LP tokens minted */\n  liquidity: bigint\n  /** Address that added liquidity */\n  sender: Address\n  /** User token details */\n  userToken: {\n    /** Address of the user token */\n    address: Address\n    /** Amount of user token added */\n    amount: bigint\n  }\n  /** Validator token details */\n  validatorToken: {\n    /** Address of the validator token */\n    address: Address\n    /** Amount of validator token added */\n    amount: bigint\n  }\n}\n```\n\nCallback to invoke when liquidity is added.\n\n### sender (optional)\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the sender to filter events.\n\n### userToken (optional)\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the user token to filter events.\n\n### validatorToken (optional)\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the validator token to filter events.\n\n### fromBlock (optional)\n\n- **Type:** `bigint`\n\nBlock to start listening from.\n\n### onError (optional)\n\n- **Type:** `(error: Error) => void`\n\nThe callback to call when an error occurred when trying to get for a new block.\n\n### poll (optional)\n\n- **Type:** `true`\n\nEnable polling mode for watching events.\n\n### pollingInterval (optional)\n\n- **Type:** `number`\n\nPolling frequency (in ms). Defaults to Client's pollingInterval config.\n\n## Viem\n\n- [`amm.watchMint`](https://viem.sh/tempo/actions/amm.watchMint)\n\n"
  },
  {
    "path": "site/tempo/actions/amm.watchRebalanceSwap.md",
    "content": "# `amm.watchRebalanceSwap`\n\nWatches for rebalance swap events on the Fee AMM.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"91e718ca006a23e8682b0ebc2f91d672ae05dd36421745b488980a673c12e660\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIBBAYzUYQwCKnDQBDDkgCcVADYwwAczT4kAdioTSSmA0Qg+AoSJBzGYXIgAMVXvknj+ZGQF8K6bFYLEXWuvogABTi5uJwAJScvCZcMWAAZoxKiJwAwkJJSgA6YCxsHNGZyZQgYpL6ACyaZooqaogAbFqSuoHxWaXmlkgAjHYOpE405IjS7p44eIQk5P70ePFinACuYADu4mj2qQDqW/YZYGhD/ACiJMcASnorpGAAKl6l5VKI6rK1yqoaLTp6eDWm22ankFisAGYBo5nKNGhNqM8DDM/NQAkxWOwuEZBMIXtp9AAOT4Kb4NGraNp4HEmLrgpBQkD2GEjPrwjyIqbI3xzNELAz5LGccTMZj4ioyGqk+oMv5UgwisVgnqIRnM06sxAAJkqCMwXJ8s1KNH5IASa34uM4wPsNwARqFxGBeDAAMqbLAAHiOWQAfEEOslUj7khROFhHMw9GQ4KkacIAHSKhM2/D2x3Ot0ehMABUj0dIcG9xSUvoiewO+COJ2GF0UaBuaDujy8uTAIvgEZd1sr6bkTpd7vEWFKUAgvAQBn2IPgnAS7E4pBgDv7mc4cA9nBglzQcATxvESknyGQIDoIqwClKAANb7vcoLCsBokutjAQ0ow/g0GgsJxXHOpAQMwnAAOQAAKbEozCMAA9DES6gQ+mJPpwNCYv+gHAWBkGHjB8HsDA8EOBYcBIXkKFcM+8ZwJhCRASBEFQfhCFEehbDkbkSxxCWnAALwvjAb4fkEwC5Jw0QkcIqTIOxEAPPAaCWGgAC6FDiWhQzCAUu6pGJYASRJskwJiCaMFAKmpN+v5BBE6kGf+9muBEuRcbEqwbJW/E8JaJhJqKKa9suGaDh6AYlmG+kSUIfYDlmw6pCEOhwGGcgQEoUR8b6nBRYZSwQAoCZpUoQSgbFa4bgloFhq0kQae4uTObkt7XiAamnhGQxKkyvEALTpCW+7tSAnUiqUo1RiMtH9XmXUFnubUUKeS5NvcpjcHOFrGAZaAQB5cArHacC8KQjB2jAWEgaoF3bvWQ1qWUBJ9NY/RfDKiC9IScoAgYqblaFw50iqaqDMMLjaoSepIoaqImoEIRhJERTCDxiRBgNaM5BROnI50ohPR9Wq2G9PxNN97QlkDkLQhq4PVFDBoorycN4EEWBATgHAYFEMXBauANYIltWpH9fNxUOWAJtwyWpelItBSu4vZgAMulmXZUQEDmaO46TiAaShHIDq8AA1mhe0WJrJsXes+CKMKi5ixVm7jrwdwLfjEofRCWryHUpO9AArOTeC84rmYS1TSCVDTYOjFqDPeEzxrogYbP5iMUTCzlGkSSscBkA8EDW2AqTXtYtAACTAGIp3KK414ANy55wRChOZWzsEXJdlxX1e1xYSgN83DkSZVWCc73Vc1ycg/Dy3IoQGsaAAJKl5wdrJBYaAj4ZwrMEvxwAPIrGgqSb0o28j644pvL0lRfSTDQx9QrQ/SAtVR4gL/qnHfSQxyfUSceQp1NOnOamdODFXliCf68VJaqyULffQQcX7SlJoySk79ipfx/qDWESAdSJ2mCA+YgR2xRjgF2C6+UFC5DbqQZGcACowGDCYFhOsJx4AeHbTg15aEwGvJwA+UAVgKHDEBIg5lZziHXPkcRsA7QrCUJfZQTCWFoQcFwRgtE4AsEYP2Rhu1NEwFyAAKXEG3V0J1GBYFRsw8RUZmR5DgCBdmxBpFQA3hga0y4N5AXWAXQsCZXKPF4SIsRN1aA6VomgdYe0qEwF4IwJIvAiiYksMcWMoSABUPA+FHAcYI6I/Y4C0XWIwVQwi9CECgLolY9hhS0X4ewwqxVbLXjDC04QLCExkCAqQDpwowBeO6UUwK9whmqC2NEJ0G8Lr5xgF44x6xTo0HNsMnxAA5aAMAEwACtdEnCEswEJYA8kbSUGlFcfCBFCNIhINcgYlB3CWRs1ZlSLrGOQNedxLoykJjEGOU+14VJBGslgWMsFYKQFgIchM7AlCwTHBOWC/YaBiF6kQHUCZaCwWHHBP58A9zfmYHIAAxESspQKl5oCziM3IPyqV7iBf00F4KfyQsQNC2FMB4WIuRbrNFb5MXYsqLi/FWBCVAX+SStAZLKUyuJay0gpAIgJk4Dwi6VyIA3LGSwoRvA5nnVWAXLxFTVC0s4I+AQajrp8N5YgO5wjoCRLObkAA+jknJ+x7iD29R61IWrOA6puQIzgur9lJLQKBWik1am0UkBdSwlS7aMKWDomgxw5AYFyHADAzp8BAUgPnKBjBrYmP8RAQJZAeA5hXrEu2PilwF2YHaBQYZICMKTSYnxGaxD1hzbkcIBb7DFqXrRcwFbDYRuuownZsADlHNfMwPcnBXQwC+bwn5kB1lCAkeOYlnAV6wSPuyiFUKYW7P5ToQVqL0WKSxTivFBLYLMoTKSil4heq7pgL1IQvVmW9UEFEecpBcgHyXNaxI7BmBbFxO6sAZxaAXnEfnQelbQ2hFua0wRiBQktUOW5HpbT0qlTtnINK1p2ByCgKBCII9oWcBzHXXSnAKNUfiaQWjYZjE0tPsR8Z7TQIcb2gAUjImGUCXHaP0cY7BZjrHYzsZgJRvaMmoC8YSWgYFaBBO9P6ewIIlh1icDOKqozoFdiEAgJCsMzD40YYdF4hwE9FBLPowx3ITGWPb1ooZxhlC4CHguk6Lx5RTaaScF87TsBVX4bAExiS5mBl7Bs3Z9cwEalOfEC54cOBLBQG8wpveMzkDblCJZQOH1A7Fb3sKLg1jTp2ITKQNYa8eE6OrAETgxndmICIMwb2WoPqEhcolkrhkZlHztFG/grX2thK60IOGvXHWDdVNYaQqoxt1dK1wR128yDtjkG+pVZTYJ0CSafXE7x1AfWkHtqbXByttzkCpXqqz8tkCaNqLUT2JIzIq3IJrtiuB9dgIgI79xQhncPRdq7bttrvEaE0aw42kvPc4Id44x3YdwYsJdt7HqB7KG1BCVUoTuLY47N5KzBi5CcCuLq0iQhQIjwERMsAQRrwABEnS6EYdXChMBXAAEJOD8+UGQMX14vMTcU351IUvBecF2AzpnLOelgAlyrmXWn1w6f6c1W8oTkOoYWXou1vDryFINSU8I2SwAm+vER507krUCTaK6Y5IpXRZcIOsWyHP3L9O8t733zB/dRkD8HwTXBmAYDt+IgSJn1GFWTzAIItKwz9PlxBpPuGipkZE6pzjNG6Py580pqyZf1MV4N7Sgvmfi8lVL2pzgEnqpgQ03Jurvmsm147xpxvAmwCJ5bwF4zMBTMpcs9ZiAtmUqZcc2o5z7HvuFc8/JxXg/ODIDn6QNLi+MsOey2v3LG+3OFbUhs43zv3coxp1GOn6vKOa83tr9nzei+bEmXzgXWtYXDscXSXQA0gWXKvBTAfNjPXRhN/RnZnT/ZhHXMA6XCAg3e/FqA8I8JAE8MoTdUoZAZhO4F0MFC9blWCS+VQQ6BMGIZgK9OFOARgoidtXVWCMVCVcwO0AiEjPZQ5CINqB6V4FBRoYOJ+X4V+f4CmPgr+cQ3+Ahb+YhbkI0MhVmeNaAKIFvdpILELAAflSCdAwDDATFMNs22lCFmhFGUyMOQBUnLFbi1i8SCAAGpegI1Zg0pctBCqAUU9YYDYk9prx+M0AhELV8BscZ9ug9lOAABZMRAQS8ULHQFYKMLJWZAyE1CMMpJZMMcIkxXIJIQsLgRZLxcIStdmFgSQHxXQ3QYZMo9/XLKASpXEbDUoppdcQ6MQSpG7IQehUIFYWcPRGCQxDZJlVjBIIICECIc9TlSguDMAdQBFW9boFYPFBYwDELZghYiEM7beBIBMCED9eVOQcbIIe1VoVI+sRNKDGdbIs1MY68G7OQBMMDODNADpcgzlS9XlG9JFPw4VDFNAJ9cVF9KVWCZ444hVZ4t4rYWE4E2qCIdVAjW8N3anGIZebyQOEPPg1vUqDE44VIMTOjMMAkulHfAI1IMk1IYODZEI/TUjNvak7vMkqA3fNjakzgWkvjHTJvMAFqUJDdC6H5SE+Ez4jlX8H469PcAVAEh9UVZ9SVOCSEz9clGE2DOEjUhE5KUDBcSDC6CweEhDHA48U8K3F0UoIgawBMXoG06wawIQz2O+dQRkdBBoTBN+QIHBZUKweQ/BTUXoBOQBaGZONQtOCaAsLOZKPSFuRZUgbuRQKefuWeeuJuFuN7DuXaeM4uRMvhPuGeOuIeNM0edcD0SePM6eUnIs3eKbA+ZeNec+LeY4GswHOs4+U+Rs1RHeRqZBf+ZoCQ7+EOBUZKOQ2ORQrUQOZQmGZmVOHqJ/IESsRKdWRw7WJ0/QLUCcv2MkSQrBQIBckEL+XoYmBQzUawVwB6GIWADEHGaiXyYQOiBiHvPCOCOSciG1HKXGZIB87CUCBMXgrITiR/ZYfcxpASGifyU5UWcOAWcKTGSKDSMOEKeBJKI8WWDKHOEsznYTYWbvRE+qJycbOrZWN8UgezXaP8VMQeXIEC/AWyUoSacQJAUAAIRQPRIQPAXcEAVwVwIAA\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst unwatch = Actions.amm.watchRebalanceSwap(config, {\n  onRebalanceSwap(args, log) {\n    console.log('args:', args)\n  },\n})\n\n// Later, stop watching\nunwatch()\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n```ts\ntype ReturnType = () => void\n```\n\nReturns a function to unsubscribe from the event.\n\n## Parameters\n\n### onRebalanceSwap\n\n- **Type:** `function`\n\n```ts\ndeclare function onRebalanceSwap(args: Args, log: Log): void\n\ntype Args = {\n  /** Address of the user token */\n  userToken: Address\n  /** Address of the validator token */\n  validatorToken: Address\n  /** Address of the swapper */\n  swapper: Address\n  /** Amount of validator token swapped in */\n  amountIn: bigint\n  /** Amount of user token received */\n  amountOut: bigint\n}\n```\n\nCallback to invoke when a rebalance swap occurs.\n\n### userToken (optional)\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the user token to filter events.\n\n### validatorToken (optional)\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the validator token to filter events.\n\n### args (optional)\n\n- **Type:** `object`\n\n```ts\ntype Args = {\n  /** Filter by user token address */\n  userToken?: Address | Address[] | null\n  /** Filter by validator token address */\n  validatorToken?: Address | Address[] | null\n  /** Filter by swapper address */\n  swapper?: Address | Address[] | null\n}\n```\n\nFilter parameters for the event.\n\n### fromBlock (optional)\n\n- **Type:** `bigint`\n\nBlock to start listening from.\n\n### onError (optional)\n\n- **Type:** `function`\n\n```ts\ndeclare function onError(error: Error): void\n```\n\nThe callback to call when an error occurred when trying to get for a new block.\n\n### poll (optional)\n\n- **Type:** `true`\n\nWhether to use polling.\n\n### pollingInterval (optional)\n\n- **Type:** `number`\n\nPolling frequency (in ms). Defaults to Client's pollingInterval config.\n\n## Viem\n\n- [`amm.watchRebalanceSwap`](https://viem.sh/tempo/actions/amm.watchRebalanceSwap)\n\n"
  },
  {
    "path": "site/tempo/actions/dex.buy.md",
    "content": "# `dex.buy`\n\nBuys a specific amount of tokens from the Stablecoin DEX orderbook.  \n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"514f8188da5f3aadb6f821b1369361f48b3a9b8e33f46d5689339bc21bc9aed7\",\"data\":\"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=\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { config } from './config'\n\nconst { receipt } = await Actions.dex.buySync(config, {\n  amountOut: parseUnits('100', 6),\n  maxAmountIn: parseUnits('105', 6),\n  tokenIn: '0x20c0000000000000000000000000000000000001',\n  tokenOut: '0x20c0000000000000000000000000000000000002',\n})\n\nconsole.log('Transaction hash:', receipt.transactionHash)\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `dex.buy` action and wait for inclusion manually:\n\n```ts\nimport { Actions } from 'wagmi/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\nimport { parseUnits } from 'viem'\n\nconst hash = await Actions.dex.buy(config, {\n  amountOut: parseUnits('100', 6),\n  maxAmountIn: parseUnits('105', 6),\n  tokenIn: '0x20c0000000000000000000000000000000000001',\n  tokenOut: '0x20c0000000000000000000000000000000000002',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n}\n```\n\n## Parameters\n\n### amountOut\n\n- **Type:** `bigint`\n\nAmount of tokenOut to buy.\n\n### maxAmountIn\n\n- **Type:** `bigint`\n\nMaximum amount of tokenIn to spend.\n\n### tokenIn\n\n- **Type:** `Address`\n\nAddress of the token to spend.\n\n### tokenOut\n\n- **Type:** `Address`\n\nAddress of the token to buy.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`dex.buy`](https://viem.sh/tempo/actions/dex.buy)\n"
  },
  {
    "path": "site/tempo/actions/dex.cancel.md",
    "content": "# `dex.cancel`\n\nCancels an order from the Stablecoin DEX orderbook.  \n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"8e63dbc2614d60dc2105888794c30ac7532f2a92ed7af97887d3f5dd42573f7c\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIBBAYzUYQwCKnDQBDDkgCcVADYwwAczT4kAdioTSSmA0Qg+AoSJBzGYXIgAMVXvknj+ZGQF8K6bFYLEXWuvogABTi5uJwAJScvCZcMWAAZoxKiJwAwkJJSgA6YCxsHNGZyZQgYpL6ACyaZooqaogAbFqSuoHxWaXmlkgAjHYOpE405IjS7p44eIQk5P70ePFinOywpACSUKkARskWDKLa+gAc/bXKqhotOnp4q2SbXRZWAMwDjs6jxxPUXtO+c2oAUWsU4pBgvBgjCwaFSABUhsJhoIwAAlCFQmGlKAQXgIAwI8RI/gosEY6FoAB0pXKUjGtnO9Su1FatwM4MhFKePUQbxA9g+Iz66h+mCmBhmfiBCwM+XYXCMKNMtP0vWsx3kdUuiBq2jaeEVJm5r3eQ0+SBeAFZRX8JQDSjQZSA5YVYLQaUc+r1moztXy9WyQG7jRbTcMXIhKi8beKfLMHcCDAkAK5gElCaJEyFyADKGDTAB4MolkgA+IIdZKpYtZCicLCOZh6MhwVKG4SUt2U3hZmC5/O8SkABUbzdIcCLxSUpYiqSHpAgzEYcBgBeAuU4m5WpDWmx2ezAaAA3ButxzMbDOITicY0eSYSewK5S7kwOIm3AG5DM2m+3m09iuL4iAaS9nIcCcES25rJwCQLswnCqDA0FkNsEAQAA1pSuS5AAchANDwvgy6cCR4icHAA74AukDJhByIZqo4hcAA7uIjBoBBCTsIh+DIWgiJwAxYCIRAuTbMhFi8HIyawFAKwieR2xyLiGGcBJ3HgmSaDJqQeTKJBZKfiYMDUi0Sj4sgyAgHQ75YAopQAAbOZxuQulwwDROCzEwDWyR1vgaBoFgnCuLB8GcAA5AAAmxShLgA9DE4KRW5rDypwnk0OloXhYuUWxeI8WMEl7AwElDgWHAqV5OlhSee2EFhXB+UxXFiXJeV2VsDVuRLHEU6cAAvF5MA+X5ShBOuInRJVwipMg3UQHC8BoJYaAALoUKeAlEsZHCtplp6botMDpZSjBQBtqSBcFQQRNtM3uLkrgRDhaaguCcDJnIXAjeIbEcTw6Ydl2Pa/v2aYVlOdbTZu9wbFsnC9AATC8YCPa9uTOY5IBbdZDZDMwpSVkonAALTpFO1L4yAhPvqU9NNiMEGUyORNjnANMUNZ4I6XpphwnxiGCcJZKcjCkFgPJMAkIenBQMx4g01tZSeogqMMgoFwNGq1z6gY4PZv+vAhryYbmpGIoeL8saSoCjqBCEYSREUwgDSWKRU57aUFB7nSHBUfQvGc2tMk0+uBqTZt8gKZpCoglrfDbYrePbCZOkEWALjgHAYFECN7upB4HGrQca1Gmo68yAaBIXUBm5UFsJyjMZp/a8yBG+H5fshSwQAouREJIbtwAPMDViY4+AXieBC8hjn9wojmcMw0A/ch2fEJd8CGXA+QKArMDbMmShKBYZNL/xDhcCR+9LnII9oBAvEwLkABS4jDzmvCkBSo/j1XhCBweQ4AIS3kQHe8ltgYE4CxY+6kFwsRXOObCYBcjz1XuvQ+dA/YQTQCxF+n4ISMCSLwIo6VLCHlbO9AAVDwTgjlixj2XtER+cAIIsQ4vgIBqhoAQW+vYSCEFF5TwUJSFSk0IiOTrKI4Q49KRkAXKQe6K8iTyTkSw0ybE9KqN4sxH86lkJ0RgPJZ+cC/40FElLWB+FYCUgAFYCIEmNZgaD6HcE4EoFS2xQiMKvivKqEhfxuyyLpUx1iWKWP4i/ZAjkt6Qg4ZSMQOJkxoEchtIIt0sCtgSglSAsAnGUnYEoBKOI8QJUfjQMQ5MiAo0qJSWgCVxBYBKgk+AXNArMDkAAYnaRwlJEA0lRHUbkOJ/SuYpKURkrJQUcmIDyQUmARSSllKApUnyNS6kNKaS0tpC5EmdLQN0vpByOlTNIKQCIlIrzC28RAXxch/FiJgCvcGRjOAmPklwvhaTSJ1QEAZJCjClmIACVgqAG80G5AAPq0NoQAdUkPpJQ8KYVEWQvcx5ADD4PIcRCNAkUILM0IFAeiWlLDcLIKPZcNBDxyAwLkSiaZqJCCGRBcwGFr7IW2EglBPAhzrHwXxWBX0zrKRgHWSApBIJaSQrApYtLFBoAZbkcIVEaLss4Jy5CoQnkET4jKuxpknEURce+LmnAcwwG5ZwOJkArEZgmZwdYCUADyMzsm5PydAZZXNVnlLgBs6paBan1Mac01pCUJmUi6b08Q5MHUwHJkIcmEzyaCCiJpXIa8tIWE0swZiKJoVgAAKK0DsofOiF9X5eJ8X4zR49HKIHejjJxfUXkSIgJNSKfE5AqTgewOQUBIoREfHkzg859iHT7QOwhpBh11nMYMtJHb5HiMkUEXtfYB0AFJqp1kivO4do7x0JUnX/ahN0d0v2PVAJdRC0CpLQGurRijLnsCCJYFinBS0fpUZFBFhAIA5LrGPElNbfHyQcFgHAlgR0RDHbkCdU7qGcCUTxD8QldBS3kuUXgaldrfmXU+pRLawATs3H+5RqQgPoVAxRRcehiIGSg5wGDcHTHIfPVuSCXBkCy1CNdS0GtLTcd43xq1v8KSUlIKmdYYAhbLmLI7TgX7fWICIMwDWLwUYa2OG9CjPGtwGLddsfF/BZPycU8ROAKmAhqdBVp3k1hpC8gM+J3jBjQX7DIG+OQ0azkcISnQCEaSUQ6nUBraQnmTP8cE3IDa5MoktNzk0RAKMUaxc3AYhLP8/6S3U7ARAvm9KhEC7iDpIXaBhdvDqRoTRrCGco3FzgPnDx+fK4WiwIXh5yBhWIS9KQ0a8nev1Nr75kIjUA4wftnBUQPKqkISKj4r6Uh0WAIIjkAAiRJdAyoACTAG7jAVwABCTgu3lBkDO45JDRmL3TtSFd/bnAEWzaeQt3Y8iwAXZezdh9Zq1ikGxs5d65bK3GP3kC4WTCXlvPYTQ9BYA21wFfVwIZf0vF6BzOa5gOYmOEBYvdVboIlHDWx2gXH3l8eE4gMT+743mAYGYYAka36cWmVZwoIImO6xKPuzmlnnbN3bv7beodCGz2Pavexm9g6F33usZjoX3PTKi9nS/fdkVD13tPeJ1DnFr3i4V4u5Xq6wDM7V++5RX6YA/uo5+wDwGGPgeY5B8Q0HUuKFMaO+7KHL1G7tY70gtGXdwDA0x1QHuvewZ91dQHSixughOxTmbc2vtLbACt1XnaNtbf+4d47k3zuXb2zdu70vDeHUL29j783Fs/b++X0gZ3E+XNB7jcyllrIrlwFQZAY9dKQkyV6hZCVz6qGTNsbsi4fWFKDUshKykHkJW2RG8w2xSrrpNZEPGqsVR9EaCjKu4ddSsnaC8s2NQ47hlGNYNu/x4ydzwEEEl0AojW83VhoqMAAD8qQRIGAdYlIoBIGt4oQ7MFqgBYAGAyAG0s4nARAEAl0amAA1L0CsLMCpJ7hEDPMBNXtYo5CuuknAtwm1vbt0KZJwAALI/QCD2S6o6DJhNhobvIST1jhArhK4/I8JIS5BJDjhcBfLCK1rZwsCSCwI/44bqKQRzae5QAcQoh+IiHhAUTT5iAcThZCBDyhDJi7z3yzZPyxLxKB4JBBAvDSKj5zLj6FpgDqDFI6CVIWDJhNJ2Fpq/5Bp2EvCBb7AJCUgvCxrHJyCGZBDAqtAsHKrkq6pzYNgcIRLmJxLhZyCUgFrMSqLWHBTepLIrJOGBrBqrRho7KRolTJFBEnLJFpFoBVHkytCRDXKtrOTtofTuxFCphY6Wik475do9oxDtGpC7ojp1h9GHj+7nrV6pAjGXiWiA4kGvoKKi5TGIA65tGjFV6B6HRLGcAzHWJzEo5g7I7WrIRJECApFVEZGzJZHj45H+p5HrJVKFHr67JRplFxo9KVHsCFrVGfHMS1E6CuyaRYJ5qJA/G3hmQsgWRIBWRlBST94gBEDWCUi9BInWDWD76Bx0i9DqBaxagND+gX54CSLX7NwRjJyTDtzP7SiX6tH1z7jnyHgejly9DSA1Bhzajn43B1w7gPANzyDPDMi36WxWiP4GASBKClAnaEndqMl0gozWA+hskNAMiOx4CgQQwKDyQIwurbapCozoxmyyD8iDB35IAP6qwxCwBMAAqZTAy3hNR5QIRHpFSJRLQ1TuQ2mky5QtSOmUjb5ZC9QtHLCeT1x1jnj/xhT/SAwKggxcxgxgQmzQyeywyni0nIxowYwvSGbzEbrdpbpqnZgakoQyrrA6krH1yGalDMziBICgABCKD7xCB4CcQgCuCuBAA=\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst { orderId, receipt } = await Actions.dex.cancelSync(config, {\n  orderId: 123n,\n})\n\nconsole.log('Cancelled order ID:', orderId)\n// @log: Cancelled order ID: 123n\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `dex.cancel` action and wait for inclusion manually:\n\n```ts\nimport { Actions } from 'wagmi/tempo'\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\n\nconst hash = await Actions.dex.cancel(config, {\n  orderId: 123n,\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args: { orderId } } \n  = viem_Actions.dex.cancel.extractEvent(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** ID of the cancelled order */\n  orderId: bigint\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n}\n```\n\n## Parameters\n\n### orderId\n\n- **Type:** `bigint`\n\nID of the order to cancel.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`dex.cancel`](https://viem.sh/tempo/actions/dex.cancel)\n"
  },
  {
    "path": "site/tempo/actions/dex.createPair.md",
    "content": "# `dex.createPair`\n\nCreates a new trading pair on the Stablecoin DEX.  \n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"898ef8c60c928fbbc1b3ecd918cdf0c00d4ac080a78268a8148b45b02b060db9\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst { key, base, quote, receipt } = await Actions.dex.createPairSync(config, {\n  base: '0x20c0000000000000000000000000000000000001',\n})\n\nconsole.log('Pair key:', key)\nconsole.log('Base token:', base)\nconsole.log('Quote token:', quote)\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `dex.createPair` action and wait for inclusion manually:\n\n```ts\nimport { Actions } from 'wagmi/tempo'\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\n\nconst hash = await Actions.dex.createPair(config, {\n  base: '0x20c0000000000000000000000000000000000001',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args: { base, quote } } \n  = viem_Actions.dex.createPair.extractEvent(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Key of the trading pair */\n  key: Hex\n  /** Address of the base token */\n  base: Address\n  /** Address of the quote token */\n  quote: Address\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n}\n```\n\n## Parameters\n\n### base\n\n- **Type:** `Address`\n\nAddress of the base token for the pair. The quote token is determined by the base token's quote token.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`dex.createPair`](https://viem.sh/tempo/actions/dex.createPair)\n"
  },
  {
    "path": "site/tempo/actions/dex.getBalance.md",
    "content": "# `dex.getBalance`\n\nGets a user's token balance on the Stablecoin DEX.  \n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"2cbcd8f2e4514b44f515cfd59cdc515095e16ac4e7309dcfa2a7dbd7df793943\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIBBAYzUYQwCKnDQBDDkgCcVADYwwAczT4kAdioTSSmA0Qg+AoSJBzGYXIgAMVXvknj+ZGQF8K6bFYLEXWuvogABTi5uJwAJScvCZcMWAAZoxKiJwAwkJJSgA6YCxsHNGZyZQgYpL6ACyaZooqaogAbFqSuoHxWaXmlkgAjHYOpE405IjS7p44eIQk5P70ePFinABGoeJgvDCpK8kWDKLa+uqytcqqGi06enhrchtbXRZWAMwDjs6jjRPUXtO+c2oASYrHYXCMgmEpXKUjGAFZ5HULogato2ngISYnj1EG8QPYPiMkAAmYk/TBTAwzPxAhYGfJgziwWjQo59ax4hTnBp4tE3AzM7Gvd5DT5IF7Wcl/KkA0o0OkgBIAV02xjAnDaACF1psYAAeDKJZIAPiCHWSqUNWQonCwjmYejIcFSmOEADpmW6tTqtm6AAr2x2kOAG4pKY0RVJ+0gQZiMOD611wD10L16bX3XVugBKeiVpDAADVQkqYMbcmBxA64Hathr0z7cFQoBBeAgDABxPRwTjiThKhOkADkPbQEAA1opVo3OEJOKoYJwACIAUQAGm65eIlO3kMgQHQq1gFKUAAbntBwXIMwrAaKkGDiGhW5I2/BoNBYTiuTgJGPMTghwAAQAd23OMAHoYgfIdr1BW95xgUFv1/f9ANA8DGCg9gYCghwLDgWC8ngrg7yTFC/1jdCwKUSDoNwmhQSI3IljiMNOAAXnvR9nzDIJgFyThonw4RUmQRi2AAFXgNBLDQABdChBPnIZhAKS9UgE9UhM4cSkLYN1GCgeTUnfT8ggiJTtPcXJXAiXIWNiadMzrLjxDAxhwX4SFk09b0XJgM0wxtLShKcGIVTQVIh2sWg3XiocrKEsdJzAaLYuJaxeHit1el6RLbPssBz1PEBFP3O0hmYUpzSUTgAFp0jDTdypASqq1KdqHRGHtGoDKqg2TMqKH3B80HzKEqEk/BFwHMgR3nCcpzuB5FznBdl3XFrFLKNlEF6awai5ep2SudEDH81ahXFEVhhcXFKilSkfFmOVgQMEIwkiIphDYo0Uia/64PUn7OkOCo+l6AAORFuSQZpqFafl8TDa7cVusVEEqOEnu8alAXlQIgiwGMcA4DAonCiBItSU9YoAEmAMRSAsJRXFPTgAB9OH45ShN4cxFCi9JBbANA9Uk1SazBG00hErn+zAWAkksKAQr5nSwqgKAHzgZ0eG13W4AAbg1zXIF1ABZDZtzIAB+VIADkhC2a3K10UgFZVZXnigU3tM1oS4GSMAHZ54nAx6zSzcDoSHDgfBUgACXCfB/djoS7M441OGjWN431JO6AjL2lZgFWYCgUufdV9OM+DpQwG4JVVHYRgAC8n0hMOggjgao54FvCBZzu1VzABHUsxCiDic7zuMEz1ABlEPm9bkeu6EXNxoLSSvBL7nvfL33q+P2uY6DkPLfgOBbdSfjOGrW/dG/aOA4zoSn7vzgV8b8QVgUNfPWts66xyzrPXO/4C56iLrQY0oDA45U4JUR+OFOA5QQZrCk2xODZDMK2UIeCEE/m5gAKTgFvLAvA+ARTFqfCuUB4EayQaSVBD50HxQQRQ/MWww5HwYf7H8AAyTgdNaCM2ZqzdmURuZIMaGwxcSDuZBDERItALNlDs04CI0KOkMGFVKC2NsGJeC0K4E+CQ9hK6LXnDNaIoQ5A82YHAJQboExl1IBEN0DkwC5G4IbG+s4Ei2MXFTSKm5wawl6BKWGJ0URnWRmEsWaNKgYyJIgMkHhfjPXxm9BUxNSZkEwFEFKihaYMyZuoqRpVmytnbIYAJesgkhMWqlCJu0Ib7ShkdJEDQESI2uIEUpYA0b9IJKKdJmTJh41lPMQIlZqy1kXEsCAChchEEkD9ChChLQmFWU2EARj6nTUXKeFZCgObMGgEqBQtoYxECMvAXsnBg6sFubAFYSolBKFZls/ZtinycHjC8lgjB7iezHCE3IpDxAbKXrwFmWA/rbMXA6AkeQ4AARJsQR5VcVgYE4CBGAKxVgxhAoOZMPiTmoKgDcxcdB1KjhAhAF5OBeCMCSLwIooJLBi2dD4gAVDwURhoUUcwFuEHsIFPL4EfnoQgUAexwCVPYXsPYzl7IUG6OQEAlAWVPDaDVwh9lujIDGUg+rexK1EecmAbowIFktaoQFvANirFmgmKukKQIsxoDYjYBLnawDdAAKyVeox8zBvFgCFdwDUOq7g2s1TADmBEJC6lBskfM1jvW+sXJC5Ap5sVbD1m4tALYW6nnkkEMyWBnQQQgpAWAYa3TsCUBBI5EF7g0DEPVIgxJKhuloBBcQWAsLFpvm6d8zA5AAGIJ16zEBWtAlMla5ELQu5MS6zVVprR+OtiAG1NpgC2ttHa6ldqfDJPtA6h0jrHRBTdU60AzvnTGEtety1mq8ZwalSgE2hCTcai59j1QrA9dY6VrcW5ApIr8jap5j2IFtZc65WqfEAH0BUCoAOqSDyMobDGHUh/oA4421s4VghpgPwBa3UFU9kkIuSwMqyBbPjDQMWcgMC5DgBgTY+AYyQAHJwcwk4WkrDJYOHgfoACSo4ZoEt1khABMAbSQE9kxkJBKlgcaFtx3I4R+P2CE9THsYnQlyEcRABcnsg12rDS8iNVZkw/xgPmuxhbIB+rnJuzgsmIIAHld21vrY26AJ7kxns7d269/bB3DtHeO99k7p1zvEPVbzMB6pCHqpu+qggogJHYLkK57CLDFdIMwTeYBo25BXLQI8tyBzwbsf+iAiajVisQD4kqYbHLAbtTqvVQ4ZpWZZcy0gcgoBDgiP7BtkD9j6zGzqwl7Bps2khUu6maABsou1bqoIo2YDjc4AAUkIjaIck3puzfmxBRbfLTIndWzdtWNjtstz2yas17AgiWBApwFcpBzVHZw4QCAdabQUPo78tYVcHBYBwKrWbc3cgLejEtzgv3PZfxfhsKu5ReDjhUk4fNLLt0g562ABbQlgfmtSODiAkO4DQ9jPKuH4gEejuR5XdHD3NaAuQDADZcgTJwn2nCfngdAXwsRWgN0pAVSybANNeMhpCY8yQ0QZg+0XjEi6UVWnOlAWBaozRhXSuwAq7V3ADXAQtcRcQDr3E1hpC4ihkbgXJuuBIf2GQSschH0pb1hBOgNGW6QhROofa0hpeC64ML0X8l6o+p52QJoGTiTx599j0XcvGBIsd7ARA/uCyhGD62G+YfaAR7VCiRoTRrBe5l77p3ZfA8QWqxYMPouMOSOUBkl4uIfGsU4AsxcXEhw4bBY47MHWCJCCHP7W19r8MqKXBsD2nBGYT9cAAQmXFvsg+/Txo5pw9zHT2j/KDYzPqznB5+7GNWAQ/m/b+kH35tinX6Qe5BKj4g1k1h6q1qcqKvsuKvcHrNTv/ueP1psE5DtpxPWGgEvM5swEvOzoQCBBZCvk5GasgW0GgQ+FWJgQ6NgbgXtlwMwBgOAbclxADn8lqnQYFDtjaN+v7KVrQcmgdiNithNutjNufhjhohpJwPwWtlNu9pCjtlwSwbwUdhIRdolIBG9ndtLlfmIRIW9t/rOF9mADQfITjv9jAIDvTn9tPhDlDi8uzqoJztzkjooJXKjvdo9mIcgOYaQIzlYazjYbDsoNOA4bzsZLoWaqPk5BPsgdPrPo/gvi/svnITwQ6mABvsfp7LvlWDAAfjfh7KfsIZfqIfrO/tvvfnPnERQq/jkSfqEX/sVOeFuDuEgHuGUO5qUMgNwqQFsNWqFoehBD8qoEqCsG6DEMwOFs2nAGMbhAAh1hBPFneuYCsNhINqGpEGVDtDCPoAOqkmcHEqiEjO0MmmjDDPiIMHdKMJKFktgv8K9HMngEEPRtAFEPIcNvcTfLbGHAGjaDlJDmqKEP1C5qkAGsgPJJGJwEQBAEZDzAANS9CzizA6pc4RCGJ1J4CaGjgsqnifZoAcxQayoA7dB2qcCWw3ICDHihI6BKgOh8qgbuq2iSqVw2i4lQpGjBhcBzRVzhAtIkwsCSAEp46hLWoOK9jayeSQiAbslqovKDFiCeSR5CDrIlhPKvJgqbIFpFqiEJBBAvARAhb7q9HVZgDqCto6BdoWBKjDoGl5a2wTEGkvDB77AJBugvDPozpFRBAbStCUlCyMbsJCl2h6w5osqFqR5yBuiVbVZoD6rdH7phbHqnomkxZXq9pzGJYPohkulzohnhlPjZloD1StCRBeK9ZwFXgIG/RFCRTIFwh4HLEvFDhmKpBnYzY2hmL5FuH6wNmcAIgfblqyFln7Z1kNkqGtmuFompCdndlba9n6EAG+JgBLzua6Snjpm5lRl7qfixkRbxntqJk9p5kpn3pYTplpazpZnsARm5n5k6DfSVYKJAqJDnk1btISCNEoD7jBy6ilBEDWC5S5TWDWBrGRKbFwjEixLIi8j7F4DDZHFpL3RQy4zXE0iEyLBOQrS6g7B7DJJAUkjqCgU7HIh7GDK3CNgwUnGEj3TEjwWXHSiIxKClAT5QW6qsidKUX9D4UNC2C0iBCrhrjOSrSpAHT/lCVCUjLyDPCnRkUTL3SSg7QxCwAgggxkTeQmAURoTXaYQQQSQQBEQ3ikSZp1Q/iUQARDhuhLFZDMT9lcBoWuS9geReRqi+SpiXS6hBT/TqzaRJLCwxS0DqCVDEhQAvBwhpC8CNCNAvCVBpDWBwj67SDEhwjiAvArBQyVCVCai8DSAwDqBwjSBwgJDWArArgrArAFTaTDLpS0CZS8DCXVU1W1V1U1X5RWR2ThG1mHZDg8V8XoUqHWUwBFSlDdTiBICgABCKDBxCB4CXggCuCuBAA===\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst balance = await Actions.dex.getBalance(config, {\n  account: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  token: '0x20c0000000000000000000000000000000000001',\n})\n\nconsole.log('DEX balance:', balance)\n// @log: DEX balance: 1000000000n\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n```ts\ntype ReturnType = bigint\n```\n\n## Parameters\n\n### account\n\n- **Type:** `Address`\n\nAddress of the account.\n\n### token\n\n- **Type:** `Address`\n\nAddress of the token.\n\n## Viem\n\n- [`dex.getBalance`](https://viem.sh/tempo/actions/dex.getBalance)\n"
  },
  {
    "path": "site/tempo/actions/dex.getBuyQuote.md",
    "content": "# `dex.getBuyQuote`\n\nGets the quote for buying a specific amount of tokens.  \n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"a420bc920b6563e021956e1161cf4176a0594ca6d74434e3e2fa2b7a9993a741\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIBBAYzUYQwCKnDQBDDkgCcVADYwwAczT4kAdioTSSmA0Qg+AoSJBzGYXIgAMVXvknj+ZGQF8K6bFYLEXWuvogABTi5uJwAJScAGYArmD8gmCcWJJwMACqYIxocEFEobEwiJxipBZKFJywvCyhcCVgscwARmQRJS2MShZoADrZrOxcqaTpWTmmUBC8CAYAsrFyAljm8JzipWjlypykMFj76WASxskQ0RucTa1knC0YVz0kyXRsliecF/fhMJwAjNZOEFAW8hIo0BEAHQDAYAWk4ABEZg1OPg0GgsA0APTYoiMGDMKFwfDY6azbGxATmATwbGjcbZXKUajiJRzZDIEB0cSsBQslhsDicYApNKZJlwTiuGKkCDMTgAcnxhMVsLADIlkyCioALAAmayKqrSCIDXGcA3Wa0221gEAAXQdom0+l1mjMihUakQgK0kl0gU1E2Z8gsVn+dgcpCcNHIiGk7k8ODwhBI5H89DwITCkU4vBMXALYGi3RKAGEhKWlANBcN81XuiyxJJ9AAOSOe5SqJAANn9Oj0eGL1ZZ5ksSH1UccznjiY81C8qd8GeoAWHhY2zAg8TQAEkwJ1ur1m66kP9/gBmeRenuINsDwN4Xk7k4HsfhpC66cx2d9pOLimBhpn4a5ZgYdbCkYSSmC2Ui+pethdt6GiPkOBjQSYH4Tog34gPYM5xpOl4AZgQE+OmLI0OBICQVwsC0KerbnpeD7IXe16soOgQMdhVh4QRv5EYgl7/KRS7ASuVHrgYcQJGcnCBgAQrEGAAIqxBANAADyViW3QAHxBCOZacHp1ZVKMvJ6GQqKYcIUIMVCymqRpWkwFCAAKjjMDZYy6Y2SgGR0nCeXKzCMOk2n2XAjl0M5egqepmk0FCABKeixKQYAAGqFDABkDGA1lwKkvB/C5yXuSy5JzCAADiehSqofwAI4pX80TsPcqkVFcpUwLUpa8Fur5cN8aAQAA1oosVUWyHJcjyfK4FQAAGG25LWQzCqKvD7OINDmd0VTopi0qyvKSoAAIAO5shF2IFvsaqDEKXCijQQwXdE4U3fdSiPc9MBPQ4FhwK9dEijwiQmD9f2KndD2ME97Ag19bCvQMxZiA2+lKJwAC8+YHUdgVBMAAycPmYPCCUyAYxAAAq8BoJYaDOlTnDbOIwjvailPJNTnAM4SbBQowUAOiUZ1YEEEQUFz7gDK4ZpgNjm4vruB5Exs905DDZyxU5lVuTQxmBVUgvU1rJwAPJUiUwaSjqgJGlUvYK1zk0zWAB4lIq1i0IavBQmHF7Gt702KA7aAB0HIdh1ChqR2AqsDBta2OhQXJWcwLImQTCLHUoULZ7nPksnnflSgi3kxr5cZzc6XL7GgWXCCyTP4H8tvjZcPuKDrlgwLAUDcxAPWPC1pQ4ENBLj33sdl06LrMb6Bo3t2PoXmhgSmx1fFfj+sYuCJACs4nkSBq7UYEOaMOEUQ40WgUVoF23vXjo5r/B/zn3hBQ28+x7w3PjI+uET5/lwuoK+3gb7SRokEQ4EAcAcAwFEJejt7jHhODVFEeBuDbl3F8Ae0cwCxwnlPMuv99D/F7P2diPpZBcSfAYLBDAww4XPlA4S+o4HLkopme+oRH55mdtqAocgiglDKBUKoNQ6hyFRDcNopAQpdB6CcT+9YJGhhALVPAixliMFWASKUmw5G7H2IceAEJDpJFIVcVRdwHhPEYC8TgYIPj9x+OkAEQIQTWG8RCaE6oETIlmDLDEWJEC4hVESEkZIUSUmpDkcx9JxQhlMBIdkSBOTcloLyVYq1aI7Q+mKMYWpcjwyusqAkzAsYaiyS7PUKcTRqwtFaW0PT7SrxAHBOh6gPRAJQr6JC2g2EgD0aYccVgeH4WjKfeMV4BGSSEWBe+KC0GYCiIPP2h5OBrSDgAEmAFYpQrgs5UEMRhKAUAjhSgmj3CevsqEDTAFAGhAyzyIENJ2UZd4PSTPQtQch74uFWEYYJZZk41kUVAnfbM2yyC7NeTHbBxzaBnIuVc/BsxCH3MeU4me+yqEtFUt8wZk5z5sUBT6NiILAj7NjhAj0MLoH8IXGReBUlhF4GKr5UqTg/g4wgAoAYBRSB4zgOK4oZkTByvxXVbufw1pioUGtTg24oBLD+Cg/EsALGlEFAoaoMAKVKC0QTDVfxVCHU4JFE1EU5CSCoS1AYAApcQBQADK+1TGv2EHK7Vg0HDZDgAqA1ktR73EeLdC19w5S3XSGMGE6swCqu1dAPVXjaD825rdSeA154jQLEMHxDR1QACoeBHL0rKzV+ZXVwClLdHI+BQ2qGgFKOAsR7AbClOqxVCgoRyAgEoeWa0qjDuDaOsgcpSBTo2J8o5tqoT3Wysu+1RZeb3D+LEdI49JqcFuuUGgVDeaPAAHLQA8gAK17dsGAvJ021u4IpcdLRQhrpHTALV4MJAJFFYFLKsaT1npyHayeyA1ooPKq24kaBphUjWg6IIsscTYkgLAR9UJ2BKGSRSV1NAxBwiIPqXUUJaDYnEFgFG8H4CxXRMwOQABiRjraxAochCuqAAxYOcditxhdaGMMxKwzhmAeGCNEbgNiEjrNyOUeo7R+j9I5QIeY2gVjHHNNMZE6QdRUJOBZqUF+n9s7G3/vzHutonBD2xvbd2qkjryl9RnmtKTiBbVap1Xq9NAwAD61bq0AHVJDZGUKFoLJQzMWbkDKkNEAWj3sGmgRUUpG6ECgBY/Y1wYAdruDjSKNAThyAwAMOAGAEj4DlJAQ9nBzAzW5i8loybU08E8nuZqPdHhHEJC0BQVRIDSskHavrMrSsQgqwMcINX7D1Z3FKZrvc5CJa0j3aVt7YBQkfVsA6zBYqcF9TACbfxYOQAvUIFI+nW2cD3NiO2YnMNxOw3emTOg5MKcOkpijVGaN0YY3d7TunxBwiuzAOEQg4RCbhIIKIXVSADG3PliwSPmAOKEIFsAABRIpK0HNwA8y88zKXLO+cQOqTOj6NZzo8uOydioe7rcnkW0gcgoCKgiAAbnNNiUKOxcgyxgKz097BOdVBPdxnc/QEh/rHROnULPx2cAAKQQyqIqdnnPud87ABaMKvRUQq7ZxLqAUvi3Idl3T6zUIF3sCCJYW6nBcdGcd4qMLhBUFwCqLK7LfVv3jwcFgHAlgucRF5/zwXxuvHu+lUKuAbJe6rpbLwKa3NfzQa2LAIzVODcC+pm7xdJQvcQB937+Ueh8CB/EMHujYfR7R+FhsLgyAYBSOlufX059m/Cwdf68oWA0BQlIPEA83dIp6TvsCbzRBmAIX1L6NsnTC/964HbVL6XR/j8zTXuA0+Aiz7vYgefIlrDSBEivvvNsuDed6GQYqcgNMzCY9iOgg0qRJEQMM300gb+t4iwd6hAOhwhnoN5kCIC9h/L6gAEOrAFyCD6BrH6wCIAP7ZShAv5abv60Cf5nA/7QG9jWCr4t6AH34nCP6YGY4WDv5SJBYXJ/KXgiTqgvzXDWS6ye6MDracBpQpbgxCCKj67rqbpgBBBrSIi8y6DSpnKCowCuAACESIkhZA8ha0UeBeMeJwqIEhygdwYWXBiWvBXQwaYAihOhUh8hluOeC6GcG06o+OxSZqh6JOaqDacqWqvALaVaGaNOcAtu40rmxMgYvqz6vIvqVehAt08sQhm4C6uswRoRzA4RvkkR0R/h2qGAbhZqxMzuSWo6WRMAQQsuVQC66hKOmRCujOyuouquOuEe+uhuQuJuNRZuHOFuVCNuYAzAFR9OiuTOpu6umuSodReu0eRuWhIuYudRVhnR3RBR9u8eTuMALuxeHuZeFepQVeqgte9eoeigo83O6hjRxu9MqxpApe3uWIleAeuwQeaIEB4ezoVCNhGarBshHB+h3BRh/BYAgh5R8xIhYh5hdwMh1kChShuhpAqhRxAu4xwuEJUhnAnxhhfBJhZhyhUJVhLxmc80eSKAXI6QpSyAsqWU5U6Gr2uIPQqgsQLQUI5a72uG8mUm2IQ2KWeIKmNG5gLQqMvRj6EQjozoPy68okdKt4PowKAYoKtqECfoiyhEZ81g8KCC/KBgQQ2W0AUQ8xVRieyeAA/CUFelUEnKgmcKEPXLyKiFesgA6CFEQBAJLMCAANT/BfDpjjp178k3IEIGBwnNSTxrQy6oanodoFa3RzImbGIrBmoBjNAQhSi8B2b6rhBHpVDOadoer6RjBcCOaLy9b6rlCY6kCPA6m6B8YbDcF15QDpJCA/o5mDqlA0liA5Bf5CCSr5S9osBcFuonqCZC7RBBCXgRAvYxJvaY5gDqD4ZfbjixA0Zjmw7J7yZjmXgaa9DRBQiXhQgsZyBqxBAzwxm+RaEbD5ahCJapCtrgYwZrRf5yBQgY6HRTrkkSZvZSafaEa1Q/akZoDKYA5qYozXmbk6bsbXl3loAgVwgBiRBhI+EbS07y7CCvwkLEznwxG9FVGKgFi7glBq5c5VAYUnAwmaHwl4VxycA8LvLW5Ui25yp9E6jEWIDGgNi7gEW+klB0WkVWGBly6ZzqinYXZXnUi3nsCY5oAPniaYiSYfaxSybvmKZkb/aqZA6pJcEAW6bAVCWHRgUQWI7dSo5/Do7qVnDfK5KLQDIWDlQshEDWBQj/DWXWgCm0JICXj6iML0qOWgIGCM4ylIQcrCRthKl8qbJgK4x9z+w4JaKcJCnwSXi6iinAL3juUgAhX2iQrnjeVLLQKITwq5IsiyF4CeUOUXyxVjITIySGDEKfAjxjwlBuyIR2gylThylCQKmuCCkFiwBMDlLQwxS1IKja7IzYiMyQydWigzI9VKgJJDVfx7SBRjWKhQg8nVhNKsFJW6ziD6xcAxRxS0AJRoBJRmyFGFxWxcwcJOwtLaiKhuwMWeyKxCz7KhWBzBzWC8A9IvWvVvXvXWD/CpzUwsrYIPUhwfWA1A02j6ipzpyvGVFK6KhEJjQFajyjz0VVBJVqwsiNziBICgABCzRJB4DMiuCuBAA\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { config } from './config'\n\nconst amountIn = await Actions.dex.getBuyQuote(config, {\n  amountOut: parseUnits('100', 6),\n  tokenIn: '0x20c0000000000000000000000000000000000001',\n  tokenOut: '0x20c0000000000000000000000000000000000002',\n})\n\nconsole.log('Amount needed:', amountIn)\n// @log: Amount needed: 100300000n\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n```ts\ntype ReturnType = bigint\n```\n\nReturns the amount of `tokenIn` needed to buy the specified `amountOut` of `tokenOut`.\n\n## Parameters\n\n### amountOut\n\n- **Type:** `bigint`\n\nAmount of tokenOut to buy.\n\n### tokenIn\n\n- **Type:** `Address`\n\nAddress of the token to spend.\n\n### tokenOut\n\n- **Type:** `Address`\n\nAddress of the token to buy.\n\n## Viem\n\n- [`dex.getBuyQuote`](https://viem.sh/tempo/actions/dex.getBuyQuote)\n"
  },
  {
    "path": "site/tempo/actions/dex.getOrder.md",
    "content": "# `dex.getOrder`\n\nGets an order's details from the Stablecoin DEX orderbook.  \n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"1b4c194e1433ff47798203a8d893230e07a7bba99b163b51514c7b0d01dbdc5f\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIBBAYzUYQwCKnDQBDDkgCcVADYwwAczT4kAdioTSSmA0Qg+AoSJBzGYXIgAMVXvknj+ZGQF8K6bFYLEXWuvogABTi5uJwAJScvCZcMWAAZoxKiJwAwkJJSgA6YCxsHNGZyZQgYpL6ACyaZooqaogAbFqSuoHxWaXmlkgAjHYOpE405IjS7p44eIQk5P70ePFinOywpKnAuZzbK6RrAJJQqQBGyRZoANxbO8ziANZkqQAG1rQAJMBipBZKrk9XYB2nGOEAgdwA0jAMM9Xh8vj8/gCgYw4AAhRhHYGghTiMBInYCXh3VJgACuzGOZHx23EzAgpLAaBOZ0Z1M4pBgtwsP2ZSnObKwHKIvP5122lnoItZYs4KIAYuYsCdsTBcWyEoqACqMIkk8mU0gA1ylcpSRDqWS1ZSqJAAVhaOj0eFWfjMFisAGYBo5nKNGhNqF5pr45tQAkxWOwuEZBMITdp9NIvVb6hoHW08DGTF13Uhk/YfSMkAAmawBzBTAwzV00BYGfJRziwWjxip9az9FM2xDJ7QZgzNnM9Hveoa+ksADnLQarIdKtcCCQZ/FjnDaAHk9mQADwZRLJAB8QQ6yVSe6yFE4WEczD0ZDgqSzwgAdM3nxut6RnwAFG930hwLuxRKAeESpN+pAQMwKIwNuT5wK+dDvnom5rM+ABKeikqQYAAGqhKSMAHrkYC0vA168DAa4oZ+pRQBAvAIAYADiehwJwuK7GsADk7GwBIjByOxCSQcwnCqFRLqkCCYLPvO4hKExyDICAdC0lgCilE82loHAuQNoUwDRBy4g0OeySXvgaBoFgnCuJwIlQZw3EAAIAO4KdBAD0MQctx+mRoZ4mcmwdkOaJznuZ5jA+ewMA+Q4FhwP5eSBVwRnwWFjlia5HlKN5vnxTQkYpbkSxxMBnAALzGaqZnAUEmyAtEiXCKkyDFWwmrwGglhoAAuhQ1xoEMwgFLpGwyh1IUQM+GL9akVk2UEERDc17i5K4ES5GVsRcWQ1UcR5jDRiuJiIbQyFoKhZDHsBl5NdsUmHKkvTFh6YBrVtuTaU8ICDSp15DMwpQnkonAALTpMBckAyAQO0qUCO3iM7FQ7+wP/gh/0UCpHJoNhcZUJq+CSZ+TZ6OIgnY/1g1lAm7b2l2DQTumToGB+axDp6o7DC4PbFtOlY+LM87hgYIRhJERTCBV+4pND8sBeNMudKIDOIL0vSVPIdTds01CtOzIBg9zea8+OiCVL0QveNWoYLngQSChAOAcBgUTPZipx8oydEMUxIA3aQnD7AAIuJECcAAjoRpAYHJ6ttprxYGwo1oNDUfbG17ZtWxbRaIILHiBsL9ti3W4BkXAFFUUsEAKLkRCSDLcANzAZ4mO3/uMXgJNUU89cKE8nB0lApIKFekFEBi8AcZwcD5JPsDHKSSi++DQ9Uaopmyuxi/QXILdoFHEm5AAUuIzcAMq8N8WBy23k+3gWeRwGJLsz7AUDAhgnBuTAY4wJIJuTgPeZ8O0wD91HtACeVE6DjXYmgNyUca4wF4IwJIvAiiRksIyB8kCABUPBOBPD3E/GAI9eBHzgOxNyJ18Cjz0IQKA+9ST2A4uxQeXcFDPjkBAJQK0niXm4cIduz4yCQVIEIjiYAf6iIoc+DyOEZE7ziJxSknBSRgJ/iff+3waCR1kX/AActAGAz4ABW+8RqqmYBAsAxDuBrn4ccUIpCt4jyShIMAlFVbJGwjAXRUc3IGO3lHZATwXaUVoc+MQ9FSRoCeP1IIS0sAPi8l5SAsBrHPnYEoLy9FGJeSPjQMQEMiDFkqM+WgXlxBYBitE+ACErLMDkAAYiabQ+J9I0BRFxFAXIkSukIXiZI5JqTrLpMQJk7JMBcn5MKQHEppkeoVKqTUupDSvIjOfK0jpIyxmkFIBEZ8nBoFKFce4hR7cqEaKotooJ/8GG9NlGlH44lSakLmYgTxMDx68MgQAfUIYQgA6pIPIyhQVAtSBcq5chW7txWMcSx6C0C8SYaoaA7FJBUUsAwg6SwUQ0EZHIDAuQ4AYF8fgSCkBtGcHMA8T5VFjggLASHbg359hINJn/DkYCKQKEvJAEOeKWV/2JWIRQaByW5HCNS+wdL6TsSZVRUIiKIASRDmY2AVibEmWYAhTg18YDby+ZEyAhihBTwYs00OXl1wTLSRkrJ5iFk6CWcU0pazKnVNqfUxpkEYktLQG09p4gIZWpgBDIQEMRkQ0EFEBI7Bch0g5LKRI7BbjGDAA43IABRWg6lJ7aI+RJFxEA3GIpucPRAkDfrWN2mI3h/DBHcVJnIfh/92ByCgNxCIAJMmcAgucB8nBO3dpQaQPtl49E9MSc2xRbaggdpgF2qOABSZKl5uLTr7QOodXkR3fHwYtddU7e1QDnagtACS0BLvEZI9gQRLBuU4AW45L7uJgsIK7OAl424o3wB8txP8HBYBwJYftERB25GHaO/BnBn0h1vLQhS6q5ELwkEScSY5wnYbWOseDx7tifqkakX9oJ0mAagsw0D4hwP1Kg0EkjQIOJcGQDAZucgFq2k1raNjQJd633vmgZ8pAGT7CgSBuAe4FycFfeYxARBmCaw9MWTWE5tpgGHcJrg65UXook1JmTKJ5MBEUz81TPZrDSB7NpoTOxd4/POGQUicgdnBuaV5Og6DEmxnNOoTW0gnM0k49x0I/UIahOY48RoRdixhY48hnjonGAPys8ptzOFQhebtbQ3ztB/O5vNAlxo1gdN6ec1wVzjJ3N5a5LpyLcggXwmUEXD0PZIHlU4KRW8h0f2CURehKtSUhDcQBFvJRkKghPDDriXQIcPj9ZgK4AAhJwBbygyDraeHB3Tx7EMTS24tg6YLhucFG6cMRYBNvbaW+tm9hHJE/W0pAotJaHmL2UCy0h5DbnRBoQQsAb2nhNt8XtV5NU2jX1sbSa+dHCBuRWlNvakjDqw/h8wRHt5keo6XVwZgGAAeTxqm+pFvDScwCCL0y8kiDtppJzwixK610bp7TOmDR6T1jvPRz/d16jG9KZ9TvhAjV2Tq3Tu5ygvD1seO+OqXnPZ3C8XWAYnYuUOvpgO+8j36qP/to8BhjTHIOKCCQOg7CHT0neQPr9YnBDc0YXnR1QpuJ1xeg4NIxr3QeQ9ln1sig2Ltdqu2N27k3Rcs5myo+bZ3lvAFWxt07O3SB7et0d2346Hvncu9d8bd3U+Pee37368lFJIGUmUM1pRkBt2wpRFJLqZleT5KoUkxxnwxGYG6nJcA+/xWOK4ryfrNnmGOLFFtFjrERH+nTU0+htZM3Tqmc0bN2gs7zjUAsY5C5lhLhWO2c55iBCCMB6AUQxcrrQ3ADDAB+VIuIMCXmfG/12ubQgY1pOO5/yB+pgScBEAQAYiKYADUvQKwsw/CjGc+VARSgciuRiTwC6SSzyqgfWuu3QFinAAAshPAIBpOqjoOSDKuxLwPcleOEDopePQhgWfPuABFwI8j/OEH9oKCwJIH/LfhhrIqwWHoxlACdLGO4iwZwgvJ3mICdAFkIE3ARHPAfIJMfBElErbgkEEB6BEM6lMq3rcGAOoHkp6t0KSLUnofGhhgPnoR6F5ucAkM+B6HsmGnIDpkEBWq0KQUhuKhqlQbQk8nopEgFnIM+CmqQDmkIs3lMq6nMh6gUggSsmUmgOsv6lsjFIEY4eGoESETmlkaZBDK0JEKcg2tpBDr1jEAyFwDVLaGjtPuLu2mUYyKkJuv2pePUX0jzorqkK0akPaEYqgY+q2hLtxF0dxC0fSIyJnrzmekUOUd0c9n0WAL9JAqalRAEQIEETkWgOEZMjZFEe6ghIsnET6uUmPgGtsmkfsu0pkdmqZBsXkToNLCETAhmhYBsbGInIbJXigCpD9pRKUEQNYM+L0ICdYNYPPknGaL0LaMmKvt2L2EbIEG2tvgXPzFOIfjOCLDWOLCbFDp+JNM1E9J+C9MCCyJcDKLcA8I7i8O8J8CNAiP8DKDJBCFCDCNSe1r8PSfiXvOiN7CqGqDKISMSH1vqFSDKLSGMUyMSb7KSZyRyE1jyJKaKJyYKNxlKNKUCBKBKT7IqciHAAqBlsqO3HyZyRqBltqLqEKRSCKWAMaOCUvuoCvnrA0EzNnIEFJEiSbIMHzKMB6AfpMN4BIEoKUKtngIibaX0BOMWLrBnEgLYGGJXMHBTAJEJBsBxHSDMZwL0CCVmVmZ9KPPcI8M5K8G/s+CMVyRiKkCNIRK/m/nZHnJaLvl6TGa4HTDELABGCrBlGdMIFlBFHutFF5J1BAClAZOlP4uDPZNlM5M+FPlkKVAHssFJIdOIMdKdLmghG+JzLdGDA9NcF7K9O9J9JtDpv0azoMQmfxFTMmaWVJDpqUCjOIEgKAAEIoIvEIHgLpCAK4K4EAA===\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst order = await Actions.dex.getOrder(config, {\n  orderId: 123n,\n})\n\nconsole.log('Order details:', order)\n// @log: Order details: { amount: 100000000n, maker: '0x...', isBid: true, ... }\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Original order amount */\n  amount: bigint\n  /** Orderbook key (identifies the trading pair) */\n  bookKey: Hex\n  /** Tick to flip to when fully filled (for flip orders). For bid flips: must be > tick. For ask flips: must be < tick */\n  flipTick: number\n  /** Whether this is a bid (true) or ask (false) order */\n  isBid: boolean\n  /** Whether this is a flip order */\n  isFlip: boolean\n  /** Address of the user who placed this order */\n  maker: Address\n  /** Next order ID in the doubly linked list (0 if tail) */\n  next: bigint\n  /** The order ID */\n  orderId: bigint\n  /** Previous order ID in the doubly linked list (0 if head) */\n  prev: bigint\n  /** Remaining amount to be filled */\n  remaining: bigint\n  /** Price tick */\n  tick: number\n}\n```\n\nReturns the complete order details including the maker's address, order amounts, price tick, linked list pointers, and flip order information.\n\n## Parameters\n\n### orderId\n\n- **Type:** `bigint`\n\nOrder ID to query.\n\n## Viem\n\n- [`dex.getOrder`](https://viem.sh/tempo/actions/dex.getOrder)\n"
  },
  {
    "path": "site/tempo/actions/dex.getSellQuote.md",
    "content": "# `dex.getSellQuote`\n\nGets the quote for selling a specific amount of tokens.  \n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"e72885ed736301b0d1aa5f428258ba248ff06fde799d2fc7fe974306d5b6b9c7\",\"data\":\"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=\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { config } from './config'\n\nconst amountOut = await Actions.dex.getSellQuote(config, {\n  amountIn: parseUnits('100', 6),\n  tokenIn: '0x20c0000000000000000000000000000000000001',\n  tokenOut: '0x20c0000000000000000000000000000000000002',\n})\n\nconsole.log('Amount received:', amountOut)\n// @log: Amount received: 99700000n\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n```ts\ntype ReturnType = bigint\n```\n\nReturns the amount of `tokenOut` received for selling the specified `amountIn` of `tokenIn`.\n\n## Parameters\n\n### amountIn\n\n- **Type:** `bigint`\n\nAmount of tokenIn to sell.\n\n### tokenIn\n\n- **Type:** `Address`\n\nAddress of the token to sell.\n\n### tokenOut\n\n- **Type:** `Address`\n\nAddress of the token to receive.\n\n## Viem\n\n- [`dex.getSellQuote`](https://viem.sh/tempo/actions/dex.getSellQuote)\n"
  },
  {
    "path": "site/tempo/actions/dex.getTickLevel.md",
    "content": "# `dex.getTickLevel`\n\nGets the tick level information at a specific tick on the Stablecoin DEX orderbook.  \n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"3fba3acc82c4f344f1ecc51d048f896383905db7488d943734d6cdae1b8b032a\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { Tick } from 'viem/tempo'\nimport { config } from './config'\n\nconst level = await Actions.dex.getTickLevel(config, {\n  base: '0x20c0000000000000000000000000000000000001',\n  tick: Tick.fromPrice('1.001'),\n  isBid: true,\n})\n\nconsole.log('Tick level:', level)\n// @log: Tick level: { head: 1n, tail: 5n, totalLiquidity: 1000000000n }\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Order ID of the first order at this tick (0 if empty) */\n  head: bigint\n  /** Order ID of the last order at this tick (0 if empty) */\n  tail: bigint\n  /** Total liquidity available at this tick level */\n  totalLiquidity: bigint\n}\n```\n\nReturns the price level information including the order IDs for the head and tail of the FIFO queue at this price level, and the total liquidity available.\n\n## Parameters\n\n### base\n\n- **Type:** `Address`\n\nAddress of the base token.\n\n### isBid\n\n- **Type:** `boolean`\n\nWhether to query the bid side (`true`) or ask side (`false`).\n\n### tick\n\n- **Type:** `number`\n\nPrice tick to query. Can be created using `Tick.fromPrice()`.\n\n## Viem\n\n- [`dex.getTickLevel`](https://viem.sh/tempo/actions/dex.getTickLevel)\n"
  },
  {
    "path": "site/tempo/actions/dex.place.md",
    "content": "# `dex.place`\n\nPlaces a limit order on the Stablecoin DEX orderbook.  \n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"ae78873af261e30e0a9ea1adc6baa89b8d91d755de180f0299788136db141068\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { Tick } from 'viem/tempo'\nimport { config } from './config'\n\nconst { orderId, receipt } = await Actions.dex.placeSync(config, {\n  amount: parseUnits('100', 6),\n  tick: Tick.fromPrice('0.99'),\n  token: '0x20c0000000000000000000000000000000000001',\n  type: 'buy',\n})\n\nconsole.log('Order ID:', orderId)\n// @log: Order ID: 123n\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `dex.place` action and wait for inclusion manually:\n\n```ts\nimport { Actions } from 'wagmi/tempo'\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\nimport { parseUnits } from 'viem'\nimport { Tick } from 'viem/tempo'\n\nconst hash = await Actions.dex.place(config, {\n  amount: parseUnits('100', 6),\n  tick: Tick.fromPrice('0.99'),\n  token: '0x20c0000000000000000000000000000000000001',\n  type: 'buy',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args: { orderId } } \n  = viem_Actions.dex.place.extractEvent(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** ID of the placed order */\n  orderId: bigint\n  /** Address of the order maker */\n  maker: Address\n  /** Address of the base token */\n  token: Address\n  /** Amount of tokens in the order */\n  amount: bigint\n  /** Whether this is a buy order */\n  isBid: boolean\n  /** Price tick for the order */\n  tick: number\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n}\n```\n\n## Parameters\n\n### amount\n\n- **Type:** `bigint`\n\nAmount of tokens to place in the order.\n\n### tick\n\n- **Type:** `number`\n\nPrice tick for the order. Use `Tick.fromPrice()` to convert from a price string.\n\n### token\n\n- **Type:** `Address`\n\nAddress of the base token.\n\n### type\n\n- **Type:** `OrderType`\n\nOrder type - `'buy'` to buy the token, `'sell'` to sell it.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`dex.place`](https://viem.sh/tempo/actions/dex.place)\n"
  },
  {
    "path": "site/tempo/actions/dex.placeFlip.md",
    "content": "# `dex.placeFlip`\n\nPlaces a flip order that automatically flips to the opposite side when filled.  \n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"e9b109959543a4af97fa80fd74ff57c367fad28063d8fae2ea79374624391edb\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { Tick } from 'viem/tempo'\nimport { config } from './config'\n\nconst { orderId, receipt } = await Actions.dex.placeFlipSync(config, {\n  amount: parseUnits('100', 6),\n  flipTick: Tick.fromPrice('1.01'),\n  tick: Tick.fromPrice('0.99'),\n  token: '0x20c0000000000000000000000000000000000001',\n  type: 'buy',\n})\n\nconsole.log('Flip order ID:', orderId)\n// @log: Flip order ID: 456n\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `dex.placeFlip` action and wait for inclusion manually:\n\n```ts\nimport { Actions } from 'wagmi/tempo'\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\nimport { parseUnits } from 'viem'\nimport { Tick } from 'viem/tempo'\n\nconst hash = await Actions.dex.placeFlip(config, {\n  amount: parseUnits('100', 6),\n  flipTick: Tick.fromPrice('1.01'),\n  tick: Tick.fromPrice('0.99'),\n  token: '0x20c0000000000000000000000000000000000001',\n  type: 'buy',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args: { orderId } } \n  = viem_Actions.dex.placeFlip.extractEvent(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** ID of the placed flip order */\n  orderId: bigint\n  /** Address of the order maker */\n  maker: Address\n  /** Address of the base token */\n  token: Address\n  /** Amount of tokens in the order */\n  amount: bigint\n  /** Whether this is a buy order */\n  isBid: boolean\n  /** Price tick for the order */\n  tick: number\n  /** Target tick to flip to when order is filled */\n  flipTick: number\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n}\n```\n\n## Parameters\n\n### amount\n\n- **Type:** `bigint`\n\nAmount of tokens to place in the order.\n\n### flipTick\n\n- **Type:** `number`\n\nTarget tick to flip to when order is filled. Must be greater than `tick` for buy orders, less than `tick` for sell orders.\n\n### tick\n\n- **Type:** `number`\n\nPrice tick for the order. Use `Tick.fromPrice()` to convert from a price string.\n\n### token\n\n- **Type:** `Address`\n\nAddress of the base token.\n\n### type\n\n- **Type:** `'buy' | 'sell'`\n\nOrder type - `'buy'` to buy the token, `'sell'` to sell it.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`dex.placeFlip`](https://viem.sh/tempo/actions/dex.placeFlip)\n"
  },
  {
    "path": "site/tempo/actions/dex.sell.md",
    "content": "# `dex.sell`\n\nSells a specific amount of tokens on the Stablecoin DEX orderbook.  \n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"997af5c0532953dd4e2e196ac8b932f9108ab9fe48dbcca2fc81f6d18ce19b1e\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIBBAYzUYQwCKnDQBDDkgCcVADYwwAczT4kAdioTSSmA0Qg+AoSJBzGYXIgAMVXvknj+ZGQF8K6bFYLEXWuvogABTi5uJwAJScAGYArmD8gmCcWJJwMACqYIxocEFEobEwiJxipBZKFJywvCyhcCVgscwARmQRJS2MShZoADrZrOxcqaTpWTmmUBC8CAYAsrFyAljm8JzipWjlypykMFj76WASxskQ0RucTa1knC0YVz0kyXRsliecF/fhMJwAjNZOEFAW8hIo0BEAHQDAYAWk4ABEZg1OPg0GgsA0APTYoiMGDMKFwfDY6azbGxATmATwbGjcbZXKUajiJRzZDIEB0cSsBQslhsDicYApNKZJlwTiuGKkCDMTgAcnxhMVsLADIlkyCioALAAmayKqrSCIDXGcA3Wa0221gEAAXQdom0+l1mjMihUakQgK0kl0gU1E2Z8gsVn+dgcpCcNHIiGk7k8ODwhBI5H89DwITCkU4vBMXALYGi3RKAGEhKWlANBcN81XuiyxJJ9AAOSOe5SqJAANn9Oj0eGL1ZZ5ksSH1UccznjiY81C8qd8GeoAWHhb2MF4MEYWDQJQAKjHhLGkgAlbe7/cs8lzEDH8SnxJCLc7vdoKHN11If7/ACs8hej2iAetogZ4Ps743mGE6ILq04xrOSBtkmi4pgYaZ+GuWYGHWwpGEkpgtlIvoAMxkUB3Y+mBAZDgYhEmGO4ZIAhID2DOcaTr2aGYBhPjpiyNC4SA+FcLAtDfq2v66p2CjUUglGsoOgQScxcFsRxSFcYgZG6rxS6YSuQnrgYcQJGcpQwHIcgAMoYAkAA8lYlt0AB8QQjmWnAudWVSjLyehkKijHCFCEnEtZdkObwUIAAqOMwQVjM5jZKG5HScHFcrMIw6SOcAAycMVb7XgenCPs+ZyXtBaAANwDK4bkDGAgVwKkO5WTZ9kJLeKJ4LZUVSps7Xbowpa8BszAQPEXDfGgEAANaKHAMJgAMAByEA0Ee+B5Zw+0jTF+BypAsTDS+ySqOIXAAO7iJMMTsJwqh/NsT5wGer4LQMbQHQkcixLAUBfMkmwtHIMyLfcMDROwfz7GgsSkNkuybEc7zpF+/rskgnLcrQvKrLgVAAAbk7ktZDMKoq8PsN0wL53RVOimLSrK8pKgAAvdSi5diBb7GqgxClwoo0EM7PRDl3O8/zgswALDgWHAwtiSKPCXVKMrS5zio82y8vw9iEtsMLAzFmIDauUonAALz5vTNBM0oQSFck+bK8IJTIKbECHvAaCWGgzpFS9J7tcMqLuyVnC+4SbBQowUAOiUrNYEEEQUGH7iNWa60JJuRxLFwDviPdOSa2cq0Rek3UxZ5aVVDHU0zScACSYAlMGko6oCRpVL2Wdh7lYDcNNs0APJUt34ohnkirSP+xqcEP2cewty1gJ3JSKtYtCGrFUJQn+xph5vijT+Ve8H9YR9QoaZ9gK4+fk6TjoUFyAXMCyXm2wiLsvzOi/olFk39kpSgRAlGMSU4yrQ/lyRGyNhAskPPgN6EcvrJCgmVIBzoQAkX0P8XUgEuzehQgOCCBg67RV6rBKwmloyxhcLpVCC4+LeCwquYSgQcyMHCFES2RY0oVjSlTUW1tRwumkr6f8bF5LkMQP2ZSVD2JpXUgwxCzD4zugMvxLhJkRJBEOBAHAHAMBRF5G3NAO97jdF6FJUi/xezKIUSBNslD6IgCsbNTuGikCkK0toycejOHGUzLw0I/C8w921AUQGxQtg7EqNUMazB6iNGaG0UgmUug9BOOI+ssTQwgDvHgRYyw9xrGGkkioW5DjwAhDdJIXxLibBuNk+4jxNjPEUJwMEHw5qXBaL8AEQIQTWAGRCaE6oETIlmGnDEWJEC4hVESEkZIUSUmpDkAkcB6Rz0lEJNkHIuQ8j5CTUS1MxZijGFqXIUsZbKgJMwc2GpDnaj1I/E0+cLRWltAC+0TppFOPUK44CPo/QqK8cU0w44rCBKYchX0+pQnLkEhE7MJizGYCiKPce1ir6dHsScRx+hDS2DISBf4U5oWBHxRPE4V9/FKK0ci1F7DDICWwjw7MUSBG3MZHEwoiSygVCqDUOochUQdPaMS/J/QRZFI+SUspCwS5VL2VcMVux9gNOOKcFp3x2lZLuA8J4jAXj9NoO8CErSfjpDGcCUENrwQnBmQXOZKJFmYhxHiF5xJSR3m2YwGkeyDl3Pnsc3GKAzmEwuQKa5GtYWPL1mst5sKdRWhXqac02JLQUoBTaIF+DCGTmIVRRRULwIwpVXClirL2JIp0s4tFRkMU4V4disguKXpLUULYvoIB96HyLWO8dE6i3/CHWSycZEPRuJop4wIF9t72noRoNlOkOXJjCR23lBhjFyhxRYvtW8iWcCHSOu+k7b13ptPqGdILyXSHkRCihdK8CruZRuxAHim2cRYTu9Ce6eWmXAG1DqfxLYQAUAMAopBrZwFg4klyyH+RUDVQ+dBnBSYwYUKTTg00oBLD+CY/EsAalwEFAoVJLRYhKHybbfDb0HBcH2tR3KchJB9peuggYAApcQBRbJ0w/EhlDRHtwOGyHABU5Hk4wBBua26MAWj3DlLddIYw1oDDQX8YjpHrWiylGgW6EBSg4FqBNBsQxBkNHVAAKh4LhtDKHCO8G43AKUt0cj4Ck6oaAUo4CxHsBsKUeGTAoahJDV2ERSZVEi8IaLZA5SkEzoRp8IMkvoZgFCe6KMMt8ZuvmJ8MNODnSU7x265QaC8afI8LasAoQACtgvbBgLyNaznuCcCUJDEZchcMscIyrCQCRoNpWRlVhanAas5DehZ5ApMTE7m88SNA0wqSkwdEEdOfrICwDa1CdgShNkUm4zQMQcIiD6l1FCWg2JxBYEYPSOUa3VromYHIAAxKt+A3nNszUhBsMAUABjLf++tsQsBSCkB23tpZB3oAwGO6d87+zLuBxu3dh7T2XtvZmADqEX3ftQ8B7DnJUIKo4f6xAQbw2osEdK8kP6lWQa+cC1SA61y6mvVw4d4oI2iPQFI7psAAB9RzjmADqkhUZKGlxL3afw6cM5Y18FoLXtxoEVFKWBhAoDDX2NcXcr1EOWzyjQE4cgMADDgMdU6M0pTmGWnxv4LRNPaZ4HFdupn0GPCOISCGMAqiQEQ5IVjMBHiW7EBCW3AxwiO6EM7zgru/ihCG9tdBiGmt5ba0kzrzBVqcEGlHuOpNIB1dfOTzg7dsSTwR/tlZ2JBdo50Bj7EWPru3fu4957r3yck7QN9n74g4RV5gHCIQcJydwkEFEOGpABjTRNxYJf6Szji4AKLxuJhV6jux+dq9CIz5LBHEDqjfm1i2TO8uxZ1OgmyFnzOkDkFARUEQGpgAtNlXoqIn9IY5t2B38qhZsYdgdb9z978IBXZFRACLMABSVWKoRUV/d/T/b/X/HYXINOKKF/EAqAMAizCAqkKA3LKEVLdgIISwW6TgbfOHagxUGXQgUxOAKoZDA3OpEZEGBwLAHASwD/CIL/PNLKHAqUKgxDJKbzNkDPMHLYJwaGd6TqcAzbVLS/H/fNYqBgtLEoFgiANgjg+UPQPaXYHgtEZ7AQpTUQ2OErZAGAeJVOf8WRGwkqErUTcofcKEUgeITuNBPKFyHhYEQXRAIgZgcifUX0NsX5LQtwrgSeLXHXbw3wsAfwuAQIgIYIlHUI8IsiawaQVhGI2ODYLgEI3oMgVqOQQnD7bEOgbcKkJIUCdQX0aQVw4qOwhw0IB0OEGrSwsgJRRAfUR9TQ4okrTouyMTfcLI2ARAcolGUIaogHWo2geos4UCXsJRawIo2w0o7IuYyo7EdJCwWo+JCXHVJQQYsiXSdUIRa4QKe2JUGXUNIbc8enFWIQRUb/FjfLeXIIUmREJ8XQRDAAEmAFaiSlcAAEIkRASyBITSYRCRi/8ThUQATlA7gnibJOBXiuhkswBoS0SgTITiCthKcBg351Rd8iZaNzo+ccNSY3NmdPNwgHMC5r84ByC5pucHZAxbIOteRbJjDCBbpM4vjNxUsHjeT+TmBBSkphTRTOSiMMBGS/gHZaCJMFAoQVSghgcqhUtESV9lS78YtYDH98DgC38hCsD81kTcC0RzT0CiDeNICwBmAjToCTS4CEDOBkCV40DCDMDRDbSACHTCCSSXS3SVTKDGD0t1SdCmD9DDDShjDVBuDxBeC+jBDP9ETsD/8fZ4zSA9DWCsQjCuCzD0yLD+DFAlNnReNUsbjNxwTVTHjnjsS3i8TPjDSoyCswA/jCS7hQSmyoSYT0TSB4ScybTxCSh+zENMSXj2zkN8SRyiSST6ywA35o1TkCEYBLlkBkNkYdxdtm9cQehVBYgWgoQCxmBW8Uc2sbzYBsQIZ6c8RcdHtzAWgBZjS2sIhHRS0fxdI5FK0QJaIVINxoCWU/wt0WFrA21uVuFwMggDdoAogoyH9pDPpdAAB+EoBrKoY+E7fcJIUIaBXkVEBrZAB0TKIgCAZOYEAAan+C+HTEhnTJ/Mw36gMGDN41JlILQEI05381oPhWpwqRWFowDGaAhClF4DKz+lSG8yUyqAEvdwGFLDGC4HZ3C3dxSHKHSVIEeHQtkNBxBkzw2CgCgF2SEFP00vCFKHPLEByAaKEHgxFWCxYFDR41m0hxwOiCCDIniyPKWRb3STAHUBOw73HFiEexCtn1kP2RCrIje16GiChDImH2+3ziCH5wkqShRI2BN1MvkvSBBi8tJgaLkChA3xugy0Ct9Rbzb1WnR2DW7zQBxz73x1e3KvSt+3KqqrQD6rhADEiA9XJPJhv0LmEGEVmgeP/DFI9If0VALFmhKEQI/yqCWvdWtLELzIbGWs4EAl414vIOiwWo2oPBXjOonO2pRJKDOpKAOtUK20VQpILjLwry6r6pqsRzqtxAavCrO2aoZh71fI6pDQqtJx+16vYE3wGqGsX2elXz+HX2huaSEGxlZBjXxkPx3BZCIGsBPhPmtF/OfUUl7FpUXUUmXTwFiwgs7CCWRTYV3XRTAxEluJwQ/CPEwUuhqjKj6lmDwEqk+kulKg/HRrLVYQXXfVAipoMHZpgjMAbUgoA20hYQolgoMUxUPW7XMSiHeiqiSAAAlwh8AShSZ95QTzjXB352L+aDAjaSR7VUzTMuazhZ1dIl4gLIVSEa0V0XbDbjbaaoKdF/hXB8ECxYAmAk1RRQptYOYFQ0DDZXs/Y1Yo7BV7lY7dZ4701CkaZJFuhU146oRPybY3lbjRQ5auAZQy4K4uAY7wo6BIp64EhG4bZm4w4fEO4u40754+5rQV414R4LACUp4Z5u7e5F5l5B5h4N5+011d5r1eB70l6J1/gn5ipv1R6b5R1l6d7bR9Qn4X4Gz5rTTFRBasELCSREAV4K6oQ9ahazh7b8A2KQBYFxAkBQAAgVokgv0EBXBXAgA=\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { config } from './config'\n\nconst { receipt } = await Actions.dex.sellSync(config, {\n  amountIn: parseUnits('100', 6),\n  minAmountOut: parseUnits('95', 6),\n  tokenIn: '0x20c0000000000000000000000000000000000001',\n  tokenOut: '0x20c0000000000000000000000000000000000002',\n})\n\nconsole.log('Transaction hash:', receipt.transactionHash)\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `dex.sell` action and wait for inclusion manually:\n\n```ts\nimport { Actions } from 'wagmi/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\nimport { parseUnits } from 'viem'\n\nconst hash = await Actions.dex.sell(config, {\n  amountIn: parseUnits('100', 6),\n  minAmountOut: parseUnits('95', 6),\n  tokenIn: '0x20c0000000000000000000000000000000000001',\n  tokenOut: '0x20c0000000000000000000000000000000000002',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n}\n```\n\n## Parameters\n\n### amountIn\n\n- **Type:** `bigint`\n\nAmount of tokenIn to sell.\n\n### minAmountOut\n\n- **Type:** `bigint`\n\nMinimum amount of tokenOut to receive.\n\n### tokenIn\n\n- **Type:** `Address`\n\nAddress of the token to sell.\n\n### tokenOut\n\n- **Type:** `Address`\n\nAddress of the token to receive.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`dex.sell`](https://viem.sh/tempo/actions/dex.sell)\n"
  },
  {
    "path": "site/tempo/actions/dex.watchFlipOrderPlaced.md",
    "content": "# `dex.watchFlipOrderPlaced`\n\nWatches for flip order placed events on the Stablecoin DEX.  \n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"546bd06c6d922c9812fee931dd4652721a211f4c197b95a0862ff50f70b8b057\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst unwatch = Actions.dex.watchFlipOrderPlaced(config, {\n  onFlipOrderPlaced(args, log) {\n    console.log('args:', args)\n  },\n})\n\n// Later, stop watching\nunwatch()\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n```ts\ntype ReturnType = () => void\n```\n\nReturns a function to unsubscribe from the event.\n\n## Parameters\n\n### onFlipOrderPlaced\n\n- **Type:** `function`\n\n```ts\ndeclare function onFlipOrderPlaced(args: Args, log: Log): void\n\ntype Args = {\n  /** ID of the placed order */\n  orderId: bigint\n  /** Address that placed the order */\n  maker: Address\n  /** Address of the base token */\n  token: Address\n  /** Amount of tokens in the order */\n  amount: bigint\n  /** Whether this is a buy order */\n  isBid: boolean\n  /** Price tick for the order */\n  tick: number\n  /** Target tick to flip to when filled */\n  flipTick: number\n}\n```\n\nCallback to invoke when a flip order is placed.\n\n### args (optional)\n\n- **Type:** `object`\n\n```ts\ntype Args = {\n  /** Filter by order ID */\n  orderId?: bigint | bigint[] | null\n  /** Filter by maker address */\n  maker?: Address | Address[] | null\n  /** Filter by token address */\n  token?: Address | Address[] | null\n}\n```\n\nFilter parameters for the event subscription.\n\n### maker (optional)\n\n- **Type:** `Address`\n\nAddress of the maker to filter events.\n\n### token (optional)\n\n- **Type:** `Address`\n\nAddress of the token to filter events.\n\n### fromBlock (optional)\n\n- **Type:** `bigint`\n\nBlock to start listening from.\n\n### onError (optional)\n\n- **Type:** `(error: Error) => void`\n\nThe callback to call when an error occurred when trying to get for a new block.\n\n### poll (optional)\n\n- **Type:** `true`\n\nWhether to use polling.\n\n### pollingInterval (optional)\n\n- **Type:** `number`\n\nPolling frequency (in ms). Defaults to Client's pollingInterval config.\n\n## Viem\n\n- [`dex.watchFlipOrderPlaced`](https://viem.sh/tempo/actions/dex.watchFlipOrderPlaced)\n\n"
  },
  {
    "path": "site/tempo/actions/dex.watchOrderCancelled.md",
    "content": "# `dex.watchOrderCancelled`\n\nWatches for order cancelled events on the Stablecoin DEX.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"1aec0eda0f46341180a0b333aee616ad8d50c79358e60da62345f78224a573d1\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst unwatch = Actions.dex.watchOrderCancelled(config, {\n  onOrderCancelled(args, log) {\n    console.log('Order cancelled:', args.orderId)\n  },\n})\n\n// Later, stop watching\nunwatch()\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n```ts\ntype ReturnType = () => void\n```\n\nReturns a function to unsubscribe from the event.\n\n## Parameters\n\n### onOrderCancelled\n\n- **Type:** `function`\n\n```ts\ndeclare function onOrderCancelled(args: Args, log: Log): void\n\ntype Args = {\n  /** ID of the cancelled order */\n  orderId: bigint\n}\n```\n\nCallback to invoke when an order is cancelled.\n\n### args (optional)\n\n- **Type:** `object`\n\n```ts\ntype Args = {\n  /** Order ID to filter events */\n  orderId?: bigint | bigint[] | null\n}\n```\n\nFilter options for the event.\n\n### orderId (optional)\n\n- **Type:** `bigint`\n\nOrder ID to filter events.\n\n### fromBlock (optional)\n\n- **Type:** `bigint`\n\nBlock to start listening from.\n\n### onError (optional)\n\n- **Type:** `function`\n\n```ts\ndeclare function onError(error: Error): void\n```\n\nThe callback to call when an error occurred when trying to get for a new block.\n\n### poll (optional)\n\n- **Type:** `true`\n\nEnable polling mode.\n\n### pollingInterval (optional)\n\n- **Type:** `number`\n\nPolling frequency (in ms). Defaults to Client's pollingInterval config.\n\n## Viem\n\n- [`dex.watchOrderCancelled`](https://viem.sh/tempo/actions/dex.watchOrderCancelled)\n"
  },
  {
    "path": "site/tempo/actions/dex.watchOrderFilled.md",
    "content": "# `dex.watchOrderFilled`\n\nWatches for order filled events on the Stablecoin DEX.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"31f40edcd3e0cb0dd5299ece3d0406a3ef9a70aba1beaad5bca49c399a7dd538\",\"data\":\"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=\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst unwatch = Actions.dex.watchOrderFilled(config, {\n  onOrderFilled(args, log) {\n    console.log('args:', args)\n  },\n})\n\n// Later, stop watching\nunwatch()\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n```ts\ntype ReturnType = () => void\n```\n\nReturns a function to unsubscribe from the event.\n\n## Parameters\n\n### onOrderFilled\n\n- **Type:** `function`\n\n```ts\ndeclare function onOrderFilled(args: Args, log: Log): void\n\ntype Args = {\n  /** ID of the filled order */\n  orderId: bigint\n  /** Address that placed the order */\n  maker: Address\n  /** Amount of tokens filled */\n  amountFilled: bigint\n  /** Whether the order was partially filled */\n  partialFill: boolean\n}\n```\n\nCallback to invoke when an order is filled.\n\n### maker (optional)\n\n- **Type:** `Address`\n\nAddress of the maker to filter events.\n\n### orderId (optional)\n\n- **Type:** `bigint`\n\nOrder ID to filter events.\n\n### taker (optional)\n\n- **Type:** `Address`\n\nAddress of the taker to filter events.\n\n### fromBlock (optional)\n\n- **Type:** `bigint`\n\nBlock to start listening from.\n\n### onError (optional)\n\n- **Type:** `function`\n\n```ts\ndeclare function onError(error: Error): void\n```\n\nThe callback to call when an error occurred when trying to get for a new block.\n\n### poll (optional)\n\n- **Type:** `true`\n\nWhether to use polling.\n\n### pollingInterval (optional)\n\n- **Type:** `number`\n\nPolling frequency (in ms). Defaults to Client's pollingInterval config.\n\n## Viem\n\n- [`dex.watchOrderFilled`](https://viem.sh/tempo/actions/dex.watchOrderFilled)\n\n"
  },
  {
    "path": "site/tempo/actions/dex.watchOrderPlaced.md",
    "content": "# `dex.watchOrderPlaced`\n\nWatches for order placed events on the Stablecoin DEX.  \n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"2279834665a0cfd3fb844984d371abd87f4fb79413544bf125a15d46b41d1004\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst unwatch = Actions.dex.watchOrderPlaced(config, {\n  onOrderPlaced(args, log) {\n    console.log('args:', args)\n  },\n})\n\n// Later, stop watching\nunwatch()\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n```ts\ntype ReturnType = () => void\n```\n\nReturns a function to unsubscribe from the event.\n\n## Parameters\n\n### onOrderPlaced\n\n- **Type:** `function`\n\n```ts\ndeclare function onOrderPlaced(args: Args, log: Log): void\n\ntype Args = {\n  /** ID of the placed order */\n  orderId: bigint\n  /** Address that placed the order */\n  maker: Address\n  /** Address of the base token */\n  token: Address\n  /** Amount of tokens in the order */\n  amount: bigint\n  /** Whether this is a buy order */\n  isBid: boolean\n  /** Price tick for the order */\n  tick: number\n}\n```\n\nCallback to invoke when an order is placed.\n\n### args (optional)\n\n- **Type:** `object`\n\n```ts\ntype Args = {\n  /** Filter by order ID */\n  orderId?: bigint | bigint[] | null\n  /** Filter by maker address */\n  maker?: Address | Address[] | null\n  /** Filter by token address */\n  token?: Address | Address[] | null\n}\n```\n\nFilter parameters for the watch subscription.\n\n### maker (optional)\n\n- **Type:** `Address`\n\nAddress of the maker to filter events.\n\n### token (optional)\n\n- **Type:** `Address`\n\nAddress of the token to filter events.\n\n### fromBlock (optional)\n\n- **Type:** `bigint`\n\nBlock to start listening from.\n\n### onError (optional)\n\n- **Type:** `(error: Error) => void`\n\nThe callback to call when an error occurred when trying to get for a new block.\n\n### poll (optional)\n\n- **Type:** `true`\n\nEnable polling mode.\n\n### pollingInterval (optional)\n\n- **Type:** `number`\n\nPolling frequency (in ms). Defaults to Client's pollingInterval config.\n\n## Viem\n\n- [`dex.watchOrderPlaced`](https://viem.sh/tempo/actions/dex.watchOrderPlaced)\n"
  },
  {
    "path": "site/tempo/actions/dex.withdraw.md",
    "content": "# `dex.withdraw`\n\nWithdraws tokens from the Stablecoin DEX to your wallet.  \n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"023ba6e6ceee483261ba554408e01773012c9493ad2b5216c866b9cc71fec07f\",\"data\":\"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=\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { config } from './config'\n\nconst { receipt } = await Actions.dex.withdrawSync(config, {\n  amount: parseUnits('100', 6),\n  token: '0x20c0000000000000000000000000000000000001',\n})\n\nconsole.log('Transaction hash:', receipt.transactionHash)\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `dex.withdraw` action and wait for inclusion manually:\n\n```ts\nimport { Actions } from 'wagmi/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\nimport { parseUnits } from 'viem'\n\nconst hash = await Actions.dex.withdraw(config, {\n  amount: parseUnits('100', 6),\n  token: '0x20c0000000000000000000000000000000000001',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n}\n```\n\n## Parameters\n\n### amount\n\n- **Type:** `bigint`\n\nAmount of tokens to withdraw.\n\n### token\n\n- **Type:** `Address`\n\nAddress of the token to withdraw.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`dex.withdraw`](https://viem.sh/tempo/actions/dex.withdraw)\n"
  },
  {
    "path": "site/tempo/actions/faucet.fund.md",
    "content": "# `faucet.fund`\n\nFunds an account with an initial amount of tokens on Tempo's testnet.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"2a334c0a8b0b464e60d225d6b8c383a129c837283be2bd8d4d6de2830fe35d4e\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIBBAYzUYQwCKnDQBDDkgCcVADYwwAczT4kAdioTSSmA0Qg+AoSJBzGYXIgAMVXvknj+ZGQF8K6bFYLEXWuvogABTi5uJwAJScvCZcMWAAZoxKiJwAwkJJSgA6YCxsHNGZyZQgYpL6ACyaZooqaogAbFqSuoHxWaXmlkgAjHYOpE405IjS7p44eIQk5P70ePFinA5w+PCpCQCuYFAAdABKelukYABqoVu4otr66rK1yqpIzdStetPh66bdVgDMA0czlGjQm1C8018c2oASYrHYXCMgmEpXKUjGlXkdWeiBq2jaeCRJi6Fn+gKGwKQACZemDMFMDDM/DCFgZ8gjOAlxFteB8bhU+tYqVing1XviPgYuTy+WZSUgASB7ECRtTxh5wQyfLNSjRWSBtmB+MjOTsoAAeDKJZIAPiCHWSqStWQonCwjmYejIcFSwFynAD0QcFgAklAAPypMBbZgAIzInAAPpwzTAkpYoABuf2BpwxHZoVJ8fNgLjJ7hQKCkeBwbNgVwRVIABVIEGYjDgMHNROEe2lvLQfbNh2OpwuciuNtyYHEnrg7t5pt2pSgEF4CAMADEzXBOOIwHveCWuAB3RiqPcHiznxihPfMCAFzgQBKcTtcNAQADWiiCkVyQicAAKjA8IAOS7jQYiWIOuriEoG7IMgIB0LOWAKKUAAG2FoHAuTsoUwDRNW4g0M6ySuvgaBoFgnCuJyrbMJwYEAAInvB7YAPQxNWYH4fChGcDQ8J0QxbbMWxHGMNx7AwNxwbCHxeQCVwRE9ru9EJIxEnsUoXE8XJwlsEpuRLHExRKJwAC8xEwKRMDkUoQR+geQbiBYPqcMgRkQCB0F6AAuhQOZoEMwgFLhvo5gG3mgWweyMFAAWpFRNFBBEwWue4uQNrkpmxCsXzwNZe7seePDGiYfbcgOQ67PaFmui5AZ5o+papGB1i0LA4hQPGaY9X1MADXZQ0jb1/UJINk1gZluVgNhmEgEFyHukMzClA6lkALTpBZezLRQq0eqUa2zl6pC7rtTYehdcAHStIDVmgJwolQQHrEJYVwMMJqrN8D1BWUtyCg8CiikgmJvDokoGmaJI9IgirKhSqpI6CGr0t4TLQnqgQhGEkRFMI5nWike1k/xEXE50/Lor0vRQ+D9QvC0MPtBZCNkkqgzDC4iCVLSmMQoyUK6rCBhBFgrY4BwGBRK1BapJhXUACTAGIpAWEoriYUmFXHiua4boYR5tR+EBLvsqIg4gvRUq8zM4ni7yBIrpZc5D5J86MVJ0iL2rMnjeAznOC4wMTcAQAouREJIkfRzATomInRvrngH0R5hSyJ3rD5QFsChuq2RCJcV4hvvkRewLGWxKEo2sJ0XqikZwHaV+2cjx5+QnrLkABS4hxwAyrwWtYKTUdF56yp5HATHS8QZdQJwsYYJwJ4wLGq+tienaXXseVgJnnD54XEd0BFkEnpb84wLwjBJLwRTwpYpY+kfABUPCcJhVpTzAPWvAu5wF3GeC8npVDQF3HAHk+A9y7mzinBQew5AQCchETCrokHCETnsMgrZSDpT1vuFeOCAF7HYqcYhvdW68H3KvCOWxOwrx7ieLWNAhKW33OvAActAGAewABWMDQp2WYIfMA39uCcCUGg2Md5yG5zbiTfci4tonBgKwy27DzwRx7sgTCi9eSgL2GIVcWw0CYQCkEVKWAfScU4pAWAIi9jsCUJxVc65OJdygmgbaRAqSVD2LQTi4gsDSWMTWPYVFmByAAMRRNAeYx8aAFa7FyIYpJ91zEEOsbY6i9jECOOcTAVx7jPHGx8fZMQASgkhLCREzi2SYloDiYk1sJjQFoFgKQUgEQ9jAU+nIiACi5C/xzgoIBDD4wphYRvc8hBLFtxUo3VQWdSmIEmYA0+0Bz6SNyAAfU/p/AA6pIPIygTmHNSCfEZYym4R1GUI++aAIKnz0IQKAu5JAR0sIshMSwOw0FLHIDAuQ4AYCNPgVskBmGcHMD+XuEdYy733jwJsIZILrHXtWTscYFCukgKQPc1ZkXryBWIRQaAwW5HCFC+wsLHy7kRRHUI4yIDrJJfw2AwjREkWYPdTgw9hrIq8phSAnDALZM4CGTiAB5fJdiHFOIEeUnQlTvG+PgP4wJwTQnhMiZ06JsSEniG2pKmA20hDbWydtQQUQEjsFyA+MlFgnWkGYKRZEBywAAFFaBoSLswtZwz5GKO2ZhRAR9FoiPyrglBaCnJgXWHINBG92ByCgGBCIdZHGcBbBYSKKwYBpp0ZmqAroe4pMsfGihSaggptLemgApHAWazEb6kCzTmvNnEC1a3filZt5bu2Vq4W+HpqS614IIewIIlgTycD9X0+dYFTmEAgPY10UdIH4EbgoleDgsA4AzDm3NuR82FvfpwOdJK5w/V0JeFe5ReBfi+k4fRt8ekEOjWAfNAYV2ENSBuiAW64A7rbJ8g9vVConsUFoy9/bAx7i4MgGAcc5DJQAKx22w0hlDqHhVj0YBPPYpAdghmPvuuAVo8acAXQIxARBmB2z+FSO2AAOCIBGUOt3lbGF5/ByOUeox2OjAQGObJY0jaw0gkbcd47mLgmyi1kBnHIZpxrQGcToPfSxyJcTqDttIJTLU0MYdCAFba7DwmyyaIgKkVIzNEcs3IUe48uCMdgIgNTpxQhabXDWXTtB9PGDALiRoTRrA8f/ch5TnBVOlnUwFr1FhdOYcOZrbWjm/hIyPmZRL50SrrsYGmzgBxRkeSEGBOs2zKEXKCJhAAIvuXQJL1ahxgK4AAhJwVrygyA9cwheuLA6i2eQG+1zgpyyvjMq7GarYA+tTaG1W79vTSC5EWkfANQamFwFDVnf+yjgHhA/mAbb2E41GgKqkkqbRh5iNnMPKDhATzpTqwVAhD29BPYFa9z073Pt1q4MwDAJ2i42UXY8vYkOYBBFSa6Aho2XUQ+QYIhtTay0ZrHb2gj17i2pvTV2rN63ny1rAOD+HqD0GNuJ5bNtHawKk+zaNq9g6icjtx2Tid06qfo4TYIu9C6YBLqA2u0D4HIN7pg0euzCG2fs/7YTzyyAJekBA5u7db4oOqDl3B09WigoToIQVgqXWSuzfKwtpbtW0c06oWAJrq2OvAC671/rbWhsjb7eNodXvBskut/NqruDluB/az18nZuFrYTgghJASEyjDVKMgKOJxeQ2OVcUziDdVBbFjHsGIzBVUuLgGXuSsZ5GcT1Q08wsYZJC75REZaQM0T6F6Jx7DIoWa4jZgSAw2zPb955iqfm1h/ZahxuLfUQQ93QCiDThtD74IwEjJeDAro9g763eF0IN11qeR4cgAKjZOBEAgIlBjABqXoz5ZhoN6q3qgXiTaq4nZhGtViFkXkXb8QZAAWULgEHQjZR0BjGpV3HoQPFmXdFAS0VdHAXgXWVyCSEui4GYS0QQTFWlhYEkHXlXyfVIT3HK16igBvCEDvCwJXnCDfELzEHPAMyEFjkuGKkO07m7ktiyU5wSCCD+EwWz0KVzy9TAHUDcQ1W6C2FCVENtTXwr1EL+C0yLQSD2D+FaTiViyCHWVJSUEgJvV+VIPGXgPmQMUwgMzkD7HYC9TQGISEJohVVKXVQ8Tf2qT8TqX1UaWkgsI0ISQsI9RsICNIm2laEiAGRjWuzwluxJiKCfBsmwy+2byx2PFSBbWzVdGPGV392LRSM4B7wnW/xnUTTpzAhSI7UyL91V1SFyPyOrSnUpx20uzABFQjkMR8KCNsMEIKQcNzycPugqVcO1VqTrwNSaR8NNXiX8OsNIg6JCJ0CJg9V2TdUSGmPCwOhaETxQGQkOyNGuBACIGsD2F6COOsGsDbzpk72kEVCdgaEVAlECCTRHxqBRh9iQE4yn2xjFnmA5hiP+g2CthHBejHDYJtgFEcypFsEeD73FFdk+DWHgCeO9kpCRmww+LwAkCUFKC6zwEeIuOpCpE417xxEhODgMCAm+l+kAj+LV06loB3z2GZy6npLAgChHweBeORMnyBhiFgDhGpjUkqmEFEi0nEhZykk4h8iUgIlUhpmSGFO0jAj2CbyyBMmiOWGpJKnEDKkREFPun7D0DqigAajJiahzHdkLGYi6mmmGimlGkmmtPGjGltImhtNmhyliyKMxxKPJP3B+kFMKnhJ9A7WpNi1KEgXECQFAACEUEOyEHRIQFcFcCAA=\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst hashes = await Actions.faucet.fund(config, {\n  account: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef',\n})\n\nconsole.log('Transaction hashes:', hashes)\n// @log: Transaction hashes: ['0x...', '0x...']\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Synchronous Usage\n\nUse `fundSync` to wait for the transactions to be included on a block before returning:\n\n```ts twoslash\n// @twoslash-cache: {\"v\":1,\"hash\":\"4cb3e4d43afd1edf434898c4fbf7dd960d22cef1a4ff558f529b06bca056f27f\",\"data\":\"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\"}\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\n\nconst receipts = await Actions.faucet.fundSync(config, {\n  account: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef',\n})\n\nconsole.log('Receipts:', receipts)\n// @log: Receipts: [{ blockNumber: 123n, ... }, { blockNumber: 123n, ... }]\n```\n\n## Return Type\n\n### fund\n\n```ts\ntype ReturnType = readonly Hash[]\n```\n\nReturns an array of transaction hashes for the funding transactions.\n\n### fundSync\n\n```ts\ntype ReturnType = readonly TransactionReceipt[]\n```\n\nReturns an array of transaction receipts after the transactions are confirmed.\n\n## Parameters\n\n### account\n\n- **Type:** `Account | Address`\n\nAccount to fund with testnet tokens.\n\n### timeout (fundSync only)\n\n- **Type:** `number`\n- **Default:** `10000`\n\nTimeout in milliseconds to wait for transaction confirmation.\n\n## Viem\n\n- [`faucet.fund`](https://viem.sh/tempo/actions/faucet.fund)\n"
  },
  {
    "path": "site/tempo/actions/fee.getUserToken.md",
    "content": "# `fee.getUserToken`\n\nGets the user's default fee token preference. [Learn more about fees](https://docs.tempo.xyz/protocol/fees)\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"5479b50dafab06e9b134224ed428649f20a0a0eb27d506ae6e901fff4d3d8fab\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIBBAYzUYQwCKnDQBDDkgCcVADYwwAczT4kAdioTSSmA0Qg+AoSJBzGYXIgAMVXvknj+ZGQF8K6bFYLEXWuvogABTi5uJwAJScvCZcMWAAZoxKiJwAwkJJSgA6YCxsHNGZyZQgYpL6ACyaZooqaogAbFqSuoHxWaXmlkgAjHYOpE405IjS7p44eIQk5P70ePFinKTwAK5yaKltAKpwZAAqEADWigB0AEp6a6RgAGqha7ii2vrqsrXKqkjN1K16eFWcA2DHkFisAGYBo5nKNGhNqF5pr45tQAkxWOwuEZBMJSuUpGNKvI6t9EDVtG08DiTF1wUgoSB7DCRkgAEy9BGYKYGGZ+NELAz5LGcBIwZ5lV59axsklfBqMykAgxiiXdSHQoaw9njDyInk+WalGiCkAJNZgfi4zi7fakI6nMAAHgyiWSAD4gh1kqlXVkKJwsI5mHoyHBUjThGdVWdbYcTucAArB0OkOAu4pKd0RVKJ0gQZiMfZOuP2hNgS7XW4PORPd25MDiENwIO8GA2vR7eOO0pQCC8BAGADiejgnFU7bWdoA5GPYAlxCDReLx+WzsbxEpB8hkCA6E2sApSgADU9oOC5YWFYDRVbiGh+5IB/BoNBYTiuUX55icacAAQAd03QsAHoYlWadL0xa9xxgTEPy/Atf0A4DGDA9gYDAhwLDgSC8mgrgb0jMdPwSb9kKApRQPAzCaExPDciWOJM04ABeW8YHvGBHyUIJgFyThomw4RUmQOi2AOeA0EsNAAF0KAE8chmEApz1SfiwEEwSxLgtgzkYKBZNSF83yCCIFM0j8LNcCJckY2JOAcOB8DYzhxCAxhsStExo3FWNOztB1FC9TMAw0wSnBiC0tl/axaDZaxeDOZLrGsABWNLp2s2ywFPY8QHk3cgyGZhSm9JROAAWnSTN10KkBiqbUpGpDEYx2q5MStTOA6ooXdVjQG48SoA5lLgYZrSc/A6vkyUKmlX4FHlPpZT+HRlRAUsgrAOkekQRlmS1Vl9ohLkkV5FFjXRAwQjCSIimEZi3RSGrnqg1SHs6F55sQXpeg+Jb6h+Fp1vaTNdo1JlBmGFxEEqeE9W5bw+VRE1AiCLB8xwDgMCiSKIGi1JjzigASYAxFICwlFcY9OAAH04cKtN4cxFBitJWbANAnVG8QVKxAM0mE+nOAtedwSgMLFK0rTxCgKAgXDHh5cVgBuaWZc4SBLRgABZPnNzIAB+VIADkhDbfXG10UgRbFmAkksKB1cszXODgZIwBNzgggxlM2vUjW3cEqbUgACXCfAXeDj8olY91ODzAsixgJ0w7obM7bAcWnaznOYGdoOtI9pQwG4NZVHYRgAC971xb3fZa7qIwrwhKdr4wwCuABHJ4xDjhOk8LYsAGVPfLyv27roQrkG24Di8TOGftx2C7zh2Jej4OS7AXX4HG3RUj4zhmwP9tXED12Y5P/fDdSMfS/EAAjBQ97gM+t7dmy2MH78U7TjOn9NbJTOJwSoJ8MKcBAUAmWSNUjZDMP2UICCgGfgZgAKTgDPLAvA+BRS5uvVeUB3RAJAZwNkbIIGrCgclIBWCbhtm9ivTeuQ0E0NAb0awVD2xkIZnxDW0DWGcAAGScGJrQMmFMqY0wiL2fsg5DC8HwVwe8Eh7BrzQBAcc+B2y8FCHIH2zA4BKDOPsbOZAIjrm+oSXoEJ+ifCBuSEGVIDD42ihDJAxIoYslhmyM6BoUZXVNI2ZsrZdEmAgAoXIRBJAPSwQoX0ESjxUD7AOPABwdFiKWJEmAtNmDQA2O2TGxADLwDcu7fIChOCwCfmsJQSgqZxJydo+8nAiwVMLHIWJmjtEwFyOg8QMSR68EplgJ68T2whmZHkOAP5ilEFKVATgT8MCcAAjAJ+yz8wATtD1OyYAMmTIKVUugqkxxoAAlolsMBeCMCSLwIomJLBc3DPsgAVDwMRroJm0xZuEMcAFPIuVaoQKAY5gT2DcmOY82SFBnDkBAXiERjwBhhUkmAZwyD5lIGZWmfMllouEDks4QFbi4paXEPmyzJz7CWT0gClMaCrjcmAVZ5tYBnAAFbgrQHeZgZxcgfO4DaBFT9QhZPRbTHCEgdafWSDcDRWiGWeXbD05Ax5iltnfqYtAfYK7HlkkEEyWBwwgRApAWA3KzjsCUCBVJcAQJdJoGISqRA2SVDOLQEC4gsBoU1fvM4L5mByAAMT+vfmIPVaA8bZ1yOq8NPVI1YoNUa18JrEBmotTAK1Nq7XyMdVxF1bqPVep9X6/MWqepBtDQmpNpBSCWM4IckVEAxUGMJT86IVKn40rXoCyuFc2kEUaROMRWbECwtyRAqAhSBVgFyAAfTeW8gA6pIPIyhl0LtSM2pQorxWTs4K2zlNy0CzhvpXMFblqGWCBWQOJRYaBczkBgXIcAMCWnwPmSAU5ODmFOL0rZEAdn3u4ImAAkucnRqygRwRfjAAMkBbaSFVdBh9Yg2YvtyOED99hv0EzHP+9s+ij0TltuyjF3L3a8s4kY0BI8VyjvVZAJlQhAwVv3pwcDIEADyKbjWmvNdAbNPVc32oLc6tArr3Weu9b6kCCbA1oGDSG8QlUWMwEqkISqCbKqCCiAkdguR8nUIsIZ0gzBp4Vn2QAUVoAeKpU4R2ZL3a28VHacnHkQPsvK3L7JErhQi3i04dFyARWs9gcgoDTgiC7M1idKYvOMjAMLSrIuS2ZZGgmaB/MTPhYioIIWUvhYAKS4QDNOS5pAosxbiyBBLFg1KOWK2l6rGWelZYrrl4lWL2BBEsABTgNn619enCuwgEATUBiwSCxpYqlkOCwDgJ2MXYu5Hi3mRrY5eu21PobFlSzyi8GOEpJwqqrm6qxd5sA8XBLDexakcbEBJtwGmwWPQ+A5ty0cj65bBd1v1Zlq05AMAYlyCMmlX6aUAea1acM0ZaAzikAtOBg5n24CujRj7cdRBmC/QhGyX6AAOHKt3ZZcB40/E9/Akco7R0WTHARsfCcQLj/a1hpD7RJzDoHXBx2NbII2OQCmOPvxAnQG5FdcTknUL9aQPPyecBB2D2SlUGW/bIE0RAFCFcRS4KD0I8PGBjOZ7ARAAvbihBF/2fe4vaCS87uSRoTRrCk8B4r/nXNBdW8sxYcXYOF1SOUNriE+19lMS1k2ds7ExuMDC5wC4racJCGnC7SdJL11BGPAAET5jbTgZMQkwFcAAQk4Ln5QZAS/HjWzd+rm2kvl7z/eldceDGJ6fsnsAZeK82xLwGDrl3625DyrZ+zrBHMe2UIB483zPPRC6e/a7I/Tx+ctA5bLrk2gjxo02Ee73CAATMmnhyWKt96B33y/fIZD/H9y1wZgGA59VPYgNppcLn8wCCNlgMWLa/Gaf3RXy2C1C3Cyqxq1rw20Sya1ANayiwHy0WywAM/2AMK1gM4DKyyl/HAOi0gPr2gKVnQJwIQKPS6zAEfxQJ236xgEG3u1Gyexeze1m2n3mx+yW0UALlWzqwa0b2QDoNIEewmym3dne1UC+wWw1ydnkmZSxXDwciL1clj3jw7y71T2QKANJTACz173vULyj1Lyb0r1IGrzwJ4Kax0Ntlb2UKTyJW70ML7xINkNylPA3C3CQB3DKHFFKGQHoVIDbENQEwzRAgaVUDWCfjOBiGYCE0tQdSzRAhflbRAmLVk3MCfnQgC0o0iAKlmgJH0H+lsAcTJApH+DBgyI8ScW8SOlhmsH8WRkunmHRhBWgCiBQKCyCD210G9j5gwADBAUm07lCE6ibCVm6OQFkhzE4CIAgAMh9gAGpegj1ZgEU5ZZEUl5E8AG9zxmVjxOs0BaZ+0XIBt1RQFdYQRjcqlWg1gQwXku1NIe1Ax/kC4AwDjelcgkg0wuApw15whANMYWBJBVkOjiNs43J485YoBPJcRxUvilkfjgQn4xBPIpchBolHgykPZOluktF41oCEgggIRkUAi00gjLMwB1BrUdBHULA1gvVSSdNDYHVSSIQRdGsEgzgIQlNg0coghR1LjritiUNQSDEgx35FUldjwpc5Box2BLM0BcUiS3xBMs0c1KTxMnUpJpMS05M0JJTOTQ1JTzNZTDT7xKpWhIhLEfNV8Lx19HoihopXI0oT8MjUDpxlFUgStosAxlFTDNilY3TOA0oSDdjutAsCtXSCYuZEAsDvTuDfTUh/TAzMtdUkDnDjx9kGN2x1VdTjS5TCTU1FSgjlTRNVT811Si0ZNS15NdTq0Q0DSZT7wczTSdB7pzNuE2lEh6zO4rE/g3CUBdwp82xSgiBrAzhehRzUpsjrE8jpAic5RHFFQSi8AgtyiahDoYZRgidajkQjQGjFgHIgQQRtgApuxzhZ4hoawnh8QpRtdehFpSQGhfglRAgDzNgVzNR1z2QEZJhvAJAlBSgi8lzEUryfoKEvFAYyQCi0Y8AAAxRjcsdSNyFWfeVIacOKBKXgVKTCrC7CnC3CvC1KLAgyVIawTSVwcoj4Nc7UGwVwWaGIWADED6IibyYQBCMiJCSrVCECcSCAPCK8QiOVCqUiciacM4dIrIBiG05YF8rgdidycQTyHgZinqGMLacsEKZ6KWSyNxSM2KWgdQSoNkKACENKNIXgRoRoCESoNIdKAnaQNkNKcQCEJ+InSoSoAAIV4GkBgHUDSmkDSgSGsCfhsyfifiylYRyhDIxTaOnFgvO0dCjIDGkpylKFanECQFAACEUA9iEDwHPBAFcFcCAA==\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst result = await Actions.fee.getUserToken(config, {\n  account: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n})\n\nconsole.log('Fee token:', result)\n// @log: Fee token: { address: '0x20c0000000000000000000000000000000000000', id: 0n }\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Address of the fee token */\n  address: Address\n  /** ID of the fee token */\n  id: bigint\n} | null\n```\n\nReturns `null` if the user has not set a default fee token.\n\n## Parameters\n\n### account\n\n- **Type:** `Address`\n\nAccount address.\n\n## Viem\n\n- [`fee.getUserToken`](https://viem.sh/tempo/actions/fee.getUserToken)\n"
  },
  {
    "path": "site/tempo/actions/fee.setUserToken.md",
    "content": "# `fee.setUserToken`\n\nSets the user's default fee token preference. [Learn more about fees](https://docs.tempo.xyz/protocol/fees)\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"f0b0a406d4ab0b85a6a931aef7b66a18557d4e63a6f5cf4303ff3b1ade02ff54\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst { receipt } = await Actions.fee.setUserTokenSync(config, {\n  token: '0x20c0000000000000000000000000000000000001',\n})\n\nconsole.log('Transaction hash:', receipt.transactionHash)\n// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `fee.setUserToken` action and wait for inclusion manually:\n\n```ts\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { Actions } from 'wagmi/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\n\nconst hash = await Actions.fee.setUserToken(config, {\n  token: '0x20c0000000000000000000000000000000000001',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args } \n  = viem_Actions.fee.setUserToken.extractEvent(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Address of the user */\n  user: Address\n  /** Address of the token set */\n  token: Address\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n}\n```\n\n## Parameters\n\n### token\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the TIP-20 token to use for fees.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`fee.setUserToken`](https://viem.sh/tempo/actions/fee.setUserToken)\n"
  },
  {
    "path": "site/tempo/actions/fee.watchSetUserToken.md",
    "content": "# `fee.watchSetUserToken`\n\nWatches for user token set events on the Fee Manager.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"466d1d7e9b6e662521a4dfa3841e61d192d4a41ddd5d17120f2190e4200b7515\",\"data\":\"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=\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst unwatch = Actions.fee.watchSetUserToken(config, {\n  onUserTokenSet(args, log) {\n    console.log('args:', args)\n  },\n})\n\n// Later, stop watching\nunwatch()\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n`() => void`\n\nReturns a function to unsubscribe from the event.\n\n## Parameters\n\n### onUserTokenSet\n\n- **Type:** `function`\n\n```ts\ndeclare function onUserTokenSet(args: Args, log: Log): void\n\ntype Args = {\n  /** Address of the user */\n  user: Address\n  /** Address of the new fee token */\n  token: Address\n}\n```\n\nCallback to invoke when a user token is set.\n\n### args (optional)\n\n- **Type:** `object`\n\n```ts\ntype Args = {\n  /** Address of the user to filter by */\n  user?: Address | Address[] | null\n  /** Address of the token to filter by */\n  token?: Address | Address[] | null\n}\n```\n\nOptional filters for the event.\n\n### fromBlock (optional)\n\n- **Type:** `bigint`\n\nBlock to start listening from.\n\n### onError (optional)\n\n- **Type:** `function`\n\n```ts\ndeclare function onError(error: Error): void\n```\n\nThe callback to call when an error occurred when trying to get for a new block.\n\n### poll (optional)\n\n- **Type:** `true`\n\nEnable polling mode.\n\n### pollingInterval (optional)\n\n- **Type:** `number`\n\nPolling frequency (in ms). Defaults to Client's pollingInterval config.\n\n## Viem\n\n- [`fee.watchSetUserToken`](https://viem.sh/tempo/actions/fee.watchSetUserToken)\n"
  },
  {
    "path": "site/tempo/actions/index.md",
    "content": "# Overview\n\n| Action | Description |\n|--------|-------------|\n| **AMM Actions** | |\n| [`amm.burn`](/tempo/actions/amm.burn) | Burns liquidity tokens and receives the underlying token pair |\n| [`amm.getLiquidityBalance`](/tempo/actions/amm.getLiquidityBalance) | Gets the liquidity balance for an address in a specific pool |\n| [`amm.getPool`](/tempo/actions/amm.getPool) | Gets the reserves for a liquidity pool |\n| [`amm.mint`](/tempo/actions/amm.mint) | Mints liquidity tokens by providing a token pair |\n| [`amm.rebalanceSwap`](/tempo/actions/amm.rebalanceSwap) | Performs a rebalance swap between user and validator tokens |\n| [`amm.watchBurn`](/tempo/actions/amm.watchBurn) | Watches for liquidity burn events |\n| [`amm.watchMint`](/tempo/actions/amm.watchMint) | Watches for liquidity mint events |\n| [`amm.watchRebalanceSwap`](/tempo/actions/amm.watchRebalanceSwap) | Watches for rebalance swap events |\n| **Faucet Actions** | |\n| [`faucet.fund`](/tempo/actions/faucet.fund) | Funds an account with testnet tokens |\n| **Fee Actions** | |\n| [`fee.getUserToken`](/tempo/actions/fee.getUserToken) | Gets the user's default fee token preference |\n| [`fee.setUserToken`](/tempo/actions/fee.setUserToken) | Sets the user's default fee token preference |\n| [`fee.watchSetUserToken`](/tempo/actions/fee.watchSetUserToken) | Watches for user token set events |\n| **Nonce Actions** | |\n| [`nonce.getNonce`](/tempo/actions/nonce.getNonce) | Gets the nonce for an account and nonce key |\n| [`nonce.watchNonceIncremented`](/tempo/actions/nonce.watchNonceIncremented) | Watches for nonce incremented events |\n| **Policy Actions** | |\n| [`policy.create`](#TODO) | Creates a new transfer policy for token access control |\n| [`policy.getData`](#TODO) | Gets the data for a transfer policy, including its type and admin address |\n| [`policy.isAuthorized`](#TODO) | Checks if an address is authorized by a transfer policy |\n| [`policy.modifyBlacklist`](#TODO) | Modifies the blacklist for a blacklist-type transfer policy |\n| [`policy.modifyWhitelist`](#TODO) | Modifies the whitelist for a whitelist-type transfer policy |\n| [`policy.setAdmin`](#TODO) | Sets the admin for a transfer policy |\n| [`policy.watchAdminUpdated`](#TODO) | Watches for policy admin update events |\n| [`policy.watchBlacklistUpdated`](#TODO) | Watches for blacklist update events |\n| [`policy.watchCreate`](#TODO) | Watches for policy creation events |\n| [`policy.watchWhitelistUpdated`](#TODO) | Watches for whitelist update events |\n| **Reward Actions** | |\n| [`reward.claim`](/tempo/actions/reward.claim) | Claims accumulated rewards for the caller |\n| [`reward.getUserRewardInfo`](/tempo/actions/reward.getUserRewardInfo) | Gets reward information for a specific account |\n| [`reward.setRecipient`](/tempo/actions/reward.setRecipient) | Sets or changes the reward recipient for a token holder |\n| [`reward.distribute`](/tempo/actions/reward.distribute) | Distributes tokens to opted-in holders |\n| [`reward.watchRewardRecipientSet`](/tempo/actions/reward.watchRewardRecipientSet) | Watches for reward recipient set events |\n| [`reward.watchRewardDistributed`](/tempo/actions/reward.watchRewardDistributed) | Watches for reward distributed events |\n| **Stablecoin DEX Actions** | |\n| [`dex.buy`](/tempo/actions/dex.buy) | Buys a specific amount of tokens from the Stablecoin DEX orderbook |\n| [`dex.cancel`](/tempo/actions/dex.cancel) | Cancels an order from the orderbook |\n| [`dex.createPair`](/tempo/actions/dex.createPair) | Creates a new trading pair on the DEX |\n| [`dex.getBalance`](/tempo/actions/dex.getBalance) | Gets a user's token balance on the Stablecoin DEX |\n| [`dex.getBuyQuote`](/tempo/actions/dex.getBuyQuote) | Gets the quote for buying a specific amount of tokens |\n| [`dex.getOrder`](/tempo/actions/dex.getOrder) | Gets an order's details from the orderbook |\n| [`dex.getTickLevel`](/tempo/actions/dex.getTickLevel) | Gets the price level information at a specific tick |\n| [`dex.getSellQuote`](/tempo/actions/dex.getSellQuote) | Gets the quote for selling a specific amount of tokens |\n| [`dex.place`](/tempo/actions/dex.place) | Places a limit order on the orderbook |\n| [`dex.placeFlip`](/tempo/actions/dex.placeFlip) | Places a flip order that automatically flips when filled |\n| [`dex.sell`](/tempo/actions/dex.sell) | Sells a specific amount of tokens from the Stablecoin DEX orderbook |\n| [`dex.watchFlipOrderPlaced`](/tempo/actions/dex.watchFlipOrderPlaced) | Watches for flip order placed events |\n| [`dex.watchOrderCancelled`](/tempo/actions/dex.watchOrderCancelled) | Watches for order cancelled events |\n| [`dex.watchOrderFilled`](/tempo/actions/dex.watchOrderFilled) | Watches for order filled events |\n| [`dex.watchOrderPlaced`](/tempo/actions/dex.watchOrderPlaced) | Watches for order placed events |\n| [`dex.withdraw`](/tempo/actions/dex.withdraw) | Withdraws tokens from the DEX to the caller's wallet |\n| **Token Actions** | |\n| [`token.approve`](/tempo/actions/token.approve) | Approves a spender to transfer TIP-20 tokens on behalf of the caller |\n| [`token.burn`](/tempo/actions/token.burn) | Burns TIP-20 tokens from the caller's balance |\n| [`token.burnBlocked`](/tempo/actions/token.burnBlocked) | Burns TIP-20 tokens from a blocked address |\n| [`token.changeTransferPolicy`](/tempo/actions/token.changeTransferPolicy) | Changes the transfer policy for a TIP-20 token |\n| [`token.create`](/tempo/actions/token.create) | Creates a new TIP-20 token and assigns the admin role to the calling account |\n| [`token.getAllowance`](/tempo/actions/token.getAllowance) | Gets the amount of tokens that a spender is approved to transfer on behalf of an owner |\n| [`token.getBalance`](/tempo/actions/token.getBalance) | Gets the token balance of an address |\n| [`token.getMetadata`](/tempo/actions/token.getMetadata) | Gets the metadata for a TIP-20 token, including name, symbol, decimals, currency, and total supply |\n| [`token.grantRoles`](/tempo/actions/token.grantRoles) | Grants one or more roles to an address |\n| [`token.mint`](/tempo/actions/token.mint) | Mints new TIP-20 tokens to a recipient |\n| [`token.pause`](/tempo/actions/token.pause) | Pauses a TIP-20 token, preventing all transfers |\n| [`token.renounceRoles`](/tempo/actions/token.renounceRoles) | Renounces one or more roles from the caller's address |\n| [`token.revokeRoles`](/tempo/actions/token.revokeRoles) | Revokes one or more roles from an address |\n| [`token.setRoleAdmin`](/tempo/actions/token.setRoleAdmin) | Sets the admin role for another role |\n| [`token.setSupplyCap`](/tempo/actions/token.setSupplyCap) | Sets the supply cap for a TIP-20 token |\n| [`token.transfer`](/tempo/actions/token.transfer) | Transfers TIP-20 tokens from the caller to a recipient |\n| [`token.unpause`](/tempo/actions/token.unpause) | Unpauses a TIP-20 token, allowing transfers to resume |\n| [`token.watchAdminRole`](/tempo/actions/token.watchAdminRole) | Watches for role admin update events |\n| [`token.watchApprove`](/tempo/actions/token.watchApprove) | Watches for token approval events |\n| [`token.watchBurn`](/tempo/actions/token.watchBurn) | Watches for token burn events |\n| [`token.watchCreate`](/tempo/actions/token.watchCreate) | Watches for new token creation events |\n| [`token.watchMint`](/tempo/actions/token.watchMint) | Watches for token mint events |\n| [`token.watchRole`](/tempo/actions/token.watchRole) | Watches for role membership update events |\n| [`token.watchTransfer`](/tempo/actions/token.watchTransfer) | Watches for token transfer events |\n"
  },
  {
    "path": "site/tempo/actions/nonce.getNonce.md",
    "content": "# `nonce.getNonce`\n\nGets the nonce for an account and nonce key. This is useful for managing multiple nonce lanes for parallel transaction submission.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"95821029487d78766a2dcd7ccfe1331d8bf3d401ae5c2d46c01fcfe2b5f0f262\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst nonce = await Actions.nonce.getNonce(config, {\n  account: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  nonceKey: 1n,\n})\n\nconsole.log('Nonce:', nonce)\n// @log: Nonce: 42n\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n```ts\ntype ReturnType = bigint\n```\n\nThe current nonce value for the given account and nonce key.\n\n## Parameters\n\n### account\n\n- **Type:** `Address`\n\nAccount address to get the nonce for.\n\n### nonceKey\n\n- **Type:** `bigint`\n\nNonce key (must be > 0, key 0 is reserved for protocol nonces).\n\n## Viem\n\n- [`nonce.getNonce`](https://viem.sh/tempo/actions/nonce.getNonce)\n"
  },
  {
    "path": "site/tempo/actions/nonce.watchNonceIncremented.md",
    "content": "# `nonce.watchNonceIncremented`\n\nWatches for nonce incremented events. This event is emitted whenever a transaction is executed using a specific nonce key.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"d6c088363c7a29ffdad7dc923554c75831017d0aa12ea1177d8bb4c8f55ce3f0\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst unwatch = Actions.nonce.watchNonceIncremented(config, {\n  onNonceIncremented(args, log) {\n    console.log('args:', args)\n  },\n})\n\n// Later, stop watching\nunwatch()\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n`() => void`\n\nReturns a function to unsubscribe from the event.\n\n## Parameters\n\n### onNonceIncremented\n\n- **Type:** `function`\n\n```ts\ndeclare function onNonceIncremented(args: Args, log: Log): void\n\ntype Args = {\n  /** Address of the account */\n  account: Address\n  /** Nonce key that was incremented */\n  nonceKey: bigint\n  /** New nonce value after increment */\n  newNonce: bigint\n}\n```\n\nCallback to invoke when a nonce is incremented.\n\n### args (optional)\n\n- **Type:** `object`\n\n```ts\ntype Args = {\n  /** Address of the account to filter by */\n  account?: Address | Address[] | null\n  /** Nonce key to filter by */\n  nonceKey?: bigint | bigint[] | null\n}\n```\n\nOptional filters for the event.\n\n### fromBlock (optional)\n\n- **Type:** `bigint`\n\nBlock to start listening from.\n\n### onError (optional)\n\n- **Type:** `function`\n\n```ts\ndeclare function onError(error: Error): void\n```\n\nThe callback to call when an error occurred when trying to get for a new block.\n\n### poll (optional)\n\n- **Type:** `true`\n\nEnable polling mode.\n\n### pollingInterval (optional)\n\n- **Type:** `number`\n\nPolling frequency (in ms). Defaults to Client's pollingInterval config.\n\n## Viem\n\n- [`nonce.watchNonceIncremented`](https://viem.sh/tempo/actions/nonce.watchNonceIncremented)\n"
  },
  {
    "path": "site/tempo/actions/policy.create.md",
    "content": "# `policy.create`\n\nCreates a new transfer policy for token access control. [Learn more about transfer policies](https://docs.tempo.xyz/protocol/tip403/overview)\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"e0c93d427169d0944a1d8b51a79fe35242cf5f9a3229dd7529118fcdd9ec4d11\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst { policyId, policyType, receipt } = await Actions.policy.createSync(config, {\n  addresses: [\n    '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n    '0x70997970C51812dc3A010C7d01b50e0d17dc79C8',\n  ],\n  type: 'whitelist',\n})\n\nconsole.log('Policy ID:', policyId)\n// @log: Policy ID: 1n\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `policy.create` action and wait for inclusion manually:\n\n```ts\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { Actions } from 'wagmi/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\n\nconst hash = await Actions.policy.create(config, {\n  addresses: [\n    '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n    '0x70997970C51812dc3A010C7d01b50e0d17dc79C8',\n  ],\n  type: 'whitelist',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args: { policyId } } \n  = viem_Actions.policy.create.extractEvent(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** ID of the created policy */\n  policyId: bigint\n  /** Type of the policy (0 = whitelist, 1 = blacklist) */\n  policyType: number\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n  /** Address that created the policy */\n  updater: Address\n}\n```\n\n## Parameters\n\n### type\n\n- **Type:** `'whitelist' | 'blacklist'`\n\nType of policy to create. A `whitelist` policy only allows listed addresses, while a `blacklist` policy allows all except listed addresses.\n\n### addresses (optional)\n\n- **Type:** `Address[]`\n\nOptional array of addresses to initialize the policy with.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`policy.create`](https://viem.sh/tempo/actions/policy.create)\n"
  },
  {
    "path": "site/tempo/actions/policy.getData.md",
    "content": "# `policy.getData`\n\nGets the data for a transfer policy, including its type and admin address.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"7be8148a546f6e73e327ea871b234bea4c43f38a349d04fbe07fd29b5c985e9a\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst { admin, type } = await Actions.policy.getData(config, {\n  policyId: 1n,\n})\n\nconsole.log('Policy admin:', admin)\n// @log: Policy admin: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb\nconsole.log('Policy type:', type)\n// @log: Policy type: whitelist\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Address of the policy admin */\n  admin: Address\n  /** Type of policy */\n  type: PolicyType\n}\n```\n\n## Parameters\n\n### policyId\n\n- **Type:** `bigint`\n\nID of the policy to query.\n\n## Viem\n\n- [`policy.getData`](https://viem.sh/tempo/actions/policy.getData)\n"
  },
  {
    "path": "site/tempo/actions/policy.isAuthorized.md",
    "content": "# `policy.isAuthorized`\n\nChecks if an address is authorized by a transfer policy.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"d89a8bdb355ed397122134203ceb623b3e34be73a444f2615bf50197c0945485\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst isAuthorized = await Actions.policy.isAuthorized(config, {\n  user: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  policyId: 1n,\n})\n\nconsole.log('Is authorized:', isAuthorized)\n// @log: Is authorized: true\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n```ts\ntype ReturnType = boolean\n```\n\n## Parameters\n\n### policyId\n\n- **Type:** `bigint`\n\nPolicy ID.\n\n### user\n\n- **Type:** `Address`\n\nUser address to check.\n\n## Viem\n\n- [`policy.isAuthorized`](https://viem.sh/tempo/actions/policy.isAuthorized)\n"
  },
  {
    "path": "site/tempo/actions/policy.modifyBlacklist.md",
    "content": "# `policy.modifyBlacklist`\n\nModifies the blacklist for a blacklist-type transfer policy. Requires policy admin role.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"6c776f607178f89d5334ea2398757c8b3ee4db029caff53ec164954928f7b409\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst { receipt } = await Actions.policy.modifyBlacklistSync(config, {\n  address: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  policyId: 1n,\n  restricted: true,\n})\n\nconsole.log('Transaction hash:', receipt.transactionHash)\n// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `policy.modifyBlacklist` action and wait for inclusion manually:\n\n```ts\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { Actions } from 'wagmi/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\n\nconst hash = await Actions.policy.modifyBlacklist(config, {\n  address: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  policyId: 1n,\n  restricted: true,\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args } \n  = viem_Actions.policy.modifyBlacklist.extractEvent(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Address that was added/removed from blacklist */\n  account: Address\n  /** ID of the policy */\n  policyId: bigint\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n  /** Whether the address is restricted */\n  restricted: boolean\n  /** Address that modified the blacklist */\n  updater: Address\n}\n```\n\n## Parameters\n\n### address\n\n- **Type:** `Address`\n\nTarget account address to add or remove from the blacklist.\n\n### policyId\n\n- **Type:** `bigint`\n\nID of the blacklist policy to modify.\n\n### restricted\n\n- **Type:** `boolean`\n\nWhether the address should be restricted (`true`) or unrestricted (`false`).\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`policy.modifyBlacklist`](https://viem.sh/tempo/actions/policy.modifyBlacklist)\n"
  },
  {
    "path": "site/tempo/actions/policy.modifyWhitelist.md",
    "content": "# `policy.modifyWhitelist`\n\nModifies the whitelist for a whitelist-type transfer policy. Requires policy admin role.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"952192056f8028f108ce757f5c41d5167a39f17553d4a449338c09baaef8c103\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst { receipt } = await Actions.policy.modifyWhitelistSync(config, {\n  address: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  allowed: true,\n  policyId: 1n,\n})\n\nconsole.log('Transaction hash:', receipt.transactionHash)\n// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `policy.modifyWhitelist` action and wait for inclusion manually:\n\n```ts\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { Actions } from 'wagmi/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\n\nconst hash = await Actions.policy.modifyWhitelist(config, {\n  address: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  allowed: true,\n  policyId: 1n,\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args } \n  = viem_Actions.policy.modifyWhitelist.extractEvent(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Address that was added/removed from whitelist */\n  account: Address\n  /** Whether the address is allowed */\n  allowed: boolean\n  /** ID of the policy */\n  policyId: bigint\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n  /** Address that modified the whitelist */\n  updater: Address\n}\n```\n\n## Parameters\n\n### address\n\n- **Type:** `Address`\n\nTarget account address to add or remove from the whitelist.\n\n### allowed\n\n- **Type:** `boolean`\n\nWhether the address should be allowed (`true`) or disallowed (`false`).\n\n### policyId\n\n- **Type:** `bigint`\n\nID of the whitelist policy to modify.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`policy.modifyWhitelist`](https://viem.sh/tempo/actions/policy.modifyWhitelist)\n"
  },
  {
    "path": "site/tempo/actions/policy.setAdmin.md",
    "content": "# `policy.setAdmin`\n\nSets the admin for a transfer policy. Requires current policy admin role.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"983f569302010026098cc5bbf73d68463318d1076985854dbfdfd589c471fed0\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIBBAYzUYQwCKnDQBDDkgCcVADYwwAczT4kAdioTSSmA0Qg+AoSJBzGYXIgAMVXvknj+ZGQF8K6bFYLEXWuvogABTi5uJwAJScvCZcMWAAZoxKiJwAwkJJSgA6YCxsHNGZyZQgYpL6ACyaZooqaogAbFqSuoHxWaXmlkgAjHYOpE405IjS7p44eIQk5P70ePFinKQwvDCMWGipACpDwsOCYABKaxtbpeVSiAAc/bXKqhotOnp4q+ubDPIWVgDMA0czlGNwm1C8018c2oASYrHYXCMR1MV300lkD3qz2orTeBiRJi6vyQAJA9iBIyQACZGmDMFMDDM/DCFgZ8gjOGxzLwMJdtPpetYagpHg1mjjXoEuYweUSeohSeShsCSZU6RDGVDSjRWSAEgBXMD8I6cOB6bhQZgWADKGCNAB4MolkgA+IIdZKpJ1ZCicxzMPRkOCpAnCAB00p5YbNaAtVrAtqNYYACv7A6Q4I7ikoXRFUsnSBArWb7cBcpwK5yINyMABJKCpABGyQsaAA3OXK/qsFBxCNUgADay0AAkwDEpAsSlcA47YErnHElosg+HY4nU5nc4XH3O204e3EB2NQlOny2c9cLtyYHEAbgWCcMFN5uXCbtvFKUAgvAQBmtehwJwqjPku8acAk7CLlWNZhrkuQAHIQDQuz4IwQHodBcAfvghaQPqQGHEIwEOFwADu4iMGgQGQaQJHPmg+xwER85oBAuSNs+Fi8HI+qwFAnDEeInCNnIP4ANYiTAtHPqsaD6qQeTKNBqwPiYMBhtq4hKH+yDICAdB3lgCilAOZnUbk7KFMA0SrH2MDeskvr4GgaBYJwrgQYWzCcAA5AAAhRShWgA9DEqy+ZZ8LWcBMDwh5XlFn5gXaaF4UwGFDgWHAkV5NFXA2aGQGeQk3nJUFaXsBlNDwrluRLHE2acAAvLZMD2Y5ShBGW87RFlwipMgNVsDs8BoJYaAALoUJ2jFHmpHDBpwPULkNcVsGGjBQJNqQuW5QQRDNvXuLkrgRPBRqxCs8D6nIXCteIFFUTwJ7hpGGDRq+8aJrw7rZr6K0wTKdYNpwVJgEdFZgSufnDmG8O+UdZ25GZA4gNN+mPkMzClB6SicAAtOk2aaRjIBY3epQUwGIxAUTqbY+mcCkxQ+lyQpwilDs+AMUxLHXeeXBHgJMAkGAXC9hIpPTWU/J9L0lTyHUTyIL0VIvG0eAxnGNofnK/yAsqlKIJUvTqgyPizNqsIGCEYSREUwiNc6KTEy7UUFM7nSiHLqtUsKytihreJktm+skobwwuIgACsaoeOCFtMtCOqBEEWCFjgHAYFE0NgKk2QgMO6iVFSUB/DHaS8I0jR/JUaTWDHfxUtIVIx+IfyNjclSVAAQrw0gwOoMfSDHCTWI2ACijaNoXfIVH0fwYiKWKx8HgR5+HJuRyqiBUub3jJ9burp5nZCYFE731k2Lbi/P1y9NIiuYirNzr3gV9QFvMc78b+8J/SQ+Wp5iBFvPeR86xHZwGrDAXIRBJBQJgV6EwMCvw/j/CAbmz4BxLBgQOTgzBoC3WfBnYgW14BYXyAoTgsBGz6iUEoKciDqGqD7JwTCcAWCMDkAgti9FcgAClxDwOtLwScWxmHPgDOSPIcAfKkKIOQgSjYMCcDIjARsIlCxkTNBmOCYBchYIIUQ6hdBPZATQGRCApocC8EYEkXgRR4SWHFsGC6AAqHgnABxOmgQofBPFwhATIlRfABC9CECgEBOA+p7CLiAjglBCgwxiS6hEAcvpEnCBgWGMghZSAHXwcLbxuDkkUUUoUkibDeBHikpwAiMABJ8LIpOGgwFrFHlUUhWAYYABW0TGLtWYPozx3BOBKDEo2UIJSkkwHwdlCQRpnx4wUo09pajWkMWscgAcpD1hwGZmIb8+o0ADkmkEPaWBgwhRCpAWA/SwzsCUCFb8v4Qo8JoGIAmRAqSVDDLQEK4gsCMBCns+AzMXLMDkAAYjBQco5EATm5zAFAXIOy4WHLQLAUgpAzkXNclcxANy7kwAeU8l56D3n2S+T8v5AKgUgoxWGSFMKMVHLyREMMB4ebjMmdMrJfi5nRFqZxepZoBIhNUIirgVkBDKRAt4kliBSlCsIVAYh+jcgAH13HuIAOqSCUkoXVWrULPgmRAKZchJGCUbL0tYaBfJARppEwiqxOCWFCWQKB6EaDizkBgXI2EjS4SEIioC5hxIMR5Y2bRuieDJlrBYnmqjVJxVEjAX0kA6KSGjTAVRSxfWKDQAG3I4QcJ4XDZwSNoE5DWuQjzOi3SNL9NNIMu8zNOAATzZwHZkA2nEQxZwWsIUADyeLLnXNudAUlzNyWvLgFSz5aBvm/P+YC4FoLCz7IhWgKF0LxAE37TAAmQgCYYoJoIKItFciEPdRYWizA+xHE1WASetAjLUIIkwhVFqrUzOyf4xAF1Ub9PqrMlJEAuq+R5nW6xVjSByCgL5CIc4bmcALK2JasGxJqPYEh30fCEUnPA4BjSqSggwZgHBzgABSHKvpfIIaQyhtDIUMOTlcbtajuHmNQEI9Y4jaBSOCtyTi9gQRLBkU4JPcTBTfJ6sIBAK5vpoEuqYVMgSDgsA4EsMhiIqHcjocw64zgeSoL3mYroRcKK21OEknNSBRGsV5OA2AdDFZZP5NSIpiAym4CqaLBEjTS5ODad040oz7GFxsOQKLUIO0Y6qxjlFhci4uCiPEWgMMpBDS1jANzdCTpU6cEkzOxARBmCq2bqrG4513PRcrGw0ddqHU5bywVtCcBisBFK0qyrCprDSAVHV1LMWuBKtbGQW8cgt0/nBSFOgawTlHEQOodQqtpBjaa1wOL8C5CTQJi0oFWcmh7ypNtqGXB4tyEy18Pr5WpuKVCHNndi3aDLeMPndQjQmjWHqx5nbHrHvi2my9p9FhFv7a1RuZQe8/gKgug1D1d5nytQU9w61xxLXZSEL5OcKqwzlLAEEAcAARI8ug6JjjATAVwABCTgFPlBkHpwOQzDWONYdSMzqnnA9WY84Nj5s2SwCM956zgTbbsWkBRmZC677P3Pm/fKnlPjZkBJ4QctzcuBxgcuk7QSJyWrjL0NadtzBrRBcIGRA6BOrp5JN20c3dlLfW4gLbjnyPmAYF8TAk3UnJFhj9woII0rfQcrnLe33EGKNUZo3x1jqWTPUW4wn/D/H1nSujyH8jUHKM4esfRxGflE8c+M5x1PYWePwYz1L7PYAfe57E/kyTMBpNeYkwppTKnTRBdUCFrTJ3FCNJQ+X9jKelrIE76QHzPeAt9/U8pTTYXh96emusvJSOrq05NxjutQucei/xzniDxPScS+p8AWnDOmeU9Z+ztjXOuN35Z3RAXB/he47F6/qn9Opdb5gCoxaQ6RIB6RlAwC4BUDIDQIKTrDnKTpEohSMKqD6iNhhgxDMDTr3KLokohSiSWohS0rrrmCNhhQQb9IRDowyyojUhqxKyijYjaCawGAqpbxvxkiDBRyjDWAHyQhWwgJ4BBAurQBRDN4UaWbaQwAAD8qQnSvo8MjyWwRwoQDMHachYAGAyAk0eYnARAEAW0pWAA1L0IJLMGJEuFQVQAungJPusgOEJvgpKmElJt0BpJwAALK3QCDGSgQ6D6gBimY1LziiqPgHKNK+jOH8LOgZhcANICThD0SciThPqkCqKSHWbFKhDWpLhQBUQqHWrxHxKmhoFiBUQrZCBwKhD6gUKcJWg8J0R8LoqV4JBBB/DpIIEEpIFPpgDqCPI6DvIWD6gAo9HnpSGLo9F/BbqtgJBhh/DMp7pyD1ZBAKqtABHFpuq1rWphHirrI7IrZyBhiPp9iFKdFuRTokpkoDELpLpjSrp0obogoHELH7oHHHFoDvEEytCRCcogZmT67I4xCGj3ScAxz25kaQbQZAniypC0bIa+jQloDj7P5V6ImpA/zrJCYiY5Jx5okl6InImT6pBomglS5YlAHy4GIJiQG9oDjPHvGnH4rnFIGXFzrXGUofJ3HEH0qbrPEsrQpvHsBPofFCl9hfE6AOy0TGL3qJCilfaaQtCgEoD6ScJLKlBEDWBhi9BanWDWDUE+wLzna2AvwNCkjMEhypLsG/zRyggAIaiWzMipyLBXS7hfC7B8yvRnh7j3z6C/I/wmlMG4iBCukXA/DygcFKjcEkh/B8GagCEshpykJZwXzAQelfYAAS4Q+Aq4o444jEm4aM1h6CeAmZcAYSEACQJEmEc0x4X2Pp1ITcDBq8vQ/p5pgQNZzEr0pZagYZVgEZXBu8pssZOISgpQtOeAlpBp1w/sxpK8KsxpTpBgh4tZJoDgZZqQw4asdcMcjQ6gNw0g1g4gjYvAsACQW5lQO5e5B5R5J50k55l5+5h5x5p595u5j5N5p5W8go1pPBrgMsMQsAcInsy0L0X2xUiUPkTGqUIKw0EAuUsqIFeMCUpUSUvkYY5BLsdUBuywNkIZXAnkD0T0iIr0zM70n0sYb4P0f0LsAMnYecqQvkxcpc5clc1ctc9cjczcrc7cnc3cfcA8Q8I8Y8E808jYiMnYn8qQvQEMp09W2JyScey5nZX2q+65JeeFYYHZLE3Z9WpQNM4gSAoAAQignCQgeA1EIArgrgQAA===\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst { receipt } = await Actions.policy.setAdminSync(config, {\n  admin: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  policyId: 1n,\n})\n\nconsole.log('Transaction hash:', receipt.transactionHash)\n// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `policy.setAdmin` action and wait for inclusion manually:\n\n```ts\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { Actions } from 'wagmi/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\n\nconst hash = await Actions.policy.setAdmin(config, {\n  admin: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  policyId: 1n,\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args } \n  = viem_Actions.policy.setAdmin.extractEvent(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Address of the new admin */\n  admin: Address\n  /** ID of the policy */\n  policyId: bigint\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n  /** Address that updated the admin */\n  updater: Address\n}\n```\n\n## Parameters\n\n### admin\n\n- **Type:** `Address`\n\nAddress to set as the new policy admin.\n\n### policyId\n\n- **Type:** `bigint`\n\nID of the policy to update.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`policy.setAdmin`](https://viem.sh/tempo/actions/policy.setAdmin)\n"
  },
  {
    "path": "site/tempo/actions/policy.watchAdminUpdated.md",
    "content": "# `policy.watchAdminUpdated`\n\nWatches for policy admin update events on the TIP403 Registry.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"00763990b98b4efbcf9bd7321d9ba2c95d1dae5db8d2d85db9dc52b8f2ca0034\",\"data\":\"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=\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst unwatch = Actions.policy.watchAdminUpdated(config, {\n  onAdminUpdated(args, log) {\n    console.log('args:', args)\n  },\n})\n\n// Later, stop watching\nunwatch()\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n`() => void`\n\nReturns a function to unsubscribe from the event.\n\n## Parameters\n\n### onAdminUpdated\n\n- **Type:** `function`\n\n```ts\ndeclare function onAdminUpdated(args: Args, log: Log): void\n\ntype Args = {\n  /** ID of the policy */\n  policyId: bigint\n  /** Address that updated the admin */\n  updater: Address\n  /** Address of the admin */\n  admin: Address\n}\n```\n\nCallback to invoke when a policy admin is updated.\n\n### args (optional)\n\n- **Type:** `object`\n\n```ts\ntype Args = {\n  /** Filter by policy ID */\n  policyId?: bigint | bigint[] | null\n  /** Filter by updater address */\n  updater?: Address | Address[] | null\n  /** Filter by admin address */\n  admin?: Address | Address[] | null\n}\n```\n\nOptional filter arguments for the event.\n\n### fromBlock (optional)\n\n- **Type:** `bigint`\n\nBlock to start listening from.\n\n### onError (optional)\n\n- **Type:** `function`\n\n```ts\ndeclare function onError(error: Error): void\n```\n\nThe callback to call when an error occurred when trying to get for a new block.\n\n### poll (optional)\n\n- **Type:** `true`\n\nEnable polling mode.\n\n### pollingInterval (optional)\n\n- **Type:** `number`\n\nPolling frequency (in ms). Defaults to Client's pollingInterval config.\n\n## Viem\n\n- [`policy.watchAdminUpdated`](https://viem.sh/tempo/actions/policy.watchAdminUpdated)\n"
  },
  {
    "path": "site/tempo/actions/policy.watchBlacklistUpdated.md",
    "content": "# `policy.watchBlacklistUpdated`\n\nWatches for blacklist update events on the TIP403 Registry.  \n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"9b1d65086b67741e13cb6c063a4e3c7d1060b98061ad9be94ac501be7904f5a6\",\"data\":\"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=\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst unwatch = Actions.policy.watchBlacklistUpdated(config, {\n  onBlacklistUpdated(args, log) {\n    console.log('args:', args)\n  },\n})\n\n// Later, stop watching\nunwatch()\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n`() => void`\n\nReturns a function to unsubscribe from the event.\n\n## Parameters\n\n### onBlacklistUpdated\n\n- **Type:** `function`\n\n```ts\ndeclare function onBlacklistUpdated(args: Args, log: Log): void\n\ntype Args = {\n  /** Address of the account */\n  account: Address\n  /** ID of the policy */\n  policyId: bigint\n  /** Whether the account is restricted */\n  restricted: boolean\n  /** Address that updated the blacklist */\n  updater: Address\n}\n```\n\nCallback to invoke when a blacklist is updated.\n\n### args (optional)\n\n- **Type:** `object`\n\n```ts\ntype Args = {\n  /** Filter by policy ID */\n  policyId?: bigint | bigint[] | null\n  /** Filter by updater address */\n  updater?: Address | Address[] | null\n  /** Filter by account address */\n  account?: Address | Address[] | null\n}\n```\n\nOptional filter arguments to narrow the events being watched.\n\n### fromBlock (optional)\n\n- **Type:** `bigint`\n\nBlock to start listening from.\n\n### onError (optional)\n\n- **Type:** `function`\n\n```ts\ndeclare function onError(error: Error): void\n```\n\nThe callback to call when an error occurred when trying to get for a new block.\n\n### poll (optional)\n\n- **Type:** `true`\n\nEnable polling mode.\n\n### pollingInterval (optional)\n\n- **Type:** `number`\n\nPolling frequency (in ms). Defaults to Client's pollingInterval config.\n\n## Viem\n\n- [`policy.watchBlacklistUpdated`](https://viem.sh/tempo/actions/policy.watchBlacklistUpdated)\n"
  },
  {
    "path": "site/tempo/actions/policy.watchCreate.md",
    "content": "# `policy.watchCreate`\n\nWatches for policy creation events on the TIP403 Registry.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"4175566a55e750e5214e1ba28bd900a36c6ad75d45fe9a2ac4e16980d28c414b\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIBBAYzUYQwCKnDQBDDkgCcVADYwwAczT4kAdioTSSmA0Qg+AoSJBzGYXIgAMVXvknj+ZGQF8K6bFYLEXWuvogABTi5uJwAJScvCZcMWAAZoxKiJwAwkJJSgA6YCxsHNGZyZQgYpL6ACyaZooqaogAbFqSuoHxWaXmlkgAjHYOpE405IjS7p44eIQk5P70ePFinACuYADu4mj2qQDqW/YZYGhD/ACiJMcASnorpGAAKl6l5VKI6rK1yqoaLTp6eDWm22ankFisAGYBo5nKNGhNqM8DDM/NQAkxWOwuEZBMIXtp9AAOT4Kb4NGraNp4HEmLrgpBQkD2GEjPrwjyIqbI3xzNELAz5LGcNjmXgYfEVGQ1Un1JDNaitAEGEWMMV0nqIRnM06sxAAJkqCMwXJ8s1KNH5IASa34uM4wMOpBgWxgAB4jlkAHxBDrJVIe5IUYWOZh6MhwVI04QAOhVYujDvwaSdLujAAUQ2HSHB3cUlJ6InsDkmhCdhhdFGgbmg7o8vLkwOJQ3AsE4YPbi8nnTRSlAILwEAZ9iD4JwEuxhRBRRhoinjGBODBLmg4NHzeIlIPkMgQHQm1gFKUAAYnle5QWFYCz7swANKIP4NBoLCcVxj0gQZicADkAAFNkozCMAA9DETrfuemKXpwNCYq+76fj+/4bkBoHsDAoEOBYcAQXkUFcFeUZwPBCQfl+f4AahYEYbBbC4bkSxxHmnAALzXi6d5BMAuScNEWHCKkyC0RADzwGglhoAAuhQPEwUMwgFCuqTcQuvGcEJMCYtGjBQJJqSPs+QQRDJqnuLkrgRLkDGxKsGzFqxPC2iYsZTqqGAJp2c4wD6eZBipvFCGmrlil2LpQKkIQ6HAQZyBAShRCxnqcP5alLFOMDRrFShBN+QXTuxNDhd+QatJEslmWAFm5CeR4gNJO6tkMzClL6SicAAtOkeZrvVICNU2pT9aGIzEZ1GZNVmq51RQO5OjW9ymNwY42vOMEQLZcArAARnAvCkIwW3tqRiGqO2S6Vj10llASfTWJU8h1D8iC9P0Cr/IEiahT2YIalqgzDC4mq9EaSKmqiFqBCEYSREUwhMYkfpdQjOR4YpsOdKIN3Pb08oyk98qUkqTJ5uqkLQjqgOVBCIMmiivIQ3gQRYB+OAcBgUSBcFGBfTA4WcJFm6pJ9XnRtwUUxXFQueTe0YADJxQlSVEBAOm9v2g4gGkoRyFtTgANZrZwFjK3r7brPgiicOIk75YwxF7TeUBrpjkrPXqhIPWSfQAKx/FSBic9OPNQKTSD3Uy/2wkgeo094dPmuiBhM5mIxRKVymybxcYYAAknzW3JBYaAANyZ6sWBQC6pCRlAUBOnAcCl6pvHGjAqR5W5Tw4E3rgSm8vSVOHeMNOHhOBKVoeIOH2oA6MvSErH0w8gnlrJxNqecFlUsgjzctxX3+i9N7thfLKmp+0TWWT9Pke6gai/cma8yBI2zatrw7ZpQouREJIsNwOlf0Jh0pqwHHgB4FtOBHi/jAI8nBmDQBWAoYUH4iA6VHNbOA+RkGwC2isJQSgLBtRgTBBwXA7acCwUBOQf80DrVOrkAAUuIX+ABlPajAsDwwAcg0MzI8hwC/MzYg6CoCcC2jOdYMAtriI/OsOA4ZoxWUeJAhBUAkFnVoIpYiaB1jrRbDAXgjAki8CKJiSwxwIzKIAFQ8CgUcHhsDog0IbvaRgqh4F6EIFAYim17BW2ItA4BChMpxSMkeIMQThDpWjGQD8pBwlWzAGIqJjiPL3ESaoLY0RxALkOqsBRYi6H2n2jQQ2uSZwADloAZQAFa+JOM6ZgSiwC2KWkoWKus5BQJgXA7CEgwAf3RskO4vNDbrFKe2YpyAjzCI/g3aMYg+wrDQEeSSQQDJYAjMBYCkBYD1OjOwJQwE+wDmAjQmgYh2pEANNGWgwFxBYBAnM+Aq5HzMDkAAYheQ3JZEAVlp2SbkGZPzVxLLiWsjZT4tmIB2XsmAByjknPVucl0VybmVDuQ8p5wFQXRneV80F4LSCkAiNGTgED2wdIgF0npwSnG8FyeI9sKxCluNUP88h+EiGkPbEeeFiBenwMQSE5RAB9ax1j9j3CIZKsVqRKWcGpbSkhNLamGLQN+Yiw1vHEUkO2Sw7iLakH/nbGgxw5AYFyHADAgz8AfkgKyzejBTa8tkRAeRZAeBphzjoi2M566aS2goIMkATX6t5TOJYZrKyWtyOEW19gHX/OIuYV12tOAQFOia6psBoz1MoY0psq5OCsJgFMyBMzIBlKECg/srzOA52AgAeUhZs7ZuyamIp0Mis5FyxLXNufcx5zyPzzLeWgD5nzxDtWrTAdqQh2qgvaoIKI45SC5AQU6I2iR2DMC2LiFpuQzi0H3Mg1lPLTpKs6aEOl0SFBHkQMomq9TrL3oyllHKFs5CxXtOwOQUBvwRCbjszgaZ9qWP0jAH9609GkAA0GYpfyVlvrSZ+7837f0AFIcJBm/HBgDQGQPATAxBpSnBMOwf/VARD+i0DLLQKhmJcT2BBEsOsTgZwSWse/LsQgEAtlBgATqnlusxEOCwDgSwgGIjAdyKB8DRdiIsZNc2OAG52y5LEeUXgBsyxDKQ/RuJT6wCgd4lx+Jex+OCcoZ+LxonxDiceVJ3m8mSNqStlwZAS5Qh6W9s9b2bmPOedLRwrh0ZSBrBziou2RwIb8wFUQZgz0IR6meoSSypn3NqWyc2ra6r+ARaizFuAcWAgJZqYgJLmprDSE1BloLHnskCqLmQRschcVjtecBOghiVm4neOoZ60hGs5a8z5uQkl2oTOc2QJo+o9Sjd4tkib7D9pcIq7ARArX7ihE6/WhuPXaB9fnO8RoTRrCZbM2NzgLXjhtb2/uiwPXf5yDFWICDKQ9QQk1Moxit2mztjYrxxgP7OBXBpdhIQ34m4wPSWAIIR4AAiuTdAmoACTAFfjAVwABCTgKPlBkFx0eOTWXSNKdSITtHnBdig+6RDgu0SwD4+p8T2jhbYAkuqieZRJ6z0sqwcoN1R4HHpTgbwFxViwA86PK+wZNlOUOTaKwotzBWF2cIOsIysObJxOV3oVXKZ1ea49Tr1DXBmDc3pQ5dj/8Yli4UEETlQY4lk83db99oTsoYeg7+gjMniMU8gxRv3VH4M0cNpyj3juP1hN9zBzgOHio/gD0RoLimQ+Ub/RHjn0ewBW9j7E7jCS7cWZ43xiAAnoq2ZE8LsTFHZvSaA2ThTZGIzqXL9XWn1ma/Cfs/XxzjfJOKF5tJQ2cS/s2Wxw5EHYPGdQ7ADDmP9L4eI7ZxjrHgO8cE9R8T0nQfM/kY37T+n4PIfM9Z3v0guOOeT7ADVdcm4kDbjKOW0oyAAF3A/us9tsLgKEKqDbTRgxDMCdr7JwDgEYTBo0rAQYpYrmBbRoRe71IRB1RXSvCHyNCvTDy/BvT+zEzvqTy+wRwsiUwPxgz0yJzBA6rQBRBF6fpqYaYAD8qQFSQY0YnBAm84oQ40xabBYAGAyAkkhYnAysOk/MAA1L0JmrMLFI5mgVQKchrEfjoutEeMhqsuyvgLdjAOsN0BlJwAALJIICAHiaY6ArChiWI5J5LtitgNy8xBjrBGq8q5BJDZhcCspjLhBurMwsCSAzhMG6BJJiIZqOZQDuK4i3reFhG+LbRiDuL9ZCA/yhArCjhUKg60LrQgpkYJBBAQgRBtrQr/77pgDqCHI9rdArD3JlFLoaaQFlEQidZFwJDRgQj4qTpyCZZBBXqtBWGVh6rboZoOFsrTJHj9ZyDRjrr7poDhK/7QodrwrdrHLKGoqXJoCDqYrDo4qTGdFTqTEzFbBHGbGlSyZHoP4njy7/YxBrBcBsTey65e7oa3HHCpBYaAZBivFoCt4kaqGpDfGpC+yGyaFMYhIvH/JvEp7fG/HB7kaAmcDAmGYMay7KJlrtgzJ7EnHzFQrPhLFdqrhIprH9ropDrYogR7EEqfKHF7rHG0mnFRRroThbrtgWAnGHpP5bg7hC4fylBEDWDRi9CCnWDWDoEuz9yNAkiPQNCMhjx4BXw/RWAkEzxRxuwUHxzPyMxDRZhpxRQZzNw2xuR5ypAFyELHBNweYrAVxVw1x1yvIWlqStztxcxdwwA9wHx9CEh6iexnyjyKjjxRTEHkyzzRzezqnLyakGD/ZAjFgRSKxiEqwhzin6B6h6g4HSl4FykGAxkgiTy9Anwqm6jWCuBXQxCwAYhoyEROTCAkRkSp4oQgTCS4QXgETDJtRvjHTkTRjIFZD0QK5wy2SJgOREQuTTgeQ7xeQ+TIx+SySBxuTBwCw15ZRRApS8Rw7obpwp5nHlQmRVQy7k6yxVxCZ0IviJhEK5A5n2BGSlDDTiBICgABCKBYJCB4ArggCuCuBAA===\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst unwatch = Actions.policy.watchCreate(config, {\n  onPolicyCreated(args, log) {\n    console.log('args:', args)\n  },\n})\n\n// Later, stop watching\nunwatch()\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n`() => void`\n\nReturns a function to unsubscribe from the event.\n\n## Parameters\n\n### onPolicyCreated\n\n- **Type:** `function`\n\n```ts\ndeclare function onPolicyCreated(args: Args, log: Log): void\n\ntype Args = {\n  /** ID of the created policy */\n  policyId: bigint\n  /** Type of policy */\n  type: PolicyType\n  /** Address that created the policy */\n  updater: Address\n}\n```\n\nCallback to invoke when a policy is created.\n\n### args (optional)\n\n- **Type:** `object`\n\n```ts\ntype Args = {\n  /** Filter by policy ID */\n  policyId?: bigint | bigint[] | null\n  /** Filter by updater address */\n  updater?: Address | Address[] | null\n}\n```\n\nOptional filter arguments to narrow which events to watch.\n\n### fromBlock (optional)\n\n- **Type:** `bigint`\n\nBlock to start listening from.\n\n### onError (optional)\n\n- **Type:** `function`\n\n```ts\ndeclare function onError(error: Error): void\n```\n\nThe callback to call when an error occurred when trying to get for a new block.\n\n### poll (optional)\n\n- **Type:** `true`\n\nEnable polling mode.\n\n### pollingInterval (optional)\n\n- **Type:** `number`\n\nPolling frequency (in ms). Defaults to Client's pollingInterval config.\n\n## Viem\n\n- [`policy.watchCreate`](https://viem.sh/tempo/actions/policy.watchCreate)\n"
  },
  {
    "path": "site/tempo/actions/policy.watchWhitelistUpdated.md",
    "content": "# `policy.watchWhitelistUpdated`\n\nWatches for whitelist update events on the TIP403 Registry.  \n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"e8df301eda13d3e824a0f6ebe0befaea3f9f427a3290ede59f525defedbfdb9e\",\"data\":\"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=\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst unwatch = Actions.policy.watchWhitelistUpdated(config, {\n  onWhitelistUpdated(args, log) {\n    console.log('args:', args)\n  },\n})\n\n// Later, stop watching\nunwatch()\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n`() => void`\n\nReturns a function to unsubscribe from the event.\n\n## Parameters\n\n### onWhitelistUpdated\n\n- **Type:** `function`\n\n```ts\ndeclare function onWhitelistUpdated(args: Args, log: Log): void\n\ntype Args = {\n  /** Address of the account */\n  account: Address\n  /** Whether the account is allowed */\n  allowed: boolean\n  /** ID of the policy */\n  policyId: bigint\n  /** Address that updated the whitelist */\n  updater: Address\n}\n```\n\nCallback to invoke when a whitelist is updated.\n\n### args (optional)\n\n- **Type:** `object`\n\n```ts\ntype Args = {\n  /** Filter by policy ID */\n  policyId?: bigint | bigint[] | null\n  /** Filter by updater address */\n  updater?: Address | Address[] | null\n  /** Filter by account address */\n  account?: Address | Address[] | null\n}\n```\n\nOptional filter arguments for the watch.\n\n### fromBlock (optional)\n\n- **Type:** `bigint`\n\nBlock to start listening from.\n\n### onError (optional)\n\n- **Type:** `function`\n\n```ts\ndeclare function onError(error: Error): void\n```\n\nThe callback to call when an error occurred when trying to get for a new block.\n\n### poll (optional)\n\n- **Type:** `true`\n\nEnable polling mode.\n\n### pollingInterval (optional)\n\n- **Type:** `number`\n\nPolling frequency (in ms). Defaults to Client's pollingInterval config.\n\n## Viem\n\n- [`policy.watchWhitelistUpdated`](https://viem.sh/tempo/actions/policy.watchWhitelistUpdated)\n"
  },
  {
    "path": "site/tempo/actions/reward.claim.md",
    "content": "# `reward.claim`\n\nClaims accumulated rewards for the caller.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"63fa687fe50fa183122469b6de0ff02764948fafd9737817ff79121a442b3050\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst { receipt } = await Actions.reward.claimSync(config, {\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Transaction hash:', receipt.transactionHash)\n// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `reward.claim` action and wait for inclusion manually:\n\n```ts\nimport { Actions } from 'wagmi/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\n\nconst hash = await Actions.reward.claim(config, {\n  token: '0x20c0000000000000000000000000000000000000',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n}\n```\n\n## Parameters\n\n### token\n\n- **Type:** `Address`\n\nAddress of the TIP-20 token.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`reward.claim`](https://viem.sh/tempo/actions/reward.claim)\n"
  },
  {
    "path": "site/tempo/actions/reward.distribute.md",
    "content": "# `reward.distribute`\n\nDistributes tokens to opted-in holders.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"68cfc834c7b00e507b2686e4d8050a386080048e317a40941faee9b9d01b80bc\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIBBAYzUYQwCKnDQBDDkgCcVADYwwAczT4kAdioTSSmA0Qg+AoSJBzGYXIgAMVXvknj+ZGQF8K6bFYLEXWuvogABTi5uJwAJScAGYArmD8gmCcWJJwMACiqmRBevhkiJxipBZKFJzxjGgA/IUAOiAA7jCMDZwAPpwNSs2tIBGFAEaMShZodWAsbBwpaZnZ5FRQELwIBgDCQiQccJziRWglypykMFin6WASxskQ0Zx5ZJxoEJxgscxkjLyhnL0AdBMJgBaTgAERWcEK+DQaCwUIA9AiiIwYMx/nB8AjlqsEbEBOYBPAEalSOksvlFtRxEo1shkCA6OJWApKCApuwuMBZmT5pTOK4YqQIMxOAByFFosVAsCk8kLIJigAsACZrGKIhMkZxVdY9fqDYaDWAQABdU2ibT6JWaMyKFRqRAARls1J0ejwcr5fjMFisTrsDlITho5EQ0ncnhweEI2zZNHoeBCYUinF4Ji46bA0RGhU22ZGEw5MyzOaUbLEkn0AA4A3blKokAA2LSSXSBUsjNnmSxIFWBxzOMMRjzULwx3xUhMdjN7ZgQeJoIYjMZsnFrEAAFXyc4XV04UEYxUYg3xMCgFatSCdToArPJ7Y3EC23e28My9wx5H6kEqB8GhyQatIzHaMDFjH1pzwLMxBieJYFIQoAANrFoAASYBj2UVwkLXSE8G3GA9igKALl2VRxC4OIwFgKBnh3Q9j1PG5Lyra8VQAZgfBtHRfbQ3wMaiEO7H9ED/EB7EHUNrybEDMDAnw438RMDBgrhTl4FosCXThN2DYQQySAAlGBNMYbS8NWAid0OcQDMSIQTlMrSvxASspGdDi6wUHiNFbd1Ag0lyRN7MT/xDFxEBVJU5PHcDJ3jAImFYTkeAc4RWI8u9vMfR1bX4j0DCMJJTB7Kx7wkoMIrDYDR3k7wIKnJKDGLdSYEaSQL0tNjnVvWR6wdZt/IEkBTg60gut9UKKskgDpOdWS6rixTIOakBqPSg8j0OE8zwAZQwBIAB58zLAA+IJOyUPMhDLcpSWZPQyChNKbjgf4xs6/5GJ25iYAOhJ/gABUcT5QzgE7bpGM6Bk4IHhWYI8YCOn6Sj+gHeH+Ey0FiUgwAANVCWIYDOiYwEeuBUk0ramP2w7eEsjcwW2tGz3IiAAGtFHZzgIG089gQsThCDkBDdjsuiOqqXZonYNModIZhKKSf54xpOkGSZFlcCoJC9bQOAixSmZuV4U5KJgU6RnKGE4QFIURXFAABDqlERhF01OaVJmNrlnjRNh7eiBHndd93PZgD2HAsOBvdazhuWKkwg5DsUXZpcP2EjmgUu9iY1PlgslE4ABeNNzZoK2lCCYAJk4NNo+EQpkBzthN3gNBLDQC06+efTKc5F7a+SevOBbgOIH+RgoFNaFYSwIIIgoXv3AmVxNTAfPZwuWI5C4MvxClrgk+ED72q+1HdpoDHLqhsoE97j9F0KF0jTfo0wGXkf0izKAXurJsSo9Rf3ri8LmYBChilQmqXg784HwLgU6MUX914TD1rhC0DIHrMDZFdTgoIq6q0wSAbBbJsFPTJPguGoMKHvTNBQBkpwcZ41MIRPudk4CGUckFcyXAJYPBIPuKAlFxBEItG5K8C0Xw+UGs6cSBVAiX3RvTEK5VwqASihxWKClGqJRUsEUIjBwhRALldG6RcjbTEzHfTK+gnS1m4rIvibZCoSRsd+aa6j5ocVqlGBqCVlKBCCOcPmZBMBRCflcZcowri2OvNICqMinzOICu+eci5VFDUqlJSKMUlo6ICdQNayYjGpi9BSHIjxEIHCOPfSoNR6hNBaG0To3RegNFhsMGJ4wfZWJ5PKSkjM8D5m2AbPYNTShOXOPARQ1wki83uFU54rx3ifBKD8OQfwWiAk3mAUEEJVhzzhIiZEqJ0SYmxJCPEBIqiojgCSOYFSpzqyQPSRktBmRYFZFQeO3JykLBTo7CUZy86ykeQqZUaoNRagRDqNUCC34mnNN1DyaouIDSfC6Yarj/mDI8VYF8s1qrsW0f4pSRT9HBOFDgDgGAohgMUI06B1hYEIrZQghocSooqltEkx0FUFF4AZSafFflslzVyaSic5KoIGHJp8SmTgiIwQgAoCYRBJCFzgKqmA5jtXfJAOuayREkIqoUEhTg84oC7yIiElEsBxZFCmAoA8MBTxKBicXM1REKJcCPE6xGchNUvHojACYAApcQGq9pm14VqnVlrTIOEmHAUUdrp7nk4IMDAWzBhZuFI0dIZIdkTDYVam1DxaBWPIo0V4lNTKMBzLweWKVLBXChDKAAVDwTgSF8z6pgBa3gQa4C7EaFUfAibVDQF2HAWI9g9i7FNSYHV/w5AQGrhEJC5Rl3CFXWQYUpBF4Wv4bugd/xxpgGPfRSiaY7JZqIrEdIdEQ2NBKDQZZewwA5oAHLQBgP8AAVrOw4MBmQ7O7dwTgSh12DF+GenVFqY4SASMqu+uNM2vvfT614yAkIhM0qOjEaBlj4iQqaIItt4SICRJAWAwH/jsCUJc3EQaaBiGBEQaK/xaAInEFgRgJJhSEfejCZgcgADEBH4CjpIwuNAESaITDw9JojYgEKkHI5R+eJy6MwAY0xlj9y2Md049x3j/HBOqdE2gcTUnhMyfUweiI/xdI7hgxAODmyEPmrvckQYj7n1/AnfJzgrVJnZF7XpxA3qLXloUCWsAAB9TtnaADqkhJjKFS0lwobCPNefjS6zzgHTJoDFLsMGhA/57FOG8FoAKYLbVmXIDAEw4D03wMKSAT7ODmC5qG/NEBC1PG4EDAAkuRfIOaLhokGAocokBSC1Z9dNrVzWritYmOETr3WFy7H60RUImyIAAr/bAIDIHzbMHepwPaMBVtETw5AD9jlrOcHGwiAA8lpqjun/0GZ0EZhEJmONcaVDxvjAmhMrBk/8MTknxDAhezAYEQhgTWcFhAKIstSATHnHViwuOlY3ESxkD52sKhwAi+52D8HYuIBlOg4DW890JfXdXMU+Q5Drr+OwUWGoADcMK4ZHANtCGAPPXi1tIKLcoIb1PydZ+ejnipue84AKSx3KGKGXAuIjC7ANqeGYwXrq+l/zqA8u61yfxMr/dpBD1BEsI0TgGRHfsEVGlwgfM4DlG1VVyZcG6IOCwDgSwUANQG5Fyb9tDwPfLYVZw3QX66KVl4Bzdh1MFckYPYzo3sL67u8PYUb3EBff+5FHkIP4gQ/8fD+eEXo89hcGQDADVchZ63l6k30et6Y0lG0h9eI42wDbiPPmacnBnf/sQEQZgnkVTOmrBvbUzfb1fcGKV/gw+wCj/H3ASfARp/Rfn4gDi1hpDn5X73+ut7otjDIOTOQMORMIjoKZfESREDqHUM6aQt+LeY87eoQpowIb69eBQTY3KgBt6IBcgA+caM+sAiAj+eMoQr+Mm7+tAn+NwP+0BTY1gq+hefeXAD+VwT+GBSsFg7+HeSWWE10nE5+MoBc8qREZcYoaWjAPOnARknmMcQgYohu3qF6mWQQSEYIdkugy2GEbBrgAAhOCFIWQPIUhNHgXqLqboUJIcoE8FwTwXwcMHumAIoTodIfIdbgcBpmgnrDKOTp8i6k+jTiav2ohmmCOh2rsszobAkLOKFmXO2HtKBsyHtFXoQI0IvMIbOAeqXNBnoEEddqEZ8OEZEcrlwMwBgK4S6mXC7kVgBlkTAEEPJuUM5obvjpkSuuzhumrpLrznrpHuocbmLmbrURbrLlbp+krmABkQUWutUVzq0ZwFrsguKPUULjHs0RLlLnzu0ZYV0T0ZUQBgep7rkcXp7pwT7vCJXoHscMHsLJARHlHobk0VoWPGsdUmXhXkUFXqoDXnXmHooOeBaJ+geiwbOGwbEZwdwZsoYQIWAEIeUb0ZeuIWYU8LIY9AoUoboaQKoY0bCrHuLlCdIZwPoT8fwcYaYcoTCZYa8WAOgmrLSK8gyOkDrCAMgNqrjJpBRn9jRgiKMKoLEIMP8OmMwAiHpsBmyf+giPNp5siOZiDieB7IsZdhEGaOIu5PoCqAAo4k+PlC4jOGzqSWVNeK6EShotYFKvFDKsUlVtAFEL0arknjSDALUF+hgOUP8JaXzDcKECDMGDdoUHZBgMgKaLDEQBANPNPgANROi8zbDrq16ilLD4QGAIk8xISK5kbBaqD1aNBlSuYACyu8AgXyR2OgHwsyuwPw/mtq4Qz65Q46MZ2QEwOYZIXAT6ma4Qg25wLAkgOaRpKe/Cx2xEh4NpmyFZdEVZc6gwYgVQX+Qg6qRM8AAa3BwauG+GYu0QQQHEW61J88tJSsYA6gjGQOPYsQvGi5GOxp9yi5HEQmYw0Q/wHE8OtmcgG8QQkWbYGZcekgR2PBqQo6mG45X+cg/wxOlEx6c5xytJ7J70hm64IOFsYO/Jlm1y3BJ5dmL575aA0FwIbYkQLmTOesLOvhwg1ii4sRt4URipfRnO6Yz8Qxke5Q+FVwcJmh7ahQJFOk94n6kZPSIhquYoVFiAIxVFZFYZlFn4hQNFOepGPS6CMo92T2SEL5b57AJOn52m35tGAOf5QOAFoOaAZmEOFm0OolCOEmUF4llEsF8FOOcsBORERO2lpOBJGsbkFgmkbIRA1g/wTodleoYpKKkp0g4kfKSA6KgqBgHOmSzoqpVUGivioEZKq0+iBckSOkXSq4wZVkBgbCEVNMv0Z4k0EpHll+MpvE2KgQEVvlWK4qxKmimp1I5YVAbBeAPlzlHlTovKuUSArosqhg6SUSnAr87KhoIqU0/o/Y+V6prg4i6YsAyUfSic6UuwgowcQKYcgmrcEAccvsCc/S3oy241qckozAc1w1hcZYgKooYo/wQpRcoKBc3IEV5QQkZA5QPC2k9sJcj8R8r0JUZ840UA30LMV8/09Mt8Rc5Qw86+TVOkuKOQYorVGoICo8wqkCzKrKbVMNBoyCK8G89uVRnO3A/1LF5QEVG8bIYM4gSAoAAQ3MSQQqCArgrgQAA=\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst { amount, funder, receipt } =\n  await Actions.reward.distributeSync(config, {\n    amount: parseEther('1000'),\n    token: '0x20c0000000000000000000000000000000000000',\n  })\n\nconsole.log('Amount:', amount)\n// @log: Amount: 1000000000000000000000n\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `reward.distribute` action and wait for inclusion manually:\n\n```ts\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { Actions } from 'wagmi/tempo'\nimport { parseEther } from 'viem'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\n\nconst hash = await Actions.reward.distribute(config, {\n  amount: parseEther('1000'),\n  token: '0x20c0000000000000000000000000000000000000',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args: { funder, amount } }\n  = viem_Actions.reward.distribute.extractEvent(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Total amount distributed */\n  amount: bigint\n  /** Address that funded the distribution */\n  funder: Address\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n}\n```\n\n## Parameters\n\n### amount\n\n- **Type:** `bigint`\n\nThe amount of tokens to distribute. Must be greater than 0.\n\n### token\n\n- **Type:** `Address`\n\nAddress of the TIP-20 token.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`reward.distribute`](https://viem.sh/tempo/actions/reward.distribute)\n"
  },
  {
    "path": "site/tempo/actions/reward.getUserRewardInfo.md",
    "content": "# `reward.getUserRewardInfo`\n\nGets reward information for a specific account.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"2817cf8eb4e4b47b5f84b40187d076c43f7a53bee576d8d38d3d92985fa42e8f\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst { rewardBalance, rewardPerToken, rewardRecipient } =\n  await Actions.reward.getUserRewardInfo(config, {\n    account: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n    token: '0x20c0000000000000000000000000000000000000',\n  })\n\nconsole.log('Reward recipient:', rewardRecipient)\n// @log: Reward recipient: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb\nconsole.log('Reward balance:', rewardBalance)\n// @log: Reward balance: 1000000000000000000n\nconsole.log('Reward per token:', rewardPerToken)\n// @log: Reward per token: 385802469135802469135n\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Accumulated reward balance claimable by the account */\n  rewardBalance: bigint\n  /** Reward per token checkpoint for the account */\n  rewardPerToken: bigint\n  /** Current reward recipient address (zero address if opted out) */\n  rewardRecipient: Address\n}\n```\n\n## Parameters\n\n### account\n\n- **Type:** `Address`\n\nAddress of the account to get reward info for.\n\n### token\n\n- **Type:** `Address`\n\nAddress of the TIP-20 token.\n\n## Viem\n\n- [`reward.getUserRewardInfo`](https://viem.sh/tempo/actions/reward.getUserRewardInfo)\n"
  },
  {
    "path": "site/tempo/actions/reward.setRecipient.md",
    "content": "# `reward.setRecipient`\n\nSets or changes the reward recipient for a token holder.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"fbddd9bb5f6273cdad3f5a5527a9ec016a6ae4f6251d0c70ea8374e2f635bb69\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst { holder, receipt, recipient } = await Actions.reward.setRecipientSync(config, {\n  recipient: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Holder:', holder)\n// @log: Holder: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\nconsole.log('Recipient:', recipient)\n// @log: Recipient: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Opt Out of Rewards\n\nSet `recipient` to the zero address to opt out from rewards distribution:\n\n```ts twoslash\n// @twoslash-cache: {\"v\":1,\"hash\":\"352385a25dd040388468da70eb96fdefa557efcc59a10ea4590405622b87794e\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIBBAYzUYQwCKnDQBDDkgCcVADYwwAczT4kAdioTSSmA0Qg+AoSJBzGYXIgAMVXvknj+ZGQF8K6bFYLEXWuvogABTi5uJwAJScvCZcMWAAZoxKiJwAwkJJSgA6YCxsHNGZyZQgYpL6ACyaZooqaogAbFqSuoHxWaXmlkgAjHYOpE405IjS7p44eIQk5P70TKzsXEaCwqXlUojqsrXKqhotOnp4qyZdFlYAzAOOzqONE9Re075z1AGLBVykMADukigG20+gAHDUFPsGs1qK0TgZfgDSED5JckDcQPY7iM+pUnpgpgYZn4PgsDAkAK5gfhrThwPQAJRgvEYWEYijQAGUMNSADwZRLJAB8QQ6yVSAqyFE4WEczD0ZDgqTOwgAdIjAar6WgmSy2RzudTVQAFOUK0hwfnFJRCiKpY2kCDMRj03na3Ws9lgLk83iqploCmkMAANVCFJgQtyYHE8rgst4MDpjOZnoNvtKUAgvAQBk5ejgnHY0QcyngnFUSY1yM4vz1Xq4CWL4grEAA1opOIQ5LBSJxxGAoJwAYw0IWm32xaRmOJjGBVaUJEpc8hkCA6LGsApSgADPdj3L5ZacYDRX6zmCS5LS/BoNBYTiuTgJR3MTgAcgAAgClM6APQxL876HkshSnjQSyPs+r4ft+4i/owAHsDAAEOBYcDAXkoFcKeKqFk+L5OrBP7/oBKEQWwmG5PEYhFIKSicAAvGeMAXleShBMAuScCW4joakyAURAAAq8BoJYaAALoUNxFZDMI3xKiesk8YJMBLKqjBQJJqS3veQQRDJYA8e4uSuBEuTUbEtbwBSchcMx4gjisNImOq/yau6qb6t6hq8KK1rSlxxk2fWHKpO+1i0OIACsvC8FcvDWFc0jSJUAAiABCMUAEbWFA0jcDFMAAKJQOlvTWGk4g5eImXWKCvRXI06igtwaTvkZPFoO2igRVFABM1hJdYo1jeNE2TVNU29J1ZkWWAe47iA0lrrKQzMKUYoMQAtOk1oLqtIDrbGpQnfKIyFntpobeacCHRQa6/IGwamMJ+BJmg8lwMMtJ1jArJcAOQ4wCQ3qcFAs7iId0llCCMiVPIdQHIgvQwtobR4F5YW+RmqI9IgGJYkM9xIANvT4i8RJvIunwGCEYSRHRtHbRK1ogd8dGdKI8Oo70/R7PUSDo3C7TWhcBNE4MwwuIToKU4SPizLTZLBFgjo4BwGBRHWabeqk2QgFF00m6bZujYbwIVH0A0YpCQtjEcmMIt5DYS1YiOYtLpOIANCveMS7w0KrQTqxAmuYFEPUdmABtG7QQ0jebyem5bPPW6joIDUjUJIDFTvwtQvVgO7ee3CTOK+64sMxLAXzHrhrnCFBhFvu+JGIUJmFHmBXPJC3MHvqqSH0VRMbOTwTf3dWUBaimOM+tSAX0UFsm6z5aD9bQKc72bc0hdHfUfoNw272f437+ZpQXeISCgAEihwGseBjiAriuEAA\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nawait Actions.reward.setRecipientSync(config, {\n  recipient: '0x0000000000000000000000000000000000000000',\n  token: '0x20c0000000000000000000000000000000000000',\n})\n```\n\n### Delegate Rewards\n\nSet `recipient` to another address to delegate your rewards to them:\n\n```ts twoslash\n// @twoslash-cache: {\"v\":1,\"hash\":\"47f5abecdba9b37d942876b7098a742d3423c65e8a06c57e478266e3647d4535\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIBBAYzUYQwCKnDQBDDkgCcVADYwwAczT4kAdioTSSmA0Qg+AoSJBzGYXIgAMVXvknj+ZGQF8K6bFYLEXWuvogABTi5uJwAJScvCZcMWAAZoxKiJwAwkJJSgA6YCxsHNGZyZQgYpL6ACyaZooqaogAbFqSuoHxWaXmlkgAjHYOpE405IjS7p44eIQk5P70TKzsXEaCwqXlUojqsrXKqhotOnp4qyZdFlYAzAOOzqONE9Re075z1AGLBVykMADukigG20+gAHDUFPsGs1qK0TgZfgDSED5JckDcQPY7iM+pUnpgpgYZn4PgsDAkAK5gfhrThwPQAJRgvEYWEYijQAGUMNSADwZRLJAB8QQ6yVSAqyFE4WEczD0ZDgqTOwgAdIjAar6WgmSy2RzudTVQAFOUK0hwfnFJRCiKpY2kCDMRj03na3Ws9lgLk83iqploCmkMAANVCFJgQtyYHE8rgst4MDpjOZnoNvtKUAgvAQBk5ejgnHY0QcyngnFUSY1yM4vz1Xq4CWL4grEAA1opOIQ5LBSJxxGAoJwAYw0IWm32xaRmOJjGBVaUJEpc8hkCA6LGsApSgADPdj3L5ZacYDRX6zmCS5LS/BoNBYTiuTgJR3MTgAcgAAgClM6APQxL876HkshSnjQSyPs+r4ft+4i/owAHsDAAEOBYcDAXkoFcKeKqFk+L5OrBP7/oBKEQWwmG5PEYhFIKSicAAvGeMAXleShBMAuScCW4joakyAURAAAq8BoJYaAALoUNxFZDMI3xKiesk8YJMBLKqjBQJJqS3veQQRDJYA8e4uSuBEuTUbEtbwBSchcMx4gjisNImOq/yau6qb6t6hq8KK1rSlxxk2fWHKpO+1i0OIACsvC8FcvDWFc0jSJUAAiABCMUAEbWFA0jcDFMAAKJQOlvTWGk4g5eImXWKCvRXI06igtwaTvkZPFoO2igRVFABM1hJdYo1jeNE2TVNU29J1ZkWWAe47iA0lrrKQzMKUYoMQAtOk1oLqtIDrbGpQnfKIyFntpobeacCHRQa6/IGwamMJ+BJmg8lwMMtJ1jArJcAOQ4wCQ3qcFAs7iId0llCCMiVPIdQHIgvQwtobR4F5YW+RmqI9IgGJYkM9xIANvT4i8RJvIunwGCEYSRHRtHbRK1ogd8dGdKI8Oo70/R7PUSDo3C7TWhcBNE4MwwuIToKU4SPizLTZLBFgjo4BwGBRHWabeqk2QgFFsXxYlyWpRl2V5QVRWleVlXVbV9WNc1rXtYbwIVH0A0YpCQtjEcmMIt5DYS1YiOYtLpOIANCveMS7w0KrQTqxAmuYFEPUdmABtG7QQ0jdNRfF9NHs817qOggNSNQkgMWB/C1C9WAYd17cJM4jHriwzEsBfMeuGucIUGEW+74kYhQmYUeYFc8kI8we+qpIfRVExs5PBD/d1ZQFqKY4z61IBfRQWybrPloP10VxQlSUpWlWW5flhXFWVFVVTVdUNU1LVtR1XWtmzlfAuJdQFgOsHNMA5lSgXXEEgUAARFBwDWHgMcIBXCuCAA=\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nawait Actions.reward.setRecipientSync(config, {\n  recipient: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n  token: '0x20c0000000000000000000000000000000000000',\n})\n```\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `reward.setRecipient` action and wait for inclusion manually:\n\n```ts\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { Actions } from 'wagmi/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\n\nconst hash = await Actions.reward.setRecipient(config, {\n  recipient: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  token: '0x20c0000000000000000000000000000000000000',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args: { holder, recipient } }\n  = viem_Actions.reward.setRecipient.extractEvent(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Token holder address who set their reward recipient */\n  holder: Address\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n  /** Reward recipient address (zero address indicates opt-out) */\n  recipient: Address\n}\n```\n\n::: tip\nRewards are automatically distributed to the current recipient before changing. This happens during any balance-changing operation (transfers, mints, burns).\n:::\n\n## Parameters\n\n### recipient\n\n- **Type:** `Address`\n\nThe reward recipient address. Use zero address to opt out of rewards.\n\n### token\n\n- **Type:** `Address`\n\nThe TIP20 token address.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`reward.setRecipient`](https://viem.sh/tempo/actions/reward.setRecipient)\n"
  },
  {
    "path": "site/tempo/actions/reward.watchRewardDistributed.md",
    "content": "# `reward.watchRewardDistributed`\n\nWatches for reward distributed events.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"468089c03999f8f886d48f18ae80edff227a04649f0e95be6e2f75637d974e5d\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst unwatch = Actions.reward.watchRewardDistributed(config, {\n  onRewardDistributed(args, log) {\n    console.log('args:', args)\n  },\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\n// Later, stop watching\nunwatch()\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n`() => void`\n\nReturns a function to unsubscribe from the event.\n\n## Parameters\n\n### onRewardDistributed\n\n- **Type:** `function`\n\n```ts\ndeclare function onRewardDistributed(args: Args, log: Log): void\n\ntype Args = {\n  /** Total amount distributed */\n  amount: bigint\n  /** Address that funded the distribution */\n  funder: Address\n}\n```\n\nCallback to invoke when a reward is distributed.\n\n### token\n\n- **Type:** `Address`\n\nAddress of the TIP-20 token to watch.\n\n### args (optional)\n\n- **Type:** `object`\n\n```ts\ntype Args = {\n  /** Filter by funder address */\n  funder?: Address | Address[]\n}\n```\n\nOptional filters to narrow down events by funder address.\n\n## Viem\n\n- [`reward.watchRewardDistributed`](https://viem.sh/tempo/actions/reward.watchRewardDistributed)\n"
  },
  {
    "path": "site/tempo/actions/reward.watchRewardRecipientSet.md",
    "content": "# `reward.watchRewardRecipientSet`\n\nWatches for reward recipient set events when token holders change their reward recipient.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"7c5c4a80757b69fb0cc9e78c15e065ab4f7f1e8dca7ffc4ca8ae3da467de30df\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst unwatch = Actions.reward.watchRewardRecipientSet(config, {\n  onRewardRecipientSet(args, log) {\n    console.log('args:', args)\n  },\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\n// Later, stop watching\nunwatch()\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n`() => void`\n\nReturns a function to unsubscribe from the event.\n\n## Parameters\n\n### onRewardRecipientSet\n\n- **Type:** `function`\n\n```ts\ndeclare function onRewardRecipientSet(args: Args, log: Log): void\n\ntype Args = {\n  /** Token holder address who set their reward recipient */\n  holder: Address\n  /** New reward recipient address (zero address indicates opt-out) */\n  recipient: Address\n}\n```\n\nCallback to invoke when a reward recipient is set.\n\n### token\n\n- **Type:** `Address`\n\nAddress of the TIP-20 token to watch.\n\n### args (optional)\n\n- **Type:** `object`\n\n```ts\ntype Args = {\n  /** Filter events by holder address */\n  holder?: Address\n  /** Filter events by recipient address */\n  recipient?: Address\n}\n```\n\nOptional filters for the event.\n\n## Viem\n\n- [`reward.watchRewardRecipientSet`](https://viem.sh/tempo/actions/reward.watchRewardRecipientSet)\n"
  },
  {
    "path": "site/tempo/actions/token.approve.md",
    "content": "# `token.approve`\n\nApproves a spender to transfer TIP-20 tokens on behalf of the caller.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"ac90d56fef4b8b0bb0fdd99d1f3d9e38719b2c463becd75cdc590e023c1e0813\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { config } from './config'\n\nconst { receipt } = await Actions.token.approveSync(config, {\n  amount: parseUnits('10.5', 6),\n  spender: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Transaction hash:', receipt.transactionHash)\n// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.approve` action and wait for inclusion manually:\n\n```ts\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { Actions } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\n\nconst hash = await Actions.token.approve(config, {\n  amount: parseUnits('10.5', 6),\n  spender: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  token: '0x20c0000000000000000000000000000000000000',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args } \n  = viem_Actions.token.approve.extractEvent(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Address of the token owner */\n  owner: Address\n  /** Address of the spender */\n  spender: Address\n  /** Amount of tokens approved */\n  amount: bigint\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n}\n```\n\n## Parameters\n\n### amount\n\n- **Type:** `bigint`\n\nAmount of tokens to approve.\n\n### spender\n\n- **Type:** `Address`\n\nAddress of the spender.\n\n### token\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the TIP-20 token.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`token.approve`](https://viem.sh/tempo/actions/token.approve)\n"
  },
  {
    "path": "site/tempo/actions/token.burn.md",
    "content": "# `token.burn`\n\nBurns TIP-20 tokens from the caller's balance.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"e5eb311ca3488bbee0e7931eefae4e3f14d1d9b3f00dad2aa580098254b3ae39\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { config } from './config'\n\nconst { receipt } = await Actions.token.burnSync(config, {\n  amount: parseUnits('10.5', 6),\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Transaction hash:', receipt.transactionHash)\n// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.burn` action and wait for inclusion manually:\n\n```ts\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { Actions } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\n\nconst hash = await Actions.token.burn(config, {\n  amount: parseUnits('10.5', 6),\n  token: '0x20c0000000000000000000000000000000000000',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args } \n  = viem_Actions.token.burn.extractEvent(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Amount of tokens burned */\n  amount: bigint\n  /** Address tokens were burned from */\n  from: Address\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n}\n```\n\n## Parameters\n\n### amount\n\n- **Type:** `bigint`\n\nAmount of tokens to burn.\n\n### memo (optional)\n\n- **Type:** `Hex`\n\nMemo to include in the transfer.\n\n### token\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the TIP-20 token.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`token.burn`](https://viem.sh/tempo/actions/token.burn)\n"
  },
  {
    "path": "site/tempo/actions/token.burnBlocked.md",
    "content": "# `token.burnBlocked`\n\nBurns TIP-20 tokens from a blocked address. Requires the `BURN_BLOCKED` role. [Learn more about token roles](https://docs.tempo.xyz/protocol/tip403/spec)\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"4c6f4c6c8a9a3012b0d32258ab141ad46f5a27fb53da72d2d92aecbf86789fa0\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { config } from './config'\n\nconst { receipt } = await Actions.token.burnBlockedSync(config, {\n  amount: parseUnits('10.5', 6),\n  from: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Transaction hash:', receipt.transactionHash)\n// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.burnBlocked` action and wait for inclusion manually:\n\n```ts\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { Actions } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\n\nconst hash = await Actions.token.burnBlocked(config, {\n  amount: parseUnits('10.5', 6),\n  from: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  token: '0x20c0000000000000000000000000000000000000',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args } \n  = viem_Actions.token.burnBlocked.extractEvent(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Amount of tokens burned */\n  amount: bigint\n  /** Address tokens were burned from */\n  from: Address\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n}\n```\n\n## Parameters\n\n### amount\n\n- **Type:** `bigint`\n\nAmount of tokens to burn.\n\n### from\n\n- **Type:** `Address`\n\nAddress to burn tokens from.\n\n### token\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the TIP-20 token.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`token.burnBlocked`](https://viem.sh/tempo/actions/token.burnBlocked)\n"
  },
  {
    "path": "site/tempo/actions/token.changeTransferPolicy.md",
    "content": "# `token.changeTransferPolicy`\n\nChanges the transfer policy for a TIP-20 token. Requires the default admin role. [Learn more about transfer policies](https://docs.tempo.xyz/protocol/tip403/spec)\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"782fbb9e3637fb97aaa75c17e78a39fa8f7ff7754db53d7b3ab76722d9c43fad\",\"data\":\"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=\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst { receipt } = await Actions.token.changeTransferPolicySync(config, {\n  policyId: 1n,\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Transaction hash:', receipt.transactionHash)\n// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.changeTransferPolicy` action and wait for inclusion manually:\n\n```ts\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { Actions } from 'wagmi/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\n\nconst hash = await Actions.token.changeTransferPolicy(config, {\n  policyId: 1n,\n  token: '0x20c0000000000000000000000000000000000000',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args } \n  = viem_Actions.token.changeTransferPolicy.extractEvent(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** ID of the new transfer policy */\n  newPolicyId: bigint\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n  /** Address that updated the policy */\n  updater: Address\n}\n```\n\n## Parameters\n\n### policyId\n\n- **Type:** `bigint`\n\nNew transfer policy ID.\n\n### token\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the TIP-20 token.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`token.changeTransferPolicy`](https://viem.sh/tempo/actions/token.changeTransferPolicy)\n"
  },
  {
    "path": "site/tempo/actions/token.create.md",
    "content": "# `token.create`\n\nCreates a new TIP-20 token, and assigns the admin role to the calling account. [Learn more](https://docs.tempo.xyz/protocol/tip20/overview)\n\n## Usage\n\nUse the `token.create` action on the Wagmi `config` to create and deploy a new TIP-20 token.\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"bac950d77bf219845f78904458b22c83c87e562f6ef3fc715d1a2f1ce5643b37\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst { admin, receipt, token, tokenId } = await Actions.token.createSync(config, {\n  admin: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  currency: 'USD',\n  name: 'My Company USD',\n  symbol: 'CUSD',\n})\n\nconsole.log('Address:', token)\n// @log: Address: 0x20c0000000000000000000000000000000000004\nconsole.log('Admin:', admin)\n// @log: Admin: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb\nconsole.log('ID:', tokenId)\n// @log: ID: 4n\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.create` action and wait for inclusion manually:\n\n```ts\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { Actions } from 'wagmi/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\n\nconst hash = await Actions.token.create(config, {\n  admin: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  currency: 'USD',\n  name: 'My Company USD',\n  symbol: 'CUSD',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args: { token, tokenId } } \n  = viem_Actions.token.create.extractEvent(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Address of the admin that was granted the admin role */\n  admin: Address\n  /** Currency code of the token */\n  currency: string\n  /** Name of the token */\n  name: string\n  /** Address of the quote token */\n  quoteToken: Address\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n  /** Symbol of the token */\n  symbol: string\n  /** Address of the deployed TIP-20 token */\n  token: Address\n  /** ID of the deployed TIP-20 token */\n  tokenId: bigint\n}\n```\n\n## Parameters\n\n### admin\n\n- **Type:** `Address`\n\nAdmin address for the token.\n\n### currency\n\n- **Type:** `string`\n\nCurrency code for the token.\n\n### name\n\n- **Type:** `string`\n\nName of the token.\n\n### quoteToken (optional)\n\n- **Type:** `Address | bigint`\n\nQuote token address or ID.\n\n### symbol\n\n- **Type:** `string`\n\nSymbol of the token.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`token.create`](https://viem.sh/tempo/actions/token.create)\n"
  },
  {
    "path": "site/tempo/actions/token.getAllowance.md",
    "content": "# `token.getAllowance`\n\nGets the amount of tokens that a spender is approved to transfer on behalf of an owner.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"39248a39ac64c814f65ae5d23e0ffb2fb9d2135d90759bdd100c74ba402498d5\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst allowance = await Actions.token.getAllowance(config, {\n  account: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  spender: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8',\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Allowance:', allowance)\n// @log: Allowance: 10500000n\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n```ts\ntype ReturnType = bigint // Allowance amount\n```\n\n## Parameters\n\n### account\n\n- **Type:** `Address`\n\nAccount address.\n\n### spender\n\n- **Type:** `Address`\n\nAddress of the spender.\n\n### token\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the TIP20 token.\n\n## Viem\n\n- [`token.getAllowance`](https://viem.sh/tempo/actions/token.getAllowance)\n"
  },
  {
    "path": "site/tempo/actions/token.getBalance.md",
    "content": "# `token.getBalance`\n\nGets the token balance of an address.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"be2aaf71065dae41e98187e9334b07b0203145c233743016fbab053ac04a5f67\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIBBAYzUYQwCKnDQBDDkgCcVADYwwAczT4kAdioTSSmA0Qg+AoSJBzGYXIgAMVXvknj+ZGQF8K6bFYLEXWuvogABTi5uJwAJScvCZcMWAAZoxKiJwAwkJJSgA6YCxsHNGZyZQgYpL6ACyaZooqaogAbFqSuoHxWaXmlkgAjHYOpE405IjS7p44eIQk5P70ePFinABGoeJgvDCpK8kWDKLa+uqytcqqGi06enhrchtbXRZWAMwDjs6jjRPUXtO+c2oASYrHYXCMgmEpXKUjGAFZ5HULogato2ngISYnj1EG8QPYPiMkAAmYk/TBTAwzPxAhYGfJgzhoCAAa0U0KOfWseIU5waCOorRuBmZbLA2Ne7yGnyQL2s5L+VIBpRodJACQArptjGBOG0AELrTYwAA8GUSyQAfEEOslUuashROFhHMw9GQ4KlMcIAHSixQ+g1GrY+gAKrvdpDgZuKSktEVSodIEGYjDgpu9cD9rIDQfuxp9ACU9BrSGAAGqhDUwS25MDiN1wF1bPV6Q35x5UKAQXgIAwAcT0cE4ABUAJKh4nWJk53V3B4wTgJdicDarqBQUjwLMq8RKPvIZAgOgNrAKUoAAyvaDguQZhWA0S34hoDuSTvwaDQWE4riXyeYTgAHIAAEAHc91TAB6GItyAu9QQfJkYFBX9/xTYDwMgxgYPYGAYIcCw4HgvJEK4R9MzQhIAMwiClGg2D8JoUESNyJY4ljTgAF4nxgF8YDfJQgmAXJOGiQjhFSZBmLYABdChRKZIZhAKG9UhE3UxM4aSULYH1GCgWTUk/b8ggiBTNPcXJXAiXI2NiVZg0XHjxAgxhwX4SEs39MBAzbJybVjJ0NLEpwYi1NBUiA6xaB9OKgIsmzcivC8QHko8XSGZhSltJROAAWnSWMfTSigMtdUpMobSNh0K8Mspqkr0pALc0FLKEqBHfBFx8xyOxgJr5LKTlEF6axTl5eouSudEDDzBcJVlKVhhcXFvg8X5KR8WYVWBAwQjCSIimEDiLRSIqzoQ1Tjs6Q4Kj6KdET5JBmkFa52ljRbcWWmVEGqBUtupQFVUCIIsGTHAOAwKIwogCLUgvGKABJgDEUgLCUVwL04AAfTgQq03hzEUSL0mJsA0BNEdlKbMEnTSCTcc4LVYCSSwoGCxStK08QNy3OBPR4PntwAbi57nOEgY0AFkNj3MgAH5UgAOSELZZfrXRSCZlmYDZmAoDFzSJc4OBkjAJXOCCMGIxGQWCZN7mHDgfBUgACXCfAjcd38oi4y1OCTFM01NN26HjHWwFZ54oEj6P2e9x2zaUMBuA1VR2EYAAvF9IUt62qrdO2vXTwh0ZznViwAR2rMQ/YDoPU3TE0AGVzbTjPy9zoRizassRy8CO8d1/XY+HqO9ZjxOTeTsBpe3eXUmEzhGzgeXf3U8WfdXxfODblPxBWBR54F+Xp4lmzuIbgCQ5NMPaEtc/ubin1OEqFe8M4F+n60iltk4bIZgeyhEAefP8eMABScAe5YF4HwcKFM46T3Zo/cWL9OCkg/luL+cVz7QNLFsS2I8p7WSZugsaWDFzoLxsJNBuDSEADJOCI1oCjNGGMsYRFKN2XsGJeAIK4C+CQ9gDYziZN1aIoQ5BW2YHAJQPp0wT1IBEEqd1YS9BeMSJ6U0UQzWFCAWGEUvqVB+kSRAZINp/3+DteYoNwYQEhpgKIPlUgjlnGOKAAB5Ug3BhYC24T2Pshg/HDhXGOAAIpwCACRxGLnHJOacPlVHDXuqNAAHBNJE/I9GBB8l9AUBJpRmIsZMbwQNdpqnrI2Zsi4lgQAULkIgkhjrQIUPaEw9TcBdkCXgLqi4Lx1IUNjZg0ANQKGdMmIgBl4CrlNvkcZsAVgaiUEoDGLTOniJfJwNMczUz3G1syWJuQIHiCaS3Xg6MsCnVaYuN0BI8hwEAvYqZsBY4rAwJwMCMAVirGTGBdMUYfR2TAH0j+UAxmLjoKpYcaAwIQFNjgXgjAki8CKKCSwFNPTAoAFQ8GYeaG52MibhGHGBdy+AV56EIFAYccANT2FXMOAZHSFA+jkBAISEQLxOmZcITpPoyDJlIGZbGGxY68puT6CCZYRWbLiGuFYi4NTpljocsC6MaBiI2B81WsAfQACtaVoGfMwIFYBcXcD1Oyu4zDBkwGxkRCQxobrJFLKItVGqerwuQBeexWwBYKLQN2dOF5ZJBBMlgT0UEoKQFgIan07AlBQR4XAKC9waBiHykQYklQfS0CguILAOE/Xbh9J+ZgcgADEJaBZiGDWgGGUdcg+prVmOtgrQ3hq/JGxA0bY0wHjYm5NgS038Uzdm3N+bC3FuTP6rM5aq2tvbaQZRr9QVKGtaEW1LL7WSLnEqlVnzyVwy4PeAQyhYnMP7YgO1wzRmsuBQAfWxdigA6pIPIygX2PtcRIjdEAbV2qiSsfVMB+BAWHEXalw5JCLksOSsgLS0w0ApnIDAuQ4AYE2PgZMkBlWcHMGyS9Kw/kAp4KGMcMLuofP5ihI+MAnSQG1rB2JHyljIZJmh3I4QsP2Fw3DYchHFxSKiaoRDuqBqGtNsavisjX4txgD1CRPrICaqEBMns25OBjigp4ztEao0xugAOrMQ6U2jozWgLNOa80FqLVBVtZa0AVsreIfKqmYD5SEPlVt+VBBRGXKQXIIzsEWEC8wbuvlgUAFFaCnnGcqtZYmrUAa3RKzpF5EDApSoa+yfLWXsqEkBbqch2WfPYHIKAQEIhG2jYHdGmLjIwFK/CuFpBKtOkOXWk9eXJWFaCMV5rZWACkxEnRATa5V6rtWoL1f2ILErZXJsczEd19OvX+WCvYEESwYFODRZXdtoCr7CAOLgE6aBUG1lrFjg4LAOB2bVZq7kOrSZ5ucC29rHeuhVxR2k04FkSknBeuk7AFdWWwB1bEgdoVqQTsQDOxdlMVLru804Hdh7BsXuze5ls5AMAmlyCMnCUacJscSy2ecy5aAfSkC1GOEF+A0zmhBlba9RBmCjU0ek2ykOcc8y4J4kDYGad07AAzrqzOhCs528ZxAHPcTjVxGk3nUOBeSzl/sMg9Y5AOdnduKCdAwPp0hCidQo1pDk9x1wfHhPZL5XVYWyGTRzHEit+rgnoQqeMCuWzzXFNtehD15pgWhvaDG51CiRoTRrCq/56FLg16tdliDxFiwhvCePvYcocxLxcTAvYpLaq3FgKvsYKVzghYANESEEBI2dqpUfqCBecJGwtacBRlUmArgACEnBW/KDID3i8z2+dzca/3tviGy8V6r7sPlYA+8D61j3zr8Ll1BbAClGLcXWAJbNhe5LF4CUZeiPcAWEPkpXly5sByJ6S9tBbjJhsLdkeEDAmZevDlBUP70E/k1r+bo7+n+vWXAzAGAJ+4yPEu26yrKkBMAQQJ6Togqo+wWEBO6bKHKA2i2rWFWVWo+r2DWak6OQ2uB7WK2hyPWYA4B8BmBRWOBnAo2CUwEy2025Ob2E+DBy2a+US621B6B+WA0n2O2MAe2MOR28OiOpsyOqgqOt2TuigBsT2M24+xByA4hpAcOp2kaSOV2F6N26OCh7M8kYigqBeDkXeJex25e0ic+NeYAdeaBtB0qYAzey+iGne1Uvek+g+pAw+BBs2HBxB7h2sM+th1eC+S+U+fhPBZhW+V4u4+4SAh4ZQimpQyA+CpAWwYaBmvaUEqyqgGoKwPoMQzARmcaqa/aUER8AGUEE6tm5gKwuEghBqkQaUQ0MI+gOar0k0yIqIQoH0ghX0aSpiq08oliio20NIIMeAQQUG0AUQtB/W32MAls2qToL8DiOooQ9UDYgs2qyAskCYnARAEABkVsAA1L0FErMOyrzFwt0rwgYEETCvCheGtmgNjGSqoJLKId0ANJwNLGMgIGeMJjoBqG6JinuqsIuC6ALAbE6N8RSmJrkEkFGFwMqqIuEJeuDCwJIB8isb9rHCJrzFAO5JCFupicSbSkUWIO5CbkII0lWDMmbHss0oci2kQQkEEC8Fyjkd2nkRFmAOoAmjoGmhYBqPmkKT5vLKmkKS8HrvsAkD6C8E5hWrzkEMlq0BCSTDBtgiJnCYehyReCbnID6OFi+CKvyd+IZv2oOmKeZumvAFZvUVOvZqaWqVWqaRaWgD6flK0JECotltfreLfidEUBFCXnCF/i0f1kBAIqkMNlVk6AIgEaoYLAmZwAiKtkGlQQ3nGQmcwamSoS8akJmdmV1rmXwdvmALkApouD6h6T6VaV2jaXkXaaZg6SOk6eOjZm6ThB6QupWt6ewBFr6aOS+P6ToEdIFpQtsokBOTqMkhIEkSgEeAfp2CAEQNYD6L0LudYNYO0Wol0XCCYmcDoniGiPooVsMaMaMGkgDGUsqLYosA5POMaDsHsBTByKksSOoLYOeX0TkrcE5LefiIMCtKMDmo+XgCuaUF3ngDeceSSCcNosiABTMQYO2AuKkGNHCAeQReKPIM8NNOBYSGMa4ENDELACCNdBRJ5CYFRDRBNthFBDJBACRGevjC6nlH+NRBhEBD6M0VkKxGGcsO+S2C5G5B5DqN5LOH5GgNhcaIFGdJzJpIYhTFFDFOoJUMSFAC8HCGkLwI0I0C8JUGkNYHCJotIMSHCOIC8CsGkpUJUPqLwNIDAOoHCNIHCAkNYCsNFisCsAlIpC4sBDFFOLwARVFdFTFbFXFVFcFWAElLWWJfynGUpVsIgMwRJTALzqUEXOIEgKAAEIoGbEILBQgK4K4EAA=\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst balance = await Actions.token.getBalance(config, {\n  account: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Balance:', balance)\n// @log: Balance: 10500000n\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n```ts\ntype ReturnType = bigint // Balance amount\n```\n\n## Parameters\n\n### account\n\n- **Type:** `Address`\n\nAccount address.\n\n### token\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the TIP20 token.\n\n## Viem\n\n- [`token.getBalance`](https://viem.sh/tempo/actions/token.getBalance)\n"
  },
  {
    "path": "site/tempo/actions/token.getMetadata.md",
    "content": "# `token.getMetadata`\n\nGets the metadata for a TIP-20 token, including name, symbol, decimals, currency, and total supply.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"17796bba722c896e3ea092096ebfba46eb5bcfc91851eb26e942755800833739\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIBBAYzUYQwCKnDQBDDkgCcVADYwwAczT4kAdioTSSmA0Qg+AoSJBzGYXIgAMVXvknj+ZGQF8K6bFYLEXWuvogABTi5uJwAJScvCZcMWAAZoxKiJwAwkJJSgA6YCxsHNGZyZQgYpL6ACyaZooqaogAbFqSuoHxWaXmlkgAjHYOpE405IjS7p44eIQk5P70ePFinMx64lDiEqnAuZx70QCupKSKvBipYqQWSgDcu/uwvCyhcKlgB8wARmR3YPucAEcDhAaAAVCAAa0UAH5UgADay0AAkwEu11ccM4AB9OAcwLAkpYoL9/mBxKsLmgrsoSfssOIDnAYFBYZxPhAIApxH8cXiCRZmdjcfiYITmbS9nADlgsHIMGlxFhWZ9khYuLyRWKoEK+aKBcT7pKMF9OZTqbdDZw0CDQgBlaWy85s1VgNASq1DYQJMgABU5jDOAEkWakVUo1TrNfrI/yib9XKVylJEOpZLVlKokAAOFo6PR4VYSDYSLoCpAAZgGjmco0aE2oXmmvjm1ACTFY7C4RkEwkT2n00ma6fqGlzbTw3ZMpZ6iErIHs1ZGSAATOX65gpgYZn5WwsDPlO1bIYo+xU+tZKvI6pnEABWMf5gzWqFgadWOcLoY1iu9deNrfNqUNB7iACR4vwPacG0ACyazFuIAA8GSJMkAB8QQdMkqTIVkFCcPSQyFmQrw8BBJgAHTPoo5EwXBmziORPqOERpBwEhxRKKhESpD6pAQMwjBMghOx/PsvBHCcYBnGa1zuo8zxyCR7xfD8lpAiCMDgi+rIIsiqJUuimIarG4qWmSFKcGiNKWvSjLMsqHJcjywomdqxl6nGlpSjKcoKkqoYuuqLkeYK7lau6cDGuycgydZol7NaEhyPaPlOmGarulS3JwN6pB+uYQYhs64aujGIVucF4W5K4qG5OZ8D0rwMBQXosFFvRpRQBAvAIAYADiehwJwoKBj6y7WEeL4rHREjkUB4hKL1yDICAdDkrKuBUHC21oHAuQHoUwDRCcmwwDhyR4fgaBoFgnCuJwCR8cwnAAOQAAIAO4LQJAD0MQnC9+0dodVowB2d0PU9r2fd9jB/ewMB/Q4FhwIDeTA1wR2TsIEOPfx0NfUov3/YjNAdmjuRLHEHGcAAvMdMCnedShBCJewLijqTIGTbAALoUPcWXCAUu3bJa3Ng2w5GMFAvOpFdN1BBEAuie41URLklOxNN7USHTnDiF9jBdmRwiUceYA0a1M3iBhHF4Wzk2KKkL2IuR7svSrrga2A21wiA/MrQR5KlJhSicAAtOkHFzYHIDB8wpQJ3oxGR5wTGESnrGxxQK0nGgRy9lQoL4M1VF/IW6z0bH/NlP2fS9LYw43r0/TUK0j4gLRuviG+FZVl+S6zuof6bj4sxAW2BghGEkRFMI1MoSk0dL0DIvz50oj14gvTLsuV4Zg0Q7aOOBhh33s4D8MLiIJU4weA2Y/bi2wGBEEWB8TgHAYFE5epFpihgwAHlSDcCgFAE4cBTBdR6hOcBkChrsE4IGAAIpwCACQrSl2GqNcaTtLanmTL0csl5m4NHvO3PMgRy4X1IZ+a+oxlyj28M/SeIF6pwEas1JYnIYC5CIJIeecBeHYRMLwzq3VeogBLs1OEPCFCYmYNAA4Ch8J8SIDLeABtLL5FUbAT4BwlAlXDvIsuDguCCR0QJOQgjrRYL4WAAAUuIARtpeBXCwIvYRqjVgLjyHAZ6H9iCaO1J8DAnAPowE+GyPiH0mTZ01mAGRKxlGqLoCLIaaAPoQEsjgJ4SReBFA7JYV0rxEkACoeCcDhMhbxMBMS8BsVAiJxt8A60IFAIaUp7AGyGnIsRChyJyAgCzCIcI8L9OELw8iZA+KkCVpibk2pJl1PIl9UgYAFlYM2NEbkbJmp2W1HYj6VwaBHgNmAcJAA5aAMByIACsulUkZswciuRKncCgsMz4oRqmmMxCjCQUluEcSOIKY5pyy45OQHCIJTUoHkTEF1A4aA4S8yCArLArwfo/UgLAR55F2BKB+jAuAP0bE0DEBHIgy5KjkVoD9RUcM4XwDgORK6zA5AAGIWVQKRRAFFUQlm5BhbytlSLZlooxddLFiAcV4pgASolJLJHktOlSmldKGVMp+mK9laBOU8r4vCqBaBYDHAiORYa2ClDfN+Ss3hDS9nfFxEybUH1WkCosRja49jqkKsQP8lJUAVF3MSQAfXKeUgA6pIPIygo3hv/jau1cghG8PQZ8e5MB+AvSGoWDpQ1JDNUsK0sgQjBI0FdHKXIkUpL4D4pARknBzBQj9Z8WJ8SeA+kDJk0u4TIFg0+AoPCkBSAGxOPY8JSxK2KDQDWskdb7CNoFUNVtzVQhppBKXcdNzYAPKeSdZgbLOC2hgGY5qMLIBnKEGo7qrLkE/SAVKzF2LcW3KVToFVPU1WUrQNS2l9LGVYGZca1l+rDXiAjtemAEchARzFRHQQUQEjsFyEoydFhUOkGYJsHsbywC5AAKK0HWqoxkvrVDNVtRAH5aaHUKMQIkv2jytZTMGcMlmL1S5yGGRE9gcgoAvQiL8HF6dqSi04Dxvj2TSCCbwnY/lKK2OrM40EbjMBeM5IAKSozwi9WTgnhOiZ+uJtUJFpM5MM1ABTOSlNoBU9M2Z7AgiWA+pwIjxwXMvWjYQCAWK8LCILb6n52oHAykUMyYTInchid4uZzgznx2rCgQtDd+JLISF4BCD0TgoWZfNaQJjYAxN7E83M1IvmOQBcsvxPQ+AQvrCk4qHARJYumf+Ds5AMABFyDlreHet52v/ANlwNxHi0DkVIHiQMSSGtwGQq/TgrnbmICIMwHe5Zlw7yzD7Ur+wdlAKzTmyb02wCzZLoJRbARlsBvW7Oaw0hZy7eG51rgAa1RkDJHIXVYGoE/ToDmlFPYUzqB3tIV7B2uDdd67zCOJyWtkCaIgPekO9g7J63adxjBPG3dW59jZoRfv3v+4D8SxgwApkaE0awe2OtQ84B910X2ie4YsAD3r4arIpFXLORJVNGfkmavTHzjBeOcAAEq0ZRkIF6vxTFrLjUEOEKDuS6HHSieqrgACEnBVfKDINruEMWSumfi6U1I+v1ecGjWLtNUuVRTLALrq3hvbMFdmbkP2iSSNkYOXASj2CakDPqdEJpZTCO+22qxqS2svX6zaLaZ55JbR1cIB9JW8vtazIT3oJPR7U+rHT5nlTXBmDyhD/rNz6bBm1N4UEL1eFZkm/QxX9jdy1Maa0/xuTQmTdxYkxZzTMmBM2fOV61vdeOMjPU5ZzgunPavWs8Z4b5vJNz+s+7ifYBy9T7uUl1zMB3Ple81V/zcBAt1dUI1sLiOiTRZM2Zi3nBkAn6KzbvzNWgv1Zv81iLRJ+ZzlPdI8Bd6p9ZRdxcHcZcwA5dJ8Q9FcNlldXcNdgAtcXc1dDdjdH818SJkCbc7dJdpcnd0CDdSBtd3dgC/Z5pFokBloyhz1ShkBhEjgmp0VX05UfpwxVADhPhyIYhmB318UyUFUfph1aMfpNUgNzBPh4Z28D0IgA5a4kx9BehpA24FBD5RxKFT55wQ8L4ah6FvwbBmEmwJ55g34C1oAog98hkZ8Us4A0tWRuQMA8J3ZCVPEexQgM5yQSJnDkBeZuJOAiAIAZZlsABqXodBWYYZdYBQqgUlPAHA85OEezTED1VQRnI/boO5TgaCFRAQDaCdJQD4OdIaXgZ1ZqekKBZkPCdItpKjXIJIViLgQ5XpP1D+Z4UgcJewtLC5bUTdA2cBY2TwtNVo8ISyHgsQY2YHIQfhUIA4LRAPaxWxaFWFCTBIIIcsMZNgmVDg3DMAdQQlL9boA4BlfYhDNLMlfY8sX7NUBIcicsCDOQH2IIKjIoko0pCdDdcXKot1c5GFYHOQcibDXDNABZHYm6N9BVT9YlUlX9eAf9SQ7VEDH6QEp4rlQEkEzYLE/9VoSIS1ZjaPPaWPBeIoPELgemW8LPOQzvGIck1IbTITPCOk10fvM3QfVIFktAVIe8c5ezRzafLjLkxARfLktkp/STYUzgXkxTM1bfb3SPM9S9OENEnE8E6VSEjg6EtlZVOEilBEgDLVYDOGNEjlblTE9gUEnEiOPElDJBDDZqLDS0vDIQOaFoGglAFaAPYFUoIgawciXoAM6wawRQreM8cHNMDQkcS+bQzuTjfQq+IwrMEwgCMw3cdobWSueCMWeKQ4Y4U4J0bnOSHNBSJSD4b4Ugd0dSMEC2HSREFEbnDEMqKqXM+qWKC0XM2yN1ByXhPZMKaMfszyXM7yR0PyZUQKZsgcyqfUCKKKU0TLc0TKG0ZKB0OUAKEqN0S0IWHKX0f0QqccjcycokI80yMABMMM5MZcXoIcKMm8HMWMwILMjqeQMsFMRMoeZcW8FM8eHcV+PAd+T+MgTAKIcSfMqSQsgyZQCRWBAwNICSAs5bO5JQK1bIEAAAVVtBQVQstUIX0D3goVvIaHvJPk7lAskjOATPnEGAYQrEqG/NYXMLwA4S4RrwcQEXHVMVEXb2gqkWSQY1DyURDVUSCQ0VgCLSsUKP0UMWMVYu2QsS6RYDFxWPsVyGcVcWx1x1MWmj8UEkCXURCTZHCUiWiQ7QgDiWIgI1yGSUEtDUS1oAyStGyVyRLIKSKTYBKVFgqSqWD3bwaXDxaQyMsM6QmJ6XGP4tsNGXGT+XgIPzGT6OirkPWU2TitUB2XKL+BdVaIhWNny2cM4D3TuUeQXJeQIw+S+Vo3tSDUBW5Cag3mSDBSOSs0hX+LWJJ3FTlJRRfRlShI/R1K/T1PVURMA2RNAzavRLFXsyFXxBFVapNURTNUlQhNlXlV6qONhNVX1I1WGuNOJzmrNKNTaolQtStWSRozowSrqSdQyv90FDqPjwOgEGUD9ThADSDRssGQjSjVjQ2WuETWTWo1TVkto2zVzXzXq2gCLUnVLSow4pMFnWrQwFrQwHrRXWbXXXbU7XLW4B7T7RgAHXgCHRHUZyQWLSnQrTEDnQXXCGRuXSEFXRbUYDbQGO3XLQKoPWKp8KtSVL9SvQ0nQT+DFUfWfSWp6qELWu/TJU2qGqNJ1T1X2qgxgzgzAAQz+zgCQwgDtNIHQwRk4CdJwxdMth91I1YHI29PDjeLOsqpDzhGKy9yJIFI7xny7xH17xX1NwlKH2703z5I6ocxJNUydrnwX302X3FJwPlmHys1H3d35P9qcy83mWrzf3UzPy/yvwayetCz/1ayiwiDDsH0SwTumlS10HivKGy1y1qtlMK2K32zf0q0/wv1q2C0zqa3CxzqgDR1Gxf0xz6zvEGy7p2XGxx1OxmzmyuyECWxW1gDWw22IW216Be3dre04COxBtHvO3HoW0npu2npgFnoeye3LCXv23R3e3x2Z0Jx+zFQB1oCBwp1B3B0Huh17rhwRwiyK2p1R2XoZ17uHtxz3sQAJ2+12tZVvvvpB3UGp0aFp2fuJpnuAdZ3EHZ17q50gp53LD5xAO1jAJF1t0gKIOERgOpNWSSqQIwJQLQL1woaN3zvM0twofwIIcdyIZIPV3IJ9sKztrhCNr91dUD1kT3z8vCAj24ZjwF3j3pkT2T2YELxgGLxNwFxzykbzxkbkYUZIbLzbzqSryP1YvIj3wbxRSbwtV+DgJpMDsjp7yMzoefw32jvH2Ux320emU7yDr0yX1HzdoH3oakyse9rsW313xioTsP2P1CZ80bsvxbvDizvbsiz71sck1fwTobuqybu/2v1btv3/2ZEALsWANL0F1WHAPwft0Idl1+GCcSqVxV0Yc1yFx12odINoewI5OaetzKcIJYaEDYbdyAOOG4eoKWi9IYKoCYIFVIFYI1OWs4NaR4L4P4kEMVWENuVEO+QkO2ukNkNWUeQUN5iUO3lXAIuvAaBqBIozO4pfJnHvMMKHmsG/IkCUFKHqjwHjIvLwvLBOc0JsEYtgvgvAtSAwpQQvlueoqMIeYfg3BYUAj+eCCCusPgLUx6N0CcMuVcPdn8wpy8OYl8MuX8MCOCNCKCAiKiLIBiKgDiJAASIMCSLsRSN9rSNaUyI+myKtTyLkAKNUVaA+N2l2WuvwhEZqICvqNLkaMYGaNdUFHGLeI6Nwy6OLocNLqWQNnF3WCgGGKEF+TGK6UmIEALgpzmLkAWIUuWPHTsVFXWM2O2Jmb2O5EOOVROLOO5AuN0CuO5BuI6NdHuMeLNJeLeJ5dWE+NJoGN+PBVWNVOdLBJtfYJWrFt1I2sGsNKAx1VNINXNIEDkBxOtNtIJMjxY2JIFy5P1ipIdoivUylMZNFIFVZLad8alJlLs19rLdpJre5OrfJKSZIgbZjubajx4cVPPRfxVMzeBKjfVNjeWZhIlvhK2plpRLTcNQtP1rQBzZ0DnmwxSUw0SCjfw2GdoK9IsCal9P9MDMbhDIOY+ZXEqDnEIv7gfLeZGVBffJvmTKhf/B/Jfinl0NJKfK2E4EdnZgBekgXNkktHklw0UjeHLNUlzOrM0lrPhHrP0nNCbMHNPNJCF3bPdC7PslDEckZmcl1C1BPINGHNXPlEVAPIjHQ4qmI5nK8jnJilA7in+ESjtAo/XIyi3M9B3Lyj3IwGDGo9Klo9I/jFwpXBgYPmjOIo7kfJtmfaosXBvk/PothfTP/KCS/mAs4Ag5eGg5UhbBpZABQRLMg8QUwTePLjdLrnDOXEaEjNOezAfECD08UkU7uZvhITU7TL/IMGYry1YrmNhvby4rqR4rwD4retSUqP0rEu0SWMkqiWkt9S0tSvkqsSUvNZyQaKcRcXEH/q8QzV8QcH8T0uCVgFCSMqiRiTMviTZUSWspi7socqyTszyUYFcv4PctKNtrADKp8surDxEZFfaQhpCraTCoVzUzGQmQV1isWQy3CrIZSvMX5f2SlcaoiWarsTyrZqKsuBKveSqUtvoyqoXhqpBSXgavORORypar1VSJFq1NWoTZ/SluTZGtAYRX2omt9qms7rAEtbGqOtIC6s1LjZWfFoGr/U+52rlvTYOpNVB8tWtQBoqrO+tvW8yr+LupRV1p9SereJetW2i6ErDUj0jRjTjV+vKSTTR/KvOq0uBpOzzTG+CtJuhp3XJqrXnURuEBpobTprRsZovVq/MvHWxt7TJsHS+CJrHS+LJpnQpoRtyGppRuF7XVF9Va3RhvytuXZsO85tPSHbeN5pvQFtVqFvB9me1Oh8Tdh6RPh9VvRIVo0iVpVravVs1u1u3ZxPw14ZNv9wEcZ6tt8r64LZbcsa9q8a7Yjpj9717eRT9um+j742Ds8ddrj78YT/k04e33m9CaToidToyfTt/3ifvzzrrc+KS0Vd6JVfLpyyyirqbZrsh3ro/3SeiZ/2yezoSbgZh1CH6wHp/rPtPQ0o3ou3m2u3oDxxnvu3np2zpxG0O2O34CmzHsu23uZzn8Afu3LEe2exX5XqZxGBAZvrJxmMp3UDB1UMH9fvhyGA/uR2/tPu7r/sn/n/3sQevtVvAfJyQNoGsDMft3TP4s4fsbOErKg25wo5MG5YfnDgyFylMCCUBJ3LATjqDIyGdTUgpwAaarAmmyBVpqvnaZ4EumaA1hh036bV1KC20QPoUQoxE8g8QjYblAgj721/aXASRi1DQD54Xk6jMyiXk4GF1x0KjXgWozTyCDFGmZFxqonpjV4FchjRvCIJbzOMbCbjfxrHxr7r5NBifRxn7WqYB0uM7jRfAZi0EkDfG9jPQYEycaGD46cyMJh5hL5RNm6vfWJm3Tvy51s+KTCrF33Pw98sm7gnJh3XyY5JCmwg3Bq9HIEVNiG5jUhrUzwL4CYAhAmhlgQsHP4yBqAmIX0zIIUFBm/bfdp6XoKbQQAEzFgjAGe44ouC+ABZvwSnarNYA6zcQk722YK49moZWzpeVTDScbw5zOTosD0LXMrAaYTzqMEhaTBvATzF5kLkfbPMr2KOboWQiQBNw/OJnMzvp04CL0L4Iw8Fvcx86/lv2QQBFivCMFHDWUjhVIM4QxbuFsWcgbwsekuH4sAiqQIltqBJaRFmwFLKlsZzpY5IGWyfJlhkTcxstci+RHHNyx0C8syiFRQVtUTHx1EVKKESVjq3aJXB5W3Rc4cqwywDF1Wmrb7JtzaJShPgUxA1j2CNYmtMuNibLsOy9artrWNvO1gcXFpOsfo5xekG61ZEetbi3rB4k8X9bYJA2pRRXqGyFZbcASo7NUjG26ovd42/VB3gaSd6ptR2+1ZdlaSjY2l12edSyv23Ebaxi2lJEhq4ydqVsmSZJWtukMlJtseSSfAvki2NFWiO25o92uHTNHclpSNopxgqVyDc1xRYuMdiuwnbSjIe07GHgqO2pKi/RKozNtm3VG2kHo9pHWnrVBJ7t3SIzMoEexKF+kAyQZC9oczs5Zgagd7GMhc1mHbCX2owN9hMNMIHCQIAuP9uIBzL/AyKBZbDuB3WFQdGcMHSsmpGBA1ltISHPSI2SMjTkhymHCyEWRsgMhuy+HXskRyjDHlaOEUCjmOS44icRxoUdcWR3+CRQTQzHCcbmXY4rlUoq4zcgeN465R8oAYQTkVHShrj6OC4zceJ3mGH8m4RY2TlQgLAKchhMgcsSuF/Dvsn46nVYQBX8xAUf4xTfeixzmHUtJEeAK5MgIwR+prOEnQ+j0IaCkISx/nGYd+LGC/iHs+wr9uwiFycJAupiYLqxTC7iJ4isEgwFFyx7vVYuFXLROIAkp6JkuRiVLpXnS661TWWXc5LlzUoFcv+WlErtyF0p3pRKgoMJBEhq6mUJeDXSPE13J4tdOwmSJypwhcoBg3KQgXrl5U+SDdHUrAoaAiKCq6tQqfSVPpFTm4hMHBcVFVstyVyrc0qMIrKk1Xu67dLk+vfdAdxkalUTugNfigCgu7Ao6qxRE4Ftzu5nILWs1cDE9xmai0oeb3SWkm0VEokEehqP7snwB4zVHuC1Y4DbwSkhj5Rc7FNmlJd6/dVaKPE6imgx4XVDJ6VDbq0Tx7eoRYIfEnjPTJ6hptRVPb6vGiUB/UGep3IGuvzQBs9TJivLnuWmV688F0S6IXk2i15to3ickrtFL1xr40mQcvGAKOhJqToqM06OGirz55q85pqNRad8V17c99uh6F5Cem5pm8SeFvO9Camt6VD6h9vd7ilPDFlSxq8taDO73gyIZkM8YrWjvkTE7sV2AfSPL7iD78MmB6Pc6oFPYFwhdRFjYwboJsbaDPaLtPPtXVtFozZ8VjDPmYKz5Yz4+OMsfHjKcaF8HBxfBwZE276uDAhbIDwbk0SZYyRB9pTEelm1BN9K6+WUHrXXpyd9S+AQjOkEP75tZQBXWV+v3V6BDZpZY2Sfpv03rb9Z+XAffnPS2zL84Ga9E7CrOn4T1d+Gsu7BtkP5H0T69OcfuAKvrfcyUV/B+rfyfqKye6sOJ/ojk/oo5lwcDT/hNm/5ANL6F/f/g7KAE04T+DOG2SAygEc5QgaDc0HAKwZFNIhEBcpj01iGYC7k2AxIagUaY5DiBzo0gYw2iFpy85SfWgQO2IzG0GBZtZ6iwMaQiNkZqM5YNwOkYF5JBGeaQaSWUY8C+BKeduUILrGyDhcLLfRkoOMYqCzGagu0ejNz594yZOfCmVvlsFDzy2ztHTB4xJmYyLR2MqOtYJyRBMV5B+OmafhcGZNxZLM4IQkwfzbyuYIs0+eXz76V88meQ0GUnOQF4MshacjAXYKwEJD6mOcggXnLSEFzfGmQ5htAVLkDNQZVBVMQe2KGMFmCUzCofFI4LVDahSzbUssyaEyEWhjAGQm0MiAdDlCP4b5tGT6Efiz4gwswK+Ubh4Txhj8SYQtGmGrBSxz4+WWhOWFwt4JFkNCnkBoDagk86qPXJyCpEXxaFSnQeDfHoXQtqxhEiwuDUpYnCjRLMFFjADRYuFOAbhLFiMXuF4sMABLF4SETeGktPhEAWIhF1pYF16WqRUbsCIFDsswRhRQUZ8Qakuow28I5lrlyaLLAURsrNEZIAxEl0eZOvQYhq1uEEjxiRIkkdf3JGLFFKVIh7lay2IMicU+xB1scQsCnFORytdkfAGyWet1ivIv1rkFeICjIRQbPliGx+KiiWqkbAMVKIh7vSkps7aWqVJNLKjEeqo7ErGM1F5sxGhbPUW2xLaGjBSFbK0fPlNFil55PbfPtTOnljL6SjotANnxmVUy/aXosAD6JHZ+jJRBUmUYlLlGfTHe309pZGM6XRio2a7RaJrS3aOkIZyY10oULoLelj2VALMWe2DJELt4W2W9k52LH9CDA7zahTOHEWjDswBEthJc2WD1jGxYkYDhBUXJting5nAzhWSrK9iEO/Y6pMhyHFiczIWHKCThynF4c2QBHPspuLxXkdUoK44qDRwpWLjGOu41sQeOXIpRHQJ4zKOeN3IFRrxwnIKPeI3ECqyO55TofoHLDH0OFiAd8ToXrFiKm4YKuARCrhYgTtO4EncdFHbIWKQAtoJjugks7YJkJz46oJKuPgAqygTHOVXhK2xKqNOWElLCxTIlgB2KFEpRQoC1V0TfKwaWyiJU0TiVEubEgxBxKeppc1uliJYnxLsQCT8uhXWSqJLK4SSDK0k4yuL3q7ailJtldJKpMcrtdNJhSbrjpItx6Tqkdc/yiZIUVmTJuFk+ZbNzqmDIFu8VByYgSclxAXJfxbKlFJyR7cDePko9H5M+RDTAputYKbVTDg3d21+WYHnNTimTs7ezSj7qlNGp7VEemUr1NlKB4xSEUoPPZcGL6rrUjlYY+douvAwVTDqeU0gKj1OoBSg0rim6u6k9T48HqbU16vRJi7dSvqNPBNHT3+qh800zPEaWNPLUTSYAZaELgHiOmzTBeZ0hmktOwQrSsaONGXgTS2k7Tx0pNfaTz0pr891etNBadBounoI9e10jmsei5qm9sE5vZqLekFqBgn026ppYcuSnHLD1ds13v9JoAe8gZGtEGb7zuX+9XS9A02iHwHX/JG5AygmWvOsZzyb5C83ebjLb74zThEm4maHXnlWC5NBWBTfYJczHz5kDM/wUzPPlxNPB7M7eZzOSzcyy6WWZvl+AFlnqhZ+wO+YzLPkV9jND/WHHLIVnv8h6yss7IbJ35T1TZm2BepbNX5cA9ZG/XzVvXVn+yD+R/Y+uHOtkX1z+ROS/nfUAFCBH69/F2UPz6zuyX+X9b2S7N9kj1/Zv/O2QAOv5U4w5cDSOUgxQac5YBvOBAdg1JLJzi50BDAQrizn/yqGRA4BT4wyFFzP5ECqgbkM4blyBNwfeGcWqx71y2BhJFGWJubn48xBvc2Rv3M7nLBu5rc/gRts0YrAh5ujdzIoJDxGM0AJjc9ZPJ/mO0Z5FM7xuyUsEYzKZ+85eeoLT7rzTBKm6TWpue3oJXtNk7TXo2Tp6a06MTC+ZLK8HzyfB7ANJvpuc2PzjNoQkQYgNa3vyohw29AVUxXndbcBSQlIS0360PbBtuA9rcQVG0cMCm+QmBe3A9LPKxmpQxBdM0nZoLeCdQzBSITEI4KtmeCnZtMnaGXtRVFYW8KQt6EucBhVzYFVYFbh0LHmTCqgK80BVPtnxwuyVSsO/Y6qmVnAYFmIrbgKrpFH7BiravhYKLEWBM1ReouuHaKtWdw3Fo8P0XPCgiRi8Ih8OiJmLKWWq34dUhsUIi7FlgBxZy3BEbpylQom9bCLdS1FPFYrJET4r+IytsEcrAJfXyxH9E1WQxcJSiKiX6sYlTq+YnErNaJK7i9IpaoyPSXEoWRbIy4vku5Grsil6bfkUHuKIVLIa+G9xbUolHjsGltvV7gxpaVw8IxQJKMWLhjErsNR1yvpTqKW3UxySwyqPkKXGVVtmSbbFZeMsbYaa5l4m4UksuX30l3Rsy9ZXQMHbKk6loJQMY0tnU9751Jy1Eh0qXYXKV2VyjdgmL967tHlsCooS8szGnscxXy8MuWEaC/Kfmc4TCWYCV2S6G4eEysQwtkWQrxd0Km2LCqA5gUQO+4/4G5zLKGd0VGkABGADrKDj0GaHR8fivHHoMiVhyHsk5FI6Urtxy4qjieMoMMrhyTHZlWx1ZWcdaVroTldlAvECchOdB0TgwZFXELnspCN8WLoMCyqcJ0uiRTRRRz3wqxqZGsW/C05gTf4rB48ewYYDUSYK0iZchMVSh6qkJFsGzkIfLDSAAD0ZKQ8AcPFsq5QOuq1ZAZkVPg5d4AGYYruglCHKg1gG8n8rV0gRwQSUU9GwfPbBkQjoRsI2EdfCSGPwuwqRa4FrgxBYA7YdeFjFNhDR7oeMZ6AZlhg/QeYEANGA9QA6hTcYUMF6ORFkJZAKYwg+sfrENjIMTYFONlNZ27hVwJAdsJeA7EFgWwXYiIcaLwHCP9GBjgx/o57HVgo7FNcFJA+cEXz1i+C8Kn2JZPUymdkV+naYzbHIhoH5j8yl6Nwv3qrGe45EeqJsfE0a6NVexlowxHVWcgjjim/w78hsNTG8IMx6wxRx9ilBK4SAUAAEEUAB4hAeAXaCAFcCuAgAA=\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst metadata = await Actions.token.getMetadata(config, {\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Currency:', metadata.currency)\n// @log: Currency: USD\nconsole.log('Decimals:', metadata.decimals)\n// @log: Decimals: 18\nconsole.log('Name:', metadata.name)\n// @log: Name: United States Dollar\nconsole.log('Symbol:', metadata.symbol)\n// @log: Symbol: USD\nconsole.log('Total Supply:', metadata.totalSupply)\n// @log: Total Supply: 1000000000000000000000n\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  currency: string\n  decimals: number\n  name: string\n  paused?: boolean\n  quoteToken?: Address\n  supplyCap?: bigint\n  symbol: string\n  totalSupply: bigint\n  transferPolicyId?: bigint\n}\n```\n\n## Parameters\n\n### token\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the TIP-20 token.\n\n## Viem\n\n- [`token.getMetadata`](https://viem.sh/tempo/actions/token.getMetadata)\n"
  },
  {
    "path": "site/tempo/actions/token.grantRoles.md",
    "content": "# `token.grantRoles`\n\nGrants a role to an address. Requires the admin role for the role being granted. [Learn more about token roles](https://docs.tempo.xyz/protocol/tip403/spec)\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"5e8451097f9633d21d3a3cdfc8f44501a3bb693043aa17e5311b84bfc53aca06\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst { receipt, value } = await Actions.token.grantRolesSync(config, {\n  roles: ['issuer'],\n  token: '0x20c0000000000000000000000000000000000000',\n  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n})\n\nconsole.log('Role granted:', value[0].hasRole)\n// @log: Role granted: true\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.grantRoles` action and wait for inclusion manually:\n\n```ts\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { Actions } from 'wagmi/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\n\nconst hash = await Actions.token.grantRoles(config, {\n  roles: ['issuer'],\n  token: '0x20c0000000000000000000000000000000000000',\n  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst events = viem_Actions.token.grantRoles.extractEvents(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n  /** Array of role membership update events */\n  value: readonly {\n    /** Role identifier */\n    role: Hex\n    /** Address that received the role */\n    account: Address\n    /** Address that granted the role */\n    sender: Address\n    /** Whether the role was granted (true) or revoked (false) */\n    hasRole: boolean\n  }[]\n}\n```\n\n## Parameters\n\n### roles\n\n- **Type:** `(\"defaultAdmin\" | \"pause\" | \"unpause\" | \"issuer\" | \"burnBlocked\")[]`\n\nRoles to grant.\n\n### token\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the TIP20 token.\n\n### to\n\n- **Type:** `Address`\n\nAddress to grant the role to.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`token.grantRoles`](https://viem.sh/tempo/actions/token.grantRoles)\n"
  },
  {
    "path": "site/tempo/actions/token.hasRole.md",
    "content": "# `token.hasRole`\n\nChecks if an address has a specific role for a TIP-20 token. [Learn more about token roles](https://docs.tempo.xyz/protocol/tip403/spec)\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"85a38813b3282ff4bd2875a74fa06ec2d675d0c901545edfa0dbfa76002d3c25\",\"data\":\"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=\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst hasRole = await Actions.token.hasRole(config, {\n  account: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  role: 'issuer',\n  token: '0x20c0000000000000000000000000000000000011',\n})\n\nconsole.log('Has issuer role:', hasRole)\n// @log: Has issuer role: true\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n```ts\ntype ReturnType = boolean // Whether the account has the role\n```\n\n## Parameters\n\n### account\n\n- **Type:** `Address`\n\nAddress to check for the role.\n\n### role\n\n- **Type:** `\"defaultAdmin\" | \"pause\" | \"unpause\" | \"issuer\" | \"burnBlocked\"`\n\nRole to check.\n\n### token\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the TIP-20 token.\n\n## Viem\n\n- [`token.hasRole`](https://viem.sh/tempo/actions/token.hasRole)\n"
  },
  {
    "path": "site/tempo/actions/token.mint.md",
    "content": "# `token.mint`\n\nMints 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)\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"46f1c80e43ab006ecc429ac40c2ea48df2c7b1c8e47b608bc34a4be0659f09aa\",\"data\":\"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=\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { config } from './config'\n\nconst { receipt } = await Actions.token.mintSync(config, {\n  amount: parseUnits('10.5', 6),\n  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Transaction hash:', receipt.transactionHash)\n// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.mint` action and wait for inclusion manually:\n\n```ts\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { Actions } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\n\nconst hash = await Actions.token.mint(config, {\n  amount: parseUnits('10.5', 6),\n  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  token: '0x20c0000000000000000000000000000000000000',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args } \n  = viem_Actions.token.mint.extractEvent(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Amount of tokens minted */\n  amount: bigint\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n  /** Address tokens were minted to */\n  to: Address\n}\n```\n\n## Parameters\n\n### amount\n\n- **Type:** `bigint`\n\nAmount of tokens to mint.\n\n### memo (optional)\n\n- **Type:** `Hex`\n\nMemo to include in the mint.\n\n### to\n\n- **Type:** `Address`\n\nAddress to mint tokens to.\n\n### token\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the TIP-20 token.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`token.mint`](https://viem.sh/tempo/actions/token.mint)\n"
  },
  {
    "path": "site/tempo/actions/token.pause.md",
    "content": "# `token.pause`\n\nPauses a TIP-20 token, preventing all transfers. Requires the `PAUSE` role. [Learn more about token roles](https://docs.tempo.xyz/protocol/tip403/spec)\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"a6393fccb27fa70eaa319de7e39d7a619889bb2d3f5ab63be266ef0351e444c4\",\"data\":\"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=\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst { isPaused, receipt } = await Actions.token.pauseSync(config, {\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Is paused:', isPaused)\n// @log: Is paused: true\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.pause` action and wait for inclusion manually:\n\n```ts\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { Actions } from 'wagmi/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\n\nconst hash = await Actions.token.pause(config, {\n  token: '0x20c0000000000000000000000000000000000000',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args } \n  = viem_Actions.token.pause.extractEvent(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Whether the token is paused */\n  isPaused: boolean\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n  /** Address that paused the token */\n  updater: Address\n}\n```\n\n## Parameters\n\n### token\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the TIP-20 token.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`token.pause`](https://viem.sh/tempo/actions/token.pause)\n"
  },
  {
    "path": "site/tempo/actions/token.renounceRoles.md",
    "content": "# `token.renounceRoles`\n\nRenounces one or more roles from the caller's address. [Learn more about token roles](https://docs.tempo.xyz/protocol/tip403/spec)\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"30d2bdf2635250f6359f0da611ced8b75cdd1e915d48aa5fa8de4385cdfaa662\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst { receipt, value } = await Actions.token.renounceRolesSync(config, {\n  roles: ['issuer'],\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Roles renounced:', value.length)\n// @log: Roles renounced: 1\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.renounceRoles` action and wait for inclusion manually:\n\n```ts\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { Actions } from 'wagmi/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\n\nconst hash = await Actions.token.renounceRoles(config, {\n  roles: ['issuer'],\n  token: '0x20c0000000000000000000000000000000000000',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst events = viem_Actions.token.renounceRoles.extractEvents(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n  /** Array of role membership update events */\n  value: readonly {\n    /** Address that renounced the role */\n    account: Address\n    /** Whether the role was granted (true) or revoked (false) */\n    hasRole: boolean\n    /** Role identifier */\n    role: Hex\n    /** Address that initiated the change */\n    sender: Address\n  }[]\n}\n```\n\n## Parameters\n\n### roles\n\n- **Type:** `(\"defaultAdmin\" | \"pause\" | \"unpause\" | \"issuer\" | \"burnBlocked\")[]`\n\nRoles to renounce.\n\n### token\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the TIP-20 token.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`token.renounceRoles`](https://viem.sh/tempo/actions/token.renounceRoles)\n"
  },
  {
    "path": "site/tempo/actions/token.revokeRoles.md",
    "content": "# `token.revokeRoles`\n\nRevokes one or more roles from an address. Requires the admin role for each role being revoked. [Learn more about token roles](https://docs.tempo.xyz/protocol/tip403/spec)\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"4331bbb216753b0e0d034449438e7597cb718b5c0bcc79635d29f21308e5a7b9\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIBBAYzUYQwCKnDQBDDkgCcVADYwwAczT4kAdioTSSmA0Qg+AoSJBzGYXIgAMVXvknj+ZGQF8K6bFYLEXWuvogABTi5uJwAJScvCZcMWAAZoxKiJwAwkJJSgA6YCxsHNGZyZQgYpL6ACyaZooqaogAbFqSuoHxWaXmlkgAjHYOpE405IjS7p44eIQk5P70ePFinKQwvDCMWGipACpDwsOCYABKaxtbpeVSiAAc/bXKqhotOnp4q+ubDPIWVgDMA0czlGNwm1C8018c2oAUWsU4RFCAFcYKlVuIoEI5BhOMBcpwCSsIApUgADay0AAkwDEpAsSlcpIA3PjCU4YkiwNtOOSqTS0HTlIyWWBCZw4IpYKQyRTqbT6cLWQSHHBjsTUZwAEYQdXiMAi1zIAC6l20+mktge9SQAFYXm08Ii5Ciur8kACQPYgSM+uowZgpgYZn4YQsDPl2FwjEdTFd9L1rM0rU9EDVtA6DNGTK6eogPV6hsD3X9/RCg1DSjQwyAI4U0BAANaKU0VPq9SryOopu3UVpvAz1ptgHP/QGFn2ISq9UuBnyzSuwgwJTn8I4rGBERswNUKOAAZQwYF4AB4MolkgA+IIdZKpM9ZCicLCOZh6MhwVJZ4QAOkHim/qybk2O7wAeR7fgACi+b6kHAp7FEoF4RKkEGkBAzCMBKx6AVuIH7oevDfqcaBIqQYAAGrIjAF65GA4ivnAz7rOuQHbuq+FHqUmK8AgBinKxcCcOIRIKJwCTsEJnA7AAkhBABM1icH+YDfrkuQAHIQDQuz4JhnB6cJcAEfgaGQEigmHEISkOFwADu4iMGggniaQ1kwEp+xwJZor1rkmruRYvDOrAUCcFZwmanIEC8A2WowC57mrCRZH0pJqyMSYMDfpW4hKLxyDICAdD0VgCilKSFVObktZcMA0TojQ97JI++BoGgWCcK4YlocwnAAOQAAL2UoGEAPQxKsfXVawka4kpMAzZ13Xof1Q25WNE0wONDgWHAU15DNhR1V+gldQkPWrcNG3sFtNAzftuRLHECGcAAvPVMDiI1CFBHiorRDtwipMgd1sEaFCsgKeoZRwH64kqnAgwtbDfowUBGqkrXtUEEQQ/97i5K4ERqUe8LpUichcO94j2Y5PCriYv5bipOHAexYG8NeCGPn9BLKakfUUt+wt9XjBLnehAtCyLYsifAwN9ZhcAoqQfXg4TxNgBVpIgODhXPkMzClDeSicAAtOkCHZXrIAG/RpR26+IyCRbUGGzBcDWxQhVJaRwilDs+DuVDBwM6KHznFweqhRuihcFAX3iNb4NlGafQKZ2jwNL0Pbpv2ICs2xu4cyO7pjsMLiTn6HjgrOwbQlWgQhGEkRFMIz3niklud9NBQd50ohp4gvR/EmChZ0gSZ5+0CGl3m5dFk0JY1wG3j1wu1ZBFgaE4BwGBRBLzCpNkIAUuolRyVAfw2mkvCNI0fyVGk1g2n8cnSHJNriH8mo3JUlQACFeDSBgOoG00gbQJGsJqAAopqTUJ8WzXHbDcTO1pJz2nzofOeHZPSDArqMOSM414VnmE3beEBd6YCiGhXcx8axwGVmQE+xokH6AUnJNB3ZMGBFofAOePYCwEKQEQleZY5whkbngLeO8yDUKUszehFIFK8GsGo9RGjNFaO0To6wiDB6tkQHJOSHpx7oNzn2QIyk55JiEYvURkwSHzjIXgOiDEmLuSWOqXIiJXJeJJN3OA6ouLRV4iAQO7lST+JgKSTgzBoAU3chQogaN4CSTgPkUSsBNRIiUEoVK0TrJfX0oJDJGE5CSAUW5XIAApcQiI9y8DpFsNuQTRKvi9HkOAvVkmpNCpqHEtkYCai1GhWyEpYKqTALkCJcSEmiToH3QSaBbIQHFDgXgjAki8CKDNSwXIPwkwAFQ8B5GeNpMTogVMYZwWyjl8BxL0IQKApSkT2CEoJKJJh1TfiikoHGpJHxfOED8sgaFSAAqEmAUKwKLnfnsmRSFqhim8D1HFTg5kYChXrLcukNAql6hxJpWA34ABWpSBSfWYFMk53BOBKCipqUIPJomxN2hII8niEKkSxVU2yeLg5rOQKSCh6xGHfjEJiJEaBSRGiCFjLAH5RqjUgLAcl352BKFGtxOAo0Kk0DEGbIgclKjfloKNcQWBGCjVFfAT2rVmByAAMS2sYZKiA0qojR1yMK11ntJVgtlfKtqirEDKtVTAdVmrtWhL1V9eAaAjUmrNRaq1Nq0JivtWgR1LqM12oDaQUgERvxSSDvSxlzLYXqliai0U/kMUSlCnc1QHquA1VSqoSJEbECsrmVARJUzcgAH0jlHIAOqSDyMoUdQ6dLuQZRAJlchWnqjCpqUlaw0B9UEk7Z5FlVicEsPcsgrTMI0C5NiXIRkjwmSEB6wS5gmxuVGRAcZJ7uAQWkssoOOJ0oLUijAR8kBXKSGDj+09Yg46Xrote+wpl72cEfe5UIy6tJB1csSrK5LxSUvop7Tge4YBgfcsKyA+KrJ+s4NJUaAB5INCqlUqugJGz20adVxoNYm41przWWutX678DrnXiDNmRmAZshBmz9WbQQB92C5HiQeiwLlmBfSOIOsAMDaAlVEuZDtZaF1LpZd8hQpJEAk21uSx6Jmsp/KCH1IOcgoq3PYHIKAfUIgimVZwVCFgnKYxgE5tZqzSBucfDi910rrMgoUL8iA/yHOBecwAUj2o+PqIW3Mea86NHzgp/OcEc85zLUBwtrMi2gaLcKwXsCCJYWynAYGFtq31MdhBKFwEfEE3dqUmWhQcFgHAlh3MRE87kbzvmDmcBq65BiXldBQtCuUGKHknCCpw1KaU43csEia+C1IbWdSKq6+hJ5vWMSFctUNrF22xRCS4MgDcoQMY2mHjaW7YpimNOaWgACnJpJgEDphM8jdOB1eY4gIgR8R5yWHjcTW3nPtcBo+uzdf2wAA6B3AEHAQwfdqh3maw0g8zw4+2yLg3a/NkDonIdN0U7WjToGsaVRxUzqGHtIMnBJimPadEaM2/KrtkCaEYuSXP7vTadN9r4eOIdU7IqEOnmbGe0GZ8YMAqZGhNGsAjnb5PD1y65NTxXqmLCM6dEO+UygjF/DzCTJ6h76LuXeq1xgTnOBqk1LtIQfURTRPhZOoIpIAAiepdCuWpG4mArgACEnBQ/KDIDH0kY2wATfy3DBP4fOBjrd8uz33uwBx6z0nsrG2wW5G1iTLTOn3J6eUM+0k5zq1XPCIc6ZWsKpWdJu3MK0q3r0r0HuXDzA9yncILZHGfv4RgoH20Yf6JR/j9fVPqrXBmAYGb6Jd69WV2xa3zAIIrbHxgtTwpzfNm4sJaK8F1zI2ct5b83DG/LnQulaqa28/B+r/2Zf6l0W/UJW2Wt2k2BWL+JWZen+YAG+3+M2dWMADWe2LWh2HWJ2PWDefWl2g2igWKHmqe6eT+wMSB0oOe7Wx24op2qg52/WQuw24MVSFeHeDuUeA+ru7uBeIKYAvuX+l+CKYAQeJeEewAUese8eYeSeKeD+oBme4hrkue7Bi6hexeshMeZejB2sOUeUSABUZQRGpQyAQSpE6wcqDGYao0+SqgSImo34MQzATGaquqEao0kUi6o03GKa5gmo40l+5KEQusKccYIiNwloZiKYaYlicIMWuAPwuYsgeC3olc1gxCkIzioYTcu60AUQ3+dmc2uUMAAA/KkISo+MLBqlsEcKEG7HhkUWABgMaMhAiBAGjGDgANS9BhSzBRQYh+FUA6p4DSFVKkgVaxLNoPL1bdBZScAACyFMAgpUyGOgSIr4U2ta6Kz4jCWKj4ox1S54sEXAmKoU4Qz628LAkgOIuRC20cQk7uGIUAjkFRy6BxHy4oVhYgjkLOQgPiVEpSLAbulSOKvq+WCQQQfwEQ9GIaZhqmYA6gGqOgeqFgSI5qUJUmeRuqUJfw6afmCQ34fwgm2acgmsQQnaQkixyxTkJJyG7u6xjaVSwqLOcg34KmX0AKJhIajGEaUacJ7G+qCaSaPGqa1q9JeJOa9JTJaAYpZsrQkQxaFmXecAa+RQnIVMnANo0+URP+fUHIXIqQyW7mj4WpaA+BuW0hqQBpqQdoVSFWVWPydmmpHq2pABBpRpj+Bypp9p3IFpEWaAUqlWnepIJMhGJGpIQpYpLJwa7U7JzGnJWq3J8ahq7hvGaaQpQmTqop7Aqm4p6ZX0kpOgrcLkcySmiQWZ6u2ULQWhKAhUGSnKpQRA1g34vQ9Zai/hBi1wckNwqCyYDQHo08eAfyc8cRdiE4oIYidcpCaRkRywToKIaIn0mIYA2I8M/0BIfCMofIVuDIzICM7I7pq5coAoCom5S54okowuPIso/IgoG5IoYoKoIEqQ2ouo+ohMrCLZ+gfwCYXCDQFirwgQU50RZgboYwC8E4fwSRI5Tikii4wQFCVC+8Hus5WIGA3Aha4gGAx4OwF4vyXY+AqQYASx/k0IfRBgAA4noN+u5KEQ8hAAkM+pIEMBgCWljiUpJHhcwARWFJYIVskOhkUj5GWrpEoEHMsIFgtHHJwLAEkMNvpKKGinRahaWanIYu+WPNhZPDwr2apTEVYAOfgovKPMkQOLlKUFHr2fFmwu6Cap+UgJaFInxOxCxFuFAKkL0HPL0PcIOYka4CnDELAEwIdLVPTOrqdMtL1BlutNaqDBAPtDVHNCbEtIfP1N+N4Z3A9D3ssHVBHF8I+H+UtNTLTFGGHJ7MpABBuLhOzARFzJ3DzKyIfFLLQOfJfNfLfPfI/M/K/O/J/N/L/P/EAiAmAhAlArAvAqLKyHwnDMgIrIwirGrLLPzP1MotYKorostStVoiNWAETPbpfraXhA5U2E5QAX+VhVnJrKUE7OIEgKAAEIoBkkIHgE5CAK4K4EAA\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst { receipt, value } = await Actions.token.revokeRolesSync(config, {\n  from: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  roles: ['issuer'],\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Roles revoked:', value.length)\n// @log: Roles revoked: 1\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.revokeRoles` action and wait for inclusion manually:\n\n```ts\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { Actions } from 'wagmi/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\n\nconst hash = await Actions.token.revokeRoles(config, {\n  from: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  roles: ['issuer'],\n  token: '0x20c0000000000000000000000000000000000000',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst events = viem_Actions.token.revokeRoles.extractEvents(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n  /** Array of role membership update events */\n  value: readonly {\n    /** Role identifier */\n    role: Hex\n    /** Address that had role revoked */\n    account: Address\n    /** Address that revoked the role */\n    sender: Address\n    /** Whether the role was granted (true) or revoked (false) */\n    hasRole: boolean\n  }[]\n}\n```\n\n## Parameters\n\n### from\n\n- **Type:** `Address`\n\nAddress to revoke the role from.\n\n### roles\n\n- **Type:** `(\"defaultAdmin\" | \"pause\" | \"unpause\" | \"issuer\" | \"burnBlocked\")[]`\n\nRoles to revoke.\n\n### token\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the TIP-20 token.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`token.revokeRoles`](https://viem.sh/tempo/actions/token.revokeRoles)\n"
  },
  {
    "path": "site/tempo/actions/token.setRoleAdmin.md",
    "content": "# `token.setRoleAdmin`\n\nSets the admin role for another role. Requires the current admin role for the target role. [Learn more about token roles](https://docs.tempo.xyz/protocol/tip403/spec)\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"d9c54665ca890ceb4e883643fe63cb29f5ad11e7649208e7a46fe48ce88991c9\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst { receipt } = await Actions.token.setRoleAdminSync(config, {\n  adminRole: 'defaultAdmin',\n  role: 'issuer',\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Transaction hash:', receipt.transactionHash)\n// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.setRoleAdmin` action and wait for inclusion manually:\n\n```ts\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { Actions } from 'wagmi/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\n\nconst hash = await Actions.token.setRoleAdmin(config, {\n  adminRole: 'defaultAdmin',\n  role: 'issuer',\n  token: '0x20c0000000000000000000000000000000000000',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args } \n  = viem_Actions.token.setRoleAdmin.extractEvent(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** New admin role identifier */\n  newAdminRole: Hex\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n  /** Role identifier that had its admin updated */\n  role: Hex\n  /** Address that updated the role admin */\n  sender: Address\n}\n```\n\n## Parameters\n\n### adminRole\n\n- **Type:** `\"defaultAdmin\" | \"pause\" | \"unpause\" | \"issuer\" | \"burnBlocked\"`\n\nNew admin role.\n\n### role\n\n- **Type:** `\"defaultAdmin\" | \"pause\" | \"unpause\" | \"issuer\" | \"burnBlocked\"`\n\nRole to set admin for.\n\n### token\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the TIP20 token.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`token.setRoleAdmin`](https://viem.sh/tempo/actions/token.setRoleAdmin)\n"
  },
  {
    "path": "site/tempo/actions/token.setSupplyCap.md",
    "content": "# `token.setSupplyCap`\n\nSets the supply cap for a TIP-20 token. Requires the default admin role.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"3425b57e63dd869d50e97fa72c6063375687c2cec9e58782eaf2d9e3f31e96b3\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { config } from './config'\n\nconst { newSupplyCap, receipt } = await Actions.token.setSupplyCapSync(config, {\n  supplyCap: parseUnits('1000000', 6),\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('New supply cap:', newSupplyCap)\n// @log: New supply cap: 1000000000000n\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.setSupplyCap` action and wait for inclusion manually:\n\n```ts\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { Actions } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\n\nconst hash = await Actions.token.setSupplyCap(config, {\n  supplyCap: parseUnits('1000000', 6),\n  token: '0x20c0000000000000000000000000000000000000',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args } \n  = viem_Actions.token.setSupplyCap.extractEvent(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** New supply cap value */\n  newSupplyCap: bigint\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n  /** Address that updated the supply cap */\n  updater: Address\n}\n```\n\n## Parameters\n\n### supplyCap\n\n- **Type:** `bigint`\n\nMaximum total supply allowed for the token.\n\n### token\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the TIP-20 token.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`token.setSupplyCap`](https://viem.sh/tempo/actions/token.setSupplyCap)\n"
  },
  {
    "path": "site/tempo/actions/token.transfer.md",
    "content": "# `token.transfer`\n\nTransfers TIP-20 tokens from the caller to a recipient.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"dec220aff49bf6fbcd09bc1c824e3f8dc091edf7bd95fbbb92e4c24833c8f7ec\",\"data\":\"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=\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { config } from './config'\n\nconst { receipt } = await Actions.token.transferSync(config, {\n  amount: parseUnits('10.5', 6),\n  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Transaction hash:', receipt.transactionHash)\n// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.transfer` action and wait for inclusion manually:\n\n```ts\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { Actions } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\n\nconst hash = await Actions.token.transfer(config, {\n  amount: parseUnits('10.5', 6),\n  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  token: '0x20c0000000000000000000000000000000000000',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args } \n  = viem_Actions.token.transfer.extractEvent(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Amount of tokens transferred */\n  amount: bigint\n  /** Address tokens were transferred from */\n  from: Address\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n  /** Address tokens were transferred to */\n  to: Address\n}\n```\n\n## Parameters\n\n### amount\n\n- **Type:** `bigint`\n\nAmount of tokens to transfer.\n\n### to\n\n- **Type:** `Address`\n\nAddress to transfer tokens to.\n\n### token\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the TIP-20 token.\n\n### memo (optional)\n\n- **Type:** `Hex`\n\nOptional memo to attach to the transfer event.\n\n### from (optional)\n\n- **Type:** `Address`\n\nAddress to transfer tokens from. When specified, transfers tokens from the given address (requires prior approval). Defaults to the caller's address.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`token.transfer`](https://viem.sh/tempo/actions/token.transfer)\n"
  },
  {
    "path": "site/tempo/actions/token.unpause.md",
    "content": "# `token.unpause`\n\nUnpauses a TIP-20 token, allowing transfers to resume. Requires the `UNPAUSE` role. [Learn more about token roles](https://docs.tempo.xyz/protocol/tip403/spec)\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"acbdcb03cf8c56a50bc60fe3d4d353742e327ae6fa423ee3dd905872a93fd690\",\"data\":\"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=\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst { isPaused, receipt } = await Actions.token.unpauseSync(config, {\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Is paused:', isPaused)\n// @log: Is paused: false\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.unpause` action and wait for inclusion manually:\n\n```ts\nimport { Actions as viem_Actions } from 'viem/tempo'\nimport { Actions } from 'wagmi/tempo'\nimport { waitForTransactionReceipt } from 'wagmi/actions'\n\nconst hash = await Actions.token.unpause(config, {\n  token: '0x20c0000000000000000000000000000000000000',\n})\nconst receipt = await waitForTransactionReceipt(config, { hash })\n\nconst { args } \n  = viem_Actions.token.unpause.extractEvent(receipt.logs)\n```\n\n## Return Type\n\n```ts\ntype ReturnType = {\n  /** Whether the token is paused */\n  isPaused: boolean\n  /** Transaction receipt */\n  receipt: TransactionReceipt\n  /** Address that unpaused the token */\n  updater: Address\n}\n```\n\n## Parameters\n\n### token\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the TIP-20 token.\n\n<!--@include: @shared/tempo-write-parameters.md-->\n\n## Viem\n\n- [`token.unpause`](https://viem.sh/tempo/actions/token.unpause)\n"
  },
  {
    "path": "site/tempo/actions/token.watchAdminRole.md",
    "content": "# `token.watchAdminRole`\n\nWatches for role admin update events on TIP20 tokens.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"c420598bc27431292ec1a4b52f62cd46424331fc2b9c562b34ffb419fe3f27be\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst unwatch = Actions.token.watchAdminRole(config, {\n  token: 1n, // Token ID or address\n  onRoleAdminUpdated(args, log) {\n    console.log('args:', args)\n  },\n})\n\n// Later, stop watching\nunwatch()\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n`() => void`\n\nReturns a function to unsubscribe from the event.\n\n## Parameters\n\n### onRoleAdminUpdated\n\n- **Type:** `function`\n\n```ts\ndeclare function onRoleAdminUpdated(args: Args, log: Log): void\n\ntype Args = {\n  /** The role whose admin role is being changed */\n  role: Hex\n  /** The new admin role */\n  newAdminRole: Hex\n  /** The address that initiated the change */\n  sender: Address\n}\n```\n\nCallback to invoke when a role admin is updated.\n\n### token\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the TIP20 token to watch.\n\n### args (optional)\n\n- **Type:** `object`\n\n```ts\ntype Args = {\n  /** Filter by role */\n  role?: Hex | Hex[] | null\n  /** Filter by new admin role */\n  newAdminRole?: Hex | Hex[] | null\n  /** Filter by sender */\n  sender?: Address | Address[] | null\n}\n```\n\nOptional filter arguments to narrow down the events to watch.\n\n### fromBlock (optional)\n\n- **Type:** `bigint`\n\nBlock to start listening from.\n\n### onError (optional)\n\n- **Type:** `function`\n\n```ts\ndeclare function onError(error: Error): void\n```\n\nThe callback to call when an error occurred when trying to get for a new block.\n\n### poll (optional)\n\n- **Type:** `true`\n\nEnable polling mode.\n\n### pollingInterval (optional)\n\n- **Type:** `number`\n\nPolling frequency (in ms). Defaults to Client's pollingInterval config.\n\n## Viem\n\n- [`token.watchAdminRole`](https://viem.sh/tempo/actions/token.watchAdminRole)\n"
  },
  {
    "path": "site/tempo/actions/token.watchApprove.md",
    "content": "# `token.watchApprove`\n\nWatches for token approval events on TIP20 tokens.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"a50530b6c3dfb0005748890f9451c15c1c16886305459d01bf4b5b8957109244\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst unwatch = Actions.token.watchApprove(config, {\n  token: 0n,\n  onApproval(args, log) {\n    console.log('args:', args)\n  },\n})\n\n// Later, stop watching\nunwatch()\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n`() => void`\n\nReturns a function to unsubscribe from the event.\n\n## Parameters\n\n### onApproval\n\n- **Type:** `function`\n\n```ts\ndeclare function onApproval(args: Args, log: Log): void\n\ntype Args = {\n  /** Amount approved */\n  amount: bigint\n  /** Address of the token owner */\n  owner: Address\n  /** Address of the spender */\n  spender: Address\n}\n```\n\nCallback to invoke when tokens are approved.\n\n### token\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the TIP20 token to watch.\n\n### args (optional)\n\n- **Type:** `object`\n\n```ts\ntype Args = {\n  /** Filter by token owner address */\n  owner?: Address | Address[] | null\n  /** Filter by spender address */\n  spender?: Address | Address[] | null\n}\n```\n\nFilter events by owner and/or spender addresses.\n\n### fromBlock (optional)\n\n- **Type:** `bigint`\n\nBlock to start listening from.\n\n### onError (optional)\n\n- **Type:** `function`\n\n```ts\ndeclare function onError(error: Error): void\n```\n\nThe callback to call when an error occurred when trying to get for a new block.\n\n### poll (optional)\n\n- **Type:** `true`\n\nEnable polling mode.\n\n### pollingInterval (optional)\n\n- **Type:** `number`\n\nPolling frequency (in ms). Defaults to Client's pollingInterval config.\n\n## Viem\n\n- [`token.watchApprove`](https://viem.sh/tempo/actions/token.watchApprove)\n"
  },
  {
    "path": "site/tempo/actions/token.watchBurn.md",
    "content": "# `token.watchBurn`\n\nWatches for token burn events on TIP20 tokens.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"964634b1472c31080644e57c6495fef8eddfe7936d04a402712785277c2e7797\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst unwatch = Actions.token.watchBurn(config, {\n  token: 1n, // or token address\n  onBurn(args, log) {\n    console.log('args:', args)\n  },\n})\n\n// Later, stop watching\nunwatch()\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n`() => void`\n\nReturns a function to unsubscribe from the event.\n\n## Parameters\n\n### onBurn\n\n- **Type:** `function`\n\n```ts\ndeclare function onBurn(args: Args, log: Log): void\n\ntype Args = {\n  /** Address whose tokens were burned */\n  from: Address\n  /** Amount burned */\n  amount: bigint\n}\n```\n\nCallback to invoke when tokens are burned.\n\n### token\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the TIP20 token.\n\n### args (optional)\n\n- **Type:** `object`\n\n```ts\ntype Args = {\n  /** Filter by burner address */\n  from?: Address | Address[] | null\n}\n```\n\nOptional filter arguments.\n\n### fromBlock (optional)\n\n- **Type:** `bigint`\n\nBlock to start listening from.\n\n### onError (optional)\n\n- **Type:** `function`\n\n```ts\ndeclare function onError(error: Error): void\n```\n\nThe callback to call when an error occurred when trying to get for a new block.\n\n### poll (optional)\n\n- **Type:** `true`\n\nEnable polling mode.\n\n### pollingInterval (optional)\n\n- **Type:** `number`\n\nPolling frequency (in ms). Defaults to Client's pollingInterval config.\n\n## Viem\n\n- [`token.watchBurn`](https://viem.sh/tempo/actions/token.watchBurn)\n"
  },
  {
    "path": "site/tempo/actions/token.watchCreate.md",
    "content": "# `token.watchCreate`\n\nWatches for new TIP20 token creation events on the TIP20 Factory.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"0fc1ecb422e1310805039e9f9c6a825260c57e6ebb91bb88edd178eeb92819a4\",\"data\":\"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=\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst unwatch = Actions.token.watchCreate(config, {\n  onTokenCreated(args, log) {\n    console.log('args:', args)\n  },\n})\n\n// Later, stop watching\nunwatch()\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n`() => void`\n\nReturns a function to unsubscribe from the event.\n\n## Parameters\n\n### onTokenCreated\n\n- **Type:** `function`\n\n```ts\ndeclare function onTokenCreated(args: Args, log: Log): void\n\ntype Args = {\n  /** Address of the created token */\n  token: Address\n  /** ID of the created token */\n  tokenId: bigint\n  /** Name of the token */\n  name: string\n  /** Symbol of the token */\n  symbol: string\n  /** Currency of the token */\n  currency: string\n  /** Quote token address */\n  quoteToken: Address\n  /** Admin address */\n  admin: Address\n}\n```\n\nCallback to invoke when a new TIP20 token is created.\n\n### args (optional)\n\n- **Type:** `object`\n\n```ts\ntype Args = {\n  /** Filter by token address(es) */\n  token?: Address | Address[] | null\n  /** Filter by token ID(s) */\n  tokenId?: bigint | bigint[] | null\n}\n```\n\nOptional filter arguments to watch for specific tokens.\n\n### fromBlock (optional)\n\n- **Type:** `bigint`\n\nBlock to start listening from.\n\n### onError (optional)\n\n- **Type:** `function`\n\n```ts\ndeclare function onError(error: Error): void\n```\n\nThe callback to call when an error occurred when trying to get for a new block.\n\n### poll (optional)\n\n- **Type:** `true`\n\nEnable polling mode.\n\n### pollingInterval (optional)\n\n- **Type:** `number`\n\nPolling frequency (in ms). Defaults to Client's pollingInterval config.\n\n## Viem\n\n- [`token.watchCreate`](https://viem.sh/tempo/actions/token.watchCreate)\n"
  },
  {
    "path": "site/tempo/actions/token.watchMint.md",
    "content": "# `token.watchMint`\n\nWatches for token mint events on TIP20 tokens.  \n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"1e6861a9411f2b10135215821f2c629c4813bdfdb5bb1a235a11dc6a7b4e8738\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst unwatch = Actions.token.watchMint(config, {\n  token: '0x20c0000000000000000000000000000000000001',\n  onMint(args, log) {\n    console.log('args:', args)\n  },\n})\n\n// Later, stop watching\nunwatch()\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n`() => void`\n\nReturns a function to unsubscribe from the event.\n\n## Parameters\n\n### onMint\n\n- **Type:** `function`\n\n```ts\ndeclare function onMint(args: Args, log: Log): void\n\ntype Args = {\n  /** Address that received the tokens */\n  to: Address\n  /** Amount minted */\n  amount: bigint\n}\n```\n\nCallback to invoke when tokens are minted.\n\n### token\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the TIP20 token to watch.\n\n### args (optional)\n\n- **Type:** `object`\n\n```ts\ntype Args = {\n  /** Filter by recipient address */\n  to?: Address | Address[] | null\n}\n```\n\nOptional filter arguments.\n\n### fromBlock (optional)\n\n- **Type:** `bigint`\n\nBlock to start listening from.\n\n### onError (optional)\n\n- **Type:** `function`\n\n```ts\ndeclare function onError(error: Error): void\n```\n\nThe callback to call when an error occurred when trying to get for a new block.\n\n### poll (optional)\n\n- **Type:** `true`\n\nEnable polling mode.\n\n### pollingInterval (optional)\n\n- **Type:** `number`\n\nPolling frequency (in ms). Defaults to Client's pollingInterval config.\n\n## Viem\n\n- [`token.watchMint`](https://viem.sh/tempo/actions/token.watchMint)\n"
  },
  {
    "path": "site/tempo/actions/token.watchRole.md",
    "content": "# `token.watchRole`\n\nWatches for role membership update events on TIP20 tokens.\n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"4e73bd3d320afedbf0f32a0aefd66466de2992e0fa9666c2ae0e296a1f14a4da\",\"data\":\"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\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst unwatch = Actions.token.watchRole(config, {\n  token: '0x...', // Address or ID of the TIP20 token\n  onRoleUpdated(args, log) {\n    console.log('args:', args)\n  },\n})\n\n// Later, stop watching\nunwatch()\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n`() => void`\n\nReturns a function to unsubscribe from the event.\n\n## Parameters\n\n### onRoleUpdated\n\n- **Type:** `function`\n\n```ts\ndeclare function onRoleUpdated(args: Args, log: Log): void\n\ntype Args = {\n  /** Role being updated */\n  role: Hex\n  /** Account receiving or losing the role */\n  account: Address\n  /** Address that updated the role */\n  sender: Address\n  /** Whether the account has the role */\n  hasRole: boolean\n  /** Type of role update */\n  type: 'granted' | 'revoked'\n}\n```\n\nCallback to invoke when a role membership is updated.\n\n### token\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the TIP20 token.\n\n### args (optional)\n\n- **Type:** `object`\n\n```ts\ntype Args = {\n  /** Filter by role */\n  role?: Hex | Hex[] | null\n  /** Filter by account */\n  account?: Address | Address[] | null\n  /** Filter by sender */\n  sender?: Address | Address[] | null\n}\n```\n\nFilter parameters for the watch subscription.\n\n### fromBlock (optional)\n\n- **Type:** `bigint`\n\nBlock to start listening from.\n\n### onError (optional)\n\n- **Type:** `function`\n\n```ts\ndeclare function onError(error: Error): void\n```\n\nThe callback to call when an error occurred when trying to get for a new block.\n\n### poll (optional)\n\n- **Type:** `true`\n\nEnable polling mode.\n\n### pollingInterval (optional)\n\n- **Type:** `number`\n\nPolling frequency (in ms). Defaults to Client's pollingInterval config.\n\n## Viem\n\n- [`token.watchRole`](https://viem.sh/tempo/actions/token.watchRole)\n"
  },
  {
    "path": "site/tempo/actions/token.watchTransfer.md",
    "content": "# `token.watchTransfer`\n\nWatches for token transfer events on TIP20 tokens.  \n\n## Usage\n\n::: code-group\n\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"5deeee8975448d70c44695a3fbb88e51e915d6eeb68dabfc6d4cce676856c16d\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIBBAYzUYQwCKnDQBDDkgCcVADYwwAczT4kAdioTSSmA0Qg+AoSJBzGYXIgAMVXvknj+ZGQF8K6bFYLEXWuvogABTi5uJwAJScvCZcMWAAZoxKiJwAwkJJSgA6YCxsHNGZyZQgYpL6ACyaZooqaogAbFqSuoHxWaXmlkgAjHYOpE405IjS7p44eIQk5P70ePFinACuYADu4mj2qQDqW/YZYGhD/ACiJMcASnorpGAAKl6l5VKI6rK1yqoaLTp6eDWm22ankFisAGYBo5nKNGhNqM8DDM/NQAkxWOwuEZBMIXtp9AAOT4Kb4NGraNp4HEmLrgpBQkD2GEjPrwjyIqbI3xzNELAz5LGcNAQADWinxFRkNVJ9SQAFY/lSDCLxWA6T1EIzmadWYgAEyVBGYLk+WalGj8kAJNb8XGcYH2B5DYQJMgAHiOWQAfEEOslUl7khROFhHMw9GQ4KkacIAHSqxRxx34Z3iV1kOMABXDkdIcE9xSU3oiewO+COJ2GF0UaBuaDujy8uTA4gjcDDvBgDvLaYzvKgEF4CAM+xB8E4CXYnAeAEks/rrMKxYphS64G7SJwYJc0HA4xbxEoR8hkCA6G2sApSgADO973KCwrAaKkGBbGBBpQh/BoNBYThXEnUgIGYTgAHIAAFNiUZhGAAehiN9wMfTFn2FGBMUA4DQIg6CjzgxD2BgRCHAsOAULyNCuBfWM4GwhIQLAqCYMIpCSJoTFKNyJY4iLTgAF5X3fGgvyCYBck4aIyOEVJkE4tgAF0KEktd0w7LFo04CSwCkqT5Mwtg40YKBFNSX9/yCCIVN0wCbNcCJch42JVg2ctBJ4O0TATFcwGTXt103P0ixDHSpKEPsNzIVIQh0OAQzkCAlCiATvW01SpKWCAFDjRKlCCcDIs3RBwJDVpIlU9xcgc3I7xvEBlLPMMhmYUp/SUTgAFp0iLA9GpAZq21KQaIxGejupzFq833BqKDPN8G3uUxuEnW1jF0kVXLgFYACM4F4UhGB27tGNw1Rux3Ws+uUsoCT6axGVlH5EF6RlKQBAwUyK1FukhaFdRcLVrGNJEzVRS1AhCMJIiKYQ+MSAMeoRnIqIKeHOlEO6Xt6GU6me5pqFaD6mSLDU/qZQZhkByojQ5E1vBRXkIbwIIsBAnAOAwKJEzAVIHl82coAAeVIbgoCgN84FMQdh2pcXJfo6dZwAEU4CAEmFfBuznBclx5g9MalF79RJPGGkVQn/kCHmyaQSp/qp0Z9RB01GYtdEDFZ9myEwKIIsC6LOFi49Ui+gPSDjbg4oSpLQ4C9TNzjAAZJKUrSogIBM0oZZHEA0lCOQdqcUVl04CwM/FB0tY23z6Mkbsq37N8oAN26jd6Sp9XkM37qVYn/YTn76UQC2dUdpBnbp0G3fmSGRrzKJytSMK9NO5hUhvaxaAAEmAMRDuUVwbwAbgy5cN633f94sJQj9P2ypLbCA1jQVIduSCw0Hv1xJTeXp5Uej3RA9tLbKhAOVW2I8Hawj6BCF2DMeTuytKzXMIwoh5TjiCb6EcU5KF/vof+psyQMj7oEPKkDR6UxgS9cYU9XaINnngVs7ZOzdiygoXIRBJCwzgNlGAgYTB8OzkOXODwtacBvOwmAN5ODMGgCsBQoYQJEBMhOcQnA4D5EUbAHaKwlBKBvjwvhmsthl3opouCchuGbXOrkAAUuILhABlA6jAsDw14YoiMzI8hwDAmzYgqioCcB2hgB0MAdohJAusOAUY4xOUeOIuRUAFEXVoGjeiaB1gQA0TgXgjAki8CKJiSwxxowJIAFQ8AkUcTx0johWKlg6RgqhZF6EIFAcxKx7CcHCBIqRuUkpWRvCGSRgicpkBAqQYZvSwDBLGcIPh/l7gzNUKY3g6YQndhWLE4Jm11iHRoKXdMYSABy0AYBxgAFbmJOO+Zg8SwBVJWkoRKRc5D9PGfU8iEgwBdlhlkO4MA9k5IOS0huOTkA3gCV2KWcYxCDhWGgG8ikggWSwNGeC8FICwBuXGdgSh4I53glYmgYhOpEENHGWg8FxBYAQjC+A+5fzMDkAAYkZVLBFz80CLzmbkKFnL9wIsmSitFf4MWICxTimAeKCVEpESSj85LKWVGpbS+l8EhVxhZeyoVIrSCkAiHGGc4jXkQHeZ8xZCgZEbN0sdVYuzmmqB5WXaihjzoSJlYgKRMjkmpMebkAA+hUip+x7g31DUGvmZq3mhCMYoi1VyYD8HAvRUaHS65vk4JYFpWstxLEYGIWscgMC5DgBgP5+AQKQB2ZwcwldPU7WibErc3AsyzkyVrMJktMI7QUCGSAW566axgGEwtxbjiltyOESt9ga3P3og27sBc1bnS3Oc2A1zblvjbPuTgTiYAN3EVCyARyhBKKHEyzgs54JCzFeizF2KLlyp0Aq4cSqyVoApVSmldKGUgVhcytArK2XiE6memAnUhCdSFZ1QQUQpykFyHI7NFgkPMC2LiQNYAzi0EvIonZHrY0WvjQsupN5EAJLqjc5y1rLl5QKlrOQiUHTsDkFAcCER75Ys4FmA+e5zIwBY6C9jUAQybW5UiujdTBn5XAsx1jABSCiIZwLZNIBxrjPH4J8YE1pRTonNPidLlJtAMmlmTPYEESw6xOBnENdZ8CuxCAQAxSGXhGbDFF2CQ4LAOBLCcYiNx3IvH+Of3olZrc7Y4BHhXXMjREheAlyrP8yTaBYCGqo2AXjUkHNTL2K59zGjQLtO8+IXzdKAvAtC7pvSvSuDIB3KEMy8oXrylq/VhrB7XHuLjKQNYs5ElFsrAEIO3qiDr1evqF6hJHI5bq3pUxQsdrJv4P1wbw24CjfoONi5iBJtA2kFqObnX6umO9Z/MgrY5BasA0y+CdAU1ItxO8dQNCztLca81uQilOoHKq9FRoBp9SfcflwH7LjDruL27ARAV37ihDu1eqWj3aDPfWu8YHjRrDzdy19nN+2Ec3fgphiwj2uFyCDdfZQBoIRagSbxHNbZuxCWc4wFjnArgWvIkIcC98BmbBWTeZW6ZdBbl3swmArgACEnBRfKDIDLm8IWFt6Yi6kBX4vOC7A5x87n79FlgDl1rpXEmckGuQ2AOqCS8MEe2Zo5Qo6alfNtY08pYBap3lo38lyrqhJtCcXctsTjSuEHWFZAXLlJkeUD8H5goeIzh8jzJrgzAMC1OMUJWzCbLmZ4UEEHlIZJmq5Qxnr5cmmPCdYxprTquwv6aEyJtjxnzdq2k2AdP+eGNDIU9XnJKnSoQVr0FnT6uylN5r2JtvPKy/d7jFFmzMA7P5acy5iAbn4ola807nznA/PVaC/X3T4WJ+cGQKv0ghWN/Fc82V3fFX9+A8C8pUukzGcuSlx5dnnODe87APznPhXkLmAEECLmLmQJwJLizrLvLhAaQMrsfuPoJnAYrluLrr/jzkbibvATLm3u/tbneIeMeEgKeGUEeqUMgLwncF2Kio+lKvBAYqoLtHGDEMwM+rinABwSRP2havBKququYDtERPRtuhEA1DdK8AQuoLYF8HKO8KQosF8pAgTGPNQrTJMAguaIwp7BmtAFEPPoxjFnFgAPypAnIhhxhWFubrShCTR7rmFgAYDICKSlicAZwmRBwADUvQasswiUFW4hVAOceAp+e4pcN4ZmMi6weaOay+v0JqAAsgogIFeCujoCsBGGUtEJsg6mGFLMCiGDEa0rYgjPmFwDssCr0l2t2GzCwJIGEsYboLMsEquhVlAC0riPGpUa0V0ntAIA2OtJwqECsBOBYhztYpCtCgJgkEEBCBEA+hKgwZhmAOoPim+t0CsDSisbBnFlwSsRCHdp/AkHGBCDqiBnIPNkEJ6q0JkbWFmiupzvkU6ptFCi9nIHGBhlsMMnQRKk+jKq+oSsSqSvAN+gIX+pqu8ecaBu8V8WgHCZ1OVMFjhjRnAKnkUC/B5PKFHqIYxuBDEC/KkEppxiGASccEgWEVpGSa/JwIqKZhlrPr7rib3tSSVKSc/OSWPpSakKybSW3mZl7jeAkoet2G8QIB8XCT8eKv+P8S+vuPKsCcqmCb+hqghFCbqmyrCewJhvCdqVsIiXFIhtOKht2OhnqetK3BICQSgGeI7l2KUEQNYHGL0M6dYNYBIYbH/OoISN3MQlqIoQYOQmCJqKoVQnqL0JPJodMAwnyHPKgmQIvHFMvGfGvBfDvHvCcDfHfGfCKGmVfJmYfCfGfE/ISSEh/McN/Pgn0NIP0HIc9CAu9IEBAsGVYKGSyIDPqPKPAtGdobGUoXDK5CmDFGnO4ZnFAFWXTrIU9OSAGSAECOWJAr0LWWoXqMDDdDELABiGjNpJ5OtPREBGvMPgRAhApBAJRE+DRACskAxExBBHGCIVkNxEycsPOSCB5HRD5GqP5FguHMFMjKFKpDzKkL0GADZOFI8L+eVDHMlOlA/LnpXuBEvEPkiZVPZPNp1knB+KQB5iKABCmDfLkK+fYFZKUKNOIEgKAAEIoJokIHgHuCAK4K4EAA\"}\n// @filename: config.ts\n// @errors: 2322\nimport type { Config } from 'wagmi'\nexport const config = {} as Config\n// @filename: example.ts\n// ---cut---\nimport { Actions } from 'wagmi/tempo'\nimport { config } from './config'\n\nconst unwatch = Actions.token.watchTransfer(config, {\n  token: 1n,\n  onTransfer(args, log) {\n    console.log('args:', args)\n  },\n})\n\n// Later, stop watching\nunwatch()\n```\n\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n\n:::\n\n## Return Type\n\n`() => void`\n\nReturns a function to unsubscribe from the event.\n\n## Parameters\n\n### onTransfer\n\n- **Type:** `function`\n\n```ts\ndeclare function onTransfer(args: Args, log: Log): void\n\ntype Args = {\n  /** Amount transferred */\n  amount: bigint\n  /** Address sending the tokens */\n  from: Address\n  /** Address receiving the tokens */\n  to: Address\n}\n```\n\nCallback to invoke when tokens are transferred.\n\n### token\n\n- **Type:** `Address | bigint`\n\nAddress or ID of the TIP20 token to watch.\n\n### args (optional)\n\n- **Type:** `object`\n\n```ts\ntype Args = {\n  /** Filter by sender address(es) */\n  from?: Address | Address[] | null\n  /** Filter by recipient address(es) */\n  to?: Address | Address[] | null\n}\n```\n\nOptional filter to watch only transfers from or to specific addresses.\n\n### fromBlock (optional)\n\n- **Type:** `bigint`\n\nBlock to start listening from.\n\n### onError (optional)\n\n- **Type:** `function`\n\n```ts\ndeclare function onError(error: Error): void\n```\n\nThe callback to call when an error occurred when trying to get for a new block.\n\n### poll (optional)\n\n- **Type:** `true`\n\nEnable polling mode.\n\n### pollingInterval (optional)\n\n- **Type:** `number`\n\nPolling frequency (in ms). Defaults to Client's pollingInterval config.\n\n## Viem\n\n- [`token.watchTransfer`](https://viem.sh/tempo/actions/token.watchTransfer)\n"
  },
  {
    "path": "site/tempo/chains.md",
    "content": "# Chains\n\nThe following Tempo chains are available:\n\n```ts\nimport {\n  tempoDevnet, // [!code hl]\n  tempoLocalnet, // [!code hl]\n  tempoTestnet, // [!code hl]\n} from 'wagmi/chains'\n```\n\n## Default Fee Token\n\nIt is possible to set a default fee token for a Tempo chain by adding a `feeToken` property as an extension to the chain.\n\nOnce set, all transactions will use this token as the default fee token, unless an override is provided at the transaction level.\n\n```ts\nimport { tempoTestnet } from 'wagmi/chains'\n\nconst chain = tempoTestnet.extend({\n  feeToken: '0x20c0000000000000000000000000000000000001',\n})\n```\n"
  },
  {
    "path": "site/tempo/connectors/dangerous_secp256k1.md",
    "content": "# `dangerous_secp256k1`\n\nConnector for a Secp256k1 EOA.\n \n:::warning\nNOT RECOMMENDED FOR PRODUCTION USAGE. This connector stores private keys in clear text, and are bound to the session length of the storage used. Instead, use this connector for testing workflows, like end-to-end tests.\n:::\n\n## Usage\n\n```ts [wagmi.config.ts]\nimport { createConfig, http } from 'wagmi'\nimport { tempoTestnet } from 'wagmi/chains'\nimport { dangerous_secp256k1 } from 'wagmi/tempo' // [!code focus]\n\nexport const config = createConfig({\n  connectors: [dangerous_secp256k1()], // [!code focus]\n  chains: [tempoTestnet],\n  multiInjectedProviderDiscovery: false,\n  transports: {\n    [tempo.id]: http(),\n  },\n})\n```\n\n## Parameters\n\n### account\n\n- **Type:** `LocalAccount`\n\nOptional account to use with connector. If not provided, one is created internally for you.\n"
  },
  {
    "path": "site/tempo/connectors/index.md",
    "content": "# Connectors\n\nWagmi-specific connectors for Tempo.\n\n- [**`webAuthn`**](/tempo/connectors/webAuthn) Connector for a WebAuthn EOA\n- [**`dangerous_secp256k1`**](/tempo/connectors/dangerous_secp256k1) Connector for a secp256k1 (private key) EOA\n"
  },
  {
    "path": "site/tempo/connectors/webAuthn.md",
    "content": "# `webAuthn`\n\nConnector for a WebAuthn EOA.\n\n## Usage\n\n```ts [wagmi.config.ts]\nimport { createConfig, http } from 'wagmi'\nimport { tempoTestnet } from 'wagmi/chains'\nimport { KeyManager, webAuthn } from 'wagmi/tempo' // [!code focus]\n\nexport const config = createConfig({\n  connectors: [\n    webAuthn({ // [!code focus]\n      keyManager: KeyManager.localStorage(), // [!code focus]\n    }), // [!code focus]\n  ],\n  chains: [tempoTestnet],\n  multiInjectedProviderDiscovery: false,\n  transports: {\n    [tempoTestnet.id]: http(),\n  },\n})\n```\n\n:::warning\nThe `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. \n\nFor production, you should opt for a remote key manager such as [`KeyManager.http`](/tempo/keyManagers/http).\n:::\n\n## Parameters\n\n### keyManager\n\n- **Type:** `KeyManager`\n\nPublic key manager that handles credential storage and retrieval. This is required for managing WebAuthn credentials.\n\nThe `KeyManager` interface provides:\n- `getChallenge()`: Optional function to fetch a challenge for registration\n- `getPublicKey(parameters)`: Function to retrieve the public key for a credential\n- `setPublicKey(parameters)`: Function to store the public key for a credential\n\nSee [`KeyManager`](/tempo/keyManagers/) for built-in implementations.\n\n### createOptions (optional)\n\nOptions for WebAuthn registration.\n\n#### createOptions.createFn\n\n- **Type:** `(options?: CredentialCreationOptions | undefined) => Promise<Credential | null>`\n- **Default:** `window.navigator.credentials.create`\n\nCredential creation function. Useful for environments that do not support\nthe WebAuthn API natively (i.e. React Native or testing environments).\n\n#### createOptions.label\n\n- **Type:** `string`\n\nLabel associated with the WebAuthn registration.\n\n#### createOptions.timeout\n\n- **Type:** `number`\n\nA numerical hint, in milliseconds, which indicates the time the calling web app is willing to wait for the creation operation to complete.\n\n#### createOptions.userId\n\n- **Type:** `Bytes.Bytes`\n\nUser ID associated with the WebAuthn registration.\n\n### getOptions (optional)\n\nOptions for WebAuthn authentication.\n\n#### getOptions.getFn\n\n- **Type:** `(options?: CredentialRequestOptions) => Promise<Credential | null>`\n- **Default:** `window.navigator.credentials.get`\n\nCredential request function. Useful for environments that do not support the WebAuthn API natively (i.e. React Native or testing environments).\n\n### rpId (optional)\n\n- **Type:** `string`\n\nThe default RP ID to use for WebAuthn operations. Can be overridden by `createOptions.rpId` or `getOptions.rpId`.\n"
  },
  {
    "path": "site/tempo/getting-started.md",
    "content": "<script setup>\nimport packageJson from '../../packages/core/package.json'\n\nconst viemVersion = '>=2.43.3'\n</script>\n\n# Getting Started\n\n## Overview\n\n[Tempo](https://tempo.xyz) is a purpose-built Layer 1 blockchain optimized for payments.\n\nIt enshrines features like [token management](https://docs.tempo.xyz/protocol/tip20/overview), [Fee AMM](https://docs.tempo.xyz/protocol/fees), and a [stablecoin DEX](https://docs.tempo.xyz/protocol/exchange) directly into the protocol, as well as a [Tempo transaction type](https://docs.tempo.xyz/protocol/transactions) with support for batch calls, fee sponsorship, configurable fee tokens, concurrent transactions, access keys, and scheduled execution.\n\n## Setup\n\nWagmi React and Core both have first-class support for Tempo with [Hooks](/tempo/hooks/) and [Actions](/tempo/actions/). To get started, first follow the [Getting Started guide for React](/react/getting-started) or [Core](/core/getting-started) and make sure your [Viem](https://viem.sh) version is `{{viemVersion}}`.\n\n::: code-group\n```bash-vue [pnpm]\npnpm add viem@{{viemVersion}}\n```\n```bash-vue [npm]\nnpm install viem@{{viemVersion}}\n```\n```bash-vue [yarn]\nyarn add viem@{{viemVersion}}\n\n```bash-vue [bun]\nbun add viem@{{viemVersion}}\n```\n:::\n\nTo dive a layer deeper, check out the [Viem Tempo docs](https://viem.sh/tempo).\n\n## Use Wagmi Hooks\n\nNow that everything is set up, we can use regular Wagmi Hooks (e.g. `useSendTransactionSync`) \nthat are decorated with [Tempo properties](https://docs.tempo.xyz/protocol/transactions/spec-tempo-transaction) \nlike `calls` (batch transactions), `feePayer` (fee sponsorship), `nonceKey` (concurrent transactions) and more!\n\n::: code-group\n\n```tsx [tokenMetadata.tsx]\nimport { useSendTransactionSync } from 'wagmi'\n\nexport function TokenMetadata() {\n  const sendTransactionSync = useSendTransactionSync()\n\n  return (\n    <button\n      onClick={() =>\n        sendTransactionSync.mutate({\n          calls: [\n            {\n              data: '0xcafebabe00000000000000000000000000000001',\n              to: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef'\n            },\n            {\n              data: '0xdeadbeef00000000000000000000000000000002',\n              to: '0xfeedfacefeedfacefeedfacefeedfacefeedface'\n            },\n            {\n              data: '0xfeedface00000000000000000000000000000003',\n              to: '0xfeedfacefeedfacefeedfacefeedfacefeedface'\n            },\n          ],\n          feePayer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045',\n          nonceKey: 1337n,\n        })\n      }\n    >\n      Send transaction\n    </button>\n  )\n}\n```\n```tsx [app.tsx]\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { WagmiProvider } from 'wagmi'\nimport { config } from './config'\nimport { TokenMetadata } from './tokenMetadata'\n\nconst queryClient = new QueryClient()\n\nfunction App() {\n  return (\n    <WagmiProvider config={config}>\n      <QueryClientProvider client={queryClient}>\n        <TokenMetadata />\n      </QueryClientProvider>\n    </WagmiProvider>\n  )\n}\n```\n```tsx [config.ts]\nimport { createConfig, http } from 'wagmi'\nimport { tempoTestnet } from 'wagmi/chains'\nimport { KeyManager, webAuthn } from 'wagmi/tempo'\n\nexport const config = createConfig({\n  connectors: [\n    webAuthn({\n      keyManager: KeyManager.localStorage(),\n    }),\n  ],\n  chains: [tempoTestnet],\n  multiInjectedProviderDiscovery: false,\n  transports: {\n    [tempoTestnet.id]: http(),\n  },\n})\n```\n:::\n\n## Use Tempo Hooks\n\nYou can also use [Tempo-specific Hooks](/tempo/hooks/):\n\n::: code-group\n\n```tsx [tokenMetadata.tsx]\nimport { Hooks } from 'wagmi/tempo'\n\nconst alphaUsd = '0x20c0000000000000000000000000000000000001'\n\nexport function TokenMetadata() {\n  const { data: metadata, ...metadataQuery } = Hooks.token.useGetMetadata({ \n    token: alphaUsd \n  })\n\n  if (metadataQuery.isError)\n    return <div>Error fetching metadata: {metadataQuery.error.message}</div>\n  if (metadataQuery.isLoading) return <div>Loading metadata...</div>\n  return <div>{metadata.name} ({metadata.symbol})</div>\n}\n```\n\n```tsx [app.tsx]\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { WagmiProvider } from 'wagmi'\nimport { config } from './config'\nimport { TokenMetadata } from './tokenMetadata'\n\nconst queryClient = new QueryClient()\n\nfunction App() {\n  return (\n    <WagmiProvider config={config}>\n      <QueryClientProvider client={queryClient}>\n        <TokenMetadata />\n      </QueryClientProvider>\n    </WagmiProvider>\n  )\n}\n```\n\n```tsx [config.ts]\nimport { createConfig, http } from 'wagmi'\nimport { tempo } from 'wagmi/chains'\nimport { KeyManager, webAuthn } from 'wagmi/tempo'\n\nexport const config = createConfig({\n  connectors: [\n    webAuthn({\n      keyManager: KeyManager.localStorage(),\n    }),\n  ],\n  chains: [tempo],\n  multiInjectedProviderDiscovery: false,\n  transports: {\n    [tempo.id]: http(),\n  },\n})\n```\n\n:::\n\n## Next Steps\n\nAfter you have set up your Tempo with Wagmi, you can now:\n\n- [**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!\n- [**Tempo React Hooks**](/tempo/hooks/) Browse the collection of React Hooks and learn how to use them.\n- [**Tempo Core Actions**](/tempo/actions/) Browse the collection of Core Actions and learn how to use them.\n"
  },
  {
    "path": "site/tempo/hooks/amm.useBurn.md",
    "content": "# `amm.useBurn`\n\nBurns liquidity tokens and receives the underlying token pair. [Learn more about the Fee AMM](https://docs.tempo.xyz/protocol/fees/spec-fee-amm)\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"f352a044790f8cbde9e59508d0e42c0dd85e637c21507c3fb59ad6574684cfad\",\"data\":\"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=\"}\nimport { Hooks } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\n\nconst burnSync = Hooks.amm.useBurnSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nburnSync.mutate({\n  liquidity: parseUnits('10.5', 18),\n  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  userToken: '0x20c0000000000000000000000000000000000000',\n  validatorToken: '0x20c0000000000000000000000000000000000001',\n})\n\nconsole.log('Received user tokens:', burnSync.data?.amountUserToken)\n// @log: Received user tokens: 5250000000000000000n\nconsole.log('Received validator tokens:', burnSync.data?.amountValidatorToken)\n// @log: Received validator tokens: 5250000000000000000n\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `amm.burn` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { parseUnits } from 'viem'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst burn = Hooks.amm.useBurn()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: burn.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nburn.mutate({\n  liquidity: parseUnits('10.5', 18),\n  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  userToken: '0x20c0000000000000000000000000000000000000',\n  validatorToken: '0x20c0000000000000000000000000000000000001',\n})\n\nif (receipt) {\n  const { args: { amountUserToken, amountValidatorToken } } \n    = Actions.amm.burn.extractEvent(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `amm.burn` Return Type](/tempo/actions/amm.burn#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `amm.burn` Parameters](/tempo/actions/amm.burn#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`amm.burn`](/tempo/actions/amm.burn)\n"
  },
  {
    "path": "site/tempo/hooks/amm.useLiquidityBalance.md",
    "content": "# `amm.useLiquidityBalance`\n\nGets the liquidity balance for an address in a specific pool.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"8ac7e459f30e286677d1cb839aa57883a14653c6b8b3bf03624ebf676bd6cacc\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst { data: balance } = Hooks.amm.useLiquidityBalance({\n  address: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  userToken: '0x20c0000000000000000000000000000000000000',\n  validatorToken: '0x20c0000000000000000000000000000000000001',\n})\n\nconsole.log('Liquidity balance:', balance)\n// @log: Liquidity balance: 10500000000000000000n\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Return Type\n\nSee [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `amm.getLiquidityBalance` Return Type](/tempo/actions/amm.getLiquidityBalance#return-type)\n\n## Parameters\n\nSee [Wagmi Action `amm.getLiquidityBalance` Parameters](/tempo/actions/amm.getLiquidityBalance#parameters)\n\n### query\n\nSee the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters.\n\n## Action\n\n- [`amm.getLiquidityBalance`](/tempo/actions/amm.getLiquidityBalance)\n"
  },
  {
    "path": "site/tempo/hooks/amm.useMint.md",
    "content": "# `amm.useMint`\n\nMints liquidity tokens by providing a token pair. [Learn more about the Fee AMM](https://docs.tempo.xyz/protocol/fees/spec-fee-amm)\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"4fca6eaaab4d04b51aad961895f40c6a81566cafdac628c7923a2a2603d064ae\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\n\nconst mintSync = Hooks.amm.useMintSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nmintSync.mutate({\n  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  userTokenAddress: '0x20c0000000000000000000000000000000000000',\n  validatorTokenAddress: '0x20c0000000000000000000000000000000000001',\n  validatorTokenAmount: parseUnits('100', 6),\n})\n\nconsole.log('Liquidity minted:', mintSync.data?.liquidity)\n// @log: Liquidity minted: 100000000n\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `amm.mint` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { parseUnits } from 'viem'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst mint = Hooks.amm.useMint()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: mint.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nmint.mutate({\n  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  userTokenAddress: '0x20c0000000000000000000000000000000000000',\n  validatorTokenAddress: '0x20c0000000000000000000000000000000000001',\n  validatorTokenAmount: parseUnits('100', 6),\n})\n\nif (receipt) {\n  const { args: { liquidity } } \n    = Actions.amm.mint.extractEvent(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `amm.mint` Return Type](/tempo/actions/amm.mint#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `amm.mint` Parameters](/tempo/actions/amm.mint#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`amm.mint`](/tempo/actions/amm.mint)\n\n"
  },
  {
    "path": "site/tempo/hooks/amm.usePool.md",
    "content": "# `amm.usePool`\n\nGets the reserves for a liquidity pool.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"a5e2597c7cc0e903cdeee24bcbbc6a915a731be45436f6ef363478a4ecfdc54e\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst { data: pool } = Hooks.amm.usePool({\n  userToken: '0x20c0000000000000000000000000000000000000',\n  validatorToken: '0x20c0000000000000000000000000000000000001',\n})\n\nconsole.log('User token reserve:', pool?.reserveUserToken)\n// @log: User token reserve: 1000000000000000000000n\nconsole.log('Validator token reserve:', pool?.reserveValidatorToken)\n// @log: Validator token reserve: 1000000000000000000000n\nconsole.log('Total supply:', pool?.totalSupply)\n// @log: Total supply: 1000000000000000000000n\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Return Type\n\nSee [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `amm.getPool` Return Type](/tempo/actions/amm.getPool#return-type)\n\n## Parameters\n\nSee [Wagmi Action `amm.getPool` Parameters](/tempo/actions/amm.getPool#parameters)\n\n### query\n\nSee the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters.\n\n## Action\n\n- [`amm.getPool`](/tempo/actions/amm.getPool)\n\n"
  },
  {
    "path": "site/tempo/hooks/amm.useRebalanceSwap.md",
    "content": "# `amm.useRebalanceSwap`\n\nPerforms a rebalance swap between user and validator tokens. [Learn more about the Fee AMM](https://docs.tempo.xyz/protocol/fees/spec-fee-amm)\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"20c09f8cc1ff08a8faf46184bc97fb05274d872847ffff372666aabccf7c9bdd\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\n\nconst rebalanceSwapSync = Hooks.amm.useRebalanceSwapSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nrebalanceSwapSync.mutate({\n  amountOut: parseUnits('10.5', 6),\n  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  userToken: '0x20c0000000000000000000000000000000000000',\n  validatorToken: '0x20c0000000000000000000000000000000000001',\n})\n\nconsole.log('Amount in:', rebalanceSwapSync.data?.amountIn)\n// @log: 10605000n\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `amm.rebalanceSwap` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { parseUnits } from 'viem'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst rebalanceSwap = Hooks.amm.useRebalanceSwap()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: rebalanceSwap.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nrebalanceSwap.mutate({\n  amountOut: parseUnits('10.5', 6),\n  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  userToken: '0x20c0000000000000000000000000000000000000',\n  validatorToken: '0x20c0000000000000000000000000000000000001',\n})\n\nif (receipt) {\n  const { args: { amountIn } } \n    = Actions.amm.rebalanceSwap.extractEvent(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `amm.rebalanceSwap` Return Type](/tempo/actions/amm.rebalanceSwap#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `amm.rebalanceSwap` Parameters](/tempo/actions/amm.rebalanceSwap#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`amm.rebalanceSwap`](/tempo/actions/amm.rebalanceSwap)\n\n"
  },
  {
    "path": "site/tempo/hooks/amm.useWatchBurn.md",
    "content": "# `amm.useWatchBurn`\n\nWatches for liquidity burn events on the Fee AMM.  \n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"1eb67ad9a75d59810fdaf0024451c348d0f712105fb6fc09eb9c9df760ca27f0\",\"data\":\"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=\"}\nimport { Hooks } from 'wagmi/tempo'\n\nHooks.amm.useWatchBurn({\n  onBurn: (args, log) => {\n    console.log('args:', args)\n  },\n})\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Parameters\n\nSee [Wagmi Action `amm.watchBurn` Parameters](/tempo/actions/amm.watchBurn#parameters)\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n## Action\n\n- [`amm.burn`](/tempo/actions/amm.burn)\n- [`amm.watchBurn`](/tempo/actions/amm.watchBurn)\n\n"
  },
  {
    "path": "site/tempo/hooks/amm.useWatchMint.md",
    "content": "# `amm.useWatchMint`\n\nWatches for liquidity mint events on the Fee AMM.  \n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"dcfbe669423c1e67e1fd5bfc996004b53912d26ef3dcef6280d135f90c3df485\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nHooks.amm.useWatchMint({\n  onMint: (args, log) => {\n    console.log('args:', args)\n  },\n})\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Parameters\n\nSee [Wagmi Action `amm.watchMint` Parameters](/tempo/actions/amm.watchMint#parameters)\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n## Action\n\n- [`amm.mint`](/tempo/actions/amm.mint)\n- [`amm.watchMint`](/tempo/actions/amm.watchMint)\n\n"
  },
  {
    "path": "site/tempo/hooks/amm.useWatchRebalanceSwap.md",
    "content": "# `amm.useWatchRebalanceSwap`\n\nWatches for rebalance swap events on the Fee AMM.  \n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"a65363a61410810306bc28a64110f48e977141b2aff31cdee698fa19287f0ab5\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nHooks.amm.useWatchRebalanceSwap({\n  onRebalanceSwap: (args, log) => {\n    console.log('args:', args)\n  },\n})\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Parameters\n\nSee [Wagmi Action `amm.watchRebalanceSwap` Parameters](/tempo/actions/amm.watchRebalanceSwap#parameters)\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n## Action\n\n- [`amm.rebalanceSwap`](/tempo/actions/amm.rebalanceSwap)\n- [`amm.watchRebalanceSwap`](/tempo/actions/amm.watchRebalanceSwap)\n\n"
  },
  {
    "path": "site/tempo/hooks/dex.useBalance.md",
    "content": "# `dex.useBalance`\n\nGets a user's token balance on the Stablecoin DEX.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"86f30c8b6ecfcd05a596ac74359c0fbce656e58c96f45bc8cceeb1ce8f608b07\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst { data: balance } = Hooks.dex.useBalance({\n  account: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  token: '0x20c0000000000000000000000000000000000001',\n})\n\nconsole.log('DEX balance:', balance)\n// @log: DEX balance: 1000000000n\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Return Type\n\nSee [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `dex.getBalance` Return Type](/tempo/actions/dex.getBalance#return-type)\n\n## Parameters\n\nSee [Wagmi Action `dex.getBalance` Parameters](/tempo/actions/dex.getBalance#parameters)\n\n### query\n\nSee the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters.\n\n## Action\n\n- [`dex.getBalance`](/tempo/actions/dex.getBalance)\n"
  },
  {
    "path": "site/tempo/hooks/dex.useBuy.md",
    "content": "# `dex.useBuy`\n\nBuys a specific amount of tokens from the Stablecoin DEX orderbook.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"19b864958a3edb268ed55df991f577eacfa8b004aba94539562aed8b4486c2ef\",\"data\":\"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=\"}\nimport { Hooks } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\n\nconst buySync = Hooks.dex.useBuySync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nbuySync.mutate({\n  amountOut: parseUnits('100', 6),\n  maxAmountIn: parseUnits('105', 6),\n  tokenIn: '0x20c0000000000000000000000000000000000001',\n  tokenOut: '0x20c0000000000000000000000000000000000002',\n})\n\nconsole.log('Transaction hash:', buySync.data?.receipt.transactionHash)\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `dex.buy` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst buy = Hooks.dex.useBuy()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: buy.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nbuy.mutate({\n  amountOut: parseUnits('100', 6),\n  maxAmountIn: parseUnits('105', 6),\n  tokenIn: '0x20c0000000000000000000000000000000000001',\n  tokenOut: '0x20c0000000000000000000000000000000000002',\n})\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `dex.buy` Return Type](/tempo/actions/dex.buy#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `dex.buy` Parameters](/tempo/actions/dex.buy#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`dex.buy`](/tempo/actions/dex.buy)\n"
  },
  {
    "path": "site/tempo/hooks/dex.useBuyQuote.md",
    "content": "# `dex.useBuyQuote`\n\nGets the quote for buying a specific amount of tokens.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"cb4e5f5fb447a1a65ef7af20e203bda1f35f12b1e876616083f30b47831f53fb\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\n\nconst { data: quote } = Hooks.dex.useBuyQuote({\n  amountOut: parseUnits('100', 6),\n  tokenIn: '0x20c0000000000000000000000000000000000001',\n  tokenOut: '0x20c0000000000000000000000000000000000002',\n})\n\nconsole.log('Amount needed:', quote)\n// @log: Amount needed: 100300000n\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Return Type\n\nSee [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `dex.getBuyQuote` Return Type](/tempo/actions/dex.getBuyQuote#return-type)\n\n## Parameters\n\nSee [Wagmi Action `dex.getBuyQuote` Parameters](/tempo/actions/dex.getBuyQuote#parameters)\n\n### query\n\nSee the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters.\n\n## Action\n\n- [`dex.getBuyQuote`](/tempo/actions/dex.getBuyQuote)\n"
  },
  {
    "path": "site/tempo/hooks/dex.useCancel.md",
    "content": "# `dex.useCancel`\n\nCancels an order from the Stablecoin DEX orderbook.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"d99005d358f82f6b8da0b324b8d268d476741fc0146d122b7f8fb1d35c61bdc0\",\"data\":\"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=\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst cancelSync = Hooks.dex.useCancelSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\ncancelSync.mutate({\n  orderId: 123n,\n})\n\nconsole.log('Cancelled order ID:', cancelSync.data?.orderId)\n// @log: Cancelled order ID: 123n\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `dex.cancel` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst cancel = Hooks.dex.useCancel()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: cancel.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\ncancel.mutate({\n  orderId: 123n,\n})\n\nif (receipt) {\n  const { args: { orderId } } \n    = Actions.dex.cancel.extractEvent(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `dex.cancel` Return Type](/tempo/actions/dex.cancel#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `dex.cancel` Parameters](/tempo/actions/dex.cancel#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`dex.cancel`](/tempo/actions/dex.cancel)\n"
  },
  {
    "path": "site/tempo/hooks/dex.useCreatePair.md",
    "content": "# `dex.useCreatePair`\n\nCreates a new trading pair on the Stablecoin DEX.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"30ad47475bf43802763bb99c5cf8fdf2fdf294d49b87a8e6428158f4753de2e3\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst createPairSync = Hooks.dex.useCreatePairSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\ncreatePairSync.mutate({\n  base: '0x20c0000000000000000000000000000000000001',\n})\n\nconsole.log('Base token:', createPairSync.data?.base)\nconsole.log('Quote token:', createPairSync.data?.quote)\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `dex.createPair` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst createPair = Hooks.dex.useCreatePair()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: createPair.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\ncreatePair.mutate({\n  base: '0x20c0000000000000000000000000000000000001',\n})\n\nif (receipt) {\n  const { args: { base, quote } } \n    = Actions.dex.createPair.extractEvent(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `dex.createPair` Return Type](/tempo/actions/dex.createPair#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `dex.createPair` Parameters](/tempo/actions/dex.createPair#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`dex.createPair`](/tempo/actions/dex.createPair)\n"
  },
  {
    "path": "site/tempo/hooks/dex.useOrder.md",
    "content": "# `dex.useOrder`\n\nGets an order's details from the Stablecoin DEX orderbook.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"1815c3299836587ecb4ba2019dc58a529df6920eadae785fd12d0d622fd85358\",\"data\":\"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=\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst { data: order } = Hooks.dex.useOrder({\n  orderId: 123n,\n})\n\nconsole.log('Order details:', order)\n// @log: Order details: { amount: 100000000n, maker: '0x...', isBid: true, ... }\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Return Type\n\nSee [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `dex.getOrder` Return Type](/tempo/actions/dex.getOrder#return-type)\n\n## Parameters\n\nSee [Wagmi Action `dex.getOrder` Parameters](/tempo/actions/dex.getOrder#parameters)\n\n### query\n\nSee the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters.\n\n## Action\n\n- [`dex.getOrder`](/tempo/actions/dex.getOrder)\n"
  },
  {
    "path": "site/tempo/hooks/dex.usePlace.md",
    "content": "# `dex.usePlace`\n\nPlaces a limit order on the Stablecoin DEX orderbook.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"dc89ef7c90b6e3e69c1c36d86e7178af7ac3a72d19bcb225b4b1bdc2a7afa924\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { Tick } from 'viem/tempo'\n\nconst placeSync = Hooks.dex.usePlaceSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nplaceSync.mutate({\n  amount: parseUnits('100', 6),\n  tick: Tick.fromPrice('0.99'),\n  token: '0x20c0000000000000000000000000000000000001',\n  type: 'buy',\n})\n\nconsole.log('Order ID:', placeSync.data?.orderId)\n// @log: Order ID: 123n\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `dex.place` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { parseUnits } from 'viem'\nimport { Tick } from 'viem/tempo'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst place = Hooks.dex.usePlace()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: place.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nplace.mutate({\n  amount: parseUnits('100', 6),\n  tick: Tick.fromPrice('0.99'),\n  token: '0x20c0000000000000000000000000000000000001',\n  type: 'buy',\n})\n\nif (receipt) {\n  const { args: { orderId } } \n    = Actions.dex.place.extractEvent(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `dex.place` Return Type](/tempo/actions/dex.place#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `dex.place` Parameters](/tempo/actions/dex.place#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`dex.place`](/tempo/actions/dex.place)\n"
  },
  {
    "path": "site/tempo/hooks/dex.usePlaceFlip.md",
    "content": "# `dex.usePlaceFlip`\n\nPlaces a flip order that automatically flips to the opposite side when filled.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"0b032ce2f26b3ba60b7d704cf92957c90fd7feb051b6dc255273d25ecb860c75\",\"data\":\"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=\"}\nimport { Hooks } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { Tick } from 'viem/tempo'\n\nconst placeFlipSync = Hooks.dex.usePlaceFlipSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nplaceFlipSync.mutate({\n  amount: parseUnits('100', 6),\n  flipTick: Tick.fromPrice('1.01'),\n  tick: Tick.fromPrice('0.99'),\n  token: '0x20c0000000000000000000000000000000000001',\n  type: 'buy',\n})\n\nconsole.log('Flip order ID:', placeFlipSync.data?.orderId)\n// @log: Flip order ID: 456n\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `dex.placeFlip` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { parseUnits } from 'viem'\nimport { Tick } from 'viem/tempo'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst placeFlip = Hooks.dex.usePlaceFlip()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: placeFlip.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nplaceFlip.mutate({\n  amount: parseUnits('100', 6),\n  flipTick: Tick.fromPrice('1.01'),\n  tick: Tick.fromPrice('0.99'),\n  token: '0x20c0000000000000000000000000000000000001',\n  type: 'buy',\n})\n\nif (receipt) {\n  const { args: { orderId } } \n    = Actions.dex.placeFlip.extractEvent(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `dex.placeFlip` Return Type](/tempo/actions/dex.placeFlip#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `dex.placeFlip` Parameters](/tempo/actions/dex.placeFlip#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`dex.placeFlip`](/tempo/actions/dex.placeFlip)\n"
  },
  {
    "path": "site/tempo/hooks/dex.useSell.md",
    "content": "# `dex.useSell`\n\nSells a specific amount of tokens on the Stablecoin DEX orderbook.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"ae5fe3560e82c82e12f7f413d98649d47715c71ac035ce263b44bcd061feddc4\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\n\nconst sellSync = Hooks.dex.useSellSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nsellSync.mutate({\n  amountIn: parseUnits('100', 6),\n  minAmountOut: parseUnits('95', 6),\n  tokenIn: '0x20c0000000000000000000000000000000000001',\n  tokenOut: '0x20c0000000000000000000000000000000000002',\n})\n\nconsole.log('Transaction hash:', sellSync.data?.receipt.transactionHash)\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `dex.sell` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst sell = Hooks.dex.useSell()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: sell.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nsell.mutate({\n  amountIn: parseUnits('100', 6),\n  minAmountOut: parseUnits('95', 6),\n  tokenIn: '0x20c0000000000000000000000000000000000001',\n  tokenOut: '0x20c0000000000000000000000000000000000002',\n})\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `dex.sell` Return Type](/tempo/actions/dex.sell#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `dex.sell` Parameters](/tempo/actions/dex.sell#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`dex.sell`](/tempo/actions/dex.sell)\n"
  },
  {
    "path": "site/tempo/hooks/dex.useSellQuote.md",
    "content": "# `dex.useSellQuote`\n\nGets the quote for selling a specific amount of tokens.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"e032bbb5ac251a0290eacf6fd15a7b454e27c2398bf4e185fb4d8d10e5253e5b\",\"data\":\"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=\"}\nimport { Hooks } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\n\nconst { data: quote } = Hooks.dex.useSellQuote({\n  amountIn: parseUnits('100', 6),\n  tokenIn: '0x20c0000000000000000000000000000000000001',\n  tokenOut: '0x20c0000000000000000000000000000000000002',\n})\n\nconsole.log('Amount received:', quote)\n// @log: Amount received: 99700000n\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Return Type\n\nSee [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `dex.getSellQuote` Return Type](/tempo/actions/dex.getSellQuote#return-type)\n\n## Parameters\n\nSee [Wagmi Action `dex.getSellQuote` Parameters](/tempo/actions/dex.getSellQuote#parameters)\n\n### query\n\nSee the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters.\n\n## Action\n\n- [`dex.getSellQuote`](/tempo/actions/dex.getSellQuote)\n"
  },
  {
    "path": "site/tempo/hooks/dex.useTickLevel.md",
    "content": "# `dex.useTickLevel`\n\nGets the tick level information at a specific tick on the Stablecoin DEX orderbook.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"57b65b077fbeb672f0d0226a0c174adf10d17a4561575135f580ae6d087d726d\",\"data\":\"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=\"}\nimport { Hooks } from 'wagmi/tempo'\nimport { Tick } from 'viem/tempo'\n\nconst { data: level } = Hooks.dex.useTickLevel({\n  base: '0x20c0000000000000000000000000000000000001',\n  tick: Tick.fromPrice('1.001'),\n  isBid: true,\n})\n\nconsole.log('Tick level:', level)\n// @log: Tick level: { head: 1n, tail: 5n, totalLiquidity: 1000000000n }\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Return Type\n\nSee [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `dex.getTickLevel` Return Type](/tempo/actions/dex.getTickLevel#return-type)\n\n## Parameters\n\nSee [Wagmi Action `dex.getTickLevel` Parameters](/tempo/actions/dex.getTickLevel#parameters)\n\n### query\n\nSee the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters.\n\n## Action\n\n- [`dex.getTickLevel`](/tempo/actions/dex.getTickLevel)\n"
  },
  {
    "path": "site/tempo/hooks/dex.useWatchFlipOrderPlaced.md",
    "content": "# `dex.useWatchFlipOrderPlaced`\n\nWatches for flip order placed events on the Stablecoin DEX.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"ec2db8af3c2ec972afbe7d0d286151f1c33da31056ce694679eda2d35e5d89ec\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIAJCCAawRU4aAIYckATioAbGGADmafEgCsVMaQUwGiELwFCQMxmFyIADFQDG+caOs1yiSQF8K6bOYLEylanS6ICxsHDx8gv4i4roAzADssvJKKojq1OLaQQaRsqbmAEw2dqQOTkgW7p44eIQk5BqBTKzsXLC0UZq6ACyxSYrKSH0ZWjp47f4mZkhFILb2jn6IAGxV1F61vg0B9HgAZgCuYI6MEGCcB3AwAOqiaLYAYiZYAPKksKQACjIOMFAAPABhM57RgKAB8AAosPZmDoyHAAPyITjAAA6504WPmpgAklBkZwwAdmAAjMicAA+FzAsFBZigAG4MVisZkkSj0ZjWaz2B98YTSWDTFxqUKFCLkABdKlEg4yGSyo50/JMlk81nMUT8MiEgAGFloABJgCJSKYFK49bKDcbTWhzYordLZcSFUraTB6X9mdyNWgBPJ9YaTWaLVabSH7Y7LXqXdS3YrqcqvarfTzXB6VQz06y9qQIMwAEIyCDWfiC4VgUU07M+9VYs4AUVIBdIhMhkLIbZRLbbAEpOABecGcIgQRhQQfJz3eqBZ1M5hucNgKwkOg4wBdz7dp5erqYKXHVshEUQyQnEskUmd1+e3xf1v1anXtlG20MO8PWh9z3ONsAnkYV53jIb5fgJFFO3ZFEAHc7keZ43g+cDrD+AA6ABBLQ4AoThSwUOCEPwICQJQn40KgdCABkIAUQcRzHCcp13Jc/QDHUwGDO0wydH9a0fNU/WsEEwUJYEwFBBRWKfHl5FEUk5EgzhST4ORRHOX9VRkoTXH7FFx0nDEwFEOE4BhNCLiuW57hIpDQK+Ci/n8KAywQPQck4PZ2E4eDbItLznk4PkKSwJy4WrTgYBIas4GC85lC3AARJsAA10P8MQFHc5BkBAOhTLC3AqD1Uq0DgWgMRCVpUXCQxOEzfNC04AByeCFGYRgAHoaBaFqMQxQ5jjQU5zkwrAsEhQcuSxHI4HQ9p0MuG5iNI5CwKcqBIRm3lAPs8iIMhdlpuXbEzjgCA5HQgjIRa0jgocldNsQFq8OO5d3HVPSBsxUgdAOUhzn+KBGCIcEbNsALvNIQLgIej4nt+CLyvQ1H/i6kGwYxVwMVKvUQClCg8phUpmH8EnTPhUg4oAWk4T5YSp+aCcJkBogkRBukSYxkkGRACmGTQsjwZaIbs4D1sciDJnyGZigWcpEAARkqDx1hqPQ6j8Rpdj0aECxwDgMEHM41oc1C/g7I6cKI2yzYOyisJwvCCNtxCJfNzaaLohjR0MlitIZFy3LwQFzxkUkHH4TgA04Uxxx1Xz8HkThRFhrB4YpRg4rCiCMuELokHidI5AGVIle5oWxj0U39o26W8mmRBhnmUpFmcAo1kwDWfHqTKmj1im4ScQcYNRZcQtIfEUXFEV/04F8yHfKNeNjeeOPkZeeK/Pj59MiAjjQGeqzQefs6LScZ7UmANPXxhyxRK9yVIee9meAAVe/+Efkln99VxOgxCkCXXmqRugaEyNXEA7IZZNxbiUMoSwCidzVt3bwWttg0F1iAaEjMR74Tom7cWZF66O1ogoQBHMVZK36CkIYEDRhBAIrA8w8CFZIIABxdw2JrLY/dsEmTMhZLcIkwAXTkBiM8MNRHiJgCiCSsjg7WHciAd+ydOB6hkZdGA1pmDQHlFuLABYiCTngKnTgcAQhyE4LAUkBwFASkUJwLR1jlB3DjnFSxnUfgw1jolDEAApUQZ4ADK1hzRYC4C4rccJ5hgGzswFcxjTHzlJBgXyMBSQqQLLBK41N0I/TUTE/R1i6ChHKjHWCEALE4GsIwUE1hnGFjYGYWKiAfoACpOCYQ0Qo7R1prA/DgHFWCjBlALx0IQKAniDi2FTnFTR51tHXTolNPUeFFliOWd2dgazU60g0dE9C8FAZ7LcVEjSKktzLXnLHWC5oaAx2qRpdJAA5aAMB0IACtPEOhvswApYAuk9IUKWSOipNmyOtKYaIxwRGiQUADP4TzfIPK3LHZAeojFlngPNEQrkDhoD1FKSE+A0BoCwHARAXUuqQFgD89C7AFAYzcl1H4NARA0yIAUbo6FaBdVEFgbq2K0LDPQmS5gMgADEIrcX4oPmgUetIMSYtlWK/F3ZiWkvJZS6ltKPkMqZSy5RbK7jwDQFynlfKBVCq6mq+aErpX2o1a2fs6FOBFM4KCiA4LDlLLkAMy55IrLItGcoBVccWgcAColDRdK5HRN0SUz5P0AD6HSOm3EBhaDNqaUSeu9b66JwVSRfJgI4FqcVh5TLiuILcZgxnJ2kedbONBqwyAwBiOAGBjj4ALJAS4+FGCJ1jaSHJeTumfFxHFRK6S/pXDJHIPCkAYZ1pjsndJMjW3yDQB2jEohu29v7QfOKJhE7h2ColGG7zYDfN+X9Uy81OAhJgOi9RmLICPLOEknFwzOC4i6i8LVZKKVUppfGw1WhjVwFNRyi13LeX8sFcKgsoqHVoElVK0QNNP0wBpmcGm9qaanEHNDDEei/px0kuwLUI0ziAoxE2WghVrGXBjeowt54/VbIDe0sAuNSo/IxEcm6LVk4KmqVU0gMgoAtX7L6Gl9NHTlRROJ0svl2AybwrHeVhLhP+s+aJtT1SACkcBXqtSkzJuTCmupKZFFSzgxmNPSagNp6pum0D6Z458nZpBIRmFgpwPsuyWrXEIBASleELrVoCpHecdgJryD+HJ+TGJFOfGU3FPzEzhmiG0Ps+c0RywxzbuijzaAPikD44prEIXqucHC3wKLFjCyTLi6IBLgqcAMnS3Znk7jkDRXPFKNIytVB9Y1O4sJES0DoVIEcY8ajs4SSwVwALHzEBEGYMrWIBRlYcP7JNgbXAXilvLXNhbYAlv4BW2cNbnANuwC2zt2IFhJDN0O8d1k7j42IBFGQEyMg7WodxV1Og5bCWjUQPEeIytJDfbZFwIbZ4ZBShpvc7rS9lj8wKIj1OXBhsyBm8Bdbf2AeA3PCD39MGIfWCh2cGHOPlgWCO2AWrP2uDk5PJT4HWpTDg9R6m1e/NYjNx+jIrnlNhytWuIwd0AAlH1MKzgtV9Eck5YBIR6iShpbQMMTSCJgK4AAhJwXXigyAm71Gl9ndnMsOZRBb/XjX5eKiV0KLZYAzfO6t+5ixlXuwCb1D9JjLHrmWKcbGvUfSA3OKGVSn6eMhPHHOlwCNQ4vU6BCX80yIS2uEFglNdXaeoqthl1kHPD7mD57hIX4v3mRALwwLHrcmfAtNJ8+hVvkIFV4W7Lb8jLeDMrIULdZzVnZO24y1l1TMAJMua0yihVQ/W+j/H/P9TZmLNtU01P2z9m2lOc35Jvf/uV9gGYMPrvfmAswCC/V26TXIu4Va7Fpx8WnNY4ZKlg/Duj/ID1YojP4tYxbtYf6dZf5JYMiEwopB78ap5iJS5wgy5hZu6cAe4q5gBq6r4j6a7a6+4G7ABG6m7m565W425/6z5kGW4wxy6K7K5e4+7kGkAm7+7wF4yZT5Y5R5RXDFQgDIAXQAxoQkoga6o0oSjKAHCkjoQiTMD6r0owbxpdSKQ+pdQIbWomCkhdRHI/L9gswFxALKxKwgJlxFwMLCx6DRIsJIDgJzAILty2HcI9wYL8JBCQjVrQCDhr43RmRwD5YwCEgvJ4SoyMqRKjTngMykyOYvLSj6RMSTiPYADUSswU9QpYnW+hVArkyieA/+FSsceonm1oYa+ARI9+UwnynAAAsvKCNEVKnFoCSDunFNYEGoYgelcG5r5I2uujAINIwNTFwDcvMn0UkiwOIOkn4QEYVqnO6J1iDHRkDiGvOAehYtISIGMgzggajpuJ4iwPLuICiqqspnsJCLEP2MBjqnqlqGAPEIylBlMAcPyrcYRgETBrcbECDiKHsOhLEOKhhjIGzpCLGpkM0bFI0VuBejCMMsihinqFDjIOhNDLRmsqITqmBgoTAJBsyjkTBuyuapaohjat1IiQCZhoiSiXcFSRasdG6knoJnAI3lEgfJFJnqoCXl3qJiJIfCiCZrJnhDydWNPvbtQUKUfJwOoCip5o3sstyayUfBZuKSKYfipk0ryZKf7jKWAHjD9C+luJimSTSWidqqBnqhBvNEanibBoSRoUhramSY6lKpSTRtSa6bSThKRj5BRluKYDSaNPnBkNlEgLlGzKYGhP4EQBYOhErDGRYBYAYWzIXMrALLQnzILJAkwnRDYZzPLG3IrErCgtUOgnwjrO4UPFTKPDbOPH6JPNPCpCfPPIvA1h+NGN+OvIGGAFvJ+DGFaHvHohqbPNWGfHABfFAFfNorfMuCNA/HKNeC/MuG/MBJ/LOU/GQP/JQroErLEMsGmWAhYVAjAo3OYHYa3Igh3KoK4KzCJLAM0OUrVHNA1F5AWIkm1Plp1D1DAH1D9HNAtHQEtNZKtHXFLJRNtOqLXB7A7H8FBOyC7D7MOKODtGdFyasi1DBBZu9JiJ9GAHpP4MPKIEgKAIEPIJYmcHgOVCAK4K4EAA===\"}\nimport { Hooks } from 'wagmi/tempo'\n\nHooks.dex.useWatchFlipOrderPlaced({\n  onFlipOrderPlaced: (args, log) => {\n    console.log('args:', args)\n  },\n})\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Parameters\n\nSee [Wagmi Action `dex.watchFlipOrderPlaced` Parameters](/tempo/actions/dex.watchFlipOrderPlaced#parameters)\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n## Action\n\n- [`dex.placeFlip`](/tempo/actions/dex.placeFlip)\n- [`dex.watchFlipOrderPlaced`](/tempo/actions/dex.watchFlipOrderPlaced)\n"
  },
  {
    "path": "site/tempo/hooks/dex.useWatchOrderCancelled.md",
    "content": "# `dex.useWatchOrderCancelled`\n\nWatches for order cancelled events on the Stablecoin DEX.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"ee48b5f79e7f2895e840942af571c220f1e3dff682b0163666b36294801e6325\",\"data\":\"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=\"}\nimport { Hooks } from 'wagmi/tempo'\n\nHooks.dex.useWatchOrderCancelled({\n  onOrderCancelled: (args, log) => {\n    console.log('args:', args)\n  },\n})\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Parameters\n\nSee [Wagmi Action `dex.watchOrderCancelled` Parameters](/tempo/actions/dex.watchOrderCancelled#parameters)\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n## Action\n\n- [`dex.cancel`](/tempo/actions/dex.cancel)\n- [`dex.watchOrderCancelled`](/tempo/actions/dex.watchOrderCancelled)\n"
  },
  {
    "path": "site/tempo/hooks/dex.useWatchOrderFilled.md",
    "content": "# `dex.useWatchOrderFilled`\n\nWatches for order filled events on the Stablecoin DEX.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"d6ebca7ccec7392508f050d98ee570f2e62a86cf7af165696dace79303079a4f\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nHooks.dex.useWatchOrderFilled({\n  onOrderFilled: (args, log) => {\n    console.log('args:', args)\n  },\n})\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Parameters\n\nSee [Wagmi Action `dex.watchOrderFilled` Parameters](/tempo/actions/dex.watchOrderFilled#parameters)\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n## Action\n\n- [`dex.buy`](/tempo/actions/dex.buy)\n- [`dex.watchOrderFilled`](/tempo/actions/dex.watchOrderFilled)\n"
  },
  {
    "path": "site/tempo/hooks/dex.useWatchOrderPlaced.md",
    "content": "# `dex.useWatchOrderPlaced`\n\nWatches for order placed events on the Stablecoin DEX.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"3e7dca1cf113bef29341a671f24d7e6ec1d9eec74f78c78ceefe4f494ee9551f\",\"data\":\"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=\"}\nimport { Hooks } from 'wagmi/tempo'\n\nHooks.dex.useWatchOrderPlaced({\n  onOrderPlaced: (args, log) => {\n    console.log('args:', args)\n  },\n})\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Parameters\n\nSee [Wagmi Action `dex.watchOrderPlaced` Parameters](/tempo/actions/dex.watchOrderPlaced#parameters)\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n## Action\n\n- [`dex.place`](/tempo/actions/dex.place)\n- [`dex.watchOrderPlaced`](/tempo/actions/dex.watchOrderPlaced)\n"
  },
  {
    "path": "site/tempo/hooks/dex.useWithdraw.md",
    "content": "# `dex.useWithdraw`\n\nWithdraws tokens from the Stablecoin DEX to your wallet.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"1ba49397fce40202581f9380b2e1c849c02f8b39dbc63f623cec1edd321703c9\",\"data\":\"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=\"}\nimport { Hooks } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\n\nconst withdrawSync = Hooks.dex.useWithdrawSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nwithdrawSync.mutate({\n  amount: parseUnits('100', 6),\n  token: '0x20c0000000000000000000000000000000000001',\n})\n\nconsole.log('Transaction hash:', withdrawSync.data?.receipt.transactionHash)\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `dex.withdraw` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst withdraw = Hooks.dex.useWithdraw()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: withdraw.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nwithdraw.mutate({\n  amount: parseUnits('100', 6),\n  token: '0x20c0000000000000000000000000000000000001',\n})\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `dex.withdraw` Return Type](/tempo/actions/dex.withdraw#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `dex.withdraw` Parameters](/tempo/actions/dex.withdraw#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`dex.withdraw`](/tempo/actions/dex.withdraw)\n"
  },
  {
    "path": "site/tempo/hooks/faucet.useFund.md",
    "content": "# `faucet.useFund`\n\nHook for funding an account with testnet tokens on Tempo's testnet.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"1a95b41c202f29f8ef89605e6082e91c25c3ea600cf822463485a078a7ff5484\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIAJCCAawRU4aAIYckATioAbGGADmafEgCsVMaQUwGiELwFCQMxmFyIADFQDG+caOs1yiSQF8K6bOYLEylanS6INYQYCKcAGYArmBQiDx8ggB0EaJR1jpJUXAwAGIxUEkASjpRpGAAKl4APADCoRGMChScMfyQAO5gAHz+IuK6ACwAzLLySiqIgxri2kHRsf4mZkgATDZ2pA5OSABs7p44eIQk5BqBTKzsXAaCfZq6qlbG48pqM1o6eLdGy+brwU22z8iAAjMMDtQvMdfGcAvRLmwOJE0hkGMIHmpdmNFG9ENjqLMvnpUukvrJTP8NvZHCDQW4PFCjnoTn5zgiSTFHIxQq0cvlYnUGk0Wm1Oj0ABRYezMHRkOAAfniPxSqMy2TyBSSAAUZXLSHAhWBGs1WmB2hAut0AJTKxJwVVktBZflakpoMqVGr1Y0is0Wq0AHTAYFEsrg0oyfM1iyoUAg1gQelukXYkQKpgUnFEYGz1hCMS4HUYymzudMJcYohk2eYEELnAgEU4OS4aAE8glcGtwd5FRgVwA5HBODQRGZnf4xAok8hkCA6GGsHJ/AADddoOC0YMsJFcYAJQycVyRUgQZicQcdUQKZiMAD0NCHweDC25vIAglgsBLrZxgMGnCcCEYT7pwzBRGINAtIwcDavIUCZsenAALyHskpJoi6MZQL+L65pwpClOUnASoBQGcNUABGkHtmA5EUY2YC1CY1j8ChwC/qh3TgZBog0BKB4OAWYBoPEg4WLQsCiFAVEwDAERJEpg7HtargMRRiFwKIVFyFAHGwfBsSZupBFAd0GlAQKUCcB++b1qJGnVPeNFoHRFkET2YCmeuq4gAAuhQ87SlszD+CFYb6iOAC0nC6qFUVJAFQUgERHrlEYACyfFoDyuZEXAUQyJO/mBSA/QSPiowvLikwAOwfHMeAatZSyUms1JbLSzirPsjKYMyPinFOFx6CB4QLHE6EOph6qurExTEV6OBGiaormuKvQYgMSDggAHDiExINMhKfPMBRtSsiDqICNI7JYkIDd4rJwjQHIgFKZ44BwGB/hBUEwPEEpEOIVa6fA8QAWZwF2KYACSUBKpwYBRMwcmkJwAA+ZqwI0ZhQAA3BpwkOWJtn2Q22MflAUAFXARPeS0EBYLloSKvE2UAwA8izeWGpNi3pWAABq1ZRDALQAEKiDkACipBnqQVQ4C0UOMbYojw4j8Qo2jZBYzjCmUoTxMU6J8R2SJXBUzTdMM+4/qbQbBRG/jf4oTxRAQIwUD+PGiZ4BU+AwLxUF5emYDvrmGD1sBOZxzINbFqWIOkGDcgju2o5pwo2gY8oIf/fx4c5jZzOs6GicYJwhBHryMmIRX1YJzIVEOPwja82zSUzDOSBziAEVhVQqfp/AnCxUHIejzpGeNlRABWMCOKOECcNKcCZ2vBecKuRcV7kYCrklgXBTK/jl3zSShAAyukGSbxPnBB7BEdR5wxaJ5EjBER/we5jvfe4dX6FXzPAOA0Qaylw/owL+cl14yxyDZQBOU8rDkIvAIqJUUpDwvl3MI18wDy0Vk/F+I43wVxgV/Rov9GDNhQWHXk8grbyjLJwMgJDoGfxrPAjeSDRzB3YQrdgJ8cHnyoJfbut8dBoD0qQ/Ar8KHh24d/X+HR/4CMLqg3kr8YAlmDhjUBD8IFFRkNXCIOhbAwDLhjZhpNWHxw4WmaBvDEHWPYfo/WO8oD8VEI2WxwjSCiPnERZg4g7hUFinDZsMcojgVEPwLRxVGDLhDkRAAjuLEQcAWirlvvfcBq4qE1hoSHUIZjswRCcJozgMh+LwC4NYasNZYmDhIPE2ASRgyxQ/F/HeTTE5tzYm/CuI4JR5LAHfMBm9Vy5NCMQ9gszd7SLcnpVcf5xDT29jZJRbMWjQJ3mlT07iQYyHFsUzg8CmiQCIoUAKZUKq6FBCMQ6eICSaCanofeuAKRXRuhrLq91VCPWhCyWEI13qfWZmQTAGyzZk1XJJAAJMAEQadFCuCKVTeFfsExJhAJbUmq8I53O2pVUEqgTpyFqkgBqp1PkgBJoWS65gCQAuBD1EFg0XoQqCKGcMkYQ7jQgHIYMqdgJsxFYDTgPo4BStxQHPQU9d7CrkEUusUAiohywGeIgPtx5+LgLuOQnBYA0VzkhVVIdlD8U4CAlgsDxDEoLsGAAUqIEGN9rBpxZhKsIUrwLLzsGAWCF4dXEH1TZKi1cOgwCopcs8HQcgGi6fRSogiNVavYbQPcmcOhrwjMvOhjBrASquGYUScBED4QAFS2V3rKqVRTrB1MfsnfAgblDQBHKAjtMsVWSrkEkGQEAFC/iWauK1SQnGkHHWWGyk7B0wCSNecoc6bWNPjvAjUyC14dDTjQYlOZq4ADloDLoXj2tAREwyprrR+TgCgR1txrIu/1aq7WgRzFGECJoyjuKzvuks1q17IFXOG4xSQRDxkgqufyEp8BuSwFW+895ICwEvdfLQ95/ZwHvHUscaBopEFWIMJItB7yiCwA+CD4CkiIeYDIAAxLRze0H6xoA2bEYMYHWMOmgxwuDCGkMobQ+ezD7AFA4bxfh+pIhiOkfI5R6j94+P0bQIxljZ5jECYVtaJIz9BFPogC+gd76YDNq3SHHdMCu2QTtVcDgSEd6rnQ4DK16roBatTcGAA+jWmtAB1cQIbFABd8/EZVxnTNWvnkvRw6DZRdqgCOTZyM9EFwxuNWCNBRJmODHADAkd8BnkgNkWpjBEk1Koom5NtltRw0zsHauBUBzgxaDc7Mv8C7V2yyIeQsiMDBhlkV2wpX6wjhMFV5pjZMucDPZ0y9LZr0wDDA6TgN95I1LA5AQ9vI+OcDhveLmQnENoGQ4gVDbmJPYdw7JwjCmyMUaozR7TdGGPMdENFXbMBoqhGinx6KPI/wRHYMGOstDjTsDCRXHzRDaBLhNdkZzRnn3NzfXKtV1a02+UvcGKdI6x2DmDonPd7AZBQEHNaBmqG4ros3PEEnI6P7k6gC0LO7HIL46XcO0dEpicwFJ5wAApHAQcLQrys6pzT+8dPTAM5roL5n+bSAU/ZwWtAMG0Dc/M9OwJEozAdE4As2dg5Au12Qy0OVSWFGKEuTJGuVGcD4yp9T4MtPtT05HDOwNm8bwh2gf0YZ16HAgeW7ABW2PadARN/Ec3fBLctnPDoW3WY242TsN+eQ1j3ey8Yra5AMBTn+WumCVQufGLZi4F6n1zpSAxDhum2CPo3pcAN+exARBmBgmGKsMEe0vLR4orarmi9l514b03uALfAikTc537vwwLCSEQMMAfFf89cHn/LsgldVNvc3veOgy9IJ5UQHVOqYJJAb+H1wQvxfor7qd2QfEiBVirBv0BW1Rfqw15SW37fUSXfasffBMcBI/WgE/Cuc/XYfECwQfPPW/ZGDvHfcoEAsJUwI/U5XzNFTMN/YYVffCcaLfSKVCS8QLWBGsIoEzUwOVMAQcBmKdVdMAcZAAERzDzk4BRX5RgFcAAEJOB2DFAyA+D1kZc5dK14ghDOCKCv5qCqJaDQgBDpCRD1dw8OFgxfJ8JZYEdWAkcjU7cXNG0P0W1EFsdND1w8dI42YuAOMyC5gb4Vswwb5k9CAOhfxGCbChEMY0IHCnDmAXDZQ3CPCddwhmAMBjCQ40JDc/VMdl1IiJQOMWgOE3c01wjIjecicmcydVdKdUiPcvdGclcci1diUONwcIiedCd+dsiRcxcJcVcKdpcK9Pd5cq1FchdGi2cyiucwB0iecZ0DcYAjcTd+d49mYckk8bckJ09Hcs8XdrR8jZdWjJDOBkBY9OBxjE9rcU8ZiHdM9ndrFApiUNC01iDkZSC0IzdKDOB5DFD6CGZ+jddmC2COD9ZuDIp+DBC3jSBRCliJCFcVCMZZCqCaD/UwBlCfi+C1DTjfIpwbxZx5wcgfkQBkA5UygMh4MzsLtUMFB9EogqIkgQhmAxMMM8M3MXJn17wSMnt8NGAqJ7wp1L1rR7kyVdBVhwRXl6pGpiRggl0WUpBOoOUkALAuVnpwV2QggJQbdoA/wMjqjwxtJtAkZj0WglJr58Fqx4o1t4hj1kB/JbROAvYfZSIABqUERsU4EdGSFkuMPFPAFYzcYlVcTnNAIpdtdLDoP4AzbKZJVJLrBQVGAbEcJpXMVxTeaxFoD0l1X0A0LgGzftHeHVFgcQauRU/3edbML+BuSsUIZuBMntAkkQEsU/UIMVMWceI1O8OpfOUDcDenCICUYYa0U7JDS7e8MJMAOqLDKTZYKICjTsgHf3PDTs4YffeXRSYYdTRjLyCUHeWYIMytLrAPL+PhADOs0/GQFIaHficdLEkTds67B0STaTRMe7BpR7JTF7e8Tc6c5jTc0HUgGHR8mHaKWYbsfTfCXHOAUIxpIlNCVQTw3XaowcK2eIYXSnFoK2f4x09osCzgdQYlV00IqVTI/nMC8XCVQsGCworC82BCtQ5Co+dcfCTbEOMDW8l83cls/c87UTI8ns08vDAjC8mkq8lTW8j7JjB8nctAKiojd8kHNMCHEOUwfivKHuQkPuFAJE0wDIfwIgCwJIUEZSiwCwVk8qTEN/DkrkpAaqD5XkwnAUlwIU7qJAPaMUmEYaSUvAc4yaO0QwR0LCFqN0JaZWGAVaP0MUS0Hoe4HaN/QYA6GqI6KYHk86WMYwdqEy26QFEEYYYFfqUFIaNkeEKU8Nb6WFU1XxeIAWd0T0UWM5EObGF2PGaxBVfFZVVtLgIxcBSBCpAqEVEgGyHxMQVMfODNbRMAOHYMSqmWaqgpTeOqlreARq9xFqvxR8mpIBUIbq9NEOKqlsAakxKuDBTHJqrK1qyahhYuGa/CHqwRBamqwa0xYatasa3xNqqazqySx5NYVQaqalEKk6AyoIca4y6QGK4UqYUUxKwaacfwHgvAIytku6j6x6vEZ4VvQOLYMIbYcOOwOAYOdo5ACSWgdUzC1G9G/yYy0EUEUy+6UUsqEIWAREa4f8aaZCCIM8C8K8G8O8R8AcNgQcIgrwyaMglUWaZ0Fy2IPCNNWnWoGbPeHKCzT9VatgMIMPDUDGOG3kCUZdBQAzVyOiYCVifgLyAWb5QSciJlfC1G6SWSeSCIfWuSBSY2w2s2021bA2hScXYMVwLyFCodECioGG7Sd+BGpGxATCgWcaryfwJLUQJAUAQIeQI1UIPATcEAVwVwIAA=\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst fund = Hooks.faucet.useFund()\n\n// Call `mutate` in response to user action (e.g. button click)\nfund.mutate({\n  account: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef',\n})\n\nconsole.log('Transaction hashes:', fund.data)\n// @log: Transaction hashes: ['0x...', '0x...']\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Synchronous Usage\n\nUse `useFundSync` to wait for the transactions to be included on a block before returning:\n\n```ts twoslash\n// @twoslash-cache: {\"v\":1,\"hash\":\"70c6e7579f56d5a55b4b8b81f596b6b59a686064ee970a2e241dca8d21b48c36\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst fundSync = Hooks.faucet.useFundSync()\n\n// Call `mutate` in response to user action\nfundSync.mutate({\n  account: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef',\n})\n\nconsole.log('Receipts:', fundSync.data)\n// @log: Receipts: [{ blockNumber: 123n, ... }, { blockNumber: 123n, ... }]\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `faucet.fund` Return Type](/tempo/actions/faucet.fund#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `faucet.fund` Parameters](/tempo/actions/faucet.fund#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`faucet.fund`](/tempo/actions/faucet.fund)\n"
  },
  {
    "path": "site/tempo/hooks/fee.useSetUserToken.md",
    "content": "# `fee.useSetUserToken`\n\nSets the user's default fee token preference. [Learn more about fees](https://docs.tempo.xyz/protocol/fees)\n\n## Usage\n\n::: code-group\n\n```ts [example.ts]\nimport { Hooks } from 'wagmi/tempo'\n\nconst setUserToken = Hooks.fee.useSetUserToken()\n\n// Call `mutate` in response to user action\nsetUserToken.mutate({\n  token: '0x20c0000000000000000000000000000000000001',\n})\n```\n\n```ts [wagmi.config.ts] filename=\"wagmi.config.ts\"\n// @noErrors\nimport { createConfig, http } from 'wagmi'\nimport { tempo } from 'wagmi/chains'\nimport { KeyManager, webAuthn } from 'wagmi/tempo'\n\nexport const config = createConfig({\n  connectors: [\n    webAuthn({\n      keyManager: KeyManager.localStorage(),\n    }),\n  ],\n  chains: [tempo],\n  multiInjectedProviderDiscovery: false,\n  transports: {\n    [tempo.id]: http(),\n  },\n})\n```\n\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `fee.setUserToken` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst setUserToken = Hooks.fee.useSetUserToken()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: setUserToken.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nsetUserToken.mutate({\n  token: '0x20c0000000000000000000000000000000000001',\n})\n\nif (receipt) {\n  const { args } \n    = Actions.fee.setUserToken.extractEvent(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `fee.setUserToken` Return Type](/tempo/actions/fee.setUserToken#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `fee.setUserToken` Parameters](/tempo/actions/fee.setUserToken#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`fee.setUserToken`](/tempo/actions/fee.setUserToken)\n"
  },
  {
    "path": "site/tempo/hooks/fee.useUserToken.md",
    "content": "# `fee.useUserToken`\n\nGets the user's default fee token preference. [Learn more about fees](https://docs.tempo.xyz/protocol/fees)\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"b8231de1b5901110cbc0e94b2094ed4e055d2895dce944b0b9737724513705ec\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst { data: userToken } = Hooks.fee.useUserToken({\n  account: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n})\n\nconsole.log('Fee token address:', userToken?.address)\n// @log: Fee token address: 0x20c0000000000000000000000000000000000000\nconsole.log('Fee token ID:', userToken?.id)\n// @log: Fee token ID: 0n\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Return Type\n\nSee [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `fee.getUserToken` Return Type](/tempo/actions/fee.getUserToken#return-type)\n\n## Parameters\n\nSee [Wagmi Action `fee.getUserToken` Parameters](/tempo/actions/fee.getUserToken#parameters)\n\n### query\n\nSee the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters.\n\n## Action\n\n- [`fee.getUserToken`](/tempo/actions/fee.getUserToken)\n\n"
  },
  {
    "path": "site/tempo/hooks/fee.useWatchSetUserToken.md",
    "content": "# `fee.useWatchSetUserToken`\n\nWatches for user token set events on the Fee Manager.  \n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"f9462d4450dd5426fccf47a3f9f6bfcb416366af2a61b5019d81726cd9f71789\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nHooks.fee.useWatchSetUserToken({\n  onUserTokenSet: (args, log) => {\n    console.log('args:', args)\n  },\n})\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Parameters\n\nSee [Wagmi Action `fee.watchSetUserToken` Parameters](/tempo/actions/fee.watchSetUserToken#parameters)\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n## Action\n\n- [`fee.setUserToken`](/tempo/actions/fee.setUserToken)\n- [`fee.watchSetUserToken`](/tempo/actions/fee.watchSetUserToken)\n\n"
  },
  {
    "path": "site/tempo/hooks/index.md",
    "content": "# Overview\n\n| Hook   | Description |\n|--------|-------------|\n| **AMM Hooks** | |\n| [`amm.useBurn`](/tempo/hooks/amm.useBurn) | Hook for burning liquidity tokens and receiving the underlying token pair |\n| [`amm.useLiquidityBalance`](/tempo/hooks/amm.useLiquidityBalance) | Hook for getting the liquidity balance for an address in a specific pool |\n| [`amm.useMint`](/tempo/hooks/amm.useMint) | Hook for minting liquidity tokens by providing a token pair |\n| [`amm.usePool`](/tempo/hooks/amm.usePool) | Hook for getting the reserves for a liquidity pool |\n| [`amm.useRebalanceSwap`](/tempo/hooks/amm.useRebalanceSwap) | Hook for performing a rebalance swap between user and validator tokens |\n| [`amm.useWatchBurn`](/tempo/hooks/amm.useWatchBurn) | Hook for watching liquidity burn events |\n| [`amm.useWatchMint`](/tempo/hooks/amm.useWatchMint) | Hook for watching liquidity mint events |\n| [`amm.useWatchRebalanceSwap`](/tempo/hooks/amm.useWatchRebalanceSwap) | Hook for watching rebalance swap events |\n| **Faucet Hooks** | |\n| [`faucet.useFund`](/tempo/hooks/faucet.useFund) | Hook for funding an account with testnet tokens |\n| **Fee Hooks** | |\n| [`fee.useSetUserToken`](/tempo/hooks/fee.useSetUserToken) | Hook for setting the user's default fee token preference |\n| [`fee.useUserToken`](/tempo/hooks/fee.useUserToken) | Hook for getting the user's default fee token preference |\n| [`fee.useWatchSetUserToken`](/tempo/hooks/fee.useWatchSetUserToken) | Hook for watching user token set events |\n| **Nonce Hooks** | |\n| [`nonce.useNonce`](/tempo/hooks/nonce.useNonce) | Hook for getting the nonce for an account and nonce key |\n| [`nonce.useWatchNonceIncremented`](/tempo/hooks/nonce.useWatchNonceIncremented) | Hook for watching nonce incremented events |\n| **Policy Hooks** | |\n| [`policy.useCreate`](#TODO) | Hook for creating a new transfer policy for token access control |\n| [`policy.useData`](#TODO) | Hook for getting the data for a transfer policy, including its type and admin address |\n| [`policy.useIsAuthorized`](#TODO) | Hook for checking if an address is authorized by a transfer policy |\n| [`policy.useModifyBlacklist`](#TODO) | Hook for modifying the blacklist for a blacklist-type transfer policy |\n| [`policy.useModifyWhitelist`](#TODO) | Hook for modifying the whitelist for a whitelist-type transfer policy |\n| [`policy.useSetAdmin`](#TODO) | Hook for setting the admin for a transfer policy |\n| [`policy.useWatchAdminUpdated`](#TODO) | Hook for watching policy admin update events |\n| [`policy.useWatchBlacklistUpdated`](#TODO) | Hook for watching blacklist update events |\n| [`policy.useWatchCreate`](#TODO) | Hook for watching policy creation events |\n| [`policy.useWatchWhitelistUpdated`](#TODO) | Hook for watching whitelist update events |\n| **Reward Hooks** | |\n| [`reward.useClaim`](/tempo/hooks/reward.useClaim) | Hook for claiming accumulated rewards |\n| [`reward.useSetRecipient`](/tempo/hooks/reward.useSetRecipient) | Hook for setting or changing the reward recipient for a token holder |\n| [`reward.useDistribute`](/tempo/hooks/reward.useDistribute) | Hook for distributing tokens to opted-in holders |\n| [`reward.useUserRewardInfo`](/tempo/hooks/reward.useUserRewardInfo) | Hook for getting reward information for a specific account |\n| [`reward.useWatchRewardRecipientSet`](/tempo/hooks/reward.useWatchRewardRecipientSet) | Hook for watching reward recipient set events |\n| [`reward.useWatchRewardDistributed`](/tempo/hooks/reward.useWatchRewardDistributed) | Hook for watching reward distributed events |\n| **Stablecoin DEX Hooks** | |\n| [`dex.useBalance`](/tempo/hooks/dex.useBalance) | Hook for getting a user's token balance on the Stablecoin DEX |\n| [`dex.useBuy`](/tempo/hooks/dex.useBuy) | Hook for buying a specific amount of tokens from the Stablecoin DEX orderbook |\n| [`dex.useBuyQuote`](/tempo/hooks/dex.useBuyQuote) | Hook for getting the quote for buying a specific amount of tokens |\n| [`dex.useCancel`](/tempo/hooks/dex.useCancel) | Hook for canceling an order from the orderbook |\n| [`dex.useCreatePair`](/tempo/hooks/dex.useCreatePair) | Hook for creating a new trading pair on the DEX |\n| [`dex.useOrder`](/tempo/hooks/dex.useOrder) | Hook for getting an order's details from the orderbook |\n| [`dex.usePlace`](/tempo/hooks/dex.usePlace) | Hook for placing a limit order on the orderbook |\n| [`dex.usePlaceFlip`](/tempo/hooks/dex.usePlaceFlip) | Hook for placing a flip order that automatically flips when filled |\n| [`dex.useTickLevel`](/tempo/hooks/dex.useTickLevel) | Hook for getting the price level information at a specific tick |\n| [`dex.useSell`](/tempo/hooks/dex.useSell) | Hook for selling a specific amount of tokens from the Stablecoin DEX orderbook |\n| [`dex.useSellQuote`](/tempo/hooks/dex.useSellQuote) | Hook for getting the quote for selling a specific amount of tokens |\n| [`dex.useWatchFlipOrderPlaced`](/tempo/hooks/dex.useWatchFlipOrderPlaced) | Hook for watching flip order placed events |\n| [`dex.useWatchOrderCancelled`](/tempo/hooks/dex.useWatchOrderCancelled) | Hook for watching order cancelled events |\n| [`dex.useWatchOrderFilled`](/tempo/hooks/dex.useWatchOrderFilled) | Hook for watching order filled events |\n| [`dex.useWatchOrderPlaced`](/tempo/hooks/dex.useWatchOrderPlaced) | Hook for watching order placed events |\n| [`dex.useWithdraw`](/tempo/hooks/dex.useWithdraw) | Hook for withdrawing tokens from the DEX to the caller's wallet |\n| **Token Hooks** | |\n| [`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 |\n| [`token.useApprove`](/tempo/hooks/token.useApprove) | Hook for approving a spender to transfer TIP-20 tokens on behalf of the caller |\n| [`token.useBalance`](/tempo/hooks/token.useGetBalance) | Hook for getting the token balance of an address |\n| [`token.useBurn`](/tempo/hooks/token.useBurn) | Hook for burning TIP-20 tokens from the caller's balance |\n| [`token.useBurnBlocked`](/tempo/hooks/token.useBurnBlocked) | Hook for burning TIP-20 tokens from a blocked address |\n| [`token.useChangeTransferPolicy`](/tempo/hooks/token.useChangeTransferPolicy) | Hook for changing the transfer policy for a TIP-20 token |\n| [`token.useCreate`](/tempo/hooks/token.useCreate) | Hook for creating a new TIP-20 token and assigning the admin role to the calling account |\n| [`token.useGrantRoles`](/tempo/hooks/token.useGrantRoles) | Hook for granting one or more roles to an address |\n| [`token.useHasRole`](/tempo/hooks/token.useHasRole) | Hook for checking if an address has a specific role |\n| [`token.useMetadata`](/tempo/hooks/token.useGetMetadata) | Hook for getting the metadata for a TIP-20 token, including name, symbol, decimals, currency, and total supply |\n| [`token.useMint`](/tempo/hooks/token.useMint) | Hook for minting new TIP-20 tokens to a recipient |\n| [`token.usePause`](/tempo/hooks/token.usePause) | Hook for pausing a TIP-20 token, preventing all transfers |\n| [`token.useRenounceRoles`](/tempo/hooks/token.useRenounceRoles) | Hook for renouncing one or more roles from the caller's address |\n| [`token.useRevokeRoles`](/tempo/hooks/token.useRevokeRoles) | Hook for revoking one or more roles from an address |\n| [`token.useSetRoleAdmin`](/tempo/hooks/token.useSetRoleAdmin) | Hook for setting the admin role for another role |\n| [`token.useSetSupplyCap`](/tempo/hooks/token.useSetSupplyCap) | Hook for setting the supply cap for a TIP-20 token |\n| [`token.useTransfer`](/tempo/hooks/token.useTransfer) | Hook for transferring TIP-20 tokens from the caller to a recipient |\n| [`token.useUnpause`](/tempo/hooks/token.useUnpause) | Hook for unpausing a TIP-20 token, allowing transfers to resume |\n| [`token.useWatchAdminRole`](/tempo/hooks/token.useWatchAdminRole) | Hook for watching role admin update events |\n| [`token.useWatchApprove`](/tempo/hooks/token.useWatchApprove) | Hook for watching token approval events |\n| [`token.useWatchBurn`](/tempo/hooks/token.useWatchBurn) | Hook for watching token burn events |\n| [`token.useWatchCreate`](/tempo/hooks/token.useWatchCreate) | Hook for watching new token creation events |\n| [`token.useWatchMint`](/tempo/hooks/token.useWatchMint) | Hook for watching token mint events |\n| [`token.useWatchRole`](/tempo/hooks/token.useWatchRole) | Hook for watching role membership update events |\n| [`token.useWatchTransfer`](/tempo/hooks/token.useWatchTransfer) | Hook for watching token transfer events |\n"
  },
  {
    "path": "site/tempo/hooks/nonce.useNonce.md",
    "content": "# `nonce.useNonce`\n\nHook for getting the nonce for an account and nonce key. This is useful for managing multiple nonce lanes for parallel transaction submission.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"0f0dff491f1f51aaa648ec0523093330756da7886231a68a5880eae563132b80\",\"data\":\"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=\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst { data: nonce } = Hooks.nonce.useNonce({\n  account: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  nonceKey: 1n,\n})\n\nconsole.log('Nonce:', nonce)\n// @log: Nonce: 42n\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Return Type\n\nSee [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `nonce.getNonce` Return Type](/tempo/actions/nonce.getNonce#return-type)\n\n## Parameters\n\nSee [Wagmi Action `nonce.getNonce` Parameters](/tempo/actions/nonce.getNonce#parameters)\n\n### query\n\nSee the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters.\n\n## Action\n\n- [`nonce.getNonce`](/tempo/actions/nonce.getNonce)\n\n"
  },
  {
    "path": "site/tempo/hooks/nonce.useWatchNonceIncremented.md",
    "content": "# `nonce.useWatchNonceIncremented`\n\nHook for watching nonce incremented events. This event is emitted whenever a transaction is executed using a specific nonce key.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"3c41f7db5af5a58ed8f5640547d78b93c2c5a437602369ef24ea876941670c37\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIAJCCAawRU4aAIYckATioAbGGADmafEgCsVMaQUwGiELwFCQMxmFyIADFQDG+caOs1yiSQF8K6bOYLEylanS6ICxsHDx8gv4i4roAzADssvJKKojq1OLaQQaRsqbmAEw2dqQOTkgW7p44eIQk5BqBTKzsXJBg1rjCmroALLFJispqGpk6eO2d/iZmSEUgtvaOfogAbFXUXrW+DQH0eABmAK4daIwQYJxHcDAA6qJotgByF50Akh2kMMzyNFAAPABhC4HRgKAB8AAosPYfk44AB+RCcYAAHUunExi1MbygSM4YCOzAARmROAAfK5gWCgsxQADc6MxmMyiORaIxzOZDmsEBOaHxAAMLLQACTAESkUwKVyCimcYViiVoKWKWXIAC68sJMhk8pONPyDKZXOZkxgAGkYBh8cSwaYuJS7QoHZrtUddfrqTBaTBjZzOK4vYa6YyAwdSBBmAAhGQQaz8W32sCOqkhv1hrkXACipEjpHxkMhZHzyNz+YAlJwALzgzhECCMKBVykGn1G4Pt0MmzFsXX4lVHGCd31QEdGzPMvszBQfJxEUQyfGEklk1ve0fj7sBi4vDowD7WL4/FN+wuQ1nIgDuD2erwPn2+vz9ADoAIJaOAUThxhTX2/4Hu7yPiefwvgAMhAChVrW9aNs2W4Zj2nC8mAoIKPiwJoWCiH+ly8iiMSch4sixJ8HIoiXOu6ZjtRXZIWArgVsiDZNuiYCiD8cAwp0Vw3PcjyAfeh7Hs+UD+FA8YIHoOScAc7CcDegnSgS96cKYR5PqeY4wCQKZwC+/hiAo0nIMgICwFgXzWA8fr+AAKvgjBwHJJyOOclx2C5pLyJwlnWbZY5sCIAC0b66jACiRgAstAZAPBAL6cG8XBXownqkpwx6+GOpicKIrloEcXz1mQcAeYZGoUOZdCcVgcj+IKTVoHAtDoiErQouEhiBnJkbMJwADkN4KMwjAAPQ0C0g3ouixynB5nBvlgWCQlWHKYjkBnmi+1x3ABQEPppoF+pCG3MruwkgWJF6ft+v7rchWIXHAEByC+v6QoNh3qdd2mIIN36shWyHuCaTGzRiXxFaQlz/FAjBEOCAm2Cp8mkKp+6/cdvwGS+L7/ONCNI+irjok1gogFV5kwqUzD+LTnE6GVnAhZwAAKsLM6QBlU1VIDRBIiC9NIxjJMMiAFL0oxaOMeh7SjQn7iJWl/NM+RzMUSzlIgACMBQbJgNR6HUfiNPsejQpGOAcBgVaXcrf1/Oel6KQdV049p753T+UH/oJh0qydUAQVBMF1qxCF0aOElSXggKLjIxIOPwnBoBAv0Nvww5XvgvkFea6kuRpole1EPRIPEAAcgwpEgus1xkstBA7wGe2reSzIgAwLCUZQrAbHibMbPj1EZTSW4zcJkFWrvnSy1i8vyyKKuKkrSrKk6YuaVoYKRyZoFvBIwFeh37y6KZhq45cxFIotyEMqTS03WR4Ky6tdz3iylMszgFLEhstgmx2OPC2IBoRcycFWX8/s7yO3bq+SCCgb5C11hYdID867dxlq/PQv4P7mC/n3X+cw3BDyNt4U2uwaBgI4lxHiw5UKvTkOiBcGMmFvRgMiLCzCugWTjnoRyw5BQcLkHKZg0APTDissQJs8B8qcHKqwOQfkYDEiOAoC+CgUIvU4WnOwXBnKKJYOlcQacM7KBgOiAAUqIBcABlI8jAsBcFEcOH4iwwDOQGjIogcixzEgwIpNRnBiSRivDcHmL5IZCM4BIqAUjOB0FCC1NOV4M7cRgNYRgoJrA6JaGYfSiBIYAColoKh4ZwuU1gZCiDgC5NKyg4k6EIFAFycAji2Hyi5ERuj3qfQrIKb8vSwC8JfCWdga05SUTHCMsZN5YZTP0Q8FClFQnDj2mOdOikpQ0HMflMAQSXiwBfAAK3aSqGAnFolgDKW+TgCg4zJz1HMqpv1ohY1QuhYqfp9lXl2cObZyBBQyM6PUl8IhJJHDQIKDUkJ8BoDQFgOAiBxrjUgLAc5L52AKCJlJcatSaChSIFLF8tBxqiCwBNUF8ADIIuYDIAAxDS+pkK+RoFntSdEwKWUGUhSWWF8LEXItReiuKWKcV4usHAAltliWkvJZS6lkYwV0rQAy5lKraX8rzBWJKsTHkQGeQqNx1S1mZU2YpRgyh2XqRaBwFSliFQYq4aauJkj3qQwAPolJKfcWG0pfVeuRAap5i4dGjL0Ua05WS0CDRcnCVpLlxDDjMNavO7CXrORoCmGQGB0RwAwB0fAkZIDXB/IwbO+jhxhIgBEskb52ZvBcpYoJXwbgkjkN+SAGMU3VqCUw7Nvw83ojqUW2wpa+QuRMFWxOnAICWIxscmAZyLlfE4gZTg9iYCArzpwYFkA9kXE4Ly5K40ADygqEVIpRWil1EqtBSplYS+AaAQokt6GSilVLxq8pfPSplogQqHpgCFC4IVeUhXOFWdG6IJElVMOjZgDwKqQ2zLQOqKjriOr3Ya41ryxHFLAOTJq5z0RuI+lBL6eddQZ3SaQGQUBBoVjDGijmqoWrIho3GRS7BGPfm2Wy6F5G+krs+oNbjGcACkcBAZDXo4x5jrHxrsYdCizgkneMMagAJjJaAoVoBE5G96EzSCQjMFeTg5ZJmDVuIQCAyLvyvUTSpZOY47ArXkH6ZjLH0RsfZhxlypnmn1NENoA5Y5ogJjTj/QFenYB5iI2xzE1nSDIjs3wRziiowtNc6IdzlKcB0j8yprkKzkC6UXBqNIetVAldNCsxxUoXEvlICcD4jlnJYRoVwczcVEBEGYHrWIBQ9ZVxBmAZL3IuDnuJDGxwrX2tgE63AbrgROB9dgANobsQLCSG7uN+rZW2j9YdGQDiMhf1avqeNOgWToUeUQPEeIetJBHem/uyrMgNQhX+YVsgaxJYFHeyyLgX2mvON6y6xAZ3YaLiu/GWlt3aD3bOBcJ7qw1gWAm1N0Hqktuw4u+NZDphbsLhkF69eihJaxG7pDJhbQmY1iGrcdKeoABKRrTCvTAINMMFGFlgEhIKAAIpRbQGNxR0JgK4AAhJwMXigyCy8FL5ybKmAtqeRIriXnBWeek53aSNYB5c6+V7pxR+mSwkcFGhjDyiNnlUUNWiponqm1PqURm3ZGOgvS4La6sDydD2MuZxexOXCBXjWvzv3SS8zM6yCH9dzBw8/Ej9HozIg4kYEqSowPFmI1jNzzASE7LvwljV3BnPonKMKGozAWjWnFNq/84FrjDeeMKZ0/s9lVfi+1/r43mTcnhp8aYy3jXbeNMd7o2Pi3vewDMGr8ZldpnzMnys3mGzGWHNfmyy553bmNP/bpD55Tqmin7tS+l+zWXnO5cP/l4/nm6RVX2db4jvvRmM5+Mz2zbPOBDducLg+c+8a9BdhczdJdgBpc5cFdxdldVdz9NdL8oC9cACgDjdTcEDSBZcLcP8KYjIwtTJzIbg+FkBXpipOg4Vr0RU0UXRlAjhiQXxeRmAxVMUZUXVxoiIjVxoP0v0TBiRxoKNzkKw+Zuhb49ZdZ75xZUhEgX45YFhRMCEkBn5v5+5nBehAER4qFQEghIRE1oAqx+9PouI4AwsYB8RKIMBvx8ZsUXEPJFxOY6Z1NrDNRmI4ImwNsABqXWedeoOMfLMQqgSSaVPAFA1JbZQUITGFK1JpCzGYFdTgaKD0M4eqYcTIIkXGVZS4TKGEepP0b8RpfAatOaRgHmLgS1OpF3KyFgcQIJMwiwiLfKT0fLBGNHC7PiX5aojpYkEQa1B7C4VhRcIcdpExWpDGIFEFDjA4SEWIQZGg4VUVZDMAeIbFR9GYI4clFYiDCwmVFY2IK7B0A4F8WIf9dVGQCbSEJ1TI0CZNEqOdfIm4LZDOYFB7GQF8JDB4KZRYm9UVe9AySVUI59OVN9fgxVH9d484jVd4r4tAOEkKYGPVSGCmH3BnHRfkZnVQGPFfAfQaJeFMZEKTJjb8AkjlZAqfMk5EdQfZGIzPThPEqkuTMkifC/TjDEwkzgGkwTfTBfCmSGbdYcN4s4D4uEn4oVP4u9cVQEx9YE2VIlMEhVb9CaKEgDRlWE9gZDeEzUh4REz8GDBSeDYcRDHUjowyUYEyJAMyAWDSPhIgCwF8XWR0iwCwcQgWCuPWAoeQzBCWHuTQXBYwKCFQ4WLWH+HWfWbQyhEBc2fQqebmWeT8dkZCHkPkTk1eZUVUGUQUI+Hea0c+B0HMk+M+UJA+K+FBXQXWXoKwMWR+VQnBRQ9+TucwNQ4hHWAoVQVwfmXkWAZoFJLqLaXqCMKMeTMLMaSab4NgGaT/LaF8HaBWd2eBUuP4M6E0VuI6Jcv0ZEW6Eye6MOGsOseeQvBk8TS8OTYGcGCgUmYIkAOEUQJAUAQIeQcqC4PAFqEAVwVwIAA==\"}\nimport { Hooks } from 'wagmi/tempo'\n\nHooks.nonce.useWatchNonceIncremented({\n  onNonceIncremented: (args, log) => {\n    console.log('args:', args)\n  },\n})\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Parameters\n\nSee [Wagmi Action `nonce.watchNonceIncremented` Parameters](/tempo/actions/nonce.watchNonceIncremented#parameters)\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n## Action\n\n- [`nonce.getNonce`](/tempo/actions/nonce.getNonce)\n- [`nonce.watchNonceIncremented`](/tempo/actions/nonce.watchNonceIncremented)\n\n"
  },
  {
    "path": "site/tempo/hooks/policy.useCreate.md",
    "content": "# `policy.useCreate`\n\nCreates a new transfer policy for token access control. [Learn more about transfer policies](https://docs.tempo.xyz/protocol/tip403/overview)\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"e13be9674f34cecb6d1efe8ccab1940abeb9e94a06d019450df7b8523742032d\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst createSync = Hooks.policy.useCreateSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\ncreateSync.mutate({\n  addresses: [\n    '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n    '0x70997970C51812dc3A010C7d01b50e0d17dc79C8',\n  ],\n  type: 'whitelist',\n})\n\nconsole.log('Policy ID:', createSync.data?.policyId)\n// @log: Policy ID: 1n\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `policy.create` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst create = Hooks.policy.useCreate()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: create.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\ncreate.mutate({\n  addresses: [\n    '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n    '0x70997970C51812dc3A010C7d01b50e0d17dc79C8',\n  ],\n  type: 'whitelist',\n})\n\nif (receipt) {\n  const { args: { policyId } } \n    = Actions.policy.create.extractEvent(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `policy.create` Return Type](/tempo/actions/policy.create#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `policy.create` Parameters](/tempo/actions/policy.create#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`policy.create`](/tempo/actions/policy.create)\n"
  },
  {
    "path": "site/tempo/hooks/policy.useData.md",
    "content": "# `policy.useData`\n\nGets the data for a transfer policy, including its type and admin address.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"a27f67c0f419f67e0995e3865a87b2d08d15ce406ed36312f2acb9580f1cc1e3\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst { data: policyData } = Hooks.policy.useData({\n  policyId: 1n,\n})\n\nconsole.log('Policy admin:', policyData?.admin)\n// @log: Policy admin: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb\nconsole.log('Policy type:', policyData?.type)\n// @log: Policy type: whitelist\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Return Type\n\nSee [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `policy.getData` Return Type](/tempo/actions/policy.getData#return-type)\n\n## Parameters\n\nSee [Wagmi Action `policy.getData` Parameters](/tempo/actions/policy.getData#parameters)\n\n### query\n\nSee the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters.\n\n## Action\n\n- [`policy.getData`](/tempo/actions/policy.getData)\n"
  },
  {
    "path": "site/tempo/hooks/policy.useIsAuthorized.md",
    "content": "# `policy.useIsAuthorized`\n\nChecks if an address is authorized by a transfer policy.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"8b9aa7de863db2bb7feb28203f7e1e641e9774ded5f3aee5221a9605f2ab7693\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst { data: isAuthorized } = Hooks.policy.useIsAuthorized({\n  user: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  policyId: 1n,\n})\n\nconsole.log('Is authorized:', isAuthorized)\n// @log: Is authorized: true\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Return Type\n\nSee [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `policy.isAuthorized` Return Type](/tempo/actions/policy.isAuthorized#return-type)\n\n## Parameters\n\nSee [Wagmi Action `policy.isAuthorized` Parameters](/tempo/actions/policy.isAuthorized#parameters)\n\n### query\n\nSee the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters.\n\n## Action\n\n- [`policy.isAuthorized`](/tempo/actions/policy.isAuthorized)\n"
  },
  {
    "path": "site/tempo/hooks/policy.useModifyBlacklist.md",
    "content": "# `policy.useModifyBlacklist`\n\nModifies the blacklist for a blacklist-type transfer policy. Requires policy admin role.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"8612238fb35eb7ea94d9d2808311c32ba32c9e01a54e93a2838af6a38747928f\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIAJCCAawRU4aAIYckATioAbGGADmafEgCsVMaQUwGiELwFCQMxmFyIADFQDG+caOs1yiSQF8K6bOYLEylanS6INYQYCKczNCMAGYYAEIyDvwmIgDKGGDWiDx8ggB0bCbWGHkArnAwALJRsQlJKWjpmXkASjqlpGAAKl4APADCodGMChScpWD8kADuYAB8/iLiugAsAMyy8koqiACM0tTi2kGRUDHxidbJjGkZ1v4mZkgATDZ2pA5OSABs7p44eEIJHIGkCTFY7C4BkEi00um+6mMW2Uag0Rx0eGhRke5lewXenz8iGeAA4/tQvIDfCCAvRwWwOJxCoxirDlkgAOy7TaKFGIb5orQYvTM1myUy4t72RxEtYrcmYAF6IF+UF0vTRCaORihcYVapnWqXa63TIDIYjMYTKYQWZzAAUWHszB0ZDgAH5sliChAiiVylUahd6jdGnc8gAFZ2u0hwc1gYajcaTGbzACUXtycB9frK+qDdSuDSa1la7U6PRw8cTVpTtvmAB0wGBRC64E7rDA9YHDcGi6GS/4oBBrAg9NDONF2BEg6YFJxREzfSyMJwAEbGhp5JtNgByEBo2S6+BunFPi7gd3wpFCEHKnEIAk4ylEXGmokYaDgk+nyi7aA+MJPh1MAmzQCB1y7UxrBkUpYCgThdUXDcR34SCp1ILtMLQDowDnBdOEw9tQgqPJ/DEBQx2QZAQDoVssDkfwAAMWK/WgmxYBkuGAHJDE4VxJxvZhOAAcnfBRmEYAB6GgIREncEy1NAQM4ABBLAsHtNNOGAJtOE4EIwm4iJSjEGgxhuCN5DORR+M4ABeXj8lFf1817QsTTDTItIU/TsNwzh7T0/TOF6NdTPA0CwBCkLQn6Ip+Hs4AtIcuYTLMmB7R4lyAEkoGyZ4wDGUQoCgIi4GyESLFoPJapEsYiIAlkaHy59SFKLtXDTVxgpis44FEDcYCgJLLOsuceuikK5l6kLVNK58II8hpZt6KTwrQSKZqmtMm0mlimJAABdCgaKdD5mH8c7Wxjb8AFpOCjC7brIk6aP8zojEqUzXxUojShkNBXpOkAlgkRAORJHlthePFNGOPAAwNc5loHO4HglF4pQ+GVnBWXYFUpZVqXIsE9EM8JThRzc0cyTNDBzFc8x7amQ1NUs2hwis+kGBNLWTG07TZcHdhJRE5F5HZ9kFBG9Cpo02a8+5xSeRBEVsaUvksQmlR8YFSfVEBHRvHAOAwbTmB+w9AqIcRGEGuQKpndyafZyNoycONecTOYxggLBlJIz1OG+jKAHkA5AuNdKm/TctatcRlMNAAG5ZtKLAoFfMhsiY6qABJgBEUgJqYtPY4XawQgmNBc4LoumsUVwy9mxqS5lBO+DkUQwHLmLMM7RgA6PQCBu1UI2kHgPy/cTg4lECoAFFSBvUhKxgMZ5b7TyS3d57PerEZfYF1M0oAH2TWBhjMKBtPstKiAgRgoCHEcxxAY8u0tsyVM1TJA+ihgO8Bke4gJkDITg0xPz4E4LbEuDt4CLTaiMbQpBnz4C/lbFSPcEL+wAaIcBq5HyCEQtFEqZx8EQOsAQmQa4kiIUjiRMiaJKJIGoiAa6l0qBwPtkNe6nBP6wLtgg78EA1wACsYCOCQU6OA35wLoK7Exb+v1QgADEwBMVeqdDhzp/B4KjnkUIqRShV3gPw48p4/7j2ilA8Bk5GCYUgRg6Kf50qqOiqeOApjOxyM1BAnBkDGD2LXF2WRFQEJuJUQAkS35/qA20WdPRVADFMNCMvVenAHqWO/NYgBQT7HDCcTERR7j8nyGrmAT2C5opkEyYEuxEDQlMgXhE0pdT2CJN0RdfRjCwhGLAKkHQaA5AIWySeXJSkVKNIcU46YLjSnRJUqeGA0CyCcG8WYvxAMZCrmiDoWww1EJoIqXeKpboamcA6WgwJzTwlHNWX+NBbis5iGOVclenTjo6MwswcQMIqAPRytETgQDSgRFEPwTBgMh5yEIjAAAjh1EQcAxhMWMT48xTECkQKKV2UIuyFzRCcKUxINBwjUPsWCkSJAIWwG3GAB6ql7FuMpbQ+heSo6BXRYMzFcimJovSZ80gArOA8qGZtUZTFtLiC7I/Z+k4pkkWKmASJGD4VcxvkI2CXYZnNJGJATCUBgbCDhC8Cw4tkQ7AFIcIUJwra4BVuYdWBJcbmp1t4FUNIaCG2Nv7MgmAZWlXKtkBsIBqochWM8KAaxVD9GsN8b4cp+gWrWM8SQzxVCiDWGuEkKwVhxGsJIGAHJVCSFUNECwa5F5rjXGG4Wuhni7BtRLGGEMZbChAOQ8qGNVY2o1jjLWzwPVUn1mqIIfrTaBqXH6PK2RE4KGTg2l4HINhIklkgKGtrZYcOXMUPKvbzAcmxoSZww6PAUl1l6g2E6sAmwDebeFxdmrDWyABDqy7iQkgOK2vkuwrDbs7W3F9L8nWbpPW64kI7iZjtpEEFsbYOxdgpr6GATY4EGRIqh7IvM4CodfqOPAgimIobkNi04AMwk3iIM/RBF5OJwtgOFBQi7bKkf/HYLgXiWDBPEEgv8TYABSohbapGsCXAOmGwioYiFIuweE4DCTvcQWjCE1yrmmDANc64bzTAqLGBlTZBEUbhXQLi8jpgQXbFImILJMMQjMFUiqCkABUakxW4dQ9imCrSgnKFk8oaA35NkwIXmK9jeQZAQAUFpUVJGsNyDyNc2LNSELxek4l98nQUsvi4NQ6KzSAyRIgtMEuNAkE91XPuel4jgsARgK2BlbnVKcAUFFuhED0t4bI2eIyPdOxScTB0I5CjSufn/BBZATFlO+OzCIYcpkmJHXtPgTaWAKpSSkpAWAtWjFaCksOUcUkyXwDQHdIgzwVh5FoFJUQWBpIzfMXkVbzAZAAGJHtyPm3eNAMrVVNim59ubaBYAryWyttbG2tvQBgLt9gCgDtv2O9nEQ53LvXdu/dqSQPntoFex9m8s35t1LTHkAR6q2tiIIeFhLMBvOgMK20qBgXTJnghBwfCbimLbZgIgdj5HoCUcM2AAA+i5lzAB1cQeFFDi5F0eCn7XqfscQhIqRaBYkBcIFAb8srOBmDWWgimoZ5AjIwE2S8mRry3nvCYKFpS1y6f02pCMOV5EYNXERGAzAhpjENQuJxf5VzG5EKb3ZTYF5XhvJAW3jB7c0MQk8zg1WYB5Fqxs+rrZsycCGRxrsU3IDld1EDzgOUpJh3B6ttA63ECbZ53D/bh24DI/JWdi7V2bt3Ye4Tp7L33uiDuoXmAd1Qh3SB3dHU2kMJNkiMUhM7A/kAOF4vWg9E4XlE54rqnnX+eIAUgdWrTYItRZiyJDB4CSvsBkFAESaZy6bceiXJz2Rz9RcgVfqAYwFHfdMkf2nkXot7Qz8YAL9OAABSOAeqUSSzUga/W/e/KSR/ZOJ2V/S/WAz/JBH/NAP/DLVPZLMwaYTgDJdgIAiXR8dbMYPDF0ZQfCOhBCOwDSeQYaW/O/JsB/CMJ/L8D5TJNsAabQVLDPehACBwCbDPUHUgPfMAB/fSYgiQzgMgvgCgjZCAagk8WyOgh8O7HAG+NgxAmKV8TgZAGAW2GQI6NWPYVQXQmKBcLgMTCTIGdqMAHKboCZXmH1Lge0HnRAIgZgPYNNPYEkXaKQvQkKAwsONXRwPIRw5wnJNwwIQKLwnwxANYCwSQZIwIqw/QrgLw5OMgFsGQbHHvORKSOgKRUyECCGDkPYSQTI0IrgIwkwo6O6UrLQnOb4YkZ4Wo/SAw4wghOwoeDwnI85ToAhQokccxEo2gMogBCGdo74CwII6Quo/XGHRAXIkYgov5UwEokwkXZ9RQYkNYZIhSCmbIm6ByUSCXYJCBFoMRUwPDMAEScuCLLLMAe0JiAAER7lQU4ELgQxgFcAAEJOAvjFAyBATpUECkDn8QTvj1krj7FbjE5pMwBgTQTUFASv8rMQc6kmwDoFIV818uwN9bIudPMesfM5FJC8SWJD9MgSIuAfsLjjhUhM9mBUgVCYBCBpgtJniGTuDmSdBWTMJWwOSXRuTeScDKYMBySuxHICCpNutU9ZT7QfsxgSdy4Z8ZT/8T8gDUD390D4CrCODkCX8QC38YDr8sTEJf8wBmBtTcCADT99SICoCxIP8jTgjoSvwzTQDLSMCFEfstTZSkthVPCYBCDZDSDyDUVlDVDaCSpNDGCb4WCoSTSYTkBZDsgFD/ZYyqCdA1D5wNCGDtDhoTokFcSopTj9dzjHIRIESbi7iUSnjgz/9Xj3j0T1k/ibogTYSwTSAITWCvT0yfS+yfiGzOAkT7jQg0S4SBzrTKyDpyJRBWEUAaIKhHUQBkA8MOhOxlsq8a9NtF1lBSg1w8gQhmBocdtm8ed1p2spJ28McTA1wpIItas0xjoQYwZdA1hdhuR1021j1AMgh2ND0kA/yIMtYLBoM9ZVQ4M8B7RVDoBtIQzdTeCVyYBg5KsxhaojE+kCEnos9shKtkAjoMxYEn4EJ7QABqXYRCYEKLEqD8qgJvPAEc+RCCJiLA7FZnGBAgnEMnb6GFBiLsI4UoF0JzEBArMJVpYaMYXixRJsIpcIIrBcd3KjFgcQVcdC/gwJBPchT8ECanVSsLbxNcEQT8co0IdDAhZFDZHjRIZ5SbabTg6Ie0NYNMSvNbWvKSP5MADkPbBHR4UoG7PysfDC5vPytYQo5OaIPINYXHV7II+0NxMSiSrgvXBPe5YrQwpicomQPIDCRfWLfcyHHy+vbMeHRHI7E7VHR8zvLHfKxK97fKoq18Nqs7I4OANMUnffWkuAKUvLM5LgRyVQPkx03UkSSpWucAm/MYaaoc9gzgp2aa7IdQTAkHIM+kiawAqa4axAKAhatM5a7IVazgda7/Ta20/EqKXPXKpqjqkqiHavKHCqwK6q5vWqtvdHBq6SJqvvN7Vqhfdq4GzqrQbqn8NBWfKCefUgRfECZhQ4Vc9hOAaCTcogCwPIXYLGiwCwT801dkZI6WACvkNdeGTtE/MCvYf8gdU9TdGC69cdPAasreVGdmemZyPdVyFmBWfsN2TmXCdeQ+JMa0U+T9OUFYaGP9A4cmk4AsV2JWKmiC/ETWWUNYBmkmJmvQSdB9bSV5UQbIGOGKeOedJOKpPuEKDOV5HOMVeufYhQZuC27oqufa222gQue2x21uU7duFqedLuBrXub2qeGaroUeYCCeKRVZaePaTgC+CYK+CUUDEAVivQQRRIcITZWbfxQlIiX0EgBCfWyGxZLBUIYXIzdVDOrgLO8xHOz3eAfOo5IujCEun+MuhSCursKujZPlOAOup9Ruwu18RcFuqJUusAculwruheau3u/uvOmQAuzgZu38dVJZMu8W74SWkmnYbe2WvAfWpWmm11LWVQdWi9RUT1TW+C7W5TKdR9AeaO0O8OmxSeJ+8WjkADX9HYIC/evQR+gYo+yCokMtDW2DdwhCu+3WtqHuMeABbgBefAOud2huJ/B27FeO1VGAa+YaAjd+BBuAGBCAEFGg+RF+gBD+rdb+8CxEP+6gchkCAhlQMDam4B5wb4DkGCiifwf4vASmgm8GNYctKWnYADCBtOhh3UOwQh7IaqXYZ4OUVQDh79CwQaawK+eRxR5RyQVRtcdR7BzRlYJRyGHRtRjRhRox7R3R/R6IJWtdWmyDaCkGEIWAekSEHSJyb8ASaIISaAlcySGSb3NgeSKs/k1mhWksC470FyZmZGXmneO4HyKKB/foBPZRB1bFUwJ9NgMIUQgMG5GxQKVPBQMnDaSKAyBKMYIqnutcSSORECII8JxWXeaJTKI2hcYNcxSqCNKNGNONBNJNFYFNM+9NTNbNXNfNQtYtUtctStatWteqYKE2zgXYIqYKYDDuN9dqDePaIIqU1DJ0oAsO2BiO6KaRpBqAppvmpWPIfW90KIqOgYvIYQoCGxJhoI/wag0QJAUAQIeQVG0IPAL8EAVwVwIAA\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst modifyBlacklistSync = Hooks.policy.useModifyBlacklistSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nmodifyBlacklistSync.mutate({\n  address: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  policyId: 1n,\n  restricted: true,\n})\n\nconsole.log('Transaction hash:', modifyBlacklistSync.data?.receipt.transactionHash)\n// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `policy.modifyBlacklist` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst modifyBlacklist = Hooks.policy.useModifyBlacklist()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: modifyBlacklist.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nmodifyBlacklist.mutate({\n  address: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  policyId: 1n,\n  restricted: true,\n})\n\nif (receipt) {\n  const { args } \n    = Actions.policy.modifyBlacklist.extractEvent(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `policy.modifyBlacklist` Return Type](/tempo/actions/policy.modifyBlacklist#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `policy.modifyBlacklist` Parameters](/tempo/actions/policy.modifyBlacklist#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`policy.modifyBlacklist`](/tempo/actions/policy.modifyBlacklist)\n"
  },
  {
    "path": "site/tempo/hooks/policy.useModifyWhitelist.md",
    "content": "# `policy.useModifyWhitelist`\n\nModifies the whitelist for a whitelist-type transfer policy. Requires policy admin role.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"7679b70c1a9955fc42af8bd9929c68a4bdb7d8b9fde73dc5c771f97554c0150a\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst modifyWhitelistSync = Hooks.policy.useModifyWhitelistSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nmodifyWhitelistSync.mutate({\n  address: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  allowed: true,\n  policyId: 1n,\n})\n\nconsole.log('Transaction hash:', modifyWhitelistSync.data?.receipt.transactionHash)\n// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `policy.modifyWhitelist` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst modifyWhitelist = Hooks.policy.useModifyWhitelist()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: modifyWhitelist.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nmodifyWhitelist.mutate({\n  address: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  allowed: true,\n  policyId: 1n,\n})\n\nif (receipt) {\n  const { args } \n    = Actions.policy.modifyWhitelist.extractEvent(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `policy.modifyWhitelist` Return Type](/tempo/actions/policy.modifyWhitelist#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `policy.modifyWhitelist` Parameters](/tempo/actions/policy.modifyWhitelist#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`policy.modifyWhitelist`](/tempo/actions/policy.modifyWhitelist)\n"
  },
  {
    "path": "site/tempo/hooks/policy.useSetAdmin.md",
    "content": "# `policy.useSetAdmin`\n\nSets the admin for a transfer policy. Requires current policy admin role.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"fbe0fb128f663b81203c3f14323f7bbd58a2ebdc7f33ada3627157b6f722bbb1\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst setAdminSync = Hooks.policy.useSetAdminSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nsetAdminSync.mutate({\n  admin: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  policyId: 1n,\n})\n\nconsole.log('Transaction hash:', setAdminSync.data?.receipt.transactionHash)\n// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `policy.setAdmin` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst setAdmin = Hooks.policy.useSetAdmin()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: setAdmin.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nsetAdmin.mutate({\n  admin: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  policyId: 1n,\n})\n\nif (receipt) {\n  const { args } \n    = Actions.policy.setAdmin.extractEvent(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `policy.setAdmin` Return Type](/tempo/actions/policy.setAdmin#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `policy.setAdmin` Parameters](/tempo/actions/policy.setAdmin#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`policy.setAdmin`](/tempo/actions/policy.setAdmin)\n"
  },
  {
    "path": "site/tempo/hooks/policy.useWatchAdminUpdated.md",
    "content": "# `policy.useWatchAdminUpdated`\n\nWatches for policy admin update events on the TIP403 Registry.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"c97041b0026ec81821f4e52786e61b498aaf99fd2e23ce80fa9483d396001836\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nHooks.policy.useWatchAdminUpdated({\n  onAdminUpdated: (args, log) => {\n    console.log('args:', args)\n  },\n})\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Parameters\n\nSee [Wagmi Action `policy.watchAdminUpdated` Parameters](/tempo/actions/policy.watchAdminUpdated#parameters)\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n## Action\n\n- [`policy.setAdmin`](/tempo/actions/policy.setAdmin)\n- [`policy.watchAdminUpdated`](/tempo/actions/policy.watchAdminUpdated)\n"
  },
  {
    "path": "site/tempo/hooks/policy.useWatchBlacklistUpdated.md",
    "content": "# `policy.useWatchBlacklistUpdated`\n\nWatches for blacklist update events on the TIP403 Registry.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"2b35d7c59b68fad10378a67e4629e5fec424fa0a78d71f66ebd0b164e0ee522b\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nHooks.policy.useWatchBlacklistUpdated({\n  onBlacklistUpdated: (args, log) => {\n    console.log('args:', args)\n  },\n})\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Parameters\n\nSee [Wagmi Action `policy.watchBlacklistUpdated` Parameters](/tempo/actions/policy.watchBlacklistUpdated#parameters)\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n## Action\n\n- [`policy.modifyBlacklist`](/tempo/actions/policy.modifyBlacklist)\n- [`policy.watchBlacklistUpdated`](/tempo/actions/policy.watchBlacklistUpdated)\n"
  },
  {
    "path": "site/tempo/hooks/policy.useWatchCreate.md",
    "content": "# `policy.useWatchCreate`\n\nWatches for policy creation events on the TIP403 Registry.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"410c78052455bb6978da5eacfc5719ebc1462a6449aaa6683f5090198fea83d5\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nHooks.policy.useWatchCreate({\n  onPolicyCreated: (args, log) => {\n    console.log('args:', args)\n  },\n})\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Parameters\n\nSee [Wagmi Action `policy.watchCreate` Parameters](/tempo/actions/policy.watchCreate#parameters)\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n## Action\n\n- [`policy.create`](/tempo/actions/policy.create)\n- [`policy.watchCreate`](/tempo/actions/policy.watchCreate)\n"
  },
  {
    "path": "site/tempo/hooks/policy.useWatchWhitelistUpdated.md",
    "content": "# `policy.useWatchWhitelistUpdated`\n\nWatches for whitelist update events on the TIP403 Registry.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"2c18a2554a7d5904a09f15c11717794915bec94d2536640e09fff9a27cdf3002\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nHooks.policy.useWatchWhitelistUpdated({\n  onWhitelistUpdated: (args, log) => {\n    console.log('args:', args)\n  },\n})\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Parameters\n\nSee [Wagmi Action `policy.watchWhitelistUpdated` Parameters](/tempo/actions/policy.watchWhitelistUpdated#parameters)\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n## Action\n\n- [`policy.modifyWhitelist`](/tempo/actions/policy.modifyWhitelist)\n- [`policy.watchWhitelistUpdated`](/tempo/actions/policy.watchWhitelistUpdated)\n"
  },
  {
    "path": "site/tempo/hooks/reward.useClaim.md",
    "content": "# `reward.useClaim`\n\nClaims accumulated rewards for the caller.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"9473592640bf3f33afde9fa50fd54b096479002e7102d5dd65de5dc109750e9f\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst claimSync = Hooks.reward.useClaimSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nclaimSync.mutate({\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Transaction hash:', claimSync.data?.receipt.transactionHash)\n// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `reward.claim` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst claim = Hooks.reward.useClaim()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: claim.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nclaim.mutate({\n  token: '0x20c0000000000000000000000000000000000000',\n})\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `reward.claim` Return Type](/tempo/actions/reward.claim#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `reward.claim` Parameters](/tempo/actions/reward.claim#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`reward.claim`](/tempo/actions/reward.claim)\n"
  },
  {
    "path": "site/tempo/hooks/reward.useDistribute.md",
    "content": "# `reward.useDistribute`\n\nDistributes tokens to opted-in holders.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"59eb218042188d5a1a816d7393c55eedf583a5a887465c49947319b9a1e69626\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\nimport { parseEther } from 'viem'\n\nconst distributeSync = Hooks.reward.useDistributeSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\ndistributeSync.mutate({\n  amount: parseEther('1000'),\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Amount:', distributeSync.data?.amount)\n// @log: Amount: 1000000000000000000000n\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `reward.distribute` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { parseEther } from 'viem'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst distribute = Hooks.reward.useDistribute()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: distribute.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\ndistribute.mutate({\n  amount: parseEther('1000'),\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nif (receipt) {\n  const { args: { funder, amount } }\n    = Actions.reward.distribute.extractEvent(receipt.logs)\n}\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `reward.distribute` Return Type](/tempo/actions/reward.distribute#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `reward.distribute` Parameters](/tempo/actions/reward.distribute#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`reward.distribute`](/tempo/actions/reward.distribute)\n"
  },
  {
    "path": "site/tempo/hooks/reward.useSetRecipient.md",
    "content": "# `reward.useSetRecipient`\n\nSets or changes the reward recipient for a token holder.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"6ec8763ed98425976535a0643a503c69b548f0ee8e4e50dad055f48586543f87\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst setRecipientSync = Hooks.reward.useSetRecipientSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nsetRecipientSync.mutate({\n  recipient: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Holder:', setRecipientSync.data?.holder)\n// @log: Holder: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\nconsole.log('Recipient:', setRecipientSync.data?.recipient)\n// @log: Recipient: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `reward.setRecipient` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst setRecipient = Hooks.reward.useSetRecipient()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: setRecipient.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nsetRecipient.mutate({\n  recipient: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nif (receipt) {\n  const { args: { holder, recipient } }\n    = Actions.reward.setRecipient.extractEvent(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `reward.setRecipient` Return Type](/tempo/actions/reward.setRecipient#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `reward.setRecipient` Parameters](/tempo/actions/reward.setRecipient#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`reward.setRecipient`](/tempo/actions/reward.setRecipient)\n"
  },
  {
    "path": "site/tempo/hooks/reward.useUserRewardInfo.md",
    "content": "# `reward.useUserRewardInfo`\n\nGets reward information for a specific account.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"b99d265574b0d65166a26926a44acc97a9953933b2ed8abd0b6af7abb3256072\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst { data } = Hooks.reward.useUserRewardInfo({\n  account: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Reward recipient:', data?.rewardRecipient)\n// @log: Reward recipient: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb\nconsole.log('Reward balance:', data?.rewardBalance)\n// @log: Reward balance: 1000000000000000000n\nconsole.log('Reward per token:', data?.rewardPerToken)\n// @log: Reward per token: 385802469135802469135n\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Return Type\n\nSee [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `reward.getUserRewardInfo` Return Type](/tempo/actions/reward.getUserRewardInfo#return-type)\n\n## Parameters\n\nSee [Wagmi Action `reward.getUserRewardInfo` Parameters](/tempo/actions/reward.getUserRewardInfo#parameters)\n\n### query\n\nSee the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters.\n\n## Action\n\n- [`reward.getUserRewardInfo`](/tempo/actions/reward.getUserRewardInfo)\n"
  },
  {
    "path": "site/tempo/hooks/reward.useWatchRewardDistributed.md",
    "content": "# `reward.useWatchRewardDistributed`\n\nWatches for reward distributed events.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"802abf398fe8f0c7b5d0b17bdfce85c29d28ef5e8d8bbd8b8bebd7ceec8598b4\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nHooks.reward.useWatchRewardDistributed({\n  onRewardDistributed: (args, log) => {\n    console.log('args:', args)\n  },\n  token: '0x20c0000000000000000000000000000000000000',\n})\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Parameters\n\nSee [Wagmi Action `reward.watchRewardDistributed` Parameters](/tempo/actions/reward.watchRewardDistributed#parameters)\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n## Action\n\n- [`reward.distribute`](/tempo/actions/reward.distribute)\n- [`reward.watchRewardDistributed`](/tempo/actions/reward.watchRewardDistributed)\n"
  },
  {
    "path": "site/tempo/hooks/reward.useWatchRewardRecipientSet.md",
    "content": "# `reward.useWatchRewardRecipientSet`\n\nWatches for reward recipient set events when token holders change their reward recipient.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"28f0780d1d18e58ea2ba233fff27ee55459d9d43aeb92be79062c38ef7f6b813\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nHooks.reward.useWatchRewardRecipientSet({\n  onRewardRecipientSet: (args, log) => {\n    console.log('args:', args)\n  },\n  token: '0x20c0000000000000000000000000000000000000',\n})\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Parameters\n\nSee [Wagmi Action `reward.watchRewardRecipientSet` Parameters](/tempo/actions/reward.watchRewardRecipientSet#parameters)\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n## Action\n\n- [`reward.setRecipient`](/tempo/actions/reward.setRecipient)\n- [`reward.watchRewardRecipientSet`](/tempo/actions/reward.watchRewardRecipientSet)\n"
  },
  {
    "path": "site/tempo/hooks/token.useApprove.md",
    "content": "# `token.useApprove`\n\nApproves a spender to transfer TIP-20 tokens on behalf of the caller.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"2bf003f5493f7e541fe74b232dddbd8b378080a8e7358ad94560ea26b9b9c7a7\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\n\nconst approveSync = Hooks.token.useApproveSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\napproveSync.mutate({\n  amount: parseUnits('10.5', 6),\n  spender: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Approved amount:', approveSync.data?.amount)\n// @log: Approved amount: 10500000n\nconsole.log('Owner:', approveSync.data?.owner)\n// @log: Owner: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb\nconsole.log('Spender:', approveSync.data?.spender)\n// @log: Spender: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.approve` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { parseUnits } from 'viem'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst approve = Hooks.token.useApprove()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: approve.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\napprove.mutate({\n  amount: parseUnits('10.5', 6),\n  spender: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nif (receipt) {\n  const { args: { amount, owner, spender } } \n    = Actions.token.approve.extractEvent(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `token.approve` Return Type](/tempo/actions/token.approve#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `token.approve` Parameters](/tempo/actions/token.approve#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`token.approve`](/tempo/actions/token.approve)\n"
  },
  {
    "path": "site/tempo/hooks/token.useBurn.md",
    "content": "# `token.useBurn`\n\nBurns TIP-20 tokens from the caller's balance.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"5b6d09a09c9cff3e14ddc9584d71dec809880c31569d5f43fb47e4d50b5f31db\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\n\nconst burnSync = Hooks.token.useBurnSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nburnSync.mutate({\n  amount: parseUnits('10.5', 6),\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Burned amount:', burnSync.data?.amount)\n// @log: Burned amount: 10500000n\nconsole.log('From:', burnSync.data?.from)\n// @log: From: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.burn` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { parseUnits } from 'viem'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst burn = Hooks.token.useBurn()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: burn.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nburn.mutate({\n  amount: parseUnits('10.5', 6),\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nif (receipt) {\n  const { args: { amount, from } } \n    = Actions.token.burn.extractEvent(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `token.burn` Return Type](/tempo/actions/token.burn#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `token.burn` Parameters](/tempo/actions/token.burn#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`token.burn`](/tempo/actions/token.burn)\n"
  },
  {
    "path": "site/tempo/hooks/token.useBurnBlocked.md",
    "content": "# `token.useBurnBlocked`\n\nBurns blocked TIP-20 tokens from a specific address. Requires appropriate permissions.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"0df2568dc9b4097277b953d5c3f9968dc9462d150265a4dbab251c23f27cd1be\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\n\nconst burnBlockedSync = Hooks.token.useBurnBlockedSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nburnBlockedSync.mutate({\n  amount: parseUnits('10.5', 6),\n  from: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Transaction hash:', burnBlockedSync.data?.receipt.transactionHash)\n// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.burnBlocked` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { parseUnits } from 'viem'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst burnBlocked = Hooks.token.useBurnBlocked()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: burnBlocked.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nburnBlocked.mutate({\n  amount: parseUnits('10.5', 6),\n  from: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nif (receipt) {\n  const { args } \n    = Actions.token.burnBlocked.extractEvent(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `token.burnBlocked` Return Type](/tempo/actions/token.burnBlocked#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `token.burnBlocked` Parameters](/tempo/actions/token.burnBlocked#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`token.burnBlocked`](/tempo/actions/token.burnBlocked)\n"
  },
  {
    "path": "site/tempo/hooks/token.useChangeTransferPolicy.md",
    "content": "# `token.useChangeTransferPolicy`\n\nChanges the transfer policy for a TIP-20 token. Requires appropriate permissions.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"c50850524110b7ca9c0fc4ed621eb980504ba6bbaaa0473aa617fef54500dfa5\",\"data\":\"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=\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst changeTransferPolicySync = Hooks.token.useChangeTransferPolicySync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nchangeTransferPolicySync.mutate({\n  policyId: 1n,\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Transaction hash:', changeTransferPolicySync.data?.receipt.transactionHash)\n// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.changeTransferPolicy` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst changeTransferPolicy = Hooks.token.useChangeTransferPolicy()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: changeTransferPolicy.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nchangeTransferPolicy.mutate({\n  policyId: 1n,\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nif (receipt) {\n  const { args } \n    = Actions.token.changeTransferPolicy.extractEvent(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `token.changeTransferPolicy` Return Type](/tempo/actions/token.changeTransferPolicy#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `token.changeTransferPolicy` Parameters](/tempo/actions/token.changeTransferPolicy#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`token.changeTransferPolicy`](/tempo/actions/token.changeTransferPolicy)\n"
  },
  {
    "path": "site/tempo/hooks/token.useCreate.md",
    "content": "# `token.useCreate`\n\nCreates a new TIP-20 token, and assigns the admin role to the calling account. [Learn more](https://docs.tempo.xyz/protocol/tip20/overview)\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"3d490a002c7e2f3cbae101c3273591aa8fdaec268e90c4041b25fc475f2316e1\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst createSync = Hooks.token.useCreateSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\ncreateSync.mutate({\n  currency: 'USD',\n  name: 'My Company USD',\n  symbol: 'CUSD',\n})\n\nconsole.log('Token address:', createSync.data?.token)\n// @log: Token address: 0x20c0000000000000000000000000000000000004\nconsole.log('Token ID:', createSync.data?.tokenId)\n// @log: Token ID: 4n\nconsole.log('Admin:', createSync.data?.admin)\n// @log: Admin: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.create` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst create = Hooks.token.useCreate()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: create.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\ncreate.mutate({\n  currency: 'USD',\n  name: 'My Company USD',\n  symbol: 'CUSD',\n})\n\nif (receipt) {\n  const { args: { token, tokenId, admin } } \n    = Actions.token.create.extractEvent(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `token.create` Return Type](/tempo/actions/token.create#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `token.create` Parameters](/tempo/actions/token.create#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`token.create`](/tempo/actions/token.create)\n"
  },
  {
    "path": "site/tempo/hooks/token.useGetAllowance.md",
    "content": "# `token.useGetAllowance`\n\nGets the amount of tokens that a spender is approved to transfer on behalf of an owner.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"b0c37f5d3bb0182fd912e817d276901fd1c5110436708118f3f541db520ed0f9\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst { data: allowance } = Hooks.token.useGetAllowance({\n  account: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  spender: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8',\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Allowance:', allowance)\n// @log: Allowance: 10500000n\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Return Type\n\nSee [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `token.getAllowance` Return Type](/tempo/actions/token.getAllowance#return-type)\n\n## Parameters\n\nSee [Wagmi Action `token.getAllowance` Parameters](/tempo/actions/token.getAllowance#parameters)\n\n### query\n\nSee the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters.\n\n## Action\n\n- [`token.getAllowance`](/tempo/actions/token.getAllowance)\n"
  },
  {
    "path": "site/tempo/hooks/token.useGetBalance.md",
    "content": "# `token.useGetBalance`\n\nGets the token balance of an address.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"c7528612435a35df89295a7a12ef72ca886311a30623cf9079ae2b6b2e88aefc\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst { data: balance } = Hooks.token.useGetBalance({\n  account: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Balance:', balance)\n// @log: Balance: 10500000n\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Return Type\n\nSee [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `token.getBalance` Return Type](/tempo/actions/token.getBalance#return-type)\n\n## Parameters\n\nSee [Wagmi Action `token.getBalance` Parameters](/tempo/actions/token.getBalance#parameters)\n\n### query\n\nSee the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters.\n\n## Action\n\n- [`token.getBalance`](/tempo/actions/token.getBalance)\n"
  },
  {
    "path": "site/tempo/hooks/token.useGetMetadata.md",
    "content": "# `token.useGetMetadata`\n\nGets the metadata for a TIP-20 token, including name, symbol, decimals, currency, and total supply.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"ba0d6e59f59bb9a5429e5c8f90558913930bfe2f294f96336382a6252f972e31\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst { data: metadata } = Hooks.token.useGetMetadata({\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Currency:', metadata?.currency)\n// @log: Currency: USD\nconsole.log('Name:', metadata?.name)\n// @log: Name: United States Dollar\nconsole.log('Symbol:', metadata?.symbol)\n// @log: Symbol: USD\nconsole.log('Decimals:', metadata?.decimals)\n// @log: Decimals: 18\nconsole.log('Total Supply:', metadata?.totalSupply)\n// @log: Total Supply: 1000000000000000000000n\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Return Type\n\nSee [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `token.getMetadata` Return Type](/tempo/actions/token.getMetadata#return-type)\n\n## Parameters\n\nSee [Wagmi Action `token.getMetadata` Parameters](/tempo/actions/token.getMetadata#parameters)\n\n### query\n\nSee the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters.\n\n## Action\n\n- [`token.getMetadata`](/tempo/actions/token.getMetadata)\n"
  },
  {
    "path": "site/tempo/hooks/token.useGrantRoles.md",
    "content": "# `token.useGrantRoles`\n\nGrants roles to an address for a TIP-20 token. Requires appropriate permissions. [Learn more about token roles](https://docs.tempo.xyz/protocol/tip403/spec)\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"f4391afb0618a6365e397f75dd69c90dea54e09d9cd37c91d8c93575a93d1dde\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst grantRolesSync = Hooks.token.useGrantRolesSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\ngrantRolesSync.mutate({\n  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  roles: ['issuer'],\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Transaction hash:', grantRolesSync.data?.receipt.transactionHash)\n// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.grantRoles` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst grantRoles = Hooks.token.useGrantRoles()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: grantRoles.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\ngrantRoles.mutate({\n  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  roles: ['issuer'],\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nif (receipt) {\n  const events \n    = Actions.token.grantRoles.extractEvents(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `token.grantRoles` Return Type](/tempo/actions/token.grantRoles#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `token.grantRoles` Parameters](/tempo/actions/token.grantRoles#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`token.grantRoles`](/tempo/actions/token.grantRoles)\n"
  },
  {
    "path": "site/tempo/hooks/token.useHasRole.md",
    "content": "# `token.useHasRole`\n\nChecks if an address has a specific role for a TIP-20 token. [Learn more about token roles](https://docs.tempo.xyz/protocol/tip403/spec)\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"306dac353c73a78bf54e64cd30cbda4af1447f271833545285c0d219109fa181\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst { data: hasRole } = Hooks.token.useHasRole({\n  account: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  role: 'issuer',\n  token: '0x20c0000000000000000000000000000000000011',\n})\n\nconsole.log('Has issuer role:', hasRole)\n// @log: Has issuer role: true\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Return Type\n\nSee [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `token.hasRole` Return Type](/tempo/actions/token.hasRole#return-type)\n\n## Parameters\n\nSee [Wagmi Action `token.hasRole` Parameters](/tempo/actions/token.hasRole#parameters)\n\n### query\n\nSee the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters.\n\n## Action\n\n- [`token.hasRole`](/tempo/actions/token.hasRole)\n"
  },
  {
    "path": "site/tempo/hooks/token.useMint.md",
    "content": "# `token.useMint`\n\nMints 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)\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"81309f31f44049ff315a55266231b03aaae8e5d9663c808078d1f3aa60a60d20\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\n\nconst mintSync = Hooks.token.useMintSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nmintSync.mutate({\n  amount: parseUnits('10.5', 6),\n  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Minted amount:', mintSync.data?.amount)\n// @log: Minted amount: 10500000n\nconsole.log('Recipient:', mintSync.data?.to)\n// @log: Recipient: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.mint` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { parseUnits } from 'viem'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst mint = Hooks.token.useMint()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: mint.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nmint.mutate({\n  amount: parseUnits('10.5', 6),\n  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nif (receipt) {\n  const { args: { amount, to } } \n    = Actions.token.mint.extractEvent(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `token.mint` Return Type](/tempo/actions/token.mint#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `token.mint` Parameters](/tempo/actions/token.mint#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`token.mint`](/tempo/actions/token.mint)\n"
  },
  {
    "path": "site/tempo/hooks/token.usePause.md",
    "content": "# `token.usePause`\n\nPauses a TIP-20 token, preventing transfers. Requires appropriate permissions.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"b185b955305cbee6f008ea6d7efc12dbee30325aec9fb62314d68f7658e4fa9c\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst pauseSync = Hooks.token.usePauseSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\npauseSync.mutate({\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Transaction hash:', pauseSync.data?.receipt.transactionHash)\n// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.pause` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst pause = Hooks.token.usePause()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: pause.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\npause.mutate({\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nif (receipt) {\n  const { args } \n    = Actions.token.pause.extractEvent(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `token.pause` Return Type](/tempo/actions/token.pause#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `token.pause` Parameters](/tempo/actions/token.pause#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`token.pause`](/tempo/actions/token.pause)\n"
  },
  {
    "path": "site/tempo/hooks/token.useRenounceRoles.md",
    "content": "# `token.useRenounceRoles`\n\nRenounces roles from the caller for a TIP-20 token. [Learn more about token roles](https://docs.tempo.xyz/protocol/tip403/spec)\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"b76e1df0be1a3b2792bb8c4a1ab224f7963d06a0ffa907fcd104f996453f6d0e\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst renounceRolesSync = Hooks.token.useRenounceRolesSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nrenounceRolesSync.mutate({\n  roles: ['issuer'],\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Transaction hash:', renounceRolesSync.data?.receipt.transactionHash)\n// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.renounceRoles` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst renounceRoles = Hooks.token.useRenounceRoles()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: renounceRoles.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nrenounceRoles.mutate({\n  roles: ['issuer'],\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nif (receipt) {\n  const events \n    = Actions.token.renounceRoles.extractEvents(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `token.renounceRoles` Return Type](/tempo/actions/token.renounceRoles#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `token.renounceRoles` Parameters](/tempo/actions/token.renounceRoles#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`token.renounceRoles`](/tempo/actions/token.renounceRoles)\n"
  },
  {
    "path": "site/tempo/hooks/token.useRevokeRoles.md",
    "content": "# `token.useRevokeRoles`\n\nRevokes roles from an address for a TIP-20 token. Requires appropriate permissions. [Learn more about token roles](https://docs.tempo.xyz/protocol/tip403/spec)\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"feffa8dd71c04910b36e8e796cdfdc9026dde663ac6793cf3241ca53a1f00b9f\",\"data\":\"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=\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst revokeRolesSync = Hooks.token.useRevokeRolesSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nrevokeRolesSync.mutate({\n  from: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  roles: ['issuer'],\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Transaction hash:', revokeRolesSync.data?.receipt.transactionHash)\n// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.revokeRoles` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst revokeRoles = Hooks.token.useRevokeRoles()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: revokeRoles.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nrevokeRoles.mutate({\n  from: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  roles: ['issuer'],\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nif (receipt) {\n  const events \n    = Actions.token.revokeRoles.extractEvents(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `token.revokeRoles` Return Type](/tempo/actions/token.revokeRoles#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `token.revokeRoles` Parameters](/tempo/actions/token.revokeRoles#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`token.revokeRoles`](/tempo/actions/token.revokeRoles)\n"
  },
  {
    "path": "site/tempo/hooks/token.useSetRoleAdmin.md",
    "content": "# `token.useSetRoleAdmin`\n\nSets 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)\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"c4dfbc1c2509d94e1eda6bf007b494a3199ae8c05d6345fb80ca7a05858d98eb\",\"data\":\"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=\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst setRoleAdminSync = Hooks.token.useSetRoleAdminSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nsetRoleAdminSync.mutate({\n  adminRole: 'defaultAdmin',\n  role: 'issuer',\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Transaction hash:', setRoleAdminSync.data?.receipt.transactionHash)\n// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.setRoleAdmin` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst setRoleAdmin = Hooks.token.useSetRoleAdmin()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: setRoleAdmin.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nsetRoleAdmin.mutate({\n  adminRole: 'defaultAdmin',\n  role: 'issuer',\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nif (receipt) {\n  const { args } \n    = Actions.token.setRoleAdmin.extractEvent(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `token.setRoleAdmin` Return Type](/tempo/actions/token.setRoleAdmin#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `token.setRoleAdmin` Parameters](/tempo/actions/token.setRoleAdmin#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`token.setRoleAdmin`](/tempo/actions/token.setRoleAdmin)\n"
  },
  {
    "path": "site/tempo/hooks/token.useSetSupplyCap.md",
    "content": "# `token.useSetSupplyCap`\n\nSets 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)\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"d3b1cd4a14575e906a78bb7cbc3171540f904daf431667513fb951963d8d9fc1\",\"data\":\"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=\"}\nimport { Hooks } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\n\nconst setSupplyCapSync = Hooks.token.useSetSupplyCapSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nsetSupplyCapSync.mutate({\n  supplyCap: parseUnits('1000000', 6),\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Transaction hash:', setSupplyCapSync.data?.receipt.transactionHash)\n// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.setSupplyCap` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { parseUnits } from 'viem'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst setSupplyCap = Hooks.token.useSetSupplyCap()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: setSupplyCap.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nsetSupplyCap.mutate({\n  supplyCap: parseUnits('1000000', 6),\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nif (receipt) {\n  const { args } \n    = Actions.token.setSupplyCap.extractEvent(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `token.setSupplyCap` Return Type](/tempo/actions/token.setSupplyCap#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `token.setSupplyCap` Parameters](/tempo/actions/token.setSupplyCap#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`token.setSupplyCap`](/tempo/actions/token.setSupplyCap)\n"
  },
  {
    "path": "site/tempo/hooks/token.useTransfer.md",
    "content": "# `token.useTransfer`\n\nTransfers TIP-20 tokens from the caller to a recipient.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"7775daec2b381b6bcd7a8eff1994271be08a51ae7321b1edd956fd4293c96767\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIAJCCAawRU4aAIYckATioAbGGADmafEgCsVMaQUwGiELwFCQMxmFyIADFQDG+caOs1yiSQF8K6bOYLEylanS6IAAUoiaicACUnABmAK5gjowQYJxY4nAwAKpgjGhwwURhcTCInCKkpgoUnLDWLGFwZWBxzABGZJFlbYwKpmgAOrms7FzppJk5eUZQENYIegCycTJojFgm8Jyi5WiVipykMFhHmWBiaymcEDHbnC3tZJxtGHd9JKl0bGbn17dtERgnAAjBZOMFQV8UvI0JEAHRDIYAWk4ABE5k1OPg0GgsE0APT4oiMGDMOFwfD42bzfFxNYmNbwfHjSa5fL+MQKBbIZAgOiiVhyfwsNgcTjANIZbJsuCcVyxUgQZicADkxNJKsRYBZ0umwRVABYAEwWFU1SSRIaEzjGix2+0OsAgAC6zuEml0BvUxnkShUiFBGnE2iCOqm7NkpnMwJsdlIDicUncnhweEIJHIGkCeGsKREnD2ojAcBiZAAyhhEmUDII4WgBPI4XFMgAVePF0ukCuJOEAJR0cVIYBbXgAPABhFIxXo1BL8SAAdzAAD5/CJxLoAOyb2S+5RIYFGoNaHR4Qsd8uV6z+ExmJAAZlj9kcfkQADZk9QvGnfJmAvQmBGMUayMdcJBcI8fUUfdEG9TQQzwECbyjB8n3jF9nCNYFP0wVM9HTPwswAvQRVGAsGydd0NykAAOXdoP9ODg1PPR634eRkLvRBHxAWxn0TRAjU3HDv3w38OWzPR4kSS5UmbGA2yLEtL0SCcpxnTg50XFdgnGAUdDIOAAH5qz4Ws2MbeTFIvLsrzhAAFexmAMiY1LAadqk0sB5wgJdly6HgzLgOsKKbVt22U2ye37NBB2HMdJ3cjStN8lchjAfS4HSawgSsiLO27a8qGpBZ9DM2J2ALfKyH2BROBbABJeyTXI9ji3I7ZIGUJ5RCgKBTmCrUADkIBoMoW3wRhZSmu44CvfBFUgZssXK5RRC4BdRGmCrSALfAgXPOAE2SMAhnrZ4gVMawZDiWAoGuVIdjaGQ5n4C6YnYIEjliocqjuU5vkyOEOVELkkB5PlaAFDZcCoAADBH8loIZSLFCUQLlBUlVVTaFGYRh8RoEZNVO9yEiSK4AEEsCwYJomAIZOE4XNiy4CVmDpdaYBqKb7PkKA/vlABeQLDBCtqwoU6qousOmtSZ764vBRmmc4Uc2jpetSdV1WUnHExrH4IXgDpzgheXTgOYuGBgglesyhVCxaDhF2zW2ZgIASNAylBCxUlcSJXBVnWBaO56YCgY3ef5qog9SVXl2D1XrMipPR3xDWcRSRP48tMA44RuGXQoXk9OYfwy5c2UUUc+NnKcYLi95RWhyMZYLhOw54BWNBgddKjwNBA16L9A8mJPII8qUgqr048weL49CBPve8RLwnwMwk4jeLzLhDpnqtRfM0Kp5swq+wHIcRxwNyPNnbztNXAfdBNYeoNHgNIPgljqGlwq56QG+NCCZXwWDXt4Aif4aDb10oqHAHAMDRCtlzMohRxCMFEOHTE+8VLWAck5Kut9ejLhqBALAsljJlHblzAA8uQk6cBRw4JlhfH6YAABqxRuacAAEKAgAKKkEVKQa+3DmHn1rvpBuRCFAkK8j5PynAAA+XlYDTjMFAaI5tOBEAgIwKA/gSp4AmkCZBslYjk3MRgT2zMiy2JkDITgC48j4B0egzBchZTnT2L0bQu1uqW05uYos90yGyTCDIV4hBDAPW2H1PIJ0wj2JkACQ21x6F5mBkGMGKBS5OX8EUSoHitgohMW4opWDrhtAAFYwEcB1dIcAvEQD2kCOGZiToADEwBwz7iXEAZd/BhIYXCFIZY4jWByk0zgpTJqymkhTVIziHGxEYEcJx+1UgBI6VcGacAJlTJLCsTq91lmOI6JKJpEdWmBI7ikFUspTg9z6XkuuQyMnFlGWAQRwiZn1TmRYmSnczmrPWYwW42ygmd3kLmL2hlOqcBqpVEJTjGArIuY0zI90AlItIC8gZ+SqDDMyWMnQaA5D3VmTNBZ5iQXTnWQuTZNydmpBmjAFxTx9mTPgEchxrxSxoFsNcyqMLPbnHhXY3FJyLqXKxYijl/j9q1HWjsEVQj2D4qOMwcQgh/AogarcaxcRLaiHYoE1Y6w5BdwAI4lBEHAGocMxkHJ5XDVFKz6VAhSJE7YMQnA3JkFzfM1gImcCNWqUxvUYAIjACiSmKyAkhocakt6NKGHgidWAcZ3Kmlw0dSkH57A82cEzWWMlFK4bRHEECXR+jAWLIddKgJLcNFuJukCEFFzeiQCOFAPuboQBgRfsCHc78YJAOoMxIIZjYbGBQu+YBGEDyrw8F+dekCt5BFgWQsgmAq0ey9t0Xo/Q1weiQEaI0dEx3+gnd/IIAoxUMEjFxUdi8QGYXAT+TeREt1hAwVESUExdT5DQe2soFQqg1DqA0GQmIHgdFIAFHofRzgoyAmMKU4YZgYjwMsC1GwSSyh2BBg4RwTjwBhOtTuNw7jwaeC8N4jAPiItoN8GEfxniAhBGCCEFgoQ/FhDG5EaIMRlGxLiAkRISRkgpFSDEtJ6QJKZGGGUIMckQ35IKWdqM2aAdZNteUMRFTKjVNJkmQwVN6kNCaN2ForT4htCaB0zmnT90HWewS94J1yAYgeKwk6J54EsxGOdL7F0CVBJ+sS37/xbpODuhB0R7acAGCAJ2m5jRQHvKocc1g3xvnvAaccFhVD3iNJII0qhRD3jaDRA0BoeHWEkDATcqhJCqBiBYNo/C2htFS6e6igk3wxmvee48CFWIQAAYgK9b6l2CSixvQisW8DbvgXu1q8gyipadiaawzmDuHaO8du0/Xn4PmBDxHzH9x4TeoBRab0heJxnfeexbG6f14Ays5LKDggQszgBAOQQxCnMzzED0onBEqA6FMVHDegylwwBxDt1HsoArCBPF4ksAiPlBFFa2AGsFAobqsjq1a0uB7JYGi8QHVupDAAFKiCKGWawlRyFg+LBDy2dS7C5DgMqLH+jrkMYXDANozxFQLkyBMITw4lVo4xyx0U+QCwLhaVlOp4LGDWDByMATTQtQACpOCUxLdDlHzNA3TOccoHnyhoCyi5a4iIJayfRpegoOmxakfg7kHCXF3vpW+65/7zaQ4g8U9sakC58lsUtIXJUGgHUiyvBGrAOE1Snd7BgAKGNJuzcKBegCRxIeYcwDdaYdciR/vqQUIOa551E95AOi05AcN4uHPJGgWYdI4bOmCOJvEiBCSQFgFn0ZWg5M0kDTQEQSIiBGgNHCWg+JRBYAJp3nlcJsTMBkAAYi300kQvfYQnKGO3o/wUT81X74PnEw/R/QBgBP9gChp9wHxLP+AaAF9L5X2vhvsyIqF3rvgflfjfkIvCP8kCEXhACXm7n7hXtHjKnHqig7nSJwDpn9AEnDGPqUO7qjtABjnLgAPpG5G4ADq4guQigFBpB40SqcBCB7uVStSjgDy9uhAUARG6yZgCqnOcAU0NA5wkSQwc0iQC0KQnssoJgZqASbQUuMupu9kDUXi+0rwpwpI4cNQPa2w6y3UrwAOwhMIYhGUEhtgi0MhnAchQIoao0+0u06e0aWeuwRwAowUnAZaB0Sq7eXUXqqQV+nADU+INCd+Q+km+Br+U+JUX+Qav+i+y+q+6+m+IB2+YB++ogSI/hSIKQSIV+SIyQ0QH0pAQwHsYK7k7A2qskcu/CUMWmmkQhBwASzBSSZeKOiAWohcWeQw7ucInu+o+0DiCe7AMgUAKokQAA3PZpwPZPsPkGJjAMMU4qMVADUOdCfp7IMIkEgf0RAF7iqEMS9JwAAKRwBuwqjq6kBjETHTFgDWhzH9CYhHEjHXFrEdSbF0i9G7GB5mALicCFqkD6iUHRJ4g1CA71yTQHAAj3R2A0zyARwTFTEzGPHnCyhSo/ZHTaDSrrhpKFg5QfE941SdH3EOZMyAllAgl8BgnlBKg6BQl1QwlYjr44AaIzE6zrScDIAwBFAyDOiwQBiqDsmqycms7s69ykAJANTy5TSJTQJcDBD4GIBEDMABhlYBg0R5zWgclcA0I1J1ISlSkylwBymBDghKkqncQWCSDcSanClMyclKn9BkAZQyDAFzA8r4h0B1J0gnSIDbgBiSD2nbBcDcm8nOhIiJ4slkDviCRGjBmck8lhBinrAKlOnipDhhDumHJem0A+myT+lvjvgWBalkkilcDplOCun4jaqmBem8mkEkYKCebcRagA4Vn6RmyqiUFoqOK9jwFV73J3F9Hh5gDBBwyohFh+KcAAAkwA32MArgAAhGiFOWQEuZWncQ8fMZiJOYoE8D2Ssv2T0FzmACuXuX4kuesRrkSUIkMIXFqHUdDFas2DgUqnDBbnIG6tdBEIbqTN0XAN8azNcJgSLCGGWDngKGWHSYQAuHTMObvIikIl2eBZBcwNBc5LBfBUBfmMwBgJ+UCCLH8YIRDnCARcEFsTUDVMiaTHhQRXsQcS8SsW8bcSiTuYscsVcWMdeSBdsXRbsQMYcUsccWcRcVxeMTRduU8RxcceJTxVsWUfhT8eqkCcRYCcCaCY2hCfSX9EyXCayYiZEJJQ5qiQsVyRSZwFSWQlpXScoLpb1MyfCRom6B1DVG2YhQuV2SqIeX2QOaeSqHcfxaHtGqOeOReU8HOQucuaufuaQBucZbMexTFdOT5ZwMeYOWecleuTxW5T0gjGptyLyJkLOsgIDoODlAPhESPviH0MoHEG0HCLmMwPiFEZ/vgRnMXkSP/qviYG0PiH0VnpEC6AOkOg+JuP5tdjBKOnejmEgdNoeOFqAu9uJJ9noMEJCdANEPRQMZiaDDACZJ1BgDUC7KMh8mEJIswJiKnsgM6AFLWvdMEAANTAjXAZgvS9RDVw7zB4CmXNIlqfFoBuq26uJ/G3jRqcB4ZrAwz6H17ORokoEYq/kRw1DA2tJDD0r5hoGu4BInANCkCvC7XYkoqhq9QCzhKOJY1O71UiB5C+kpAg5cJO7U6Br+Jt4d7zExDBD3iRDhEP7VXapgCbiT7v63hxCr4C35F7Wf4C33jAH9AxBwj3g75oB755zBABLBitAwi8F2ErKYqN5s2+kyBwglHVHe6VUP6RHP7RHv6xHf7z6JEAEpEKZorK17775G2m3rRe2/7BhRDwhdEIw9E7HAWwq/AiyqAIXBUMX6hh3eynHjE1Bx0JW/VlBx1lDqCEmn44WkWCXp1uzJ1bkmVJXp2cCZ0bE94KV5VwxajeFclwxG0m1VHrTm334SbVWtXC0f5xFz4JHdWAEEyN0ZGe3N1oA+1Ih+3FGVTlGXSVGkDVEnRZKTrqZFVXSzpEAWBwjAhb12jDXnbcSbhXqTX+g8QzV6Ce7zWQRzYCQ0TLUxbymzXAXiJXimRiwWRgCSwpwHx4IxRxSiIyL3wKIrgDbgQGgWCQTH0HhfxTpnh/yzzPrRhX0vbzZlZ33LYP1rXxbraILKpiBlDP3RSXwcJcLKKqIwDqIRyGLw4gBlLW5cBcqHLxB8pdww4kD3RQAqo7TMpQopBy5DC0MRD0MupNJMM+qnBA5sO4M7AlHcN3If1aj8NKp0PlDCO8piPwASPXIcNiBcOQpyN8Py5AjKMMM8qiOaEaMyCSPaPSOVR6NUa8MgOejAjeiQOIBvxn0gDWOX2LXOBehoNQKSQhBYO7o4MPqHrPDHq/AqIJBqJRgGL73GgjauO3owN6BhPnDePPb8SviqDYSrq4QQIrUrZ6ALm/YEnu4M27Tu5lAEVUPfUI7vmEGWzEFWpC446zT45AiE5xDE5/SsFR5U74ws1077SM7M6iApkc6sHOR8T86C6KjY4i6vBi4S6KG+Qy6DSkxlKK5WpQgcBeLq7lA4D1DTi65NVsZokklDAF7m5IHfnW6yio0bU8EqO2DbCyjtH+4DE82Op9GB483B4jk0GR52BcAhox65RypN5J6t6HWcDOGZ7Z7uFkjXOm6cCtGl5NNV5iA16c4eQN7x5OIwsdSX5pFNLd6n683t1P7j7BRv7d32191JED3ZnpEq3gFktNKV10hVpgBQAX7s0enkuQGkBUuP4tXW10sxHyaMt/7MvO1X5u0ctCtcuwBQFwgwHovF5tFNPguoFyrA1bFYHoZvltJKlNM7PRpajkFUE0FVD0GMGwHauOKsHwHsFoCcHPM633DsrdRVN5gmGiEYDiHzRWHLS2E3JrPS5PCUyqHqEwDmOZDtByC6HIoGEaGCGBvkrBvmGhvSHhuMBmr2F+vwvP6ItuG56XUat10BJ+GjQBFpCcvBGhFitW20td123xFytO1AGKsZFZE5F5EFFFE7RlGfRYFz0L28OPn1HQ2vnNFMHOuIHBVwxXPV3B19GCVMXiWsWkmJXSVYjCWvHcVZ1V2bv7GDFHunHnE1CXGrG7tSWXOHucWrE8UA053+6/EwD/HqXeWaXgm2UMmcawnRkaJIlF37vw0Yk8p7U4liB4noSwsisknakAkqWUn/u0mQn2UgdOURwJmhlJl8kCnOMEdeFs6plwiSlgDSkTSykpDynmnP7KmqmXZGgamlk6whmcB6nutUdGl0cmkMdmmKnMeWn3jWm2mcc6n3DMfOmZlulX65n5l+kBnAhBl7sydhlhARlRnwmkCxkXpkdEeTNplycZnVlKfenWB01gCFnFnSflmyewCIDyfVm1n3FEeNk+KKAtn3juXAWeUizeW9lpV+WA5gABUfshXAsTlrm7SRX6TRXhVxWblsUHspeWWhfpWnnnnxdXlZ25UPmkxPkNHzt1S4EEX3O/lrsAU4VcBGtgU6AQXIsYUwBYU0XtlIW7RNdoAteVttcddR24VKXBVdnEV9HkWUXdc0WKXbUXtCUvssUp1JXbuvsdRV1BXl4x2LciU3s4z3srcHtrdvHyVfFgBbekVfs/sqUaXUk2XYfQkOX6UIkSVHdPvIAWVWU0naV2VPe4cGVQAuXnS5X1f3CdnBepU5cRdRcXejfbehVxexWznzlJd5exXxUQep1ZW7RQ/hcpDo+Xk5V3nV0FXgxFUwAlVlWkAVVt3iu1X4D1WNVKgSu0us8wAdXwFdXMu9X9W7GDV73uaDbGhPauPTWpM7zBXzULzIMCRgL5OiTL3+ALl4AX0JPlYjwwT+YYM0PSzuyPo+wlYubS8+NIDy8piFP32BPrX0mbVQ4CUXuE37VlCp7HUuzEqukXVXVgAYA3V3V6IPXPWvVkDvWaJ1OlS/UdRwwA1A0uI+sLhg0auQ2Wp2FaBa3w16uI1XLvGo305JQTBcCU03K43ar4085NKwfE0rKk0JIpBJJF/7JtA02xSyQM3tpM1DO07nSkvy1c080W24j81FhC30ui3i1FiS3aDS1Fiy243nAK1K1gFq0a1p9w2q7VrbB61I2Evt6N0+2t1VU0sv5Su20ytduO3JFAFD3sse30g+3j2T0B3/lB2AUh3BqPpdmR3Rc7el0nGJ1g5ex3uZlUuuXRvLZ03+udBbvnSTqPogBmIEAW+25bbFiuQwOurv3pBN156LdfvnTzbbH8O2Z/Xut20v6D0MBw9O/qPQf5aAAMMjGehOx9qL0yeuSQdGvQKSb1t6vsQXqNTcb3hR0rjU+hLzV6hZowMvbJs4FvoK910RTHXl1wIbWBX6x8CWKfEijnxf6V8BKHXkAaPxHGSAL0BNT3D+gFqAWO7HIJN5ZMl4r4LCP403SrZgmiWKRvgzgaEM2EnCdtKQxibkM4m4fYxEo0EavNGGKwdRqwy0acMZGdjGogo0MY2E/BJjERoEMTaaN2GoQ2xgrh4byNSYijIxjENUZmMWGiQqRro1SH6NIhAjfMLELUYJDLGIQnRmEKKH2MP6OgtxgVk17+h3GEvLxgg2XSm9uIBoawatSCZwIQmxRYzGUDhhOw5yTZVwG6miZ8tPBGiRoQaDfCi8DBug8bD/CMxKgzB19V8GAz6HFNwAmUbKLXmCqVMSKcgGpnNS+qlREcFrFppjgWbC5ccQhBot016YHB+moLLAh3xpys00aYAJnCzgo5TMkCPOWZlNHmbEBhc90UXOLklzrNDIcubZncOVyjADmGuY5trjOZKgLmCxY3Giw/J3Mrcv5dAq4i9avMXcHzc9l7h+bLttu/zN1Cik+YxcI8ALKPJn0hYG0iWLeFPD71LYZ5XCFQStvnjRYYtaRlubFkWHKZ14CWHUZvMnm76Csu8MfAfuK07r0tO2RAi/iyz7Y38ICSA3lvyzACksVWFLW/CqLwE20GW5/fugq05ZKtD8nLEVtATKSiimR35OxLHgNYuIjW2BBdma2Y63D0c/ua1hQWoK/Q6CRuBgpq1FGut9SHBWUGSI378ES2xhEQKYRzYWEpCS0WQoWx8JAgo2yhWNmoVaSJttCKbWTrtA36GFM2aYoNkMAiB5tsxNhXMZv0cQOEngCLAUWhU8I1tfCeBetrEiCIhEwi5ojupKwIEz5rR8rXtnaP7bZF62uRWNMOwgBT1SiF3cdqYAYHTsSus7F8k0Qq6Lt4COrO5rVxf7f8t2V7HdnAJkrHt3iFdcAVSMvbLFRKt7K8Vj1W6Xj1u94s9spWESKlv2aHP8X+3u4AdHujJZ7qB0MpwDuu09GDkTT5a7AHAb0fEkh1vIGdhSX3TDr9yA56VIJho1Dg6UI7hkSOQpTTk51M78caOxpU0vQCY4udLSbHDjmR144GlKJtHOZDRLM70TVSEnG0veDtJkTCJznUoG5yzJWc8yNnAsmpw04ETuO2nPkpGXjD6dDO8ZQSdxxM5AiuJIkizmJM5bKdJJqnIsm+BLJkdKyLpLMh53rJhBvOtUPzgF3zBBduy2XfHpF2G6kVEemXRLs5GS75c0ue7bHplzx4nkIuhPbKoVxJ4oDvku4yFqa1uYrsiRTSU8XDA3aIVGu6LZrmhUG6+RsKb/LgDVBQoZTWuMFbKZ10QqXcrURFACZNyQIUU6QVFKAncTm4O9GKn45bu+OO6tST250TbvD0gEtTnx+3O9m1PS5PsTuXUlpD1PorXdAJ7AO7tZVAk6V/ujlQHuBxGlmVPu6HSylhMA44dlpr3YHi0lB65TwezkLykFIyqw9ypzIsckj2nJeTFyoU1LteJx5ZcjyLkx6QVxB4RT8q2SQqoOkp7+BSqnsGnjAFHGEgGeTPJquzyzzs9OefVLUbzwGpRAuBHmA0K1haFIBxegWPQO7nmpvxthzgc3mum8Cchle+kVXvsQWHozRslgfoZ0hGGcB0smWbLLlnyyFZispWcrJVmqy1Z6sjWZrK1naydZusvWPGd0KJkFMv06Da3s8y2rNSbeFfbQAdVd6cATqHvc6k5G96+9bqZQe6uCCD6/hQ+n1TxtQ0j7nRo+SA2PnblBpRgk+PcFPjDXT6q52RsqZGiSL+EY1C+cqbGkqhL7iACacEuwghJJrxJyajRa5K7kb7N9bObfO1Hjk76/Ce+8/PvmKyH6C0u6Y/GshP3SBT8s5YAWfhzUVpKtl+SqTWmv29ahp9aO/BuhgP344DD+0Mk/laM1E2ir+ZAm/iPSwFj1R6E9agUZTlx1djpcdT/m5K+ZQCDeCdAurAPalPsEBp7c7o+JVDQCAB5wZ6XPO/HndIpaAmua7Trmtsxx7bdUYQJ/zECWW1/d2p3OqJUCuQq45phUS3ENDfp5PFgTXjYFb0d6FgFGcLxohXYVh3ENYUECEFg0Dw+M2Xq+AkEW8pZATbeLIKcHyCj4wUd+p/TgWsI/6GgpKJ5BSh+QFhkgN+K4yMEeNTBnQgMKArEEHg3Akgy3tLJgR2CNs1jRwdPFwSoKhwrgkoO4NmEUN4mJs+pjQ18FlCch8QvIVUKSE1CUhpiNIQY1KFCMc0FQoRVY2SGKpxFxQjIVEOMYCLmG4jYRQUNqFKL6hkivhdIoCEaKLG8i0RYotuR6LGhqgCwHwL/ltDsZnjFVGLPMGvZuIRoPYTrzWxDDyIow8YcAEmHTCyGnCqxZdgxmCQAFZ4KbMQuBCkKLBzgfiYtlJlUAVe59SmfvVya2LfMtM/YS2AgBlAmZRoLLDljywFYisJWMrBViqw1Y6sDWJrC1jawdYusPWNoPNQnQEyzergAdLmFgCAQVc4oBBZjA2EmZcY+MQmKSDYAkwdM/S4LLKEMzGZVQ6oZgOZmOlyCuyIEcWJZHCiMKZYcsUmNaHHChp2kQSZAqYBYaAxYW8kSsYsnBDRoFAGrTOFrCtw65+ANQU2iozaD4wmkJ0POHILhAzpbYKsdJvHRmX6hQQcIVQG7DfCRAKAKsZLI7FoAZZClLMkpezPKVcyqlvM2pQLIaXCzmlZoWFRRAdi7YLA+2E7GSvJX2h8V+cPOOeIW5f0eoB6c4IgDdi/LrGRkOEECrziLz6ZSoZlesRQVsqTaxmLlfLJVC5K+VVUbZefEFX1g84/geuKICQCgBAg8gIQikDPAIBXArgIAA=\"}\nimport { Hooks } from 'wagmi/tempo'\nimport { parseUnits } from 'viem'\n\nconst transferSync = Hooks.token.useTransferSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\ntransferSync.mutate({\n  amount: parseUnits('10.5', 6),\n  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Transfer amount:', transferSync.data?.amount)\n// @log: Transfer amount: 10500000n\nconsole.log('From:', transferSync.data?.from)\n// @log: From: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb\nconsole.log('To:', transferSync.data?.to)\n// @log: To: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.transfer` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { parseUnits } from 'viem'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst transfer = Hooks.token.useTransfer()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: transfer.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\ntransfer.mutate({\n  amount: parseUnits('10.5', 6),\n  to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb',\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nif (receipt) {\n  const { args: { amount, from, to } } \n    = Actions.token.transfer.extractEvent(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `token.transfer` Return Type](/tempo/actions/token.transfer#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `token.transfer` Parameters](/tempo/actions/token.transfer#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`token.transfer`](/tempo/actions/token.transfer)\n"
  },
  {
    "path": "site/tempo/hooks/token.useUnpause.md",
    "content": "# `token.useUnpause`\n\nUnpauses a TIP-20 token, allowing transfers to resume. Requires appropriate permissions.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"d93f9e8e1b5b8ad9644753f33d39aaff041fc2bd4761737cbca90bbd074879b5\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nconst unpauseSync = Hooks.token.useUnpauseSync()\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nunpauseSync.mutate({\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nconsole.log('Transaction hash:', unpauseSync.data?.receipt.transactionHash)\n// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n### Asynchronous Usage\n\nThe example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning.\n\nIf you are optimizing for performance, you should use the non-sync `token.unpause` action and wait for inclusion manually:\n\n```ts\nimport { Hooks } from 'wagmi/tempo'\nimport { Actions } from 'viem/tempo'\nimport { useWaitForTransactionReceipt } from 'wagmi'\n\nconst unpause = Hooks.token.useUnpause()\nconst { data: receipt } = useWaitForTransactionReceipt({ hash: unpause.data })\n\n// Call `mutate` in response to user action (e.g. button click, form submission)\nunpause.mutate({\n  token: '0x20c0000000000000000000000000000000000000',\n})\n\nif (receipt) {\n  const { args } \n    = Actions.token.unpause.extractEvent(receipt.logs)\n```\n\n## Return Type\n\nSee [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types.\n\n### data\n\nSee [Wagmi Action `token.unpause` Return Type](/tempo/actions/token.unpause#return-type)\n\n### mutate/mutateAsync\n\nSee [Wagmi Action `token.unpause` Parameters](/tempo/actions/token.unpause#parameters)\n\n## Parameters\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n### mutation\n\nSee the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters.\n\n## Action\n\n- [`token.unpause`](/tempo/actions/token.unpause)\n"
  },
  {
    "path": "site/tempo/hooks/token.useWatchAdminRole.md",
    "content": "# `token.useWatchAdminRole`\n\nWatches for role admin update events on TIP20 tokens.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"149a552ec742b4dd66646f0d767625b9e60928a7afe48d207c20bce63c3d7530\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nHooks.token.useWatchAdminRole({\n  onRoleAdminUpdated: (args, log) => {\n    console.log('args:', args)\n  },\n  token: '0x20c0000000000000000000000000000000000000',\n})\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Parameters\n\nSee [Wagmi Action `token.watchAdminRole` Parameters](/tempo/actions/token.watchAdminRole#parameters)\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n## Action\n\n- [`token.setRoleAdmin`](/tempo/actions/token.setRoleAdmin)\n- [`token.watchAdminRole`](/tempo/actions/token.watchAdminRole)\n"
  },
  {
    "path": "site/tempo/hooks/token.useWatchApprove.md",
    "content": "# `token.useWatchApprove`\n\nWatches for token approval events on TIP20 tokens.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"1549f2859212b937c8657167655eeec354f9caa629bbd015ce5aa6a9316baad6\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nHooks.token.useWatchApprove({\n  onApproval: (args, log) => {\n    console.log('args:', args)\n  },\n  token: '0x20c0000000000000000000000000000000000000',\n})\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Parameters\n\nSee [Wagmi Action `token.watchApprove` Parameters](/tempo/actions/token.watchApprove#parameters)\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n## Action\n\n- [`token.approve`](/tempo/actions/token.approve)\n- [`token.watchApprove`](/tempo/actions/token.watchApprove)\n"
  },
  {
    "path": "site/tempo/hooks/token.useWatchBurn.md",
    "content": "# `token.useWatchBurn`\n\nWatches for token burn events on TIP20 tokens.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"6bdef3454b786456322850b22fda9f6b5e83f7c766139b4da151ac51f819efe7\",\"data\":\"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=\"}\nimport { Hooks } from 'wagmi/tempo'\n\nHooks.token.useWatchBurn({\n  onBurn: (args, log) => {\n    console.log('args:', args)\n  },\n  token: '0x20c0000000000000000000000000000000000000',\n})\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Parameters\n\nSee [Wagmi Action `token.watchBurn` Parameters](/tempo/actions/token.watchBurn#parameters)\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n## Action\n\n- [`token.burn`](/tempo/actions/token.burn)\n- [`token.watchBurn`](/tempo/actions/token.watchBurn)\n"
  },
  {
    "path": "site/tempo/hooks/token.useWatchCreate.md",
    "content": "# `token.useWatchCreate`\n\nWatches for new TIP20 token creation events on the TIP20 Factory.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"ac42775d21c15bba9530036c843c3f7209edb0afc3fa66af279c7dfb7b6482f6\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nHooks.token.useWatchCreate({\n  onTokenCreated: (args, log) => {\n    console.log('args:', args)\n  },\n})\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Parameters\n\nSee [Wagmi Action `token.watchCreate` Parameters](/tempo/actions/token.watchCreate#parameters)\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n## Action\n\n- [`token.create`](/tempo/actions/token.create)\n- [`token.watchCreate`](/tempo/actions/token.watchCreate)\n"
  },
  {
    "path": "site/tempo/hooks/token.useWatchMint.md",
    "content": "# `token.useWatchMint`\n\nWatches for token mint events on TIP20 tokens.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"bca02bde7cbd2b13b68198315831f106355326a3a7bb259d3bedb8adc457d8c2\",\"data\":\"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=\"}\nimport { Hooks } from 'wagmi/tempo'\n\nHooks.token.useWatchMint({\n  onMint: (args, log) => {\n    console.log('args:', args)\n  },\n  token: '0x20c0000000000000000000000000000000000000',\n})\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Parameters\n\nSee [Wagmi Action `token.watchMint` Parameters](/tempo/actions/token.watchMint#parameters)\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n## Action\n\n- [`token.mint`](/tempo/actions/token.mint)\n- [`token.watchMint`](/tempo/actions/token.watchMint)\n"
  },
  {
    "path": "site/tempo/hooks/token.useWatchRole.md",
    "content": "# `token.useWatchRole`\n\nWatches for role membership update events on TIP20 tokens.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"2a04f664116ac7d0cf34ca591cad47cbc06e1aab303131a088a76159faf54e6c\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nHooks.token.useWatchRole({\n  onRoleUpdated: (args, log) => {\n    console.log('args:', args)\n  },\n  token: '0x20c0000000000000000000000000000000000000',\n})\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Parameters\n\nSee [Wagmi Action `token.watchRole` Parameters](/tempo/actions/token.watchRole#parameters)\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n## Action\n\n- [`token.grantRoles`](/tempo/actions/token.grantRoles)\n- [`token.watchRole`](/tempo/actions/token.watchRole)\n"
  },
  {
    "path": "site/tempo/hooks/token.useWatchTransfer.md",
    "content": "# `token.useWatchTransfer`\n\nWatches for token transfer events on TIP20 tokens.\n\n## Usage\n\n::: code-group\n```ts twoslash [example.ts]\n// @twoslash-cache: {\"v\":1,\"hash\":\"f4621a5648e0a663badc09437893499eb743897952bf9f61a7fc56fc1e4f1550\",\"data\":\"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\"}\nimport { Hooks } from 'wagmi/tempo'\n\nHooks.token.useWatchTransfer({\n  onTransfer: (args, log) => {\n    console.log('args:', args)\n  },\n  token: '0x20c0000000000000000000000000000000000000',\n})\n```\n<<< @/snippets/react/config-tempo.ts{ts} [config.ts]\n:::\n\n## Parameters\n\nSee [Wagmi Action `token.watchTransfer` Parameters](/tempo/actions/token.watchTransfer#parameters)\n\n### config\n\n`Config | undefined`\n\n[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider).\n\n## Action\n\n- [`token.transfer`](/tempo/actions/token.transfer)\n- [`token.watchTransfer`](/tempo/actions/token.watchTransfer)\n"
  },
  {
    "path": "site/tempo/keyManagers/http.md",
    "content": "# `KeyManager.http`\n\nManages public key registrations remotely on a server.\n\n## Usage\n\n```ts [wagmi.config.ts]\nimport { createConfig, http } from 'wagmi'\nimport { tempoTestnet } from 'wagmi/chains'\nimport { KeyManager, webAuthn } from 'wagmi/tempo' // [!code focus]\n\nexport const config = createConfig({\n  connectors: [webAuthn({\n    keyManager: KeyManager.http('/keys'), // [!code focus]\n  })],\n  chains: [tempoTestnet],\n  multiInjectedProviderDiscovery: false,\n  transports: {\n    [tempoTestnet.id]: http(),\n  },\n})\n```\n\n::: tip\nIn order for the above code snippet to work, you need to have a server running at the provided URL. Below\nis an example using a [Cloudflare Worker](https://developers.cloudflare.com/workers) (but can work with any server runtime).\n\n[See more](https://docs.tempo.xyz/sdk/typescript/server/handler.keyManager)\n\n```ts \nimport { env } from 'cloudflare:workers'\nimport { Handler, Kv } from 'tempo.ts/server'\n\nexport default {\n  fetch(request) {\n    return Handler.keyManager({\n      kv: Kv.cloudflare(env.KEY_STORE),\n      path: '/keys',\n    }).fetch(request)\n  },\n} satisfies ExportedHandler<Env>\n```\n:::\n\n## Parameters\n\n### url \n\n- **Type:** `string`\n\nURL to the key manager server.\n\n### options\n\n#### options.fetch\n\n- **Type:** `typeof globalThis.fetch`\n- **Default:** `globalThis.fetch`\n\nFetch function to use for the key manager server.\n"
  },
  {
    "path": "site/tempo/keyManagers/index.md",
    "content": "# Overview\n\nWebAuthn-based accounts in Tempo require the public key to be attached to transactions and other protocol features. \nHowever, **it is not possible to extract a public key from a WebAuthn credential after its registration**.\n\nTo solve this, we maintain a `credentialId → publicKey` mapping that stores the public key when the credential is first created. \n\nKey Managers are responsible for managing this mapping, allowing users to access their accounts from any device without losing their public key.\n\n- [**`http`**](/tempo/keyManagers/http) Manage public key registrations remotely on a server\n- [**`localStorage`**](/tempo/keyManagers/localStorage) Manage public key registrations locally on the client device\n"
  },
  {
    "path": "site/tempo/keyManagers/localStorage.md",
    "content": "# `KeyManager.localStorage`\n\nManages public key registrations in local storage on the client device.\n\n:::warning\nThe `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. \n\nFor production, you should opt for a remote key manager such as [`KeyManager.http`](/tempo/keyManagers/http).\n:::\n\n## Usage\n\n```ts [wagmi.config.ts]\nimport { createConfig, http } from 'wagmi'\nimport { tempoTestnet } from 'wagmi/chains'\nimport { KeyManager, webAuthn } from 'wagmi/tempo' // [!code focus]\n\nexport const config = createConfig({\n  connectors: [webAuthn({\n    keyManager: KeyManager.localStorage(), // [!code focus]\n  })],\n  chains: [tempoTestnet],\n  multiInjectedProviderDiscovery: false,\n  transports: {\n    [tempoTestnet.id]: http(),\n  },\n})\n```\n"
  },
  {
    "path": "site/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"baseUrl\": \".\",\n    \"esModuleInterop\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"jsx\": \"preserve\",\n    \"lib\": [\"DOM\", \"ESNext\"],\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Bundler\",\n    \"noUnusedLocals\": true,\n    \"paths\": {\n      \"~/*\": [\"src/*\"]\n    },\n    \"resolveJsonModule\": true,\n    \"skipLibCheck\": true,\n    \"strict\": true,\n    \"strictNullChecks\": true,\n    \"target\": \"esnext\",\n    \"types\": [\"vite/client\", \"vitepress\"]\n  },\n  \"include\": [\"./*.ts\", \"./.vitepress/**/*.ts\", \"./.vitepress/**/*.vue\"],\n  \"exclude\": [\"dist\", \"node_modules\", \"snippets\"]\n}\n"
  },
  {
    "path": "site/uno.config.ts",
    "content": "import {\n  defineConfig,\n  presetAttributify,\n  presetIcons,\n  presetWind3,\n} from 'unocss'\n\nexport default defineConfig({\n  shortcuts: [\n    [\n      'btn',\n      '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',\n    ],\n  ],\n  presets: [\n    presetWind3({\n      dark: 'media',\n    }),\n    presetAttributify(),\n    presetIcons({ scale: 1.2 }),\n  ],\n})\n"
  },
  {
    "path": "site/vercel.json",
    "content": "{\n  \"cleanUrls\": true,\n  \"redirects\": [\n    {\n      \"source\": \"/core/api/actions/sendTransactionSync\",\n      \"destination\": \"/core/api/actions/sendTransaction\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/core/api/actions/sendCallsSync\",\n      \"destination\": \"/core/api/actions/sendCalls\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/react/api/hooks/useSendTransactionSync\",\n      \"destination\": \"/react/api/hooks/useSendTransaction\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/react/api/hooks/useSendCallsSync\",\n      \"destination\": \"/react/api/hooks/useSendCalls\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/tempo/actions/reward.start\",\n      \"destination\": \"/tempo/actions/reward.distribute\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/tempo/actions/reward.watchRewardScheduled\",\n      \"destination\": \"/tempo/actions/reward.watchRewardDistributed\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/tempo/actions/nonce.getNonceKeyCount\",\n      \"destination\": \"/tempo/actions/nonce\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/tempo/actions/nonce.watchActiveKeyCountChanged\",\n      \"destination\": \"/tempo/actions/nonce\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/tempo/actions/amm.watchFeeSwap\",\n      \"destination\": \"/tempo/actions/amm\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/tempo/hooks/reward.useStart\",\n      \"destination\": \"/tempo/hooks/reward.useDistribute\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/tempo/hooks/reward.useWatchRewardScheduled\",\n      \"destination\": \"/tempo/hooks/reward.useWatchRewardDistributed\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/tempo/hooks/nonce.useNonceKeyCount\",\n      \"destination\": \"/tempo/hooks/nonce\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/tempo/hooks/nonce.useWatchActiveKeyCountChanged\",\n      \"destination\": \"/tempo/hooks/nonce\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/tempo/hooks/amm.useWatchFeeSwap\",\n      \"destination\": \"/tempo/hooks/amm\",\n      \"permanent\": true\n    },\n\n    {\n      \"source\": \"/cli\",\n      \"destination\": \"/cli/getting-started\",\n      \"permanent\": true\n    },\n\n    {\n      \"source\": \"/core\",\n      \"destination\": \"/core/getting-started\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/core/migration-guide\",\n      \"destination\": \"/core/guides/migrate-from-v1-to-v2\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/core/:name(faq)\",\n      \"destination\": \"/core/guides/:name\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/core/ethers-adapters\",\n      \"destination\": \"/core/guides/ethers-web3\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/core/:section(chains)\",\n      \"destination\": \"/core/api/:section\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/core/:section(actions|connectors)/:name\",\n      \"destination\": \"/core/api/:section/:name\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/core/config\",\n      \"destination\": \"/core/api/createConfig\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/core/api/actions/getAccount\",\n      \"destination\": \"/core/api/actions/getConnection\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/core/api/actions/switchAccount\",\n      \"destination\": \"/core/api/actions/switchConnection\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/core/api/actions/watchAccount\",\n      \"destination\": \"/core/api/actions/watchConnection\",\n      \"permanent\": true\n    },\n\n    {\n      \"source\": \"/react\",\n      \"destination\": \"/react/getting-started\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/react/comparison\",\n      \"destination\": \"/react/comparisons\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/react/migration-guide\",\n      \"destination\": \"/react/guides/migrate-from-v1-to-v2\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/react/:name(faq)\",\n      \"destination\": \"/react/guides/:name\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/react/ethers-adapters\",\n      \"destination\": \"/react/guides/ethers\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/react/:section(actions|chains)\",\n      \"destination\": \"/react/api/:section\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/react/:section(connectors|hooks)/:name\",\n      \"destination\": \"/react/api/:section/:name\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/react/config\",\n      \"destination\": \"/react/api/createConfig\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/react/WagmiConfig\",\n      \"destination\": \"/react/api/WagmiProvider\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/react/prepare-hooks/usePrepareContractWrite\",\n      \"destination\": \"/react/api/hooks/useSimulateContract\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/react/prepare-hooks/usePrepareSendTransaction\",\n      \"destination\": \"/react/api/hooks/useEstimateFeesPerGas\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/react/api/actions/useAccount\",\n      \"destination\": \"/react/api/actions/useConnection\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/react/api/actions/useAccountEffect\",\n      \"destination\": \"/react/api/actions/useConnectionEffect\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/react/api/actions/useSwitchAccount\",\n      \"destination\": \"/react/api/actions/useSwitchConnection\",\n      \"permanent\": true\n    },\n\n    {\n      \"source\": \"/core\",\n      \"destination\": \"/core/getting-started\",\n      \"permanent\": true\n    },\n\n    {\n      \"source\": \"/tempo\",\n      \"destination\": \"/tempo/getting-started\",\n      \"permanent\": true\n    },\n\n    {\n      \"source\": \"/vue/api/actions/useAccount\",\n      \"destination\": \"/vue/api/actions/useConnection\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/vue/api/actions/useAccountEffect\",\n      \"destination\": \"/vue/api/actions/useConnectionEffect\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/vue/api/actions/useSwitchAccount\",\n      \"destination\": \"/vue/api/actions/useSwitchConnection\",\n      \"permanent\": true\n    },\n\n    {\n      \"source\": \"/examples/connect-wallet\",\n      \"destination\": \"/react/guides/connect-wallet\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/examples/send-transaction\",\n      \"destination\": \"/react/guides/send-transaction\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/react/guides/sending-transactions\",\n      \"destination\": \"/react/guides/send-transaction\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/react/guides/reading-contracts\",\n      \"destination\": \"/react/guides/read-from-contract\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/examples/contract-write(-dynamic)?\",\n      \"destination\": \"/react/guides/write-to-contract\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/react/guides/writing-to-contracts\",\n      \"destination\": \"/react/guides/write-to-contract\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/examples/custom-connector\",\n      \"destination\": \"/dev/creating-connectors\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/examples/sign-message\",\n      \"destination\": \"https://1.x.wagmi.sh/examples/sign-message\",\n      \"permanent\": false\n    },\n    {\n      \"source\": \"/examples/sign-in-with-ethereum\",\n      \"destination\": \"https://1.x.wagmi.sh/examples/sign-in-with-ethereum\",\n      \"permanent\": false\n    }\n  ]\n}\n"
  },
  {
    "path": "site/vue/api/Nuxt.md",
    "content": "# Nuxt\n\n[Nuxt Module](https://nuxt.com/docs/guide/concepts/modules) for Wagmi. Adds all [Composables](/vue/api/composables) as [auto-imports](https://nuxt.com/docs/guide/concepts/auto-imports).\n\n## Usage\n\n::: code-group\n```ts twoslash [nuxt.config.ts]\n// @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\"}\nimport { defineNuxtConfig } from 'nuxt/config'\n\nexport default defineNuxtConfig({\n  modules: ['@wagmi/vue/nuxt'],\n})\n```\n```vue [index.vue]\n<script setup lang=\"ts\">\n// No need to import `useConnection`! // [!code focus]\nconst connection = useConnection() // [!code focus]\n</script>\n\n<template>\n  Address: {{ connection.address }}\n</template>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n"
  },
  {
    "path": "site/vue/api/WagmiPlugin.md",
    "content": "# WagmiPlugin\n\n[Vue Plugin](https://vuejs.org/guide/reusability/plugins.html#plugins) for Wagmi.\n\n## Import\n\n```ts\nimport { WagmiPlugin } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```ts [main.ts]\nimport { createApp } from 'vue'\nimport { WagmiPlugin } from '@wagmi/vue'\n\nimport App from './App.vue'\nimport { config } from './config' \n\ncreateApp(App)\n  .use(WagmiPlugin, { config })\n  .mount('#app')\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type WagmiPluginProps } from '@wagmi/vue'\n```\n\n### config\n\n[`Config`](/vue/api/createConfig#config) object to inject with context.\n\n::: code-group\n```ts [main.ts]\nimport { createApp } from 'vue'\nimport { WagmiPlugin } from '@wagmi/vue'\n\nimport App from './App.vue'\nimport { config } from './config' \n\ncreateApp(App)\n  .use(WagmiPlugin, { \n    config // [!code focus]\n  })\n  .mount('#app')\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### initialState\n\n`State | undefined`\n\n- Initial state to hydrate into the [Wagmi Config](/vue/api/createConfig). Useful for SSR.\n\n::: code-group\n```ts [main.ts]\nimport { createApp } from 'vue'\nimport { WagmiPlugin } from '@wagmi/vue'\n\nimport App from './App.vue'\nimport { config } from './config' \n\ncreateApp(App)\n  .use(WagmiPlugin, { \n    config,\n    initialState: /* ... */ // [!code focus]\n  })\n  .mount('#app')\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### reconnectOnMount\n\n`boolean | undefined`\n\n- Whether or not to reconnect previously connected [connectors](/vue/api/createConfig#connectors) on mount.\n- Defaults to `true`.\n\n::: code-group\n```ts [main.ts]\nimport { createApp } from 'vue'\nimport { WagmiPlugin } from '@wagmi/vue'\n\nimport App from './App.vue'\nimport { config } from './config' \n\ncreateApp(App)\n  .use(WagmiPlugin, { \n    config,\n    reconnectOnMount: false // [!code focus]\n  })\n  .mount('#app')\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## configKey\n\nKey to use to provide/inject `Config` via `WagmiPlugin`.\n\n```ts\nimport { configKey, type Config } from '@wagmi/vue'\nimport { inject } from 'vue'\n\ninject<Config | undefined>(configKey)\n```\n"
  },
  {
    "path": "site/vue/api/actions.md",
    "content": "# Actions\n\nSometimes the declarative nature of Vue Composables doesn't work for parts of your app. For those cases, you can use Wagmi Core Actions directly!\n\nAll the Wagmi Core Actions are importable using the `@wagmi/vue/actions` entrypoint. For example, you can use the `watchBlockNumber` action to watch for block number changes.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { watchEffect } from 'vue'\nimport { useConfig } from '@wagmi/vue'\nimport { watchBlockNumber } from '@wagmi/vue/actions'\n\nconst config = useConfig()\n\nwatchEffect((onCleanup) => {\n  const unwatch = watchBlockNumber(config, {\n    onBlockNumber(blockNumber) {\n      console.log('Block number changed!', blockNumber)\n    },\n  })\n\n  onCleanup(unwatch)\n})\n</script>\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\nSee the [Wagmi Core docs](/core/api/actions) for more info on what actions are available.\n"
  },
  {
    "path": "site/vue/api/chains.md",
    "content": "<script setup>\nimport packageJson from '../../../package.json'\nimport SearchChains from '../../components/SearchChains.vue'\n\nconst viemVersion = packageJson.devDependencies.viem\n</script>\n\n# Chains\n\nViem `Chain` objects. More info at the [Viem docs](https://viem.sh/docs/chains/introduction).\n\n## Import\n\nImport via the `'@wagmi/vue/chains'` entrypoint (proxies all chains from `'viem/chains'`).\n\n```ts\nimport { mainnet } from '@wagmi/vue/chains'\n```\n\n## Available Chains\n\nChain definitions as of `viem@{{viemVersion}}`. For `viem@latest`, visit the [Viem repo](https://github.com/wevm/viem/blob/main/src/chains/index.ts).\n\n<SearchChains />\n\n<!--@include: @shared/create-chain.md-->\n"
  },
  {
    "path": "site/vue/api/composables/useBalance.md",
    "content": "---\ntitle: useBalance\ndescription: Composable for fetching native currency balance.\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\nconst actionName = 'getBalance'\nconst typeName = 'GetBalance'\nconst TData = '{ decimals: number; symbol: string; value: bigint; }'\nconst TError = 'GetBalanceErrorType'\n</script>\n\n# useBalance\n\nComposable for fetching native currency balance.\n\n## Import\n\n```ts\nimport { useBalance } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useBalance } from '@wagmi/vue'\n\nconst result = useBalance({\n  address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseBalanceParameters } from '@wagmi/vue'\n```\n\n### address\n\n`Address | undefined`\n\nAddress to get balance for. [`enabled`](#enabled) set to `false` if `address` is `undefined`.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useBalance } from '@wagmi/vue'\nimport { mainnet } from '@wagmi/vue/chains'\n\nconst result = useBalance({\n  address: '0x4557B18E779944BFE9d78A672452331C186a9f48', // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n---\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to get balance at.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useBalance } from '@wagmi/vue'\n\nconst result = useBalance({\n  address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n  blockNumber: 17829139n, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to get balance at.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useBalance } from '@wagmi/vue'\n\nconst result = useBalance({\n  address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n  blockTag: 'latest', // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useBalance } from '@wagmi/vue'\nimport { mainnet } from '@wagmi/vue/chains' // [!code focus]\n\nconst result = useBalance({\n  address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n  chainId: mainnet.id, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useBalance } from '@wagmi/vue'\nimport { config } from './config' // [!code focus]\n\nconst result = useBalance({\n  address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n  config, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useBalance } from '@wagmi/vue'\n\nconst result = useBalance({\n  address: '0x4557B18E779944BFE9d78A672452331C186a9f48',\n  scopeKey: 'foo', // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseBalanceReturnType } from '@wagmi/vue'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getBalance`](/core/api/actions/getBalance)\n"
  },
  {
    "path": "site/vue/api/composables/useBlockNumber.md",
    "content": "---\ntitle: useBlockNumber\ndescription: Composable for fetching the number of the most recent block seen.\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\nconst actionName = 'getBlockNumber'\nconst typeName = 'GetBlockNumber'\nconst TData = 'bigint'\nconst TError = 'GetBlockNumberErrorType'\n</script>\n\n# useBlockNumber\n\nComposable for fetching the number of the most recent block seen.\n\n## Import\n\n```ts\nimport { useBlockNumber } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useBlockNumber } from '@wagmi/vue'\n\nconst { data: blockNumber } = useBlockNumber()\n</script>\n\n<template>\n  Block Number: {{ blockNumber }}\n</template>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseBlockNumberParameters } from '@wagmi/vue'\n```\n\n### cacheTime\n\n`MaybeRef<number> | undefined`\n\nTime in milliseconds that cached block number will remain in memory.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useBlockNumber } from '@wagmi/vue'\n\nconst { data: blockNumber } = useBlockNumber({\n  cacheTime: 4_000 // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### chainId\n\n`MaybeRef<config['chains'][number]['id']> | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useBlockNumber } from '@wagmi/vue'\nimport { mainnet } from '@wagmi/vue/chains' // [!code focus]\n\nconst { data: blockNumber } = useBlockNumber({\n  chainId: mainnet.id, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useBlockNumber } from '@wagmi/vue'\nimport { config } from './config' // [!code focus]\n\nconst { data: blockNumber } = useBlockNumber({\n  config, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`MaybeRef<string> | undefined`\n\nScopes the cache to a given context. Composables that have identical context will share the same cache.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useBlockNumber } from '@wagmi/vue'\n\nconst { data: blockNumber } = useBlockNumber({\n  scopeKey: 'foo', // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### watch\n\n`MaybeRef<boolean | UseWatchBlockNumberParameters> | undefined`\n\n- Enables/disables listening for block number changes.\n- Can pass a subset of [`UseWatchBlockNumberParameters`](/vue/api/composables/useWatchBlockNumber#parameters) directly to [`useWatchBlockNumber`](/vue/api/composables/useWatchBlockNumber).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useBlockNumber } from '@wagmi/vue'\n\nconst { data: blockNumber } = useBlockNumber({\n  watch: true, // [!code focus]\n})\n</script>\n```\n\n```vue [index-2.vue]\n<script setup lang=\"ts\">\nimport { useBlockNumber } from '@wagmi/vue'\n\nconst { data: blockNumber } = useBlockNumber({\n  watch: { // [!code focus]\n    pollingInterval: 4_000 // [!code focus]\n  }, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseBlockNumberReturnType } from '@wagmi/vue'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getBlockNumber`](/core/api/actions/getBlockNumber)\n- [`watchBlockNumber`](/core/api/actions/watchBlockNumber)\n"
  },
  {
    "path": "site/vue/api/composables/useBytecode.md",
    "content": "---\ntitle: useBytecode\ndescription: Composable for retrieving the bytecode at an address.\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\nconst actionName = 'getBytecode'\nconst typeName = 'GetBytecode'\nconst TData = 'GetBytecodeData'\nconst TError = 'GetBytecodeErrorType'\n</script>\n\n# useBytecode\n\nComposable for retrieving the bytecode at an address.\n\n## Import\n\n```ts\nimport { useBytecode } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useBytecode } from '@wagmi/vue'\n\nconst { data: byteCode } = useBytecode({\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n})\n</script>\n\n<template>\n  Byte Code: {{ byteCode }}\n</template>\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseBytecodeParameters } from '@wagmi/vue'\n```\n\n### address\n\n`Address | undefined`\n\nThe contract address.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useBytecode } from '@wagmi/vue'\n\nconst { data: byteCode } = useBytecode({\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', // [!code focus]\n})\n</script>\n\n<template>\n  Byte Code: {{ byteCode }}\n</template>\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockNumber\n\n`bigint | undefined`\n\nThe block number to check the bytecode at.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useBytecode } from '@wagmi/vue'\n\nconst { data: byteCode } = useBytecode({\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  blockNumber: 16280770n, // [!code focus]\n})\n</script>\n\n<template>\n  Byte Code: {{ byteCode }}\n</template>\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nThe block tag to check the bytecode at.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useBytecode } from '@wagmi/vue'\n\nconst { data: byteCode } = useBytecode({\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  blockTag: 'safe', // [!code focus]\n})\n</script>\n\n<template>\n  Byte Code: {{ byteCode }}\n</template>\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nThe chain ID to check the bytecode at.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useBytecode } from '@wagmi/vue'\nimport { mainnet } from '@wagmi/vue/chains'\n\nconst { data: byteCode } = useBytecode({\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  chainId: mainnet.id, // [!code focus]\n})\n</script>\n\n<template>\n  Byte Code: {{ byteCode }}\n</template>\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useBytecode } from '@wagmi/vue'\nimport { config } from './config' // [!code focus]\n\nconst { data: byteCode } = useBytecode({\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  config, // [!code focus]\n})\n</script>\n\n<template>\n  Byte Code: {{ byteCode }}\n</template>\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Hooks that have identical context will share the same cache.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useBytecode } from '@wagmi/vue'\nimport { config } from './config' // [!code focus]\n\nconst { data: byteCode } = useBytecode({\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  scopeKey: 'foo', // [!code focus]\n})\n</script>\n\n<template>\n  Byte Code: {{ byteCode }}\n</template>\n```\n<<< @/snippets/react/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseBytecodeReturnType } from '@wagmi/vue'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getBytecode`](/core/api/actions/getBytecode)\n"
  },
  {
    "path": "site/vue/api/composables/useChainId.md",
    "content": "---\ntitle: useChainId\ndescription: Composable for getting current chain ID.\n---\n\n# useChainId\n\nComposable for getting current chain ID.\n\n## Import\n\n```ts\nimport { useChainId } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useChainId } from '@wagmi/vue'\n\nconst chainId = useChainId()\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseChainIdParameters } from '@wagmi/vue'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useChainId } from '@wagmi/vue'\nimport { config } from './config' // [!code focus]\n\nconst chainId = useChainId({\n  config, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type UseChainIdReturnType } from '@wagmi/vue'\n```\n\n`number`\n\nCurrent chain ID from [`config.state.chainId`](/vue/api/createConfig#chainid).\n\n::: info\nOnly returns chain IDs for chains configured via `createConfig`'s [`chains`](/vue/api/createConfig#chains) parameter.\n\nIf the active [connection](/vue/api/createConfig#connection) [`chainId`](/vue/api/createConfig#chainid-1) is not from a chain included in your Wagmi `Config`, `useChainId` will return the last configured chain ID.\n:::\n\n## Action\n\n- [`getChainId`](/core/api/actions/getChainId)\n- [`watchChainId`](/core/api/actions/watchChainId)\n"
  },
  {
    "path": "site/vue/api/composables/useChains.md",
    "content": "---\ntitle: useChains\ndescription: Composable for getting configured chains\n---\n\n# useChains\n\nComposable for getting configured chains\n\n## Import\n\n```ts\nimport { useChains } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useChains } from '@wagmi/vue'\n\nconst chains = useChains()\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseChainsParameters } from '@wagmi/vue'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useChains } from '@wagmi/vue'\nimport { config } from './config' // [!code focus]\n\nconst chains = useChains({\n  config, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type UseChainsReturnType } from '@wagmi/vue'\n```\n\n`readonly [Chain, ...Chain[]]`\n\nChains from [`config.chains`](/vue/api/createConfig#chains).\n\n## Action\n\n- [`getChains`](/core/api/actions/getChains)\n"
  },
  {
    "path": "site/vue/api/composables/useClient.md",
    "content": "---\ntitle: useClient\ndescription: Composable for getting Viem `Client` instance.\n---\n\n# useClient\n\nComposable for getting Viem [`Client`](https://viem.sh/docs/clients/custom) instance.\n\n## Import\n\n```ts\nimport { useClient } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useClient } from '@wagmi/vue'\n\nconst client = useClient()\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseClientParameters } from '@wagmi/vue'\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when getting Viem Client.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useClient } from '@wagmi/vue'\nimport { mainnet } from '@wagmi/vue/chains' // [!code focus]\nimport { config } from './config'\n\nconst client = useClient({\n  chainId: mainnet.id, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useClient } from '@wagmi/vue'\nimport { config } from './config' // [!code focus]\n\nconst client = useClient({\n  config, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type UseClientReturnType } from '@wagmi/vue'\n```\n\n`Client | undefined`\n\nViem [`Client`](https://viem.sh/docs/clients/custom) instance.\n\n## Action\n\n- [`getClient`](/core/api/actions/getClient)\n- [`watchClient`](/core/api/actions/watchClient)\n"
  },
  {
    "path": "site/vue/api/composables/useConfig.md",
    "content": "---\ntitle: useConfig\ndescription: Composable for getting `Config` from the `WagmiPlugin`.\n---\n\n# useConfig\n\nComposable for getting [`Config`](/vue/api/createConfig#config) from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n## Import\n\n```ts\nimport { useConfig } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useConfig } from 'wagmi'\n\nconst config = useConfig()\n</script>\n```\n\n:::\n\n## Return Type\n\n```ts\nimport { type UseConfigReturnType } from 'wagmi'\n```\n"
  },
  {
    "path": "site/vue/api/composables/useConnect.md",
    "content": "---\ntitle: useConnect\ndescription: Composable for connecting accounts with connectors.\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\nconst actionName = 'connect'\nconst typeName = 'Connect'\nconst mutate = 'connect'\nconst TData = '{ accounts: readonly [Address, ...Address[]]; chainId: number; }'\nconst TError = 'ConnectErrorType'\nconst TVariables = '{ chainId?: number | undefined; connector?: CreateConnectorFn | Connector | undefined; withCapabilities?: boolean | undefined }'\n</script>\n\n# useConnect\n\nComposable for connecting accounts with [connectors](/vue/api/connectors).\n\n## Import\n\n```ts\nimport { useConnect } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useConnect } from '@wagmi/vue'\nimport { injected } from '@wagmi/connectors'\n\nconst connect = useConnect()\n</script>\n\n<template>\n  <button @click=\"connect.mutate({ connector: injected() })\">\n    Connect\n  </button>\n</template>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseConnectParameters } from '@wagmi/vue'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useConnect } from '@wagmi/vue'\nimport { config } from './config' // [!code focus]\n\nconst connect = useConnect({\n  config, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseConnectReturnType } from '@wagmi/vue'\n```\n\n<!--@include: @shared/mutation-result.md-->\n\n::: tip\nNot all connectors support connecting directly to a `chainId` (e.g. they don't support programmatic chain switching). In those cases, the connector will connect to whatever chain the connector's provider (e.g. wallet) is connected to.\n:::\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`connect`](/core/api/actions/connect)\n"
  },
  {
    "path": "site/vue/api/composables/useConnection.md",
    "content": "---\ntitle: useConnection\ndescription: Composable for getting current connection.\n---\n\n# useConnection\n\nComposable for getting current connection.\n\n## Import\n\n```ts\nimport { useConnection } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue twoslash [index.vue]\n// @twoslash-cache: {\"v\":1,\"hash\":\"13c71d856a5988592573d4377882b1c1fa1e1a07a6da8a54925e9753a897fb69\",\"data\":\"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\"}\n<script setup lang=\"ts\">\n// ---cut-start---\n// @errors: 2322\nimport { type Config } from '@wagmi/vue'\nimport { mainnet, sepolia } from '@wagmi/vue/chains'\n\ndeclare module '@wagmi/vue' {\n  interface Register {\n    config: Config<readonly [typeof mainnet, typeof sepolia]>\n  }\n}\n// ---cut-end---\nimport { useConnection } from '@wagmi/vue'\n\nconst connection = useConnection()\n</script>\n\n<template>\n  Address: {{ connection.address }}\n</template>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts twoslash\n// @twoslash-cache: {\"v\":1,\"hash\":\"7e300c04b97782c39df43713d56b7a3f066187bfbb69ba67cfe1b4d60e143b11\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808AKAQwBsBLZuASgAJMcvAKpwYAYQhgwMAMZp2kgArNSzALYwapOAB4ZkgGbsA5rzo0wUOLwlgjpgLw3DJgHy8nwADphef3vp2JgD8iAEupgA+zkFRvACuljBG0lAA3D4Avj7salgQpGjCorbScgpgyqoaWghUcGgqDIgAjAAsVKwwYMZo+EgATADMVI2kxpp4IuKSZfJKKuqaZHUgHNJIAAxUMviLcmRI7ZkAujvQuIggufmFvMD82DDFM1Ky85WLNSu8mbwGpAgal4AHIAAIAd2YxjU7AA9ER4jAQZQQDVmEhQOZunAKng0AhMpkgA==\"}\nimport { type UseConnectionParameters } from '@wagmi/vue'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useConnection } from '@wagmi/vue'\nimport { config } from './config' // [!code focus]\n\nconst connection = useConnection({\n  config, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts twoslash\n// @twoslash-cache: {\"v\":1,\"hash\":\"b6f1971287fb7adb77e1a5d5dc952329e6dd516b560ac655f5064dcb9d4b925c\",\"data\":\"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808AKAQwBsBLZuASgAJMcvAKpwYAYQhgwMAMZp2kgEow0AV1JgAKthgAeGZIBm7AOa86NMFDi8JYY2YC8to6YB8vZ5ojLDcXcAAOmC8obzMUFCk8HCIvKpWMMbSUADcwWHhkdFworHxickwaRlhMvjM7GBxCbBFJSFlFVUAklA1hVXF6Y2hBlKyaBCkHXVdDZnscHbScsVxhmyiPZNwyv2z8mAmC0swK2FTM4NVO7yLrMuloVMAIlMbg/P8pKr717xwaMxq+YEgUAekk2xX+PQAvh4AD68by+fxBXpZKIxOIAQWyMQOoQiKNy8Di0QiklYGF4yAxeLgFF4ADp6ZScnBkABdFnY3jlSrVXiMOwOcz0GBWGz9AUAflszRCcTFpmQ/y5VTg/xZyDAqgAtgAjMgsvgw2pJcYcpVgNpxDU6sim4GDYZxY5yYYco52ubtF5vV3Td1bM4XK5Iu5AgYe3aXd7BtayP2nCNBzJfH6qP4gR4esHBSG8GFwpL+em06GwnwF3RFtzBdiarDDNDCURO+RKFTqLQ6SggZOkBiIACMABYqKxhSY0PgkAAmADMVG+pBMKjwInEcdbag02hwXY40iQAAYqFzSMw5uQB4PwSzj9BcIgQDW673eMB+DpG2uwy2wMpNx3BHBc5SAgTVeAAcgAAQAd2YExNXYAB6Ig3nArtNRUZgkFACxhTgBQwDwNAEHBcEgA==\"}\nimport { type UseConnectionReturnType } from '@wagmi/vue'\n```\n\n<!--@include: @shared/getConnection-return-type.md-->\n\n## Action\n\n- [`getConnection`](/core/api/actions/getConnection)\n"
  },
  {
    "path": "site/vue/api/composables/useConnectionEffect.md",
    "content": "---\ntitle: useConnectionEffect\ndescription: Composable for listening to connection lifecycle events.\n---\n\n# useConnectionEffect\n\nComposable for listening to connection lifecycle events.\n\n## Import\n\n```ts\nimport { useConnectionEffect } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useConnectionEffect } from '@wagmi/vue'\n\nuseConnectionEffect({\n  onConnect(data) {\n    console.log('Connected!', data)\n  },\n  onDisconnect() {\n    console.log('Disconnected!')\n  },\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type useConnectionEffectParameters } from '@wagmi/vue'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useConnectionEffect } from '@wagmi/vue'\nimport { config } from './config' // [!code focus]\n\nuseConnectionEffect({\n  config, // [!code focus]\n  onConnect(data) {\n    console.log('Connected!', data)\n  },\n  onDisconnect() {\n    console.log('Disconnected!')\n  },\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### onConnect\n\n`` MaybeRef<((data: { address: `0x${string}`; addresses: readonly [`0x${string}`, ...`0x${string}`[]]; chain: Chain | undefined chainId: number; connector: Connector; isReconnected: boolean }) => void)> | undefined ``\n\nCallback that is called when connection is made.\n\n::: code-group\n```tsx [index.tsx]\nimport { useConnectionEffect } from '@wagmi/vue'\n\nfunction App() {\n  useConnectionEffect({\n    onConnect(data) { // [!code focus]\n      console.log('Connected!', data) // [!code focus]\n    }, // [!code focus]\n  })\n}\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### onDisconnect\n\n`MaybeRef<(() => void)> | undefined`\n\nCallback that is called when there no more connections.\n\n::: code-group\n```tsx [index.tsx]\nimport { useConnectionEffect } from '@wagmi/vue'\n\nfunction App() {\n  useConnectionEffect({\n    onDisconnect() { // [!code focus]\n      console.log('Disconnected!') // [!code focus]\n    }, // [!code focus]\n  })\n}\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Action\n\n- [`getConnection`](/core/api/actions/getConnection)\n- [`watchConnection`](/core/api/actions/watchConnection)\n"
  },
  {
    "path": "site/vue/api/composables/useConnections.md",
    "content": "---\ntitle: useConnections\ndescription: Composable for getting active connections.\n---\n\n# useConnections\n\nComposable for getting active connections.\n\n## Import\n\n```ts\nimport { useConnections } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useConnections } from 'wagmi'\n\nconst connections = useConnections()\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseConnectionsParameters } from 'wagmi'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useConnections } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nconst connections = useConnections({\n  config, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type UseConnectionsReturnType } from 'wagmi'\n```\n\n## Action\n\n- [`getConnections`](/core/api/actions/getConnections)\n- [`watchConnections`](/core/api/actions/watchConnections)\n"
  },
  {
    "path": "site/vue/api/composables/useConnectorClient.md",
    "content": "---\ntitle: useConnectorClient\ndescription: Composable for getting a Viem `Client` object for the current or provided connector.\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\nconst actionName = 'getConnectorClient'\nconst typeName = 'GetConnectorClient'\nconst TData = 'Client'\nconst TError = 'GetConnectorClientErrorType'\nconst hideQueryOptions = ['gcTime', 'staleTime']\n</script>\n\n# useConnectorClient\n\nComposable for getting a Viem [`Client`](https://viem.sh/docs/clients/custom) object for the current or provided connector.\n\n## Import\n\n```ts\nimport { useConnectorClient } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useConnectorClient } from '@wagmi/vue'\n\nconst result = useConnectorClient()\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseConnectorClientParameters } from '@wagmi/vue'\n```\n\n### account\n\n`Address | Account | undefined`\n\nAccount to use with client. Throws if account is not found on [`connector`](#connector).\n\n```vue\n<script setup lang=\"ts\">\nimport { useConnectorClient } from '@wagmi/vue'\n\nconst result = useConnectorClient({\n  account: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n})\n</script>\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use with client.\n\n```vue\n<script setup lang=\"ts\">\nimport { useConnectorClient } from '@wagmi/vue'\n\nconst result = useConnectorClient({\n  chainId: mainnet.id, // [!code focus]\n})\n</script>\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useConnectorClient } from '@wagmi/vue'\nimport { config } from './config' // [!code focus]\n\nconst result = useConnectorClient({\n  config, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### connector\n\n`Connector | undefined`\n\n- Connector to get client for.\n- Defaults to current connector.\n\n```vue\n<script setup lang=\"ts\">\nimport { useConnections, useConnectorClient } from '@wagmi/vue'\n\nconst connections = useConnections(config)\nconst result = useConnectorClient({\n  connector: connections[0]?.connector, // [!code focus]\n})\n</script>\n```\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseConnectorClientReturnType } from '@wagmi/vue'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getConnectorClient`](/core/api/actions/getConnectorClient)\n"
  },
  {
    "path": "site/vue/api/composables/useConnectors.md",
    "content": "---\ntitle: useConnectors\ndescription: Composable for getting configured connectors.\n---\n\n# useConnectors\n\nComposable for getting configured connectors.\n\n## Import\n\n```ts\nimport { useConnectors } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useConnectors } from '@wagmi/vue'\n\nconst connectors = useConnectors()\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Return Type\n\n```ts\nimport { type UseConnectorsReturnType } from '@wagmi/vue'\n```\n\n`readonly Connector[]`\n\nConnectors from [`config.connectors`](/vue/api/createConfig#connectors-1).\n\n## Action\n\n- [`getConnectors`](/core/api/actions/getConnectors)\n"
  },
  {
    "path": "site/vue/api/composables/useDisconnect.md",
    "content": "---\ntitle: useDisconnect\ndescription: Composable for disconnecting connections.\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\nconst actionName = 'disconnect'\nconst typeName = 'Disconnect'\nconst mutate = 'disconnect'\nconst TData = 'void'\nconst TError = 'DisconnectErrorType'\nconst TVariables = '{ connector?: Connector | undefined; }'\n</script>\n\n# useDisconnect\n\nComposable for disconnecting connections.\n\n## Import\n\n```ts\nimport { useDisconnect } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useDisconnect } from '@wagmi/vue'\n\nconst disconnect = useDisconnect()\n</script>\n\n<template>\n  <button @click=\"disconnect.mutate()\">\n    Disconnect\n  </button>\n</template>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseDisconnectParameters } from '@wagmi/vue'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useDisconnect } from '@wagmi/vue'\nimport { config } from './config' // [!code focus]\n\nconst disconnect = useDisconnect({\n  config, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseDisconnectReturnType } from '@wagmi/vue'\n```\n\n<!--@include: @shared/mutation-result.md-->\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`disconnect`](/core/api/actions/connect)\n"
  },
  {
    "path": "site/vue/api/composables/useEnsAddress.md",
    "content": "---\ntitle: useEnsAddress\ndescription: Composable for fetching ENS address for name.\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\nconst actionName = 'getEnsAddress'\nconst typeName = 'GetEnsAddress'\nconst TData = 'string'\nconst TError = 'GetEnsAddressErrorType'\n</script>\n\n# useEnsAddress\n\nComposable for fetching ENS address for name.\n\n## Import\n\n```ts\nimport { useEnsAddress } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsAddress } from '@wagmi/vue'\nimport { normalize } from 'viem/ens'\n\nconst result = useEnsAddress({\n  name: normalize('wevm.eth'),\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n::: warning\nSince ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `useEnsAddress`. You can use Viem's built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n:::\n\n## Parameters\n\n```ts\nimport { type UseEnsAddressParameters } from '@wagmi/vue'\n```\n\n---\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to get ENS address at.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsAddress } from '@wagmi/vue'\nimport { normalize } from 'viem/ens'\n\nconst result = useEnsAddress({\n  blockNumber: 17829139n, // [!code focus]\n  name: normalize('wevm.eth'),\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to get ENS address at.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsAddress } from '@wagmi/vue'\nimport { normalize } from 'viem/ens'\n\nconst result = useEnsAddress({\n  name: normalize('wevm.eth'),\n  blockTag: 'latest', // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsAddress } from '@wagmi/vue'\nimport { mainnet } from '@wagmi/vue/chains' // [!code focus]\nimport { normalize } from 'viem/ens'\n\nconst result = useEnsAddress({\n  chainId: mainnet.id, // [!code focus]\n  name: normalize('wevm.eth'),\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### coinType\n\n`number | undefined`\n\nThe [ENSIP-9](https://docs.ens.domains/ens-improvement-proposals/ensip-9-multichain-address-resolution) coin type to fetch the address for.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsAddress } from '@wagmi/vue'\nimport { normalize } from 'viem/ens'\n\nconst result = useEnsAddress({\n  coinType: 60, // [!code focus]\n  name: normalize('wevm.eth'),\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsAddress } from '@wagmi/vue'\nimport { normalize } from 'viem/ens'\nimport { config } from './config' // [!code focus]\n\nconst result = useEnsAddress({\n  config, // [!code focus]\n  name: normalize('wevm.eth'),\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### name\n\n`string | undefined`\n\nName to get the address for. [`enabled`](#enabled) set to `false` if `name` is `undefined`.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsAddress } from '@wagmi/vue'\nimport { normalize } from 'viem/ens'\n\nconst result = useEnsAddress({\n  name: normalize('wevm.eth'), // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Composables that have identical context will share the same cache.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsAddress } from '@wagmi/vue'\nimport { normalize } from 'viem/ens'\n\nconst result = useEnsAddress({\n  name: normalize('wevm.eth'),\n  scopeKey: 'foo', // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### universalResolverAddress\n\n`Address | undefined`\n\n- Address of ENS Universal Resolver Contract.\n- Defaults to current chain's Universal Resolver Contract address.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsAddress } from '@wagmi/vue'\nimport { normalize } from 'viem/ens'\n\nconst result = useEnsAddress({\n  name: normalize('wevm.eth'),\n  universalResolverAddress: '0x74E20Bd2A1fE0cdbe45b9A1d89cb7e0a45b36376', // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseEnsAddressReturnType } from '@wagmi/vue'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getEnsAddress`](/core/api/actions/getEnsAddress)\n"
  },
  {
    "path": "site/vue/api/composables/useEnsAvatar.md",
    "content": "---\ntitle: useEnsAvatar\ndescription: Composable for fetching ENS avatar for name.\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\nconst actionName = 'getEnsAvatar'\nconst typeName = 'GetEnsAvatar'\nconst TData = 'string | null'\nconst TError = 'GetEnsAvatarErrorType'\n</script>\n\n# useEnsAvatar\n\nComposable for fetching ENS avatar for name.\n\n## Import\n\n```ts\nimport { useEnsAvatar } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsAvatar } from '@wagmi/vue'\nimport { normalize } from 'viem/ens'\n\nconst result = useEnsAvatar({\n  name: normalize('wevm.eth'),\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n::: warning\nSince ENS names prohibit certain forbidden characters (e.g. underscore) and have other validation rules, you likely want to [normalize ENS names](https://docs.ens.domains/contract-api-reference/name-processing#normalising-names) with [UTS-46 normalization](https://unicode.org/reports/tr46) before passing them to `useEnsAvatar`. You can use Viem's built-in [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function for this.\n:::\n\n## Parameters\n\n```ts\nimport { type UseEnsAvatarParameters } from '@wagmi/vue'\n```\n\n---\n\n### assetGatewayUrls <Badge text=\"viem@>=2.3.1\" />\n\n`{ ipfs?: string | undefined; arweave?: string | undefined } | undefined`\n\nGateway urls to resolve IPFS and/or Arweave assets.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { getEnsAvatar } from '@wagmi/core'\nimport { normalize } from 'viem/ens'\nimport { config } from './config'\n\nconst result = useEnsAvatar({\n  assetGatewayUrls: { // [!code focus]\n    ipfs: 'https://cloudflare-ipfs.com', // [!code focus]\n  }, // [!code focus]\n  name: normalize('wevm.eth'),\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to get ENS avatar at.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsAvatar } from '@wagmi/vue'\nimport { normalize } from 'viem/ens'\n\nconst result = useEnsAvatar({\n  blockNumber: 17829139n, // [!code focus]\n  name: normalize('wevm.eth'),\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to get ENS avatar at.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsAvatar } from '@wagmi/vue'\nimport { normalize } from 'viem/ens'\n\nconst result = useEnsAvatar({\n  name: normalize('wevm.eth'),\n  blockTag: 'latest', // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsAvatar } from '@wagmi/vue'\nimport { mainnet } from 'wagmi/chains' // [!code focus]\nimport { normalize } from 'viem/ens'\n\nconst result = useEnsAvatar({\n  chainId: mainnet.id, // [!code focus],\n  name: normalize('wevm.eth'),\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsAvatar } from '@wagmi/vue'\nimport { normalize } from 'viem/ens'\nimport { config } from './config' // [!code focus]\n\nconst result = useEnsAvatar({\n  config, // [!code focus]\n  name: normalize('wevm.eth'),\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### gatewayUrls\n\n`string[] | undefined`\n\nA set of Universal Resolver gateways, used for resolving CCIP-Read requests made through the ENS Universal Resolver Contract.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsAvatar } from '@wagmi/vue'\nimport { normalize } from 'viem/ens'\n\nconst result = useEnsAvatar({\n  gatewayUrls: ['https://cloudflare-ipfs.com'], // [!code focus]\n  name: normalize('wevm.eth'),\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### name\n\n`string | undefined`\n\nName to get the avatar for. [`enabled`](#enabled) set to `false` if `name` is `undefined`.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsAvatar } from '@wagmi/vue'\nimport { normalize } from 'viem/ens'\n\nconst result = useEnsAvatar({\n  name: normalize('wevm.eth'), // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Composables that have identical context will share the same cache.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsAvatar } from '@wagmi/vue'\nimport { normalize } from 'viem/ens'\n\nconst result = useEnsAvatar({\n  name: normalize('wevm.eth'),\n  scopeKey: 'foo', // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### universalResolverAddress\n\n`Address | undefined`\n\n- Address of ENS Universal Resolver Contract.\n- Defaults to current chain's Universal Resolver Contract address.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsAvatar } from '@wagmi/vue'\nimport { normalize } from 'viem/ens'\n\nconst result = useEnsAvatar({\n  name: normalize('wevm.eth'),\n  universalResolverAddress: '0x74E20Bd2A1fE0cdbe45b9A1d89cb7e0a45b36376', // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseEnsAvatarReturnType } from '@wagmi/vue'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getEnsAvatar`](/core/api/actions/getEnsAvatar)\n"
  },
  {
    "path": "site/vue/api/composables/useEnsName.md",
    "content": "---\ntitle: useEnsName\ndescription: Composable for fetching primary ENS name for address.\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\nconst actionName = 'getEnsName'\nconst typeName = 'GetEnsName'\nconst TData = 'string | null'\nconst TError = 'GetEnsNameErrorType'\n</script>\n\n# useEnsName\n\nComposable for fetching primary ENS name for address.\n\n## Import\n\n```ts\nimport { useEnsName } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsName } from '@wagmi/vue'\n\nconst result = useEnsName({\n  address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseEnsNameParameters } from '@wagmi/vue'\n```\n\n### address\n\n`Address | undefined`\n\nName to get the resolver for. [`enabled`](#enabled) set to `false` if `address` is `undefined`.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsName } from '@wagmi/vue'\n\nconst result = useEnsName({\n  address: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n---\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to get ENS name at.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsName } from '@wagmi/vue'\n\nconst result = useEnsName({\n  address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  blockNumber: 17829139n, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to get ENS name at.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsName } from '@wagmi/vue'\n\nconst result = useEnsName({\n  address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  blockTag: 'latest', // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsName } from '@wagmi/vue'\nimport { mainnet } from 'wagmi/chains' // [!code focus]\n\nconst result = useEnsName({\n  address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  chainId: mainnet.id, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsName } from '@wagmi/vue'\nimport { normalize } from 'viem/ens'\nimport { config } from './config' // [!code focus]\n\nconst result = useEnsName({\n  address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  config, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Composables that have identical context will share the same cache.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsName } from '@wagmi/vue'\n\nconst result = useEnsName({\n  address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  scopeKey: 'foo', // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### universalResolverAddress\n\n`Address | undefined`\n\n- Address of ENS Universal Resolver Contract.\n- Defaults to current chain's Universal Resolver Contract address.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEnsName } from '@wagmi/vue'\n\nconst result = useEnsName({\n  address: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  universalResolverAddress: '0x74E20Bd2A1fE0cdbe45b9A1d89cb7e0a45b36376', // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseEnsNameReturnType } from '@wagmi/vue'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getEnsName`](/core/api/actions/getEnsName)\n"
  },
  {
    "path": "site/vue/api/composables/useEstimateGas.md",
    "content": "---\ntitle: useEstimateGas\ndescription: Composable for estimating the gas necessary to complete a transaction without submitting it to the network.\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\nconst actionName = 'estimateGas'\nconst typeName = 'EstimateGas'\nconst TData = 'bigint'\nconst TError = 'EstimateGasErrorType'\n</script>\n\n# useEstimateGas\n\nComposable for estimating the gas necessary to complete a transaction without submitting it to the network.\n\n## Import\n\n```ts\nimport { useEstimateGas } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEstimateGas } from '@wagmi/vue'\n\nconst result = useEstimateGas()\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseEstimateGasParameters } from '@wagmi/vue'\n```\n\n### accessList\n\n`AccessList | undefined`\n\nThe access list.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEstimateGas } from '@wagmi/vue'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = useEstimateGas({\n  accessList: [{ // [!code focus]\n    address: '0x1', // [!code focus]\n    storageKeys: ['0x1'], // [!code focus]\n  }], // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### account\n\n`Address | Account | undefined`\n\nAccount to use when estimating gas.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEstimateGas } from '@wagmi/vue'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = useEstimateGas({\n  account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nChain ID to target when estimating gas.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEstimateGas } from '@wagmi/vue'\nimport { mainnet } from '@wagmi/vue/chains'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = useEstimateGas({\n  chainId: mainnet.id, // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### connector\n\n`Connector | undefined`\n\nConnector to estimate with. If no [`account`](#account) is provided, will use default account from connector.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useConnections, useEstimateGas } from '@wagmi/vue'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst connections = useConnections()\nconst result = useEstimateGas({\n  connector: connections[0]?.connector, // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### data\n\n`` `0x${string}` | undefined ``\n\nA contract hashed method call with encoded function data.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEstimateGas } from '@wagmi/vue'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = useEstimateGas({\n  data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### gas\n\n`bigint | undefined`\n\nGas provided for transaction execution.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEstimateGas } from '@wagmi/vue'\nimport { parseEther, parseGwei } from 'viem'\nimport { config } from './config'\n\nconst result = useEstimateGas({\n  gas: parseGwei('20'), // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n---\n\n### gasPrice\n\n`bigint | undefined`\n\nThe price in wei to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms#legacy-transaction).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEstimateGas } from '@wagmi/vue'\nimport { parseEther, parseGwei } from 'viem'\nimport { config } from './config'\n\nconst result = useEstimateGas({\n  gasPrice: parseGwei('20'), // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### maxFeePerGas\n\n`bigint | undefined`\n\nTotal fee per gas in wei, inclusive of [`maxPriorityFeePerGas`](#maxPriorityFeePerGas). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEstimateGas } from '@wagmi/vue'\nimport { parseEther, parseGwei } from 'viem'\nimport { config } from './config'\n\nconst result = useEstimateGas({\n  maxFeePerGas: parseGwei('20'), // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### maxPriorityFeePerGas\n\n`bigint | undefined`\n\nMax priority fee per gas in wei. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEstimateGas } from '@wagmi/vue'\nimport { parseEther, parseGwei } from 'viem'\nimport { config } from './config'\n\nconst result = useEstimateGas({\n  maxFeePerGas: parseGwei('20'),\n  maxPriorityFeePerGas: parseGwei('2'), // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n---\n\n### nonce\n\n`number`\n\nUnique number identifying this transaction.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEstimateGas } from '@wagmi/vue'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = useEstimateGas({\n  nonce: 123, // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Composables that have identical context will share the same cache.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEstimateGas } from '@wagmi/vue'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = useEstimateGas({\n  scopeKey: 'foo', // [!code focus]\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### to\n\n`Address | undefined`\n\nThe transaction recipient or contract address.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEstimateGas } from '@wagmi/vue'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = useEstimateGas({\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n  value: parseEther('0.01'),\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### type\n\n`'legacy' | 'eip1559' | 'eip2930' | undefined`\n\nOptional transaction request type to narrow parameters.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEstimateGas } from '@wagmi/vue'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = useEstimateGas({\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  type: 'eip1559', // [!code focus]\n  value: parseEther('0.01'),\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### value\n\n`bigint | undefined`\n\nValue in wei sent with this transaction.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useEstimateGas } from '@wagmi/vue'\nimport { parseEther } from 'viem'\nimport { config } from './config'\n\nconst result = useEstimateGas({\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', \n  value: parseEther('0.01'), // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseEstimateGasReturnType } from '@wagmi/vue'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`estimateGas`](/core/api/actions/estimateGas)\n"
  },
  {
    "path": "site/vue/api/composables/useReadContract.md",
    "content": "---\ntitle: useReadContract\ndescription: Composable for calling a read-only function on a contract, and returning the response.\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\nconst actionName = 'readContract'\nconst typeName = 'ReadContract'\nconst TData = 'ReadContractReturnType'\nconst TError = 'ReadContractErrorType'\n</script>\n\n# useReadContract\n\nComposable for calling a **read-only** function on a contract, and returning the response.\n\nA **read-only** function (constant function) on a Solidity contract is denoted by a pure or view keyword. They can only read the state of the contract, and cannot make any changes to it. Since read-only methods do not change the state of the contract, they do not require any gas to be executed, and can be called by any user without the need to pay for gas.\n\n## Import\n\n```ts\nimport { useReadContract } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useReadContract } from '@wagmi/vue'\nimport { abi } from './abi'\n\nconst result = useReadContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'totalSupply',\n})\n</script>\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseReadContractParameters } from '@wagmi/vue'\n```\n\n### abi\n\n`Abi | undefined`\n\nThe contract's ABI. Check out the [TypeScript docs](/vue/typescript#const-assert-abis-typed-data) for how to set up ABIs for maximum type inference and safety.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useReadContract } from '@wagmi/vue'\nimport { abi } from './abi' // [!code focus]\n\nconst result = useReadContract({\n  abi, // [!code focus]\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'totalSupply',\n})\n</script>\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### account\n\n`Account | undefined`\n\nAccount to use when calling the contract (`msg.sender`).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useReadContract } from '@wagmi/vue'\nimport { abi } from './abi'\n\nconst result = useReadContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'balanceOf',\n  args: ['0x6b175474e89094c44da98b954eedeac495271d0f'],\n  account: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n})\n</script>\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### address\n\n`Address | undefined`\n\nThe contract's address.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useReadContract } from '@wagmi/vue'\nimport { abi } from './abi'\n\nconst result = useReadContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f', // [!code focus]\n  functionName: 'totalSupply',\n})\n</script>\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### args\n\n`readonly unknown[] | undefined`\n\n- Arguments to pass when calling the contract.\n- Inferred from [`abi`](#abi) and [`functionName`](#functionname).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useReadContract } from '@wagmi/vue'\nimport { abi } from './abi'\n\nconst result = useReadContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'balanceOf',\n  args: ['0x6b175474e89094c44da98b954eedeac495271d0f'], // [!code focus]\n})\n</script>\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n---\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to call contract at.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useReadContract } from '@wagmi/vue'\nimport { abi } from './abi'\n\nconst result = useReadContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'totalSupply',\n  blockNumber: 17829139n, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to call contract at.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useReadContract } from '@wagmi/vue'\nimport { abi } from './abi'\n\nconst result = useReadContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'totalSupply',\n  blockTag: 'safe', // [!code focus]\n})\n</script>\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useReadContract } from '@wagmi/vue'\nimport { mainnet } from 'wagmi/chains' // [!code focus]\nimport { abi } from './abi'\n\nconst result = useReadContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'totalSupply',\n  chainId: mainnet.id, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useReadContract } from '@wagmi/vue'\nimport { abi } from './abi'\nimport { config } from './config' // [!code focus]\n\nconst result = useReadContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'totalSupply',\n  config, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### functionName\n\n`string | undefined`\n\n- Function to call on the contract.\n- Inferred from [`abi`](#abi).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useReadContract } from '@wagmi/vue'\nimport { abi } from './abi'\n\nconst result = useReadContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'balanceOf', // [!code focus]\n  args: ['0x6b175474e89094c44da98b954eedeac495271d0f'],\n})\n</script>\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Composables that have identical context will share the same cache.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useReadContract } from '@wagmi/vue'\nimport { abi } from './abi'\n\nconst result = useReadContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'balanceOf',\n  args: ['0x6b175474e89094c44da98b954eedeac495271d0f'],\n  scopeKey: 'foo', // [!code focus]\n})\n</script>\n```\n<<< @/snippets/abi-read.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseReadContractReturnType } from '@wagmi/vue'\n```\n\nThe return type's [`data`](#data) property is inferrable via the combination of [`abi`](#abi), [`functionName`](#functionname), and [`args`](#args). Check out the [TypeScript docs](/vue/typescript#const-assert-abis-typed-data) for more info.\n\n<!--@include: @shared/query-result.md-->\n\n## Type Inference\n\nWith [`abi`](#abi) setup correctly, TypeScript will infer the correct types for [`functionName`](#functionname), [`args`](#args), and the return type. See the Wagmi [TypeScript docs](/vue/typescript) for more information.\n\n::: code-group\n```ts twoslash [Inline]\n// @twoslash-cache: {\"v\":1,\"hash\":\"c9cd30cf155368eb52dff62473381dfcdf7018daabaed2ca4c58019bdbc995a3\",\"data\":\"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\"}\nimport { createConfig, http, useReadContract } from '@wagmi/vue'\nimport { mainnet, sepolia } from 'wagmi/chains'\n\nconst config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n// ---cut---\nconst result = useReadContract({\n  abi: [\n    {\n      type: 'function',\n      name: 'balanceOf',\n      stateMutability: 'view',\n      inputs: [{ name: 'account', type: 'address' }],\n      outputs: [{ type: 'uint256' }],\n    },\n    {\n      type: 'function',\n      name: 'totalSupply',\n      stateMutability: 'view',\n      inputs: [],\n      outputs: [{ name: 'supply', type: 'uint256' }],\n    },\n  ],\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'balanceOf',\n  // ^?\n\n\n  args: ['0x6b175474e89094c44da98b954eedeac495271d0f'],\n  // ^?\n\n\n\n})\n\nresult.data\n//     ^?\n```\n\n```ts twoslash [Const-Asserted]\n// @twoslash-cache: {\"v\":1,\"hash\":\"b21638ef6d0df571da0457691c07531820bda58a8bf70cddee1ce9852f692ff4\",\"data\":\"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\"}\nimport { createConfig, http, useReadContract } from '@wagmi/vue'\nimport { mainnet, sepolia } from 'wagmi/chains'\n\nconst config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n// ---cut---\nconst abi = [\n  {\n    type: 'function',\n    name: 'balanceOf',\n    stateMutability: 'view',\n    inputs: [{ name: 'account', type: 'address' }],\n    outputs: [{ type: 'uint256' }],\n  },\n  {\n    type: 'function',\n    name: 'totalSupply',\n    stateMutability: 'view',\n    inputs: [],\n    outputs: [{ name: 'supply', type: 'uint256' }],\n  },\n] as const\n\nconst result = useReadContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'balanceOf',\n  // ^?\n\n\n  args: ['0x6b175474e89094c44da98b954eedeac495271d0f'],\n  // ^?\n})\n\nresult.data\n//     ^?\n```\n:::\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`readContract`](/core/api/actions/readContract)\n"
  },
  {
    "path": "site/vue/api/composables/useReconnect.md",
    "content": "---\ntitle: useReconnect\ndescription: Composable for reconnecting connectors.\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\nconst actionName = 'reconnect'\nconst typeName = 'Reconnect'\nconst mutate = 'reconnect'\nconst TData = '{ accounts: readonly [Address, ...Address[]]; chainId: number; connector: Connector }'\nconst TError = 'ReconnectErrorType'\nconst TVariables = '{ connectors?: (CreateConnectorFn | Connector)[] | undefined; }'\n</script>\n\n# useReconnect\n\nComposable for reconnecting [connectors](/core/api/connectors).\n\n## Import\n\n```ts\nimport { useReconnect } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useReconnect } from '@wagmi/vue'\nimport { useEffect } from 'react'\n\nconst reconnect = useReconnect()\n\nreconnect.mutate()\n</script>\n```\n\n:::\n\n::: tip\nWhen [`WagmiPlugin['reconnectOnMount']`](/vue/api/WagmiPlugin#reconnectonmount) is `true`, `reconnect` is called automatically on mount.\n:::\n\n## Parameters\n\n```ts\nimport { type UseReconnectParameters } from '@wagmi/vue'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useReconnect } from '@wagmi/vue'\nimport { config } from './config' // [!code focus]\n\nconst reconnect = useReconnect({\n  config, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseReconnectReturnType } from '@wagmi/vue'\n```\n\n<!--@include: @shared/mutation-result.md-->\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`reconnect`](/core/api/actions/reconnect)\n"
  },
  {
    "path": "site/vue/api/composables/useSendTransaction.md",
    "content": "---\ntitle: useSendTransaction\ndescription: Composable for creating, signing, and sending transactions to networks.\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\nconst actionName = 'sendTransaction'\nconst typeName = 'SendTransaction'\nconst mutate = 'sendTransaction'\nconst TData = 'SendTransactionData'\nconst TError = 'SendTransactionErrorType'\nconst TVariables = 'SendTransactionVariables'\n</script>\n\n# useSendTransaction\n\nComposable for creating, signing, and sending transactions to networks.\n\n## Import\n\n```ts\nimport { useSendTransaction } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useSendTransaction } from '@wagmi/vue'\nimport { parseEther } from 'viem'\n\nconst sendTransaction = useSendTransaction()\n</script>\n\n<template>\n  <button\n    @click=\"sendTransaction.mutate({\n      to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      value: parseEther('0.01')\n    })\"\n  >\n    Send transaction\n  </button>\n</template>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseSendTransactionParameters } from '@wagmi/vue'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useSendTransaction } from '@wagmi/vue'\nimport { config } from './config' // [!code focus]\n\nconst sendTransaction = useSendTransaction({\n  config, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseSendTransactionReturnType } from '@wagmi/vue'\n```\n\n<!--@include: @shared/mutation-result.md-->\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`sendTransaction`](/core/api/actions/sendTransaction)\n"
  },
  {
    "path": "site/vue/api/composables/useSignMessage.md",
    "content": "---\ntitle: useSignMessage\ndescription: Composable for signing messages.\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\nconst actionName = 'signMessage'\nconst typeName = 'SignMessage'\nconst mutate = 'signMessage'\nconst TData = 'SignMessageData'\nconst TError = 'SignMessageErrorType'\nconst TVariables = 'SignMessageVariables'\n</script>\n\n# useSignMessage\n\nComposable for signing messages.\n\n## Import\n\n```ts\nimport { useSignMessage } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useSignMessage } from '@wagmi/vue'\n\nconst signMessage = useSignMessage()\n</script>\n\n<template>\n  <button @click=\"signMessage.mutate({ message: 'hello world' })\">\n    Sign message\n  </button>\n</template>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseSignMessageParameters } from '@wagmi/vue'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useSignMessage } from '@wagmi/vue'\nimport { config } from './config' // [!code focus]\n\nconst signMessage = useSignMessage({\n  config // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseSignMessageReturnType } from '@wagmi/vue'\n```\n\n<!--@include: @shared/mutation-result.md-->\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`signMessage`](/core/api/actions/signMessage)\n"
  },
  {
    "path": "site/vue/api/composables/useSignTransaction.md",
    "content": "---\ntitle: useSignTransaction\ndescription: Composable for creating, and signing transactions to networks.\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\nconst actionName = 'signTransaction'\nconst typeName = 'SignTransaction'\nconst mutate = 'signTransaction'\nconst TData = 'SignTransactionData'\nconst TError = 'SignTransactionErrorType'\nconst TVariables = 'SignTransactionVariables'\n</script>\n\n# useSignTransaction\n\nComposable for signing transactions.\n\n## Import\n\n```ts\nimport { useSignTransaction } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useSignTransaction } from '@wagmi/vue'\nimport { parseEther } from 'viem'\n\nconst signTransaction = useSignTransaction()\n</script>\n\n<template>\n  <button\n    @click=\"signTransaction.mutate({\n      to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      value: parseEther('0.01')\n    })\"\n  >\n    Sign transaction\n  </button>\n</template>\n```\n\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseSignTransactionParameters } from '@wagmi/vue'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useSignTransaction } from '@wagmi/vue'\nimport { config } from './config' // [!code focus]\n\nconst signTransaction = useSignTransaction({\n  config, // [!code focus]\n})\n</script>\n```\n\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseSignTransactionReturnType } from '@wagmi/vue'\n```\n\n<!--@include: @shared/mutation-result.md-->\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`signTransaction`](/core/api/actions/signTransaction)\n"
  },
  {
    "path": "site/vue/api/composables/useSignTypedData.md",
    "content": "---\ntitle: useSignTypedData\ndescription: Composable for signing typed data and calculating an Ethereum-specific EIP-712 signature.\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\nconst actionName = 'signTypedData'\nconst typeName = 'SignTypedData'\nconst mutate = 'signTypedData'\nconst TData = 'SignTypedDataData'\nconst TError = 'SignTypedDataErrorType'\nconst TVariables = 'SignTypedDataVariables'\n</script>\n\n# useSignTypedData\n\nComposable for signing typed data and calculating an Ethereum-specific [EIP-712](https://eips.ethereum.org/EIPS/eip-712) signature.\n\n## Import\n\n```ts\nimport { useSignTypedData } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useSignTypedData } from '@wagmi/vue'\n\nconst signTypedData = useSignTypedData()\n</script>\n\n<template>\n  <button\n    @click=\"signTypedData.mutate({\n      types: {\n        Person: [\n          { name: 'name', type: 'string' },\n          { name: 'wallet', type: 'address' },\n        ],\n        Mail: [\n          { name: 'from', type: 'Person' },\n          { name: 'to', type: 'Person' },\n          { name: 'contents', type: 'string' },\n        ],\n      },\n      primaryType: 'Mail',\n      message: {\n        from: {\n          name: 'Cow',\n          wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n        },\n        to: {\n          name: 'Bob',\n          wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n        },\n        contents: 'Hello, Bob!',\n      },\n    })\"\n  >\n    Sign message\n  </button>\n</template>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseSignTypedDataParameters } from '@wagmi/vue'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useSignTypedData } from '@wagmi/vue'\nimport { config } from './config' // [!code focus]\n\nconst signTypedData = useSignTypedData({\n  config, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseSignTypedDataReturnType } from '@wagmi/vue'\n```\n\n<!--@include: @shared/mutation-result.md-->\n\n## Type Inference\n\nWith [`types`](/core/api/actions/signTypedData#types) setup correctly, TypeScript will infer the correct types for [`domain`](/core/api/actions/signTypedData#domain), [`message`](/core/api/actions/signTypedData#message), and [`primaryType`](/core/api/actions/signTypedData#primarytype). See the Wagmi [TypeScript docs](/vue/typescript) for more information.\n\n::: code-group\n```ts twoslash [Inline]\n// @twoslash-cache: {\"v\":1,\"hash\":\"d347b35c1f3533593f8f8fd4f638678cdbe6746b6703290029ec262c44dffe62\",\"data\":\"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\"}\nimport { useSignTypedData } from '@wagmi/vue'\n// ---cut---\nconst signTypedData = useSignTypedData()\n\nsignTypedData.mutate({\n  types: {\n    Person: [\n      { name: 'name', type: 'string' },\n      { name: 'wallet', type: 'address' },\n    ],\n    Mail: [\n      { name: 'from', type: 'Person' },\n      { name: 'to', type: 'Person' },\n      { name: 'contents', type: 'string' },\n    ],\n  },\n  primaryType: 'Mail',\n  // ^?\n\n\n  message: {\n  // ^?\n\n\n\n\n\n\n\n\n\n\n\n\n    from: {\n      name: 'Cow',\n      wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n    },\n    to: {\n      name: 'Bob',\n      wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n    },\n    contents: 'Hello, Bob!',\n  },\n})\n```\n```ts twoslash [Const-Asserted]\n// @twoslash-cache: {\"v\":1,\"hash\":\"eaf9c3d409bf800893a6c4a9064554dc68fdcaaccc9fdd1dd7d8f8bf1a066ba2\",\"data\":\"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\"}\nimport { useSignTypedData } from '@wagmi/vue'\n// ---cut---\nconst types = {\n  Person: [\n    { name: 'name', type: 'string' },\n    { name: 'wallet', type: 'address' },\n  ],\n  Mail: [\n    { name: 'from', type: 'Person' },\n    { name: 'to', type: 'Person' },\n    { name: 'contents', type: 'string' },\n  ],\n} as const\n\nconst signTypedData = useSignTypedData()\n\nsignTypedData.mutate({\n  types,\n  primaryType: 'Mail',\n  // ^?\n\n\n  message: {\n  // ^?\n\n\n\n\n\n\n\n\n\n\n\n\n    from: {\n      name: 'Cow',\n      wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n    },\n    to: {\n      name: 'Bob',\n      wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n    },\n    contents: 'Hello, Bob!',\n  },\n})\n```\n:::\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`signTypedData`](/core/api/actions/signTypedData)\n"
  },
  {
    "path": "site/vue/api/composables/useSimulateContract.md",
    "content": "---\ntitle: useSimulateContract\ndescription: Composable for simulating/validating a contract interaction.\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\nconst actionName = 'simulateContract'\nconst typeName = 'SimulateContract'\nconst TData = 'SimulateContractReturnType'\nconst TError = 'SimulateContractErrorType'\n</script>\n\n# useSimulateContract\n\nComposable for simulating/validating a contract interaction.\n\n## Import\n\n```ts\nimport { useSimulateContract } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useSimulateContract } from '@wagmi/vue'\nimport { abi } from './abi'\n\nconst result = useSimulateContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n})\n</script>\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n<!-- TODO: Usage for combining with useWriteContract -->\n\n## Parameters\n\n```ts\nimport { type UseSimulateContractParameters } from '@wagmi/vue'\n```\n\n### abi\n\n`Abi | undefined`\n\nThe contract's ABI. Check out the [TypeScript docs](/vue/typescript#const-assert-abis-typed-data) for how to set up ABIs for maximum type inference and safety.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useSimulateContract } from '@wagmi/vue'\nimport { abi } from './abi' // [!code focus]\n\nconst result = useSimulateContract({\n  abi, // [!code focus]\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n})\n</script>\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### accessList\n\n`AccessList | undefined`\n\nThe access list.\n\n::: code-group\n```vue [index.ts]\n<script setup lang=\"ts\">\nimport { useSimulateContract } from '@wagmi/vue'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = useSimulateContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  accessList: [{ // [!code focus]\n    address: '0x1', // [!code focus]\n    storageKeys: ['0x1'], // [!code focus]\n  }], // [!code focus]\n})\n</script>\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### account\n\n`Account | undefined`\n\nAccount to use when calling the contract (`msg.sender`). Throws if account is not found on [`connector`](#connector).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useSimulateContract } from '@wagmi/vue'\nimport { abi } from './abi'\n\nconst result = useSimulateContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  account: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n})\n</script>\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### address\n\n`Address | undefined`\n\nThe contract's address.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useSimulateContract } from '@wagmi/vue'\nimport { abi } from './abi'\n\nconst result = useSimulateContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f', // [!code focus]\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n})\n</script>\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### args\n\n`readonly unknown[] | undefined`\n\n- Arguments to pass when calling the contract.\n- Inferred from [`abi`](#abi) and [`functionName`](#functionname).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useSimulateContract } from '@wagmi/vue'\nimport { abi } from './abi'\n\nconst result = useSimulateContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f', \n  functionName: 'transferFrom',\n  args: [ // [!code focus]\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', // [!code focus]\n    123n, // [!code focus]\n  ], // [!code focus]\n})\n</script>\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n---\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to call contract at.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useSimulateContract } from '@wagmi/vue'\nimport { abi } from './abi'\n\nconst result = useSimulateContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f', \n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  blockNumber: 17829139n, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to call contract at.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useSimulateContract } from '@wagmi/vue'\nimport { abi } from './abi'\n\nconst result = useSimulateContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f', \n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  blockTag: 'safe', // [!code focus]\n})\n</script>\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n---\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useSimulateContract } from '@wagmi/vue'\nimport { mainnet } from 'wagmi/chains' // [!code focus]\nimport { abi } from './abi'\n\nconst result = useSimulateContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f', \n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  chainId: mainnet.id, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useSimulateContract } from '@wagmi/vue'\nimport { abi } from './abi'\nimport { config } from './config' // [!code focus]\n\nconst result = useSimulateContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f', \n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  config, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### connector\n\n`Connector | undefined`\n\n[Connector](/vue/api/connectors) to simulate transaction with.\n\n::: code-group\n```vue [index.ts]\n<script setup lang=\"ts\">\nimport { useConnectorClient, useSimulateContract } from '@wagmi/vue'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst { data: connector } = useConnectorClient()\nconst result = useSimulateContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  connector, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### dataSuffix\n\n`` `0x${string}` | undefined ``\n\nData to append to the end of the calldata. Useful for adding a [\"domain\" tag](https://opensea.notion.site/opensea/Seaport-Order-Attributions-ec2d69bf455041a5baa490941aad307f).\n\n::: code-group\n```vue [index.ts]\n<script setup lang=\"ts\">\nimport { useSimulateContract } from '@wagmi/vue'\nimport { parseGwei } from 'viem'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = useSimulateContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  dataSuffix: '0xdeadbeef', // [!code focus]\n})\n</script>\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### functionName\n\n`string | undefined`\n\n- Function to call on the contract.\n- Inferred from [`abi`](#abi).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useSimulateContract } from '@wagmi/vue'\nimport { abi } from './abi'\n\nconst result = useSimulateContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f', \n  functionName: 'transferFrom', // [!code focus]\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n})\n</script>\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### gas\n\n`bigint | undefined`\n\nGas provided for transaction execution.\n\n::: code-group\n```vue [index.ts]\n<script setup lang=\"ts\">\nimport { useSimulateContract } from '@wagmi/vue'\nimport { parseGwei } from 'viem'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = useSimulateContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  gas: parseGwei('20'), // [!code focus]\n})\n</script>\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n---\n\n### gasPrice\n\n`bigint | undefined`\n\nThe price in wei to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms#legacy-transaction).\n\n::: code-group\n```vue [index.ts]\n<script setup lang=\"ts\">\nimport { useSimulateContract } from '@wagmi/vue'\nimport { parseGwei } from 'viem'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = useSimulateContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  gasPrice: parseGwei('20'), // [!code focus]\n})\n</script>\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### maxFeePerGas\n\n`bigint | undefined`\n\nTotal fee per gas in wei, inclusive of [`maxPriorityFeePerGas`](#maxPriorityFeePerGas). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n```vue [index.ts]\n<script setup lang=\"ts\">\nimport { useSimulateContract } from '@wagmi/vue'\nimport { parseGwei } from 'viem'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = useSimulateContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  maxFeePerGas: parseGwei('20'), // [!code focus]\n})\n</script>\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### maxPriorityFeePerGas\n\n`bigint | undefined`\n\nMax priority fee per gas in wei. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction).\n\n::: code-group\n```vue [index.ts]\n<script setup lang=\"ts\">\nimport { useSimulateContract } from '@wagmi/vue'\nimport { parseGwei } from 'viem'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = useSimulateContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  maxFeePerGas: parseGwei('20'),\n  maxPriorityFeePerGas: parseGwei('2'), // [!code focus]\n})\n</script>\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n---\n\n### nonce\n\n`number`\n\nUnique number identifying this transaction.\n\n::: code-group\n```vue [index.ts]\n<script setup lang=\"ts\">\nimport { useSimulateContract } from '@wagmi/vue'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = useSimulateContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  nonce: 123, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### type\n\n`'legacy' | 'eip1559' | 'eip2930' | undefined`\n\nOptional transaction request type to narrow parameters.\n\n::: code-group\n```vue [index.ts]\n<script setup lang=\"ts\">\nimport { useSimulateContract } from '@wagmi/vue'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = useSimulateContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  type: 'eip1559', // [!code focus]\n})\n</script>\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### value\n\n`bigint | undefined`\n\nValue in wei sent with this transaction.\n\n::: code-group\n```vue [index.ts]\n<script setup lang=\"ts\">\nimport { useSimulateContract } from '@wagmi/vue'\nimport { parseEther } from 'viem'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = useSimulateContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  value: parseEther('0.01'), // [!code focus]\n})\n</script>\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Composables that have identical context will share the same cache.\n\n::: code-group\n```vue [index.ts]\n<script setup lang=\"ts\">\nimport { useSimulateContract } from '@wagmi/vue'\nimport { abi } from './abi'\nimport { config } from './config'\n\nconst result = useSimulateContract({\n  abi,\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  functionName: 'transferFrom',\n  args: [\n    '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n    '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n    123n,\n  ],\n  scopeKey: 'foo', // [!code focus]\n})\n</script>\n```\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseSimulateContractReturnType } from '@wagmi/vue'\n```\n\nThe return type's [`data`](#data) property is inferrable via the combination of [`abi`](#abi), [`functionName`](#functionname), and [`args`](#args). Check out the [TypeScript docs](/vue/typescript#const-assert-abis-typed-data) for more info.\n\n<!--@include: @shared/query-result.md-->\n\n## Type Inference\n\nWith [`abi`](#abi) setup correctly, TypeScript will infer the correct types for [`functionName`](#functionname), [`args`](#args), and [`value`](#value). See the Wagmi [TypeScript docs](/vue/typescript) for more information.\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`simulateContract`](/core/api/actions/simulateContract)\n"
  },
  {
    "path": "site/vue/api/composables/useSwitchChain.md",
    "content": "---\ntitle: useSwitchChain\ndescription: Composable for switching the target chain for a connector or the Wagmi `Config`.\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\nconst actionName = 'switchChain'\nconst typeName = 'SwitchChain'\nconst mutate = 'switchChain'\nconst TData = 'SwitchChainData'\nconst TError = 'SwitchChainErrorType'\nconst TVariables = 'SwitchChainVariables'\n</script>\n\n# useSwitchChain\n\nComposable for switching the target chain for a connector or the Wagmi [`Config`](/vue/api/createConfig#config).\n\n## Import\n\n```ts\nimport { useSwitchChain } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useChains, useSwitchChain } from '@wagmi/vue'\n\nconst switchChain = useSwitchChain()\nconst chains = useSwitchChains()\n</script>\n\n<template>\n  <div>\n    <button \n      v-for=\"chain in chains\" \n      :key=\"chain.id\" \n      @click=\"switchChain.mutate({ chainId: chain.id })\"\n    >\n      {{ chain.name }}\n    </button>\n  </div>\n</template>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n::: tip\nWhen connected, `switchChain` will switch the target chain for the connector. When not connected, `switchChain` will switch the target chain for the Wagmi [`Config`](/vue/api/createConfig#config).\n:::\n\n## Parameters\n\n```ts\nimport { type UseSwitchChainParameters } from '@wagmi/vue'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useSwitchChain } from '@wagmi/vue'\nimport { config } from './config' // [!code focus]\n\nconst switchChain = useSwitchChain({\n  config, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseSwitchChainReturnType } from '@wagmi/vue'\n```\n\n<!--@include: @shared/mutation-result.md-->\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`switchChain`](/core/api/actions/switchChain)\n"
  },
  {
    "path": "site/vue/api/composables/useSwitchConnection.md",
    "content": "---\ntitle: useSwitchConnection\ndescription: Composable for switching the current connection.\n---\n\n<script setup>\nconst packageName = 'wagmi'\nconst actionName = 'switchConnection'\nconst typeName = 'SwitchConnection'\nconst mutate = 'switchConnection'\nconst TData = 'SwitchConnectionData'\nconst TError = 'SwitchConnectionErrorType'\nconst TVariables = 'SwitchConnectionVariables'\n</script>\n\n# useSwitchConnection\n\nComposable for switching the current connection.\n\n## Import\n\n```ts\nimport { useSwitchConnection } from 'wagmi'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useConnections, useSwitchConnection } from 'wagmi'\n\nconst switchConnection = useSwitchConnection()\nconst connections = useConnections()\n</script>\n\n<template>\n  <div>\n    <button \n      v-for=\"connection in connections\" \n      :key=\"connection.id\" \n      @click=\"switchConnection.mutate({ connector: connection.connector })\"\n    >\n      {{ connection.connector.name }}\n    </button>\n  </div>\n</template>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseSwitchConnectionParameters } from 'wagmi'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useSwitchConnection } from 'wagmi'\nimport { config } from './config' // [!code focus]\n\nconst switchConnection = useSwitchConnection({\n  config, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseSwitchConnectionReturnType } from 'wagmi'\n```\n\n<!--@include: @shared/mutation-result.md-->\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`switchConnection`](/core/api/actions/switchConnection)\n"
  },
  {
    "path": "site/vue/api/composables/useTransaction.md",
    "content": "---\ntitle: useTransaction\ndescription: Composable for fetching transactions given hashes or block identifiers.\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\nconst actionName = 'getTransaction'\nconst typeName = 'GetTransaction'\nconst TData = 'GetTransactionData'\nconst TError = 'GetTransactionErrorType'\n</script>\n\n# useTransaction\n\nComposable for fetching transactions given hashes or block identifiers.\n\n## Import\n\n```ts\nimport { useTransaction } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useTransaction } from '@wagmi/vue'\n\nconst result = useTransaction({\n  hash: '0x0fa64daeae54e207aa98613e308c2ba8abfe274f75507e741508cc4db82c8cb5',\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseTransactionParameters } from '@wagmi/vue'\n```\n\n---\n\n### blockHash\n\n`bigint | undefined`\n\nBlock hash to get transaction at (with [`index`](#index)).\n\n```vue\n<script setup lang=\"ts\">\nimport { useTransaction } from '@wagmi/vue'\n\nconst result = useTransaction({\n  blockHash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', // [!code focus]\n  index: 0,\n})\n</script>\n```\n\n### blockNumber\n\n`bigint | undefined`\n\nBlock number to get transaction at (with [`index`](#index)).\n\n```vue\n<script setup lang=\"ts\">\nimport { useTransaction } from '@wagmi/vue'\n\nconst result = useTransaction({\n  blockNumber: 17829139n, // [!code focus]\n  index: 0,\n})\n</script>\n```\n\n### blockTag\n\n`'latest' | 'earliest' | 'pending' | 'safe' | 'finalized' | undefined`\n\nBlock tag to get transaction at (with [`index`](#index)).\n\n```vue\n<script setup lang=\"ts\">\nimport { useTransaction } from '@wagmi/vue'\n\nconst result = useTransaction({\n  blockTag: 'safe', // [!code focus]\n  index: 0,\n})\n</script>\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n```vue\n<script setup lang=\"ts\">\nimport { useTransaction } from '@wagmi/vue'\nimport { mainnet } from 'wagmi/chains'\n\nconst result = useTransaction({\n  chainId: mainnet.id, // [!code focus]\n  hash: '0x0fa64daeae54e207aa98613e308c2ba8abfe274f75507e741508cc4db82c8cb5',\n})\n</script>\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useTransaction } from '@wagmi/vue'\nimport { config } from './config' // [!code focus]\n\nconst result = useTransaction({\n  hash: '0x0fa64daeae54e207aa98613e308c2ba8abfe274f75507e741508cc4db82c8cb5',\n  config, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### hash\n\n`` `0x${string}` | undefined ``\n\nHash to get transaction. [`enabled`](#enabled) set to `false` if `hash` and [`index`](#index) are `undefined`.\n\n```vue\n<script setup lang=\"ts\">\nimport { useTransaction } from '@wagmi/vue'\n\nconst result = useTransaction({\n  hash: '0x0fa64daeae54e207aa98613e308c2ba8abfe274f75507e741508cc4db82c8cb5', // [!code focus]\n})\n</script>\n```\n\n### index\n\n`number | undefined`\n\nAn index to be used with a block identifier ([hash](#blockhash), [number](#blocknumber), or [tag](#blocktag)). [`enabled`](#enabled) set to `false` if `index` and [`hash`](#hash) are `undefined`.\n\n```vue\n<script setup lang=\"ts\">\nimport { useTransaction } from '@wagmi/vue'\n\nconst result = useTransaction({\n  blockTag: 'safe',\n  index: 0  // [!code focus]\n})\n</script>\n```\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseTransactionReturnType } from '@wagmi/vue'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getTransaction`](/core/api/actions/getTransaction)\n"
  },
  {
    "path": "site/vue/api/composables/useTransactionReceipt.md",
    "content": "---\ntitle: useTransactionReceipt\ndescription: Composable for return the Transaction Receipt given a Transaction hash.\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\nconst actionName = 'getTransactionReceipt'\nconst typeName = 'GetTransactionReceipt'\nconst TData = 'GetTransactionReceiptData'\nconst TError = 'GetTransactionReceiptErrorType'\n</script>\n\n# useTransactionReceipt\n\nComposable for return the [Transaction Receipt](https://viem.sh/docs/glossary/terms#transaction-receipt) given a [Transaction](https://viem.sh/docs/glossary/terms#transaction) hash.\n\n## Import\n\n```ts\nimport { useTransactionReceipt } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useTransactionReceipt } from '@wagmi/vue'\n\nconst result = useTransactionReceipt({\n  hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseTransactionReceiptParameters } from '@wagmi/vue'\n```\n\n### hash\n\n`` `0x${string}` | undefined ``\n\nA transaction hash.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useTransactionReceipt } from '@wagmi/vue'\n\nconst result = useTransactionReceipt({\n  hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nThe ID of chain to return the transaction receipt from.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useTransactionReceipt } from '@wagmi/vue'\nimport { mainnet } from 'wagmi/chains'\n\nconst result = useTransactionReceipt({\n  chainId: mainnet.id, // [!code focus]\n  hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useTransactionReceipt } from '@wagmi/vue'\nimport { config } from './config' // [!code focus]\n\nconst result = useTransactionReceipt({\n  config, // [!code focus]\n  hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### scopeKey\n\n`string | undefined`\n\nScopes the cache to a given context. Composables that have identical context will share the same cache.\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useTransactionReceipt } from '@wagmi/vue'\nimport { config } from './config'\n\nconst result = useTransactionReceipt({\n  scopeKey: 'foo' // [!code focus]\n  hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseTransactionReceiptReturnType } from '@wagmi/vue'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`getTransactionReceipt`](/core/api/actions/getTransactionReceipt)\n"
  },
  {
    "path": "site/vue/api/composables/useWaitForTransactionReceipt.md",
    "content": "---\ntitle: useWaitForTransactionReceipt\ndescription: Composable that waits for the transaction to be included on a block, and then returns the transaction receipt. If the transaction reverts, then the action will throw an error. Replacement detection (e.g. sped up transactions) is also supported.\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\nconst actionName = 'waitForTransactionReceipt'\nconst typeName = 'WaitForTransactionReceipt'\nconst TData = 'WaitForTransactionReceiptData'\nconst TError = 'WaitForTransactionReceiptErrorType'\n</script>\n\n# useWaitForTransactionReceipt\n\nComposable that waits for the transaction to be included on a block, and then returns the transaction receipt. If the transaction reverts, then the action will throw an error. Replacement detection (e.g. sped up transactions) is also supported.\n\n## Import\n\n```ts\nimport { useWaitForTransactionReceipt } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useWaitForTransactionReceipt } from '@wagmi/vue'\n\nconst result = useWaitForTransactionReceipt({\n  hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type WaitForTransactionReceiptParameters } from '@wagmi/core'\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useWaitForTransactionReceipt } from '@wagmi/vue'\nimport { mainnet } from '@wagmi/vue/chains'\n\nconst result = useWaitForTransactionReceipt({\n  chainId: mainnet.id, // [!code focus]\n  hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n})\n</script>\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useWaitForTransactionReceipt } from '@wagmi/vue'\nimport { config } from './config' // [!code focus]\n\nconst result = useWaitForTransactionReceipt({\n  hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n  config, // [!code focus]\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n### confirmations\n\n`number | undefined`\n\nThe number of confirmations (blocks that have passed) to wait before resolving.\n\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useWaitForTransactionReceipt } from '@wagmi/vue'\n\nconst result = useWaitForTransactionReceipt({\n  confirmations: 2, // [!code focus]\n  hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n})\n</script>\n```\n\n### onReplaced\n\n`\n(({ reason: 'replaced' | 'repriced' | 'cancelled'; replacedTransaction: Transaction; transaction: Transaction; transactionReceipt: TransactionReceipt }) => void) | undefined\n`\n\nOptional callback to emit if the transaction has been replaced.\n\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useWaitForTransactionReceipt } from '@wagmi/vue'\n\nconst result = useWaitForTransactionReceipt({\n  hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n  onReplaced: replacement => console.log(replacement), // [!code focus]\n})\n</script>\n```\n\n### pollingInterval\n\n`number | undefined`\n\n- Polling frequency (in milliseconds).\n- Defaults to the [Config's `pollingInterval` config](/vue/api/createConfig#pollinginterval).\n\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useWaitForTransactionReceipt } from '@wagmi/vue'\n\nconst result = useWaitForTransactionReceipt({\n  hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n  pollingInterval: 1_000, // [!code focus]\n})\n</script>\n```\n\n### hash\n\n`` `0x${string}` | undefined ``\n\nThe transaction hash to wait for. [`enabled`](#enabled) set to `false` if `hash` is `undefined`.\n\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useWaitForTransactionReceipt } from '@wagmi/vue'\n\nconst result = useWaitForTransactionReceipt({\n  hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d', // [!code focus]\n})\n</script>\n```\n\n<!--@include: @shared/query-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseWaitForTransactionReceiptReturnType } from '@wagmi/vue'\n```\n\n<!--@include: @shared/query-result.md-->\n\n<!--@include: @shared/query-imports.md-->\n\n## Action\n\n- [`waitForTransactionReceipt`](/core/api/actions/waitForTransactionReceipt)\n"
  },
  {
    "path": "site/vue/api/composables/useWatchBlockNumber.md",
    "content": "# useWatchBlockNumber\n\nComposable that watches for block number changes.\n\n## Import\n\n```ts\nimport { useWatchBlockNumber } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```ts [index.vue]\n<script setup lang=\"ts\">\nimport { useWatchBlockNumber } from '@wagmi/vue'\n\nuseWatchBlockNumber({\n  onBlockNumber(blockNumber) {\n    console.log('Block number changed!', blockNumber)\n  },\n})\n</script>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseWatchBlockNumberParameters } from '@wagmi/vue'\n```\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to watch blocks at.\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n### emitMissed\n\n`boolean`\n\nWhether or not to emit missed blocks to the callback. Defaults to `false`.\n\nMissed blocks may occur in instances where internet connection is lost, or the block time is lesser than the polling interval of the client.\n\n### emitOnBegin\n\n`boolean`\n\nWhether or not to emit the block to the callback when the subscription opens. Defaults to `false`.\n\n### enabled\n\n`boolean`\n\nWhether or not to watch for blocks. Defaults to `true`.\n\n### onBlockNumber\n\n`(block: Block, prevblock: Block | undefined) => void`\n\nCallback for when block changes.\n\n### onError\n\n`((error: Error) => void) | undefined`\n\nError thrown from getting the block.\n\n### poll\n\n`boolean | undefined`\n\n- Whether or not to use a polling mechanism to check for new blocks instead of a WebSocket subscription.\n- Defaults to `false` for WebSocket Clients, and `true` for non-WebSocket Clients.\n\n### pollingInterval\n\n`number | undefined`\n\n- Polling frequency (in milliseconds).\n- Defaults to the [Config's `pollingInterval` config](/core/api/createConfig#pollinginterval).\n\n### syncConnectedChain\n\n`boolean | undefined`\n\n- Set up subscriber for connected chain changes.\n- Defaults to [`Config['syncConnectedChain']`](/core/api/createConfig#syncconnectedchain).\n\n## Return Type\n\n```ts\nimport { type UseWatchBlockNumberReturnType } from '@wagmi/vue'\n```\n\nFunction for cleaning up watcher.\n\n## Action\n\n- [`watchBlockNumber`](/core/api/actions/watchBlockNumber)\n"
  },
  {
    "path": "site/vue/api/composables/useWatchContractEvent.md",
    "content": "# useWatchContractEvent\n\nComposable that watches and returns emitted contract event logs.\n\n## Import\n\n```ts\nimport { useWatchContractEvent } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n```ts [index.vue]\n<script setup lang=\"ts\">\nimport { useWatchContractEvent } from '@wagmi/vue'\nimport { abi } from './abi'\n\nuseWatchContractEvent({\n  address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n  abi,\n  eventName: 'Transfer',\n  onLogs(logs) {\n    console.log('New logs!', logs)\n  },\n})\n</script>\n```\n<<< @/snippets/abi-event.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Parameters\n\n```ts\nimport { type UseWatchContractEventParameters } from '@wagmi/vue'\n```\n\n### abi\n\n`Abi`\n\nThe contract's ABI. Check out the [TypeScript docs](/vue/typescript#const-assert-abis-typed-data) for how to set up ABIs for maximum type inference and safety.\n\n### address\n\n`Address | undefined`\n\nThe contract's address.\n\n### args\n\n`object | readonly unknown[] | undefined`\n\n- Arguments to pass when calling the contract.\n- Inferred from [`abi`](#abi) and [`eventName`](#eventname).\n\n### batch\n\n`boolean | undefined`\n\n- Whether or not the events should be batched on each invocation.\n- Defaults to `true`.\n\n### chainId\n\n`config['chains'][number]['id'] | undefined`\n\nID of chain to use when fetching data.\n\n### config\n\n`Config | undefined`\n\n[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider).\n\n### eventName\n\n`string`\n\n- Event to listen for the contract.\n- Inferred from [`abi`](#abi).\n\n### onError\n\n`((error: Error) => void) | undefined`\n\nError thrown from getting the block number.\n\n### onLogs\n\n`(logs: Log[], prevLogs: Log[] | undefined) => void`\n\nCallback for when logs changes.\n\n### poll\n\n`boolean | undefined`\n\n- Whether or not to use a polling mechanism to check for new blocks instead of a WebSocket subscription.\n- Defaults to `false` for WebSocket Clients, and `true` for non-WebSocket Clients.\n\n### pollingInterval\n\n`number | undefined`\n\n- Polling frequency (in milliseconds).\n- Defaults to the [Config's `pollingInterval` config](/core/api/createConfig#pollinginterval).\n\n### strict\n\n`boolean | undefined`\n\n- Defaults to `false`.\n\n### syncConnectedChain\n\n`boolean | undefined`\n\n- Set up subscriber for connected chain changes.\n- Defaults to [`Config['syncConnectedChain']`](/core/api/createConfig#syncconnectedchain).\n\n## Return Type\n\n```ts\nimport { type UseWatchContractEventReturnType } from '@wagmi/vue'\n```\n\nHook returns `void`\n\n## Action\n\n- [`watchContractEvent`](/core/api/actions/watchContractEvent)\n\n"
  },
  {
    "path": "site/vue/api/composables/useWriteContract.md",
    "content": "---\ntitle: useWriteContract\ndescription: Composable for executing a write function on a contract.\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\nconst actionName = 'writeContract'\nconst typeName = 'WriteContract'\nconst mutate = 'writeContract'\nconst TData = 'WriteContractReturnType'\nconst TError = 'WriteContractErrorType'\nconst TVariables = 'WriteContractVariables'\n</script>\n\n# useWriteContract\n\nComposable for executing a write function on a contract.\n\nA \"write\" function on a Solidity contract modifies the state of the blockchain. These types of functions require gas to be executed, hence a transaction is broadcasted in order to change the state.\n\n## Import\n\n```ts\nimport { useWriteContract } from '@wagmi/vue'\n```\n\n## Usage\n\n::: code-group\n\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useWriteContract } from '@wagmi/vue'\nimport { abi } from './abi'\n\nconst writeContract = useWriteContract()\n</script>\n\n<template>\n  <button @click=\"writeContract.mutate({ \n    abi,\n    address: '0x6b175474e89094c44da98b954eedeac495271d0f',\n    functionName: 'transferFrom',\n    args: [\n      '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n      '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n      123n,\n    ],\n  })\">\n    Transfer\n  </button>\n</template>\n```\n\n<<< @/snippets/abi-write.ts[abi.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n<!-- TODO: Usage for simulating before -->\n\n<!-- TODO: Usage for estimating gas before -->\n\n## Parameters\n\n```ts\nimport { type UseWriteContractParameters } from '@wagmi/vue'\n```\n\n### config\n\n`Config | undefined`\n\n[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the [`WagmiPlugin`](/vue/api/WagmiPlugin).\n\n::: code-group\n\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useWriteContract } from '@wagmi/vue'\nimport { config } from './config' // [!code focus]\n\nconst writeContract = useWriteContract({\n  config, // [!code focus]\n})\n</script>\n```\n\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n<!--@include: @shared/mutation-options.md-->\n\n## Return Type\n\n```ts\nimport { type UseWriteContractReturnType } from '@wagmi/vue'\n```\n\nThe return type's [`data`](#data) property is inferrable via the combination of [`abi`](#abi), [`functionName`](#functionname), and [`args`](#args). Check out the [TypeScript docs](/vue/typescript#const-assert-abis-typed-data) for more info.\n\n<!--@include: @shared/mutation-result.md-->\n\n## Type Inference\n\nWith [`abi`](/core/api/actions/writeContract#abi) setup correctly, TypeScript will infer the correct types for [`functionName`](/core/api/actions/writeContract#functionname), [`args`](/core/api/actions/writeContract#args), and the [`value`](/core/api/actions/writeContract##value). See the Wagmi [TypeScript docs](/vue/typescript) for more information.\n\n<!--@include: @shared/mutation-imports.md-->\n\n## Action\n\n- [`writeContract`](/core/api/actions/writeContract)\n"
  },
  {
    "path": "site/vue/api/composables.md",
    "content": "<script setup>\nimport { getSidebar } from '../../.vitepress/sidebar'\n\nconst composables = getSidebar()['/vue']\n  .find(x => x.text === 'Composables').items\n  .sort((a, b) => a.text.localeCompare(b.text))\n</script>\n\n# Composables\n\nVue Composables for accounts, wallets, contracts, transactions, signing, ENS, and more.\n\n## Import\n\n```ts\nimport { useConnection } from '@wagmi/vue'\n```\n\n## Available Composables\n\n<ul>\n  <li v-for=\"composable of composables\">\n    <a :href=\"composable.link\">{{ composable.text }}</a>\n  </li>\n</ul>\n"
  },
  {
    "path": "site/vue/api/connectors/baseAccount.md",
    "content": "---\ntitle: baseAccount\n---\n\n<script setup>\nimport PackageMetadata from '../../../components/PackageMetadata.vue'\nimport packageJson from '../../../../packages/connectors/package.json'\n\nconst packageName = '@wagmi/vue'\nconst connectorsPackageName = '@wagmi/vue/connectors'\nconst connectorDependencyVersion = packageJson.peerDependencies['@base-org/account']\n</script>\n\n<!-- @include: @shared/connectors/baseAccount.md -->\n"
  },
  {
    "path": "site/vue/api/connectors/coinbaseWallet.md",
    "content": "<script setup>\nimport PackageMetadata from '../../../components/PackageMetadata.vue'\nimport packageJson from '../../../../packages/connectors/package.json'\n\nconst packageName = '@wagmi/vue'\nconst connectorsPackageName = '@wagmi/vue/connectors'\nconst connectorDependencyVersion = packageJson.peerDependencies['@coinbase/wallet-sdk']\n</script>\n\n<!-- @include: @shared/connectors/coinbaseWallet.md -->\n"
  },
  {
    "path": "site/vue/api/connectors/injected.md",
    "content": "---\ntitle: injected\n---\n\n<script setup>\nconst docsPath = 'vue'\nconst packageName = '@wagmi/vue'\nconst connectorsPackageName = '@wagmi/vue/connectors'\n</script>\n\n<!-- @include: @shared/connectors/injected.md -->\n"
  },
  {
    "path": "site/vue/api/connectors/metaMask.md",
    "content": "---\ntitle: metaMask\n---\n\n<script setup>\nimport PackageMetadata from '../../../components/PackageMetadata.vue'\nimport packageJson from '../../../../packages/connectors/package.json'\n\nconst docsPath = 'vue'\nconst packageName = '@wagmi/vue'\nconst connectorsPackageName = '@wagmi/vue/connectors'\nconst connectorDependencyVersion = packageJson.peerDependencies['@metamask/connect-evm']\n</script>\n\n<!-- @include: @shared/connectors/metaMask.md -->\n"
  },
  {
    "path": "site/vue/api/connectors/mock.md",
    "content": "---\ntitle: mock\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\nconst connectorsPackageName = '@wagmi/vue/connectors'\n</script>\n\n<!-- @include: @shared/connectors/mock.md -->\n"
  },
  {
    "path": "site/vue/api/connectors/porto.md",
    "content": "---\ntitle: porto\n---\n\n<script setup>\nimport PackageMetadata from '../../../components/PackageMetadata.vue'\nimport packageJson from '../../../../packages/connectors/package.json'\n\nconst packageName = '@wagmi/vue'\nconst connectorsPackageName = '@wagmi/vue/connectors'\nconst connectorDependencyVersion = packageJson.peerDependencies['porto']\n</script>\n\n<!-- @include: @shared/connectors/porto.md -->\n"
  },
  {
    "path": "site/vue/api/connectors/safe.md",
    "content": "---\ntitle: safe\n---\n\n<script setup>\nimport PackageMetadata from '../../../components/PackageMetadata.vue'\nimport packageJson from '../../../../packages/connectors/package.json'\n\nconst packageName = '@wagmi/vue'\nconst connectorsPackageName = '@wagmi/vue/connectors'\nconst connectorDependencyVersions = [\n  packageJson.peerDependencies['@safe-global/safe-apps-provider'],\n  packageJson.peerDependencies['@safe-global/safe-apps-sdk'],\n]\n</script>\n\n<!-- @include: @shared/connectors/safe.md -->\n"
  },
  {
    "path": "site/vue/api/connectors/walletConnect.md",
    "content": "---\ntitle: walletConnect\n---\n\n<script setup>\nimport PackageMetadata from '../../../components/PackageMetadata.vue'\nimport packageJson from '../../../../packages/connectors/package.json'\n\nconst packageName = '@wagmi/vue'\nconst connectorsPackageName = '@wagmi/vue/connectors'\nconst connectorDependencyVersion = packageJson.peerDependencies['@walletconnect/ethereum-provider']\n</script>\n\n<!-- @include: @shared/connectors/walletConnect.md -->\n"
  },
  {
    "path": "site/vue/api/connectors.md",
    "content": "<script setup>\nimport { getSidebar } from '../../.vitepress/sidebar'\n\nconst connectors = getSidebar()['/react']\n  .find(x => x.text.includes('Configuration')).items\n  .find(x => x.text.includes('Connectors')).items\n  .sort((a, b) => a.text.localeCompare(b.text))\n</script>\n\n# Connectors\n\nConnectors for popular wallet providers and protocols.\n\n## Import\n\nImport via the `'@wagmi/vue/connectors'` entrypoint.\n\n```ts\nimport { injected } from '@wagmi/vue/connectors'\n```\n\n## Available Connectors\n\n::: tip\nSome connectors require third-party packages. See the \"Install\" section on each connector's page for more info on license, version, and more.\n:::\n\n<ul>\n  <li v-for=\"connector of connectors\">\n    <a :href=\"connector.link\">{{ connector.text }}</a>\n  </li>\n</ul>\n"
  },
  {
    "path": "site/vue/api/createConfig.md",
    "content": "---\ntitle: createConfig\n---\n\n<script setup>\nconst docsPath = 'vue'\nconst packageName = '@wagmi/vue'\nconst connectorsPackageName = '@wagmi/vue/connectors'\n</script>\n\n<!--@include: @shared/createConfig.md-->\n"
  },
  {
    "path": "site/vue/api/createStorage.md",
    "content": "---\ntitle: createStorage\n---\n\n<script setup>\nconst docsPath = \"vue\"\nconst packageName = '@wagmi/vue'\n</script>\n\n<!--@include: @shared/createStorage.md-->\n"
  },
  {
    "path": "site/vue/api/errors.md",
    "content": "<script setup>\nconst docsPath = \"vue\"\nconst packageName = '@wagmi/vue'\n</script>\n\n# Errors\n\nError classes used by Wagmi.\n\n<!--@include: @shared/errors.md-->"
  },
  {
    "path": "site/vue/api/transports/custom.md",
    "content": "---\ntitle: custom\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\n</script>\n\n<!-- @include: @shared/transports/custom.md -->\n"
  },
  {
    "path": "site/vue/api/transports/fallback.md",
    "content": "---\ntitle: fallback\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\n</script>\n\n<!-- @include: @shared/transports/fallback.md -->\n"
  },
  {
    "path": "site/vue/api/transports/http.md",
    "content": "---\ntitle: http\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\n</script>\n\n<!-- @include: @shared/transports/http.md -->\n"
  },
  {
    "path": "site/vue/api/transports/unstable_connector.md",
    "content": "---\ntitle: unstable_connector\n---\n\n<script setup>\nconst docsPath = 'vue'\nconst packageName = '@wagmi/vue'\n</script>\n\n<!-- @include: @shared/transports/unstable_connector.md -->\n"
  },
  {
    "path": "site/vue/api/transports/webSocket.md",
    "content": "---\ntitle: webSocket\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\n</script>\n\n<!-- @include: @shared/transports/webSocket.md -->\n"
  },
  {
    "path": "site/vue/api/transports.md",
    "content": "<script setup>\nimport { getSidebar } from '../../.vitepress/sidebar'\n\nconst transports = getSidebar()['/core']\n  .find(x => x.text.includes('Configuration')).items\n  .find(x => x.text.includes('Transports')).items\n  .sort((a, b) => a.text.localeCompare(b.text))\n</script>\n\n# Transports\n\n[`createConfig`](/vue/api/createConfig) can be instantiated with a set of Transports for each chain. A Transport is the intermediary layer that is responsible for executing outgoing JSON-RPC requests to the RPC Provider (e.g. Alchemy, Infura, etc).\n\n## Import\n\n```ts\nimport { http } from '@wagmi/vue'\n```\n\n## Built-In Transports\n\nAvailable via the `'@wagmi/vue'` entrypoint.\n\n<ul>\n  <li v-for=\"transport of transports\">\n    <a :href=\"transport.link\">{{ transport.text }}</a>\n  </li>\n</ul>\n"
  },
  {
    "path": "site/vue/api/utilities/deserialize.md",
    "content": "---\ntitle: deserialize\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\n</script>\n\n<!--@include: @shared/utilities/deserialize.md-->\n"
  },
  {
    "path": "site/vue/api/utilities/serialize.md",
    "content": "---\ntitle: serialize\n---\n\n<script setup>\nconst packageName = '@wagmi/vue'\n</script>\n\n<!--@include: @shared/utilities/serialize.md-->\n"
  },
  {
    "path": "site/vue/getting-started.md",
    "content": "<script setup>\nimport packageJson from '../../packages/vue/package.json'\n\nconst viemVersion = packageJson.peerDependencies.viem\n</script>\n\n# Getting Started\n\n## Overview\n\nWagmi is a collection of Vue composition utilities for Ethereum. You can learn more about the rationale behind the project in the [Why Wagmi](/vue/why) section.\n\n## Automatic Installation\n\nFor new projects, it is recommended to set up your Wagmi app using the [`create-wagmi`](/cli/create-wagmi) command line interface (CLI). This will create a new Wagmi project using TypeScript and install the required dependencies.\n\n::: code-group\n```bash [pnpm]\npnpm create wagmi\n```\n\n```bash [npm]\nnpm create wagmi@latest\n```\n\n```bash [yarn]\nyarn create wagmi\n```\n\n```bash [bun]\nbun create wagmi\n```\n:::\n\nOnce the command runs, you'll see some prompts to complete.\n\n```ansi\nProject name: wagmi-project\nSelect a framework: Vue / Vanilla\n...\n```\n\nAfter the prompts, `create-wagmi` will create a directory with your project name and install the required dependencies. Check out the `README.md` for further instructions (if required).\n\n## Manual Installation\n\nTo manually add Wagmi to your project, install the required packages.\n\n::: code-group\n```bash-vue [pnpm]\npnpm add @wagmi/vue viem@{{viemVersion}} @tanstack/vue-query\n```\n\n```bash-vue [npm]\nnpm install @wagmi/vue viem@{{viemVersion}} @tanstack/vue-query\n```\n\n```bash-vue [yarn]\nyarn add @wagmi/vue viem@{{viemVersion}} @tanstack/vue-query\n```\n\n```bash-vue [bun]\nbun add @wagmi/vue viem@{{viemVersion}} @tanstack/vue-query\n```\n:::\n\n- [Viem](https://viem.sh) is a TypeScript interface for Ethereum that performs blockchain operations.\n- [TanStack Query](https://tanstack.com/query/v5) is an async state manager that handles requests, caching, and more.\n- [TypeScript](/vue/typescript) is optional, but highly recommended. Learn more about [TypeScript support](/vue/typescript).\n\n### Create Config\n\nCreate and export a new Wagmi config using `createConfig`.\n\n::: code-group\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\nIn this example, Wagmi is configured to use the Mainnet and Sepolia chains, and `injected` connector. Check out the [`createConfig` docs](/vue/api/createConfig) for more configuration options.\n\n::: details TypeScript Tip\nIf you are using TypeScript, you can \"register\" the Wagmi config or use the hook `config` property to get strong type-safety in places that wouldn't normally have type info.\n\n::: code-group\n```ts twoslash [register config]\n// @twoslash-cache: {\"v\":1,\"hash\":\"a23946e4e600232f2356272aa1638ad6dfa3cb14a3230c917234b4d331429652\",\"data\":\"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\"}\n// @errors: 2322\nimport { type Config } from '@wagmi/vue'\nimport { mainnet, sepolia } from '@wagmi/vue/chains'\n\ndeclare const config: Config<readonly [typeof mainnet, typeof sepolia]>\n// ---cut---\nimport { useBlockNumber } from '@wagmi/vue'\n\nuseBlockNumber({ chainId: 123 })\n\ndeclare module '@wagmi/vue' {\n  interface Register {\n    config: typeof config\n  }\n}\n```\n\n```ts twoslash [hook config property]\n// @twoslash-cache: {\"v\":1,\"hash\":\"b0daf106bbcd51604a04f61b444559e5b4612f840caeff27571cf1d2939b54a2\",\"data\":\"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\"}\n// @errors: 2322\nimport { type Config } from '@wagmi/vue'\nimport { mainnet, sepolia } from '@wagmi/vue/chains'\n\ndeclare const config: Config<readonly [typeof mainnet, typeof sepolia]>\n// ---cut---\nimport { useBlockNumber } from '@wagmi/vue'\n\nuseBlockNumber({ chainId: 123, config })\n```\n\nBy registering or using the hook `config` property, `useBlockNumber`'s `chainId` is strongly typed to only allow Mainnet and Sepolia IDs. Learn more by reading the [TypeScript docs](/vue/typescript#config-types).\n:::\n\n### Add Plugin to App\n\nAdd the `WagmiPlugin` to your app instance and pass the `config` you created earlier to the plugin options.\n\n::: code-group\n```tsx [main.ts]\nimport { WagmiPlugin } from '@wagmi/vue' // [!code focus]\nimport { createApp } from 'vue'\nimport { config } from './config' // [!code focus]\nimport App from './App.vue'\n\ncreateApp(App)\n  .use(WagmiPlugin, { config }) // [!code focus]\n  .mount('#app')\n```\n```vue [App.vue]\n<template>\n</template>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\nCheck out the [`WagmiPlugin` docs](/vue/api/WagmiPlugin) to learn more about the plugin API.\n\n### Setup TanStack Query\n\nAfter the `WagmiPlugin`, attach the `VueQueryPlugin` to your app, and pass a new `QueryClient` instance to the `queryClient` property.\n\n::: code-group\n```tsx [main.ts]\nimport { QueryClient, VueQueryPlugin } from '@tanstack/vue-query' // [!code focus]\nimport { WagmiPlugin } from '@wagmi/vue'\nimport { createApp } from 'vue'\nimport { config } from './config'\nimport App from './App.vue'\n\nconst queryClient = new QueryClient() // [!code focus]\n\ncreateApp(App)\n  .use(WagmiPlugin, { config })\n  .use(VueQueryPlugin, { queryClient }) // [!code focus]\n  .mount('#app')\n```\n```vue [App.vue]\n<template>\n</template>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\nCheck out the [TanStack Query docs](https://tanstack.com/query/latest/docs/framework/vue/overview) to learn about the library, APIs, and more.\n\n### Use Wagmi\n\nNow that everything is set up, every component inside your app can use Wagmi Vue Composables.\n\n::: code-group\n```vue [App.vue]\n<script setup lang=\"ts\">\nimport { useConnection, useEnsName } from '@wagmi/vue'\n\nconst { address } = useConnection()\nconst { data, error, status } = useEnsName({ address })\n</script>\n\n<template>\n  <div v-if=\"status === 'pending'\">Loading ENS name</div>\n  <div v-else-if=\"status === 'error'\">\n    Error fetching ENS name: {{error.message}}\n  </div>\n  <div v-else>ENS name: {{data}}</div>\n</template>\n```\n```tsx [main.ts]\nimport { QueryClient, VueQueryPlugin } from '@tanstack/vue-query'\nimport { WagmiPlugin } from '@wagmi/vue'\nimport { createApp } from 'vue'\nimport { config } from './config'\nimport App from './App.vue'\n\nconst queryClient = new QueryClient()\n\ncreateApp(App)\n  .use(WagmiPlugin, { config })\n  .use(VueQueryPlugin, { queryClient })\n  .mount('#app')\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n\n## Next Steps\n\nFor more information on what to do next, check out the following topics.\n\n- [**TypeScript**](/vue/typescript) Learn how to get the most out of Wagmi's type-safety and inference for an enlightened developer experience.\n- [**Connect Wallet**](/vue/guides/connect-wallet) Learn how to enable wallets to connect to and disconnect from your apps and display information about connected accounts.\n- [**Vue Composables**](/vue/api/composables) Browse the collection of Vue Composables and learn how to use them.\n- [**Viem**](/vue/guides/viem) Learn about Viem and how it works with Wagmi.\n\n"
  },
  {
    "path": "site/vue/guides/chain-properties.md",
    "content": "# Chain Properties\n\nSome chains support additional properties related to blocks and transactions. This is powered by Viem's [formatters](https://viem.sh/docs/chains/formatters) and [serializers](https://viem.sh/docs/chains/serializers). For example, Celo, ZkSync, OP Stack chains support all support additional properties. In order to use these properties in a type-safe way, there are a few things you should be aware of.\n\n<br/>\n\n::: tip\nMake sure you follow the TypeScript guide's [Config Types](/vue/typescript#config-types) section before moving on. The easiest way to do this is to use [Declaration Merging](/vue/typescript#declaration-merging) to \"register\" your `config` globally with TypeScript.\n\n<<< @/snippets/vue/config-chain-properties.ts[config.ts]\n:::\n\n## Narrowing Parameters\n\nOnce your Config is registered with TypeScript, you are ready to access chain-specific properties! For example, Celo's `feeCurrency` is available.\n\n::: code-group\n```ts [index.tsx]\nimport { parseEther } from 'viem'\nimport { useSimulateContract } from '@wagmi/vue'\n\nconst result = useSimulateContract({\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n  feeCurrency: '0x…', // [!code focus]\n})\n```\n<<< @/snippets/vue/config-chain-properties.ts[config.ts]\n:::\n\nThis is great, but if you have multiple chains that support additional properties, your autocomplete could be overwhelmed with all of them. By setting the `chainId` property to a specific value (e.g. `celo.id`), you can narrow parameters to a single chain.\n\n::: code-group\n```ts [index.tsx]\nimport { parseEther } from 'viem'\nimport { useSimulateContract } from '@wagmi/vue'\nimport { celo } from '@wagmi/vue/chains'\n\nconst result = useSimulateContract({\n  to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',\n  value: parseEther('0.01'),\n  chainId: celo.id, // [!code focus]\n  feeCurrency: '0x…', // [!code focus]\n  // ^? (property) feeCurrency?: `0x${string}` | undefined // [!code focus]\n})\n```\n<<< @/snippets/vue/config-chain-properties.ts[config.ts]\n:::\n\n## Narrowing Return Types\n\nReturn types can also have chain-specific properties attached to them. There are a couple approaches for extracting these properties.\n\n### `chainId` Parameter\n\nNot only can you use the `chainId` parameter to [narrow parameters](#narrowing-parameters), you can also use it to narrow the return type.\n\n::: code-group\n```ts [index.tsx]\nimport { useWaitForTransactionReceipt } from '@wagmi/vue'\nimport { zkSync } from '@wagmi/vue/chains'\n\nconst { data } = useWaitForTransactionReceipt({\n  chainId: zkSync.id,\n  hash: '0x16854fcdd0219cacf5aec5e4eb2154dac9e406578a1510a6fc48bd0b67e69ea9',\n})\n\ndata?.logs\n//    ^? (property) logs: ZkSyncLog[] | undefined\n```\n<<< @/snippets/vue/config-chain-properties.ts[config.ts]\n:::\n\n### `chainId` Data Property\n\nWagmi internally will set a `chainId` property on return types that you can use to narrow results. The `chainId` is determined from the `chainId` parameter or global state (e.g. connector). You can use this property to help TypeScript narrow the type.\n\n::: code-group\n```ts [index.tsx]\nimport { useWaitForTransactionReceipt } from '@wagmi/vue'\nimport { zkSync } from '@wagmi/vue/chains'\n\nconst { data } = useWaitForTransactionReceipt({\n  hash: '0x16854fcdd0219cacf5aec5e4eb2154dac9e406578a1510a6fc48bd0b67e69ea9',\n})\n\nif (data?.chainId === zkSync.id) {\n  data?.logs\n  //    ^? (property) logs: ZkSyncLog[] | undefined\n}\n```\n<<< @/snippets/vue/config-chain-properties.ts[config.ts]\n:::\n\n## Troubleshooting\n\nIf chain properties aren't working, make sure [TypeScript](/vue/guides/faq#type-inference-doesn-t-work) is configured correctly. Not all chains have additional properties, to check which ones do, see the [Viem repo](https://github.com/wevm/viem/tree/main/src/chains) (chains that have a top-level directory under [`src/chains`](https://github.com/wevm/viem/tree/main/src/chains) support additional properties).\n"
  },
  {
    "path": "site/vue/guides/connect-wallet.md",
    "content": "# Connect Wallet\n\nThe ability for a user to connect their wallet is a core function for any Dapp. It allows users to perform tasks such as: writing to contracts, signing messages, or sending transactions.\n\nWagmi contains everything you need to get started with building a Connect Wallet module. To get started, follow the [build your own](#build-your-own) walkthrough.\n\n## Build Your Own\n\nWagmi provides you with the Composables to get started building your own Connect Wallet module. \n\nIt takes less than five minutes to get up and running with Browser Wallets, WalletConnect, and Coinbase Wallet.\n\n### 1. Configure Wagmi\n\nBefore we get started with building the functionality of the Connect Wallet module, we will need to set up the Wagmi configuration.\n\nLet's create a `config.ts` file and export a `config` object.\n\n::: code-group\n\n```tsx [config.ts]\nimport { http, createConfig } from '@wagmi/vue'\nimport { base, mainnet, optimism } from '@wagmi/vue/chains'\nimport { injected, metaMask, safe, walletConnect } from '@wagmi/vue/connectors'\n\nconst projectId = '<WALLETCONNECT_PROJECT_ID>'\n\nexport const config = createConfig({\n  chains: [mainnet, base],\n  connectors: [\n    injected(),\n    walletConnect({ projectId }),\n    metaMask(),\n    safe(),\n  ],\n  transports: {\n    [mainnet.id]: http(),\n    [base.id]: http(),\n  },\n})\n```\n\n:::\n\nIn the above configuration, we want to set up connectors for Injected (browser), WalletConnect (browser + mobile), MetaMask, and Safe wallets. This configuration uses the **Mainnet** and **Base** chains, but you can use whatever you want.\n\n::: warning\n\nMake sure to replace the `projectId` with your own WalletConnect Project ID, if you wish to use WalletConnect! \n\n[Get your Project ID](https://cloud.walletconnect.com/)\n\n:::\n\n### 2. Inject the WagmiPlugin onto your App\n\nNext, we will need to inject our App with plugins so that our application is aware of Wagmi & Vue Query's reactive state and in-memory caching.\n\n::: code-group\n\n```ts [main.ts]\n// 1. Import modules.\nimport { VueQueryPlugin } from '@tanstack/vue-query'\nimport { WagmiPlugin } from '@wagmi/vue'\nimport { createApp } from 'vue'\n\nimport App from './App.vue'\nimport { config } from './wagmi'\n\ncreateApp(App)\n  // 2. Inject the Wagmi plugin.\n  .use(WagmiPlugin, { config })\n  // 3. Inject the Vue Query plugin.\n  .use(VueQueryPlugin, {})\n  .mount('#app')\n```\n\n```vue [App.vue]\n<script setup lang=\"ts\">\n</script>\n\n<template>\n</template>\n```\n\n```ts [config.ts]\nimport { http, createConfig } from '@wagmi/vue'\nimport { base, mainnet, optimism } from '@wagmi/vue/chains'\nimport { injected, metaMask, safe, walletConnect } from '@wagmi/vue/connectors'\n\nconst projectId = '<WALLETCONNECT_PROJECT_ID>'\n\nexport const config = createConfig({\n  chains: [mainnet, base],\n  connectors: [\n    injected(),\n    walletConnect({ projectId }),\n    metaMask(),\n    safe(),\n  ],\n  transports: {\n    [mainnet.id]: http(),\n    [base.id]: http(),\n  },\n})\n```\n\n:::\n\n### 3. Display Wallet Options\n\nAfter that, we will create a `Connect` component that will display our connectors. This will allow users to select a wallet and connect.\n\nBelow, we are rendering a list of `connectors` retrieved from `useConnect`. When the user clicks on a connector, the `connect` function will connect the users' wallet.\n\n::: code-group\n\n```vue [Connect.vue]\n<script setup lang=\"ts\">\nimport { useChainId, useConnect, useConnectors } from '@wagmi/vue'\n\nconst chainId = useChainId()\nconst { connect } = useConnect()\nconst connectors = useConnectors()\n</script>\n\n<template>\n  <button\n    v-for=\"connector in connectors\"\n    @click=\"connect({ connector, chainId })\"\n  >\n    {{ connector.name }}\n  </button>\n</template>\n```\n\n```vue [App.vue]\n<script setup lang=\"ts\">\n</script>\n\n<template>\n</template>\n```\n\n```ts [main.ts]\n// 1. Import modules.\nimport { VueQueryPlugin } from '@tanstack/vue-query'\nimport { WagmiPlugin } from '@wagmi/vue'\nimport { createApp } from 'vue'\n\nimport App from './App.vue'\nimport { config } from './wagmi'\n\ncreateApp(App)\n  // 2. Inject the Wagmi plugin.\n  .use(WagmiPlugin, { config })\n  // 3. Inject the Vue Query plugin.\n  .use(VueQueryPlugin, {})\n  .mount('#app')\n```\n\n```ts [config.ts]\nimport { http, createConfig } from '@wagmi/vue'\nimport { base, mainnet, optimism } from '@wagmi/vue/chains'\nimport { injected, metaMask, safe, walletConnect } from '@wagmi/vue/connectors'\n\nconst projectId = '<WALLETCONNECT_PROJECT_ID>'\n\nexport const config = createConfig({\n  chains: [mainnet, base],\n  connectors: [\n    injected(),\n    walletConnect({ projectId }),\n    metaMask(),\n    safe(),\n  ],\n  transports: {\n    [mainnet.id]: http(),\n    [base.id]: http(),\n  },\n})\n```\n\n:::\n\n### 4. Display Connection\n\nLastly, if an connection is made, we want to show some basic information, like the connected address and ENS name and avatar.\n\nBelow, we are using hooks like `useConnection`, `useEnsAvatar` and `useEnsName` to extract this information.\n\nWe are also utilizing `useDisconnect` to show a \"Disconnect\" button so a user can disconnect their wallet.\n\n::: code-group\n\n```vue [Connection.vue]\n<script setup lang=\"ts\">\nimport { useConnection, useDisconnect } from '@wagmi/vue'\n\nconst { address, connector } = useConnection()\nconst { disconnect } = useDisconnect()\n</script>\n\n<template>\n  <div>Address: {{ address }}</div>\n  <div>Connected to {{ connector?.name }} Connector.</div>\n  <button @click=\"disconnect()\">Disconnect</button>\n</template>\n```\n\n```vue [Connect.vue]\n<script setup lang=\"ts\">\nimport { useChainId, useConnect, useConnectors } from '@wagmi/vue'\n\nconst chainId = useChainId()\nconst { connect } = useConnect()\nconst connectors = useConnectors()\n</script>\n\n<template>\n  <button\n    v-for=\"connector in connectors\"\n    @click=\"connect({ connector, chainId })\"\n  >\n    {{ connector.name }}\n  </button>\n</template>\n```\n\n```vue [App.vue]\n<script setup lang=\"ts\">\n</script>\n\n<template>\n</template>\n```\n\n```ts [main.ts]\n// 1. Import modules.\nimport { VueQueryPlugin } from '@tanstack/vue-query'\nimport { WagmiPlugin } from '@wagmi/vue'\nimport { createApp } from 'vue'\n\nimport App from './App.vue'\nimport { config } from './wagmi'\n\ncreateApp(App)\n  // 2. Inject the Wagmi plugin.\n  .use(WagmiPlugin, { config })\n  // 3. Inject the Vue Query plugin.\n  .use(VueQueryPlugin, {})\n  .mount('#app')\n```\n\n```ts [config.ts]\nimport { http, createConfig } from '@wagmi/vue'\nimport { base, mainnet, optimism } from '@wagmi/vue/chains'\nimport { injected, metaMask, safe, walletConnect } from '@wagmi/vue/connectors'\n\nconst projectId = '<WALLETCONNECT_PROJECT_ID>'\n\nexport const config = createConfig({\n  chains: [mainnet, base],\n  connectors: [\n    injected(),\n    walletConnect({ projectId }),\n    metaMask(),\n    safe(),\n  ],\n  transports: {\n    [mainnet.id]: http(),\n    [base.id]: http(),\n  },\n})\n```\n\n:::\n\n### 5. Wire it up!\n\nFinally, we can wire up our Connect and Connection components to our application's entrypoint.\n\n::: code-group\n\n```vue [App.vue]\n<script setup lang=\"ts\">\nimport { useConnection } from '@wagmi/vue'\nimport Connection from './Connection.vue' // [!code ++]\nimport Connect from './Connect.vue' // [!code ++]\n\nconst { isConnected } = useConnection()\n</script>\n\n<template>\n  <Connection v-if=\"isConnected\" /> // [!code ++]\n  <Connect v-else /> // [!code ++]\n</template>\n\n```\n\n```vue [Connection.vue]\n<script setup lang=\"ts\">\nimport { useConnection, useDisconnect } from '@wagmi/vue'\n\nconst { address, connector } = useConnection()\nconst { disconnect } = useDisconnect()\n</script>\n\n<template>\n  <div>Address: {{ address }}</div>\n  <div>Connected to {{ connector?.name }} Connector.</div>\n  <button @click=\"disconnect()\">Disconnect</button>\n</template>\n```\n\n```vue [Connect.vue]\n<script setup lang=\"ts\">\nimport { useChainId, useConnect, useConnectors } from '@wagmi/vue'\n\nconst chainId = useChainId()\nconst { connect } = useConnect()\nconst connectors = useConnectors()\n</script>\n\n<template>\n  <button\n    v-for=\"connector in connectors\"\n    @click=\"connect({ connector, chainId })\"\n  >\n    {{ connector.name }}\n  </button>\n</template>\n```\n\n```ts [main.ts]\n// 1. Import modules.\nimport { VueQueryPlugin } from '@tanstack/vue-query'\nimport { WagmiPlugin } from '@wagmi/vue'\nimport { createApp } from 'vue'\n\nimport App from './App.vue'\nimport { config } from './wagmi'\n\ncreateApp(App)\n  // 2. Inject the Wagmi plugin.\n  .use(WagmiPlugin, { config })\n  // 3. Inject the Vue Query plugin.\n  .use(VueQueryPlugin, {})\n  .mount('#app')\n```\n\n```ts [config.ts]\nimport { http, createConfig } from '@wagmi/vue'\nimport { base, mainnet, optimism } from '@wagmi/vue/chains'\nimport { injected, metaMask, safe, walletConnect } from '@wagmi/vue/connectors'\n\nconst projectId = '<WALLETCONNECT_PROJECT_ID>'\n\nexport const config = createConfig({\n  chains: [mainnet, base],\n  connectors: [\n    injected(),\n    walletConnect({ projectId }),\n    metaMask(),\n    safe(),\n  ],\n  transports: {\n    [mainnet.id]: http(),\n    [base.id]: http(),\n  },\n})\n```\n\n:::\n\n### Playground\n\nWant to see the above steps all wired up together in an end-to-end example? Check out the below StackBlitz playground.\n\n<br/>\n\n<iframe frameborder=\"0\" width=\"100%\" height=\"500px\" src=\"https://stackblitz.com/edit/vitejs-vite-mf6dgb?embed=1&file=src%2FApp.vue&hideExplorer=1&view=preview\"></iframe>\n"
  },
  {
    "path": "site/vue/guides/error-handling.md",
    "content": "# Error Handling\n\nThe `error` property in Wagmi Composables is strongly typed with it's corresponding error type. This enables you to have granular precision with handling errors in your application.\n\nYou can discriminate the error type by using the `name` property on the error object.\n\n::: code-group\n```vue twoslash [index.vue]\n// @twoslash-cache: {\"v\":1,\"hash\":\"26fedaeea151ddba71fa403843f00ead34374f64e5dd13dafc27e1465b3af479\",\"data\":\"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=\"}\n<script setup lang=\"ts\">\n// @noErrors\nimport { useBlockNumber } from 'wagmi'\n\nconst { data, error } = useBlockNumber()\n//            ^?\n\n\nerror?.name\n//     ^?\n\n\n\n\n\n</script>\n\n<template>\n  <div v-if=\"error?.name === 'HttpRequestError'\">\n    A HTTP error occurred. Status: {{ error.status }}\n//                                          ^?\n  </div>\n\n  <div v-else-if=\"error?.name === 'LimitExceededRpcError'\">\n    Rate limit exceeded. Code: {{ error.code }}\n//                                      ^?\n  </div>\n</template>\n```\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n"
  },
  {
    "path": "site/vue/guides/faq.md",
    "content": "<script setup>\nconst docsPath = 'vue'\n</script>\n\n# FAQ / Troubleshooting\n\nCollection of frequently asked questions with ideas on how to troubleshoot and resolve them.\n\n<!--@include: @shared/faq.md-->\n"
  },
  {
    "path": "site/vue/guides/read-from-contract.md",
    "content": "# Read from Contract\n\n## Overview\n\nThe [`useReadContract` Composable](/vue/api/composables/useReadContract) allows you to read data on a smart contract, from a `view` or `pure` (read-only) function. They can only read the state of the contract, and cannot make any changes to it. Since read-only methods do not change the state of the contract, they do not require any gas to be executed, and can be called by any user without the need to pay for gas.\n\nThe component below shows how to retrieve the token balance of an address from the [Wagmi Example](https://etherscan.io/token/0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2) contract\n\n:::code-group\n\n```vue [ReadContract.vue]\n<script setup lang=\"ts\">\nimport { useReadContract } from 'wagmi'\nimport { wagmiContractConfig } from './contracts'\n\nconst { data: balance } = useReadContract({\n  ...wagmiContractConfig,\n  functionName: 'balanceOf',\n  args: ['0x03A71968491d55603FFe1b11A9e23eF013f75bCF'],\n})\n</script>\n\n<template>\n  <div>Balance: {{ balance?.toString() }}</div>\n</template>\n```\n```ts [contracts.ts]\nexport const wagmiContractConfig = {\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  abi: [\n    {\n      type: 'function',\n      name: 'balanceOf',\n      stateMutability: 'view',\n      inputs: [{ name: 'account', type: 'address' }],\n      outputs: [{ type: 'uint256' }],\n    },\n    {\n      type: 'function',\n      name: 'totalSupply',\n      stateMutability: 'view',\n      inputs: [],\n      outputs: [{ name: 'supply', type: 'uint256' }],\n    },\n  ],\n} as const\n```\n:::\n\n\nIf `useReadContract` depends on another value (`address` in the example below), you can use the [`query.enabled`](/vue/api/composables/useReadContract#enabled) option to prevent the query from running until the dependency is ready.\n\n```tsx\nconst { data: balance } = useReadContract({\n  ...wagmiContractConfig,\n  functionName: 'balanceOf',\n  args: [address],\n  query: { // [!code focus]\n    enabled: !!address, // [!code focus]\n  }, // [!code focus]\n})\n```\n\n\n## Loading & Error States\n\nThe [`useReadContract` Composable](/vue/api/composables/useReadContract) also returns loading & error states, which can be used to display a loading indicator while the data is being fetched, or an error message if contract execution reverts.\n\n:::code-group\n\n```vue [ReadContract.vue]\n<script setup lang=\"ts\">\nimport { useReadContract } from 'wagmi'\n\nconst { \n  data: balance,\n  error, // [!code ++]\n  isPending // [!code ++]\n} = useReadContract({\n  ...wagmiContractConfig,\n  functionName: 'balanceOf',\n  args: ['0x03A71968491d55603FFe1b11A9e23eF013f75bCF'],\n})\n</script>\n\n<template>\n  <div v-if=\"isPending\">Loading...</div> // [!code ++]\n\n  <div v-else-if=\"error\"> // [!code ++]\n    Error: {{ (error as BaseError).shortMessage || error.message }} // [!code ++]\n  </div> // [!code ++]\n\n  <div v-else>Balance: {{ balance?.toString() }}</div>\n</template>\n```\n\n:::\n\n<!-- TODO: ## Refetching On Blocks\n\nThe [`useBlockNumber` Hook](/react/api/hooks/useBlockNumber) can be utilized to refetch or [invalidate](https://tanstack.com/query/latest/docs/framework/react/guides/query-invalidation) the contract data on a specific block interval.\n\n:::code-group\n```tsx [read-contract.tsx (refetch)]\nimport { useEffect } from 'react'\nimport { useBlockNumber, useReadContract } from 'wagmi'\n\nfunction ReadContract() {\n  const { data: balance, refetch } = useReadContract({\n    ...wagmiContractConfig,\n    functionName: 'balanceOf',\n    args: ['0x03A71968491d55603FFe1b11A9e23eF013f75bCF'],\n  })\n  const { data: blockNumber } = useBlockNumber({ watch: true })\n\n  useEffect(() => {\n    // want to refetch every `n` block instead? use the modulo operator!\n    // if (blockNumber % 5 === 0) refetch() // refetch every 5 blocks\n    refetch()\n  }, [blockNumber])\n\n  return (\n    <div>Balance: {balance?.toString()}</div>\n  )\n}\n```\n```tsx [read-contract.tsx (invalidate)]\nimport { useQueryClient } from '@tanstack/react-query'\nimport { useEffect } from 'react'\nimport { useBlockNumber, useReadContract } from 'wagmi'\n\nfunction ReadContract() {\n  const queryClient = useQueryClient()\n  const { data: balance, refetch } = useReadContract({\n    ...wagmiContractConfig,\n    functionName: 'balanceOf',\n    args: ['0x03A71968491d55603FFe1b11A9e23eF013f75bCF'],\n  })\n  const { data: blockNumber } = useBlockNumber({ watch: true })\n\n  useEffect(() => {\n    // if `useReadContract` is in a different hook/component,\n    // you can import `readContractQueryKey` from `'wagmi/query'` and\n    // construct a one-off query key to use for invalidation\n    queryClient.invalidateQueries({ queryKey })\n  }, [blockNumber, queryClient])\n\n  return (\n    <div>Balance: {balance?.toString()}</div>\n  )\n}\n```\n::: -->\n\n<!-- TODO: ## Calling Multiple Functions\n\nWe can use the [`useReadContract` Hook](/react/api/hooks/useReadContract) multiple times in a single component to call multiple functions on the same contract, but this ends up being hard to manage as the number of functions increases, especially when we also want to deal with loading & error states. \n\nLuckily, to make this easier, we can use the [`useReadContracts` Hook](/react/api/hooks/useReadContracts) to call multiple functions in a single call.\n\n:::code-group\n\n```tsx [read-contract.tsx]\nimport { type BaseError, useReadContracts } from 'wagmi'\n\nfunction ReadContract() {\n  const { \n    data,\n    error,\n    isPending\n  } = useReadContracts({ \n    contracts: [{ \n      ...wagmiContractConfig,\n      functionName: 'balanceOf',\n      args: ['0x03A71968491d55603FFe1b11A9e23eF013f75bCF'],\n    }, { \n      ...wagmiContractConfig, \n      functionName: 'ownerOf', \n      args: [69n], \n    }, { \n      ...wagmiContractConfig, \n      functionName: 'totalSupply', \n    }] \n  }) \n  const [balance, ownerOf, totalSupply] = data || [] \n\n  if (isPending) return <div>Loading...</div>\n\n  if (error)\n    return (\n      <div>\n        Error: {(error as BaseError).shortMessage || error.message}\n      </div>\n    ) \n\n  return (\n    <>\n      <div>Balance: {balance?.toString()}</div>\n      <div>Owner of Token 69: {ownerOf?.toString()}</div> \n      <div>Total Supply: {totalSupply?.toString()}</div> \n    </>\n  )\n}\n```\n\n::: -->\n"
  },
  {
    "path": "site/vue/guides/send-transaction.md",
    "content": "# Send Transaction\n\nThe following guide teaches you how to send transactions in Wagmi. The example below builds on the [Connect Wallet guide](/vue/guides/connect-wallet) and uses the [useSendTransaction](/vue/api/composables/useSendTransaction) & [useWaitForTransactionReceipt](/vue/api/composables/useWaitForTransactionReceipt) composables. \n\n## Example\n\nFeel free to check out the example before moving on:\n\n<iframe frameborder=\"0\" width=\"100%\" height=\"500px\" src=\"https://stackblitz.com/edit/vitejs-vite-wkaruk?embed=1&file=src%2FApp.tsx&hideExplorer=1&view=preview\"></iframe>\n\n## Steps\n\n### 1. Connect Wallet \n\nFollow the [Connect Wallet guide](/vue/guides/connect-wallet) guide to get this set up.\n\n### 2. Create a new component\n\nCreate your `SendTransaction` component that will contain the send transaction logic.\n\n::: code-group\n\n```tsx [SendTransaction.vue]\n<script setup lang=\"ts\">\n</script>\n\n<template>\n  <form>\n    <input name=\"address\" placeholder=\"0xA0Cf…251e\" required />\n    <input name=\"value\" placeholder=\"0.05\" required />\n    <button type=\"submit\">Send</button>\n  </form>\n</template>\n```\n\n:::\n\n### 3. Add a form handler\n\nNext, we will need to add a handler to the form that will send the transaction when the user hits \"Send\". This will be a basic handler in this step.\n\n::: code-group\n\n```vue [SendTransaction.vue]\n<script setup lang=\"ts\">\n  function submit(event: Event) { // [!code ++]\n    const formData = new FormData(event.target as HTMLFormElement) // [!code ++]\n    const to = formData.get('address') as `0x${string}` // [!code ++]\n    const value = formData.get('value') as string // [!code ++]\n    sendTransaction({ to, value: parseEther(value) }) // [!code ++]\n  } // [!code ++]\n</script>\n\n<template>\n  <form> // [!code --]\n  <form @submit.prevent=\"submit\"> // [!code ++]\n    <input name=\"address\" placeholder=\"0xA0Cf…251e\" required />\n    <input name=\"value\" placeholder=\"0.05\" required />\n    <button type=\"submit\">Send</button>\n  </form>\n</template>\n```\n\n:::\n\n### 4. Hook up the `useSendTransaction` Composable\n\nNow that we have the form handler, we can hook up the [`useSendTransaction` Composable](/vue/api/composables/useSendTransaction) to send the transaction.\n\n::: code-group\n\n```vue [SendTransaction.vue]\n<script setup lang=\"ts\">\n  import { useSendTransaction } from 'wagmi' // [!code ++]\n  import { parseEther } from 'viem' // [!code ++]\n\n  const { data: hash, sendTransaction } = useSendTransaction() // [!code ++]\n\n  function submit(event: Event) {\n    const formData = new FormData(event.target as HTMLFormElement)\n    const to = formData.get('address') as `0x${string}`\n    const value = formData.get('value') as string\n    sendTransaction({ to, value: parseEther(value) }) // [!code ++]\n  }\n</script>\n\n<template>\n  <form @submit.prevent=\"submit\">\n    <input name=\"address\" placeholder=\"0xA0Cf…251e\" required />\n    <input name=\"value\" placeholder=\"0.05\" required />\n    <button type=\"submit\">Send</button>\n    <div v-if=\"hash\">Transaction Hash: {{ hash }}</div> // [!code ++]\n  </form>\n</template>\n```\n\n:::\n\n### 5. Add loading state (optional)\n\nWe can optionally add a loading state to the \"Send\" button while we are waiting confirmation from the user's wallet.\n\n::: code-group\n\n```vue [SendTransaction.vue]\n<script setup lang=\"ts\">\n  import { useSendTransaction } from 'wagmi'\n  import { parseEther } from 'viem'\n\n  const { \n    data: hash, \n    isPending, // [!code ++]\n    sendTransaction \n  } = useSendTransaction()\n\n  function submit(event: Event) {\n    const formData = new FormData(event.target as HTMLFormElement)\n    const to = formData.get('address') as `0x${string}`\n    const value = formData.get('value') as string\n    sendTransaction({ to, value: parseEther(value) })\n  }\n</script>\n\n<template>\n  <form @submit.prevent=\"submit\">\n    <input name=\"address\" placeholder=\"0xA0Cf…251e\" required />\n    <input name=\"value\" placeholder=\"0.05\" required />\n    <button :disabled=\"isPending\" type=\"submit\"> // [!code ++]\n      <span v-if=\"isPending\">Sending...</span> // [!code ++]\n      <span v-else>Send</span> // [!code ++]\n    </button>\n    <div v-if=\"hash\">Transaction Hash: {{ hash }}</div>\n  </form>\n</template>\n```\n\n:::\n\n### 6. Wait for transaction receipt (optional)\n\nWe can also display the transaction confirmation status to the user by using the [`useWaitForTransactionReceipt` Composable](/vue/api/composables/useWaitForTransactionReceipt). \n\n::: code-group\n\n```vue [SendTransaction.vue]\n<script setup lang=\"ts\">\n  import { \n    useSendTransaction,\n    useWaitForTransactionReceipt, // [!code ++]\n  } from 'wagmi'\n  import { parseEther } from 'viem'\n\n  const { \n    data: hash, \n    isPending,\n    sendTransaction \n  } = useSendTransaction()\n\n  function submit(event: Event) {\n    const formData = new FormData(event.target as HTMLFormElement)\n    const to = formData.get('address') as `0x${string}`\n    const value = formData.get('value') as string\n    sendTransaction({ to, value: parseEther(value) })\n  }\n\n  const { isLoading: isConfirming, isSuccess: isConfirmed } = // [!code ++]\n    useWaitForTransactionReceipt({ // [!code ++]\n      hash, // [!code ++]\n    }) // [!code ++]\n</script>\n\n<template>\n  <form @submit.prevent=\"submit\">\n    <input name=\"address\" placeholder=\"0xA0Cf…251e\" required />\n    <input name=\"value\" placeholder=\"0.05\" required />\n    <button :disabled=\"isPending\" type=\"submit\">\n      <span v-if=\"isPending\">Sending...</span>\n      <span v-else>Send</span>\n    </button>\n    <div v-if=\"hash\">Transaction Hash: {{ hash }}</div>\n    <div v-if=\"isConfirming\">Waiting for confirmation...</div> // [!code ++]\n    <div v-if=\"isConfirmed\">Transaction Confirmed!</div> // [!code ++]\n  </form>\n</template>\n```\n\n:::\n\n### 7. Handle errors (optional)\n\nIf the user rejects the transaction, or the user does not have enough funds to cover the transaction, we can display an error message to the user.\n\n::: code-group\n\n```vue [SendTransaction.vue]\n<script setup lang=\"ts\">\n  import { \n    useSendTransaction,\n    useWaitForTransactionReceipt,\n  } from 'wagmi'\n  import { parseEther } from 'viem'\n\n  const { \n    data: hash, \n    error, // [!code ++]\n    isPending,\n    sendTransaction \n  } = useSendTransaction()\n\n  function submit(event: Event) {\n    const formData = new FormData(event.target as HTMLFormElement)\n    const to = formData.get('address') as `0x${string}`\n    const value = formData.get('value') as string\n    sendTransaction({ to, value: parseEther(value) })\n  }\n\n  const { isLoading: isConfirming, isSuccess: isConfirmed } = \n    useWaitForTransactionReceipt({ \n      hash, \n    }) \n</script>\n\n<template>\n  <form @submit.prevent=\"submit\">\n    <input name=\"address\" placeholder=\"0xA0Cf…251e\" required />\n    <input name=\"value\" placeholder=\"0.05\" required />\n    <button :disabled=\"isPending\" type=\"submit\">\n      <span v-if=\"isPending\">Sending...</span>\n      <span v-else>Send</span>\n    </button>\n    <div v-if=\"hash\">Transaction Hash: {{ hash }}</div>\n    <div v-if=\"isConfirming\">Waiting for confirmation...</div> \n    <div v-if=\"isConfirmed\">Transaction Confirmed!</div> \n    <div v-if=\"error\"> // [!code ++]\n      Error: {{ (error as BaseError).shortMessage || error.message }} // [!code ++]\n    </div> // [!code ++]\n  </form>\n</template>\n```\n\n:::\n\n### 8. Wire it up!\n\nFinally, we can wire up our Send Transaction component to our application's entrypoint.\n\n:::code-group\n```vue [App.vue]\n<script setup lang=\"ts\">\nimport { useConnection } from '@wagmi/vue'\nimport Connection from './Connection.vue'\nimport Connect from './Connect.vue'\nimport SendTransaction from './SendTransaction.vue' // [!code ++]\n\nconst { isConnected } = useConnection()\n</script>\n\n<template>\n  <Connection v-if=\"isConnected\" />\n  <Connect v-else />\n  <SendTransaction v-if=\"isConnected\" /> // [!code ++]\n</template>\n```\n```vue [SendTransaction.vue]\n<script setup lang=\"ts\">\n  import { \n    useSendTransaction,\n    useWaitForTransactionReceipt,\n  } from 'wagmi'\n  import { parseEther } from 'viem'\n\n  const { \n    data: hash, \n    error,\n    isPending,\n    sendTransaction \n  } = useSendTransaction()\n\n  function submit(event: Event) {\n    const formData = new FormData(event.target as HTMLFormElement)\n    const to = formData.get('address') as `0x${string}`\n    const value = formData.get('value') as string\n    sendTransaction({ to, value: parseEther(value) })\n  }\n\n  const { isLoading: isConfirming, isSuccess: isConfirmed } = \n    useWaitForTransactionReceipt({ \n      hash, \n    }) \n</script>\n\n<template>\n  <form @submit.prevent=\"submit\">\n    <input name=\"address\" placeholder=\"0xA0Cf…251e\" required />\n    <input name=\"value\" placeholder=\"0.05\" required />\n    <button :disabled=\"isPending\" type=\"submit\">\n      <span v-if=\"isPending\">Sending...</span>\n      <span v-else>Send</span>\n    </button>\n    <div v-if=\"hash\">Transaction Hash: {{ hash }}</div>\n    <div v-if=\"isConfirming\">Waiting for confirmation...</div> \n    <div v-if=\"isConfirmed\">Transaction Confirmed!</div> \n    <div v-if=\"error\">\n      Error: {{ (error as BaseError).shortMessage || error.message }}\n    </div>\n  </form>\n</template>\n```\n:::\n\n[See the Example.](#example)\n"
  },
  {
    "path": "site/vue/guides/ssr.md",
    "content": "---\noutline: deep\n---\n\n# SSR\n\nWagmi uses client-only external stores (such as `localStorage` and `mipd`) to show the user the most relevant data as quickly as possible on first render.\n\nHowever, the caveat of using these external client stores is that frameworks which incorporate SSR (such as Next.js) will throw hydration warnings on the client when it identifies mismatches between the server-rendered HTML and the client-rendered HTML.\n\nTo stop this from happening, you can toggle on the [`ssr`](/vue/api/createConfig#ssr) property in the Wagmi Config.\n\n```tsx\nimport { createConfig, http } from '@wagmi/vue'\nimport { mainnet, sepolia } from '@wagmi/vue/chains'\n\nconst config = createConfig({ // [!code focus:99]\n  chains: [mainnet, sepolia],\n  ssr: true, // [!code ++]\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n```\n\nTurning on the `ssr` property means that content from the external stores will be hydrated on the client after the initial mount.\n\n## Persistence using Cookies\n\nAs a result of turning on the `ssr` property, external persistent stores like `localStorage` will be hydrated on the client **after the initial mount**.\n\nThis means that you will still see a flash of \"empty\" data on the client (e.g. a `\"disconnected\"` account instead of a `\"reconnecting\"` account, or an empty address instead of the last connected address) until after the first mount, when the store hydrates.\n\nIn order to persist data between the server and the client, you can use cookies.\n\n### 1. Set up cookie storage\n\nFirst, we will set up cookie storage in the Wagmi Config.\n\n```tsx\nimport { \n  createConfig, \n  http, \n  cookieStorage, // [!code ++]\n  createStorage // [!code ++]\n} from '@wagmi/vue'\nimport { mainnet, sepolia } from '@wagmi/vue/chains'\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  ssr: true,\n  storage: createStorage({  // [!code ++]\n    storage: cookieStorage, // [!code ++]\n  }),  // [!code ++]\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n```\n\n### 2. Hydrate the cookie\n\nNext, we will need to add some mechanisms to hydrate the stored cookie in Wagmi.\n\n#### Nuxt.js\n\nWould you like to contribute this content? Feel free to [open a Pull Request](https://github.com/wevm/wagmi/pulls)!\n<!-- TODO -->\n\n#### Vanilla SSR\n\nWould you like to contribute this content? Feel free to [open a Pull Request](https://github.com/wevm/wagmi/pulls)!\n<!-- TODO -->\n\n\n"
  },
  {
    "path": "site/vue/guides/tanstack-query.md",
    "content": "# TanStack Query\n\nWagmi Composables are not only a wrapper around the core [Wagmi Actions](/core/api/actions), but they also utilize [TanStack Query](https://tanstack.com/query/v5) to enable trivial and intuitive fetching, caching, synchronizing, and updating of asynchronous data in your Vue applications.\n\nWithout an asynchronous data fetching abstraction, you would need to handle all the negative side-effects that comes as a result, such as: representing finite states (loading, error, success), handling race conditions, caching against a deterministic identifier, etc.\n\n## Queries & Mutations\n\nWagmi Composables represent either a **Query** or a **Mutation**. \n\n**Queries** are used for fetching data (e.g. fetching a block number, reading from a contract, etc), and are typically invoked on mount by default. All queries are coupled to a unique [Query Key](#query-keys), and can be used for further operations such as refetching, prefetching, or modifying the cached data.\n\n**Mutations** are used for mutating data (e.g. connecting/disconnecting accounts, writing to a contract, switching chains, etc), and are typically invoked in response to a user interaction. Unlike **Queries**, they are not coupled with a query key.\n\n## Terms\n\n- **Query**: An asynchronous data fetching (e.g. read data) operation that is tied against a unique Query Key.\n- **Mutation**: An asynchronous mutating (e.g. create/update/delete data or side-effect) operation.\n- **Query Key**: A unique identifier that is used to deterministically identify a query. It is typically a tuple of the query name and the query arguments.\n- **Stale Data**: Data that is unused or inactive after a certain period of time.\n- **Query Fetching**: The process of invoking an async query function.\n- **Query Refetching**: The process of refetching **rendered** queries.\n- **[Query Invalidation](https://tanstack.com/query/v5/docs/vue/guides/query-invalidation)**: The process of marking query data as stale (e.g. inactive/unused), and refetching **rendered** queries.\n- **[Query Prefetching](https://tanstack.com/query/v5/docs/vue/guides/prefetching)**: The process of prefetching queries and seeding the cache.\n\n<!-- TODO: ## Persistence via External Stores -->\n\n## Query Keys\n\nQuery Keys are typically used to perform advanced operations on the query such as: invalidation, refetching, prefetching, etc. \n\nWagmi exports Query Keys for every Composable, and they can be retrieved via the [Composable (Vue)](#composable-vue) or via an [Import (Vanilla JS)](#import-vanilla-js).\n\nRead more about **Query Keys** on the [TanStack Query docs.](https://tanstack.com/query/v5/docs/vue/guides/query-keys)\n\n### Composable (Vue)\n\nEach Composable returns a `queryKey` value. You would use this approach when you want to utilize the query key in a Vue component as it handles reactivity for you, unlike the [Import](#import-vanilla-js) method below.\n\n```vue [index.vue]\n<script setup lang=\"ts\">\nimport { useBalance } from '@wagmi/vue' // [!code hl]\n\nconst { data: balance } = useBalance() // [!code hl]\n</script>\n\n<template>\n  <div>{{ balance }}</div>\n</template>\n```\n\n### Import (Vanilla JS)\n\nEach Hook has a corresponding `get<X>QueryOptions` function that returns a query key. You would use this method when you want to utilize the query key outside of a Vue component in a Vanilla JS context, like in a utility function. \n\n```ts \nimport { getBalanceQueryOptions } from '@wagmi/vue/query' // [!code hl]\nimport { config } from './config'\n\nfunction perform() {\n  const { queryKey } = getBalanceQueryOptions(config, { // [!code hl]\n    chainId: config.state.chainId // [!code hl]\n  }) // [!code hl]\n}\n```\n\n::: warning\n\nThe caveat of this method is that it does not handle reactivity for you (e.g. active account/chain changes, argument changes, etc). You would need to handle this yourself by explicitly passing through the arguments to `get<X>QueryOptions`.\n\n:::\n\n## Invalidating Queries\n\nInvalidating a query is the process of marking the query data as stale (e.g. inactive/unused), and refetching the queries that are already rendered.\n\nRead more about **Invalidating Queries** on the [TanStack Query docs.](https://tanstack.com/query/v5/docs/vue/guides/query-invalidation)\n\n#### Example: Watching a Users' Balance\n\nYou may want to \"watch\" a users' balance, and invalidate the balance after each incoming block. We can invoke `invalidateQueries` inside a `watchEffect` – this will refetch all rendered balance queries when the `blockNumber` changes.\n\n```vue\n<script setup lang=\"ts\">\nimport { useQueryClient } from '@tanstack/vue-query' \nimport { useBlockNumber, useBalance } from '@wagmi/vue' \nimport { watchEffect } from 'vue' \n\nconst queryClient = useQueryClient()\nconst { data: blockNumber } = useBlockNumber({ watch: true }) // [!code hl]\nconst { data: balance, queryKey } = useBalance() // [!code hl]\n  \nwatchEffect(() => { // [!code hl]\n  queryClient.invalidateQueries({ queryKey }) // [!code hl]\n}) // [!code hl]\n</script>\n\n<template>\n  <div>Block Number: {{ blockNumber }}</div>\n  <div>Balance: {{ balance }}</div>\n</template>\n```\n\n#### Example: After User Interaction\n\nMaybe you want to invalidate a users' balance after some interaction. This would mark the balance as stale, and consequently refetch all rendered balance queries.\n\n```vue\n<script setup lang=\"ts\">\nimport { useBalance } from '@wagmi/vue'\n\n// 1. Extract `queryKey` from the useBalance Hook. // [!code hl]\nconst { queryKey } = useBalance() // [!code hl]\n</script>\n\n<template>\n  // 2. Add a button that invalidates the balance query. // [!code hl]\n  <button @click=\"queryClient.invalidateQueries({ queryKey })\"> // [!code hl]\n    Invalidate // [!code hl]\n  </button> // [!code hl]\n</template>\n```\n\n```vue\n<script setup lang=\"ts\">\n// 3. Other `useBalance` Hooks in your rendered Vue tree will be refetched! // [!code hl]\nconst { data: balance } = useBalance() // [!code hl]\n</script>\n\n<template>\n  <div>{{ balance }}</div>\n</template>\n```\n\n## Fetching Queries\n\nFetching a query is the process of invoking the query function to retrieve data. If the query exists and the data is not invalidated or older than a given `staleTime`, then the data from the cache will be returned. Otherwise, the query will fetch for the latest data.\n\n::: code-group\n```tsx [example.tsx]\nimport { getBlockQueryOptions } from '@wagmi/vue/query'\nimport { queryClient } from './main'\nimport { config } from './config'\n\nexport async function fetchBlockData() {\n  return queryClient.fetchQuery( // [!code hl]\n    getBlockQueryOptions(config, { // [!code hl]\n      chainId: config.state.chainId, // [!code hl]\n    } // [!code hl]\n  )) // [!code hl]\n}\n```\n<<< @/snippets/vue/main.ts[main.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Retrieving & Updating Query Data\n\nYou can retrieve and update query data imperatively with `getQueryData` and `setQueryData`. This is useful for scenarios where you want to retrieve or update a query outside of a Vue component.\n\nNote that these functions do not invalidate or refetch queries.\n\n::: code-group\n```tsx [example.tsx]\nimport type { GetBalanceReturnType } from '@wagmi/vue/actions'\nimport { getBalanceQueryOptions } from '@wagmi/vue/query'\nimport { queryClient } from './app'\nimport { config } from './config'\n\nexport function getBalanceData() {\n  return queryClient.getQueryData( // [!code hl]\n    getBalanceQueryOptions(config, { // [!code hl]\n      chainId: config.state.chainId, // [!code hl]\n    } // [!code hl]\n  )) // [!code hl]\n}\n\nexport function setBalanceData(parameters: Partial<GetBalanceReturnType>) {\n  return queryClient.setQueryData( // [!code hl]\n    getBalanceQueryOptions(config, { // [!code hl]\n      chainId: config.state.chainId, // [!code hl]\n    }, // [!code hl]\n    data => ({ ...data, ...parameters }) // [!code hl]\n  )) // [!code hl]\n}\n```\n<<< @/snippets/vue/main.ts[main.ts]\n<<< @/snippets/vue/config.ts[config.ts]\n:::\n\n## Prefetching Queries\n\nPrefetching a query is the process of fetching the data ahead of time and seeding the cache with the returned data. This is useful for scenarios where you want to fetch data before the user navigates to a page, or fetching data on the server to be reused on client hydration.\n\nRead more about **Prefetching Queries** on the [TanStack Query docs.](https://tanstack.com/query/v5/docs/vue/guides/prefetching)\n\n#### Example: Prefetching in Event Handler\n\n```vue\n<script setup lang=\"ts\">\nimport { useConfig, useChainId, useQueryClient } from '@wagmi/vue'\nimport { getBlockQueryOptions } from '@wagmi/vue/query'\n\nconst config = useConfig()\nconst chainId = useChainId()\nconst queryClient = useQueryClient()\n\nconst prefetch = () => \n  queryClient.prefetchQuery(getBlockQueryOptions(config, { chainId })) \n</script>\n\n<template>\n  <a\n    @mouseenter=\"prefetch\" \n    @focus=\"prefetch\" \n    href=\"...\"\n  >\n    Block details\n  </a>\n</template>\n```\n\n## SSR\n\nIt is possible to utilize TanStack Query's SSR strategies with Wagmi Composables & Query Keys. Check out the [SSR guide](https://tanstack.com/query/latest/docs/framework/vue/guides/ssr).\n\n## Devtools\n\nTanStack Query includes dedicated [Devtools](https://tanstack.com/query/latest/docs/framework/vue/devtools) that assist in visualizing and debugging your queries, their cache states, and much more. You will have to pass a custom `queryKeyFn` to your `QueryClient` for Devtools to correctly serialize BigInt values for display. Alternatively, You can use the `hashFn` from `@wagmi/core/query`, which already handles this serialization.\n\n#### Install\n\n::: code-group\n```bash [pnpm]\npnpm i @tanstack/vue-query-devtools\n```\n\n```bash [npm]\nnpm i @tanstack/vue-query-devtools\n```\n\n```bash [yarn]\nyarn add @tanstack/vue-query-devtools\n```\n\n```bash [bun]\nbun i @tanstack/vue-query-devtools\n```\n:::\n\n#### Usage\n\n::: code-group\n```vue [App.vue]\n<script setup>\nimport { VueQueryDevtools } from '@tanstack/vue-query-devtools'\n</script>\n\n<template>\n  <VueQueryDevtools />\n</template>\n```\n\n```vue [main.vue]\n<script setup lang=\"ts\">\nimport { createApp } from 'vue'\nimport { WagmiPlugin } from '@wagmi/vue'\nimport { QueryClient, VueQueryPlugin } from '@tanstack/vue-query'\n\nimport App from './App.vue'\nimport { config } from './config' \n\nconst queryClient = new QueryClient({ // [!code hl]\n  defaultOptions: { // [!code hl]\n    queries: { // [!code hl]\n      queryKeyHashFn: hashFn, // [!code hl]\n    }, // [!code hl]\n  }, // [!code hl]\n}) // [!code hl]\n\ncreateApp(App)\n  .use(WagmiPlugin, { config })\n  .use(VueQueryPlugin, { queryClient }) // [!code hl]\n  .mount('#app')\n</script>\n```\n:::\n"
  },
  {
    "path": "site/vue/guides/viem.md",
    "content": "# Viem\n\n[Viem](https://viem.sh) is a low-level TypeScript Interface for Ethereum that enables developers to interact with the Ethereum blockchain, including: JSON-RPC API abstractions, Smart Contract interaction, wallet & signing implementations, coding/parsing utilities and more.\n\n**Wagmi Core** is essentially a wrapper over **Viem** that provides multi-chain functionality via [Wagmi Config](/react/api/createConfig) and automatic account management via [Connectors](/react/api/connectors).\n\n## Leveraging Viem Actions\n\nAll of the core [Wagmi Composables](/vue/api/composables) are friendly wrappers around [Viem Actions](https://viem.sh/docs/actions/public/introduction) that inject a multi-chain and connector aware [Wagmi Config](/vue/api/createConfig).\n\nThere may be cases where you might want to dig deeper and utilize Viem Actions directly (maybe a Composable doesn't exist in Wagmi yet). In these cases, you can create your own custom Wagmi Composable by importing Viem Actions directly via `viem/actions` and plugging in a Viem Client returned by the [`useClient` Composable](/vue/api/composables/useClient).\n\nThere are two categories of Viem Actions:\n\n- **[Public Actions](https://viem.sh/docs/actions/public/introduction):** Actions that are \"read-only\" and do not require a wallet connection.\n- **[Wallet Actions](https://viem.sh/docs/actions/wallet/introduction):** Actions that interface with a Wallet and require a wallet connection.\n\nWhile it is not mandatory, it is also recommended to pair Actions with either `useQuery` or `useMutation` to effectively leverage the reactivity and caching capabilities of [Tanstack Query](/vue/guides/tanstack-query).\n\n### Public Actions\n\nThe example below demonstrates how to utilize Viem's `getLogs` Action with a `useQuery` Composable to create your own abstraction akin to a `useLogs` Composable.\n\n```vue\n<script setup lang=\"ts\">\n// 1. Import modules. \nimport { useClient, useConnectorClient } from '@wagmi/vue' \nimport { useMutation, useQuery } from '@wagmi/vue/query'\nimport { getLogs, watchAsset } from 'viem/actions'\n\n// 2. Extract a Viem Client for the current active chain. \nconst client = useClient() \n\n// 3. Create a \"custom\" Query Composable that utilizes the Client. \nconst { data: logs } = useQuery( \n  computed(() => ({ \n    queryKey: ['logs', client.value.uid], \n    queryFn: () => getLogs(client.value) \n  })) \n) \n</script>\n```\n\n### Wallet Actions\n\nThe example below demonstrates how to utilize Viem's `watchAsset` Action with a `useMutation` Composable to create your own abstraction akin to a `useWatchAsset` Composable.\n\n```vue\n<script setup lang=\"ts\">\n// 1. Import modules. \nimport { useConnectorClient } from '@wagmi/vue' \nimport { useMutation } from '@wagmi/vue/query'\nimport { watchAsset } from 'viem/actions'\n\n// 2. Extract a Viem Client for the current active chain. \nconst { data: connectorClient } = useConnectorClient()\n\n// 3. Create a \"custom\" Mutation Composable that utilizes the Client. \nconst { mutate } = useMutation({\n  mutationFn: (asset) => watchAsset(connectorClient, asset)\n})\n</script>\n```\n\n## Private Key & Mnemonic Accounts\n\nIt 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.\n\n```vue\n<script setup lang=\"ts\">\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { useConfig } from '@wagmi/vue'\nimport { sendTransactionMutationOptions, useMutation } from '@wagmi/vue/query'\n\nconst config = useConfig()\nconst { mutate: sendTransaction } = useMutation(\n  sendTransactionMutationOptions(config)\n)\n\nconst account = privateKeyToAccount('0x...') // [!code hl]\n\nsendTransaction({\n  account, // [!code hl]\n  to: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n  value: parseEther('0.001')\n})\n</script>\n```\n\n::: info\n\nWagmi currently does not support hoisting Private Key & Mnemonic Accounts to the top-level Wagmi Config – meaning you have to explicitly pass through the account to every Action. If you feel like this is a feature that should be added, please [open an discussion](https://github.com/wevm/wagmi/discussions/new?category=ideas).\n\n:::\n"
  },
  {
    "path": "site/vue/guides/write-to-contract.md",
    "content": "# Write to Contract\n\nThe [`useWriteContract` Composable](/vue/api/composables/useWriteContract) allows you to mutate data on a smart contract, from a `payable` or `nonpayable` (write) function. These types of functions require gas to be executed, hence a transaction is broadcasted in order to change the state.\n\nIn the guide below, we will teach you how to implement a \"Mint NFT\" form that takes in a dynamic argument (token ID) using Wagmi. The example below builds on the [Connect Wallet guide](/vue/guides/connect-wallet) and uses the [useWriteContract](/vue/api/composables/useWriteContract) & [useWaitForTransactionReceipt](/vue/api/composables/useWaitForTransactionReceipt) composables. \n\nIf you have already completed the [Sending Transactions guide](/vue/guides/send-transaction), this guide will look very similar! That's because writing to a contract internally broadcasts & sends a transaction.\n\n## Example\n\nFeel free to check out the example before moving on:\n\n<iframe frameborder=\"0\" width=\"100%\" height=\"500px\" src=\"https://stackblitz.com/edit/vitejs-vite-knyxah?embed=1&file=src%2FApp.tsx&hideExplorer=1&view=preview\"></iframe>\n\n## Steps\n\n### 1. Connect Wallet\n\nFollow the [Connect Wallet guide](/vue/guides/connect-wallet) guide to get this set up.\n\n### 2. Create a new component\n\nCreate your `MintNft` component that will contain the Mint NFT logic.\n\n::: code-group\n\n```vue [MintNft.vue]\n<script setup lang=\"ts\">\n</script>\n \n<template>\n  <form>\n    <input name=\"tokenId\" placeholder=\"69420\" required />\n    <button type=\"submit\">Mint</button>\n  </form>\n</template>\n```\n\n:::\n\n### 3. Add a form handler\n\nNext, we will need to add a handler to the form that will send the transaction when the user hits \"Mint\". This will be a basic handler in this step.\n\n::: code-group\n\n```vue [MintNft.vue]\n<script setup lang=\"ts\">\nfunction submit(event: Event) { // [!code ++]\n  const formData = new FormData(e.target as HTMLFormElement) // [!code ++]\n  const tokenId = formData.get('tokenId') as string // [!code ++]\n} // [!code ++]\n</script>\n\n<template\n  <form> // [!code --]\n  <form @submit.prevent=\"submit\"> // [!code ++]\n    <input name=\"tokenId\" placeholder=\"69420\" required />\n    <button type=\"submit\">Mint</button>\n  </form>\n</template>\n```\n\n:::\n\n### 4. Hook up the `useWriteContract` Composable\n\nNow that we have the form handler, we can hook up the [`useWriteContract` Composable](/vue/api/composables/useWriteContract) to send the transaction.\n\n::: code-group\n\n```vue [MintNft.vue]\n<script setup lang=\"ts\">\nimport { useWriteContract } from 'wagmi' // [!code ++]\nimport { abi } from './abi' // [!code ++]\n\nconst { data: hash, writeContract } = useWriteContract() // [!code ++]\n\nfunction submit(event: Event) { \n  const formData = new FormData(e.target as HTMLFormElement) \n  const tokenId = formData.get('tokenId') as string \n  writeContract({ // [!code ++]\n    address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2', // [!code ++]\n    abi, // [!code ++]\n    functionName: 'mint', // [!code ++]\n    args: [BigInt(tokenId)], // [!code ++]\n  }) // [!code ++]\n} \n</script>\n\n<template\n  <form @submit.prevent=\"submit\"> \n    <input name=\"tokenId\" placeholder=\"69420\" required />\n    <button type=\"submit\">Mint</button>\n    <div v-if=\"hash\">Transaction Hash: {{ hash }}</div> // [!code ++]\n  </form>\n</template>\n```\n\n```ts [abi.ts]\nexport const abi = [\n  {\n    name: 'mint',\n    type: 'function',\n    stateMutability: 'nonpayable',\n    inputs: [{ internalType: 'uint32', name: 'tokenId', type: 'uint32' }],\n    outputs: [],\n  },\n] as const\n```\n\n:::\n\n### 5. Add loading state (optional)\n\nWe can optionally add a loading state to the \"Mint\" button while we are waiting confirmation from the user's wallet.\n\n::: code-group\n\n```vue [MintNft.vue]\n<script setup lang=\"ts\">\nimport { useWriteContract } from 'wagmi'\nimport { abi } from './abi'\n\nconst { \n  data: hash, \n  isPending, // [!code ++]\n  writeContract \n} = useWriteContract()\n\nfunction submit(event: Event) { \n  const formData = new FormData(e.target as HTMLFormElement) \n  const tokenId = formData.get('tokenId') as string \n  writeContract({\n    address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n    abi,\n    functionName: 'mint',\n    args: [BigInt(tokenId)],\n  })\n} \n</script>\n\n<template\n  <form @submit.prevent=\"submit\"> \n    <input name=\"tokenId\" placeholder=\"69420\" required />\n    <button :disabled=\"isPending\" type=\"submit\"> // [!code ++]\n      <span v-if=\"isPending\">Sending...</span> // [!code ++]\n      <span v-else>Send</span> // [!code ++]\n    </button>\n    <div v-if=\"hash\">Transaction Hash: {{ hash }}</div>\n  </form>\n</template>\n```\n\n```ts [abi.ts]\nexport const abi = [\n  {\n    name: 'mint',\n    type: 'function',\n    stateMutability: 'nonpayable',\n    inputs: [{ internalType: 'uint32', name: 'tokenId', type: 'uint32' }],\n    outputs: [],\n  },\n] as const\n```\n\n:::\n\n### 6. Wait for transaction receipt (optional)\n\nWe can also display the transaction confirmation status to the user by using the [`useWaitForTransactionReceipt` Composable](/vue/api/composables/useWaitForTransactionReceipt). \n\n::: code-group\n\n```vue [MintNft.vue]\n<script setup lang=\"ts\">\nimport { \n  useWaitForTransactionReceipt, // [!code ++]\n  useWriteContract \n} from 'wagmi'\nimport { abi } from './abi'\n\nconst { \n  data: hash, \n  isPending,\n  writeContract \n} = useWriteContract()\n\nfunction submit(event: Event) { \n  const formData = new FormData(e.target as HTMLFormElement) \n  const tokenId = formData.get('tokenId') as string \n  writeContract({\n    address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n    abi,\n    functionName: 'mint',\n    args: [BigInt(tokenId)],\n  })\n} \n\nconst { isLoading: isConfirming, isSuccess: isConfirmed } = // [!code ++]\n  useWaitForTransactionReceipt({ // [!code ++]\n    hash, // [!code ++]\n  }) // [!code ++]\n</script>\n\n<template\n  <form @submit.prevent=\"submit\"> \n    <input name=\"tokenId\" placeholder=\"69420\" required />\n    <button :disabled=\"isPending\" type=\"submit\">\n      <span v-if=\"isPending\">Sending...</span>\n      <span v-else>Send</span>\n    </button>\n    <div v-if=\"hash\">Transaction Hash: {{ hash }}</div>\n    <div v-if=\"isConfirming\">Waiting for confirmation...</div> // [!code ++]\n    <div v-if=\"isConfirmed\">Transaction Confirmed!</div> // [!code ++]\n  </form>\n</template>\n```\n\n```ts [abi.ts]\nexport const abi = [\n  {\n    name: 'mint',\n    type: 'function',\n    stateMutability: 'nonpayable',\n    inputs: [{ internalType: 'uint32', name: 'tokenId', type: 'uint32' }],\n    outputs: [],\n  },\n] as const\n```\n\n:::\n\n### 7. Handle errors (optional)\n\nIf the user rejects the transaction, or the user does not have enough funds to cover the transaction, we can display an error message to the user.\n\n::: code-group\n\n```vue [MintNft.vue]\n<script setup lang=\"ts\">\nimport { \n  useWaitForTransactionReceipt,\n  useWriteContract \n} from 'wagmi'\nimport { abi } from './abi'\n\nconst { \n  data: hash,\n  error, // [!code ++] \n  isPending,\n  writeContract \n} = useWriteContract()\n\nfunction submit(event: Event) { \n  const formData = new FormData(e.target as HTMLFormElement) \n  const tokenId = formData.get('tokenId') as string \n  writeContract({\n    address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n    abi,\n    functionName: 'mint',\n    args: [BigInt(tokenId)],\n  })\n} \n\nconst { isLoading: isConfirming, isSuccess: isConfirmed } =\n  useWaitForTransactionReceipt({\n    hash,\n  })\n</script>\n\n<template\n  <form @submit.prevent=\"submit\"> \n    <input name=\"tokenId\" placeholder=\"69420\" required />\n    <button :disabled=\"isPending\" type=\"submit\">\n      <span v-if=\"isPending\">Sending...</span>\n      <span v-else>Send</span>\n    </button>\n    <div v-if=\"hash\">Transaction Hash: {{ hash }}</div>\n    <div v-if=\"isConfirming\">Waiting for confirmation...</div>\n    <div v-if=\"isConfirmed\">Transaction Confirmed!</div>\n    <div v-if=\"error\"> // [!code ++]\n      Error: {{ (error as BaseError).shortMessage || error.message }} // [!code ++]\n    </div> // [!code ++]\n  </form>\n</template>\n```\n\n```ts [abi.ts]\nexport const abi = [\n  {\n    name: 'mint',\n    type: 'function',\n    stateMutability: 'nonpayable',\n    inputs: [{ internalType: 'uint32', name: 'tokenId', type: 'uint32' }],\n    outputs: [],\n  },\n] as const\n```\n\n:::\n\n### 8. Wire it up!\n\nFinally, we can wire up our Send Transaction component to our application's entrypoint.\n\n:::code-group\n```vue [App.vue]\n<script setup lang=\"ts\">\nimport { useConnection } from '@wagmi/vue'\nimport Connection from './Connection.vue'\nimport Connect from './Connect.vue'\nimport MintNft from './MintNft.vue' // [!code ++]\n\nconst { isConnected } = useConnection()\n</script>\n\n<template>\n  <Connection v-if=\"isConnected\" />\n  <Connect v-else />\n  <MintNft v-if=\"isConnected\" /> // [!code ++]\n</template>\n```\n\n```vue [MintNft.vue]\n<script setup lang=\"ts\">\nimport { \n  useWaitForTransactionReceipt,\n  useWriteContract \n} from 'wagmi'\nimport { abi } from './abi'\n\nconst { \n  data: hash,\n  error, \n  isPending,\n  writeContract \n} = useWriteContract()\n\nfunction submit(event: Event) { \n  const formData = new FormData(e.target as HTMLFormElement) \n  const tokenId = formData.get('tokenId') as string \n  writeContract({\n    address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n    abi,\n    functionName: 'mint',\n    args: [BigInt(tokenId)],\n  })\n} \n\nconst { isLoading: isConfirming, isSuccess: isConfirmed } =\n  useWaitForTransactionReceipt({\n    hash,\n  })\n</script>\n\n<template\n  <form @submit.prevent=\"submit\"> \n    <input name=\"tokenId\" placeholder=\"69420\" required />\n    <button :disabled=\"isPending\" type=\"submit\">\n      <span v-if=\"isPending\">Sending...</span>\n      <span v-else>Send</span>\n    </button>\n    <div v-if=\"hash\">Transaction Hash: {{ hash }}</div>\n    <div v-if=\"isConfirming\">Waiting for confirmation...</div>\n    <div v-if=\"isConfirmed\">Transaction Confirmed!</div>\n    <div v-if=\"error\">\n      Error: {{ (error as BaseError).shortMessage || error.message }}\n    </div>\n  </form>\n</template>\n```\n\n```ts [abi.ts]\nexport const abi = [\n  {\n    name: 'mint',\n    type: 'function',\n    stateMutability: 'nonpayable',\n    inputs: [{ internalType: 'uint32', name: 'tokenId', type: 'uint32' }],\n    outputs: [],\n  },\n] as const\n```\n:::\n\n[See the Example.](#example)\n"
  },
  {
    "path": "site/vue/installation.md",
    "content": "<script setup>\nimport packageJson from '../../packages/vue/package.json'\nimport Browsers from '../components/Browsers.vue'\n\nconst docsPath = 'vue'\nconst packageDir = 'vue'\nconst packageName = '@wagmi/vue'\nconst viemVersion = packageJson.peerDependencies.viem\n</script>\n\n# Installation\n\nInstall Wagmi via your package manager, a `<script>` tag, or build from source.\n\n## Package Manager\n\nInstall the required packages.\n\n::: code-group\n```bash-vue [pnpm]\npnpm add @wagmi/vue viem@{{viemVersion}} @tanstack/vue-query\n```\n\n```bash-vue [npm]\nnpm install @wagmi/vue viem@{{viemVersion}} @tanstack/vue-query\n```\n\n```bash-vue [yarn]\nyarn add @wagmi/vue viem@{{viemVersion}} @tanstack/vue-query\n```\n\n```bash-vue [bun]\nbun add @wagmi/vue viem@{{viemVersion}} @tanstack/vue-query\n```\n:::\n\n- [Viem](https://viem.sh) is a TypeScript interface for Ethereum that performs blockchain operations.\n- [TanStack Query](https://tanstack.com/query/v5) is an async state manager that handles requests, caching, and more.\n- [TypeScript](/vue/typescript) is optional, but highly recommended. Learn more about [TypeScript support](/vue/typescript).\n\n<!--@include: @shared/installation.md-->\n"
  },
  {
    "path": "site/vue/typescript.md",
    "content": "<script setup>\nimport packageJson from '../../packages/vue/package.json'\n\nconst typescriptVersion = packageJson.peerDependencies.typescript\n</script>\n\n# TypeScript\n\n## Requirements\n\nWagmi is designed to be as type-safe as possible! Things to keep in mind:\n\n- Types currently require using TypeScript {{typescriptVersion}}.\n- [TypeScript doesn't follow semver](https://www.learningtypescript.com/articles/why-typescript-doesnt-follow-strict-semantic-versioning) and often introduces breaking changes in minor releases.\n- Changes to types in this repository are considered non-breaking and are usually released as patch changes (otherwise every type enhancement would be a major version!).\n- It is highly recommended that you lock your `wagmi` and `typescript` versions to specific patch releases and upgrade with the expectation that types may be fixed or upgraded between any release.\n- The non-type-related public API of Wagmi still follows semver very strictly.\n\nTo ensure everything works correctly, make sure your `tsconfig.json` has [`strict`](https://www.typescriptlang.org/tsconfig#strict) mode set to `true`.\n\n::: code-group\n```json [tsconfig.json]\n{\n  \"compilerOptions\": {\n    \"strict\": true\n  }\n}\n```\n:::\n\n## Config Types\n\nBy default Vue Plugins does not work well with type inference. To support strong type-safety across the Vue Plugins boundary, there are two options available:\n\n- Declaration merging to \"register\" your `config` globally with TypeScript.\n- `config` property to pass your `config` directly to composables.\n\n### Declaration Merging\n\n[Declaration merging](https://www.typescriptlang.org/docs/handbook/declaration-merging.html) allows you to \"register\" your `config` globally with TypeScript. The `Register` type enables Wagmi to infer types in places that wouldn't normally have access to type info via a Vue Plugin alone. \n\nTo set this up, add the following declaration to your project. Below, we co-locate the declaration merging and the `config` set up.\n\n```ts\nimport { createConfig, http } from '@wagmi/vue'\nimport { mainnet, sepolia } from 'wagmi/chains'\n\ndeclare module '@wagmi/vue' { // [!code focus]\n  interface Register { // [!code focus]\n    config: typeof config // [!code focus]\n  } // [!code focus]\n} // [!code focus]\n\nexport const config = createConfig({\n  chains: [mainnet, sepolia],\n  transports: {\n    [mainnet.id]: http(),\n    [sepolia.id]: http(),\n  },\n})\n```\n\nSince the `Register` type is global, you only need to add it once in your project. Once set up, you will get strong type-safety across your entire project. For example, query composables will type `chainId` based on your `config`'s `chains`. \n\n```ts twoslash\n// @twoslash-cache: {\"v\":1,\"hash\":\"21ee40fb2fb12112e58ba8b16f5d7f9ef29efdee74e4bd47b38d17e1aa2e8800\",\"data\":\"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\"}\n// @errors: 2322\nimport { type Config } from '@wagmi/vue'\nimport { mainnet, sepolia } from 'wagmi/chains'\n\ndeclare module '@wagmi/vue' {\n  interface Register {\n    config: Config<readonly [typeof mainnet, typeof sepolia]>\n  }\n}\n// ---cut---\nimport { useBlockNumber } from '@wagmi/vue'\n\nuseBlockNumber({ chainId: 123 })\n```\n\nYou just saved yourself a runtime error and you didn't even need to pass your `config`. 🎉\n\n### Hook `config` Property\n\nFor cases where you have more than one Wagmi `config` or don't want to use the declaration merging approach, you can pass a specific `config` directly to composables via the `config` property.\n\n```ts\nimport { createConfig, http } from '@wagmi/vue'\nimport { mainnet, optimism } from '@wagmi/vue/chains'\n\nexport const configA = createConfig({ // [!code focus]\n  chains: [mainnet], // [!code focus]\n  transports: { // [!code focus]\n    [mainnet.id]: http(), // [!code focus]\n  }, // [!code focus]\n}) // [!code focus]\n\nexport const configB = createConfig({ // [!code focus]\n  chains: [optimism], // [!code focus]\n  transports: { // [!code focus]\n    [optimism.id]: http(), // [!code focus]\n  }, // [!code focus]\n}) // [!code focus]\n```\n\nAs you expect, `chainId` is inferred correctly for each `config`.\n\n```ts twoslash\n// @twoslash-cache: {\"v\":1,\"hash\":\"9b5b0298b470a179bc3ea33df03ba8ced7d88ec92e62fe07acf70060b35435dd\",\"data\":\"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\"}\n// @errors: 2322\nimport { type Config } from '@wagmi/vue'\nimport { mainnet, optimism } from '@wagmi/vue/chains'\n\ndeclare const configA: Config<readonly [typeof mainnet]>\ndeclare const configB: Config<readonly [typeof optimism]>\n// ---cut---\nimport { useBlockNumber } from '@wagmi/vue'\n\nuseBlockNumber({ chainId: 123, config: configA })\nuseBlockNumber({ chainId: 123, config: configB })\n```\n\nThis approach is more explicit, but works well for advanced use-cases, if you don't want to use a Vue Plugin or declaration merging, etc.\n\n## Const-Assert ABIs & Typed Data\n\nWagmi can infer types based on [ABIs](https://docs.soliditylang.org/en/latest/abi-spec.html#json) and [EIP-712](https://eips.ethereum.org/EIPS/eip-712) Typed Data definitions, powered by [Viem](https://viem.sh) and [ABIType](https://github.com/wevm/abitype). This achieves full end-to-end type-safety from your contracts to your frontend and enlightened developer experience by autocompleting ABI item names, catching misspellings, inferring argument and return types (including overloads), and more.\n\nFor this to work, you must either [const-assert](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions) ABIs and Typed Data (more info below) or define them inline. For example, `useReadContract`'s `abi` configuration parameter:\n\n```ts\nconst { data } = useReadContract({\n  abi: […], // <--- defined inline // [!code focus]\n})\n```\n\n```ts\nconst abi = […] as const // <--- const assertion // [!code focus]\nconst { data } = useReadContract({ abi })\n```\n\nIf type inference isn't working, it's likely you forgot to add a `const` assertion or define the configuration parameter inline. Also, make sure your ABIs, Typed Data definitions, and [TypeScript configuration](#requirements) are valid and set up correctly.\n\n::: tip\nUnfortunately [TypeScript doesn't support importing JSON `as const` yet](https://github.com/microsoft/TypeScript/issues/32063). Check out the [Wagmi CLI](/cli/getting-started) to help with this! It can automatically fetch ABIs from Etherscan and other block explorers, resolve ABIs from your Foundry/Hardhat projects, generate Vue Composables, and more.\n:::\n\nAnywhere you see the `abi` or `types` configuration property, you can likely use const-asserted or inline ABIs and Typed Data to get type-safety and inference. These properties are also called out in the docs.\n\nHere's what [`useReadContract`](/vue/api/composables/useReadContract) looks like with and without a const-asserted `abi` property.\n\n::: code-group\n```ts twoslash [Const-Asserted]\n// @twoslash-cache: {\"v\":1,\"hash\":\"c81ecea55f2b27ad2c18ae6e5fc3ad6aed33ef72a35b2bb465243c2101cb267c\",\"data\":\"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\"}\nconst erc721Abi = [\n  {\n    name: 'balanceOf',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [{ type: 'address', name: 'owner' }],\n    outputs: [{ type: 'uint256' }],\n  },\n  {\n    name: 'isApprovedForAll',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [\n      { type: 'address', name: 'owner' },\n      { type: 'address', name: 'operator' },\n    ],\n    outputs: [{ type: 'bool' }],\n  },\n  {\n    name: 'getApproved',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [{ type: 'uint256', name: 'tokenId' }],\n    outputs: [{ type: 'address' }],\n  },\n  {\n    name: 'ownerOf',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [{ type: 'uint256', name: 'tokenId' }],\n    outputs: [{ type: 'address' }],\n  },\n  {\n    name: 'tokenURI',\n    type: 'function',\n    stateMutability: 'pure',\n    inputs: [{ type: 'uint256', name: 'tokenId' }],\n    outputs: [{ type: 'string' }],\n  },\n] as const\n// ---cut---\nimport { useReadContract } from '@wagmi/vue'\n\nconst { data } = useReadContract({\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  abi: erc721Abi,\n  functionName: 'balanceOf',\n  // ^?\n\n\n\n  args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],\n  // ^?\n})\n\ndata\n// ^?\n```\n```ts twoslash [Not Const-Asserted]\n// @twoslash-cache: {\"v\":1,\"hash\":\"fd8f5c57d72097f21d1a246c1505fe478b32857ce6eeba0f9c882f247122d11d\",\"data\":\"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=\"}\ndeclare const erc721Abi: {\n  name: string;\n  type: string;\n  stateMutability: string;\n  inputs: {\n    type: string;\n    name: string;\n  }[];\n  outputs: {\n    type: string;\n  }[];\n}[]\n// ---cut---\nimport { useReadContract } from '@wagmi/vue'\n\nconst { data } = useReadContract({\n  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n  abi: erc721Abi,\n  functionName: 'balanceOf',\n  // ^?\n\n\n\n  args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],\n  // ^?\n})\n\ndata\n// ^?\n```\n:::\n\n<br/>\n<br/>\n\nYou can prevent runtime errors and be more productive by making sure your ABIs and Typed Data definitions are set up appropriately. 🎉\n\n```ts twoslash\n// @twoslash-cache: {\"v\":1,\"hash\":\"a8bdf07964e5e57f195e43b7354ec3ed1fdcf454f5eca95c72e560cff7e4b73d\",\"data\":\"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\"}\n// @errors: 2820\nconst erc721Abi = [\n  {\n    name: 'balanceOf',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [{ type: 'address', name: 'owner' }],\n    outputs: [{ type: 'uint256' }],\n  },\n  {\n    name: 'isApprovedForAll',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [\n      { type: 'address', name: 'owner' },\n      { type: 'address', name: 'operator' },\n    ],\n    outputs: [{ type: 'bool' }],\n  },\n  {\n    name: 'getApproved',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [{ type: 'uint256', name: 'tokenId' }],\n    outputs: [{ type: 'address' }],\n  },\n  {\n    name: 'ownerOf',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [{ type: 'uint256', name: 'tokenId' }],\n    outputs: [{ type: 'address' }],\n  },\n  {\n    name: 'tokenURI',\n    type: 'function',\n    stateMutability: 'pure',\n    inputs: [{ type: 'uint256', name: 'tokenId' }],\n    outputs: [{ type: 'string' }],\n  },\n] as const\n// ---cut---\nimport { useReadContract } from '@wagmi/vue'\n\nuseReadContract({\n  abi: erc721Abi,\n  functionName: 'balanecOf',\n})\n```\n\n## Configure Internal Types\n\nFor advanced use-cases, you may want to configure Wagmi's internal types. Most of Wagmi's types relating to ABIs and EIP-712 Typed Data are powered by [ABIType](https://github.com/wevm/abitype). See the [ABIType docs](https://abitype.dev) for more info on how to configure types.\n"
  },
  {
    "path": "site/vue/why.md",
    "content": "# Why Wagmi\n\n## The Problems\n\nBuilding Ethereum applications is hard. Apps need to support connecting wallets, multiple chains, signing messages and data, sending transactions, listening for events and state changes, refreshing stale blockchain data, and much more. This is all on top of solving for app-specific use-cases and providing polished user experiences.\n\nThe ecosystem is also continuously evolving, meaning you need to adapt to new improvements or get left behind. App developers should not need to worry about connecting tens of different wallets, the intricacies of multi-chain support, typos accidentally sending an order of magnitude more ETH or calling a misspelled contract function, or accidentally spamming their RPC provider, costing thousands in compute units.\n\nWagmi solves all these problems and more — allowing app developers to focus on building high-quality and performant experiences for Ethereum — by focusing on **developer experience**, **performance**, **feature coverage**, and **stability.**\n\n## Developer Experience\n\nWagmi delivers a great developer experience through modular and composable APIs, automatic type safety and inference, and comprehensive documentation.\n\nIt provides developers with intuitive building blocks to build their Ethereum apps. While Wagmi's APIs might seem more verbose at first, it makes Wagmi's modular building blocks extremely flexible. Easy to move around, change, and remove. It also allows developers to better understand Ethereum concepts as well as understand _what_ and _why_ certain properties are being passed through. Learning how to use Wagmi is a great way to learn how to interact with Ethereum in general.\n\nWagmi also provides [strongly typed APIs](/vue/typescript), allowing consumers to get the best possible experience through [autocomplete](https://twitter.com/awkweb/status/1555678944770367493), [type inference](https://twitter.com/jakemoxey/status/1570244174502588417?s=20), as well as static validation. You often just need to provide an ABI and Wagmi can help you autocomplete your way to success, identify type errors before your users do, drill into blockchain errors [at compile and runtimes](/vue/guides/error-handling) with surgical precision, and much more.\n\nThe API documentation is comprehensive and contains usage info for _every_ module in Wagmi. The core team uses a [documentation](https://gist.github.com/zsup/9434452) and [test driven](https://en.wikipedia.org/wiki/Test-driven_development#:~:text=Test%2Ddriven%20development%20(TDD),software%20against%20all%20test%20cases.) development approach to building modules, which leads to predictable and stable APIs.\n\n## Performance\n\nPerformance is critical for applications on all sizes. Slow page load and interactions can cause users to stop using applications. Wagmi uses and is built by the same team behind [Viem](https://viem.sh), the most performant production-ready Ethereum library.\n\nEnd users should not be required to download a module of over 100kB in order to interact with Ethereum. Wagmi is optimized for tree-shaking and dead-code elimination, allowing apps to minimize bundle size for fast page load times. \n\nData layer performance is also critical. Slow, unnecessary, and manual data fetching can make apps unusable and cost thousands in RPC compute units. Wagmi supports caching, deduplication, persistence, and much more through [TanStack Query](/vue/guides/tanstack-query).\n\n## Feature Coverage\n\nWagmi supports the most popular and commonly-used Ethereum features out of the box with 40+ Vue Composables for accounts, wallets, contracts, transactions, signing, ENS, and more. Wagmi also supports just about any wallet out there through it's official [connectors](/vue/api/connectors), [EIP-6963 support](/vue/api/createConfig#multiinjectedproviderdiscovery), and [extensible API](/dev/creating-connectors).\n\nIf you need lower-level control, you can always drop down to [Wagmi Core](/core/getting-started) or [Viem](https://viem.sh), which Wagmi uses internally to perform blockchain operations. Wagmi also manages multi-chain support automatically so developers can focus on their applications instead of adding custom code.\n\nFinally, Wagmi has a [CLI](/cli/getting-started) to manage ABIs as well as a robust ecosystem of third-party libraries, like [ConnectKit](https://docs.family.co/connectkit), [Dynamic](https://www.dynamic.xyz), [Privy](https://privy.io), and many more, so you can get started quickly without needing to build everything from scratch.\n\n## Stability\n\nStability is a fundamental principle for Wagmi. Many organizations, large and small, rely heavily on Wagmi and expect it to be entirely stable for their users and applications.\n\nWagmi's test suite runs against forked Ethereum nodes to make sure functions work across chains. The test suite also runs type tests against many different versions of peer dependencies, like TypeScript, to ensure compatibility with the latest releases of other popular software.\n\nWagmi follows semver so developers can upgrade between versions with confidence. Starting with Wagmi v2, new functionality will be opt-in with old functionality being deprecated alongside the new features. This means upgrading to the latest major versions will not require immediate changes.\n\nLastly, the core team works full-time on Wagmi and [related projects](https://github.com/wevm), and is constantly improving Wagmi and keeping it up-to-date with industry trends and changes.\n\n"
  },
  {
    "path": "tsconfig.base.json",
    "content": "{\n  // This tsconfig file contains the shared config for the build (tsconfig.build.json) and type checking (tsconfig.json) config.\n  \"include\": [],\n  \"compilerOptions\": {\n    // Incremental builds\n    // NOTE: Enabling incremental builds speeds up `tsc`. Keep in mind though that it does not reliably bust the cache when the `tsconfig.json` file changes.\n    \"incremental\": true,\n\n    // Type checking\n    \"strict\": true,\n    // \"exactOptionalPropertyTypes\": true, // Enabled once supported in tanstack query https://github.com/TanStack/query/issues/7641\n    \"noFallthroughCasesInSwitch\": true, // Not enabled by default in `strict` mode.\n    \"noImplicitOverride\": true, // Not enabled by default in `strict` mode.\n    \"noImplicitReturns\": true, // Not enabled by default in `strict` mode.\n    \"noUncheckedIndexedAccess\": true,\n    \"noUnusedLocals\": true, // Not enabled by default in `strict` mode.\n    \"noUnusedParameters\": true, // Not enabled by default in `strict` mode.\n    \"useDefineForClassFields\": true, // Not enabled by default in `strict` mode unless we bump `target` to ES2022.\n    \"useUnknownInCatchVariables\": true,\n\n    // JavaScript support\n    \"allowJs\": false,\n    \"checkJs\": false,\n\n    // Interop constraints\n    \"forceConsistentCasingInFileNames\": true,\n    \"verbatimModuleSyntax\": true,\n\n    // Language and environment\n    \"moduleResolution\": \"NodeNext\",\n    \"module\": \"NodeNext\",\n    \"target\": \"ES2021\", // Setting this to `ES2021` enables native support for `Node v16+`: https://github.com/microsoft/TypeScript/wiki/Node-Target-Mapping.\n    \"lib\": [\n      \"ES2022\", // By using ES2022 we get access to the `.cause` property on `Error` instances.\n      \"DOM\" // We are adding `DOM` here to get the `fetch`, etc. types. This should be removed once these types are available via DefinitelyTyped.\n    ],\n\n    // Skip type checking for node modules\n    \"skipLibCheck\": true,\n    \"noErrorTruncation\": true\n  }\n}\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"extends\": \"./tsconfig.base.json\",\n  \"include\": [\"scripts/**/*.ts\", \"vitest.config.ts\"],\n  \"exclude\": []\n}\n"
  },
  {
    "path": "vitest.config.ts",
    "content": "import path from 'node:path'\nimport { playwright } from '@vitest/browser-playwright'\nimport reactFallbackThrottlePlugin from 'vite-plugin-react-fallback-throttle'\nimport solid from 'vite-plugin-solid'\nimport { defaultExclude, defineConfig } from 'vitest/config'\n\nconst alias = {\n  '@wagmi/connectors': path.resolve(\n    __dirname,\n    './packages/connectors/src/exports',\n  ),\n  '@wagmi/core': path.resolve(__dirname, './packages/core/src/exports'),\n  '@wagmi/test': path.resolve(__dirname, './packages/test/src/exports'),\n  '@wagmi/vue': path.resolve(__dirname, './packages/vue/src/exports'),\n  '@wagmi/solid': path.resolve(__dirname, './packages/solid/src/exports'),\n  wagmi: path.resolve(__dirname, './packages/react/src/exports'),\n}\n\nexport default defineConfig({\n  server: {\n    watch: {\n      ignored: ['**/templates/**'],\n    },\n  },\n  test: {\n    coverage: {\n      reporter: process.env.CI ? ['lcov'] : ['text', 'json', 'html'],\n      exclude: [\n        '**/dist/**',\n        '**/*.test.ts',\n        '**/*.test-d.ts',\n        'packages/cli/**',\n        'packages/test/**',\n        // ignore third-party connectors\n        'packages/connectors/**',\n        'packages/core/src/connectors/injected.ts',\n        'packages/core/src/tempo/**',\n        'packages/react/src/tempo/**',\n      ],\n    },\n    globalSetup: process.env.TYPES\n      ? ['./packages/test/src/setup.global.types.ts']\n      : ['./packages/test/src/setup.global.ts'],\n    projects: [\n      {\n        test: {\n          name: 'cli',\n          environment: 'node',\n          include: ['./packages/cli/src/**/*.test.ts'],\n          testTimeout: 20_000,\n          setupFiles: ['./packages/cli/test/setup.ts'],\n        },\n      },\n      {\n        test: {\n          name: 'connectors',\n          include: ['./packages/connectors/src/**/*.test.ts'],\n          environment: 'happy-dom',\n        },\n        resolve: { alias },\n      },\n      {\n        test: {\n          name: 'core',\n          include: [\n            ...(process.env.TYPES ? ['**/*.bench-d.ts'] : []),\n            './packages/core/src/**/*.test.ts',\n          ],\n          exclude: [\n            './packages/core/src/tempo/**/*.test.ts',\n            ...defaultExclude,\n          ],\n          environment: 'happy-dom',\n          testTimeout: 20_000,\n          setupFiles: ['./packages/core/test/setup.ts'],\n        },\n        resolve: { alias },\n      },\n      {\n        test: {\n          name: 'create-wagmi',\n          include: ['./packages/create-wagmi/src/**/*.test.ts'],\n          environment: 'node',\n          testTimeout: 20_000,\n        },\n      },\n      {\n        plugins: [reactFallbackThrottlePlugin()],\n        resolve: { alias },\n        test: {\n          name: 'tempo',\n          browser: {\n            enabled: true,\n            headless: true,\n            instances: [{ browser: 'chromium' }],\n            provider: playwright(),\n            screenshotFailures: false,\n          },\n          include: [\n            './packages/core/src/tempo/**/*.test.ts',\n            './packages/react/src/tempo/**/*.test.ts',\n          ],\n          fileParallelism: false,\n          hookTimeout: 20_000,\n          testTimeout: 30_000,\n          globalSetup: process.env.TYPES\n            ? ['./packages/test/src/setup.global.types.ts']\n            : ['./packages/test/src/tempo/setup.global.ts'],\n          setupFiles: ['./packages/test/src/tempo/setup.ts'],\n        },\n      },\n      {\n        plugins: [reactFallbackThrottlePlugin()],\n        resolve: { alias },\n        test: {\n          name: 'react',\n          browser: {\n            enabled: true,\n            headless: true,\n            instances: [{ browser: 'chromium' }],\n            provider: playwright(),\n            screenshotFailures: false,\n          },\n          include: ['./packages/react/src/**/*.test.ts?(x)'],\n          exclude: [\n            './packages/react/src/tempo/**/*.test.ts',\n            ...defaultExclude,\n          ],\n          testTimeout: 20_000,\n          setupFiles: ['./packages/react/test/setup.ts'],\n        },\n      },\n      {\n        test: {\n          name: 'vue',\n          include: ['./packages/vue/src/**/*.test.ts?(x)'],\n          environment: 'happy-dom',\n          testTimeout: 20_000,\n          setupFiles: ['./packages/vue/test/setup.ts'],\n        },\n        resolve: { alias },\n      },\n      {\n        plugins: [solid()],\n        resolve: { alias },\n        test: {\n          name: 'solid',\n          browser: {\n            enabled: true,\n            headless: true,\n            instances: [{ browser: 'chromium' }],\n            provider: playwright(),\n            screenshotFailures: false,\n          },\n          include: ['./packages/solid/src/**/*.test.ts?(x)'],\n          testTimeout: 20_000,\n          setupFiles: ['./packages/solid/test/setup.ts'],\n        },\n      },\n      {\n        test: {\n          name: 'test',\n          include: ['./packages/test/src/**/*.test.ts'],\n        },\n        resolve: { alias },\n      },\n    ],\n    setupFiles: ['./packages/test/src/setup.ts'],\n  },\n})\n"
  }
]