diff --git a/datasets/nfts/nfts/dataset.py b/datasets/nfts/nfts/dataset.py index 16c70e4e..9062c9ca 100644 --- a/datasets/nfts/nfts/dataset.py +++ b/datasets/nfts/nfts/dataset.py @@ -2,10 +2,12 @@ Functions to access various data in the NFTs dataset. """ import sqlite3 -from typing import Any, List, Tuple +from typing import List, Optional, Tuple +import numpy as np import pandas as pd import scipy.sparse +from tqdm import tqdm from .datastore import event_tables, EventType @@ -124,7 +126,7 @@ This dataset consists of the following dataframes:""" print(explanation) print("- - -") - for name, explanation in AVAILABLE_MATRICES: + for name, explanation in AVAILABLE_MATRICES.items(): print(f"\nMatrix: {name}") print("") print(explanation) @@ -137,6 +139,12 @@ class FromSQLite: Initialize an NFTs dataset instance by connecting it to a SQLite database containing the data. """ self.conn = sqlite3.connect(datafile) + self.ownership_transitions: Optional[ + Tuple[List[str], scipy.sparse.spmatrix] + ] = None + self.ownership_transition_probabilities: Optional[ + Tuple[List[str], scipy.sparse.spmatrix] + ] = None def load_dataframe(self, name: str) -> pd.DataFrame: """ @@ -150,13 +158,17 @@ class FromSQLite: df = pd.read_sql_query(f"SELECT * FROM {name};", self.conn) return df - def load_ownership_transitions(self) -> Tuple[List[str], Any]: + def load_ownership_transitions( + self, force: bool = False + ) -> Tuple[List[str], scipy.sparse.spmatrix]: """ Loads ownership transitions adjacency matrix from SQLite database. To learn more about this matrix, run: >>> nfts.dataset.explain() """ + if self.ownership_transitions is not None and not force: + return self.ownership_transitions cur = self.conn.cursor() address_indexes_query = """ WITH all_addresses AS ( @@ -173,9 +185,44 @@ SELECT DISTINCT(all_addresses.address) AS address FROM all_addresses ORDER BY ad adjacency_matrix = scipy.sparse.dok_matrix((num_addresses, num_addresses)) adjacency_query = "SELECT from_address, to_address, num_transitions FROM ownership_transitions;" - for from_address, to_address, num_transitions in cur.execute(adjacency_query): + rows = cur.execute(adjacency_query) + for from_address, to_address, num_transitions in tqdm( + rows, desc="Ownership transitions (adjacency matrix)" + ): from_index = address_indexes[from_address] to_index = address_indexes[to_address] adjacency_matrix[from_index, to_index] = num_transitions - return addresses, adjacency_matrix + self.ownership_transitions = (addresses, adjacency_matrix) + return self.ownership_transitions + + def load_ownership_transition_probabilities( + self, + force: bool = False, + ) -> Tuple[List[str], scipy.sparse.spmatrix]: + """ + Returns transition probabilities of ownership transitions, with each entry A_{i,j} denoting the + probability that the address represented by row i transferred and NFT to the address represented by row[j]. + """ + if self.ownership_transition_probabilities is not None and not force: + return self.ownership_transition_probabilities + + addresses, adjacency_matrix = self.load_ownership_transitions(force) + + # Sum of the entries in each row: + # https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.spmatrix.sum.html#scipy.sparse.spmatrix.sum + row_sums = adjacency_matrix.sum(axis=1) + + # Convert adjacency matrix to matrix of transition probabilities. + # We cannot do this by simply dividing transition_probabilites /= row_sums because that tries + # to coerce the matrix into a dense numpy ndarray and requires terabytes of memory. + transition_probabilities = adjacency_matrix.copy() + for i, j in zip(*transition_probabilities.nonzero()): + transition_probabilities[i, j] = ( + transition_probabilities[i, j] / row_sums[i] + ) + + # Now we identify and remove burn addresses from this data. + + self.ownership_transition_probabilities = (addresses, transition_probabilities) + return self.ownership_transition_probabilities diff --git a/datasets/nfts/notebooks/.gitignore b/datasets/nfts/notebooks/.gitignore new file mode 100644 index 00000000..7897fa70 --- /dev/null +++ b/datasets/nfts/notebooks/.gitignore @@ -0,0 +1 @@ +img/ diff --git a/datasets/nfts/notebooks/nft_ownership.ipynb b/datasets/nfts/notebooks/nft_ownership.ipynb new file mode 100644 index 00000000..1f26f181 --- /dev/null +++ b/datasets/nfts/notebooks/nft_ownership.ipynb @@ -0,0 +1,1232 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "e2c7afd6-752c-477a-adcc-417eefd575f1", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import sqlite3\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import nfts.dataset\n", + "import numpy as np\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "9f0e7f34-591b-4694-99d7-e20535afe33a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "The Moonstream NFTs dataset\n", + "===========================\n", + "\n", + "To load the NFTs dataset from a SQLite file, run:\n", + ">>> ds = nfts.dataset.FromSQLite()\n", + "\n", + "This dataset consists of the following dataframes:\n", + "\n", + "Dataframe: nfts\n", + "Load using:\n", + ">>> nfts_df = ds.load_dataframe(, \"nfts\")\n", + "\n", + "Describes the NFT contracts represented in this dataset, with a name and symbol if they were available at time of crawl.\n", + "\n", + "Columns:\n", + "1. address: The Ethereum address of the NFT contract.\n", + "2. name: The name of the collection of NFTs that the contract represents.\n", + "3. symbol: The symbol of the collection of NFTs that the contract represents.\n", + "\n", + "- - -\n", + "\n", + "Dataframe: mints\n", + "Load using:\n", + ">>> mints_df = ds.load_dataframe(, \"mints\")\n", + "\n", + "All token mint events crawled in this dataset.\n", + "\n", + "Columns:\n", + "1. event_id: A unique event ID associated with the event.\n", + "2. transaction_hash: The hash of the transaction which triggered the event.\n", + "3. block_number: The transaction block in which the transaction was mined.\n", + "4. nft_address: The address of the NFT collection containing the minted token.\n", + "5. token_id: The ID of the token that was minted.\n", + "6. from_address: The \"from\" address for the transfer event. For a mint, this should be the 0 address: 0x0000000000000000000000000000000000000000.\n", + "7. to_address: The \"to\" address for the transfer event. This represents the owner of the freshly minted token.\n", + "8. transaction_value: The amount of WEI that were sent with the transaction in which the token was minted.\n", + "9. timestamp: The time at which the mint operation was mined into the blockchain (this is the timestamp for the mined block).\n", + "\n", + "- - -\n", + "\n", + "Dataframe: transfers\n", + "Load using:\n", + ">>> transfers_df = ds.load_dataframe(, \"transfers\")\n", + "\n", + "All token transfer events crawled in this dataset.\n", + "\n", + "Columns:\n", + "1. event_id: A unique event ID associated with the event.\n", + "2. transaction_hash: The hash of the transaction which triggered the event.\n", + "3. block_number: The transaction block in which the transaction was mined.\n", + "4. nft_address: The address of the NFT collection containing the transferred token.\n", + "5. token_id: The ID of the token that was transferred.\n", + "6. from_address: The \"from\" address for the transfer event. This is the address that owned the token at the *start* of the transfer.\n", + "7. to_address: The \"to\" address for the transfer event. This is the address that owned the token at the *end* of the transfer.\n", + "8. transaction_value: The amount of WEI that were sent with the transaction in which the token was transferred.\n", + "9. timestamp: The time at which the transfer operation was mined into the blockchain (this is the timestamp for the mined block).\n", + "\n", + "- - -\n", + "\n", + "Dataframe: current_owners\n", + "Load using:\n", + ">>> current_owners_df = ds.load_dataframe(, \"current_owners\")\n", + "\n", + "This table is derived from the nfts, mints, and transfers tables. It represents the current owner of each token in the dataset.\n", + "\n", + "Columns:\n", + "1. nft_address: The address of the NFT collection containing the token whose ownership we are denoting.\n", + "2. token_id: The ID of the token (inside the collection) whose ownership we are denoting.\n", + "3. owner: The address that owned the token at the time of construction of this dataset.\n", + "\n", + "- - -\n", + "\n", + "Dataframe: current_market_values\n", + "Load using:\n", + ">>> current_market_values_df = ds.load_dataframe(, \"current_market_values\")\n", + "\n", + "This table is derived from the nfts, mints, and transfers tables. It represents the current market value (in WEI) of each token in the dataset.\n", + "\n", + "Columns:\n", + "1. nft_address: The address of the NFT collection containing the token whose market value we are denoting.\n", + "2. token_id: The ID of the token (inside the collection) whose market value we are denoting.\n", + "3. market_value: The estimated market value of the token at the time of construction of this dataset.\n", + "\n", + "For this dataset, we estimate the market value as the last non-zero transaction value for a transfer involving this token.\n", + "This estimate may be inaccurate for some transfers (e.g. multiple token transfers made by an escrow contract in a single transaction)\n", + "but ought to be reasonably accurate for a large majority of tokens.\n", + "\n", + "- - -\n", + "\n", + "Dataframe: transfer_statistics_by_address\n", + "Load using:\n", + ">>> transfer_statistics_by_address_df = ds.load_dataframe(, \"transfer_statistics_by_address\")\n", + "\n", + "This table is derived from the nfts, mints, and transfers tables. For each address that participated in\n", + "at least one NFT transfer between April 1, 2021 and September 25, 2021, this table shows exactly how many NFTs that address transferred to\n", + "other addresses and how many NFT transfers that address was the recipient of.\n", + "\n", + "Columns:\n", + "1. address: An Ethereum address that participated in at least one NFT transfer between April 1, 2021 and September 25, 2021.\n", + "2. transfers_out: The number of NFTs that the given address transferred to any other address between April 1, 2021 and September 25, 2021.\n", + "3. transfers_in: The number of NFTs that any other address transferred to given address between April 1, 2021 and September 25, 2021.\n", + "\n", + "- - -\n", + "\n", + "Matrix: ownership_transitions\n", + "\n", + "ownership_transitions is an adjacency matrix which counts the number of times that a token was transferred from a source address (indexed by the rows of the matrix) to a target address (indexed by the columns of the matrix).\n", + "\n", + "These counts only include data about mints and transfers made between April 1, 2021 and September 25, 2021. We also denote the current owners of an NFT as having transitioned\n", + "the NFT from themselves back to themselves. This gives some estimate of an owner retaining the NFT in the given time period.\n", + "\n", + "Load this matrix as follows:\n", + ">>> indexed_addresses, transitions = ds.load_ownership_transitions()\n", + "\n", + "- \"indexed_addresses\" is a list denoting the address that each index (row/column) in the matrix represents.\n", + "- \"transitions\" is a numpy ndarray containing the matrix, with source addresses on the row axis and target addresses on the column axis.\n", + "\n", + "- - -\n" + ] + } + ], + "source": [ + "nfts.dataset.explain()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b25c369a-3751-4e18-a539-f8e950982537", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Path to SQLite database containing the NFTs dataset: /home/neeraj/data/nfts/nfts.sqlite\n" + ] + } + ], + "source": [ + "DATABASE = os.path.expanduser(\"~/data/nfts/nfts.sqlite\")\n", + "print(f\"Path to SQLite database containing the NFTs dataset: {DATABASE}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "b7a608aa-d304-4c53-9073-bb3d2379482c", + "metadata": {}, + "outputs": [], + "source": [ + "ds = nfts.dataset.FromSQLite(DATABASE)" + ] + }, + { + "cell_type": "markdown", + "id": "8977af98-ff38-48c9-bc3a-7a11d2b7e8fc", + "metadata": { + "tags": [] + }, + "source": [ + "### Who owns NFTs?" + ] + }, + { + "cell_type": "markdown", + "id": "17564e85-99bc-4456-8353-ef892b042921", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "4793b4e8-3138-4a85-8266-09c42b29eb3e", + "metadata": {}, + "outputs": [], + "source": [ + "current_owners_df = ds.load_dataframe(\"current_owners\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "a52f616b-0441-46a1-b8b3-c117464b35d8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nft_addresstoken_idowner
00x00000000000b7F8E8E8Ad148f9d53303Bfe2079600xb776cAb26B9e6Be821842DC0cc0e8217489a4581
10x00000000000b7F8E8E8Ad148f9d53303Bfe2079610x8A73024B39A4477a5Dc43fD6360e446851AD1D28
20x00000000000b7F8E8E8Ad148f9d53303Bfe20796100x5e5C817E9264B46cBBB980198684Ad9d14f3e0B4
30x00000000000b7F8E8E8Ad148f9d53303Bfe20796110x8376f63c13b99D3eedfA51ddd77Ff375279B3Ba0
40x00000000000b7F8E8E8Ad148f9d53303Bfe20796120xb5e34552F32BA9226C987769BF6555a538510BA8
\n", + "
" + ], + "text/plain": [ + " nft_address token_id \\\n", + "0 0x00000000000b7F8E8E8Ad148f9d53303Bfe20796 0 \n", + "1 0x00000000000b7F8E8E8Ad148f9d53303Bfe20796 1 \n", + "2 0x00000000000b7F8E8E8Ad148f9d53303Bfe20796 10 \n", + "3 0x00000000000b7F8E8E8Ad148f9d53303Bfe20796 11 \n", + "4 0x00000000000b7F8E8E8Ad148f9d53303Bfe20796 12 \n", + "\n", + " owner \n", + "0 0xb776cAb26B9e6Be821842DC0cc0e8217489a4581 \n", + "1 0x8A73024B39A4477a5Dc43fD6360e446851AD1D28 \n", + "2 0x5e5C817E9264B46cBBB980198684Ad9d14f3e0B4 \n", + "3 0x8376f63c13b99D3eedfA51ddd77Ff375279B3Ba0 \n", + "4 0xb5e34552F32BA9226C987769BF6555a538510BA8 " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "current_owners_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "5ab1dbb2-0d93-4bbd-a179-8f6735089f2b", + "metadata": {}, + "outputs": [], + "source": [ + "top_owners_df = current_owners_df.groupby([\"owner\"], as_index=False).size().rename(columns={\"size\": \"num_tokens\"})" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "223b7d4b-0362-4ce8-8ef7-4bb7f0b88ab8", + "metadata": {}, + "outputs": [], + "source": [ + "top_owners_df.sort_values(\"num_tokens\", inplace=True, ascending=False)" + ] + }, + { + "cell_type": "markdown", + "id": "89964e2f-458d-4e09-8f4b-cc8984a5f55f", + "metadata": {}, + "source": [ + "#### Top 20 NFT owners" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "a84b69f5-1295-4ebc-b15e-34425e6ebff9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ownernum_tokens
72720x02E4103b8A3c55AcDDF298311a9928f9Fe27822C100045
00x000000000000000000000000000000000000000083548
4702270xE052113bd7D7700d623414a0a4585BCaE754E9d551028
5620450xcDA72070E455bb31C7690a170224Ce43623d0B6f50131
3692280x96bEE49d3386d674bF4E956D9B3ce61b9540409D36751
4390860xC69b4c6fFDBaF843A0d0588c99E3C67f27069BEa32905
4272700xBa0d01220a7CeA942596123102535F800f55876332691
70x000000000000000000000000000000000000dEaD19758
2770x0008d343091EF8BD3EFA730F6aAE5A26a285C7a212137
4547050xD387A6E4e84a6C86bd90C158C6028A58CC8Ac45911497
\n", + "
" + ], + "text/plain": [ + " owner num_tokens\n", + "7272 0x02E4103b8A3c55AcDDF298311a9928f9Fe27822C 100045\n", + "0 0x0000000000000000000000000000000000000000 83548\n", + "470227 0xE052113bd7D7700d623414a0a4585BCaE754E9d5 51028\n", + "562045 0xcDA72070E455bb31C7690a170224Ce43623d0B6f 50131\n", + "369228 0x96bEE49d3386d674bF4E956D9B3ce61b9540409D 36751\n", + "439086 0xC69b4c6fFDBaF843A0d0588c99E3C67f27069BEa 32905\n", + "427270 0xBa0d01220a7CeA942596123102535F800f558763 32691\n", + "7 0x000000000000000000000000000000000000dEaD 19758\n", + "277 0x0008d343091EF8BD3EFA730F6aAE5A26a285C7a2 12137\n", + "454705 0xD387A6E4e84a6C86bd90C158C6028A58CC8Ac459 11497" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "top_owners_df.head(10)" + ] + }, + { + "cell_type": "markdown", + "id": "3590f26f-d486-4477-bf1d-b849ecf0f19b", + "metadata": { + "tags": [] + }, + "source": [ + "#### NFT ownership histogram\n", + "\n", + "The following is the cumulative distribution of the number of addressses owning $n$ NFTs for each $n \\geq 1$." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "89e9fa88-8997-4e89-a1a6-5f4dc0912be0", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.xlabel(\"Number of tokens owned - n\")\n", + "plt.ylabel(\"Number of addresses owning n tokens (log scale)\")\n", + "_ = plt.hist(top_owners_df[\"num_tokens\"], bins=100, log=True)\n", + "plt.savefig(\"img/tokens_owned_histogram_log.png\", transparent=True)" + ] + }, + { + "cell_type": "markdown", + "id": "e98d9d53-4068-4178-9cc8-603dc6ed824c", + "metadata": {}, + "source": [ + "The *overwhelming* number of NFT owners each only own a small number of tokens. There are very few addresses that own hundreds or even thousands of tokens.\n", + "\n", + "**Note:** This histogram has been charted on a logarithmic scale. We have done this because the true distribution of the count of number of NFTs owned by each address follows an [exponential distribution](https://en.wikipedia.org/wiki/Exponential_distribution). It would be difficult to visually tell apart the differences on ownership patterns over all owners if we charted this distribution using a linear scale." + ] + }, + { + "cell_type": "markdown", + "id": "11989c70-fe49-41c1-b28a-77d9b26fd465", + "metadata": {}, + "source": [ + "Any address which owns thousands of tokens is either purchasing those tokens automatically (if they exist on multiple contracts) or is financing the collections in which they own tokens. First, let us analye the ownership trends amount addresses which do not own large numbers of tokens. This will help us estimate trends in NFT ownership among non-algorithmic and non-smart contract owners.\n", + "\n", + "For this, we set a `scale_cutoff` and only consider addresses which own a number of tokens not exceeding that cutoff.\n", + "\n", + "This allows us to estimate on a linear scale, rather than a logarithmic one, how NFT ownership is distributed among human owners." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "6fd8e3ba-a943-4afc-8d9f-82d0f74e2d3f", + "metadata": {}, + "outputs": [], + "source": [ + "scale_cutoff = 1500" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "93681f2b-f6a8-440f-a831-ad43f5beb946", + "metadata": {}, + "outputs": [], + "source": [ + "low_scale_owners = [num_tokens for num_tokens in top_owners_df[\"num_tokens\"] if num_tokens <= scale_cutoff]" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "ad904ada-cffa-4dbe-8bd8-23a3cb33af50", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.xlabel(f\"Number of tokens owned - n <= {scale_cutoff}\")\n", + "plt.ylabel(\"Number of addresses owning n tokens\")\n", + "_ = plt.hist(low_scale_owners, bins=int(scale_cutoff/5))\n", + "plt.savefig(\"img/tokens_owned_histogram_low_scale.png\", transparent=True)" + ] + }, + { + "cell_type": "markdown", + "id": "3ea46e96-4771-4ef3-ac4a-a6cb310b362c", + "metadata": {}, + "source": [ + "Even at this scale, it is more instructive to view the distribution on a logarithmic scale:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "3a9415c3-a5f0-4c87-a6e7-69112c2e6c0f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.xlabel(f\"Number of tokens owned - n <= {scale_cutoff}\")\n", + "plt.ylabel(\"Number of addresses owning n tokens (log scale)\")\n", + "_ = plt.hist(low_scale_owners, bins=int(scale_cutoff/50), log=True)\n", + "plt.savefig(\"img/tokens_owned_histogram_log_low_scale.png\", transparent=True)" + ] + }, + { + "cell_type": "markdown", + "id": "1febf072-b4be-4460-8ef5-88715cb31230", + "metadata": {}, + "source": [ + "This analysis shows that the *decentralized* NFT market is indeed decentralized, with proportionally few NFTs being held by addresses which are minting and purchasing NFTs at industrial scale.\n", + "\n", + "**There are vanishingly few large scale NFT owners on the Ethereum blockchain.**\n", + "\n", + "Note that this is an analysis of addresses, not real-world entities. It is possible for a single person or organization to use a distinct Ethereum address to control each NFT they own. This would currently be difficult enough operationally that only a handful of players in the NFT market are probably doing it. Even this would yield to a further network analysis of where the *funds* for each NFT purchase were coming from." + ] + }, + { + "cell_type": "markdown", + "id": "0a597bc5-24a5-49a1-b6b5-082770d36ee4", + "metadata": {}, + "source": [ + "### The shapes of NFT collections\n", + "\n", + "NFTs are released in collections, with a single contract accounting for multiple tokens.\n", + "\n", + "Are there differences between ownership distributions of NFTs like the [Ethereum Name Service (ENS)](https://ens.domains/), which have utility beyond their artistic value, and those that do not currently have such use cases?\n", + "\n", + "One way we can answer this question is to see how much information each NFT collection gives us about individual owners of tokens in that collection. We will do this by treating each collection as a probability distribution over owners of tokens from that collection. If the collection $C$ consists of $n$ tokens and an address $A$ owns $m$ of those tokens, we will assign that address a probability of $p_A = m/n$ in the collection's associated probability distribution. Then we will calculate the entropy:\n", + "\n", + "$$H(C) = - \\sum_{A} p_A \\log(p_A).$$\n", + "\n", + "Here, the sum is over all addresses $A$ that own at least one token from $C$.\n", + "\n", + "$H(C)$ simultaneously contains information about:\n", + "1. How many tokens were issued as part of the collection $C$.\n", + "2. How evenly the tokens in $C$ are distributed over the addresses $A$ which own those tokens." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "8a08e304-b5ff-4e45-a12c-6fd562fe5255", + "metadata": {}, + "outputs": [], + "source": [ + "contract_owners_df = current_owners_df.groupby([\"nft_address\", \"owner\"], as_index=False).size().rename(columns={\"size\": \"num_tokens\"})" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "9fd82a56-fe0c-4f02-b996-c5bf0feea5e3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nft_addressownernum_tokens
00x00000000000b7F8E8E8Ad148f9d53303Bfe207960x429a635eD4DaF9529C07d5406D466B349EC343613
10x00000000000b7F8E8E8Ad148f9d53303Bfe207960x5e5C817E9264B46cBBB980198684Ad9d14f3e0B45
20x00000000000b7F8E8E8Ad148f9d53303Bfe207960x8376f63c13b99D3eedfA51ddd77Ff375279B3Ba01
30x00000000000b7F8E8E8Ad148f9d53303Bfe207960x83D7Da9E572C5ad14caAe36771022C43AF084dbF5
40x00000000000b7F8E8E8Ad148f9d53303Bfe207960x8A73024B39A4477a5Dc43fD6360e446851AD1D285
\n", + "
" + ], + "text/plain": [ + " nft_address \\\n", + "0 0x00000000000b7F8E8E8Ad148f9d53303Bfe20796 \n", + "1 0x00000000000b7F8E8E8Ad148f9d53303Bfe20796 \n", + "2 0x00000000000b7F8E8E8Ad148f9d53303Bfe20796 \n", + "3 0x00000000000b7F8E8E8Ad148f9d53303Bfe20796 \n", + "4 0x00000000000b7F8E8E8Ad148f9d53303Bfe20796 \n", + "\n", + " owner num_tokens \n", + "0 0x429a635eD4DaF9529C07d5406D466B349EC34361 3 \n", + "1 0x5e5C817E9264B46cBBB980198684Ad9d14f3e0B4 5 \n", + "2 0x8376f63c13b99D3eedfA51ddd77Ff375279B3Ba0 1 \n", + "3 0x83D7Da9E572C5ad14caAe36771022C43AF084dbF 5 \n", + "4 0x8A73024B39A4477a5Dc43fD6360e446851AD1D28 5 " + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "contract_owners_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "7192cc40-c04f-4e91-b731-5ba6ee749fde", + "metadata": {}, + "outputs": [], + "source": [ + "contract_owners_groups = contract_owners_df.groupby([\"nft_address\"])\n", + "\n", + "entropies = {}\n", + "\n", + "for contract_address, owners_group in contract_owners_groups:\n", + " total_supply = owners_group[\"num_tokens\"].sum()\n", + " owners_group[\"p\"] = owners_group[\"num_tokens\"]/total_supply\n", + " owners_group[\"log(p)\"] = np.log2(owners_group[\"p\"])\n", + " owners_group[\"-plog(p)\"] = (-1) * owners_group[\"p\"] * owners_group[\"log(p)\"]\n", + " entropy = owners_group[\"-plog(p)\"].sum()\n", + " entropies[contract_address] = entropy" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "2dc080a0-8dd1-49ab-be2d-cc1eed5d0ff4", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.xlabel(f\"Ownership entropy of NFT collection\")\n", + "plt.ylabel(\"Number of NFT collections\")\n", + "_ = plt.hist(entropies.values(), bins=80)\n", + "plt.savefig(\"img/ownership_entropy.png\", transparent=True)" + ] + }, + { + "cell_type": "markdown", + "id": "d197f6b6-65d8-4f84-9f12-9d31840adf34", + "metadata": {}, + "source": [ + "#### Collections at the extremes\n", + "\n", + "It is interesting to get a sense of what the collections look like at either extreme of this entropy spectrum." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "9e1bca5a-be9d-46c6-b21a-ae1a648b7fa7", + "metadata": {}, + "outputs": [], + "source": [ + "sorted_entropies = [it for it in entropies.items()]\n", + "sorted_entropies.sort(key=lambda it: it[1], reverse=True)\n", + "entropies_df = pd.DataFrame.from_records(sorted_entropies, columns=[\"nft_address\", \"entropy\"])" + ] + }, + { + "cell_type": "markdown", + "id": "c060fa53-245b-4774-8fba-0bb0aa2aed8d", + "metadata": {}, + "source": [ + "##### Highest entropy" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "c80abbc5-2268-47a7-b2df-f93450a4a7d0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nft_addressentropy
00x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA8513.864019
10x60F80121C31A0d46B5279700f9DF786054aa5eE513.831032
20xC36442b4a4522E871399CD717aBDD847Ab11FE8813.742724
30xabc207502EA88D9BCa29B95Cd2EeE5F0d793641813.714889
40x5537d90A4A2DC9d9b37BAb49B490cF67D4C54E9113.285761
\n", + "
" + ], + "text/plain": [ + " nft_address entropy\n", + "0 0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85 13.864019\n", + "1 0x60F80121C31A0d46B5279700f9DF786054aa5eE5 13.831032\n", + "2 0xC36442b4a4522E871399CD717aBDD847Ab11FE88 13.742724\n", + "3 0xabc207502EA88D9BCa29B95Cd2EeE5F0d7936418 13.714889\n", + "4 0x5537d90A4A2DC9d9b37BAb49B490cF67D4C54E91 13.285761" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "entropies_df.head()" + ] + }, + { + "cell_type": "markdown", + "id": "e0726c04-1349-4b8d-919e-7547cfffd6e7", + "metadata": {}, + "source": [ + "[`0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85`](https://etherscan.io/address/0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85) is the [Ethereum Name Service](https://ens.domains/).\n", + "\n", + "[`0x60F80121C31A0d46B5279700f9DF786054aa5eE5`](https://etherscan.io/address/0x60F80121C31A0d46B5279700f9DF786054aa5eE5) is [Rarible's](https://rarible.com/) governance token ([details](https://www.notion.so/rarible/Rarible-com-FAQ-a47b276aa1994f7c8e3bc96d700717c5)). Their aidrops are the cause of this high entropy.\n", + "\n", + "[`0xC36442b4a4522E871399CD717aBDD847Ab11FE88`](https://etherscan.io/address/0xC36442b4a4522E871399CD717aBDD847Ab11FE88) is [Uniswap's](https://uniswap.org/) position NFT, representing [non-fungible liquidity positions](https://uniswap.org/blog/uniswap-v3/) on Uniswap v3.\n", + "\n", + "[`0xabc207502EA88D9BCa29B95Cd2EeE5F0d7936418`](https://etherscan.io/address/0xabc207502EA88D9BCa29B95Cd2EeE5F0d7936418) are badges for [Yield Guild Games](https://yieldguild.io/), which seem to have been airdropped to many existing NFT holders.\n", + "\n", + "[`0x5537d90A4A2DC9d9b37BAb49B490cF67D4C54E91`](https://etherscan.io/address/0x5537d90A4A2DC9d9b37BAb49B490cF67D4C54E91) is the [OneDayPunk](https://punkscape.xyz/) collection, which has gained popularity as a down-market Crypto Punks alternative.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "786574c8-4226-43a4-b3e3-81fb8667583f", + "metadata": {}, + "source": [ + "##### Zero entropy" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "d4c9d052-f9dd-4e4f-9716-31ddd8692294", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nft_addressentropy
92870xfe00276E0A87E5e54ADD7C5FC6cdD80B363DEe040.0
92880xfe6b0dAccBAE832b0283CfBFEBe9543B6b7B10a80.0
92890xff881E3008f081707bdDA1644e6c92DB9599C1C00.0
92900xffC6c59F34Cd9f8861012FDDd0c7F1323082Ab860.0
92910xffCb352Fb3FdbEAab3F662378db28B8D151f210c0.0
\n", + "
" + ], + "text/plain": [ + " nft_address entropy\n", + "9287 0xfe00276E0A87E5e54ADD7C5FC6cdD80B363DEe04 0.0\n", + "9288 0xfe6b0dAccBAE832b0283CfBFEBe9543B6b7B10a8 0.0\n", + "9289 0xff881E3008f081707bdDA1644e6c92DB9599C1C0 0.0\n", + "9290 0xffC6c59F34Cd9f8861012FDDd0c7F1323082Ab86 0.0\n", + "9291 0xffCb352Fb3FdbEAab3F662378db28B8D151f210c 0.0" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "entropies_df.tail()" + ] + }, + { + "cell_type": "markdown", + "id": "49008c09-4fec-482a-b080-8836922de57b", + "metadata": {}, + "source": [ + "[`0xfe00276E0A87E5e54ADD7C5FC6cdD80B363DEe04`](https://etherscan.io/address/0xfe00276E0A87E5e54ADD7C5FC6cdD80B363DEe04).\n", + "\n", + "[`0xfe6b0dAccBAE832b0283CfBFEBe9543B6b7B10a8`](https://etherscan.io/address/0xfe6b0dAccBAE832b0283CfBFEBe9543B6b7B10a8).\n", + "\n", + "[`0xff881E3008f081707bdDA1644e6c92DB9599C1C0`](https://etherscan.io/address/0xff881E3008f081707bdDA1644e6c92DB9599C1C0).\n", + "\n", + "[`0xffC6c59F34Cd9f8861012FDDd0c7F1323082Ab86`](https://etherscan.io/address/0xffC6c59F34Cd9f8861012FDDd0c7F1323082Ab86).\n", + "\n", + "[`0xffCb352Fb3FdbEAab3F662378db28B8D151f210c`](https://etherscan.io/address/0xffCb352Fb3FdbEAab3F662378db28B8D151f210c).\n", + "\n", + "All these projects are NFTs that did see release in the time period for which we collected data, but saw no further activity. That means that these are either failed projects or projects that have not yet done an official launch." + ] + }, + { + "cell_type": "markdown", + "id": "598be2d9-5ade-45cd-8777-70a0d61cae34", + "metadata": {}, + "source": [ + "##### Low entropy" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "ca65053e-9cb7-4698-94b6-7da01e509bb7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nft_addressentropy
40250x08CdCF9ba0a4b5667F5A59B78B60FbEFb145e64c2.004886
40260xA4fF6019f9DBbb4bCC61Fa8Bd5C39F36ee4eB1642.003856
40270xB66c7Ca15Af1f357C57294BAf730ABc77FF949402.003756
40280x5f98B87fb68f7Bb6F3a60BD6f0917723365444C12.002227
40290x374DBF0dF7aBc89C2bA776F003E725177Cb357502.001823
\n", + "
" + ], + "text/plain": [ + " nft_address entropy\n", + "4025 0x08CdCF9ba0a4b5667F5A59B78B60FbEFb145e64c 2.004886\n", + "4026 0xA4fF6019f9DBbb4bCC61Fa8Bd5C39F36ee4eB164 2.003856\n", + "4027 0xB66c7Ca15Af1f357C57294BAf730ABc77FF94940 2.003756\n", + "4028 0x5f98B87fb68f7Bb6F3a60BD6f0917723365444C1 2.002227\n", + "4029 0x374DBF0dF7aBc89C2bA776F003E725177Cb35750 2.001823" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "entropies_df.loc[entropies_df[\"entropy\"] > 2].tail()" + ] + }, + { + "cell_type": "markdown", + "id": "0100251f-e2f3-4665-98cf-81594ecc0145", + "metadata": {}, + "source": [ + "[`0x08CdCF9ba0a4b5667F5A59B78B60FbEFb145e64c`](https://etherscan.io/address/0x08CdCF9ba0a4b5667F5A59B78B60FbEFb145e64c) is called [WorldCupToken](https://coinclarity.com/dapp/worldcuptoken/) and was last active 4 years ago. Their recent increase in activity could be in anticipation of the next soccer world cup in 2022.\n", + "\n", + "[`0xA4fF6019f9DBbb4bCC61Fa8Bd5C39F36ee4eB164`](https://etherscan.io/address/0xA4fF6019f9DBbb4bCC61Fa8Bd5C39F36ee4eB164) is associated with a project called [instigators](https://instigators.network/).\n", + "\n", + "[`0xB66c7Ca15Af1f357C57294BAf730ABc77FF94940`](https://etherscan.io/address/0xB66c7Ca15Af1f357C57294BAf730ABc77FF94940) is a token associated with something called the [Gems of Awareness Benefit](https://nftcalendar.io/event/gems-of-awareness-benefit-for-entheon-art-by-alex-grey-x-allyson-grey/).\n", + "\n", + "[`0x5f98B87fb68f7Bb6F3a60BD6f0917723365444C1`](https://etherscan.io/address/0x5f98B87fb68f7Bb6F3a60BD6f0917723365444C1) is [SHADYCON, an NFT associated with Eminem which seems to have been marketed on Nifty Gateway](https://www.eminem.com/news/shadycon-x-nifty-gateway).\n", + "\n", + "[`0x374DBF0dF7aBc89C2bA776F003E725177Cb35750`](https://etherscan.io/address/0x374DBF0dF7aBc89C2bA776F003E725177Cb35750) is [WyldFrogz](https://twitter.com/WyldFrogz), a cryptopunks derivative that seems to have some kind of planet-saving theme." + ] + }, + { + "cell_type": "markdown", + "id": "23ab64f9-85fb-4a12-87ef-a5f6295b43ce", + "metadata": {}, + "source": [ + "##### Medium entropy" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "09997f43-5eeb-43a1-9e01-4076b7a4bc8e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nft_addressentropy
15640x0ae3c3A1504E41a6877De1B854C000EC64894bEa6.021144
15650x1ECA43C93D8e06FB91489818B4967014D748Da536.017002
15660xc57605Bef27ef91DbECc839e71E49574b98857Fc6.011324
15670xd3f69F10532457D35188895fEaA4C20B730EDe886.010405
15680xba61aEF92ebF174DbB39C97Dd29D0F2bd3D83d336.009679
\n", + "
" + ], + "text/plain": [ + " nft_address entropy\n", + "1564 0x0ae3c3A1504E41a6877De1B854C000EC64894bEa 6.021144\n", + "1565 0x1ECA43C93D8e06FB91489818B4967014D748Da53 6.017002\n", + "1566 0xc57605Bef27ef91DbECc839e71E49574b98857Fc 6.011324\n", + "1567 0xd3f69F10532457D35188895fEaA4C20B730EDe88 6.010405\n", + "1568 0xba61aEF92ebF174DbB39C97Dd29D0F2bd3D83d33 6.009679" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "entropies_df.loc[entropies_df[\"entropy\"] > 6].tail()" + ] + }, + { + "cell_type": "markdown", + "id": "f3f2dc22-d111-472b-a28f-076f12f98047", + "metadata": {}, + "source": [ + "[`0x0ae3c3A1504E41a6877De1B854C000EC64894bEa`](https://etherscan.io/address/0x0ae3c3A1504E41a6877De1B854C000EC64894bEa) is the [Circleorzo NFT](https://opensea.io/collection/circleorzo), a collection of images of procedurally generated circles.\n", + "\n", + "[`0x1ECA43C93D8e06FB91489818B4967014D748Da53`](https://etherscan.io/address/0x1ECA43C93D8e06FB91489818B4967014D748Da53) is [Cowboy Punks](https://twitter.com/cowboypunks?lang=en), which appeals to blockheads that prefer westerns to cyberpunk.\n", + "\n", + "[`0xc57605Bef27ef91DbECc839e71E49574b98857Fc`](https://etherscan.io/address/0xc57605Bef27ef91DbECc839e71E49574b98857Fc) seems to be associated with the [Enigma Project](https://www.producthunt.com/posts/enigma-project) and control access to puzzle games.\n", + "\n", + "[`0xd3f69F10532457D35188895fEaA4C20B730EDe88`](https://etherscan.io/address/0xd3f69F10532457D35188895fEaA4C20B730EDe88) is something called hte [RTFKT Capsule Space Drip](https://rtfkt.com/spacedrip) which I do not understand and feel too old to have a hope of ever understanding. The important thing is that it seems these NFTs can be redeemed for a physical object called a space drip. [Here's a blog post about it](https://www.one37pm.com/nft/gaming/space-drip-rtfkt-loopify).\n", + "\n", + "[`0xba61aEF92ebF174DbB39C97Dd29D0F2bd3D83d33`](https://etherscan.io/address/0xba61aEF92ebF174DbB39C97Dd29D0F2bd3D83d33) is an NFT project called [Dommies](https://twitter.com/DommiesNFT)." + ] + }, + { + "cell_type": "markdown", + "id": "158b1714-083d-48fa-820a-c238b510de29", + "metadata": {}, + "source": [ + "##### Entropy as a measure of quality\n", + "\n", + "Based on this analysis, the ownership entropy of an NFT collection shows promise as a measure of its quality. There are certainly examples of high entropy NFT collections (like Rarible's governance token) which have that kind of entropy simply because they have been airdropped at scale. It remains to be seen what the value of these mass airdropped tokens will be in the long term.\n", + "\n", + "At the very least, the entropy measurement indicates that there is a lot of money behind those releases. This is in contrast to lower entropy releases promising thousands of tokens and only minting tens of them." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}