Back to Projects
Mobile App

Pouch

Self-custodial crypto wallet with multi-chain support, Uniswap V3 swaps, and WalletConnect integration.

5 min read5 Chains
5 blockchain networksUniswap V3 DEX integrationBiometric & PIN securityReal-time push notifications

Tech Stack

React NativeExpoTypeScriptethers.jsUniswap V3WalletConnect

Overview

Pouch is a self-custodial mobile crypto wallet built from scratch with React Native and Expo. It supports multiple EVM-compatible blockchain networks, enables decentralized token swaps via Uniswap V3, and connects to dApps through WalletConnect v2. The app features bank-grade security with AES-256 encryption, biometric authentication, and a 6-digit PIN system.

The Problem

Existing mobile wallets like MetaMask and Trust Wallet are feature-rich but bloated, slow, and often confusing for users. I wanted to build a wallet that:

  • Feels native: Smooth animations, instant transitions, and a design that feels like it belongs on iOS
  • Prioritizes security: Self-custodial with no compromises on key management
  • Supports DeFi natively: Swap tokens directly without leaving the app
  • Keeps it simple: Only the features that matter, executed well

Wallet Setup Flow

The onboarding experience guides users through creating or importing a wallet in three steps: generate a BIP-39 recovery phrase, verify the backup through a randomized quiz, and set a 6-digit PIN that encrypts private keys with AES-256-GCM.

Welcome to Pouch
Recovery Phrase Generation
PIN Setup

The recovery phrase is generated locally and never transmitted over the network. During verification, users answer randomized multiple-choice questions to prove they've backed up their phrase correctly.

Verify Your Phrase
PIN Verification for Recovery Phrase

Home Dashboard

The main dashboard displays the total portfolio value, quick actions (Receive, Send, Swap), and a scrollable list of all tokens with real-time prices from CoinGecko. The token list automatically discovers ERC-20 tokens via Alchemy's token detection API, showing current price and 24-hour change for each asset.

Home Dashboard
Full Asset List
Account Switcher

Pouch supports HD wallet derivation (BIP-44) for creating multiple accounts from a single recovery phrase. The account switcher bottom sheet lets users quickly switch between accounts and import external wallets.

Send & Receive

The receive screen generates a QR code with network-aware warnings to prevent cross-chain errors. Sending follows a multi-step flow: select recipient from the address book, enter the amount with quick percentage shortcuts (25%, 50%, 75%, Max), then review transaction details including gas fees and confirmation speed before signing.

Receive QR Code
Send USDT
Transaction Review

Real-time Notifications & Asset Tracking

Push notifications alert users instantly when tokens are received. Tapping any token opens a detailed view with interactive price charts (1D, 1W, 1M, 1Y, ALL), holdings breakdown, and quick Send/Receive actions.

Push Notification - Received ETH
ETH Price Chart
Transaction History

The Activity screen shows a complete transaction history organized by date. Each transaction displays type, amount, and confirmation status. Pending transactions include Speed Up and Cancel options for gas price adjustments.

Token Swaps via Uniswap V3

I integrated Uniswap V3 for decentralized token swaps directly within the app. The swap interface shows real-time quotes, price impact, minimum received amount, slippage tolerance, and the routing path — all powered by on-chain liquidity.

Swap with Uniswap V3 Quote
Settings - Network, Security, WalletConnect

Settings & Security

The Settings screen provides full control over network selection (Ethereum, Polygon, Arbitrum, Optimism, Base), testnet mode toggle, transaction alerts, and security features including recovery phrase backup, app lock configuration, address book management, and WalletConnect dApp connections.

Technical Architecture

plaintext
┌─────────────────────────────────────────────┐
│           UI Layer (Expo Router)            │
│  Screens, Components, Animations           │
└─────────────┬───────────────────────────────┘

┌─────────────▼───────────────────────────────┐
│       State Management (React Context)     │
│  Auth, Wallet, Network, WalletConnect      │
│  18+ custom hooks                          │
└─────────────┬───────────────────────────────┘

┌─────────────▼───────────────────────────────┐
│           Services Layer                   │
│  Alchemy · ethers.js · Uniswap V3         │
│  CoinGecko · WalletConnect · Notifications │
└─────────────┬───────────────────────────────┘

┌─────────────▼───────────────────────────────┐
│           Encrypted Storage                │
│  SecureStore (AES-256) · AsyncStorage      │
└─────────────────────────────────────────────┘

Key Design Decisions

  • Expo SDK 54 with custom dev client for native module access while keeping the Expo ecosystem benefits
  • React Context + Hooks over Redux for simpler state management suited to the wallet's data flow
  • ethers.js 6 as the core blockchain library for its TypeScript-first design and smaller bundle size
  • Alchemy SDK for reliable RPC, token detection, and transaction history without running our own nodes
  • expo-secure-store with AES-256-GCM for encrypting mnemonics and private keys at rest

Results

  • 5 EVM networks supported (Ethereum, Polygon, Arbitrum, Optimism, Base)
  • Uniswap V3 integration for trustless on-chain swaps
  • WalletConnect v2 for dApp connectivity
  • AES-256-GCM encryption with biometric + PIN authentication
  • Real-time price tracking and push notifications
  • Sub-second UI transitions with React Native Reanimated

Technologies Used

  • Framework: React Native, Expo SDK 54, TypeScript
  • Blockchain: ethers.js 6, Alchemy SDK, Uniswap V3
  • Security: AES-256-GCM, expo-secure-store, expo-local-authentication
  • State: React Context, 18+ custom hooks
  • UI: NativeWind (Tailwind CSS), Reanimated 4, Gesture Handler
  • Connectivity: WalletConnect v2, CoinGecko API
  • Notifications: expo-notifications