Впровадження створення (мінтингу) NFT через мобільний додаток
Мінтинг — це виклик функції mint смарт-контракту, яка записує новий токен у блокчейн та прикріплює до нього метадані. Потік мобільного мінтингу складніший, ніж десктопний: необхідно вибрати медіафайл, завантажити його в децентралізоване сховище, сформувати метадані у форматі ERC-721 JSON, потім викликати контракт. Все це має працювати з перериваннями з'єднання, повільним IPFS та обмеженими ресурсами мобільного пристрою.
Завантаження медіа в IPFS
Мінтинг починається з медіафайлу: зображення, відео чи аудіо. Користувачі вибирають зі своєї фотогалереї або знімають нове медіа.
На iOS — використовуйте PHPickerViewController (iOS 14+) для вибору з Photos. На Android — використовуйте ActivityResultContracts.PickVisualMedia (Photo Picker, Android 13+) з резервою на GetContent.
Завантажте медіафайл в IPFS через Pinata, NFT.Storage або Web3.Storage API:
// iOS — завантаження файлу в Pinata IPFS
func pinFileToIPFS(fileURL: URL, fileName: String) async throws -> String {
var request = URLRequest(url: URL(string: "https://api.pinata.cloud/pinning/pinFileToIPFS")!)
request.httpMethod = "POST"
request.setValue("Bearer \(pinataJWT)", forHTTPHeaderField: "Authorization")
let boundary = UUID().uuidString
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
var body = Data()
body.append("--\(boundary)\r\nContent-Disposition: form-data; name=\"file\"; filename=\"\(fileName)\"\r\n")
body.append("Content-Type: image/jpeg\r\n\r\n")
body.append(try Data(contentsOf: fileURL))
body.append("\r\n--\(boundary)--\r\n")
request.httpBody = body
let (data, _) = try await URLSession.shared.data(for: request)
let response = try JSONDecoder().decode(PinataResponse.self, from: data)
return "ipfs://\(response.ipfsHash)"
}
Завантаження великих відеофайлів (100+ МБ) на мобільному має бути фоновою задачею з прогресс-барою. На iOS — використовуйте URLSession з конфігурацією background; на Android — WorkManager з setExpedited.
Формування метаданих ERC-721
Після завантаження медіа — композиція метаданих JSON відповідно до стандарту OpenSea:
// Android — формування JSON метаданих NFT
data class NftMetadata(
val name: String,
val description: String,
val image: String, // ipfs://QmXxx... (CID завантаженого файлу)
val externalUrl: String?,
val attributes: List<NftAttribute>
)
data class NftAttribute(
val traitType: String,
val value: String
)
// Приклад результату
val metadata = NftMetadata(
name = "My NFT #1",
description = "Created via mobile app",
image = "ipfs://QmImageHash...",
attributes = listOf(
NftAttribute("Background", "Blue"),
NftAttribute("Rarity", "Rare")
)
)
Цей JSON також завантажується в IPFS — отримуємо ipfs://QmMetadataHash. Цей URI передається в mint(to, tokenId, metadataURI).
UI форма мінтингу
Мінімальні поля: Name, Description, медіафайл, атрибути (опціонально). Атрибути — це динамічно додавлені пари ключ-значення. Показуйте карточку NFT у реальному часі.
Розділіть прогрес завантаження на три кроки з індикатором:
- Завантаження медіа в IPFS (довгий крок)
- Завантаження метаданих в IPFS (швидко)
- Транзакція мінтингу
Lazy Minting
Якщо газ дорогий — запропонуйте lazy minting: токен не записується в блокчейн негайно. Метадані зберігаються off-chain, а транзакція відбувається при першому продажу (покупець платить газ мінтингу). OpenSea підтримує це через ваучери — EIP-712 підписані повідомлення, які мінтяться при покупці.
// iOS — підпис ваучера для lazy minting (EIP-712)
struct NFTVoucher {
let tokenId: BigUInt
let minPrice: BigUInt
let uri: String
let signature: Data // EIP-712 підпис творця
}
Lazy minting усуває бар'єр «заплатіть газ перед продажем» — важливо для нових творців.
Часова шкала
5 робочих днів: вибір медіа, завантаження в IPFS (Pinata/NFT.Storage), формування ERC-721 метаданих, виклик mint, прогресс-бар через кроки, базова форма атрибутів. Lazy minting через EIP-712 ваучери — додатково 2–3 дні.







