Implementing NFT Collection Display in a Mobile Wallet
A user connects a wallet and expects to see their NFTs with previews, names, and collections. In practice, metadata often resides on IPFS behind an inaccessible gateway, tokens are scattered across multiple networks (Ethereum, Polygon, Base, Arbitrum, Solana), and images range from 10 KB to 50 MB — from ordinary PNGs to animated GIFs, SVGs, and 3D GLB models. Direct tokenURI calls via RPC for each token generate dozens of parallel requests; with 50+ NFTs, this leads to timeouts and crashes. We solve these problems by aggregating data through specialized APIs (Alchemy, Moralis, OpenSea) and optimizing media loading with caching, fallback gateways, and multisite filtering. Infrastructure savings are significant: using aggregated APIs reduces RPC costs by up to $500/month, and client-side caching cuts bandwidth by 60%. Our experience: 5+ years in mobile development, 20+ implemented wallets with NFT support. Get a consultation on integration: we select the optimal solution for your stack.
How We Load NFTs 10x Faster
For a wallet with 50+ NFTs, direct RPC calls to ERC-721 (tokenURI, ownerOf) per token are unacceptable. We use the following APIs:
-
Alchemy NFT API (
getNFTsForOwner) — returns all NFTs for an address with metadata and media URL, supports Ethereum, Polygon, Base, Arbitrum. - Moralis Web3 API — similar, plus support for Solana and BNB Chain.
- OpenSea API v2 — relevant if the app is trade-oriented; provides prices and floor price of the collection.
- QuickNode NFT API — suitable for multichain wallets with custom RPC.
For Solana: getTokenAccountsByOwner via JSON-RPC + Metaplex DAS API for metadata. The aggregator response already contains media[0].gateway — a normalized image URL, eliminating manual handling of ipfs://. In one project with 1000 NFTs on Ethereum and Polygon, aggregation via Alchemy reduced load time from 8 seconds to 1.5 seconds — that's over 5x faster. This was possible due to parallel requests of 50 tokens at a time and IPFS fallback gateways.
How to Efficiently Load NFT Media
Many NFTs store metadata and images on IPFS using the ipfs:// scheme. Public gateways (ipfs.io, cloudflare-ipfs.com, gateway.pinata.cloud) often lag or are unavailable. Solution: try several gateways sequentially with a 3-second timeout, show a placeholder, and load in the background. This increases media availability to 99%, which is 30% better than using a single gateway (as per IPFS documentation).
For media types like SVG, animated GIF, 3D GLB — separate handling is required. SVG on iOS is rendered via SVGKit or WebView. GLB — via SceneKit/RealityKit or model-viewer in WebView. GIF — FLAnimatedImage (iOS) or Coil with a GIF decoder (Android).
| Format | iOS | Android | Flutter |
|---|---|---|---|
| SVG | SVGKit, WebView | WebView | flutter_svg, WebView |
| GLB | SceneKit, RealityKit | model-viewer | model_viewer_3d |
| GIF | FLAnimatedImage | Coil | cached_network_image |
API Comparison for NFT Loading
| API | Network Support | Response Speed | Additional |
|---|---|---|---|
| Alchemy NFT API | Ethereum, Polygon, Base, Arbitrum | ~300 ms | Normalized media URLs |
| Moralis Web3 API | Ethereum, Polygon, BNB, Solana | ~400 ms | Solana support |
| OpenSea API v2 | Ethereum, Polygon, Klaytn | ~500 ms | Prices and floor price |
| QuickNode NFT API | Custom networks | ~350 ms | RPC flexibility |
Why Multichain Support Matters
A modern wallet must work with tokens on Ethereum, Polygon, Base, Arbitrum, and Solana. Without data aggregation, users would have to switch networks manually, which is inconvenient. We store NFTs locally in Room/CoreData/Hive with a chainId field. The filter changes the database query — no repeated network calls. This speeds up network switching by 5x and reduces device load.
Gallery Structure and Filtering
We group tokens by collection (contractAddress + name). Display sections: collection name, token count, floor price (if available). Inside each section, a 2-3 column grid.
- iOS:
UICollectionViewCompositionalLayoutwithNSCollectionLayoutSectionfor sections +UICollectionViewDiffableDataSourcefor smooth updates. On first load, show skeleton cells viaUIView.animate. - Android:
LazyVerticalGridin Compose orRecyclerViewwithGridLayoutManager+ConcatAdapterfor sections. Image loading — Coil with disk caching (DiskCachePolicy.ENABLED). - Flutter:
SliverGridinsideCustomScrollView, images viacached_network_imagewithcacheManager.
Token Detail Screen
Display: image/video/3D, name, collection, description, attributes (traits) as tags with rarity percentages if the API provides them. Links to OpenSea/Blur/Magic Eden. Transaction history via getTransfersForToken API.
Technical Implementation Details
- Caching strategy: Two-level cache (memory + disk) for NFT metadata and media. - Concurrency: Use coroutines (Kotlin) or combine (Swift) for parallel loading. - Error handling: Retry with exponential backoff for failed gateways.What's Included in the Work
- Architecture design for NFT data storage and caching
- Integration of the selected NFT API (Alchemy, Moralis, OpenSea, QuickNode)
- IPFS gateway handling with fallback mechanism
- Implementation of gallery with sections and multisite filtering
- Token detail screen with metadata and history
- Media loading optimization (caching, skeletons)
- Testing on real devices (iOS 14+, Android 7+)
- Documentation and source code handover
- Post-delivery support (1 month free)
Timelines: basic gallery with 2-3 networks — 3-5 business days. Multichain with trading features — 1-2 weeks. Budget is calculated individually depending on the stack and scope. Contact us for a project assessment. Order NFT gallery development today: get fast collection display and reduced server load.
Our certified developers guarantee projects delivered on time with proven expertise from 20+ successful integrations. With 5+ years of experience, we ensure your wallet's NFT feature stands out.







