Сначала я буду копаться в собственности.

Чтобы обновить некоторые из вопросов были; Сколько уникальных адресов принадлежит в настоящее время?, Сколько адресов принадлежит за все время? Сколько в среднем вмещает каждый кошелек? Кто владеет большей частью?

Лучший способ научиться выполнять запросы к базе данных — это опираться на работу других. Изучите то, как его рассчитали другие, измените его в соответствии с вашими целями и дополните его собственными знаниями и способностями.

Чтобы узнать, как рассчитать количество владельцев, я изучил панель инструментов Pudgy Penguins Degen. Спасибо Гаю Стюарту, разработавшему эту панель инструментов. В частности я посмотрел на этот запрос.

Я выбрал проект CryptoTrunks для своих практических запросов и итогового дэшборда. Я думаю, что это действительно классный проект, поскольку размер дерева зависит от количества транзакций, которые кошелек, чеканящий NFT, выполнял в прошлом. Он также стремился быть углеродно-нейтральным, что мне показалось довольно крутым.

Единственная таблица, используемая для расчета владения NFT, — это erc721.»ERC721_evt_Transfer». Это делает его красивым и легким.

Таблица фильтруется по полям contract_address, что я мог легко подтвердить, выполнив поиск адреса контракта Pudgy Penguins на Etherscan, а затем используя тот же поиск CryptoTrunks.

Логика запроса владения работает следующим образом.

Сначала вы должны присвоить значение 1 переводам, которые были отправлены с адреса «монетного двора» «на» адрес «кошелька». Это ваше начальное количество NFT.

выберите "to" в качестве кошелька
, "tokenId"
, "mint" AS "type"
, 1 в качестве "value"
from erc721."ERC721_evt_Transfer"
где "contract_address" = ('\x375ea781c49eafedde07afe6196f885761f166ae')(адрес контракта CryptoTrunk)
и “from” = '\x00000000000000000000000000000000000000000' (адрес монетного двора)

Затем вы присваиваете значение -1 переводам, которые были НЕ отправлены с адреса монетного двора, а были отправлены «из» другого «кошелька». Обратите внимание, что мы назвали столбец «от» «кошельком» по сравнению с первым запросом, в котором мы использовали столбец «кому». Таким образом, кошелек, который отчеканил оригинал (1), а также отправил его на другой кошелек (-1), будет иметь значение 0, когда мы добавим столбец «значение» вместе.

выберите "from" в качестве кошелька
, "tokenId"
, "loss" AS "type"
, -1 в качестве "value"
from erc721."ERC721_evt_Transfer"
где "contract_address" = '\x375ea781c49eafedde07afe6196f885761f166ae'
и "from" !='\x00000000000000000000000000000000000000000000

Но при каждом переводе нам также необходимо учитывать, на какой «кошелек» был отправлен этот токен. Таким образом, в третьей таблице мы назначаем значение 1 «на» «кошелек» для каждого перевода, который снова НЕ поступил из адрес монетного двора.

выберите "to" в качестве кошелька
, "tokenId"
, "gain" AS "type"
, 1 в качестве "value"
от erc721."ERC721_evt_Transfer"
где "contract_address" = '\x375ea781c49eafedde07afe6196f885761f166ae'
и "от" !='\x00000000000000000000000000000000000000000000000000

Мы объединяем эти запросы вместе и назначаем CTE (с), который мы называем «переводы».

Наш следующий шаг — агрегировать «значение» по каждому «кошельку», которое я назначаю другому CTE с именем «transfer_sum».

transfer_sum as (
выберите «кошелек»,
сумма (значение) как «значение»
из группы переводов
по «кошельку»

Последний запрос — это то, где мы наконец получаем все показатели, которые мы обсуждали в последнем посте.

фильтр select
count(различный «кошелек») (где «значение» ›0) как unique_addresses_current
,count(различный «кошелек») как unique_addresses_all_time
, фильтр count(различный «кошелек») (где «value» = 1) как single_owner_addresses
, avg («value») фильтр (где «value» ›0 ) как average_owned_per_address
, max("значение") as самое_владельческое_single_address
, ttl.коллекция_коллекций
от Transfer_sum
перекрестное соединение (выберите count(отличный «tokenId») как collection_count из переводов) ttl
группа по ttl.collection_count

Любой «кошелек» с конечной суммарной «стоимостью» >0 является текущим владельцем токена. Использование отдельной команды гарантирует, что адрес уникален.

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

Подсчет «кошельков», где «значение» равно 1, приведет к получению всех адресов одного кошелька.

Усреднение «стоимости» «кошельков», в которых в настоящее время хранится токен, показывает нам в среднем, сколько токенов хранится в каждом кошельке.

Максимальное «значение» в таблице — это самый большой отдельный кошелек, который в случае CryptoTrunks довольно значителен… более 6000 токенов.

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

Из каждого из моих расчетов я создал визуализацию счетчика.

Затем я импортировал их во вновь созданную панель инструментов, которую я первоначально назвал CryptoTrunks, чтобы зарезервировать URL-адрес, но затем назвал ее «В процессе» на случай, если кто-то перейдет к ней в поисках ответов.

Я рад продолжать строить дальше. Теперь, когда я понимаю, что такое владение, я думаю, что готов перейти к объему торговли.

Соответствующий запрос для этого поста можно найти здесь → https://dune.xyz/queries/122900

Панель инструментов находится здесь → https://dune.xyz/mtitus6/CryptoTrunks