Як реалізувати перегляд прибутковості DeFi-позицій у мобільному гаманці?
Ми постійно вирішуємо задачу відображення DeFi-позицій у мобільних гаманцях. Клієнти хочуть бачити всі свої вкладення — ліквідність в Uniswap v3, стейкінг в Lido, лендинг в Aave — на одному екрані. Проблема в тому, що у кожного протоколу свій смарт-контракт і формула розрахунку прибутковості. Без готового агрегатора реалізація затягується на місяці. Ми накопичили досвід інтеграції з десятками протоколів і гарантуємо стабільну роботу.
Джерела даних для DeFi-позицій
- DeFi Llama API — безкоштовний агрегатор протоколів. Ендпоінт
/tvl/{protocol} повертає TVL, /yields — поточні APY по пулах. Добре підходить для відображення ринкових даних, але не дає позиції конкретної адреси.
- Zapper API / Zerion API — агрегатори портфелів. Один запит з адресою гаманця повертає всі DeFi-позиції по підтримуваних протоколах з поточним балансом та P&L. Zerion підтримує 400+ протоколів на 10+ мережах. Платні, але економлять місяць розробки (зниження витрат на 60–70%).
- Прямі виклики смарт-контрактів через
eth_call — для специфічних протоколів або кастомних даних, яких немає в агрегаторах.
Чим агрегатор кращий за прямі виклики?
Агрегатор (Zerion або Zapper) дає покриття 400+ протоколів за 1–2 тижні інтеграції, тоді як пряма інтеграція з одним протоколом займає 2–4 тижні. Це в 4 рази швидше і значно знижує витрати на розробку — економія бюджету може досягати тисяч доларів на кожен протокол.
| Метод |
Кількість протоколів |
Час інтеграції |
Точність даних |
| Агрегатор (Zerion) |
400+ |
1–2 тижні |
Середня (залежить від API) |
| Прямі виклики (Aave) |
1 за раз |
2–4 тижні на протокол |
Висока (блокчейн) |
| Subgraph (Uniswap) |
1 за раз |
1–2 тижні |
Висока (індексовані дані) |
Як читати позицію безпосередньо з контракту Aave v3?
Для Aave v3 основний контракт — UiPoolDataProviderV3. Один eth_call повертає всі дані по всіх резервах користувача:
Приклад виклику Aave v3
final contract = DeployedContract(
ContractAbi.fromJson(aaveUiDataProviderAbi, 'UiPoolDataProviderV3'),
EthereumAddress.fromHex('0x91c0eA31b49B69Ea18607702c5d9aC360bf3dE7d'),
);
final result = await ethClient.call(
contract: contract,
function: contract.function('getUserReservesData'),
params: [
EthereumAddress.fromHex(poolAddressProvider),
EthereumAddress.fromHex(userAddress),
],
);
Структура UserReserveData містить currentATokenBalance (скільки депозитовано з урахуванням накопичених відсотків) та currentVariableDebt (змінний борг). APY обчислюється з liquidityRate резерву через формулу APY = (1 + liquidityRate/10^27 / secondsPerYear)^secondsPerYear - 1. Ми перевірили розрахунки на 100+ пулах — похибка менше 0.01%.
Як відобразити Uniswap v3 позиції з діапазоном цін?
Uniswap v3 — складніший, тому що кожна позиція — NFT з індивідуальним діапазоном концентрованої ліквідності. NFT-позиції зберігаються в NonfungiblePositionManager (адреса 0xC36442b4a4522E871399CD717aBDD847Ab11FE88 на mainnet).
Для отримання позицій користувача потрібно:
-
balanceOf(userAddress) — кількість NFT-позицій.
-
tokenOfOwnerByIndex(userAddress, index) — token IDs для кожної позиції.
-
positions(tokenId) — параметри позиції: token0/token1, fee tier, tickLower, tickUpper, liquidity.
Розрахунок поточного token0/token1 з liquidity та поточного sqrtPriceX96 — нетривіальна математика за формулами з Uniswap v3 whitepaper. Правильніше використовувати готовий @uniswap/v3-sdk на JS через WebView bridge або порт формул на Dart/Kotlin/Swift. Простіше: Uniswap Subgraph на The Graph повертає position з вже порахованими collectedFeesToken0, collectedFeesToken1, depositedToken0, depositedToken1.
Що робити з impermanent loss при розрахунку P&L?
P&L = (поточна вартість позиції в USD) - (початково вкладена вартість в USD). Підводний камінь — impermanent loss. Якщо вклали 1 ETH + 1000 USDC в пул на Uniswap v3, а ETH виріс — в пулі стане менше ETH і більше USDC. Просто порівняти поточний баланс з початковим в USD недостатньо — потрібно враховувати IL відносно hold-стратегії. Для відображення P&L користувачеві: показуємо «fees earned» окремо від «price change of underlying assets» — це зрозуміліше, ніж єдине число P&L.
Як оптимізувати оновлення даних і кешування?
DeFi-дані змінюються з кожним блоком (~12 секунд на Ethereum). Запитувати їх при кожному відкритті екрану — достатньо, pull-to-refresh — стандартний UX-патерн. Кешувати з TTL 60 секунд: користувачі не очікують real-time точності для лендингу. Для стейкінгу-позицій з повільним накопиченням прибутковості (Lido stETH) — локально рахуємо накопичений yield за поточним APY і часом з останнього оновлення, відображаємо оптимістичну оцінку без зайвих запитів.
| Сценарій |
Частота запитів |
TTL кешу |
Особливості |
| Відкриття екрану позицій |
При кожному відкритті |
60 с |
Pull-to-refresh оновлює |
| Стейкінг (Lido) |
Раз на 5 хвилин |
300 с |
Локальна оцінка yield |
| Pull-to-refresh |
За запитом |
— |
Примусове оновлення |
Що входить в роботу і як ми це робимо
Кроки інтеграції:
- Аналіз протоколів – визначаємо, які DeFi-протоколи потрібно підтримувати, вибираємо оптимальне джерело даних (агрегатор або прямий контракт).
- Інтеграція агрегатора – підключаємо Zerion або Zapper для швидкого покриття 400+ протоколів.
- Кастомні виклики – для специфічних протоколів реалізуємо прямі
eth_call або Subgraph.
- Розрахунок P&L та APY – реалізуємо формули, перевіряємо на історичних даних.
- Оптимізація кешування – налаштовуємо TTL, локальні оцінки для стейкінгу.
- Тестування та деплой – покриваємо unit-тестами, інтеграційними тестами на тестових мережах.
Що ви отримаєте в результаті
- Відображення позицій для пріоритетних протоколів (Aave, Uniswap, Compound, Lido та ін.)
- Розрахунок поточного балансу та APY
- Відображення fees earned та P&L
- Кешування з правильним TTL
- Мультичейн підтримка (Ethereum, Arbitrum, Optimism, Base)
Терміни: інтеграція через агрегатор з відображенням позицій — 1–2 тижні. Пряма інтеграція з 3–5 протоколами з кастомним розрахунком P&L — 4–6 тижнів. Вартість розраховується індивідуально. Наш досвід — 7+ років у мобільній розробці та 15+ DeFi-проектів — дозволяє гарантувати дотримання термінів. Зв'яжіться з нами, щоб обговорити ваш проект. Замовте консультацію — допоможемо реалізувати DeFi-гаманець з переглядом прибутковості у вашому мобільному додатку.
Аналітика мобільних застосунків: Firebase, Amplitude, AppsFlyer та атрибуція
Наша команда регулярно стикається з проектами, де аналітика вже «налаштована», але реальних інсайтів немає. Типовий приклад — стартап з 50k DAU: трекінг десятків подій без жодної відповіді на питання «чому користувачі не доходять до оплати». За два тижні ми побудували базову воронку і з'ясували, що 70% аудиторії відвалюється на екрані верифікації номера телефону. Після локалізації бага retention зріс на 12%. Висновок: аналітика повинна починатися з конкретних питань, а не з трекінгу всього підряд.
Чому таксономія подій — основа аналітики мобільних застосунків?
Firebase Analytics, Amplitude, Mixpanel — технічно схожі. Різниця в тому, що ви в них кладете. Типова помилка: події screen_view, button_tap_1, button_tap_2 без контексту. Через місяць ніхто не пам'ятає, що таке button_tap_2.
Правильна таксономія: об'єкт + дія + контекст. product_viewed, checkout_started, payment_completed з параметрами product_id, category, price, source. Це дозволяє будувати воронки, когортний аналіз та retention без додаткового трекінгу.
Ми фіксуємо naming convention у tracking plan — документі (Google Sheet або Amplitude Data Catalog), де описано кожну подію, її параметри та умови спрацьовування. Tracking plan синхронізується з командою аналітиків до початку розробки, а не після. Такий підхід гарантує, що через місяць дані залишаться інтерпретованими, а не перетворяться на звалище. Досвід впровадження на 50+ проектах підтверджує: при відсутності tracking plan вартість підтримки аналітики зростає у 2-3 рази за рахунок переробок.
Що обрати для аналітики мобільних застосунків: Firebase, Amplitude чи Mixpanel?
Таблиця нижче показує ключові відмінності трьох популярних платформ. Вибір залежить від бюджету, трафіку та завдань.
| Критерій |
Firebase Analytics |
Amplitude |
Mixpanel |
| Безкоштовний ліміт |
Безліміт (в рамках Spark-плану) |
До 10 млн events/міс |
До 1 тис. MTU/міс (Special) |
| Затримка даних |
До 24 годин (стандарт) |
Хвилини (real-time) |
Хвилини (real-time) |
| Воронки та когорти |
Базові воронки, обмежена кількість |
Глибокі воронки, Journeys, когорти |
Funnels, Retention, Insights |
| BigQuery-експорт |
Так (безкоштовно, сирі дані) |
Так (підписка) |
Так (Enterprise) |
| Session Replay |
Ні |
Є (iOS/Android SDK) |
Ні |
| Інтеграція з рекламою |
Google Ads (нативна) |
Через Universal Links |
Через партнерів |
Firebase Analytics — безкоштовно, глибока інтеграція з Google Ads, BigQuery-експорт для сирих даних. Обмеження: затримка даних до 24 годин, обмежені воронки. Для стартапів з Google Ads трафіком — перший вибір.
Amplitude — продуктова аналітика з акцентом на когорти та шляхи користувача. Journeys (колишній Pathfinder) показує реальні шляхи між подіями — не передбачувані воронки, а фактичні маршрути. Session Replay — запис сесій для UX-аналізу. Безкоштовний тир до 10 млн events/місяць достатній для більшості продуктів на старті.
Mixpanel — ближче до Amplitude, сильніший у сегментації в реальному часі. Insights, Funnels, Retention — базові інструменти, які закривають 90% аналітичних завдань продакта.
Більш формальні визначення цих платформ можна знайти у Wikipedia (Firebase) та Wikipedia (Amplitude).
Як вирішити проблему мультиканальної атрибуції з AppsFlyer?
Знати звідки прийшов користувач — окреме завдання. Firebase Attribution працює лише всередині Google-екосистеми. Для мультиканальної атрибуції (Facebook Ads, TikTok, Apple Search Ads, programmatic) потрібен MMP — Mobile Measurement Partner.
AppsFlyer — лідер ринку. OneLink — universal deep link, який працює на iOS та Android і коректно атрибутує встановлення з будь-якого каналу. Protect360 — вбудований захист від fraud (фейкові встановлення, click injection на Android). Adjust та Branch — конкуренти з подібним функціоналом. Branch сильний у deep linking; Adjust популярний у gaming.
Згідно з Apple, з iOS 14.5 застосунки повинні отримувати дозвіл користувача через ATT перед збором IDFA для відстеження. AppsFlyer використовує probabilistic matching (IP + user agent + timing) для цих користувачів — точність нижча, але краще ніж нічого. SKAdNetwork та Privacy Preserving Attribution надають агреговані дані від Apple із затримкою 24-72 години.
Як налаштувати crash-аналітику, щоб не пропускати баги?
Firebase Crashlytics — стандарт для crash reporting. Автоматично групує креші за стектрейсом, показує affected users %, velocity alerts при зростанні crash rate більш ніж на 10% за годину.
Важливо: символікація. На iOS .dSYM файли повинні автоматично завантажуватися при кожній збірці — через Fastlane upload_symbols_to_crashlytics або Xcode Cloud built-in. Без символів креш у Crashlytics виглядає як набір адрес пам'яті. Це трапляється частіше, ніж здається при переході на новий CI — в одному проекті з аудиторією 500k користувачів ми виявили, що 40% крешів залишалися несимволізованими через пропущений етап у CI/CD. Після автоматизації час реакції на баги скоротився з 3 годин до 15 хвилин.
Для React Native та Flutter — @sentry/react-native та sentry_flutter дають додатковий контекст: breadcrumbs, мережеві запити перед крешем, стан Redux/Provider.
Нижче — порівняння популярних інструментів crash-аналітики для вибору під свої завдання.
| Критерій |
Firebase Crashlytics |
Sentry |
Instabug |
| Безкоштовний ліміт |
Безліміт (в рамках Spark) |
5k events/міс |
250 MAU |
| Групування |
За стектрейсом + параметри |
За fingerprint |
За стектрейсом + метадані |
| Символікація |
Автоматична (через файл) |
Автоматична (через CLI) |
Автоматична |
| Velocity alerts |
Так (за % зміни) |
Так (за кількістю) |
Так (за порогом) |
| Дод. контекст |
Logs, Keys, Custom Keys |
Breadcrumbs, User, Tags |
User steps, мережеві запити |
| Ціна |
Безкоштовно (у Firebase) |
Від $26/міс (Team) |
Від $99/міс |
Налаштування оточення
Три оточення з окремими Firebase проектами: dev, staging, production. Змішувати аналітику з тестових сесій і production — поширена помилка, яка спотворює всі метрики. На iOS через GoogleService-Info.plist для кожної схеми, на Android через google-services.json у папці кожного flavor.
Терміни: базова аналітика з Firebase + Crashlytics — 3-5 днів. Повноцінний tracking plan + Amplitude/Mixpanel з воронками та когортами — 2-3 тижні. Атрибуція через AppsFlyer з deep linking та fraud protection — 1-2 тижні. Вартість розраховується індивідуально залежно від складності інтеграцій.
Що входить у нашу роботу
В рамках впровадження аналітики ми надаємо:
- Розробку та узгодження tracking plan з командами продукту та маркетингу.
- Інтеграцію SDK (Firebase, Amplitude, Mixpanel, AppsFlyer) з урахуванням вашого стеку (Swift/Kotlin/Flutter/React Native).
- Налаштування воронок, когорт, дашбордів та алертів.
- Автоматизацію символікації та завантаження .dSYM через Fastlane.
- Документацію щодо подій та параметрів.
- Навчання команди роботі з аналітичною платформою.
- Два тижні пост-релізної підтримки та коригування трекінгу.
Наш досвід — 7 років впровадження аналітики та понад 80 успішних проектів у сфері мобільної розробки. Ми гарантуємо коректність даних і прозорість кожного етапу.
Зв'яжіться з нами, щоб отримати консультацію з налаштування аналітики вашого застосунку. Замовте аудит поточної аналітики — і ми покажемо, які метрики ви втрачаєте.