Skip to content

Rates Engine v0.5.0-rc.16

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 06 May 22:05
· 1517 commits to main since this release
5d6c46d

[v0.5.0-rc.16] — 2026-05-06

Fixed

  • /v1/coins/XLM now returns native XLM, not the scam token.
    Previously XLM matched whichever issued token's code happened
    to be "XLM" wins the disambiguation tiebreak (today: a token
    issued by GAE5PQNUIP5E…). Native XLM has no row in
    classic_assets by definition, so a special-case
    GetNativeCoinRow builds a synthetic row from the same
    xlm_usd* CTEs that drive triangulated pricing for every
    other asset. Slug "XLM" and "native" both route here.
    Explorer now pre-renders /assets/XLM unconditionally.
  • XLM (asset_id native) now returns a non-null price_usd,
    change_1h_pct, change_24h_pct, change_7d_pct, and
    price_history_24h on /v1/coins.
    Previously all five were
    null because the SQL CTEs filter on (base_asset, quote_asset) = ('native', 'fiat:USD') for direct USD and ('native', 'native') for XLM-relative — neither has rows in prices_1m.
    XLM is now special-cased to use the xlm_usd* CTEs (Circle
    USDC / Tether USDT proxy) directly. Other assets are
    unaffected; the existing direct-then-triangulate chain still
    takes precedence when those buckets exist.

Added

  • /v1/coins listing prepends native XLM on the first
    unfiltered page.
    Native is the most-active asset on the
    network but has no classic_assets row, so the listing
    silently omits it — meaning the explorer's home Top assets
    / Top movers panels never include XLM. The handler now fires
    GetNativeCoinRow alongside the listing query when
    (cursor, issuer, q) are all empty and limit ≥ 2, prepends
    the synthetic row, and trims the listing to limit-1 so the
    page size stays exactly limit. Cursor for page 2 is
    computed from the last listing row, never from native — so
    pagination resumes correctly past the synthetic injection.
  • Status page: real per-endpoint probes. The Endpoints
    matrix on status.ratesengine.net now fires a parallel probe
    against every public endpoint on each 30-second poll (with
    safe minimum parameters — ?asset=native, ?limit=1, etc.)
    and renders a green/amber/red badge with measured latency.
    Endpoints that need auth or are SSE streams keep a static
    "auth req'd" / "stream" tag. Replaces the previous
    single-/v1/healthz probe that left every other row stuck on
    "—".
  • /v1/coins/{slug}.markets_count — count of distinct
    (base_asset, quote_asset) pairs the asset participated in
    over the trailing 24h. Listing endpoint omits it (count-distinct
    per row would dominate the query cost for 100 rows). Asset
    detail page renders it as a fourth stat in the price card.
  • /v1/coins[*].change_1h_pct + change_7d_pct — trailing
    1-hour and 7-day price change windows alongside the existing
    change_24h_pct. Same direct-or-XLM-triangulated formula;
    null when no current price or no past-bucket snapshot exists
    in prices_1m within the window-specific tolerance (±5min for
    1h, ±30min for 24h, ±2h for 7d). Asset-detail page renders all
    three side-by-side as colour-coded pills.

Changed

  • internal/storage/timescale.scanCoinRow extracted as the shared
    row-projection between ListCoinsExt and GetCoinBySlug. Same
    external behaviour; reduces duplication as the wire shape grows.