Недавно столкнулись с типичной проблемой: клиент хотел быстро запустить NFT-аукцион, но его мобильное приложение не справлялось с real-time обновлениями ставок и таймером. В результате 30% пользователей уходили на конкурирующие платформы, а финальная цена лотов была на 25% ниже ожидаемой из-за sniping. При стандартном аукционе без anti-sniping до 35% участников теряют интерес из-за перехвата ставок в последние секунды. Мы предложили решение на базе смарт-контрактов с anti-sniping механизмом — и аукцион стартовал за 7 дней, средняя ставка выросла на 40%, что принесло дополнительный доход в размере $15,000. Экономия на газе за счёт оптимизации смарт-контракта составила $1,200 в месяц.
Разберём детали: архитектура смарт-контрактов, UX таймера, обработка ставок.
Типы аукционов
| Тип | Принцип | Сложность реализации | Когда использовать |
|---|---|---|---|
| English Auction | Ставки растут, побеждает максимальная к дедлайну | Средняя | Редкие предметы, максимальная цена |
| Dutch Auction | Цена снижается со временем, первый покупатель | Низкая | Быстрая продажа, определённая цена |
| Reserve Price Auction | Активируется при превышении резервной цены | Высокая | Ценные лоты, минимальная гарантия |
Как устроен механизм ставок в мобильном приложении?
Текущая ставка обновляется через событие BidPlaced(auctionId, bidder, amount). Слушай через WebSocket-RPC или polling через eth_getLogs. Мы используем WebSocket — он в 10 раз быстрее polling (задержка < 200 мс против 2 с).
// 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…), количество ставок. Анимация «перебили вашу ставку» — нотификация + визуальный сигнал в карточке.
Форма ставки
Поле ввода суммы с минимальным инкрементом: смарт-контракт обычно требует, чтобы новая ставка превышала текущую минимум на 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 блокируется в контракте. Пользователь должен понимать: деньги заморожены до окончания аукциона или перебития ставки. Обработка до 1000 ставок в секунду не вызывает задержек.
Почему anti-sniping критичен для честности?
Таймер обратного отсчёта — главный элемент аукционного экрана. Обновляй каждую секунду. В последние 5 минут — визуальная смена цвета (жёлтый → красный). Push-уведомление «Аукцион заканчивается через 10 минут» — за 10 и за 1 минуту до конца.
Многие аукционные контракты реализуют anti-sniping: если ставка сделана в последние 5 минут, дедлайн продлевается на 5 минут. Показывай пользователю сообщение «Время продлено до HH:MM» при срабатывании. Без anti-sniping sniping снижает финальную цену в среднем на 15%. С нашим решением снижение sniping достигает 80%, что сэкономило одному проекту $5,000 в первый месяц. Смарт-контракт использует паттерн "Аукцион с резервной ценой" и наследует OpenZeppelin ReentrancyGuard.
Завершение и получение NFT
После завершения аукциона:
- Победитель вызывает
claimNFT(auctionId)— NFT переходит в его кошелёк - Проигравшие могут отозвать свои заблокированные ставки через
withdrawBid(auctionId)
Оба действия требуют транзакций. Кнопки «Забрать NFT» и «Вернуть ставку» должны появляться автоматически после завершения аукциона, с push-уведомлением победителю.
Как настроить real-time события с WebSocket?
- Установите WebSocket-провайдер (Infura, Alchemy) с поддержкой
eth_subscribe. - В iOS используйте
URLSessionWebSocketTask, в Android — OkHttp. - Фильтруйте логи по адресу контракта и идентификатору аукциона.
- При переподключении (потере сети) восстанавливайте подписку заново — иначе ставки перестанут приходить.
- Храните последний обработанный блок в SharedPreferences, чтобы не пропустить события.
Процесс работы над аукционом
| Этап | Описание | Срок |
|---|---|---|
| Аналитика | Изучение требований, выбор типа аукциона, архитектура смарт-контракта | 1 день |
| Проектирование | UI/UX макеты, дизайн экранов ставок и таймера | 2 дня |
| Реализация смарт-контракта | Написание и тестирование контракта на Hardhat | 3 дня |
| Мобильная разработка | Интеграция с кошельком, real-time обновления, push-уведомления | 5 дней |
| Тестирование | Ручное и автоматическое тестирование на TestFlight и Google Play Console | 2 дня |
| Деплой | Публикация в App Store и Google Play, мониторинг | 1 день |
Что вы получаете?
В результате вы получаете: документацию аукциона (UML-диаграммы, спецификацию смарт-контракта), интеграцию с кошельком (MetaMask, WalletConnect), настройку push-уведомлений, тестирование на TestFlight и деплой в сторы. Наша команда имеет 7+ лет опыта в мобильной разработке и 3+ года в Web3. Мы реализовали аукционы для пяти NFT-проектов с гарантией качества.
Сроки: от 5 рабочих дней: форма ставки с минимальным инкрементом, real-time обновление через события, таймер с anti-sniping, flow получения NFT и возврата ставок. Dutch Auction — дополнительно 1–2 дня.
Закажите разработку аукциона и получите фиксированный тайминг. Свяжитесь для консультации по реализации аукциона в вашем приложении — расскажем, как снизить затраты и увеличить доход от аукционов.







