Wallet Basics
8 examples to get you started with Solana wallets - 5 basic and 3 intermediate.
Prerequisites
Browsers need a wallet extension or mobile wallet that implements the Wallet Standard (formerly wallet-adapter protocol). Your dApp uses adapter hooks - it never touches secret keys.
Basic Examples
1. Wallet Standard Overview
Wallets expose connect, disconnect, and signTransaction to registered apps.
// Wallets register via window events - adapters discover them
console.log("Install Phantom or Solflare for browser signing");- Users custody keys; dApps request signatures per action.
- Connection is opt-in per origin.
- Mobile uses deep links and MWA instead of extensions.
2. Read-Only Without Wallet
Use RPC for balances before connect.
import { createSolanaRpc, address } from "@solana/kit";
const rpc = createSolanaRpc(process.env.NEXT_PUBLIC_RPC_URL!);
const bal = await rpc.getBalance(address("PUBKEY")).send();- Marketing pages and explorers do not need wallet connect.
- Do not gate public data behind connect.
- Same RPC patterns as @solana/kit Basics.
3. Connect Flow UX
Show connect button only when action requires signing.
"use client";
export function ConnectHint() {
return <button type="button">Connect wallet to continue</button>;
}- Lazy-connect increases conversion vs landing modal.
- Display truncated address after connect.
- Offer disconnect in account menu.
4. Cluster Mismatch Warning
Wallet network must match app RPC.
const CLUSTER = "devnet"; // document in UI footer- Phantom devnet vs mainnet mismatch causes confusing simulation errors.
- Show active cluster badge in header.
- Block sends when wallet reports wrong chain.
5. Transaction Approval
Wallets display human-readable effects before sign.
// Build unsigned message in app; wallet signs after user confirms- Keep instruction count reasonable per approval.
- Simulate before prompting when possible.
- Decode errors for users after rejection.
Intermediate Examples
6. Multi-Wallet Support
Let users pick among installed wallets.
// Wallet modal lists Phantom, Solflare, Backpack, etc.- Do not hardcode one wallet brand.
- Wallet Standard discovery is automatic with adapters.
- Test with at least two wallets in QA.
7. Message Signing for Auth
Off-chain signatures prove pubkey control.
// wallet.signMessage(new TextEncoder().encode("Sign in to MyApp"))- Use domain-bound SIWS-style messages.
- Verify ed25519 on server.
- Never treat signature alone as session forever - expire tokens.
8. Hardware Wallet Path
Ledger signs via wallet app proxy.
// User connects Ledger through Phantom/Solflare- More confirmation steps - adjust UX timeouts.
- Blind signing must be off for unknown programs.
- See Hardware & Mobile Wallets.
Stack versions: This page was written for Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, and LiteSVM 0.6.x.