> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dynamic.xyz/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Connecting and Verifying a Wallet

In Dynamic, we treat each chain (EVM, SOL, etc.) and each wallet app (or wallet provider) as a separate entity, and when connected/verified,
will create a separate wallet account.

There are 3 ways to connect and verify a wallet:

1. Connect and verify in a single SDK call

   In this case, the wallet account is only added to the wallet accounts list once it passes the verification step.

2. Connect without verifying

   In this case, the wallet account is added to the wallet accounts list as soon as the user accepts the connection, but it will only be persisted in the local session and not associated to a Dynamic user.

3. Verify a wallet account that has been connected but not verified before

   In this case, the wallet account remains in the wallet accounts list, no matter if the verification step is successful or not.

   The difference is that the wallet account will have a new `verifiedCredentialId` property, be persisted in the Dynamic server and associated to a Dynamic user.

## 1. Connect and verify a wallet in a single SDK call

<Note>
  On mobile, `connectAndVerifyWithWalletProvider` throws a `DeeplinkConnectAndVerifyUnsupportedError`
  for deep link wallet providers (e.g. Phantom redirect). This is because it triggers two sequential
  deep links and iOS will not honor the second one. Use options 2 and 3 below to connect and verify
  separately. See the [Phantom Redirect Extension docs](/javascript/reference/solana/phantom-redirect-extension#connect-and-verify-on-mobile)
  for a full example.
</Note>

<Tabs>
  <Tab title="JavaScript">
    ```javascript theme={"system"}
    import { connectAndVerifyWithWalletProvider } from '@dynamic-labs-sdk/client';

    const signInWithWallet = async (key) => {
      try {
        const walletAccount = await connectAndVerifyWithWalletProvider({ walletProviderKey: key });
        console.log(`Connected and verified: ${walletAccount.address}`);
      } catch (error) {
        console.error('Error connecting or verifying wallet: ', error);
      }
    };
    ```
  </Tab>

  <Tab title="React">
    ```tsx theme={"system"}
    import { useConnectAndVerifyWithWalletProvider } from '@dynamic-labs-sdk/react-hooks';

    function ConnectWalletButton({ walletProviderKey }: { walletProviderKey: string }) {
      // On success, `useGetWalletAccounts()` consumers re-render automatically.
      const { mutate: connectAndVerify, isPending, error } =
        useConnectAndVerifyWithWalletProvider();

      return (
        <>
          <button
            onClick={() => connectAndVerify({ walletProviderKey })}
            disabled={isPending}
          >
            {isPending ? 'Connecting…' : 'Connect'}
          </button>
          {error && <p>Error: {error.message}</p>}
        </>
      );
    }
    ```
  </Tab>
</Tabs>

## 2. Connect a wallet without verifying it

<Tabs>
  <Tab title="JavaScript">
    ```javascript theme={"system"}
    import { connectWithWalletProvider } from '@dynamic-labs-sdk/client';

    const signInWithWallet = async (key) => {
      try {
        const walletAccount = await connectWithWalletProvider({ walletProviderKey: key });
        console.log(`Connected: ${walletAccount.address}`);
      } catch (error) {
        console.error('Error connecting wallet: ', error);
      }
    };
    ```
  </Tab>

  <Tab title="React">
    ```tsx theme={"system"}
    import { useConnectWithWalletProvider } from '@dynamic-labs-sdk/react-hooks';

    function ConnectButton({ walletProviderKey }: { walletProviderKey: string }) {
      // `data` is the connected (session-only, unverified) wallet account.
      const { mutate: connect, data, isPending } = useConnectWithWalletProvider();

      return (
        <button onClick={() => connect({ walletProviderKey })} disabled={isPending}>
          {data ? `Connected: ${data.address}` : 'Connect'}
        </button>
      );
    }
    ```
  </Tab>
</Tabs>

## 3. Verify a connected wallet account

You can use this function to verify a wallet account that was connected but not verified before.

<Tabs>
  <Tab title="JavaScript">
    ```javascript theme={"system"}
    import { verifyWalletAccount } from '@dynamic-labs-sdk/client';

    const verifyWallet = async (walletAccount) => {
      try {
        const verified = await verifyWalletAccount({ walletAccount });
        console.log(`Verified: ${verified.address}`);
      } catch (error) {
        console.error('Error verifying wallet: ', error);
      }
    };
    ```
  </Tab>

  <Tab title="React">
    ```tsx theme={"system"}
    import { type WalletAccount } from '@dynamic-labs-sdk/client';
    import { useVerifyWalletAccount } from '@dynamic-labs-sdk/react-hooks';

    function VerifyButton({ walletAccount }: { walletAccount: WalletAccount }) {
      const { mutate: verifyWalletAccount, isPending } = useVerifyWalletAccount();

      return (
        <button
          onClick={() => verifyWalletAccount({ walletAccount })}
          disabled={isPending}
        >
          {isPending ? 'Verifying…' : 'Verify wallet'}
        </button>
      );
    }
    ```
  </Tab>
</Tabs>

## Hardware wallet connections

Both `connectWithWalletProvider` and `connectAndVerifyWithWalletProvider` accept an optional
`hardwareWalletVendor` parameter to connect via a hardware wallet (e.g., Ledger) through a
compatible software wallet:

```javascript theme={"system"}
import {
  getAvailableWalletsToConnect,
  canConnectWithHardwareWallet,
  connectAndVerifyWithWalletProvider,
} from '@dynamic-labs-sdk/client';

const ledgerProvider = getAvailableWalletsToConnect().find((provider) =>
  canConnectWithHardwareWallet({
    walletProviderKey: provider.key,
    hardwareWalletVendor: 'ledger',
  })
);

if (ledgerProvider) {
  const walletAccount = await connectAndVerifyWithWalletProvider({
    walletProviderKey: ledgerProvider.key,
    hardwareWalletVendor: 'ledger',
  });
}
```

See [Hardware Wallet Support](/javascript/reference/wallets/hardware-wallets) for the full guide,
including how to check support per provider and detect hardware wallet accounts.

## Related functions

* [Getting Wallet Accounts](/javascript/reference/wallets/get-wallet-accounts)
* [Adding EVM Extensions](/javascript/reference/evm/adding-evm-extensions)
* [Adding Solana Extensions](/javascript/reference/solana/adding-solana-extensions)
* [Wallet Provider Events](/javascript/reference/wallets/wallet-provider-events)
* [Hardware Wallet Support](/javascript/reference/wallets/hardware-wallets)
