The Markets section listed three Base pairs from DexScreener and an
empty "Prime tokens" box. It now shows every venue where AP3X trades:
- Base: Aerodrome USDC (the reference price), QuickSwap cbBTC, the two
Uniswap V3 pools DexScreener does not index and the Aerodrome cbADA
pool it lists without a price - the last three read straight from
the chain in one batched eth_call (publicnode, CORS-open; the
out-of-range WETH pool is flagged and earns no TVL credit)
- Cardano: VyFi ADA/cstAP3X, ADA/cAP3X, cAP3X/cstAP3X from Koios
address_info (reserves summed across UTxOs), Minswap V2 cAP3X/ADA and
NIGHT/cAP3X from the pool datum found by the LP asset name, priced by
the Minswap aggregator; DexHunter stands in when Koios is down
- LBank AP3X/USDT through the site-origin proxy, shown as what it is:
no trades in days, spread, dead volume
- USDC.e on Nexus gets its own card (ApexScan: supply, holders, largest
holder, all-time transfers, Stargate bridge link) in place of the
Prime tokens box, which had nothing to list
- "One asset, four chains": AP3X, bAP3X, cAP3X, cstAP3X with the
cstAP3X redemption rate computed live (vault / issued) so the
receipt's premium is explained, not mispriced
- marks are the HAL 8 wallet's own PNGs plus each venue's mark, token
image with a chain badge, embedded so the page stays one file
- feeds have deadlines, per-panel parsers, an error boundary, tiered
refresh (quota'd feeds every 9 min, fast ones every 90 s), hidden-tab
pause, a refresh cooldown, and honest fallbacks (ADA/USD from Minswap
when CoinGecko is down, cAP3X/USD from reserves when the aggregator
429s, placeholders when DexScreener is down)
- chain pulse now says mainnet; HeroLightning's ResizeObserver no longer
throws after unmount; stake-pool saturation reads OSAM's field
Koios and LBank are reached via /api/koios/* and /api/lbank/* on this
origin (Caddy reverse proxies in the HAL 8 repo, PR #142) because
neither answers with a usable CORS header.
README documents the feeds; tools/bundle.py decodes and re-encodes the
bundled page byte-exactly so the next edit does not touch escaped text.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UPpFgu6wXiDfJv8ghoUwBJ