> ## Documentation Index
> Fetch the complete documentation index at: https://docs.blockdb.io/llms.txt
> Use this file to discover all available pages before exploring further.

# ERC-721 Tokens

> Complete NFT collection registry for Ethereum & EVM chains — ERC-721 metadata, ERC-165 detection. REST API and bulk export.

## Overview

* **Dataset ID:** `0202`
* **Table:** `blockdb_evm.b0202_erc721_tokens_v1`
* **Description:** Catalog of ERC-721 NFT collection contracts (EIP-721).
* **Stable id:** `contract_id` (per deployment incarnation; multiple snapshot rows possible—see callout)
* **API:** [POST /evm/entities/tokens/erc721](/api-reference/evm/entities/tokens-erc721)
* **CSV Sample:** [Download](https://huggingface.co/datasets/BlockDB/ERC721-Tokens-Ethereum-And-EVM-Cryptocurrency-Data/resolve/main/data/blockdb_evm.b0202_erc721_tokens_v1.csv?download=true)
* **JSON Sample:** [Download](https://huggingface.co/datasets/BlockDB/ERC721-Tokens-Ethereum-And-EVM-Cryptocurrency-Data/resolve/main/data/blockdb_evm.b0202_erc721_tokens_v1.json?download=true)

### How we recognize ERC-721

We treat a contract as ERC-721 when it complies with the [EIP-721 Non-Fungible Token Standard](https://eips.ethereum.org/EIPS/eip-721). Primary detection uses [ERC-165](https://eips.ethereum.org/EIPS/eip-165): we call `supportsInterface(0x80ac58cd)` and, if it returns true, we classify the address as an ERC-721 NFT collection. If that check is unavailable, we use a fallback heuristic: the contract returns a valid result for `ownerOf(uint256)` and does not implement `decimals()` (so it is distinguished from ERC-20). Optional extensions — **ERC721Metadata** (name, symbol, tokenURI) and **ERC721Enumerable** — are detected via their ERC-165 interface IDs; we store `token_uri`, `supports_metadata`, and `supports_enumerable` when present.

<Callout icon="lightbulb" color="#3B82F6" iconType="regular">
  This table is **append-only**: the same `contract_id` can have **multiple rows** when an upgradeable proxy swaps implementation—we append refreshed view reads at **`upgradeBlock + 1`** with **`tx_index = -1`** (genesis rows use a normal tx index). For **current** metadata, take the **latest** `block_number` per `contract_id` (for point-in-time, add `block_number <= $target` first). Join on **`contract_id`**, not `contract_address` alone—redeploys at the same address get a new `contract_id`.
</Callout>

## Sample Viewer

<Frame>
  <iframe src="https://huggingface.co/datasets/BlockDB/ERC721-Tokens-Ethereum-And-EVM-Cryptocurrency-Data/embed/viewer/default/train" frameborder="0" width="100%" height="600px" />
</Frame>

## Columns

| Column                | Type          | Description                                                                                         |
| --------------------- | ------------- | --------------------------------------------------------------------------------------------------- |
| `contract_id`         | `BYTEA`       | Unique contract incarnation ID: 20B address + 4B creation block (BE) + 2B tx\_index (BE).           |
| `contract_address`    | `BYTEA`       | Address of the ERC-721 contract (20 bytes).                                                         |
| `block_number`        | `BIGINT`      | Block of the log we attribute as the genesis/recognition point.                                     |
| `block_time`          | `TIMESTAMPTZ` | UTC timestamp of the block.                                                                         |
| `tx_index`            | `INTEGER`     | Transaction index in the block, or **`-1`** for proxy-upgrade refresh rows (see callout).           |
| `name`                | `TEXT`        | Collection name from name() (ERC721Metadata, optional).                                             |
| `symbol`              | `TEXT`        | Collection symbol from symbol() (ERC721Metadata, optional).                                         |
| `token_uri`           | `TEXT`        | Representative sample from the discovery probe.                                                     |
| `supports_metadata`   | `BOOLEAN`     | Whether the contract supports the ERC721Metadata extension; NULL when detection was via fallback.   |
| `supports_enumerable` | `BOOLEAN`     | Whether the contract supports the ERC721Enumerable extension; NULL when detection was via fallback. |
| `_tracing_id`         | `BYTEA`       | Tracing ID of this ERC-721 token record.                                                            |
| `_parent_tracing_ids` | `BYTEA[]`     | Tracing IDs of the parent records leading to this ERC-721 token record.                             |
| `_created_at`         | `TIMESTAMPTZ` | Record creation timestamp.                                                                          |
| `_updated_at`         | `TIMESTAMPTZ` | Record last update timestamp.                                                                       |

## Use Cases

* NFT collection registry for marketplaces and analytics platforms
* Collection discovery and new listing detection
* Metadata resolution via token\_uri for display purposes
* Portfolio tracking and wallet analytics for NFT holdings

## Related Datasets

<CardGroup cols={3}>
  <Card title="Token Transfers" icon="coins" href="/data-catalog/evm/transfers/token-transfers">
    ERC-721 transfer events for these NFTs.
  </Card>

  <Card title="ERC-20 Tokens" icon="circle-dollar-to-slot" href="/data-catalog/evm/entities/erc20-tokens">
    Fungible token registry for cross-standard joins.
  </Card>

  <Card title="ERC-1155 Tokens" icon="layer-group" href="/data-catalog/evm/entities/erc1155-tokens">
    Multi-token standard for gaming and metaverse assets.
  </Card>
</CardGroup>
