Rates Engine v0.5.0-rc.16
Pre-release
Pre-release
·
1517 commits
to main
since this release
[v0.5.0-rc.16] — 2026-05-06
Fixed
/v1/coins/XLMnow returns native XLM, not the scam token.
PreviouslyXLMmatched whichever issued token's code happened
to be "XLM" wins the disambiguation tiebreak (today: a token
issued byGAE5PQNUIP5E…). Native XLM has no row in
classic_assetsby definition, so a special-case
GetNativeCoinRowbuilds 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/XLMunconditionally.- XLM (asset_id
native) now returns a non-nullprice_usd,
change_1h_pct,change_24h_pct,change_7d_pct, and
price_history_24hon/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 inprices_1m.
XLM is now special-cased to use thexlm_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/coinslisting prepends native XLM on the first
unfiltered page. Native is the most-active asset on the
network but has noclassic_assetsrow, so the listing
silently omits it — meaning the explorer's home Top assets
/ Top movers panels never include XLM. The handler now fires
GetNativeCoinRowalongside the listing query when
(cursor, issuer, q)are all empty andlimit ≥ 2, prepends
the synthetic row, and trims the listing tolimit-1so the
page size stays exactlylimit. 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/healthzprobe 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
inprices_1mwithin 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.scanCoinRowextracted as the shared
row-projection betweenListCoinsExtandGetCoinBySlug. Same
external behaviour; reduces duplication as the wire shape grows.