Реализация уведомлений о торгах NFT в мобильном приложении
Представьте: на OpenSea продаётся ваш редкий NFT за 2 ETH, но push-уведомление не приходит. Пользователь узнаёт об этом через 5 минут, когда polling кошелька подтягивает баланс. Для трейдера это — потеря потенциальной сделки, для маркетплейса — снижение LTV. Мы строим систему push-уведомлений, которая доставляет события о продажах, листингах и офферах в реальном времени с задержкой менее 1 секунды. За плечами — более 10 лет мобильной разработки и 50+ интеграций с криптоплатформами. Закажите консультацию — и мы подберём оптимальную архитектуру под ваш стек.
Какие источники данных о торгах NFT существуют?
Основных сценариев несколько: продажа NFT из коллекции в watchlist, новый листинг с ценой ниже floor, принятие оффера, минт новой коллекции. Каждый требует отдельного источника данных и разного подхода к polling.
OpenSea предоставляет Stream API (wss://stream.openseabeta.com/socket) с событиями item_listed, item_sold, offer_entered. Подписка осуществляется по коллекции или адресу кошелька. Это самый быстрый вариант для Ethereum и Polygon — задержка менее 1 секунды. Документация OpenSea рекомендует использовать этот стрим как основной источник реального времени.
Blur и Magic Eden имеют собственные API, но их WebSocket-стримы менее стабильны. Поэтому мы чаще используем polling через REST с интервалом 15–30 секунд, что даёт достаточную точность для большинства сценариев.
Для мультичейн-трекинга (Solana + ETH) удобнее агрегаторы: Reservoir API (api.reservoir.tools) покрывает большинство маркетплейсов и предоставляет единый формат событий. Нагрузка на сервер при этом снижается на 30% за счёт агрегации.
Архитектура доставки уведомлений
Серверный подписчик слушает WebSocket-стрим → при событии проверяет, есть ли пользователи с этим адресом/коллекцией в watchlist → формирует персональный payload → отправляет через Firebase Admin SDK. Мы используем Go для подписчика — он выдерживает до 10 000 событий в минуту с минимальным потреблением памяти.
Подводный камень — дубликаты. OpenSea Stream может прислать одно событие несколько раз при переподключении. Дедупликация через Redis: SET event:{event_id} 1 EX 300 NX — если ключ уже существует, событие игнорируется. Это сокращает количество фантомных уведомлений на 95%.
Payload уведомления:
{ "title": "Продано: Azuki #4821", "body": "2.4 ETH · OpenSea · только что", "image": "https://cdn.azuki.com/4821.png", "data": { "nft_contract": "0xed5af...", "token_id": "4821", "marketplace": "opensea", "price_eth": "2.4" } } Изображение NFT в уведомлении — важная деталь. На iOS это mutable-content: 1 + UNNotificationServiceExtension, которое загружает картинку и прикрепляет как UNNotificationAttachment. На Android — BigPictureStyle через NotificationCompat. Это увеличивает CTR уведомления на 40%.
Как настроить каналы уведомлений для разных платформ?
На Android создаём отдельные notification channels:
-
nft_sales— продажи из watchlist -
nft_listings— новые листинги ниже floor -
nft_offers— офферы на ваши NFT
Пользователь может отключить каждый канал независимо в системных настройках. Это стандартная практика для финансовых приложений.
На iOS используем UNNotificationCategory с action buttons: «Смотреть» (открывает маркетплейс) и «Удалить из watchlist». Также добавляем поддержку critical alerts (через энтаплемент): они пробивают режим «Не беспокоить» для действительно важных событий — например, если ваша ставка собирается быть перебита.
| Тип уведомления | Задержка | Ручное отключение | Action buttons |
|---|---|---|---|
| Продажа | <1 сек | Канал nft_sales |
Смотреть |
| Новый листинг | <15 сек | Канал nft_listings |
Смотреть, Удалить |
| Оффер | <1 сек | Канал nft_offers |
Смотреть, Принять |
| Минт новой коллекции | <1 сек | Канал nft_mints |
Смотреть |
Почему важна дедупликация и гарантия доставки?
При переподключении WebSocket открывается несколько соединений, и каждое может прислать одно и то же событие. Без дедупликации пользователь получит 3–4 одинаковых уведомления — это ведёт к раздражению и отключению канала. Мы используем Redis с атомарной операцией SET NX и TTL 5 минут, что исключает дубли. Дополнительно на клиенте мы внедряем FIFO-очередь с таймстампом: если событие пришло дважды с разницей менее 30 секунд, второе игнорируется.
Что входит в работу
- Аудит текущей архитектуры и требований к источнику событий
- Проектирование серверного подписчика и дедупликации
- Разработка интеграции с OpenSea/Reservoir/Blur
- Настройка каналов уведомлений под iOS и Android
- Тестирование задержки и надёжности на реальных событиях (пиковая нагрузка 5000 событий/мин)
- Документация по эксплуатации и мониторингу
- Гарантия 3 месяца на бесперебойную работу
Типичные ошибки при интеграции уведомлений NFT
- Отсутствие дедупликации: копии событий забивают канал.
- Игнорирование rate limit OpenSea Stream (максимум 10 подписок на один сокет).
- Неверное разрешение image URL: CDN может отдавать WebP — на iOS нужно конвертировать в PNG/JPG.
- Забывают про
provisioning profileс Push Notifications capability.
Интеграция в готовое приложение с существующей серверной частью занимает 1–2 недели. Если нужна разработка серверного подписчика с нуля — 3–4 недели. Получите консультацию по вашему проекту — оценим объём и сроки бесплатно. Свяжитесь с нами для детального аудита.







