Реализация уведомлений о торгах NFT в мобильном приложении
NFT продали на OpenSea за 2 ETH — владелец не увидел уведомления, потому что разрешения на push не запросили при онбординге, а polling кошелька работал с задержкой 5 минут. Для NFT-маркетплейса это прямая потеря пользователя.
Источники событий для NFT-уведомлений
Основных сценариев несколько: продажа NFT из коллекции в watchlist, листинг нового NFT по цене ниже floor, принятие оффера, минт новой коллекции. Каждый требует отдельного источника данных.
OpenSea предоставляет Stream API (wss://stream.openseabeta.com/socket) с событиями item_listed, item_sold, offer_entered. Подписка по коллекции или по адресу кошелька. Это самый чистый вариант для Ethereum и Polygon.
Blur и Magic Eden имеют собственные API, но менее стабильные WebSocket-стримы — там чаще используют polling через REST с частотой 15–30 секунд.
Для мультичейн-трекинга (Solana + ETH) удобнее агрегаторы: Reservoir API (api.reservoir.tools) покрывает большинство маркетплейсов и предоставляет единый формат событий.
Архитектура доставки
Серверный подписчик слушает WebSocket-стрим → при событии проверяет, есть ли пользователи с этим адресом/коллекцией в watchlist → формирует персональный payload → отправляет через Firebase Admin SDK.
Подводный камень — дубликаты. OpenSea Stream может прислать одно событие несколько раз при переподключении. Дедупликация через Redis: SET event:{event_id} 1 EX 300 NX — если ключ уже есть, событие пропускаем.
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.
Настройка каналов уведомлений
На Android создаём отдельные notification channels:
-
nft_sales— продажи из watchlist -
nft_listings— новые листинги ниже floor -
nft_offers— офферы на ваши NFT
Пользователь может отключить каждый канал независимо в системных настройках. Это стандартная практика для финансовых приложений.
На iOS используем UNNotificationCategory с action buttons: «Смотреть» (открывает маркетплейс) и «Удалить из watchlist».
Интеграция в готовое приложение с существующей серверной частью занимает 1–2 недели. Если нужна разработка серверного подписчика с нуля — 3–4 недели.







