Реализация аукциона NFT в мобильном приложении
NFT-аукцион — это смарт-контракт с таймером. Владелец выставляет токен с начальной ценой и дедлайном. Покупатели делают ставки; каждая новая ставка блокирует ETH в контракте, а предыдущему участнику возвращаются средства. По истечению времени победитель забирает NFT, продавец — ETH.
На практике аукционный UX на мобильном — один из самых сложных в Web3: real-time обновление текущей ставки, таймер, конкурентные ставки (кто-то перебил за 3 секунды до конца), возврат средств. Каждый из этих сценариев нужно обрабатывать.
Типы аукционов
English Auction (открытый): ставки растут, побеждает максимальная к дедлайну. Самый распространённый.
Dutch Auction: цена начинается высокой и снижается со временем. Первый покупатель по текущей цене получает NFT. Прост в реализации, не требует ставок — только один вызов buy().
Reserve Price Auction: аукцион активируется только если хотя бы одна ставка превысила резервную цену. До этого ставки принимаются, но NFT не продаётся.
Real-time обновления: события смарт-контракта
Текущая ставка обновляется через событие BidPlaced(auctionId, bidder, amount). Слушай через WebSocket-RPC или polling через 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 рабочих дней: форма ставки с минимальным инкрементом, real-time обновление через события, таймер с anti-sniping, flow получения NFT и возврата ставок. Dutch Auction — дополнительно 1–2 дня.







