Запросы к этому сообщению можно найти по ссылкам ниже;

Суммарно по дням → https://dune.xyz/queries/129105

Итого →https://dune.xyz/queries/129121

Объем по неделям → https://dune.xyz/queries/129793/255121

В прошлом посте я описал, как рассчитать право собственности для проекта NFT.

Двигаясь дальше, я хотел взглянуть на расчет объема торгов. Эти показатели связаны с вопросом, существует ли текущий спрос на проект или люди больше не заинтересованы в торговле?

Чтобы начать изучение SQL, стоящего за этой метрикой, я перешел к панели инструментов Bored Ape Yacht Club, созданной @rechase. В частности, я изучал этот запрос. Мне очень нравится, как разработчик классифицировал покупки по ценовым категориям, но, поскольку объем CryptoTrunks по-прежнему относительно невелик, я в конце концов свернул с этого пути.

Основными таблицами для объема являются opensea «WyvernExchange_call_atomicMatch_» и opensea «WyvernExchange_evt_OrdersMatched». Как вы могли заметить, эти объемы предназначены для только OpenSea, но, учитывая текущее доминирование на рынке, я думаю, что это позволит нам достаточно приблизиться.

Для начала вы начинаете с таблицы «atomicMatch», где вы получаете tx_hash и стоимость переводов в OpenSea. Существует столбец адресов, который на самом деле представляет собой список значений, разделенных запятыми. Вы должны указать, какой столбец из списка вы хотите вернуть.

Пятый элемент (addrs[5]) в списке представляет адрес контракта NFT, который мы будем использовать в операторе WHERE.

Седьмой элемент (addrs[7]) представляет стоимость перевода. Стоимость перевода представлена ​​либо адресом USDC, WETH, либо адресом монетного двора (так же, как мы видели в запросе о владении). В более поздней части запроса нам нужно будет преобразовать этот токен в значение в долларах США.

Мы должны заменить адрес монетного двора токеном WETH, поскольку адрес монетного двора не имеет связанного с ним значения в долларах США.

В итоге первый запрос выглядит следующим образом, который я завернул в CTE под названием токен.

выберите call_tx_hash как tx_hash,
case
when addrs[7] = '\x000000000000000000000000000000000000000000', then '\xc02aaa39b223fe8d0a0e5c4f27ead7wed9083c756cc2 wed9083c756cc2 — usdc или weth
end AS token_address
от opensea.

Следующим шагом является объединение нашего CTE, «токена», с другой базовой таблицей «OrdersMatched», используя столбец «tx_hash». Я думаю, что в «atomicMatch» должны быть включены данные о ставках, поэтому вам действительно нужно проверить, что заказ был сопоставлен.

из OpenSea. "WyvernExchange_evt_OrdersMatched" с
токеном внутреннего соединения на token.tx_hash = om.evt_tx_hash

Параллельно мы вычисляем нашу стоимость. С хешем транзакции, адресом контракта и временем транзакции мы можем проверить нашу таблицу «цены», чтобы получить представление о стоимости.

При изучении запроса BYAC я узнал новую таблицу (ура!). Таблица erc20.tokens может сообщить нам «десятичные числа», необходимые для преобразования поля «цена» в фактическое значение токена, которое мы привыкли видеть.

Таблица «Цены» склеена по адресу контракта и минуте.

внутреннее соединение erc20.tokens erc на token.token_address = erc.contract_address
внутреннее соединение price.usd цены на Prices.minute = date_trunc('minute', evt_block_time)
И токен. token_address = price.contract_address

Окончательный запрос для вычисления стоимости каждого «дня» выглядит так:

выберите date_trunc('day', evt_block_time) AS "день" — день перевода
, sum(om.price / 10^erc.decimals) как "eth" — цена ETH
, sum((om.price / 10^erc.decimals) * price.price) as «usd» — цена USD
от opensea. .evt_tx_hash
внутреннее соединение erc20.tokens erc на token.token_address = erc.contract_address
внутреннее соединение price.usd цены на Prices.minute = date_trunc('minute', evt_block_time)
И токен. token_address = price.contract_address

Когда я набрал этот пост и посмотрел на этот запрос, я понял, что есть пробел. «token_address» в CTE «токенов» был НЕ ТОЛЬКО WETH, но на самом деле у нас также есть USDC. Если мы присоединим «цены» к «contract_address» = USDC, мы НЕ сможем сообщить om.price/10^erc.decimals только как ETH. Продажа за 100 долларов США будет считаться продажей за 100 ETH.

Возможно, это не повлияло бы на BYAC, если бы никто не совершал транзакций в долларах США, но в случае с CryptoTrunks у нас было около 20 транзакций в долларах США, которые существенно увеличили сумму ETH.

Я исправил запрос, добавив оператор CASE и дополнительный подзапрос. Мне нужна была дневная цена ETH/USD, и если транзакция происходила в USDC, то я должен разделить на это значение, чтобы получить значение ETH.

выберите date_trunc('день', evt_block_time) AS "day" — день перевода
,sum(case when token_address = '\xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2' then om.price / 10^erc.decimals — weth< br /> when token_address = '\xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48' then (om.price / 10^erc.decimals)/eth_prices.price — usdc преобразуется в weth
else 0 end) as «eth» — цена ETH
, sum((om.price / 10^erc.decimals) * price.price) as «usd» — цена USD
от opensea. .tx_hash = om.evt_tx_hash
внутреннее соединение erc20.tokens erc на токене.token_address = erc.contract_address
цены внутреннего соединения.цены в долларах США по ценам.minute = date_trunc('minute', evt_block_time)
AND token.token_address = price.contract_address
внутреннее соединение (SELECT max(prices.price) как цена, Prices.minute из цен Prices.usd, где contract_address = '\xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2' группируется по ценам. минуту)
eth_prices на eth_prices.minute = date_trunc(‘minute’, evt_block_time)

Уф, это становится трудно выразить словами, но, надеюсь, это имеет смысл.

Теперь, когда у нас есть стоимость ETH и USDC в день, все сводится к тому, как мы хотим ее отображать. Сначала я решил отобразить кумулятивную диаграмму по дням.

Чтобы получить кумулятивную диаграмму, я сначала преобразовал приведенный выше запрос в CTE, который я назвал «объем». Затем, возвращаясь к нашей записи о стоимости с течением времени, я использовал выражение OVER для построения кумулятивной диаграммы по дням.

выберите «день»
, sum(«eth») over (упорядочить по «day» по возрастанию) как «cum_ETH»
, sum(«usd») over (упорядочить по « день" по возрастанию) как "cum_USD"
от объема

Как только вы поймете базовый запрос, используя наши основные таблицы, вам будет несложно создавать различные варианты данных Dame.

Я добавил счетчики, чтобы показать «total_ETH» и «total USDC», игнорируя «дневную» часть OVER.

Чтобы создать это, я разветвил запрос выше и вернулся к моему CTE «значение», чтобы исключить «день» в предложениях SELECT и GROUP BY. Поскольку мой результат теперь существует в CTE «значение», он больше не должен быть CTE, и я могу просто вернуть его результаты и удалить все после этого.

Я также просто хотел показать общее количество ETH за неделю. Опять же, я разветвил начальный запрос и заменил каждое упоминание «день» на «неделя». Cumulative меня здесь не интересовал (казался избыточным), поэтому я снова убрал «значение» CTE и удалил все после.

Эти показатели действительно показывают, какой объем торгов связан с этим проектом. Я думаю, что это ценная информация, чтобы увидеть активный интерес к проекту и то, насколько «рано» вы на самом деле можете быть.

В августе был большой всплеск активности, но с тех пор интерес к нему снизился. Вы можете интерпретировать это одним из двух способов … либо проект «мертв», либо еще не «взорвался», что я склоняюсь к последнему.