XChain Platform v0.15.1
XChain Platform v0.15.1, a patch train on top of v0.15.0.
Two components move. The other ten keep the tags they shipped under in v0.15.0, which is what release-manifest.json pins and what a pinned install resolves.
| Component | Version |
|---|---|
| xchain-node | 0.15.1 |
| xchain-explorer | 0.15.1 |
| xchain-sdk | 0.15.1 |
| xchain-hub | 0.15.0 |
| xchain-indexer | 0.15.0 |
| xchain-decoder | 0.15.0 |
| xchain-encoder | 0.15.0 |
| xchain-sync | 0.15.0 |
| xchain-utxo-tracker | 0.15.0 |
| xchain-vm | 0.15.0 |
| xchain-contracts | 0.15.0 |
| xchain-e2e-test | 0.15.0 |
| xchain-regtest-miner | 0.15.0 |
The explorer keeps serving when a chain's indexer falls behind
An explorer whose indexed tip had aged past its freshness threshold refused every data route for that chain with 503 COIN_DATA_STALE, dropped the chain from /status available, and answered an error frame on the WebSocket replay and snapshot paths. The intent was to avoid presenting stale state as current. The effect was that an indexer running behind a healthy chain made the whole network look down: every page went blank, every wallet driven through the SDK lost the chain, and years of correct history sat unreadable in a database that was working fine.
A chain that is behind is now served, and said to be behind:
- every
/{COIN}/api/*and/{COIN}/explorer/*response carriesXChain-Freshness: live|stale,XChain-Tip-BlockandXChain-Tip-Age-S, and a stale one adds afreshnessobject to the JSON body; /{COIN}/api/statuskeeps the chain listed inavailableand reports the verdict instale, besidelast_block,tip_age_seconds,indexer_stateandreplica_halted;- the WebSocket WELCOME, CATCH_UP, SNAPSHOT and live frames carry
stale: true; - the pages render their tables as usual under a banner naming the last confirmed block, how old it is, and why indexing is behind: catching up, waiting on a block dated ahead of the server's clock, or paused for repair.
Operators who would rather go dark than serve a tip they cannot vouch for can set EXPLORER_STALE_FAIL_CLOSED=1, which restores the previous behaviour exactly.
The SDK reads the marker
sdk.freshness() returns the last marker seen. sdk.assertFresh() probes /status when nothing marked has arrived yet and throws COIN_DATA_STALE on a stale tip. submitAction({ strictFreshness: true }) refuses before anything is encoded or signed, for a caller whose parameters came from explorer reads. Reads themselves never refuse, so a wallet keeps working through an indexer stall and shows the delay instead of an outage.
Verifying this release
Each tarball is git archive of that component's signed tag. SHA256SUMS.asc is a detached signature over SHA256SUMS by the platform release key 4361611A82F90B70. See Release Signing.