Skip to main content
CCC ships a ready-made React connector that surfaces a wallet picker UI supporting wallets from EVM, BTC, Nostr, and native CKB ecosystems — all through a single <ccc.Provider> wrapper.

Supported wallets

MetaMask

EVM-based signing via MetaMask and other EVM-compatible wallets.

JoyID

Passkey-based CKB wallet — no seed phrase required.

UniSat

BTC wallet with CKB support via the UniSat extension.

OKX

OKX wallet supporting BTC, EVM, and CKB signers.

UTXO Global

UTXO-based multi-chain wallet with CKB integration.

Nostr

Sign with a Nostr key pair for decentralized identity.

Steps

1

Install the package

Add @ckb-ccc/connector-react to your project.
2

Wrap your app in the Provider

Import ccc from the connector package and wrap your application root with <ccc.Provider>. The Provider injects the connector UI and context that all child components can access.
app.tsx
If you are using Next.js with the App Router, add "use client" at the top of any file that renders <ccc.Provider> or uses the CCC hooks, because they rely on React context and browser APIs.

Provider props

app.tsx
3

Read wallet state with useCcc()

Call useCcc() inside any component that is a descendant of <ccc.Provider>. It returns the current connection state and actions.
wallet-button.tsx

Return values

useCcc() throws if the component is rendered outside of <ccc.Provider>. Make sure the Provider wraps your entire component tree before using the hook.
4

Get the signer with useSigner()

Use the useSigner() shorthand when you only need the Signer object to build and send transactions.
transfer-button.tsx
useSigner() returns undefined when no wallet is connected, so always check before using it.

Filter signers

Use signerFilter to restrict which wallets appear in the picker. The function receives a ccc.SignerInfo and the parent ccc.Wallet, and must return a promise that resolves to true to include the signer or false to hide it.
app.tsx

Next steps

Send CKB

Build and broadcast a CKB transfer with the signer you just connected.

Sign Message

Request a signed message from the connected wallet.