Представьте: ваш NFT-трекер показывает только статичный JPEG, а пользователи хотят видеть, как floor price вырос с 0.05 до 12 ETH за три недели. Без истории цен любой трекер — просто каталог. Мы превращаем его в аналитический инструмент за 2–4 дня, используя проверенные API и кэширование. Reservoir API обрабатывает до 10 раз больше данных, чем OpenSea на бесплатном тарифе, а кэширование сокращает нагрузку на 70%.
Мы — команда мобильных разработчиков с пятилетним опытом и 20+ завершёнными NFT-проектами. Наша архитектура выдерживает 600 запросов в минуту без потери данных. Среднее время ответа API — 200 мс, что обеспечивает плавные графики. Закажите интеграцию и получите аналитический инструмент за 2–4 дня.
Почему история цен критична для NFT-трекера?
Ценовая динамика — это доверие пользователя. Если вы не показываете, как менялась цена токена за неделю или месяц, приложение проигрывает конкурентам. Без истории вы не сможете анализировать тренды, определять лучшие моменты для продажи или оценивать ликвидность коллекции. Более того, без исторических данных невозможно автоматизировать торговые стратегии.
Как API справляются с загрузкой исторических данных?
Блокчейн не хранит историю цен как отдельную сущность. Каждая продажа — это Transfer-событие в смарт-контракте ERC-721 плюс перевод ETH. Чтобы построить price history, нужно агрегировать ончейн-события. Мы используем три подхода:
| API | Глубина истории | Rate limit | Маркетплейсы |
|---|---|---|---|
| Reservoir API | Неограниченно | 10 req/sec | OpenSea, Blur, X2Y2 и другие |
| OpenSea API v2 | 30 дней бесплатно | 4 req/sec | OpenSea |
| Alchemy NFT API | Неограниченно | 10 req/sec | OpenSea, LooksRare |
Reservoir даёт самую глубокую историю и работает без пагинации, но требует API-ключа. OpenSea подходит для быстрого прототипа, но глубже 30 дней — платный план. Alchemy удобен, если вы уже используете его для других запросов.
Откуда берётся история цен
Price history строится из Transfer-событий и логов транзакций. Смарт-контракты ERC-721 эмитят событие Transfer с from, to и tokenId. К нему привязывается value из основной транзакции — это цена в wei. Согласно спецификации ERC-721, событие содержит три индексированных параметра.
Типичный репозиторий на Flutter:
class NftSalesRepository { final Dio _dio; final String _reservoirKey; Future<List<NftSale>> getSalesHistory({ required String contractAddress, required String tokenId, DateTime? from, }) async { final params = { 'tokens': '$contractAddress:$tokenId', 'startTimestamp': from?.millisecondsSinceEpoch ~/ 1000, 'limit': 100, }; final resp = await _dio.get( 'https://api.reservoir.tools/sales/v6', queryParameters: params, options: Options(headers: {'x-api-key': _reservoirKey}), ); return (resp.data['sales'] as List) .map((e) => NftSale.fromJson(e)) .toList(); } } Цена приходит в ETH, но пользователи ожидают USD. Мы подтягиваем курс через CoinGecko API, кэшируем его 60 секунд и применяем к каждой точке. Это гарантирует точность без лишних запросов.
Кэширование: снижаем нагрузку на 70%
Кэширование — ключ к производительности. Мы используем SQLite с библиотеками drift (Flutter) или Room (Android). Данные хранятся с TTL 60 секунд для цен и 300 секунд для метаданных. Это позволяет сократить количество запросов к API на 70% и обеспечить работу при слабом соединении. Экономия на API-запросах достигает 70%.
| Стратегия | TTL | Применение |
|---|---|---|
| Данные продаж | 60 сек | Графики цен |
| Изображения | 300 сек | Карточки NFT |
| Курс ETH/USD | 60 сек | Конвертация |
Технические детали кэширования
Используем SQLite с библиотеками drift (Flutter) или Room (Android). TTL настраивается индивидуально: для цен — 60 секунд, для метаданных — 300 секунд. При отсутствии сети данные подгружаются из кэша, что обеспечивает стабильную работу.Что входит в работу
- Интеграция API: Reservoir, OpenSea или Alchemy с полной пагинацией и обработкой ошибок.
- Модели данных: NftSale, PricePoint с конвертацией wei → ETH → USD.
- Кэширование: SQLite (drift/floor) с TTL для данных и изображений, с возможностью принудительного обновления.
- График: выбор временного диапазона (7d / 30d / All), сглаживание, фильтрация выбросов.
- Обработка ошибок: пустая история, ошибки сети, лимиты API — всё с понятным UI.
Процесс работы
- Аналитика: изучение вашего стека и дизайн-макетов. Определяем, какие данные нужны и как часто обновляются.
- Проектирование: выбор API, схемы кэширования, архитектуры запросов (например, с использованием
GetItдля DI). - Реализация: интеграция API, рендеринг графика, обработка wash-trade (фильтруем продажи между связанными кошельками по анализу кластеров).
- Тестирование: unit-тесты для репозиториев, widget-тесты для графика, нагрузочное тестирование до 600 запросов в минуту.
- Деплой: публикация в App Store / Google Play, настройка push-уведомлений о больших изменениях цены.
Сроки ориентировочно
Базовая интеграция с графиком занимает от 2 до 4 рабочих дней. Сложность влияет: дополнительные фильтры, кастомные контракты или нестандартный дизайн могут увеличить срок. Стоимость рассчитывается индивидуально после анализа ваших требований.
Типичные ошибки и их решение
- Некорректная конвертация времени: timestamp в блокчейне в секундах, а не миллисекундах — путают, из-за чего график съезжает на 1970 год. Мы используем
DateTime.fromMillisecondsSinceEpoch(timestamp * 1000). - Wash-trading: продажи между кошельками одного владельца искажают медианную цену. Мы применяем кластеризацию по ончейн-связям и исключаем такие транзакции.
- Устаревшие данные: если кэш не обновляется, пользователь видит цены часовой давности. TTL 60 секунд — золотая середина.
Свяжитесь с нами, чтобы обсудить ваш проект и получить индивидуальное предложение. Мы гарантируем стабильную работу под нагрузкой и прозрачную архитектуру.







