A multi-chain desktop crypto wallet for Bitcoin, Ethereum, and Solana. Built with Tauri v2 + React + TypeScript.
All keys are stored locally. Nothing leaves your device.
- Framework: Tauri v2 (Rust backend + React/TS frontend)
- Package manager: pnpm
- State: Zustand (persisted, keys never written to disk)
- Chains: BTC (bitcoinjs-lib), ETH (ethers v6), SOL (@solana/web3.js)
- Encryption: AES-256 via PBKDF2 (crypto-js)
- UI: Tailwind CSS + framer-motion
# Install Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Install Tauri CLI system deps (Linux)
sudo apt install libwebkit2gtk-4.1-dev libssl-dev libgtk-3-dev \
libayatana-appindicator3-dev librsvg2-dev
# macOS: Xcode Command Line Tools
xcode-select --install# Clone and install
git clone <repo>
cd walar-wallet
pnpm install
# Dev mode (hot reload)
pnpm tauri dev
# Production build
pnpm tauri build
# → Outputs: src-tauri/target/release/bundle/Create a .env file in the project root:
# Custom RPC endpoints
VITE_BTC_API_URL=https://blockstream.info/api
VITE_ETH_RPC_URL=https://eth.llamarpc.com
VITE_SOL_RPC_URL=https://api.mainnet-beta.solana.com
VITE_ETHERSCAN_API_URL=https://api.etherscan.io/api
VITE_ETHERSCAN_KEY=your_optional_key
VITE_COINGECKO_API_URL=https://api.coingecko.com/api/v3src/
├── lib/
│ ├── btc.ts # Bitcoin: derive, balance, send
│ ├── eth.ts # Ethereum: derive, balance, send
│ ├── sol.ts # Solana: derive, balance, send
│ ├── crypto.ts # AES-256 keystore encryption
│ └── prices.ts # CoinGecko price fetching
├── store/
│ └── walletStore.ts # Zustand state (keys never persisted)
├── pages/
│ ├── Onboarding.tsx # Multi-step wallet creation/import
│ ├── LockScreen.tsx # Password unlock
│ ├── Dashboard.tsx # Main wallet UI
│ └── Settings.tsx # Settings panel
├── components/
│ ├── ui/ # Button, Input, Logo, ProgressSteps
│ ├── wallet/ # SeedPhraseGrid
│ └── modals/ # SendModal, ReceiveModal
└── styles/globals.css
- Mnemonic is encrypted with AES-256 using PBKDF2(password, salt, 100k iterations)
- Decrypted keys live in-memory only (Zustand, non-persisted)
zustand/middleware persistexplicitly excludeskeys,mnemonic,isUnlocked- Auto-lock on inactivity: add
useIdleTimerhook (TODO) - No network calls with private key data — signing is local
- Auto-lock after inactivity (configurable)
- ERC-20 token support
- SPL token support
- Hardware wallet (Ledger) integration
- Windows port
- Price charts
- Address book