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
| Chain | Status | Networks |
|---|---|---|
| Starknet | ✅ Available | sepolia, mainnet |
| Solana | ✅ Available | solana-devnet, solana-mainnet |
| Stellar | ✅ Available | stellar-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:
Starknet
Cairo DeviceAccount, 5-felt signatures, Cavos paymaster.
Solana
Native secp256r1 precompile, device-account PDA, Cavos relayer.
Stellar
Classic G… multisig, on-chain sealed control key, Cavos relayer.
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_seedderivation is the same everywhere. - A
ChainAdapterper chain handles the chain-specific parts: deterministic address computation, signature encoding, and the deploy / add-signer / remove-signer calls.StarknetAdapter,SolanaAdapter, andStellarAdaptership 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:
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.