Cavos

Chains

Cavos is chain-agnostic by design. Starknet and Solana are available today; more chains slot in behind the same API.

Cavos is built chain-agnostic. The model — an identity-derived address controlled by a silent device key, verified on-chain — isn't specific to any one network. Your application code targets the same Cavos.connect entry point regardless of chain; only the chain and network you pass change.

Status

ChainStatusNetworks
Starknet✅ Availablesepolia, mainnet
Solana✅ Availablesolana-devnet, solana-mainnet
Stellar✅ Availablestellar-testnet, stellar-mainnet

All three chains are production-ready. Starknet is proven on Sepolia; Solana ships a full device-account program, gasless relayer, and e2e coverage. Stellar runs a classic G… multisig account with the CavosStellar client and gasless relayer, live on testnet and mainnet. See Stellar.

Per-chain guides

Each implemented chain has its own page with a quickstart and the chain-specific details:

How the abstraction works

Two layers keep Cavos portable:

  • The device signer is the constant. A non-extractable secp256r1 (P-256) key on the device is the user's authority on every chain. Identity → address_seed derivation is the same everywhere.
  • A ChainAdapter per chain handles the chain-specific parts: deterministic address computation, signature encoding, and the deploy / add-signer / remove-signer calls. StarknetAdapter, SolanaAdapter, and StellarAdapter ship today.

Curves differ across ecosystems, and each adapter resolves that:

  • Starknet — on-chain secp256r1 verification in the Cairo DeviceAccount.
  • Solana — every guarded action pairs Solana's native secp256r1 precompile with the Cavos device-account program instruction.
  • Stellar — a classic G… multisig account (no Soroban contract): a deterministic master key with weight 0 plus a control key sealed on-chain in the account's data entries. The control key is unwrapped locally per-device (via an ECDH device key, a WebAuthn PRF passkey, or a recovery code) and signs transactions. Self-custodial, no backend key.

Writing chain-agnostic code

Target the unified Cavos.connect with { chain, network }, and narrow the returned wallet on wallet.chain before calling chain-native methods:

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

// One entry point; chain + network are the only chain-specific inputs.
const wallet = await Cavos.connect({
  chain: "starknet",          // "starknet" | "solana" | "stellar"
  network: "testnet",         // resolves to sepolia / solana-devnet / stellar-testnet
  identity: { userId, email },
  appSalt: "my-app",
  appId: process.env.NEXT_PUBLIC_CAVOS_APP_ID,
  // Starknet-only:
  paymasterApiKey: process.env.CAVOS_PAYMASTER_API_KEY!,
});

// execute() keeps each chain's native signature — narrow on `chain`:
if (wallet.chain === "starknet") {
  await wallet.execute(calls);                 // arbitrary Starknet calls
} else if (wallet.chain === "solana") {
  await wallet.execute(amount, destination);   // lamport transfer
} else if (wallet.chain === "stellar") {
  await wallet.execute(amount, destination);   // XLM transfer (stroops)
}

When a new chain lands, you pass its chain + network values — the rest of your integration (login, signing) stays identical. See Concepts → multi-chain by design for the architecture rationale.

On this page