# Signature Verification

For a Smart Wallet, a signature is valid if it is signed by a current signer (or "owner") of the wallet.

For instance, a user might sign a message using their passkey. When the `isValidSignature` function (defined in [EIP-1271](https://eips.ethereum.org/EIPS/eip-1271)) is called on their Smart Wallet, it validates the signature because the user's passkey is authorized as an owner.

The following section outlines how to implement both personal message signing and typed data signing using wagmi.

## Message Signing

For basic message signing (`personal_sign`), you can use wagmi's `useSignMessage` hook.

Here's an example implementation:

```tsx
import { useSignMessage } from 'wagmi'

function SignMessage() {
  const { signMessage, data: signature, isPending, error } = useSignMessage()

  const handlePersonalSign = () => {
    signMessage({ message: 'Hello World' })
  }

  return (
    <div>
      <button 
        onClick={handlePersonalSign}
        disabled={isPending}
      >
        {isPending ? 'Signing...' : 'Sign Message'}
      </button>
      
      {signature && (
        <div>
          <p>Signature: {signature}</p>
        </div>
      )}
      
      {error && <div>Error: {error.message}</div>}
    </div>
  )
}
```

## Typed Data Signing

For more complex signatures, you can use typed data signing (EIP-712) with wagmi's `useSignTypedData` hook:

```tsx
import { useSignTypedData } from 'wagmi'

function SignTypedData() {
  const { signTypedData, data: signature, isPending, error } = useSignTypedData()

  const types = {
    Mail: [
      {name: 'from', type: 'Person'},
      {name: 'to', type: 'Person'},
      {name: 'content', type: 'string'},
    ],
    Person: [
      {name: 'name', type: 'string'},
      {name: 'wallet', type: 'address'},
    ],
  }

  const handleTypedMessage = () => {
    signTypedData({
      domain: {
        chainId: 1, // Replace with your chain ID
        name: 'Example DApp',
        verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',
        version: '1',
      },
      types,
      message: {
        from: { name: 'Alice', wallet: '0x2111111111111111111111111111111111111111' },
        to: { name: 'Bob', wallet: '0x3111111111111111111111111111111111111111' },
        content: 'Hello!',
      },
      primaryType: 'Mail',
    })
  }

  return (
    <div>
      <button 
        onClick={handleTypedMessage}
        disabled={isPending}
      >
        {isPending ? 'Signing...' : 'Sign Typed Data'}
      </button>
      
      {signature && (
        <div>
          <p>Signature: {signature}</p>
        </div>
      )}
      
      {error && <div>Error: {error.message}</div>}
    </div>
  )
}
```

Both signing methods work seamlessly with Smart Contract Wallets that implement EIP-1271, allowing for a consistent signing experience across EOA and Smart Contract Wallets.
