Skip to main content
Schema: base.nft Table: ez_nft_sales Type: View

What

This table provides a comprehensive view of NFT (Non-Fungible Token) sales across all major marketplaces and platforms on EVM blockchains. It captures both direct marketplace sales and aggregator-routed transactions, enabling analysis of NFT market dynamics, collection performance, and trading patterns.

Key Use Cases

  • Analyze daily/weekly NFT market volume and trends by platform
  • Track top-performing NFT collections by sales count and volume
  • Monitor marketplace competition and market share analysis
  • Identify whale activity and buyer behavior patterns
  • Evaluate creator royalty enforcement across platforms
  • Assess fee structures and revenue models by marketplace
  • Track cross-platform trader behavior and platform preferences

Important Relationships

  • Links to core.fact_event_logs via tx_hash and event_index
  • Joins with core.dim_contracts for collection name
  • References price.ez_prices_hourly for currency conversions
  • Connects to token transfer tables for ownership tracking

Commonly-used Fields

  • platform_name: Marketplace where sale occurred (opensea, blur, etc.)
  • contract_address: NFT collection contract address
  • token_id: Unique identifier of the specific NFT
  • buyer_address / seller_address: Transaction participants
  • price_usd: Sale price converted to USD (includes fees)
  • total_fees_usd: Combined platform and creator fees in USD
  • event_type: Type of sale transaction (sale, bid_won, etc.)

Sample Queries

Daily NFT market volume by platform
-- Daily NFT market volume by platform
SELECT 
    DATE_TRUNC('day', block_timestamp) AS date,
    platform_name,
    COUNT(*) as sales_count,
    COUNT(DISTINCT tx_hash) AS unique_sales_transaction_count,
    COUNT(DISTINCT buyer_address) AS unique_buyers,
    COUNT(DISTINCT contract_address) AS collections_traded,
    SUM(price_usd) AS total_volume_usd,
    AVG(price_usd) AS avg_sale_price_usd
FROM <blockchain_name>.nft.ez_nft_sales
WHERE block_timestamp >= CURRENT_DATE - 30
    AND price_usd IS NOT NULL
GROUP BY 1, 2
ORDER BY 1 DESC, 7 DESC;
Top selling NFT collections
-- Top selling NFT collections
SELECT 
    contract_address,
    name AS collection_name,
    COUNT(*) AS sales_count,
    COUNT(DISTINCT token_id) AS unique_tokens_sold,
    COUNT(DISTINCT buyer_address) AS unique_buyers,
    SUM(price_usd) AS total_volume_usd,
    AVG(price_usd) AS avg_price_usd,
    MAX(price_usd) AS highest_sale_usd
FROM <blockchain_name>.nft.ez_nft_sales
WHERE block_timestamp >= CURRENT_DATE - 7
    AND price_usd IS NOT NULL
GROUP BY 1, 2
ORDER BY 6 DESC
LIMIT 50;
Marketplace competition analysis
-- Marketplace competition analysis
WITH platform_metrics AS (
    SELECT 
        platform_name,
        COUNT(*) AS total_sales,
        SUM(price_usd) AS total_volume_usd,
        COUNT(DISTINCT buyer_address) AS unique_buyers,
        COUNT(DISTINCT seller_address) AS unique_sellers,
        AVG(platform_fee / NULLIF(price, 0) * 100) AS avg_platform_fee_pct,
        SUM(platform_fee_usd) AS total_platform_revenue_usd
    FROM <blockchain_name>.nft.ez_nft_sales
    WHERE block_timestamp >= CURRENT_DATE - 30
        AND price_usd IS NOT NULL
    GROUP BY 1
)
SELECT 
    platform_name,
    total_sales,
    total_volume_usd,
    total_volume_usd * 100.0 / SUM(total_volume_usd) OVER () AS market_share_pct,
    unique_buyers,
    unique_sellers,
    avg_platform_fee_pct,
    total_platform_revenue_usd
FROM platform_metrics
ORDER BY total_volume_usd DESC;
Whale activity tracking
-- Whale activity tracking
WITH buyer_stats AS (
    SELECT 
        buyer_address,
        COUNT(*) AS purchases,
        COUNT(DISTINCT contract_address) AS unique_collections,
        SUM(price_usd) AS total_spent_usd,
        AVG(price_usd) AS avg_purchase_price,
        MAX(price_usd) AS highest_purchase
    FROM <blockchain_name>.nft.ez_nft_sales
    WHERE block_timestamp >= CURRENT_DATE - 30
        AND price_usd IS NOT NULL
    GROUP BY 1
)
SELECT 
    CASE 
        WHEN total_spent_usd < 1000 THEN '< $1K'
        WHEN total_spent_usd < 10000 THEN '$1K - $10K'
        WHEN total_spent_usd < 100000 THEN '$10K - $100K'
        WHEN total_spent_usd < 1000000 THEN '$100K - $1M'
        ELSE '> $1M'
    END AS buyer_tier,
    COUNT(*) AS buyer_count,
    SUM(purchases) AS total_purchases,
    AVG(unique_collections) AS avg_collections_per_buyer,
    SUM(total_spent_usd) AS tier_total_spent
FROM buyer_stats
GROUP BY 1
ORDER BY MIN(total_spent_usd);
Creator royalty analysis
-- Creator royalty analysis
SELECT 
    name AS collection_name,
    contract_address,
    COUNT(*) AS sales_with_royalties,
    SUM(creator_fee) AS total_creator_fees,
    SUM(creator_fee_usd) AS total_creator_fees_usd,
    AVG(creator_fee / NULLIF(price, 0) * 100) AS avg_royalty_pct,
    SUM(creator_fee_usd) / NULLIF(SUM(price_usd), 0) * 100 AS effective_royalty_rate
FROM <blockchain_name>.nft.ez_nft_sales
WHERE creator_fee > 0
    AND price > 0
    AND block_timestamp >= CURRENT_DATE - 30
GROUP BY 1, 2
HAVING COUNT(*) > 10
ORDER BY total_creator_fees_usd DESC
LIMIT 100;

Columns

Column NameData TypeDescription
BLOCK_NUMBERNUMBERSequential counter representing the position of a block in the blockchain since genesis (block 0). Key Facts: Immutable once finalized Primary ordering mechanism for blockchain data Increments by 1 for each new block Used as a proxy for time in many analyses Usage in Queries: Important: Block numbers are chain-specific. Block 15000000 on Ethereum ≠ block 15000000 on Polygon.
BLOCK_TIMESTAMPTIMESTAMP_NTZUTC timestamp when the block was produced by validators/miners. Format: TIMESTAMP_NTZ (no timezone) Precision: Second-level accuracy Reliability: Set by block producer Can have minor variations (±15 seconds) Always increasing (newer blocks = later timestamps) Best Practices: Note: Use for time-series analysis, but be aware that block production rates vary by chain.
TX_HASHTEXTUnique 66-character identifier for the transaction. Format: 0x + 64 hexadecimal characters Usage: Primary key for transaction lookups Join key for traces, logs, and token transfers Immutable once confirmed Example: 0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060
EVENT_INDEXNUMBERZero-based sequential position of the event within a transaction’s execution. Key Facts: Starts at 0 for first event Increments across all contracts in transaction Preserves execution order Essential for deterministic event ordering Usage Example:
EVENT_TYPETEXTThe specific type of NFT transaction that occurred. Common values include ‘sale’, ‘bid_won’, ‘redeem’, and ‘mint’. Example: ‘sale’
PLATFORM_ADDRESSTEXTThe smart contract address of the marketplace facilitating the sale. Platforms may have multiple contracts for different versions. Example: ‘0x00000000006c3852cbef3e08e8df289169ede581’
PLATFORM_NAMETEXTThe marketplace or platform where the NFT sale occurred. Standardized to lowercase with no spaces. Example: ‘opensea’
PLATFORM_EXCHANGE_VERSIONTEXTThe version identifier of the marketplace contract. Tracks protocol versions and upgrades. Example: ‘seaport15’
AGGREGATOR_NAMETEXTThe NFT aggregator platform that routed the transaction. NULL indicates direct platform interaction. Example: ‘gem’
SELLER_ADDRESSTEXTThe blockchain address that sold the NFT. Example: ‘0x1234567890123456789012345678901234567890’
BUYER_ADDRESSTEXTThe blockchain address that purchased the NFT. Example: ‘0x1234567890123456789012345678901234567890’
CONTRACT_ADDRESSTEXTThe smart contract address of the NFT collection. Supports ERC-721, ERC-1155, and custom implementations. Example: ‘0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d’
NAMETEXTThe name of the NFT collection or project. May be NULL for unverified collections. Example: ‘Bored Ape Yacht Club’
TOKEN_IDTEXTThe unique identifier of the specific NFT within its collection. Format is numeric string. Example: ‘1234’
QUANTITYTEXTThe number of tokens sold in the transaction. Primarily relevant for ERC-1155 tokens. Example: ‘1’
TOKEN_STANDARDTEXTThe technical standard implemented by the NFT contract. Common values include ‘erc721’, ‘erc1155’, ‘cryptopunks’, and ‘legacy’. Example: ‘erc721’
CURRENCY_SYMBOLTEXTThe symbol of the token used for payment. Example: ‘ETH’
CURRENCY_ADDRESSTEXTThe contract address of the payment token. Shows ‘ETH’ for native ETH payments. Example: ‘0xa0b86a33e6776a1e7f9f0b8b8b8b8b8b8b8b8b8b’
PRICEFLOATThe sale price in the payment currency, including platform and creator fees. Raw price before USD conversion. Example: 2.5
PRICE_USDFLOATThe sale price converted to USD at transaction time, including platform and creator fees. May be NULL for missing price data. Example: 4250.75
TOTAL_FEESFLOATThe combined platform and creator fees in the payment currency. Example: 0.125
PLATFORM_FEEFLOATThe fee charged by the marketplace in the payment currency. Typically 2-2.5% of sale price. Example: 0.05
CREATOR_FEEFLOATThe royalty fee paid to the collection creator in the payment currency. Typically 0-10% of sale price. Example: 0.075
TOTAL_FEES_USDFLOATThe combined platform and creator fees converted to USD. Example: 212.54
PLATFORM_FEE_USDFLOATThe marketplace fee converted to USD. Example: 85.02
CREATOR_FEE_USDFLOATThe royalty fee converted to USD. Example: 127.52
TX_FEEFLOATTotal fee paid for transaction execution in native token units. Example: 0.002
TX_FEE_USDFLOATThe transaction fee denominated in USD. Use only one instance per transaction to avoid overcounting. Example: 45.32
ORIGIN_FROM_ADDRESSTEXTThe externally-owned account (EOA) or contract address that initiated the transaction. Key Points: Always 42 characters (0x + 40 hex chars) Lowercase normalized in all tables Cannot be NULL for valid transactions For contract creation: sender of creation transaction Common Patterns: EOA → EOA: Simple transfer EOA → Contract: User interaction Contract → Contract: Internal calls (see fact_traces) Known addresses: Exchange hot wallets, protocol deployers Query Examples:
ORIGIN_TO_ADDRESSTEXTThe destination address for the transaction - either an EOA or contract address. Special Cases: NULL: Contract creation transaction Contract address: Interacting with smart contract EOA address: Simple transfer or receiving funds Important Patterns: Note: For token transfers, this is the token contract, not the recipient. See eztokentransfers tables for recipient.
ORIGIN_FUNCTION_SIGNATURETEXTFunction signature (first 4 bytes) of the called method. Format: 0x + 8 hex characters Common Signatures: 0xa9059cbb: transfer(address,uint256) 0x095ea7b3: approve(address,uint256) 0x23b872dd: transferFrom(address,address,uint256) Note: NULL for simple transfers or invalid calls
EZ_NFT_SALES_IDTEXTPrimary key - unique identifier for each row ensuring data integrity. Format: Usually VARCHAR containing composite key generated using MD5 hash of the relevant columns. Example: MD5(blocknumber, txhash, trace_index) Usage: Deduplication in incremental loads Join operations for data quality checks Troubleshooting specific records Important: Implementation varies by table - check table-specific documentation.
INSERTED_TIMESTAMPTIMESTAMP_NTZUTC timestamp when the record was first added to the Flipside database. Format: TIMESTAMP_NTZ Use Cases: Data freshness monitoring Incremental processing markers Debugging data pipeline issues SLA tracking Query Example:
MODIFIED_TIMESTAMPTIMESTAMP_NTZUTC timestamp of the most recent update to this record. Format: TIMESTAMP_NTZ Triggers for Updates: Data corrections Enrichment additions Reprocessing for accuracy Schema migrations Monitoring Usage: