Реалізація підключення до 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% підійде для stablecoin-пар, 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 місяці.







