Stellar Index v0.34.0
[v0.34.0] — 2026-08-16
Tested against Stellar protocol v23.
Ships two audit campaigns: the audit-2026-08-14 internal remediation (79
verified fixes) and the v1 launch-completion pass (asset-identity registry,
absent-vs-zero honesty, and correctness-backlog items). Applies migrations
0141–0143; 0143 hashes session tokens at rest and forces a one-time
dashboard re-login.
Security
- Account-history participant injection closed. A Soroban
InvokeContract
op's call arguments andSorobanAuthorizationEntryentries are attacker-
controllable at the XDR-decode layer, so they are no longer indexed as
account participants. Previously an attacker could inject an arbitrary
victim's address into that victim's permanent, public
/accounts/{g}/operationshistory under the attacker's own signature. - audit-2026-08-14 remediation — 79 verified fixes across money-correctness
(SDEX single-leg plausibility ceiling, oracle-execution corroboration for the
Band adapter, MEV-detector evidence-gating +mev_eventsretention),
auth/data-integrity (self-service key-mint scope hardening, session token
hashing at rest via migration 0143), and projector durability. Each landed
with a proven-red regression test. - Go toolchain 1.25.12 → 1.25.13. govulncheck reported 7 standard-library
vulnerabilities reachable from live call paths —net/http(GO-2026-5026,
Punycode label handling) via the ClickHouse reader, the CoinGecko supply
client, the history-archive checkpoint resolver and the galexie trim's S3
calls, andencoding/asn1via the WebAuthn passkey registration path. All
are fixed in go1.25.13. Every workflow readsgo-version-file: go.mod, so
thetoolchaindirective is the only pin to move. Verified clean locally:
"0 vulnerabilities".
Changed
- Asset identity: one alias registry. A binary-startup
AliasRegistry
built from[supply].sac_wrappersfolds an asset's SAC-wrapped form into a
single identity (SAC form ordered last), threaded through the price/volume
read paths. Fixes alias-blind volume/price reads across ~11 money endpoints
(asset detail, VWAP/TWAP/OHLC, pairs, markets, aggregate global tiers) that
previously split an asset's SAC and classic forms into two un-aliased
identities. Non-XLM folding activates per[supply].sac_wrappersconfig.
Fixed
- Absent-vs-zero honesty across the read surface.
/v1/statusincidents
now carry an explicitok|degraded|unknowntri-state (a failed alert query
no longer serialises as a false all-clear);/v1/txdistinguishes partial
event / op-result coverage;/v1/protocolsserves from an SWR cache instead
of a per-request unauthenticated scan; the explorer degraded-banner and
network-insight no longer read a failed query's zero as real data. - Incidents Atom feed
<updated>now reflects the most-recent entry's
timestamp (empty feed → a stable sentinel) instead of wall-clocknow(), so
a stale or empty feed is no longer syndicated as freshly updated every crawl. TestMigrationsRoundTripcould deadlock against TimescaleDB's own
job scheduler, turningmainred for 30 hours and firing the
ci-health tripwire every two hours. The test asserts compression
and CAGG-refresh policies are attached, then rolls every migration
back — somigrate down'sDROP ... AccessExclusiveLockraced the
16 background workers running those very policies, and the two could
form a lock cycle ("deadlock detected, Process 94 waits for
AccessExclusiveLock on relation 21724; blocked by process 161"). It
only reproduces under load, which is why it passes locally in 5s.
Retrying is not available as a fix: a failed migration leaves
golang-migrate's version DIRTY. The container now runs with
timescaledb.max_background_workers=0, removing the concurrent
actor entirely, and the test asserts the setting actually applied —
a Cmd override that silently failed to take would otherwise look
exactly like a fix. The assertions are unchanged in strength: they
check policies are ATTACHED (a metadata row), not that they run.