Price Service для Tradeye.info
Для любого анализа нужно опираться на более точные данные. При разработке Tradeye.info мы столкнулись с одной маленькой проблемой.
На изображении ниже показан пример одного из наших расчетов. Видите вот эту Delta
, это остаток токена на кошельке, то есть разница между тем, сколько купил пользователь и тем, сколько продал.
Посчитать стоимость покупки токена несложно, как и стоимость продажи токена, поэтому расчет Profit
по реализованным токенам не составляет труда, посколько эти значения мы можем получить из сервисов-индексеров.
Например, у нас транзакция обмена FINE на ETH. Если мы возьмем цену FINE, то она будет не совсем точная, поскольку имеет место быть волатильность низколивикдных токенов, точнее взять здесь затраченное количество ETH и привести это к USD. Тогда мы получим более точную цену, опираясь на более надежный токен. Таким образом, если пользователь реализовал полностью токен, то нам достаточно посчитать сумму всех транзакций продажи и вычесть сумму всех транзакций покупки, получим Profit.
Однако если пользователь еще не реализовал токен до конца, нам нужно знать текущую стоимость актива, а вот это уже оказалась небольшой проблемой. Потому что обычные источники прайсов не всегда могут отдать цену по новой монете, или монете, которая не прошла валидацию, а таких монет на кошельках трейдеров может быть очень много.
В качестве сервиса-индексера мы сейчас используем Zerion. Мы заключили с ними юридический договор для получения production ключа и большую часть информации по транзакциям и текущим позициям получаем из их API.
Но Zerion по некоторым молодым токенам не отдает цены, из-за чего все Total расчеты становятся неактуальными и могут вводить в заблуждение наших пользователей.
Поэтому вчера я занимался написанием сервиса, который позволяет получать прайсы из разных источников. На данный момент я подключил 4 источника цен.
- Dexscreener API
- Если на Zerion нет какого-то токена, то идем на Dexscreener сервис, это достаточно хороший источник для получения информации по токену, и имеет бесплатное API. Однако есть ограничение по количеству запросов, из-за чего мы можем попадать в rate limits
- Defined API
- Поэтому еще одним источником данных мы берем Defined. Тут тоже есть некоторое количество бесплатных запросов в месяц, но нет блокировки по IP, поэтому я сделал несколько бесплатных ключей, которые позволяют делать большое количество бесплатных запросов.
- Debank API
- Имея даже три источника получения цен по токенам, мы все равно иногда попадаем в ситуацию, что сервисы не отдают цену какого-то токена, либо ее нет, либо опять же rate limits. Поэтому последним источником получения цен мы взяли Debank. Это очень мощный индексер. Наверное это самый точный сервис по блокчейн данным. Но он очень дорогой, и у него нет бесплатных запросов, из-за чего мы его используем в последнюю очередь.
Таким образом, сейчас наш Price service практически в 99% случаев возвращает цену любого токена и мы получаем актуальные расчеты для Total части.
Следующим шагом хочется подключить еще один источник данных из самого контракта. Но тут есть один нюанс, не все контракты похожи друг на друга.
Например если взять только uniswap контракты, тогда проблем нет, мы можем взять reserve0
и reserve1
из контракта пула, но перед этим нам надо получить контракт пула по монете, например к WETH. В 95% случаев такой пул есть и получив резервы этого пула, нам не составит труда вычислить стоимость монеты, путем простого отношения этих резевов.
Однако, как я уже и сказал, не всегда монета торгуется на uniswap контрактах или имеет пару к WETH или какому-нибудь стейбл-коину. Это может быть любой DEX и контракты могут отличаться друг от друга, поэтому такое решение может использоваться только как дополнительный источник. Конечно всех тонкостей такого подхода я еще не знаю, потому что за все время я работал только с uniswap контрактами и не могу сказать как будет работать с другими.
В любом случае, даже сейчас наш сервис позволяет получать актуальные расчеты для анализа кошельков на сети Ethereum, благодаря которым можно принимать решение об использовании их для копитрейдинга.