Cavos

Embedded Solana Wallet

A device-native, self-custodial embedded wallet for Solana. The signing key is created and used on the user's device — Cavos cannot see it, cannot sign with it, and cannot move funds. Available via @cavos/kit for web and @cavos/kit/react-native for mobile (Expo Development Builds, EAS, or bare React Native — Expo Go is not supported).

In the browser, the device key is a non-extractable P-256 key stored via WebCrypto. On React Native, it uses the OS keystore. These platform primitives provide the hardware-backed isolation — the SDK does not enforce non-extractability on Node or other server runtimes.

Account model

Cavos provisions a device-account PDA controlled by a P-256 (secp256r1) device key. Every guarded action pairs Solana's native secp256r1 precompile with the Cavos device-account program.

  • The secp256r1 precompile instruction records the device's P-256 signature, making it observable to the next instruction.
  • The program instruction reads the verified signer and checks it is authorized before acting.
  • Passkey: On Solana, the passkey is an on-chain approver that authorizes adding new devices — it never signs transactions. Use it for device approval across devices.

Install

npm install @cavos/kit

Connect and execute

Use Cavos.connect with chains: ["solana"]. Connect never deploys the account — it's created lazily on first execute. You can call execute when status is "undeployed" or "ready". Only "needs-device-approval" blocks execution.

import { Cavos } from "@cavos/kit";

const session = await Cavos.connect({
  chains: ["solana"],
  defaultChain: "solana",
  network: "mainnet",
  identity: { userId: user.id, email: user.email },
  appSalt: "my-app",
  appId: process.env.NEXT_PUBLIC_CAVOS_APP_ID,
});

const wallet = session.wallet("solana");

// Execute when undeployed OR ready
if (wallet.status !== "needs-device-approval") {
  const signature = await wallet.execute(
    1_000_000n,  // 0.001 SOL in lamports
    recipientPublicKey
  );
}

What you get

Self-custodial

Cavos never holds a key that can move user funds. The on-chain account is the sole authority over signers.

Native precompile

Uses Solana’s native secp256r1 signature verification — no custom cryptographic code.

Gasless transactions

The Cavos relayer co-signs as fee payer — users hold no SOL to get started.

Arbitrary programs

Beyond SOL transfers: SPL tokens, swaps, staking via executeInstructions (allowlisted programs).

Passkey approval

Passkeys authorize adding new devices on-chain. They never sign transactions — device approval only.

Lazy deploy

Connect derives the address immediately. The account is initialized on first execute, atomically.

Start building on Solana.

Follow the quickstart to reach a sponsored transaction.

We use anonymous analytics to understand how developers use Cavos. No personal data is collected. Privacy Policy