Skip to main content
Schema: solana.nft Table: ez_nft_sales Type: Base Table

Description

This table provides a unified view of NFT sales across multiple Solana marketplaces, including Magic Eden, Hadeswap, Exchange Art, TensorSwap, and others. It consolidates sales data from various marketplace sources and enriches it with NFT metadata, USD pricing, and marketplace information. The table supports both standard NFTs and compressed NFTs (cNFTs), with USD prices available from December 16, 2021 onwards, enabling comprehensive cross-marketplace analysis.

Key Use Cases

  • Compare sales volumes and trends across different NFT marketplaces
  • Monitor NFT price movements and market performance over time
  • Analyze sales performance of specific NFT collections and individual assets
  • Study buyer and seller patterns across different marketplaces and time periods
  • Track creator royalties and marketplace fees from NFT sales
  • Identify trending collections and high-value NFT transactions

Important Relationships

  • Links to nft.dim_nft_metadata via mint address to provide rich NFT context
  • Connects to price.ez_prices_hourly for USD price conversion and price.ez_asset_metadata for currency symbols
  • References core.fact_blocks and core.fact_transactions for blockchain context
  • Includes specialized fields (tree_authority, merkle_tree, leaf_index) for cNFT transactions

Commonly-used Fields

  • block_timestamp: Timestamp when the sale transaction was processed on Solana
  • tx_id: Unique transaction identifier for the sale
  • buyer_address: Address of the account that purchased the NFT
  • seller_address: Address of the account that sold the NFT
  • mint: The unique mint address of the NFT being sold
  • price: Sale amount in the native currency (typically SOL)
  • price_usd: Sale amount converted to USD for cross-marketplace comparison
  • marketplace: Name of the marketplace where the sale occurred
  • currency_address: Address of the token used for payment
  • currency_symbol: Symbol of the payment token (e.g., SOL, USDC)
  • is_compressed: Boolean indicating if the NFT is a compressed NFT (cNFT)
  • nft_name: Human-readable name of the NFT from metadata
  • nft_collection_name: Name of the collection the NFT belongs to

Sample Queries

Daily NFT marketplace volume and activity

SELECT
    DATE_TRUNC('day', block_timestamp) AS date,
    marketplace,
    COUNT(*) AS total_sales,
    COUNT(DISTINCT buyer_address) AS unique_buyers,
    COUNT(DISTINCT seller_address) AS unique_sellers,
    COUNT(DISTINCT mint) AS unique_nfts_traded,
    SUM(price) AS total_volume_native,
    SUM(price_usd) AS total_volume_usd,
    AVG(price_usd) AS avg_sale_price_usd,
    MAX(price_usd) AS highest_sale_usd
FROM solana.nft.ez_nft_sales
WHERE block_timestamp >= CURRENT_DATE - 30
    AND price_usd > 0
GROUP BY 1, 2
ORDER BY 1 DESC, total_volume_usd DESC;

Top NFT collections by volume

SELECT
    nft_collection_name,
    COUNT(*) AS total_sales,
    COUNT(DISTINCT mint) AS unique_nfts_sold,
    COUNT(DISTINCT buyer_address) AS unique_buyers,
    SUM(price_usd) AS total_volume_usd,
    AVG(price_usd) AS avg_price_usd,
    MIN(price_usd) AS floor_price_usd,
    MAX(price_usd) AS ceiling_price_usd,
    PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY price_usd) AS median_price_usd
FROM solana.nft.ez_nft_sales
WHERE block_timestamp >= CURRENT_DATE - 7
    AND price_usd > 0
    AND nft_collection_name IS NOT NULL
GROUP BY 1
HAVING total_sales >= 10
ORDER BY total_volume_usd DESC
LIMIT 50;

NFT flipping activity (bought and sold within short timeframe)

WITH nft_transactions AS (
    SELECT
        mint,
        buyer_address AS owner,
        seller_address AS previous_owner,
        block_timestamp AS purchase_time,
        price_usd AS purchase_price,
        tx_id
    FROM solana.nft.ez_nft_sales
    WHERE block_timestamp >= CURRENT_DATE - 7
        AND price_usd > 0
),
flips AS (
    SELECT
        t1.mint,
        t1.owner AS flipper,
        t1.purchase_time AS buy_time,
        t2.purchase_time AS sell_time,
        t1.purchase_price AS buy_price,
        t2.purchase_price AS sell_price,
        t2.purchase_price - t1.purchase_price AS profit_usd,
        (t2.purchase_price - t1.purchase_price) / NULLIF(t1.purchase_price, 0) * 100 AS profit_pct,
        DATEDIFF('hour', t1.purchase_time, t2.purchase_time) AS hold_time_hours
    FROM nft_transactions t1
    INNER JOIN nft_transactions t2
        ON t1.mint = t2.mint
        AND t1.owner = t2.previous_owner
        AND t2.purchase_time > t1.purchase_time
        AND t2.purchase_time <= t1.purchase_time + INTERVAL '3 days'
)
SELECT
    mint,
    flipper,
    buy_time,
    sell_time,
    hold_time_hours,
    buy_price,
    sell_price,
    profit_usd,
    profit_pct
FROM flips
WHERE ABS(profit_usd) > 10
ORDER BY profit_usd DESC
LIMIT 100;

Columns

Column NameData TypeDescription
MARKETPLACETEXTNFT Marketplace platform where transaction occured
MARKETPLACE_VERSIONTEXTThe version of the NFT marketplace protocol used for the transaction. This field identifies the specific version of the marketplace program that facilitated the NFT sale.
  • Data type: STRING (e.g., ‘v1’, ‘v2’, ‘v3’)
  • Business context: Used to track protocol evolution, feature adoption, and user migration between marketplace versions.
  • Analytics use cases: Marketplace upgrade impact analysis, version adoption trends, and protocol migration studies.
  • Example: ‘v2’ | | BLOCK_TIMESTAMP | TIMESTAMP_NTZ | The timestamp (UTC) at which the block was produced on the Solana blockchain. This field is recorded as a TIMESTAMP data type and represents the precise moment the block was finalized and added to the chain. It is essential for time-series analysis, block production monitoring, and aligning transaction and event data to specific points in time. Used extensively for analytics involving block intervals, network activity trends, and historical lookups. Format: YYYY-MM-DD HH:MI:SS (UTC). | | BLOCK_ID | NUMBER | A unique identifier for the block in which this transaction was included on the Solana blockchain. Typically a sequential integer or hash, depending on the data source. Used to group transactions by block and analyze block-level activity.
Example:
  • 123456789
Business Context:
  • Supports block-level analytics, such as block production rate and transaction throughput.
  • Useful for tracing transaction inclusion and block explorer integrations.
Relationships:
  • All transactions with the same ‘block_id’ share the same ‘block_timestamp’. | | TX_ID | TEXT | The unique transaction signature (hash) for each transaction on the Solana blockchain. This field is a base58-encoded string, typically 88 characters in length, and serves as the primary identifier for transactions across all Solana data models. Used to join transaction data with related tables (blocks, events, transfers, logs, decoded instructions) and to trace the full lifecycle and effects of a transaction. Essential for transaction-level analytics, debugging, and cross-referencing with block explorers or Solana APIs.
Example:
  • 5Nf6Q2k6v1Qw2k3v4Qw5Nf6Q2k6v1Qw2k3v4Qw5Nf6Q2k6v1Qw2k3v4Qw5Nf6Q2k6v1Qw2k3v4Qw
Business Context:
  • Enables precise tracking, auditing, and attribution of on-chain activity
  • Used for linking transactions to events, logs, and protocol actions
  • Critical for compliance, monitoring, and analytics workflows | | SUCCEEDED | BOOLEAN | Boolean flag indicating whether the transaction was successfully executed and confirmed on the Solana blockchain. A value of TRUE means the transaction was processed without errors; FALSE indicates failure due to program errors, insufficient funds, or other issues.
Example:
  • true
  • false
Business Context:
  • Used to filter for successful transactions in analytics and reporting.
  • Important for error analysis, user experience, and program debugging. | | INDEX | NUMBER | Location of the event within the instructions of a transaction | | INNER_INDEX | NUMBER | Location of the event within the inner instructions of a transaction | | PROGRAM_ID | TEXT | The unique public key (base58-encoded address) of a Solana program. This field identifies the on-chain program (smart contract) responsible for processing instructions, emitting events, or managing accounts. Used throughout Solana analytics models—including events, transactions, IDLs, and program activity tables—to join, filter, and analyze program-level data.
Example:
  • “4Nd1mY…”
  • “TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA”
Business Context:
  • Used as a join key for program activity, deployments, events, and interface changes.
  • Supports segmentation of activity by protocol, DEX, NFT marketplace, or other on-chain application. | | BUYER_ADDRESS | TEXT | The wallet address that purchased the NFT | | SELLER_ADDRESS | TEXT | The wallet address that sold the NFT | | MINT | TEXT | Unique address representing a specific token | | NFT_NAME | TEXT | The human-readable name of the NFT as specified in its metadata. This field provides a user-friendly identifier for the NFT that can be used for display, search, and analytics purposes.
  • Data type: STRING (e.g., ‘Bored Ape #1234’, ‘CryptoPunk #5678’)
  • Business context: Used for user experience, search, and discovery of NFTs within collections and across marketplaces.
  • Analytics use cases: Collection curation, search optimization, and user-facing NFT listings.
  • Example: ‘Bored Ape #1234’ | | PRICE | FLOAT | The amount of Solana the NFT was purchased for | | CURRENCY_ADDRESS | TEXT | The address of the token used to pay for the NFT transaction. This field identifies which cryptocurrency or token was used as payment, enabling analysis of payment preferences and market dynamics.
  • Data type: STRING (Solana address, e.g., ‘So11111111111111111111111111111111111111112’ for SOL, ‘EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v’ for USDC)
  • Business context: Used to identify the payment asset for NFT sales and mints, analyze payment trends, and support cross-token analytics.
  • Analytics use cases: Payment token flow analysis, market share by token, cross-currency price comparisons, and filtering NFT sales by payment asset.
  • Example: ‘So11111111111111111111111111111111111111112’ (SOL) | | CURRENCY_SYMBOL | TEXT | The symbol of the token used to pay for the NFT transaction. This field provides a human-readable identifier for the payment currency, making it easier to understand and analyze payment patterns.
  • Data type: STRING (e.g., ‘SOL’, ‘USDC’, ‘USDT’)
  • Business context: Used for user-friendly display, filtering, and grouping of NFT sales and mints by payment token.
  • Analytics use cases: Market share by token symbol, user preference analysis, and reporting on payment trends.
  • Example: ‘SOL’ | | PRICE_USD | FLOAT | The amount paid for the NFT converted to USD. This field provides a standardized value for cross-marketplace comparison and enables analysis of NFT valuations and market trends.
  • Data type: FLOAT (e.g., 1000.50)
  • Business context: Used to compare NFT prices across different tokens and marketplaces, and to analyze market value in a common currency.
  • Analytics use cases: Price trend analysis, cross-marketplace comparisons, and USD-denominated sales reporting.
  • Example: 1000.50 | | TREE_AUTHORITY | TEXT | The address that has authority to manage the merkle tree, inclding adding new leaves or updating the tree structure | | MERKLE_TREE | TEXT | The address of the merkle tree which contains the cNFT | | LEAF_INDEX | NUMBER | The position of the leaf within the merkle tree used to locate and verify the leaf’s data | | IS_COMPRESSED | BOOLEAN | Identifies if the NFT is a compressed NFT | | NFT_COLLECTION_NAME | TEXT | The name of the NFT collection that the NFT belongs to, as provided by Solscan. This field groups NFTs into logical collections and enables collection-level analytics and tracking.
  • Data type: STRING (e.g., ‘Bored Ape Yacht Club’, ‘Okay Bears’)
  • Business context: Used to organize NFTs, analyze collection performance, and support collection-level analytics.
  • Analytics use cases: Collection trend analysis, rarity studies, and collection-based filtering.
  • Example: ‘Okay Bears’ | | COLLECTION_ID | TEXT | The unique address identifier for the NFT collection. This field provides a blockchain-level identifier for grouping NFTs into collections and enables collection-level analytics and tracking.
  • Data type: STRING (Solana address, e.g., ‘EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v’)
  • Business context: Used for precise collection grouping, analytics, and to join with other collection-level data.
  • Analytics use cases: Collection-level aggregation, cross-collection comparisons, and collection membership queries.
  • Example: ‘EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v’ | | CREATORS | VARIANT | A JSON array containing the creator addresses and their associated royalty percentages for the NFT. This field tracks who created the NFT and what percentage of sales they receive as royalties.
  • Data type: ARRAY of STRUCTS (e.g., [{"address": "...", "share": 50}])
  • Business context: Used for royalty attribution, creator analytics, and revenue distribution.
  • Analytics use cases: Creator earnings analysis, royalty flow tracking, and multi-creator attribution studies.
  • Example: [{"address": "9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM", "share": 50}] | | AUTHORITY | TEXT | The address of the account that has authority over the NFT mint. This field identifies who can perform administrative actions on the NFT, such as minting additional editions or updating metadata.
  • Data type: STRING (Solana address, e.g., ‘9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM’)
  • Business context: Used to track NFT governance, edition minting, and authority changes.
  • Analytics use cases: Authority change tracking, edition minting analysis, and NFT governance studies.
  • Example: ‘9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM’ | | METADATA | ARRAY | a block of json that describes the traits of an NFT | | IMAGE_URL | TEXT | URL that links to the image on the ipfs service | | METADATA_URI | TEXT | URL that links to the token metadata on the ipfs service | | EZ_NFT_SALES_ID | TEXT | A unique, stable identifier for each record in this table. The primary key (PK) ensures that every row is uniquely identifiable and supports efficient joins, lookups, and data integrity across models. The PK may be a natural key (such as a blockchain transaction hash) or a surrogate key generated from one or more fields, depending on the table’s structure and requirements. | | INSERTED_TIMESTAMP | TIMESTAMP_NTZ | The timestamp when this transaction record was first inserted into the analytics database. Used for data freshness tracking and incremental model logic. Format: YYYY-MM-DD HH:MI:SS. Not derived from the blockchain, but from the ETL process. | | MODIFIED_TIMESTAMP | TIMESTAMP_NTZ | The timestamp when this transaction record was last updated in the analytics database. Used for tracking updates and supporting incremental model logic. Format: YYYY-MM-DD HH:MI:SS. Not derived from the blockchain, but from the ETL process. |