Are you an LLM? Read llms.txt for a summary of the docs, or llms-full.txt for the full context.
Skip to content

Wagmi Integration

The @jaw.id/wagmi package provides a Wagmi-compatible connector and React hooks for integrating JAW smart accounts into your dApp.

Installation

npm
npm install @jaw.id/wagmi wagmi viem @tanstack/react-query

Quick Start

1. Configure the Connector

import { createConfig, http } from 'wagmi';
import { mainnet, base, baseSepolia } from 'wagmi/chains';
import { jaw } from '@jaw.id/wagmi';
 
export const config = createConfig({
  chains: [mainnet, base, baseSepolia],
  connectors: [
    jaw({
      apiKey: 'YOUR_API_KEY',
      appName: 'My App',
      appLogoUrl: 'https://example.com/logo.png',
    }),
  ],
  transports: {
    [mainnet.id]: http(),
    [base.id]: http(),
    [baseSepolia.id]: http(),
  },
});

2. Set Up Providers

import { WagmiProvider } from 'wagmi';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
 
const queryClient = new QueryClient();
 
function App({ children }) {
  return (
    <WagmiProvider config={config}>
      <QueryClientProvider client={queryClient}>
        {children}
      </QueryClientProvider>
    </WagmiProvider>
  );
}

3. Use the Hooks

import { useAccount, useSendTransaction } from 'wagmi';
import { useConnect, useDisconnect } from '@jaw.id/wagmi';
 
function WalletButton() {
  const { address, isConnected } = useAccount();
  const { mutate: connect, isPending } = useConnect();
  const { mutate: disconnect } = useDisconnect();
 
  if (isConnected) {
    return (
      <div>
        <p>Connected: {address}</p>
        <button onClick={() => disconnect({})}>Disconnect</button>
      </div>
    );
  }
 
  return (
    <button onClick={() => connect({ connector: config.connectors[0] })} disabled={isPending}>
      {isPending ? 'Connecting...' : 'Connect Wallet'}
    </button>
  );
}

Standard Wagmi Hooks

All standard wagmi hooks work with the JAW connector. Use them directly from wagmi:

import {
  useAccount,
  useSendTransaction,
  useSignMessage,
  useSignTypedData,
  useSwitchChain,
  useSendCalls,
  useWriteContract,
  useBalance,
} from 'wagmi';
HookDescription
useAccountGet connected account address and status
useSendTransactionSend a single transaction
useSignMessageSign a personal message (EIP-191)
useSignTypedDataSign typed data (EIP-712)
useSwitchChainSwitch to a different chain
useSendCallsSend atomic batch transactions (EIP-5792)
useWriteContractCall a contract write function
useBalanceGet ETH or token balance

JAW Hooks

For JAW-specific features, import hooks directly from @jaw.id/wagmi:

// Direct import (recommended)
import { useConnect, useDisconnect, useGrantPermissions } from '@jaw.id/wagmi';
 
// Alternative: namespace import
import { Hooks } from '@jaw.id/wagmi';
const { mutate } = Hooks.useConnect();
HookDescription
useConnectConnect with optional capabilities (SIWE, subnames)
useDisconnectDisconnect and clean up session
useGrantPermissionsGrant permissions to a spender
usePermissionsQuery current permissions
useRevokePermissionsRevoke a permission
useGetAssetsQuery token balances across chains

Connector

FunctionDescription
jaw()Create a JAW connector for Wagmi

Why Use JAW Hooks?

useConnect vs wagmi's useConnect

Featurewagmi.useConnect@jaw.id/wagmi.useConnect
Basic connectionYesYes
Request SIWE signatureNoYes
Request subname issuanceNoYes
Uses wallet_connect RPCNoWhen capabilities provided

Use @jaw.id/wagmi's useConnect when you need capabilities like Sign-In with Ethereum or ENS subnames during connection.

useDisconnect vs wagmi's useDisconnect

Both work the same way. @jaw.id/wagmi's version is provided for consistency.

Actions (Non-React)

For vanilla JavaScript or other frameworks, use actions directly:

import { connect, disconnect, grantPermissions } from '@jaw.id/wagmi';
 
// Use with your wagmi config
await connect(config, { connector: jawConnector });

Related