Commit Graph

6 Commits

Author SHA1 Message Date
8699979bd2 Markets: LBank is Prime's market, so AP3X takes its price
CEO correction: LBank lists the NATIVE Prime token, not a bridged form.
The page treated it as a chainless "CEX" row and told the reader there
was "no market on Prime itself" — both wrong.

- The LBank row now carries the Prime chain and its AP3X mark, with
  "native AP3X · order book" underneath, so it reads as what it is: the
  place the Prime token trades.
- The AP3X row in "One asset, four chains" takes the LBank price instead
  of showing a dash beside a CoinGecko reference, and says the native
  token trades there, when it last filled, and that every DEX pair on
  the page quotes a bridged form.

With LBank's feed down the Prime price falls back to a dash rather than
borrowing a wrapper's quote, and the row is chipped "feed down".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UPpFgu6wXiDfJv8ghoUwBJ
2026-09-09 20:39:07 +00:00
2bc479a200 Markets: 24h volume per pool
CEO ask: the venue table should carry 24h volume alongside price and TVL.

Added a VOL 24H column, filled from the only sources that publish it
per pool through a browser-callable API:

- Base pools DexScreener indexes: its volume.h24 (now four pools - it
  has started indexing the Uniswap v4 bAP3X/AERO pair, which the table
  picks up automatically)
- LBank: 24h turnover from the ticker

Where nobody publishes it the cell reads "no feed", never a zero or a
bare dash, and a note under the table names exactly which venues those
are and why: Cardano DEXs (Minswap, VyFi) and the two Uniswap V3 pools
DexScreener does not index expose reserves but no volume, and reading it
from swap history needs a paid archive node. Checked first: DexHunter
has no volume route, the Minswap aggregator has none, and both keyless
Base RPCs refuse a 24h eth_getLogs range (publicnode wants an archive
token, drpc caps anonymous queries at 10 blocks).

The VOLUME 24H headline is now the sum of exactly the per-pool figures
the table shows, labelled with how many venues reported, so the KPI and
the column can never disagree. It falls back to CoinGecko only when no
venue reports at all.

The phone keeps all four columns without clipping: tighter numeric
padding, a narrower venue cell and a smaller link column. The render
harness now fails a build whose table overflows its card.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UPpFgu6wXiDfJv8ghoUwBJ
2026-09-09 20:36:51 +00:00
b6d5920f54 Markets: every AP3X venue, live, with the proper marks
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
2026-09-09 18:23:41 +00:00
Claude
517d9a020a Drop the dead testnet Koios fallback
koios.vector.testnet.apexfusion.org was retired and answers 503, so the
"try mainnet, then testnet" resolver had nothing to fall back to. After
the mainnet fix both constants pointed at the same host, which meant a
transient failure on the first probe could succeed on the second and
label a mainnet base as "testnet" in the UI.

Mainnet or nothing. One base, one label.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UPpFgu6wXiDfJv8ghoUwBJ
2026-09-09 16:25:16 +00:00
Claude
fbebe5acd4 Fix Vector block feed: query mainnet Koios, not the retired testnet host
The market-grid panels hardcoded koios.vector.testnet.apexfusion.org for
tip/blocks/totals. That host now answers 503, so 'Vector recent blocks'
rendered 'Block feed unavailable'. The mainnet host is live (verified:
200, epoch 378, block 7,995,065) and the site already names it as
KOIOS_MAINNET for its own resolver - the panels just never used it.
Source label corrected to match the host queried.

Also: Prime /tokens is NOT broken. It returns HTTP 200 with an empty
list - no native tokens are minted on Prime yet - so reporting it as
'Token feed unavailable' called a healthy API an outage. Now reads
'No tokens minted on Prime yet.'

Caveat kept honest: the panel still cannot distinguish empty data from a
failed fetch, so if that endpoint ever does break it will show the same
line.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UPpFgu6wXiDfJv8ghoUwBJ
2026-09-09 15:44:37 +00:00
Claude
220ef728be AP3X Fusion ecosystem hub — initial site
Single self-contained index.html (React + assets bundled). Served as a
static site at apex-fusion.odyssey-works.io.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UPpFgu6wXiDfJv8ghoUwBJ
2026-09-09 01:16:47 +00:00