> ## 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.

# Hardware Wallet Support

> Connect and verify Ledger hardware wallets via supported software wallets

Dynamic supports hardware wallet connections via compatible software wallets. When a user has their
Ledger device connected through a supported Bitcoin wallet (Leather, Magic Eden, Phantom, or Xverse),
Dynamic can detect that the wallet account originates from a hardware device, connect to it, and
handle the signing flow appropriately.

Currently supported hardware wallet vendor: **Ledger**
Currently supported chain: **Bitcoin**

## How it works

Hardware wallets don't connect directly to the browser — they work through a software wallet that
acts as a bridge to the hardware device. When a software wallet supports Ledger, it exposes the
hardware wallet's accounts and routes signing requests to the device.

Dynamic's hardware wallet support works at two levels:

1. **Discovery** — identify which wallet providers in your project support a given hardware wallet vendor
2. **Connection** — pass the hardware wallet vendor when connecting, so the wallet provider knows to use the hardware device

## Checking hardware wallet support

Use `getAvailableWalletsToConnect` and `canConnectWithHardwareWallet` to find which wallet providers
in your project support Ledger:

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

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

console.log('Providers that support Ledger:', ledgerProviders.map((p) => p.name));
```

## Connecting with a hardware wallet

Find the first available Ledger-compatible provider and pass `hardwareWalletVendor` when connecting:

```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',
  });
}
```

## Detecting hardware wallet accounts

Use `isHardwareWalletAccount` to check if a connected wallet account came from a hardware wallet:

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

const accounts = getWalletAccounts();

for (const account of accounts) {
  if (isHardwareWalletAccount({ walletAccount: account })) {
    console.log(`${account.address} is connected via hardware wallet`);
    console.log('Vendor:', account.hardwareWalletVendor); // 'ledger'
  }
}
```

## Filtering providers by hardware wallet support

Build a UI that shows only wallet providers compatible with a given hardware wallet:

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

const allProviders = getAvailableWalletsToConnect();

const ledgerCompatible = allProviders.filter((provider) =>
  canConnectWithHardwareWallet({
    walletProviderKey: provider.key,
    hardwareWalletVendor: 'ledger',
  })
);

console.log('Providers that support Ledger:', ledgerCompatible.map((p) => p.name));
```

## Chain support

Ledger hardware wallet support is currently available for **Bitcoin only**, via the following wallet
providers: Leather, Magic Eden, Phantom, and Xverse.

See [Adding Bitcoin Extensions](/javascript/reference/bitcoin/adding-bitcoin-extension) for setup
and a full connection example.

## React

`useGetAvailableWalletProvidersData` reactively tracks wallet providers (re-rendering on `walletProviderChanged`), so you can filter for Ledger-compatible ones:

```tsx theme={"system"}
import {
  canConnectWithHardwareWallet,
  connectAndVerifyWithWalletProvider,
} from '@dynamic-labs-sdk/client';
import { useGetAvailableWalletProvidersData } from '@dynamic-labs-sdk/react-hooks';

function LedgerConnectButton() {
  const { data: providers = [] } = useGetAvailableWalletProvidersData();
  const ledgerProvider = providers.find((p) =>
    canConnectWithHardwareWallet({ walletProviderKey: p.key, hardwareWalletVendor: 'ledger' }),
  );

  const handleConnect = async () => {
    if (!ledgerProvider) return;
    await connectAndVerifyWithWalletProvider({
      walletProviderKey: ledgerProvider.key,
      hardwareWalletVendor: 'ledger',
    });
  };

  return (
    <button onClick={handleConnect} disabled={!ledgerProvider}>
      {ledgerProvider ? `Connect Ledger via ${ledgerProvider.name}` : 'No Ledger-compatible wallet found'}
    </button>
  );
}
```

## API reference

* [canConnectWithHardwareWallet](/javascript/reference/client/can-connect-with-hardware-wallet) - Check if a provider supports a hardware wallet vendor
* [isHardwareWalletAccount](/javascript/reference/client/is-hardware-wallet-account) - Check if a wallet account is from a hardware wallet
* [connectWithWalletProvider](/javascript/reference/wallets/connect-and-verify-wallet) - Connect a wallet (supports `hardwareWalletVendor`)
* [connectAndVerifyWithWalletProvider](/javascript/reference/wallets/connect-and-verify-wallet) - Connect and verify a wallet (supports `hardwareWalletVendor`)
