Реализация подключения к DeFi-протоколам из мобильного кошелька
DeFi из мобильного кошелька — это не открыть WebView с dApp. Это прямая работа со смарт-контрактами: вызов методов Uniswap Router, Aave LendingPool, Compound cToken. Интерфейс строится поверх JSON ABI, транзакции подписываются локально, данные читаются через RPC без посредников.
Архитектура: ABI-first подход
Каждый DeFi-протокол — набор смарт-контрактов с публичным ABI. Задача приложения: закодировать вызов по ABI, подписать транзакцию, отправить. Для EVM — библиотека web3swift (iOS) или web3j (Android) предоставляет EthereumContract для динамической работы с ABI.
// iOS — вызов Uniswap V3 QuoterV2 для получения котировки
let quoterABI = try! EthereumContract(json: quoterV2ABI)
let result = try await quoterABI.read(
"quoteExactInputSingle",
parameters: [tokenIn, tokenOut, fee, amountIn, sqrtPriceLimitX96] as [AnyObject],
transactionOptions: nil
)
Для Solana и её протоколов (Raydium, Orca, Jupiter) — Anchor SDK генерирует IDL (Interface Definition Language), аналог ABI. SolanaSwift + Anchor позволяет вызывать инструкции программ типизированно.
Uniswap V3: swap через Router
Uniswap V3 — наиболее сложный из популярных протоколов для мобильной интеграции. SwapRouter02 (0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45) принимает ExactInputSingleParams:
// Android — кодировка вызова exactInputSingle
val function = Function(
"exactInputSingle",
listOf(
DynamicStruct(
Address(tokenIn),
Address(tokenOut),
Uint24(fee), // 500, 3000 или 10000
Address(recipient),
Uint256(amountIn),
Uint256(amountOutMinimum), // с учётом slippage
Uint256(BigInteger.ZERO) // sqrtPriceLimitX96
)
),
listOf(Uint256())
)
val encodedData = FunctionEncoder.encode(function)
Перед swap нужен approve на SwapRouter: ERC-20 approve(routerAddress, amountIn). Без него транзакция swap упадёт с TransferHelper: TRANSFER_FROM_FAILED.
Для получения котировки — QuoterV2.quoteExactInputSingle (read-only, off-chain). Никогда не использовать onchain Quoter для отображения в UI в realtime — это eth_call, который загружает ноду.
Aave V3: supply и borrow
Aave Pool (0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2 на Mainnet) принимает supply(asset, amount, onBehalfOf, referralCode). Логика:
- Approve Pool на
amountтокена. - Вызвать
supply— получить aToken в обмен. - Для borrowing — проверить
getUserAccountData, убедиться что healthFactor > 1.5 перед рекомендацией суммы займа.
HealthFactor ниже 1.0 — ликвидация позиции. Мобильное приложение должно отображать HealthFactor в реальном времени и предупреждать при приближении к 1.1.
WalletConnect для dApp-браузера
Если кошелёк хочет поддерживать подключение к внешним dApps через мобильный браузер — WalletConnect v2 SDK (com.walletconnect:walletkit для Android, WalletConnectSwift для iOS). Протокол устанавливает зашифрованный канал между dApp и кошельком. Кошелёк получает запросы на подпись, показывает пользователю детали транзакции, подписывает локально и возвращает подписанный hex.
Управление состоянием и кэш данных протоколов
Данные DeFi обновляются с каждым блоком. Курс пула Uniswap, процентные ставки Aave — читаются через Multicall3 каждые 12–15 секунд. Хранить в реактивном state (Combine на iOS, Flow/StateFlow на Android). При ошибке RPC — graceful degradation: показывать последние актуальные данные с меткой времени.
Типичные проблемы
Slippage tolerance захардкоживать нельзя. 0.5% подойдёт для стейблкоин-пар, 1–3% — для волатильных. Слишком низкий slippage — транзакция всегда ревертится на волатильном рынке, слишком высокий — sandwich-атака съест разницу.
Gas estimation для DeFi-операций может промахнуться: Uniswap V3 при некоторых маршрутах потребляет 200k–500k gas. Мультиплицировать estimation на 1.3, не 1.1.
Сроки: 1–3 месяца в зависимости от набора протоколов. Один протокол (например, только Uniswap V3 swap) — 1–2 недели с учётом тестирования на testnet. Полноценный DeFi-хаб с Uniswap + Aave + Compound — 2–3 месяца.







