Клієнт приходить із задачею об'єднати баланси з Binance, MetaMask і Bybit в одному екрані. Типова проблема: дані розрізнені, формати відрізняються, ручне введення займає години. Ми беремо на себе агрегацію портфеля — збір даних з біржових API, on-chain гаманців та ручного введення з актуальними цінами. Наш досвід інтеграції понад 50 криптосервісів дозволяє передбачити нюанси та гарантувати коректну роботу з першого запуску. За 5 років роботи ми виконали понад 15 проєктів з трекінгу криптопортфеля для мобільних додатків. Результат — повноцінний трекінг портфеля криптоактивів, доступний у режимі реального часу. Інтеграція двох бірж та on-chain балансів коштує від $2000 до $5000 залежно від складності. Використання нашого рішення економить до 40 годин ручної роботи на місяць, що при ставці $50/год дорівнює $2000 економії щомісяця.
У статті розберемо технічну реалізацію: звідки беруться дані, як кешувати, оновлювати у фоні та типові помилки. Використовуємо Swift 5.9+ на iOS, Kotlin + Jetpack Compose на Android, Flutter або React Native для кросплатформи. Усі приклади коду — з реальних проєктів. Це мобільний додаток для крипти, який об'єднує всю картину.
Як організувати трекінг криптопортфеля: збір даних з бірж та гаманців
Три джерела даних, кожне зі своїми особливостями. Ми забезпечуємо безшовну інтеграцію незалежно від протоколу. Для агрегації балансів бірж використовуємо read-only API.
Біржові API
Binance /api/v3/account повертає баланси спот-гаманця, але вимагає HMAC підпис з timestamp і recvWindow (за замовчуванням 5000 мс). Bybit V5 /v5/account/wallet-balance — аналогічно. Ми зберігаємо API ключі бірж зашифрованими на пристрої (iOS Keychain, Android Keystore), приватні ключі нікуди не передаються — лише read-only API keys з IP-білим списком, якщо біржа підтримує.
On-chain гаманці
Для Ethereum-гаманців використовуємо Alchemy або Infura: /eth_getBalance плюс alchemy_getTokenBalances для ERC-20. Для Solana — getTokenAccountsByOwner через Helius або QuickNode. Адреса публічна, ключі не потрібні — це найбезпечніший канал. Один запит до ноди повертає баланс за 100–300 мс, а для 10+ токенів — до 2 секунд.
Ручне введення
Частину активів (стейкінг, p2p, апаратні гаманці) користувачі додають вручну. Проста форма: тікер + кількість. Ми об'єднуємо їх з автоматичними джерелами та показуємо загальну картину.
Актуальні ціни — через CoinGecko API /simple/price (до 30 тікерів за запит) або CoinMarketCap Pro API. CoinGecko безкоштовний план обмежений 30 запитами/хвилину — для додатку з фоновим оновленням додатку вистачає, якщо кешувати ціни з TTL 60 секунд.
Приклад агрегації на Swift з паралельними запитами
// iOS, Swift — агрегація портфеля
actor PortfolioAggregator {
private let exchangeService: ExchangeService
private let priceService: PriceService
private let walletService: WalletService
func aggregate() async throws -> Portfolio {
async let exchangeBalances = exchangeService.fetchAll()
async let onchainBalances = walletService.fetchAll()
let (exchange, onchain) = try await (exchangeBalances, onchainBalances)
let allTickers = (exchange + onchain).map(\.ticker)
let prices = try await priceService.getPrices(tickers: allTickers)
let positions = (exchange + onchain).map { balance in
PortfolioPosition(
ticker: balance.ticker,
amount: balance.amount,
priceUsd: prices[balance.ticker] ?? 0,
source: balance.source
)
}
return Portfolio(positions: positions, updatedAt: .now)
}
}
Використання Swift async let дозволяє запитувати біржі та on-chain баланси паралельно — агрегація вкладається в 1–2 секунди замість послідовних 4–5. Паралельні запити швидші в 2–3 рази за послідовні, що значно покращує UX. Локальне кешування даних криптоактивів прискорює завантаження даних у 5 разів порівняно з прямими запитами до API. Це важливо для offline-режиму: користувач відкриває додаток без мережі та бачить останні актуальні дані з позначкою часу.
Як кешувати дані та оновлювати їх у фоні?
Баланси кешуються локально — SQLite через drift (Flutter) або CoreData/SwiftData (iOS). Локальне кешування даних криптоактивів прискорює завантаження даних у 5 разів порівняно з прямими запитами до API. Це важливо для offline-режиму: користувач відкриває додаток без мережі та бачить останні актуальні дані з позначкою часу.
Фонове оновлення на iOS — через BGAppRefreshTask. Планується при переході у фон, система викликає задачу раз на 15–30 хвилин. На Android — WorkManager з PeriodicWorkRequest(15, TimeUnit.MINUTES). Нижче порівняння підходів:
| Функція | iOS BGAppRefreshTask | Android WorkManager |
|---|---|---|
| Мінімальний інтервал | 15–30 хв (залежить від iOS) | 15 хв |
| Управління системою | iOS вирішує, коли запускати | Гарантоване виконання у вікні |
| Складність реалізації | Проста, одне завдання | Гнучкі ланцюжки та умови |
| Offline-підтримка | Пріоритет на останні дані | Кеш + повтор при появі мережі |
Як налаштувати фонове оновлення на iOS: крок за кроком
- Додайте capability Background Modes -> Background fetch.
- Зареєструйте задачу в AppDelegate:
BGTaskScheduler.shared.register(forTaskWithIdentifier: "refreshPortfolio", using: nil) { task in ... } - Заплануйте:
BGAppRefreshTaskRequest(identifier: "refreshPortfolio")з earliestBeginDate.
Як налаштувати фонове оновлення на Android: крок за кроком
- Додайте залежність WorkManager у build.gradle.
- Створіть періодичну роботу:
PeriodicWorkRequestBuilder<RefreshWorker>(15, TimeUnit.MINUTES).build() - Поставте в чергу:
WorkManager.getInstance(context).enqueueUniquePeriodicWork(...)
Оновлення в реальному часі для цін — WebSocket. Binance надає wss://stream.binance.com:9443/stream?streams=btcusdt@ticker/ethusdt@ticker. При відкритому додатку підключаємося до стріму, при згортанні — відключаємося та покладаємося на кеш.
Які проблеми виникають при інтеграції крипто-бірж?
Clock skew на біржових запитах
Binance вимагає, щоб timestamp у запиті відрізнявся від серверного часу не більше ніж на recvWindow (за замовчуванням 5000 мс). На Android-пристроях годинник іноді відстає. Рішення: перед першим запитом синхронізувати час через /api/v3/time та застосовувати offset.
Rate limits при множині бірж
Якщо користувач додав 5 бірж, одночасні запити можуть вичерпати ліміти. Потрібна черга з контролем частоти: одна біржа — один слот у черзі, затримка 200 мс між запитами до одного endpoint.
Різні формати тікерів
Binance повертає BTC, Bybit — BTC, CoinGecko приймає bitcoin (id), не символ. Потрібна таблиця мапінгу тікер → CoinGecko id, яку періодично синхронізуємо через /coins/list.
Що входить у нашу роботу
- Інтеграція Binance API, Bybit API, OKX API з HMAC підпис
- Завантаження on-chain балансів (EVM через Alchemy, Solana опціонально)
- Кешування даних крипто в локальній БД з offline-підтримкою
- Фонове оновлення додатку (BGAppRefreshTask / WorkManager)
- Дашборд: загальна вартість, 24h change, pie chart по активах
- Зберігання API ключів бірж у Keychain / Keystore
Ми — команда з 5+ років досвіду в крипто-розробці, реалізували 15+ проектів з трекінгу портфеля.
Строки
| Обсяг робіт | Час |
|---|---|
| 2 біржі + on-chain + дашборд | 5–8 робочих днів |
| Кожна додаткова біржа | +1–2 дні |
| Додавання on-chain Solana | +2 дні |
Вартість розраховується індивідуально після аналізу вимог. Для обговорення вашого проєкту зв'яжіться з нами — ми підберемо оптимальне рішення. Отримайте консультацію щодо вашого проєкту вже сьогодні.







