Впровадження аукціонів NFT в мобільних додатках
Аукціон NFT — це смарт-контракт з таймером. Власник виставляє токен з початковою ціною та дедлайном. Покупці роблять ставки; кожна нова ставка блокує ETH у контракті та повертає кошти попередньому учаснику. По закінченню часу переможець отримує NFT, продавець отримує ETH.
На практиці UX аукціону на мобільному — один із найскладніших Web3 досвідів: оновлення ставок у реальному часі, таймери, конкурентні ставки (хтось перебить за 3 секунди до кінця), повернення коштів. Кожен сценарій має бути обробленим.
Типи аукціонів
English Auction (Відкритий): ставки зростають, найвища ставка на дедлайні перемагає. Найпоширеніший.
Dutch Auction: ціна починається високою та зменшується з часом. Перший покупець за поточною ціною отримує NFT. Простий в реалізації, не потребує ставок — просто один виклик buy().
Reserve Price Auction: аукціон активується лише якщо щонайменше одна ставка перевищує ціну резерву. Ставки приймаються раніше, але NFT не продається.
Оновлення у реальному часі: Події смарт-контракту
Поточна ставка оновлюється через подію BidPlaced(auctionId, bidder, amount). Слухайте через WebSocket-RPC або опитування через eth_getLogs.
// Android — підписка на події аукціону через web3j
fun subscribeToAuctionBids(auctionId: BigInteger): Flow<BidPlacedEvent> = callbackFlow {
val subscription = auctionContract.bidPlacedEventFlowable(
DefaultBlockParameterName.LATEST,
DefaultBlockParameterName.LATEST
)
.filter { it.auctionId == auctionId }
.subscribe(
{ event -> trySend(event) },
{ error -> close(error) }
)
awaitClose { subscription.dispose() }
}
Оновлюйте UI при кожній новій події: поточна ставка, адреса лідера (скорочене ENS або 0x…), кількість ставок. Анімуйте «перебили вашу ставку» — уведомлення + візуальний сигнал на карточці.
Форма ставки
Поле введення суми з мінімальним інкрементом: смарт-контракти зазвичай вимагають, щоб нова ставка перевищувала поточну щонайменше на N% (наприклад, 5%). Показуйте мінімально дозволену ставку прямо в полі.
// iOS — розрахунок мінімальної наступної ставки з інкрементом
func minNextBid(currentBid: BigUInt, incrementPercent: Int = 5) -> BigUInt {
let increment = currentBid * BigUInt(incrementPercent) / 100
let minimum = currentBid + max(increment, BigUInt(1_000_000_000_000_000)) // щонайменше 0.001 ETH
return minimum
}
При успішній ставці — ETH блокується в контракті. Користувачі мають розуміти: кошти заморожені до закінчення аукціону або поки ставка не буде перебита.
Таймер та Anti-Sniping
Таймер зворотного відліку — головний елемент аукціонного екрану. Оновлюйте щосекунди. У останні 5 хвилин — змініть колір візуально (жовтий → червоний). Push-уведомлення «Аукціон закінчується через 10 хвилин» — за 10 і за 1 хвилину до кінця.
Багато аукціонних контрактів реалізують anti-sniping: якщо ставка зроблена в останні X хвилин, дедлайн продовжується на Y хвилин. Показуйте користувачам «Час продовжено до HH:MM» при спрацюванні.
Завершення та отримання NFT
Після закінчення аукціону:
- Переможець викликає
claimNFT(auctionId)— NFT переходить в його гаманець - Переможені можуть відозвати свої заблоковані ставки через
withdrawBid(auctionId)
Обидві дії потребують транзакцій. Кнопки «Забрати NFT» та «Повернути ставку» мають з'явитися автоматично після закінчення аукціону, з push-уведомленням переможцю.
Часова шкала: 5 робочих днів: форма ставки з мінімальним інкрементом, оновлення у реальному часі через події, таймер з anti-sniping, потік отримання NFT та повернення ставок. Dutch Auction — додатково 1–2 дні.







