Releases
Every XChain Platform release is a train: one platform version that names an
exact, reproducible set of software across every component. The canonical notes
for each train live on its GitHub Release in xchain-node; this page mirrors
them so the history is readable in one place.
Each train tag is GPG-signed with the platform release key. See Release Signing to verify a download, and Release Process for how a train is cut.
v0.18.0
Released 2026-09-11. Release notes and artifacts
A minor train across thirteen components: every code component except xchain-contracts
moves to 0.18.0, xchain-documentation included. It lands the platform-train consensus
activation carrier on the fleet ahead of the first major train and carries the six
oracle and ledger rules that took their own per-network activation since v0.17.0.
| Component | Version |
|---|---|
| xchain-node | 0.18.0 |
| xchain-hub | 0.18.0 |
| xchain-indexer | 0.18.0 |
| xchain-sync | 0.18.0 |
| xchain-explorer | 0.18.0 |
| xchain-decoder | 0.18.0 |
| xchain-encoder | 0.18.0 |
| xchain-utxo-tracker | 0.18.0 |
| xchain-sdk | 0.18.0 |
| xchain-e2e-test | 0.18.0 |
| xchain-vm | 0.18.0 |
| xchain-contracts | 0.17.0 (unchanged) |
| xchain-regtest-miner | 0.18.0 |
TRAIN_ACTIVATION now exists in the canonical constants and is vendored byte-identical
into the indexer and the sync follower; the indexer evaluates it before every block and
halts with a durable marker when its signed manifest requires a rule set the build does
not carry, publishing the verdict on health as train_activation. This train adds no row
and no manifest block, so the fleet keeps resolving the 1.0.0 rule set. Six rules take
their own activation: amounts must denote the number the ledger credits
(AMOUNT_REPRESENTABILITY_ACTIVATION, unarmed off regtest); an on-chain PRICE is bounded
to the range the hub accepts (PRICE_ZERO_VALIDITY_ACTIVATION, testnet from the start
of October 2026 UTC on block time, mainnet unarmed); native-coin fee pricing gains a landed-batch bound
carried by a new batch_block_time on price snapshots (PRICE_FEE_BATCH_LANDED_ACTIVATION,
unarmed everywhere, hub half rolls first); a shapeless UTXO-tracker first-seen answer fails
the DISPENSER freshness check closed (DISPENSER_FRESHNESS_SHAPE_ACTIVATION, genesis off
mainnet); a retired STAKE v1 key may stake again once every row it held is cooled
(STAKE_KEY_REUSE_ACTIVATION, testnet BTC 156000, LTC 4897000, DOGE 67920000, sized
2026-09-11 at the tips plus 21 days; mainnet unarmed); and a SWEEP writes no zero-amount
leg for a tick it holds at zero (SWEEP_ZERO_LEG_ACTIVATION, the same testnet heights,
mainnet unarmed). Every testnet indexer must run this
release before October 2026 UTC begins and before the earliest stake-key height crosses. The
indexer halts at boot when the live validator_rewards key omits round_qualifier, and
that manual migration is now a deploy precondition. Markets against the native coin keep
their rows across reorgs in the indexer, the explorer and the sync follower. Every service
image stops baking a .env file into the build.
v0.17.0
Released 2026-09-10. Release notes and artifacts
A minor train, and a full one: every component moves to 0.17.0, xchain-documentation
included. It was cut to roll the testnet validator hubs, so the attestation and oracle
work is the substance of it.
| Component | Version |
|---|---|
| xchain-node | 0.17.0 |
| xchain-hub | 0.17.0 |
| xchain-indexer | 0.17.0 |
| xchain-sync | 0.17.0 |
| xchain-explorer | 0.17.0 |
| xchain-decoder | 0.17.0 |
| xchain-encoder | 0.17.0 |
| xchain-utxo-tracker | 0.17.0 |
| xchain-sdk | 0.17.0 |
| xchain-e2e-test | 0.17.0 |
| xchain-vm | 0.17.0 |
| xchain-contracts | 0.17.0 |
| xchain-regtest-miner | 0.17.0 |
A judge_model attestation round could not finalize on the live testnet fleet, for three
reasons that are all fixed here: leader rotation froze on a slot that never proposes and
now steps over one it has proven silent, gated on the request’s own block index (testnet
BTC 152400, mainnet unratified, regtest genesis); a leader stamped the round’s
effective_time at proposal and now stamps it when the winner is established; and the
batch publisher retries a head wire the encoder refused before it was sent. The oracle
clamp reference becomes a function of the round being judged rather than of each hub’s own
timer, which changes what a hub clamps to and asks for a single-pass hub roll rather than
a rolling one. Contract identity becomes a consensus-required export: a contract declares
meta.name and meta.description, the indexer stores and full-text indexes it, and the
explorer shows and searches it. It is required at mainnet genesis and arms on testnet at
2026-09-13 00:00:00Z, so every testnet indexer must run this release before that
instant. The VM size-meters destructuring rest patterns and refuses the four
unmeterable rest positions under a new banned-rest rule, moving the VM consensus
epoch to 4, armed at genesis off mainnet and on 2027-01-01 on mainnet. Twenty-six mainnet
activation maps and six mainnet time constants are armed at genesis under the 2026-09-09
identity ruling, proven by a from-genesis replay witness that reproduced byte-identical
state on Bitcoin and Dogecoin mainnet. The archive invalid-height key repair arms on
testnet at BTC 155000, LTC 4896000 and DOGE 67915000, and xchain-sync must be live
before the indexer half.
v0.16.3
Released 2026-09-09. Release notes and artifacts
A patch train. xchain-node and xchain-hub move to 0.16.3. xchain-indexer
keeps the 0.16.1 it shipped under in v0.16.1, and everything else keeps the tag
it shipped under in v0.16.0 (or v0.15.0 for xchain-vm, xchain-contracts and
xchain-regtest-miner). xchain-documentation is tagged v0.16.3 with the train.
| Component | Version |
|---|---|
| xchain-node | 0.16.3 |
| xchain-hub | 0.16.3 |
| xchain-indexer | 0.16.1 |
| xchain-sync | 0.16.0 |
| xchain-explorer | 0.16.0 |
| xchain-decoder | 0.16.0 |
| xchain-encoder | 0.16.0 |
| xchain-utxo-tracker | 0.16.0 |
| xchain-sdk | 0.16.0 |
| xchain-e2e-test | 0.16.0 |
| xchain-vm | 0.15.0 |
| xchain-contracts | 0.15.0 |
| xchain-regtest-miner | 0.15.0 |
Two state-neutral hub fixes to the oracle, and one log-level change. Every
silent oracle round exit (a scheduler round-number gap across a clock step, a
restart between submission and finalization, a bare seat return past the
gates) now leaves a structured round_lost record and a skipped row, so a
round with no snapshot row is explained instead of vanishing. A PRICE catch-up
sweep wire may spend the change of a wire the same publish pass already
broadcast, bounded by the new
ORACLE_PUBLISH_SELF_CHAIN_MAX_DEPTH
setting (default 4), the encoder UTXO cap and readable confirmation depth, so a
publisher with a buffered backlog no longer fails on dust once its confirmed
outputs are spent. The pushed-tip line past MAX_TIP_AGE_S logs at info and
names the Bitcoin block gap. No activation height moves and no derived state
changes.
v0.16.2
Released 2026-09-09. Release notes and artifacts
A patch train. xchain-node and xchain-hub move to 0.16.2. xchain-indexer
keeps the 0.16.1 it shipped under in the previous train, and everything else
keeps the tag it shipped under in v0.16.0 (or v0.15.0 for xchain-vm,
xchain-contracts and xchain-regtest-miner). xchain-documentation is tagged
v0.16.2 with the train.
| Component | Version |
|---|---|
| xchain-node | 0.16.2 |
| xchain-hub | 0.16.2 |
| xchain-indexer | 0.16.1 |
| xchain-sync | 0.16.0 |
| xchain-explorer | 0.16.0 |
| xchain-decoder | 0.16.0 |
| xchain-encoder | 0.16.0 |
| xchain-utxo-tracker | 0.16.0 |
| xchain-sdk | 0.16.0 |
| xchain-e2e-test | 0.16.0 |
| xchain-vm | 0.15.0 |
| xchain-contracts | 0.15.0 |
| xchain-regtest-miner | 0.15.0 |
State-neutral hub fix: the hub image installs the llm attestation provider’s
CLI. A validator configured for the spawn transport, which is what a hub with a
provider config directory resolves to, could not run the binary at all on
v0.16.0, so every llm attestation request it was drawn for answered
provider_error and the round expired with no response. An operator running llm
attestations needs this release on every validator that serves them; nothing
else changes, no activation height moves, and a validator that serves no llm
provider is unaffected.
v0.16.1
Released 2026-09-09. Release notes and artifacts
A patch train. xchain-node and xchain-indexer move to 0.16.1; every other
component keeps the tag it shipped under in v0.16.0 (or v0.15.0 for xchain-vm,
xchain-contracts and xchain-regtest-miner). xchain-documentation is tagged
v0.16.1 with the train.
| Component | Version |
|---|---|
| xchain-node | 0.16.1 |
| xchain-hub | 0.16.0 |
| xchain-indexer | 0.16.1 |
| xchain-sync | 0.16.0 |
| xchain-explorer | 0.16.0 |
| xchain-decoder | 0.16.0 |
| xchain-encoder | 0.16.0 |
| xchain-utxo-tracker | 0.16.0 |
| xchain-sdk | 0.16.0 |
| xchain-e2e-test | 0.16.0 |
| xchain-vm | 0.15.0 |
| xchain-contracts | 0.15.0 |
| xchain-regtest-miner | 0.15.0 |
State-neutral indexer fix: the anchor row writer now binds every value to fit its column, so a rejected ANCHOR wire (a pre-activation legacy version or a malformed head) is recorded instead of failing its INSERT forever. On v0.16.0 a node syncing DOGE testnet from genesis stopped at the first legacy anchor (height 67856088); on v0.16.1 the same replay reaches the tip with a block hash chain identical to the long-running nodes. No activation height moves and no derived state changes, so the update needs no coordination window.
v0.16.0
Released 2026-09-08. Release notes and artifacts
A minor train. xchain-node, xchain-hub, xchain-indexer, xchain-sync,
xchain-explorer, xchain-decoder, xchain-encoder, xchain-utxo-tracker,
xchain-sdk and xchain-e2e-test move to 0.16.0; xchain-vm, xchain-contracts
and xchain-regtest-miner keep the tags they shipped under in v0.15.0.
xchain-documentation is tagged v0.16.0 with the train.
| Component | Version |
|---|---|
| xchain-node | 0.16.0 |
| xchain-hub | 0.16.0 |
| xchain-indexer | 0.16.0 |
| xchain-sync | 0.16.0 |
| xchain-explorer | 0.16.0 |
| xchain-decoder | 0.16.0 |
| xchain-encoder | 0.16.0 |
| xchain-utxo-tracker | 0.16.0 |
| xchain-sdk | 0.16.0 |
| xchain-e2e-test | 0.16.0 |
| xchain-vm | 0.15.0 |
| xchain-contracts | 0.15.0 |
| xchain-regtest-miner | 0.15.0 |
Two consensus rails arm on Bitcoin testnet by height, both ahead of the chain at cut time: zero-confirmation ATTEST service from block 151800 (a hub serves a request in the block it is mined in, with a headroom slot in the responsible set, applier fall-through and a signer-based fee split) and ROLLCALL v1 consensus gates from block 152208 (a roll call carries the gates its build knows, and attestation work is routed only to validators on current rules). Mainnet is unratified and unchanged. Every testnet indexer must run this release before 151800 and every hub before the first epoch close at or above 152208; indexers roll before hubs, inside one epoch.
The node CLI moves itself and every installed service to the latest release
with one command (xchain-node update), the decoder and utxo-tracker wait on
a coin node still in initial block download instead of reading it as a reorg,
bootstrap archives carry their end height, rate limiters log what they refuse,
and the SDK honours Retry-After on a 429. The sync follower’s schema version
is 9.
v0.15.5
Released 2026-09-08. Release notes and artifacts
A patch train. xchain-node and xchain-indexer move to 0.15.5; xchain-encoder
stays at 0.15.4, xchain-sync, xchain-sdk and xchain-explorer at 0.15.3,
xchain-hub at 0.15.2, and the other six components keep the tags they shipped
under in v0.15.0.
| Component | Version |
|---|---|
| xchain-node | 0.15.5 |
| xchain-indexer | 0.15.5 |
| xchain-encoder | 0.15.4 |
| xchain-sync | 0.15.3 |
| xchain-sdk | 0.15.3 |
| xchain-explorer | 0.15.3 |
| xchain-hub | 0.15.2 |
| xchain-decoder | 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 testnet activation of order-independent chunked DEPLOY assembly, shipped in v0.15.3 for 2026-09-10T00:00:00Z, moves earlier to 2026-09-08T12:00:00Z. Every testnet indexer was already running v0.15.3, and a fresh indexer parsing the Bitcoin testnet chain from its genesis under that release reproduced the running network block for block, so the two-day buffer the original date left for operators to update was not needed. Testnet indexer operators must run v0.15.5 before that instant; a node still on v0.15.3 would activate the rule at the old instant and diverge from the network in between. Mainnet and regtest are unchanged. No other component moves.
v0.15.4
Released 2026-09-08. Release notes and artifacts
A patch train. xchain-node and xchain-encoder move to 0.15.4; xchain-indexer,
xchain-sync, xchain-sdk and xchain-explorer stay at 0.15.3, xchain-hub at
0.15.2, and the other six components keep the tags they shipped under in v0.15.0.
| Component | Version |
|---|---|
| xchain-node | 0.15.4 |
| xchain-encoder | 0.15.4 |
| xchain-indexer | 0.15.3 |
| xchain-sync | 0.15.3 |
| xchain-sdk | 0.15.3 |
| xchain-explorer | 0.15.3 |
| xchain-hub | 0.15.2 |
| xchain-decoder | 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 |
Dogecoin relays an output below its 0.01 DOGE soft dust limit only when the
whole limit is added to the transaction fee, once per such output. The encoder
sized the funding legs of a two-transaction P2SH action off the 0.001 DOGE hard
limit, so at a low fee estimate every leg fell into that band: the funding
transaction owed far more relay fee than it paid, peers refused to relay it, and
the reveal that spends the legs, including every PRICE and ATTEST wire a
validator publishes on Dogecoin, waited unconfirmed behind it. Every output the
encoder authors on Dogecoin now floors at the soft limit, the fee floor and the
fee caps keep the consensus dust threshold, a caller may raise the floor but not
lower it, and the documented DUST_AMOUNT setting is honoured as an operator
floor. Dogecoin operators should update their encoder; other chains are
unaffected.
v0.15.3
Released 2026-09-08. Release notes and artifacts
A patch train. xchain-node, xchain-indexer, xchain-sync, xchain-sdk and
xchain-explorer move to 0.15.3; xchain-hub stays at 0.15.2 and the other seven
components keep the tags they shipped under in v0.15.0.
| Component | Version |
|---|---|
| xchain-node | 0.15.3 |
| xchain-indexer | 0.15.3 |
| xchain-sync | 0.15.3 |
| xchain-sdk | 0.15.3 |
| xchain-explorer | 0.15.3 |
| xchain-hub | 0.15.2 |
| xchain-decoder | 0.15.0 |
| xchain-encoder | 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 |
A contract whose source does not fit one transaction is deployed as chunk carriers plus an assembling DEPLOY, and the indexer assembled it only at the assembler’s position from carriers already confirmed below it, so a group whose pieces confirmed out of order, including a correctly sequenced one that a reorg re-packed, failed permanently and burned its fee. A chunk group now deploys exactly once, in the block where its last piece confirms, whatever order the pieces arrived in: an assembling DEPLOY that lands early is held pending with its base fee paid, and the contract takes the index and address of the piece that completed it. The explorer’s DEPLOY detail reports which action deployed the contract and whether the assembly is still pending, the SDK’s deploy workflow resolves the contract through that field, and the sync follower’s schema version moves with the two new execution columns. The rule is active from genesis on mainnet and regtest, and on testnet from 2026-09-10 00:00 UTC; every testnet indexer must run this release before that instant.
A hub deciding whether it still owed the chain a price batch could only guess, so windows the chain already carried were re-proposed every hour. The indexer now answers which oracle rounds in a range already ride a valid PRICE batch, so a hub can skip re-publishing them.
v0.15.2
Released 2026-09-07. Release notes and artifacts
A patch train. xchain-node, xchain-hub, xchain-explorer and xchain-sync move to
0.15.2; xchain-sdk stays at 0.15.1 and the other eight components keep the tags
they shipped under in v0.15.0.
| Component | Version |
|---|---|
| xchain-node | 0.15.2 |
| xchain-hub | 0.15.2 |
| xchain-explorer | 0.15.2 |
| xchain-sync | 0.15.2 |
| xchain-sdk | 0.15.1 |
| xchain-indexer | 0.15.0 |
| xchain-decoder | 0.15.0 |
| xchain-encoder | 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 hub that publishes each hour of finalized attestation responses as one signed batch on Dogecoin sized its signer set at a BTC height it read only from the chain-tip row a Bitcoin indexer pushes to it, so a validator with no indexer pushing to it deferred every window and refused every co-signature, and a federation sharing one Bitcoin indexer could never reach the batch quorum. The batch publisher now anchors on the pushed chain tip where one exists and on the tip the attestation round already observes on every request poll otherwise; a follower bounds a proposed anchor against whichever it holds, and the hub reports which source its last anchor came from.
The explorer custom-content frame on a token page reported a height that could
never be below its own viewport and the page applied it plus a margin, so the
two echoed each other for as long as the page stayed open. The report is now
applied exactly, an echo is ignored, the frame has a ceiling and a per-load
resize cap, and media-src is declared so external video and audio load.
A sync replica asked the origin only for lookup rows above the highest id it already held, so a row missing below that mark was never fetched again, and the completeness sweep raw-counted an append-only log whose ids both sides assign independently. A lookup table the sweep finds short is now re-paged from zero, and the log is left out of the comparison while every index table stays strict.
v0.15.1
Released 2026-09-07. Release notes and artifacts
A patch train. xchain-node, xchain-explorer and xchain-sdk move to 0.15.1;
the other ten components keep the tags they shipped under in v0.15.0.
| 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 |
An explorer whose indexed tip had aged past its freshness threshold refused every data route for that chain, dropped the chain from the status endpoint’s available set, and answered an error frame on the WebSocket replay and snapshot paths. An indexer running behind a healthy chain therefore made the whole network look down: pages went blank and wallets lost the chain, while the history sat readable in a database that was working.
A chain that is behind is now served and said to be behind. Every data response
carries freshness headers, and a stale one carries a freshness object in its
body; the status endpoint keeps the chain listed and reports the verdict beside
the last indexed block, its age and why indexing trails; the WebSocket frames
carry a stale marker; and the pages render their tables under a banner naming
the last confirmed block, how old it is, and whether indexing is catching up,
waiting on a block dated ahead of the server’s clock, or paused for repair.
EXPLORER_STALE_FAIL_CLOSED=1 restores the previous refusal for an operator who
prefers it.
The SDK reads the same marker: sdk.freshness() reports it, sdk.assertFresh()
raises on a stale tip, and submitAction({ strictFreshness: true }) refuses
before anything is signed. Reads never refuse, so a wallet keeps working through
an indexer stall and shows the delay instead of an outage.
v0.15.0
Released 2026-09-07. Release notes and artifacts
A full train: every one of the thirteen components moves to 0.15.0, the first time since v0.12.0 that the whole set has moved together. The train carries two new consensus mechanisms, both armed on Bitcoin testnet: ATTEST responses delivered over the hub mirror, and ROLLCALL, a validator liveness action published on Dogecoin. Both are armed on Bitcoin testnet at heights the chain has already passed, so both are live there as soon as a node updates, and both remain unratified on mainnet.
| Component | Version |
|---|---|
| xchain-node | 0.15.0 |
| xchain-hub | 0.15.0 |
| xchain-indexer | 0.15.0 |
| xchain-explorer | 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-sdk | 0.15.0 |
| xchain-contracts | 0.15.0 |
| xchain-e2e-test | 0.15.0 |
| xchain-regtest-miner | 0.15.0 |
An ATTEST response used to be a Bitcoin transaction each responding validator
paid for. On this train a response is written to a hub mirror table, gossiped to
every hub, verified before it is stored, and applied by the indexer at the block
its signed effective time predicts, with a per-block cap. Each hour the
finalized responses are published as one signed ATTEST batch on Dogecoin, and
the indexer reassembles chunked batches per author. The response body is capped
before anyone signs it, the effective time is inside the signed canonical, and
getattestationresponsibleset answers which validators a request drew. A
federated hub sizes quorum from the federation rather than from its own
validator set.
ROLLCALL lets the network measure validator liveness on chain: validators answer a per-epoch roll call on Dogecoin, and a validator absent from enough consecutive rolled epochs is deactivated, with no governance action and no penalty: its stake refunds after the ordinary cooldown and it may re-enter. The wire format, canonical bytes and consensus constants are documented on this site.
Elsewhere on the train: a reorg no longer aborts on the roll-call tables; a
mirror hold that outlasts its ceiling forces a resync and is reported on the
indexer health endpoint; a hub rate-limit reply holds the push queue instead of
burning attempts; a price window that closed while the hub was down is
published on restart; SWEEP and CALLBACK are priced on the unified fee
schedule; the SDK completes the XCALL surface and hardens its MuSig2 session
guards, and its MCP tool surface ships as a second package on the same version;
the explorer sizes its serving limits to the measured wallet profile; the
rollback path in the sync layer restores contract stake correctly and scopes an
orphaned archive chunk to its own publisher; the VM moves to a prebuilt
isolated-vm so an install no longer needs a compiler; and the node CLI stops a
chain daemon gracefully on update, forces a bootstrap republish after a
reindex, and no longer mints a fresh hub API key on a repeated
validator init.
This train changes state derived from existing bytes on testnet. The response mirror and ROLLCALL are armed on Bitcoin testnet, at blocks 151324 and 151200, both of which the chain has already passed, so each is live as soon as a node updates. Mainnet is unratified for both, and its behaviour is byte for byte unchanged. On testnet, a node on this train and one still on v0.14.0 will judge a mirrored response differently once one lands, so update every hub and the indexers that follow it together rather than one at a time.
v0.14.0
Released 2026-09-02. Release notes and artifacts
A consensus train. xchain-node, xchain-hub and xchain-indexer move to
0.14.0; the other ten components keep the tags they already carry. There is no
v0.13.0: that number was skipped deliberately, and nothing in the platform
resolves a train by counting upward, so a gap in the sequence is not a missing
release.
| Component | Version |
|---|---|
| xchain-node | 0.14.0 |
| xchain-hub | 0.14.0 |
| xchain-indexer | 0.14.0 |
| xchain-explorer | 0.12.0 |
| xchain-decoder | 0.12.0 |
| xchain-encoder | 0.12.0 |
| xchain-sync | 0.12.0 |
| xchain-utxo-tracker | 0.12.0 |
| xchain-vm | 0.12.0 |
| xchain-sdk | 0.12.0 |
| xchain-contracts | 0.12.0 |
| xchain-e2e-test | 0.12.0 |
| xchain-regtest-miner | 0.12.0 |
An attestation request drew its responsible set from on-chain stake alone, with nothing in the calculation about whether a validator was answering. A validator that was staked and served nothing kept its slot forever, and a set holding one such member could never gather the signatures finalization needs. Every attestation request on Bitcoin testnet was expiring with zero responses. A stalled request now widens its responsible set as its own window elapses, the hub signs from the widened set and the indexer accepts from it, and the fee split for a fulfilled request follows the same set. The widening ladder is fixed by consensus rather than configured per hub, because it decides who is allowed to sign.
Alongside it: validators gossip a digest of the consensus rules they are
applying on the heartbeat and warn when a peer, or the node itself, is on
different flag-day heights, and the indexer publishes the same digest on its
health endpoint so it can be compared against the federation it follows.
install <ref> xchain-hub no longer fails with HTTP 401 on a host the runbook
provisioned, because the CLI now sends the hub API key that validator init
generated. The checkpoint config block ships hub_url beside self_sync, so a
fresh install resolves its checkpoint peer and every installed coin gets a
checkpoint block. xchain-node rollback prints the recovery path and exits
instead of hanging in its precheck.
This train changes state derived from existing bytes. Responsible-set widening activates on Bitcoin testnet at block 150780, and from genesis on regtest. Mainnet has not ratified it and the rule is inert there. Below the height, and on an unratified network, behaviour is byte for byte unchanged, but once a widened response lands, an indexer or hub on the old rules judges it differently: update every indexer and hub.
v0.12.3
Released 2026-09-01. Release notes and artifacts
A patch train for the validator onboarding path. xchain-node goes to 0.12.3
and xchain-hub to 0.12.3; every other component keeps the tag it already
carries.
| Component | Version |
|---|---|
| xchain-node | 0.12.3 |
| xchain-hub | 0.12.3 |
| xchain-indexer | 0.12.1 |
| xchain-explorer | 0.12.0 |
| xchain-decoder | 0.12.0 |
| xchain-encoder | 0.12.0 |
| xchain-sync | 0.12.0 |
| xchain-utxo-tracker | 0.12.0 |
| xchain-vm | 0.12.0 |
| xchain-sdk | 0.12.0 |
| xchain-contracts | 0.12.0 |
| xchain-e2e-test | 0.12.0 |
| xchain-regtest-miner | 0.12.0 |
Both fixes address the same window: the time between broadcasting a STAKE and that stake activating, which is when a new validator is most likely to conclude something is broken.
A hub rejected a peer that was not in the effective signer set by reporting an invalid signature, because the membership check shared its return path with the signature check. An operator whose stake had not activated yet was told their signature was bad, which sends them hunting a key problem that does not exist. A membership miss now says so, and a hub running in validator mode reports whether its own key is in the set rather than leaving the only evidence in the logs of the peers dropping it.
validator unstake said the escrowed XCHAIN became spendable when the stake
left the active set. Leaving the set takes 6 blocks on Bitcoin; the coins are
released by the staking cooldown, 1000 blocks, about a week later. Both clocks
are now printed, by stake as well as unstake, and both are read per chain
from the coin registry rather than assumed to be Bitcoin.
v0.12.2
Released 2026-09-01. Release notes and artifacts
A patch train that moves the carrier alone. xchain-node goes to 0.12.2; every
other component keeps the tag it already carries.
| Component | Version |
|---|---|
| xchain-node | 0.12.2 |
| xchain-hub | 0.12.0 |
| xchain-indexer | 0.12.1 |
| xchain-explorer | 0.12.0 |
| xchain-decoder | 0.12.0 |
| xchain-encoder | 0.12.0 |
| xchain-sync | 0.12.0 |
| xchain-utxo-tracker | 0.12.0 |
| xchain-vm | 0.12.0 |
| xchain-sdk | 0.12.0 |
| xchain-contracts | 0.12.0 |
| xchain-e2e-test | 0.12.0 |
| xchain-regtest-miner | 0.12.0 |
It exists because v0.12.1 shipped without the validator commands this
documentation describes. Someone following the validator quickstart installed the
release, ran validator stake, and was told there was no such command. The
documentation was accurate; the release was missing the feature.
validator init, stake and unstake now generate the identity and both
funding wallets, then mint, stake and withdraw against the public network, so an
operator can join before installing any stack. Alongside them: an unrecognised
service name is refused with the list of valid ones rather than silently
expanding to every service on every coin and network; a coin image builds from a
context that holds its Dockerfile and no longer writes live credentials into the
tracked config template; and a mutating command waits out a busy lock instead of
losing the run.
Everything in this train is state-neutral. Nothing changes what state is derived from existing bytes, so it ships without an activation point.
v0.12.1
Released 2026-08-31. Release notes and artifacts
The platform’s first patch train, cut the same day as v0.12.0. It moves one
component, xchain-indexer; the other eleven stay at the v0.12.0 tags they
already carry. A component’s version is the platform version at which it last
changed, so a gap in the table below means that component did not change in this
release, not that it was skipped.
| Component | Version |
|---|---|
| xchain-node | 0.12.1 |
| xchain-hub | 0.12.0 |
| xchain-indexer | 0.12.1 |
| xchain-explorer | 0.12.0 |
| xchain-decoder | 0.12.0 |
| xchain-encoder | 0.12.0 |
| xchain-sync | 0.12.0 |
| xchain-utxo-tracker | 0.12.0 |
| xchain-vm | 0.12.0 |
| xchain-sdk | 0.12.0 |
| xchain-contracts | 0.12.0 |
| xchain-e2e-test | 0.12.0 |
| xchain-regtest-miner | 0.12.0 |
A reward whose anchor was attested before a version restart is now judged on the anchor bytes as written. Proof admission had dropped the legacy wire versions, so such a reward could never be proven: it read as an eternal unknown and the chain halted, correctly refusing to commit on absent evidence but with no way forward, because nothing re-admits those bytes once the fleet is uniform. Admission now carries the legacy versions and binds each to the reward family it was renumbered from.
This is also the replay fix. The v0.12.0 build cannot replay a chain carrying such a reward from genesis, because it halts at the first one before reaching the tip.
Forgeries on legacy bytes stay excluded: at or above the anchor activation height a legacy byte parses deterministically invalid, and every node drops it as evidence identically. The change ships ungated, because the previous build does not derive different state here, it derives none. The halt rolls back the whole block transaction, so a node on the older code cannot commit a conflicting verdict, only stop.
v0.12.0
Released 2026-08-31. Release notes and artifacts
Fourth release train. Every component changed in this train, and every component
carries 0.12.0 in its own package.json at its tag.
| Component | Version |
|---|---|
| xchain-node | 0.12.0 |
| xchain-hub | 0.12.0 |
| xchain-indexer | 0.12.0 |
| xchain-explorer | 0.12.0 |
| xchain-decoder | 0.12.0 |
| xchain-encoder | 0.12.0 |
| xchain-sync | 0.12.0 |
| xchain-utxo-tracker | 0.12.0 |
| xchain-vm | 0.12.0 |
| xchain-sdk | 0.12.0 |
| xchain-contracts | 0.12.0 |
| xchain-e2e-test | 0.12.0 |
| xchain-regtest-miner | 0.12.0 |
Notable in this train: hubs sign each ROLLCALL epoch, gossip the signatures, and an elected publisher lands the roll call on chain, with a source that is absent across consecutive rolled epochs deactivated by a synthetic unstake and a rolled back close restoring what it changed; anchors publish one bundle per network per cycle instead of one anchor per chain, and a bundle the attestation round could not attest is deferred rather than published unattested; refused cross-chain calls and refused anchors are recorded as events rather than dropped silently, and a stalled checkpoint cadence is recorded rather than passing as one tick in sixty; the database connector moves to 3.5.3, closing three high-severity advisories against the pinned 3.5.2, including one that reached a service through a stale bundled copy while the top-level dependency already read clean; and token balances with decimal places display at their true scale in the wallet.
ROLLCALL is inert on regtest. Arming a network commits every Bitcoin indexer on it to a wired Dogecoin peer, because an epoch close cannot decide a non-empty responsible set without one and correctly halts rather than read silence as absence. A single-coin regtest venue has no such peer and can never have one.
v0.11.0
Released 2026-08-26. Release notes and artifacts
Third release train. Every component changed in this train, and every component
carries 0.11.0 in its own package.json at its tag, so this train needs none
of the legacy-stream caveat that applies to v0.10.0 below.
| Component | Version |
|---|---|
| xchain-node | 0.11.0 |
| xchain-hub | 0.11.0 |
| xchain-indexer | 0.11.0 |
| xchain-explorer | 0.11.0 |
| xchain-decoder | 0.11.0 |
| xchain-encoder | 0.11.0 |
| xchain-sync | 0.11.0 |
| xchain-utxo-tracker | 0.11.0 |
| xchain-vm | 0.11.0 |
| xchain-sdk | 0.11.0 |
| xchain-contracts | 0.11.0 |
| xchain-e2e-test | 0.11.0 |
| xchain-regtest-miner | 0.11.0 |
Notable in this train: protocol time on testnet is read from median-time-past rather than the raw block timestamp, which removes an admission stall where a confirmed transaction could take up to about two hours to appear; the explorer status endpoint reports why the indexer trails and when the wait clears, so a deliberate pause for a block stamped in the future is distinguishable from a stuck indexer; mempool data is read live from each coin’s decoder API, so explorers serving from synced replicas can show pending transactions; the bundled consensus pin is verified at API boot, so a host carrying a drifted coin registry halts instead of serving from it; and installs verify downloaded artifacts, recover from a failed mirror, and end with a bootstrap restore summary.
The median-time-past change is armed for testnet only. Mainnet and regtest continue to read the raw block timestamp. Because the change alters how protocol time is derived, a testnet indexer must be rebuilt from chain after the v0.11.0 build reaches it; a reindex under the previous build re-derives the old state and only looks like the step was taken.
Deploy the hubs together. The oracle clamp convergence in this train leaves a straddle window of up to one re-seed interval, and a mixed-version hub set can disagree on the clamp reference and on whether a deviation accusation is raised.
v0.10.0
Released 2026-08-22. Release notes and artifacts
Second release train. Every component changed in this train.
| Component | Version |
|---|---|
| xchain-node | 0.10.0 |
| xchain-hub | 0.10.0 |
| xchain-indexer | 0.10.0 |
| xchain-explorer | 0.10.0 |
| xchain-decoder | 0.10.0 |
| xchain-encoder | 0.10.0 |
| xchain-sync | 0.10.0 |
| xchain-utxo-tracker | 0.10.0 |
| xchain-vm | 0.10.0 |
| xchain-sdk | 0.10.0 |
| xchain-contracts | 0.10.0 |
| xchain-e2e-test | 0.10.0 |
| xchain-regtest-miner | 0.10.0 |
xchain-contracts, xchain-e2e-test and xchain-regtest-miner were tagged for
this train while still on their own legacy version streams, and adopted the
platform stream immediately afterwards. Their v0.10.0 tag therefore points at a
commit whose package.json still reads the legacy number (0.1.0, 0.3.9 and
0.1.21 respectively); the version above is what the component carries from this
train onward. The tag and the manifest pin by commit, and the commit is what a
pinned install resolves, so nothing about reproducibility changes either way.
Notable in this train: the ledger amount precision flag day is pinned on mainnet above each chain’s tip; the contract state sub-root is armed from genesis on every testnet; free-form user-text columns accept any legal UTF-8, closing a defect where one legal broadcast could halt every indexer at the same block; the hub reserves spend budget around awaited sends; and the explorer gains detail pages for validators, XCALLs, attestations, polls and anchors.
Manifest coverage changed. v0.10.0 pins all twelve modules the installer
clones. The v0.9.0 manifest listed eight, so a pinned install of that train still
resolved xchain-sdk, xchain-e2e-test, xchain-contracts and
xchain-regtest-miner at their default branch. Anyone reproducing v0.9.0 should
know that; every train from v0.10.0 pins the full set.
v0.9.0
Released 2026-08-14. Release notes and artifacts
First release train, and the adoption jump: every component moved from its own
legacy version onto the shared platform stream. The numbers went down while the
release got newer (the hub, for instance, moved from 2.2.18 to 0.9.0),
because the platform stream starts at 0.9.0 for the testnet series and 1.0.0 is
reserved for mainnet. Legacy versions are preserved in each component’s
changelog below a marker line and are not comparable to platform versions.
Installing a specific train
xchain-node install v0.14.0
A pinned install resolves every component to the exact commit recorded in that
train’s manifest and verifies the artifacts after clone. install develop and
install master are tracking installs with no pins, intended for development.
Copyright © 2025–2026 Dankest, LLC
Based on XChain Platform by Dankest, LLC – https://dankest.llc
Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0-or-later) with a commercial license available for proprietary use.
You may use, modify, and distribute this material under the terms of the License. See LICENSE and NOTICE for full terms. See the licensing overview.