listMarkets returns protocol-only MarketSummary[] — no pictures, no description. Load images with market.metadata().
listMarkets falls back to RPC and returns { source: "rpc", usedFallback: true }. Do not treat an empty catalog as “indexer down”.