Skip to main content
This page has been updated for Wallets SDK V1. If you are using the previous version, see the previous version docs or the V1 migration guide.
Use addSigner() to register additional signers on an existing wallet. The wallet’s recovery signer must approve the operation — the SDK handles this automatically.
Email and phone signers cannot be added via addSigner(). They can only be configured as recovery signers at wallet creation time. See Configure Wallet Recovery.

Prerequisites

  • An existing wallet with a recovery signer configured
  • API key with wallets:signatures.create and wallets:transactions.create scopes

How It Works

When you call addSigner(), the SDK:
  1. Submits the new signer registration request
  2. Temporarily activates the recovery signer to approve the operation
  3. After approval, restores the previously active signer
For client-side wallets with an email or phone recovery signer, the user is prompted with an OTP to approve adding the new signer. For server signer recovery, approval happens automatically.

Add a Passkey Signer

Passkey signers use the WebAuthn/FIDO2 standard for biometric authentication. The user registers a passkey via a browser or platform authenticator prompt.
Passkey signers are EVM-only. They are not supported on Solana or Stellar.
import { useWallet } from "@crossmint/client-sdk-react-ui";

const { wallet } = useWallet();

const signer = await wallet.addSigner({
    signer: { type: "passkey" },
});

console.log("Passkey added:", signer.locator);
After adding, activate the passkey for signing:
wallet.useSigner({ type: "passkey" });

const { hash } = await wallet.send(
    "0xRecipientAddress",
    "usdc",
    "10"
);

Add an External Wallet Signer

An external wallet signer connects an existing blockchain wallet or keypair — such as MetaMask, Phantom, or a raw keypair — as a signer. When adding an external wallet via addSigner(), only the address is needed (no onSign callback required for registration).
import { useWallet } from "@crossmint/client-sdk-react-ui";

const { wallet } = useWallet();

const signer = await wallet.addSigner({
    signer: {
        type: "external-wallet",
        address: "0x1234...abcd",
    },
});

console.log("External wallet added:", signer.locator);
To use the external wallet for signing, activate it with the full config including onSign:
wallet.useSigner({
    type: "external-wallet",
    address: "0x1234...abcd",
    onSign: async (payload) => {
        // Sign the hex payload with your external wallet
        return await externalWallet.signMessage(payload);
    },
});

External Wallet onSign by Chain

When using an external wallet signer for transactions (via useSigner), the onSign callback receives chain-specific payloads:
ChainonSign SignaturePayloadExpected Return
EVM(payload: string) => Promise<string>Hex-encoded messageHex-encoded signature
Solana(tx: VersionedTransaction) => Promise<VersionedTransaction>Unsigned transactionSigned transaction
Stellar(payload: string) => Promise<string>String payloadSigned string

Add a Device Signer on a New Device

When a user accesses their wallet from a new device, the SDK automatically handles device signer creation through the recovery flow. You do not need to call addSigner() manually for this — it happens as part of the recovery process. If you want to trigger recovery before the first transaction:
import { useWallet } from "@crossmint/client-sdk-react-ui";

const { wallet } = useWallet();

if (wallet.needsRecovery()) {
    await wallet.recover();
}

List Signers

Retrieve all signers registered on a wallet:
import { useWallet } from "@crossmint/client-sdk-react-ui";

const { wallet } = useWallet();

const signerList = await wallet.signers();
console.log(signerList);

Signer Type Reference

Signer TypeCan Add via addSigner()ChainsNotes
PasskeyYesEVM onlyBiometric WebAuthn prompt
External walletYesEVM, Solana, StellarRequires address; onSign needed for transactions
DeviceAutomaticEVM, StellarCreated during recovery flow on new devices
ServerYesEVM, Solana, StellarRequires secret
EmailNoAllRecovery signer only — set at wallet creation
PhoneNoAllRecovery signer only — set at wallet creation

Next Steps

Device Signer

Understand the default client-side signer

Configure Recovery

Set up recovery signers for your wallets

Transfer Tokens

Send tokens from your wallet