Як реалізувати перегляд прибутковості 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-гаманець з переглядом прибутковості у вашому мобільному додатку.







