Sales are aggregated from five chain-event sources into a unified Postgres view. NBA Top Shot's centralized marketplace contributes the bulk of volume via TopShotMarketV3.MomentPurchased events. NFL All Day and LaLiga Golazos are populated from their respective Sold / MomentPurchased events. UFC Strike contributes pre-Aptos history. Disney Pinnacle direct sales come from on-chain Pinnacle.Trade events. Flowty's secondary marketplace is indexed from the NFTStorefrontV2 fork at 0x3cdbb3d569211ff3 (a separate deployment from Dapper's NFTStorefrontV2 at 0x4eb8a10cb9f87357). All five feed the canonical analytics_sales_* RPC family — analytics_sales_summary, analytics_sales_timeseries, analytics_sales_leaderboard, and analytics_sales_top_moves — so every dashboard reading agrees on a single source of truth.
Coverage runs from Dec 14 2025 onward (~94K sales as of late April 2026). Earlier history sits in pre-spork blocks and would require the V2 spork-proxy backfill to capture. The Sales section is a sibling of /analytics/loans — they query disjoint tables but share the same window helper, retry helper, and FilterBar component.
Buyer/seller anonymity caveat. Top Shot's centralized marketplace doesn't expose participant wallets — the ~49,141 L30 Top Shot marketplace sales all have NULL buyer_address. Aggregate volume and sale counts are honest (we do see the price + moment), but the leaderboards reflect Flowty + Pinnacle direct activity only, since those are the marketplaces that emit on-chain participant identities. The dashboard surfaces an info banner directly under the KPI strip explaining this so readers don't misread the leaderboard rankings as universal.
Marketplace breakdown semantics. The marketplace column takes three canonical values: "topshot" (centralized Top Shot marketplace, biggest by volume), "flowty" (Flowty's NFTStorefrontV2 fork — secondary marketplace covering Top Shot, AllDay, Golazos), and "on-chain" (or "pinnacle", merged in the dashboard) for direct Pinnacle.Trade sales. The marketplace mix component renders these as a stacked bar with dollar volume per slice in the legend.
Collection slug normalization. Sales tables historically used various collection identifiers — nba_top_shot, nfl_all_day, etc. — that don't match the loans table convention. The unified view normalizes them at materialization time: nba_top_shot → topshot, nfl_all_day → allday, laliga_golazos → golazos, ufc_strike → ufc, disney_pinnacle → pinnacle. After this normalization the same FilterBar collection chips work for both Loans and Sales without any per-section wiring.
Platform contract exclusion. The analytics_sales_leaderboard RPC always filters out platform contract addresses — Flowty escrow, Dapper merchant, Pinnacle.Trade contracts, and lending escrows — because those addresses are aggregators, not retail traders, and would always rank #1 by total flow if included. The exclusion list is hardcoded inside the RPC and not exposed via query string (the route hardcodes p_include_contracts=false). If you need contract-inclusive rankings, query the RPC directly.
The probe edge function flowty-spork-probe (deployed for V2 development) is no longer needed once spork-proxy.tdillonbond.workers.dev returns real Flow data. It can be deleted after V2 ships.