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

What

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_TIMESTAMPTIMESTAMP_NTZThe 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_IDNUMBERA 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 ‘blockid’ s…
TX_IDTEXTThe 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 bl…
SUCCEEDEDBOOLEANBoolean 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.
INDEXNUMBERLocation of the event within the instructions of a transaction
INNER_INDEXNUMBERLocation of the event within the inner instructions of a transaction
PROGRAM_IDTEXTThe 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, deployme…
BUYER_ADDRESSTEXTThe wallet address that purchased the NFT
SELLER_ADDRESSTEXTThe wallet address that sold the NFT
MINTTEXTUnique address representing a specific token
NFT_NAMETEXTThe 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’
PRICEFLOATThe amount of Solana the NFT was purchased for
CURRENCY_ADDRESSTEXTThe 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…
CURRENCY_SYMBOLTEXTThe 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_USDFLOATThe 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_AUTHORITYTEXTThe address that has authority to manage the merkle tree, inclding adding new leaves or updating the tree structure
MERKLE_TREETEXTThe address of the merkle tree which contains the cNFT
LEAF_INDEXNUMBERThe position of the leaf within the merkle tree used to locate and verify the leaf’s data
IS_COMPRESSEDBOOLEANIdentifies if the NFT is a compressed NFT
NFT_COLLECTION_NAMETEXTThe 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_IDTEXTThe 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 members…
CREATORSVARIANTA 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:…
AUTHORITYTEXTThe 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: ‘9WzDXwBbmkg8…
METADATAARRAYa block of json that describes the traits of an NFT
IMAGE_URLTEXTURL that links to the image on the ipfs service
METADATA_URITEXTURL that links to the token metadata on the ipfs service
EZ_NFT_SALES_IDTEXTA 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_TIMESTAMPTIMESTAMP_NTZThe 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_TIMESTAMPTIMESTAMP_NTZThe 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.