Разработка мобильного приложения для крипто-сбережений (Savings/Yield)
Пользователь хочет положить USDC на депозит и получать 8% годовых в крипте. Просто. На деле — это либо кастодиальная платформа с централизованным управлением (Nexo-подобная), либо интеграция с DeFi-протоколом (Aave, Compound, Yearn), либо ликвидити-пулы (Uniswap V3, Curve). Архитектурное решение принимается в самом начале и определяет весь стек разработки.
Три архитектуры и их мобильные последствия
Кастодиальная. Пользователь переводит крипту на кошелёк платформы, платформа управляет капиталом сама. Мобильное приложение — классическое финтех-приложение: REST API, JWT-авторизация, баланс, история транзакций, вывод средств. Никакого Web3 на клиенте. Прост в разработке, требует лицензии и compliance.
DeFi-интеграция. Пользователь напрямую взаимодействует со смарт-контрактом через собственный некастодиальный кошелёк. Мобильное приложение становится интерфейсом к протоколу. Нужен Web3-стек: web3.swift / web3j, WalletConnect v2 для подписи транзакций. Пользователь платит gas самостоятельно.
Гибридная. Платформа держит smart account (Account Abstraction / ERC-4337), пользователь не взаимодействует с ключами напрямую. Платформа спонсирует газ через Paymaster. Лучший UX из трёх вариантов — пользователь не знает о блокчейне.
APY-дашборд и real-time доходность
Главный экран приложения — текущий баланс + накопленные проценты. Накопленные проценты нужно обновлять в реальном времени, а не раз в час. Это UX-трюк, но он работает: пользователь видит, как баланс растёт, пока он смотрит на экран.
Для DeFi-протоколов Aave V3 проценты начисляются непрерывно через aToken — токен, баланс которого автоматически растёт. Считаем текущий баланс через AToken.balanceOf(userAddress), вызов каждые 30 секунд через JSON-RPC:
// Получение актуального баланса aToken через web3.swift
class AaveBalanceService {
let web3 = Web3(rpcURL: "https://mainnet.infura.io/v3/YOUR_KEY")
func fetchATokenBalance(userAddress: EthereumAddress, aTokenAddress: EthereumAddress) async throws -> BigUInt {
let contract = try web3.eth.Contract(json: aTokenABI, abiKey: nil, address: aTokenAddress)
let result = try await contract["balanceOf"]?(userAddress).call()
return result?["_balance"] as? BigUInt ?? 0
}
}
На UI: баланс в USD с пересчётом по текущему курсу. Курс — WebSocket от Binance или CoinGecko с кэшированием на 15 секунд.
Стратегии доходности и Vault
Yearn Finance-подобные продукты предлагают «стратегии» — автоматическое перекладывание средств между протоколами для максимального APY. В мобильном приложении это выглядит как список вкладов с разным риском и доходностью:
| Стратегия | APY | Риск | Базовый актив |
|---|---|---|---|
| Aave USDC Supply | 4.2% | Низкий | USDC |
| Curve 3pool LP | 6.8% | Средний | USDC/USDT/DAI |
| Yearn USDC Vault | 9.1% | Средний | USDC |
| Uniswap V3 USDC/ETH | 14–40% | Высокий (IL) | USDC + ETH |
Impermanent Loss для LP-позиций — отдельный экран с калькулятором. Пользователь должен понимать риски перед входом в ликвидити-пул.
Вывод средств и lock-up периоды
Некоторые стратегии имеют lock-up — средства нельзя вывести раньше определённой даты. Это нужно показывать явно до депозита, не в сноске. На экране вывода — прогресс-бар с оставшимся временем и датой разблокировки.
Частичный вывод — важная функция. Пользователь должен указать сумму вывода, приложение рассчитывает количество shares / токенов для withdraw(shares, receiver, owner) по ERC-4626 стандарту:
// ERC-4626 Vault: конвертация assets → shares
const shares = await vault.convertToShares(assetsToWithdraw);
const tx = await vault.withdraw(assetsToWithdraw, userAddress, userAddress);
Push-уведомления и аналитика
Еженедельный summary: сколько заработано за неделю, текущий APY. Push при значительном изменении APY (>2%). Напоминание при приближении даты разблокировки.
Firebase Analytics для отслеживания воронки: сколько пользователей дошли от регистрации до первого депозита. Это помогает находить проблемные шаги в UX.
Безопасность
Для кастодиальных платформ — Keychain (iOS) / EncryptedSharedPreferences (Android) для хранения session token. Биометрическая аутентификация для просмотра баланса и вывода. Подтверждение вывода через email/SMS OTP дополнительно к биометрии.
Для некастодиальных — seed phrase никогда не хранится в приложении; только через WalletConnect или Hardware Wallet (Ledger Live SDK).
Этапы и сроки
Выбор архитектуры → серверная часть (балансы, APY, история) → DeFi-интеграция если нужна → мобильный клиент iOS + Android → уведомления → KYC если кастодиальная схема → аудит смарт-контрактов.
8–14 недель в зависимости от архитектуры. DeFi-интеграция с несколькими протоколами и Vault-стратегиями — ближе к 14 неделям. Стоимость рассчитывается индивидуально после анализа требований.







