# Use Domino with Reown AppKit (/docs/build/reown)



If your app connects wallets with [Reown AppKit](https://reown.com/appkit), members can sign in to Domino with the wallet AppKit connected, including mobile wallets over WalletConnect. AppKit gives your server no token to check, so members sign Domino's own message instead: the signature signs them in and proves the wallet.

This is [wallet sign-in](/docs/build/wallets#sign-in-with-a-wallet), which Domino offers with its own [member sign-in](/docs/build/hosted-app#add-domino-participant-sign-in) in a Domino-hosted app. An app with its own login uses [app login](/docs/build/app-login) instead, and members link their AppKit wallets as in [step 3](#3-link-more-wallets).

## Before you start [#before-you-start]

* **Wallet sign-in on.** In Console, open **Settings → Sign-in** and check **EVM** under **Wallet sign-in**, plus **Solana** if AppKit connects Solana wallets. Each environment has its own setting.
* **AppKit set up.** Your app creates AppKit with its Reown project ID and the EVM or Solana adapter, as Reown's documentation shows.

## Connect AppKit [#connect-appkit]

### 1. Wrap the connected wallet in a signer [#1-wrap-the-connected-wallet-in-a-signer]

AppKit's `useAppKitProvider` returns the connected wallet's provider. An EVM provider is an EIP-1193 provider, so pass it to `evmSigner`. A Solana provider fits `solanaSigner` with a small wrapper:

```tsx
import {
  evmSigner,
  solanaSigner,
  type Eip1193Provider,
} from "@domino-sdk/relay/browser"

// From @reown/appkit/react: useAppKitProvider("eip155").walletProvider.
declare const evmProvider: Eip1193Provider

// From useAppKitProvider("solana").walletProvider.
declare const solanaProvider: {
  publicKey?: { toBase58(): string }
  signMessage(message: Uint8Array): Promise<Uint8Array>
}

export const evm = evmSigner(evmProvider, { name: "WalletConnect" })

export const solana = solanaSigner({
  connect: async () => ({ publicKey: solanaProvider.publicKey }),
  publicKey: solanaProvider.publicKey,
  signMessage: (message) => solanaProvider.signMessage(message),
})
```

AppKit opens its own modal to connect; call `open()` from `useAppKit()` first if `useAppKitAccount().isConnected` is false.

### 2. Sign in with it [#2-sign-in-with-it]

Pass the signer to `useSignIn().withWallet`. The member's wallet shows Domino's message for your app's domain, which states that it authorizes no transaction or transfer.

```tsx
import { useSignIn } from "@domino-sdk/relay/react"
import type { WalletSigner } from "@domino-sdk/relay"

export function SignInWithAppKit({ signer }: { signer: WalletSigner }) {
  const signIn = useSignIn()

  return (
    <>
      <button disabled={signIn.isPending} onClick={() => void signIn.withWallet(signer)}>
        Sign in with your wallet
      </button>
      {signIn.error && <p role="alert">{signIn.error.message}</p>}
    </>
  )
}
```

A new address creates a new member, and the same wallet signs them in again later. `RelayProvider` signs the member out when the EVM wallet switches to another account or disconnects, as [wallet sign-in](/docs/build/wallets#2-offer-the-sign-in-options) describes.

### 3. Link more wallets [#3-link-more-wallets]

A signed-in member links another wallet the same way, with `useWallets().link(signer)`. A wallet linked by signature is proved, so it appears in a leaderboard's [payout list](/docs/build/leaderboards#export-the-payout-list), and the wallet a member signed in with is in it too.

```tsx
import { useWallets } from "@domino-sdk/relay/react"
import type { WalletSigner } from "@domino-sdk/relay"

export function LinkWithAppKit({ signer }: { signer: WalletSigner }) {
  const { link, isPending, actionError } = useWallets()

  return (
    <>
      <button disabled={isPending} onClick={() => link(signer)}>
        Link this wallet
      </button>
      {actionError && <p role="alert">{actionError.message}</p>}
    </>
  )
}
```

A member can link 5 wallets per chain family, besides the ones they sign in with. Smart-contract wallets, such as Base Account (formerly Coinbase Smart Wallet), sign in and link this way too: Domino checks their signature [on the chain the wallet is on](/docs/build/wallets#limits).

### 4. Check it [#4-check-it]

* Connect a wallet with AppKit, sign in, and check that the app shows the member's Domino quests.
* Connect a phone wallet over WalletConnect and sign in with it.
* In Console, open the member's page and check that **Wallets** lists the wallet.

> [!NOTE] Not yet checked against a live AppKit app
> `evmSigner` uses `eth_requestAccounts`, `eth_chainId` and `personal_sign`, which EIP-1193 providers implement. The Solana wrapper follows AppKit's documented Solana provider (`publicKey` and `signMessage`); neither has been run against a live AppKit project.

## Where next [#where-next]

- [Wallets](/docs/build/wallets) — wallet quests, limits and what operators see.
- [Host your app](/docs/build/hosted-app) — Domino-hosted apps and their member sign-in.
