Впровадження продажу NFT в мобільних додатках
Щоб виставити NFT на продаж, необхідно виконати дві операції: надати дозвіл маркетплейсу керувати токеном (approve або setApprovalForAll) та створити лістинг. Це дві окремі транзакції — отже, два видатки газу та два підтвердження користувача. UX має провести користувачів через це гладко.
setApprovalForAll vs approve
setApprovalForAll(marketplaceAddress, true) — один дозвіл для всіх токенів у колекції. Користувач затверджує один раз, потім може виставляти будь-який NFT з цієї колекції без повторного approval.
approve(marketplaceAddress, tokenId) — дозвіл для конкретного токена. Безпечніше, але кожен лістинг потребує окремої транзакції.
Рекомендований UX: при першому лістингу з колекції запропонуйте setApprovalForAll з поясненням: «Затвердіть один раз для всієї колекції, щоб не платити газ при кожному продажу». Користувачі мають розуміти наслідки.
// iOS — перевірка дозволу перед лістингом
func checkApproval(nftContract: EthereumAddress, owner: EthereumAddress) async -> Bool {
let erc721 = ERC721(web3: web3, provider: web3.provider, address: nftContract)
return (try? await erc721.getApproved(tokenId: tokenId) == marketplaceAddress)
?? (try? await erc721.isApprovedForAll(owner: owner, operator: marketplaceAddress))
?? false
}
Форма лістингу
Мінімальні необхідні поля: ціна (в ETH або ERC-20 токені), опціональний дедлайн лістингу. Показуйте розраховану чисту суму, яку отримає продавець, з урахуванням комісій прямо у формі: netAmount = price * (1 - platformFee - royalty).
// Android — розрахунок чистої суми продавця
data class ListingFeeBreakdown(
val grossPrice: BigDecimal,
val platformFeePercent: BigDecimal,
val royaltyPercent: BigDecimal
) {
val platformFeeAmount get() = grossPrice * platformFeePercent / BigDecimal(100)
val royaltyAmount get() = grossPrice * royaltyPercent / BigDecimal(100)
val sellerReceives get() = grossPrice - platformFeeAmount - royaltyAmount
}
Роялті береться з ERC2981.royaltyInfo(tokenId, price). Показуйте рядок «Роялті творцю: X%» — це важливо для прозорості.
Потік створення лістингу
- Перевірити дозвіл → якщо не надано, відправити
approve/setApprovalForAll - Чекати підтвердження дозволу
- Відправити
listItem(nftAddress, tokenId, price, deadline) - Після підтвердження — NFT з'являється в каталозі
Кожен крок включає індикатор прогресу. Якщо користувач закриє програму після кроку 1, при наступному запуску перевірте вже надану чинність дозволу та запропонуйте продовжити з кроку 3.
Зміна ціни та видалення з продажу
updateListing(nftAddress, tokenId, newPrice) — одна транзакція без потреби повторного дозволу.
cancelListing(nftAddress, tokenId) — видаляє лістинг. Після підтвердження — NFT зникає з каталогу. Важливо: показуйте кнопку «Видалити лістинг» лише коли лістинг дійсно активний (перевірено on-chain або через індексатор).
Часова шкала: 3–5 днів: форма лістингу з розбивкою комісій, потік approve + list з контрольними точками, оновлення та скасування лістингів.







