Мы захотели надежности, и сделали интегратор курсов валют ADAMANT Currencyinfo

Вы знаете множество сервисов, которые предоставляют курсы фиатных и крипто- валют. В разной степени им свойственны недостатки:

  • Единственный источник данных

  • Предоставляются как SaaS на их хостинге

  • Завышенная стоимость подписки

  • Сложный API

Ключевой мотив создания ADAMANT Currencyinfo — надежность. Вот недавний и очередной пример фейла Coinmarketcap:

По курьей причине API Coinmarketcap отдавал курсы некоторых криптовалют с дефектом ~98%. Если у вас свой обменник, я уверен, что вы бы не хотели отдать 1000 INJ за 370 USD при реальной стоимости 20k USD.

Аналогичные проблемы мы наблюдаем и у других провайдеров курсов с частотой 1–2 раза в год.

Резюме

Мы сделали сервис, который собирает данные курсов валют от нескольких источников и анализирует их корректность, и хостится на собственном сервере.

Currencyinfo полностью бесплатен и с открытым кодом: https://github.com/Adamant-im/currencyinfo

Написали на TypeScript, для установки на ваш сервер/VPS можно использовать Docker или собрать из репозитория. Требования к VPS минимальны, а для подключения источников данных достаточно их бесплатных аккаунтов. Уведомляет о сомнительных курсах в Slack, Discord или ADAMANT Messenger.

Как проверяем курсы

Currencyinfo получает данные из источников, которые вы указали в конфиге и анализирует валидность курса каждой валюты:

  • Считает ненадежными курс валюты, если получили данные менее, чем от minSources источников

  • Группирует курсы валюты по rateDifferencePercentThreshold

922a49fdd8a77daa3f1e283290225863.pngeda96fda587659b526e15de0f255cf3b.png

  • Считает финальный курс как средний/мин/макс, выбирает по приоритету источников priorities, или по весу надежности weight.

Вот пример для вычисления курса ADM/USD, когда получили разные курсы от трех источников — Coinmarketcap, Coingecko и Cryptocompare:

3aef6e40b30af73bed22538d3483256f.png

Детальное описание алгоритма — в GitHub Wiki.

Источники данных

Currencyinfo умеет работать с данными:

  • MOEX — Московская биржа. Увы, USD и EUR они не торгуют, но данные по RUB и CNY актуальны.

  • Currency API — Обновляет данные раз в день, поэтому имеет смысл только для фиата

  • ExchangeRate.Host — Предоставляет актуальные курсы фиата, драгоценных металлов и биткоина

  • CoinMarketCap — Курсы криптовалют с ежеминутными обновлениями

  • CryptoCompare — Курсы фиата криптовалют с частыми обновлениями

  • CoinGecko — Курсы криптовалют с ежеминутными обновлениями

С какими источниками данных работать вы укажете в конфиге. Некоторые из них требуют API-ключи, но для Currencyinfo с обновлением refreshInterval в 10 минут достаточно бесплатных аккаунтов. Если хотите получать курсы чаще — смотрите тарифы соответствующих источников данных.

Пример запроса

Текущий курс:

GET http://localhost:36661/get? coin=ADM

{
  "success": true,
  "date": 1726827454221,
  "result": {
    "ADM/USD": 0.029495299897,
    "ADM/RUB": 2.738651632396,
    "ADM/EUR": 0.026429853379,
    "ADM/CNY": 0.208056836954,
    "ADM/JPY": 4.243900904361,
    "ADM/BTC": 4.64113e-7,
    "ADM/ETH": 0.000011601089,
    "ADM/KRW": 39.384183204721
  },
  "last_updated": 1726827222510,
  "version": "4.1.0"
}

Курс в момент времени:

GET http://localhost:36661/getHistory? coin=ADM×tamp=1725185959

{
  "success": true,
  "date": 1726827656521,
  "result": [
    {
      "_id": "66d43eb65a01993b593fed57",
      "date": 1725185716605,
      "tickers": {
        "ADM/KRW": 39.986732414654,
        "ADM/ETH": 0.000012060532,
        "ADM/BTC": 5.14865e-7,
        "ADM/JPY": 4.370208962216,
        "ADM/CNY": 0.212048693004,
        "ADM/EUR": 0.027028233555,
        "ADM/RUB": 2.73320760724,
        "ADM/USD": 0.029895049192
      }
    }
  ],
  "last_updated": 1726827222510,
  "version": "4.1.0"
}

Еще больше надежности

Помимо верификации самих курсов валют, нам важно контролировать и доступность API сервиса. Вот как мы это делаем:

  • Запустили сервис у надежного VPS-провайдера

  • Настроили заббикс, который проверяет состояние VPS в целом и дату последнего обновления курсов «last_updated»: 1726827222510

  • Настроили уведомления от Currencyinfo

52af01ebee37529d39356a9ad3281a5d.png

  • Запустили не один сервис Currencyinfo, а два, и в приложениях (Мессенджер АДАМАНТ, бот-обменник, виджеты) делаем их Health check

© Habrahabr.ru