Реализация подключения к DeFi-протоколам из мобильного кошелька
Разработчик кошелька хочет добавить свап токенов через Uniswap. Лёгким путём кажется WebView с официальным dApp, но это даёт чужой UI, потерю контроля над газом и ограничения безопасности. Нативная интеграция решает эти проблемы: вызов смарт-контракта напрямую, локальное подписание, кастомизация. Мы интегрируем мобильный кошелёк с DeFi-протоколами напрямую: вызов методов Uniswap Router, Aave LendingPool, Compound cToken. Интерфейс строится поверх JSON ABI, транзакции подписываются локально, данные читаются через RPC без посредников. Это не WebView с dApp, а полноценное взаимодействие со смарт-контрактами. Наш опыт — более 5 лет в мобильной разработке, 10+ успешных DeFi-интеграций, 30+ проектов в сфере блокчейн. Нативная интеграция в 2 раза безопаснее WebView с точки зрения защиты от фишинга благодаря локальному подписанию через Secure Enclave. Получите консультацию — оценим ваш проект.
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.
Как обеспечить надёжность подписания транзакций?
Для защиты от фишинга используем EIP-712 (Ethereum Typed Data). Все данные транзакции отображаются пользователю в понятном виде. Приватные ключи хранятся в Keychain (iOS) / Android Keystore. Подписание выполняется локально, интернет не требуется. Дополнительно — биометрическая аутентификация для подтверждения.
WalletConnect для dApp-браузера
Если кошелёк хочет поддерживать подключение к внешним dApps через мобильный браузер — WalletConnect v2 SDK (com.walletconnect:walletkit для Android, WalletConnectSwift для iOS). Протокол устанавливает зашифрованный канал между dApp и кошельком. Кошелёк получает запросы на подпись, показывает пользователю детали транзакции, подписывает локально и возвращает подписанный hex.
Почему стоит интегрировать DeFi напрямую, а не через WebView?
| Критерий | WebView с dApp | Нативная интеграция |
|---|---|---|
| Производительность | Ограничена браузером | Максимальная, без задержек |
| UI/UX | Чужой интерфейс | Полный кастом под бренд |
| Безопасность | Зависит от dApp | Локальное подписание, контроль данных |
| Gas-менеджмент | Нет контроля | Оптимизация, оценка, мультипликатор |
Нативная интеграция даёт полный контроль над транзакциями, снижает газ и улучшает пользовательский опыт.
Управление состоянием и кэш данных протоколов
Данные 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.
| Тип операции | Типичный gas (Ethereum) | Комментарий |
|---|---|---|
| Swap через Uniswap V3 | 200k–500k | Зависит от маршрута |
| Supply Aave | 120k–180k | Approve + supply |
| Borrow Aave | 200k–300k | С учётом обновления обеспечения |
Решение типичных проблем с газом
Используйте Multicall3 для снижения количества RPC-запросов. Устанавливайте динамический мультипликатор gas на основе исторических данных мемпула.Процесс работы
- Аналитика: определение списка протоколов, сбор ABI/IDL.
- Проектирование: архитектура ABI-слоя, reactive state, обработка ошибок.
- Реализация: кодинг функций swap, supply, borrow, интеграция WalletConnect.
- Тестирование: на testnet (Goerli, Sepolia, Mumbai), проверка edge-кейсов.
- Деплой: публикация в App Store / Google Play, мониторинг.
Что входит в работу
- Документация ABI-интеграции с примерами кода
- Тест-кейсы для всех сценариев (успех, откат, gas-ошибки)
- Обучение вашей команды работе с библиотеками web3swift/web3j
- Поддержка после релиза в течение месяца (багфикс, консультации)
Свяжитесь с нами — оценим ваш проект.
Сроки: 1–3 месяца в зависимости от набора протоколов. Один протокол (например, только Uniswap V3 swap) — 1–2 недели с учётом тестирования на testnet. Полноценный DeFi-хаб с Uniswap + Aave + Compound — 2–3 месяца. Стоимость рассчитывается индивидуально.







