Multi-chain wallets for React

One hook surface for wallets on any chain.

butr discovers EVM, Solana, Sui, Bitcoin, and Polkadot wallets, manages their connection state across reloads, and hands you a raw signer. Bring your own chain library.

npm i @usebutr/wallets

Supports the most used chains

One discovery seam across EVM networks, Solana, Sui, Bitcoin, and Polkadot.

butr runs under your chain library.

It handles wallet discovery and connection state, then passes the signer to viem, wagmi, gill, or whatever you already use.

Multi-chain by default
A user can connect MetaMask and Phantom at the same time. butr holds them in one pool and tracks each platform on its own.
Connector-shaped
Any wallet (injected, WalletConnect, Ledger, or one you write) is a WalletAdapter, plugged into a single seam.
No lock-in
getSigner() returns the underlying provider. Bridge it into viem, wagmi, gill, or @solana/kit in a few lines and keep your stack.
Modular
Install only what you need. The core has no React and no protocol code. Protocols live in separate packages above it.

Wire up your wallets in one provider.

Drop autoDiscovery() into the provider and read wallets from a hook. You get discovered wallets and connection state, without writing chain-specific UI or per-wallet branches.

import {
  WalletManagerProvider,
  useDiscoveredWallets,
  useConnectWallet,
} from "@usebutr/react";
import { autoDiscovery } from "@usebutr/wallets";

const discovery = autoDiscovery();

export const App = () => (
  <WalletManagerProvider discovery={discovery} storageKeyPrefix="my-app">
    <Connect />
  </WalletManagerProvider>
);

const Connect = () => {
  const wallets = useDiscoveredWallets();
  const connect = useConnectWallet();

  return wallets.map((wallet) => (
    <button key={wallet.id} onClick={() => connect(wallet.id)}>
      Connect {wallet.name}
    </button>
  ));
};

Ready to wire up wallets?

Install, quickstart, core concepts, and the full API reference are all in the docs.