Баланс токенів ERC-20/BEP-20/SPL у мобільному гаманці
Уявіть: користувач відкриває гаманець і чекає завантаження балансу по одному токену — секунда на кожен. При 20 токенах це 20 секунд. Користувач закриває застосунок. Класичний RPC-запит на кожен контракт дає затримку 2-3 секунди на токен, разом хвилина для портфеля з 30 активів. Ми вирішуємо це завдання через пакетне завантаження з Multicall3, кешування та паралельні запити для різних мереж. Наш досвід показує: правильна архітектура скорочує час завантаження до 1-2 секунд, незалежно від кількості токенів. Економія часу сягає 20-кратного прискорення — користувачі не йдуть, а конверсія в операції зростає.
Як пакетно завантажити баланси?
Multicall3 — контракт 0xcA11bde05977b3631167028862bE2a173976CA11, задеплоєний у більшості EVM-мереж (Ethereum, Polygon, BNB Chain, Arbitrum, Optimism, Base). Один виклик aggregate3 повертає баланси всіх токенів за одну транзакцію читання. Порівняння методів:
| Метод | Час на 20 токенів | Навантаження на ноду | Підтримка мереж |
|---|---|---|---|
| Послідовні RPC | 4-6 секунд | 20 викликів | Будь-яка EVM |
| Multicall3 | 0.3-0.6 секунди | 1 виклик | Більшість EVM |
| JSON-RPC batch | 0.5-1 секунда | 1 batch-запит | Всі EVM (без Multicall) |
Multicall3 скорочує кількість RPC-викликів у 20 разів і в 10-20 разів швидше послідовних запитів.
Покрокова інтеграція Multicall3
- Ініціалізуйте Multicall3-контракт у коді гаманця. Адреса єдина для всіх мереж —
0xcA11bde05977b3631167028862bE2a173976CA11. - Зберіть масив
Call3для кожного токена: target, allowFailure: true, callData =balanceOf(address). - Викличте
aggregate3— отримайте масив результатів з rawBalance та success. - Обробіть результати: для кожного токена витягніть rawBalance, поділіть на 10^decimals.
- Відобразіть баланси в UI паралельно із завантаженням курсів.
// iOS — web3swift + Multicall3 let multicallAddress = EthereumAddress("0xcA11bde05977b3631167028862bE2a173976CA11")! var calls: [Multicall3.Call3] = [] for tokenAddress in tokenAddresses { let callData = ERC20.balanceOf(owner: walletAddress).encodeABI() calls.append(.init(target: tokenAddress, allowFailure: true, callData: callData)) } let results = try await multicall3.aggregate3(calls: calls) // Android — web3j + ручна збірка Multicall val multicallEncoder = Function("aggregate3", listOf(DynamicArray(calls)), listOf()) val encodedCall = FunctionEncoder.encode(multicallEncoder) val response = web3j.ethCall(Transaction.createEthCallTransaction(null, multicallAddress, encodedCall), DefaultBlockParameterName.LATEST).send() Для мереж без Multicall3 (деякі L2 або приватні EVM-мережі) — JSON-RPC batch request: масив викликів в одному HTTP-тілі. Більшість нод підтримують до 100 запитів у batch.
Що робити з SPL-токенами на Solana?
Solana принципово відрізняється: кожен SPL-токен зберігається на окремому Associated Token Account (ATA). Список ATA для гаманця отримують через getTokenAccountsByOwner з програмою TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA.
// iOS — SolanaSwift let tokenAccounts = try await solana.action.getTokenAccountsByOwner( pubkey: walletPublicKey, params: .init(programId: TokenProgram.publicKey), configs: nil ) for account in tokenAccounts { let mint = account.account.data.parsed.info.mint let amount = account.account.data.parsed.info.tokenAmount.uiAmount } У користувача може бути 50+ ATA, включаючи нульові баланси від старих airdrop'ів. Нульові ми приховуємо за замовчуванням, але даємо опцію «показати всі». Це тримає UI чистим, не втрачаючи інформацію.
Чому важливі decimals і курси?
Відображення балансу без фіатного еквівалента — половина роботи. Для отримання курсів використовуємо CoinGecko API (/simple/price?ids=...&vs_currencies=usd) або CoinMarketCap. CoinGecko Free tier — 30 запитів на хвилину, достатньо для більшості гаманців. Ключі токенів — це contract address, не тікер. Для Ethereum: https://api.coingecko.com/api/v3/simple/token_price/ethereum?contract_addresses=0x...&vs_currencies=usd. Запит до 100 контрактів за раз — пакетуємо.
Decimals токена критично важливі: згідно зі специфікацією ERC-20, контракт повертає баланс у мінімальних одиницях. USDC — 6 decimals, ETH — 18. Відображуваний баланс: rawBalance / 10^decimals. Помилка в decimals — баланс покаже астрономічну або нульову суму. Ми гарантуємо коректне зчитування decimals з контракту при ініціалізації.
Типові помилки при роботі з decimals:
- Контракт повертає decimals = 0 для токенів, що не реалізують
decimals(), — використовуємо fallback 18. - Деякі токени (наприклад, USDT на Tron) мають 6 decimals, але на EVM-версіях — 6 або 18.
- При додаванні нового токена вручну користувач може ввести невірні decimals — перевіряємо через ончейн-дані.
Схема кешування та частота оновлення
| Дані | Частота оновлення | Зберігання |
|---|---|---|
| Баланси токенів | Кожні 30 сек / pull-to-refresh | In-memory |
| Список токенів користувача | При кожному запуску | SQLite / UserDefaults |
| Курси токенів | Кожні 60 сек | In-memory + disk cache |
| Метадані токена (ім'я, decimals) | Одноразово | SQLite |
Особистий кейс: для одного DeFi-проєкту ми інтегрували відображення балансів у 4 мережах (Ethereum, BSC, Polygon, Solana) і 30 токенах. Час завантаження скоротився з 12 секунд до 2,5 секунд завдяки пакетним запитам і кешуванню курсорів.
Що входить у роботу
- Проєктування архітектури завантаження балансів під вашу цільову аудиторію.
- Інтеграція Multicall3 для EVM-мереж та
getTokenAccountsByOwnerдля Solana. - Підключення фіатних курсів з кешуванням.
- Розробка UI списку токенів з pull-to-refresh, пошуком і приховуванням нульових.
- Тестування на 10+ популярних токенах у кожній мережі.
- Передача доступів до App Store Connect / Google Play Console.
- Документація з експлуатації та підтримка протягом місяця після релізу.
Строки орієнтовно
Від 3 до 7 днів залежно від кількості мереж і вимог до UI. Для типового рішення (EVM + Solana + курси) — 5 днів. Зв'яжіться з нами — ми оцінимо ваш проєкт безкоштовно і назвемо точні строки. Наші інженери мають 5+ років досвіду в мобільній розробці і гарантують дотримання App Store Review Guidelines та Play Console політик.
Замовте реалізацію відображення балансу токенів у вашому гаманці — отримайте готове рішення під ключ. Отримайте консультацію прямо зараз.







