Реалізація внутрішньоігрового NFT-гаманця в мобільній GameFi-грі
Гравець натиснув «екіпірувати» — інтерфейс завис, транзакція впала, NFT не з'явився. За годину він пішов до конкурентів. У GameFi кожна транзакція — виклик UX. Якщо гаманець не оптимізований під ігровий контекст, користувацький досвід руйнується. Ми вирішуємо це завдання комплексно: від вибору архітектури до деплою в стори. Наша команда — 7+ років у мобільній розробці, 15+ GameFi-проєктів, включаючи інтеграції з Immutable X, Polygon, Ronin.
Архітектура під масову аудиторію
Вибір між custodial, non-custodial та embedded гаманцем визначає всю архітектуру. Custodial (ключі на сервері) — простий онбординг, але KYC та довіра до сервера. Non-custodial (ключі в Keystore/Secure Enclave) — повний контроль, але складність для гравця. Embedded wallet через MPC-бібліотеки (Privy, Magic, Dynamic) — компроміс: вхід по email/social, ключі в HSM. Для casual GameFi останніх років це де-факто стандарт.
Як обрати тип гаманця для GameFi?
Критерії вибору: аудиторія, частота транзакцій, бюджет на онбординг.
| Параметр | Custodial | Non-custodial | Embedded |
|---|---|---|---|
| Онбординг | Email/пароль | Сид-фраза | Email/social |
| Безпека | Сервер (HSM) | Keystore/Secure Enclave | MPC + HSM |
| KYC | Потрібен у ряді країн | Не потрібен | Зазвичай не потрібен |
| Газ | Оплачує розробник | Користувач | Розробник/користувач |
| Вартість розробки | Середня | Висока | Середня |
Для ігор з мільйонами користувачів embedded — оптимальний баланс.
Чому Optimistic UI критичний в ігрових транзакціях?
Транзакція в блокчейні — не HTTP-запит. Вона потрапляє в mempool, чекає включення в блок (10 секунд на Polygon, миттєво на Ronin). За цей час користувач продовжує грати. Блокування інтерфейсу неприпустиме.
Паттерн: Optimistic UI + фоновий моніторинг. Одразу оновлюємо стан (екіпірування, отримання нагороди), відправляємо транзакцію, відстежуємо її статус. Якщо fail — відкочуємо.
// iOS — optimistic update func equipItem(_ nft: NftItem) { store.dispatch(EquipAction(tokenId: nft.tokenId)) Task { do { let txHash = try await walletService.equip(nft) await monitor(txHash: txHash, onFail: { store.dispatch(UnequipAction(tokenId: nft.tokenId)) showError("Транзакція не пройшла") }) } catch { store.dispatch(UnequipAction(tokenId: nft.tokenId)) } } } Моніторинг — polling через WebSocket або JSON-RPC кожні 3–5 секунд.
Gas estimation та fee UI
Для non-custodial гаманця показуємо gas перед підтвердженням. eth_estimateGas → gasPrice → конвертація в USD через CoinGecko API. Не показувати нативний токен без USD-еквіваленту — гравець не знає, скільки коштує 0.0023 MATIC. Immutable X забезпечує газ-free трансфери, що в 100 разів дешевше Polygon і в 1000 разів дешевше Ethereum. Середня вартість транзакції на L2 становить менше $0.001, економія на газі досягає 99% порівняно з Ethereum. Порівняння мереж:
| Мережа | Середня вартість трансферу NFT | Час підтвердження |
|---|---|---|
| Ethereum | $30–100 | 10–20 хв |
| Polygon | < $0.001 | ~2 сек |
| Immutable X | 0 | Миттєво |
| Ronin | < $0.001 | ~1 сек |
Локальне зберігання NFT-даних
Метадані NFT завантажуємо через tokenURI (ERC-721) або IPFS-гейт. Кешуємо локально — Room / Core Data. Зображення — окремий кеш через Glide (Android) / Kingfisher (iOS) з IPFS URL.
@Entity(tableName = "nft_items") data class NftItem( @PrimaryKey val tokenId: String, val contractAddress: String, val name: String, val imageUrl: String, val metadata: String, // JSON val isEquipped: Boolean = false, val cachedAt: Long = System.currentTimeMillis() ) IPFS URLs транслюємо через власний gateway для стабільності.
Транзакційний UX — найскладніше
Типові помилки при інтеграції гаманця
- Не враховувати затримки підтвердження та не передбачити fallback - Відсутність кешу метаданих — кожне відкриття інвентаря викликає завантаження - Ігнорування правил App Store (заборона фіатних продажів NFT без IAP) - Зберігання ключів у SharedPreferences або UserDefaultsБезпека приватних ключів
Non-custodial: ключ тільки в Android Keystore або iOS Secure Enclave. Підпис транзакції всередині сховища — ключ не покидає захищену область.
val keyStore = KeyStore.getInstance("AndroidKeyStore") keyStore.load(null) val privateKey = keyStore.getKey(KEY_ALIAS, null) as PrivateKey val signature = Signature.getInstance("SHA256withECDSA") signature.initSign(privateKey) signature.update(transactionHash) val signedBytes = signature.sign() NFT-інвентар та фільтрація
Інвентар з 200+ NFT фільтрується миттєво через Room запити. Використовуємо LazyColumn або UICollectionView з DiffableDataSource. Сортування за rarity_score з метаданих.
App Store / Google Play та Web3
Apple приймає NFT-додатки, але забороняє покупку NFT через сторонні платіжні системи без комісії App Store (30%). Допустимо: показ NFT, трансфер між гаманцями, використання в грі. Заборонено: продаж за фіат без IAP. Для marketplace — тільки WebView із зовнішнім сайтом. Google Play дозволив NFT явно, але ті ж правила фіатних продажів. App Store Review Guidelines 3.1.1.
Покроковий процес інтеграції
- Аналіз ігрової економіки — визначаємо тип гаманця, L2, бюджет на газ.
- Проєктування архітектури — вибір бібліотек (Privy/Magic/Dynamic), схема кешу, модель даних.
- Інтеграція смарт-контрактів — підключення ERC-721/ERC-1155, розрахунок gas.
- Реалізація клієнтської частини — гаманець, Optimistic UI, моніторинг, кеш.
- Тестування на TestFlight/Firebase — симуляція 1000+ транзакцій.
- Деплой в стори — перевірка відповідності гайдлайнам Apple/Google.
Що входить в роботу
- Вибір архітектури гаманця (custodial, non-custodial, embedded) під вашу економіку
- Проєктування схеми кешу та моделі даних NFT
- Інтеграція смарт-контрактів та розрахунок газу
- Реалізація клієнтської частини з Optimistic UI та моніторингом транзакцій
- Тестування на TestFlight/Firebase з симуляцією пікових навантажень
- Допомога в проходженні рев'ю App Store та Google Play
- Документація та передача вихідного коду
- Гарантійна підтримка на 3 місяці після деплою
Строки
Базовий custodial гаманець з переглядом NFT та трансферами: 1–2 тижні. Full-featured некастодіальний з ігровою механікою та Optimistic UI: 3–5 тижнів. Вартість розраховується індивідуально залежно від обраної мережі та обсягу інтеграцій.
Отримайте консультацію щодо архітектури гаманця для вашої гри — оцінимо проєкт за 2 дні. Зв'яжіться з нами, щоб обговорити інтеграцію.







