Prerequisites
- A server API key with
wallets.createandwallets.readscopes - A client API key for the React or React Native SDK
@crossmint/client-sdk-react-uiinstalled on the client (React), or@crossmint/client-sdk-react-native-ui(React Native)
Architecture
Provider Setup
Wrap your app with the Crossmint providers. During the initial wallet creation flow, omitcreateOnLogin — the wallet will be created server-side in Step 2.
- React
- React Native
Step 1: Create the Device Signer (Client)
UsecreateDeviceSigner() from the useWallet hook to generate a hardware-backed P256 keypair on the user’s device. This happens before any wallet exists.
The returned descriptor contains the public key coordinates and a locator — it looks like this:
- React
- React Native
The
createDeviceSigner() function generates and stores the private key in the browser’s secure storage (hidden iframe at crossmint-signer.io). The private key never leaves the device — only the public key descriptor is sent to the server.Step 2: Create the Wallet (Server)
On your server, use the device signer descriptor received from the client to create a wallet with email recovery and the device signer pre-registered.Step 3: Use the Wallet (Client)
Once the wallet is created server-side, the client needs to retrieve it. Choose the approach that fits your app:- Get Wallet on Login
- Get Wallet on Demand
Enable With
createOnLogin on CrossmintWalletProvider so the wallet is automatically retrieved whenever the user logs in — no explicit getWallet() call needed. This is the recommended approach for most apps.- React
- React Native
createOnLogin enabled, any component using useWallet() will automatically have access to the wallet after the user logs in:createOnLogin will retrieve an existing wallet if one is found for the logged-in user, or create a new one if none exists. Since the wallet was already created server-side, it will be retrieved automatically.New Device Recovery
When the user accesses their wallet from a new device, there is no local device signer. The SDK handles this automatically:wallet.needsRecovery()returnstrue- On the first transaction (or explicit
recover()call), the recovery signer (email OTP) authorizes a new device signer - After recovery, all subsequent transactions are frictionless again
Next Steps
Device Signer
Understand how hardware-backed device signers work
Configure Recovery
Explore other recovery signer options
Transfer Tokens
Send tokens from your wallet

