Реалізація відображення NFT-колекцій у мобільному гаманці
Користувач підключив гаманець — і очікує побачити свої NFT з превью, імям та колекцією. На практиці: частина метаданих лежить в IPFS з недоступним gateway, частина токенів — у кількох мережах одночасно, а зображення важать від 10 КБ до 50 МБ. Все це потрібно відобразити швидко і без краху.
Звідки брати дані NFT
Прямі RPC-виклики до ERC-721 (tokenURI, ownerOf) на кожен токен — це десятки паралельних запитів. Для гаманця з 50+ NFT такий підхід непридатний. Використовуємо агрегуючи API:
-
Alchemy NFT API (
getNFTsForOwner) — повертає всі NFT за адресою з метаданими та URL медіа, підтримує Ethereum, Polygon, Base, Arbitrum - Moralis Web3 API — аналог, плюс підтримка Solana та BNB Chain
- OpenSea API v2 — актуально якщо застосунок орієнтований на торгівлю, дає ціни та floor price
- QuickNode NFT API — підходить для мультичейн-гаманців з користувацькими RPC
Для Solana: getTokenAccountsByOwner через JSON-RPC + Metaplex getAssetsByOwner (DAS API) для метаданих.
Відповідь агрегатора вже містить media[0].gateway — нормалізований URL зображення, не сировий IPFS-хеш. Це важливо: ipfs://Qm... неможливо завантажити напряму в AsyncImage або Glide — потрібен публічний gateway.
IPFS та ненадійні медіа-URL
Частина NFT зберігає метадані та зображення на IPFS через ipfs:// схему. Публічні gateway (ipfs.io, cloudflare-ipfs.com, gateway.pinata.cloud) часто лагають або недоступні. Рішення: пробуємо кілька gateway послідовно з таймаутом 3 секунди, показуємо placeholder та завантажуємо у фоні.
Для SVG, animated GIF, 3D GLB — потрібна окрема обробка. SVG на iOS рендерится через SVGKit або WebView. GLB — через SceneKit/RealityKit або model-viewer у WebView. GIF — FLAnimatedImage (iOS) або Coil з GIF-декодером (Android).
Структура галереї та фільтрація
Групуємо токени за колекцією (contractAddress + name). Відображаємо секціями: назва колекції, кількість токенів, floor price (якщо є). Всередині секції — grid 2–3 колонки.
iOS: UICollectionViewCompositionalLayout з NSCollectionLayoutSection для секцій + UICollectionViewDiffableDataSource для плавних оновлень. При першому завантаженні показуємо skeleton cells через UIView.animate.
Android: LazyVerticalGrid у Compose або RecyclerView з GridLayoutManager + ConcatAdapter для секцій. Завантаження зображень — Coil з кешуванням на диск (DiskCachePolicy.ENABLED).
Flutter: SliverGrid всередині CustomScrollView, зображення через cached_network_image з cacheManager.
Мультисетева фільтрація
У гаманці, що підтримує Ethereum + Polygon + Base, користувач має швидко переключатися між мережами. Зберігаємо NFT локально в Room/CoreData/Hive з полем chainId. Фільтр змінює запит до БД — ніяких повторних мережевих запитів.
Детальний екран токена
Показуємо: зображення / відео / 3D, імя, колекцію, опис, attributes (traits) у вигляді тегів з rarity процентами якщо API їх видає. Посилання на OpenSea/Blur/Magic Eden. Історія трансакцій через getTransfersForToken API.
Терміни: реалізація галереї NFT з підтримкою 2–3 мереж, метаданими та деталями токена — 3–5 робочих днів. Мультичейн з торговими функціями — 1–2 тижні.







