Skip to content

Release v0.19.0 - xchain-explorer - #27

Merged
jdogresorg merged 399 commits into
masterfrom
release/v0.19.0
Sep 16, 2026
Merged

jdogresorg merged 399 commits into
masterfrom
release/v0.19.0

Conversation

@jdogresorg

Copy link
Copy Markdown
Contributor

Bumps the package and lockfile to 0.19.0 and folds the Unreleased block into a dated 0.19.0 entry. The train carries the XBRIDGE cross-chain bridge, armed on testnet by the ladder and on mainnet at the sentinel, with the token bridge and policy code dark behind their sentinels, the rollcall and tracker fixes, the code-structure passes with the consensus identity pinned, and the activation registry.

Platform notes ride xchain-node's Release.

…behaviour

The extractMethods and ABI extraction suites are each split into consecutive blocks under their own titles, with fixture strings untouched. Test titles, their order and every assertion are unchanged.
… behaviour

The module suite is split into three consecutive blocks under the same title. Test titles, their order and every assertion are unchanged.
…ehaviour

The package and threshold reads and the exclude parser move to module scope with their comments, and the suite is split into two blocks under the same title. Test titles, their order and every assertion are unchanged.
…ehaviour

The suite is split into two blocks under the same title, with the hostile chain name case placed at the end of the first block so it still runs before the nested snapshot suite. Test titles, their order and every assertion are unchanged.
…ehaviour

The page blocks, card config and the realm builder move to module scope, and the suite and its driven group are split into consecutive blocks under the same titles. Test titles, their order and every assertion are unchanged.
…haviour

The attestation key fake moves to module scope with its comment, and the suite is split into consecutive blocks under the same title. Test titles, their order and every assertion are unchanged.
Each heap test body moves into a module-level function that its it passes by reference, so the suite and its one-time server hooks stay whole. Test titles, their order and every assertion are unchanged.
The shared stubs and loaders move to a helpers part and each method group moves into its own part file, required from the entry in the original order and split into same-title blocks where a group ran long. Test titles, their order and every assertion are unchanged.
…viour

The entry keeps the shared server and client builders and requires four part files in the original order, whose long describe callbacks become consecutive same-title blocks with hoisted helpers. Test titles, their order and every assertion are unchanged, and each comment moved with its code.
The entry keeps the jsdom loaders and payload corpus and requires two part files in the original order, whose long describe callbacks become consecutive same-title blocks. Test titles, their order and every assertion are unchanged, and each comment moved with its code.
…aviour

Three long describe callbacks become consecutive same-title blocks, with the realm setup they share hoisted into one helper. Test titles, their order and every assertion are unchanged, and each comment moved with its code.
The pool state, query helpers, one-time hooks and the Unicode sweep setup move to module scope, and the suite registers its tests through named functions while its before and after hooks stay one-time. Test titles, their order and every assertion are unchanged, and each comment moved with its code.
…behaviour

Two long describe callbacks become consecutive same-title blocks, each carrying its own hooks. Test titles, their order and every assertion are unchanged, and each comment moved with its code.
…behaviour

Shared fixtures and helpers move to module scope and two long describe callbacks become consecutive same-title blocks. Test titles, their order and every assertion are unchanged, and each comment moved with its code.
The root before hook calls two named seeding helpers, one for the indexer fixtures and one for the decoder fixtures, in their original order. Test titles, their order and every assertion are unchanged, and each comment moved with its code.
…med functions

The one-time hooks and each test body move to module-scope named functions that the suite passes to before, after and it. Test titles, their order and every assertion are unchanged, and each comment moved with its code.
…ehaviour

One long describe callback becomes consecutive same-title blocks. Test titles, their order and every assertion are unchanged, and each comment moved with its code.
Shared helpers move to module scope and one long describe callback becomes consecutive same-title blocks. Test titles, their order and every assertion are unchanged, and each comment moved with its code.
…y behaviour

One long describe callback becomes consecutive same-title blocks, each carrying its own setup. Test titles, their order and every assertion are unchanged, and each comment moved with its code.
One long describe callback becomes consecutive same-title blocks by selection tier. Test titles, their order and every assertion are unchanged, and each comment moved with its code.
…iour

The describe blocks move into polling, events and batching parts beside the entry, with the shared detector factory in a helpers module. Test titles, their order and every assertion are unchanged.
…cks by behaviour

The suite hooks and relay setup become named helpers and the config sync experiments move into a part beside the entry. Test titles, their order and every assertion are unchanged.
…iour

The long route describes split into same-title blocks, and the OpenAPI contract blocks and the batch params helper move into parts beside the entry. Test titles, their order and every assertion are unchanged.
…haviour

The suite hooks and each describe body become named module-level helpers registered from the same describe titles. Test titles, their order and every assertion are unchanged.
…haviour

The long describe splits into same-title blocks that each carry the registry reset hooks, with the widget registration as a named helper. Test titles, their order and every assertion are unchanged.
… by behaviour

The Bootstrap surface bridge blocks and the shared CSS helpers move into parts beside the entry. Test titles, their order and every assertion are unchanged.
…ehaviour

The long describe splits into two consecutive same-title blocks. Test titles, their order and every assertion are unchanged.
…s by behaviour

The long sends describe splits into two consecutive same-title blocks. Test titles, their order and every assertion are unchanged.
…behaviour

The long describe splits into consecutive same-title blocks, one per nested behaviour group. Test titles, their order and every assertion are unchanged.
…viour

The long describe splits into two consecutive same-title blocks. Test titles, their order and every assertion are unchanged.
…in xchain_charts.js

Extracts the chart API assembly into a named xcChartsCreateApi function
and renames its internal helpers with an xcCharts prefix. Public API,
root.XCC exposure and comments are unchanged.
… xchain_ws.js

Extracts the cursor, schema and system-message helpers from the
WebSocket message handler into named top-level functions prefixed
xcWs. Public API, behaviour and comments are unchanged.
…lder in offset_boundaries.js

Extracts the five per-shape SQL builders from firstLastSql into named
helper functions kept in the same file. Generated SQL text, exported
functions and comments are unchanged.
Moves the metrics, log shipper, install wiring, log format and console
patch assertions from one entry file into support parts under
test/unit/observability.test/support/. Titles and assertions are
unchanged.
Comment only: the hub test layout moved slash_proposals_rpc.test.js to
test/unit/validators/governance/ and observability.test.js to
test/unit/observability/.
…d move the ping and contract-code statements under src/db

The four first-party browser scripts log through browser_logger.js, which
the page template loads first, and the JSON-RPC ping and the simulation
endpoint's contract-code read become Database methods. Parked: it moves the
explorer identity pin (287 prototype names, one template script tag).
…milies under src/content/js/xchain/

Parked M6 row 43 work on base 642050b, committed so it survives a worktree sweep; the AT1 pin re-take follows the rebase onto the current tip.
…r, not alphabetically

srcText() concatenated the xchain.js entry with its family files sorted by name, so a suite taking the first match of a same-shaped literal (the XC.query allowlist in params.js against the two-element guards in datatable.js and detail_anchor_price.js) read the wrong array and fourteen detail routes failed the allowlist check. The family is now ordered by the script tags template.html lists under /js/xchain/, which is the order the page defines those functions in and the order the one-file client had; a family file the template does not load fails loudly instead of being read as shipped.
… files

Pure git mv of the 194 test/unit suites and their split-part directories into the feature directories the src tree mirrors (action_detail, config, connectors, content/{components,detail,lists,pages}, contract, db/{core,guards,mempool,readers}, explorer, http, icons, lib, mirror, protocol, render, repo, ws). test/unit/change_detector.test.js becomes ws/change_detector_methods.test.js because its basename collides with the ws suite. No content changes: the repoint follows in the next commit.
…d-out suites

Relative require, readFileSync and __dirname joins inside every moved file gain the levels the move added; the explicit file lists in the test:db, test:explorer, test:config and test:utility scripts, the stryker fuzz pilot spec, the coverage-thresholds note, the openapi build comments and the src/db/index.js comment name the new paths; bin/pins/w1a-test-rename-map.json carries the 194 old-to-new pairs so the identity checker follows the move. Also repointed beyond the parked layout: the six observability split parts the tip added, the browser logger and health reader paths the stack added, and the two sibling-SDK verifier specs in the proof suites, which the parked layout left one level short so they would have skipped silently.
…logger, the xchain.js split and the test layout

Against origin's pin every differing key is one of: the template-baseline fixture bytes and sha256 (the browser_logger.js and the 19 /js/xchain/*.js script tags), the two Database.prototype names the logger commit added (pingPool, getContractCodeRows; 285 to 287, nothing removed), and the 194 suite file keys the rename map declares, each carrying its identical title set. The one derived delta is test:ws collecting the moved change_detector_methods.test.js (14 to 15 files, 253 to 288 titles, the same 35-title set), which the layout plan declared and accepted. Routes digest, twins, coverage floors, the action-detail golden and the list-page baseline are unchanged.
…erers in action_detail.js and its detail siblings

Split getActionDetails, showAttestDetails, showVoteDetails,
showActionDetails and showBetDetails into prefixed same-file helper
functions so every function stays at or under 60 lines while each
file stays under 400 lines. Behaviour, comments and global names are
unchanged apart from the new prefixed helpers.

Six covering tests isolate a single named function by brace-slicing it
out of the shipped source and evaluating it alone; they now also slice
in the new helpers those functions call, using the same extraction
technique, so the isolated harness still resolves every call.
…tus readers

Split showDeployDetails, showActionDatatable, updateMarketHistory,
getCoinNetworkInfo and getExplorerStatusInfo into prefixed same-file
helper functions so every function stays at or under 60 lines while
each file stays under 400 lines. Behaviour, comments and global names
are unchanged apart from the new prefixed helpers.

One covering test isolates getCoinNetworkInfo and getExplorerStatusInfo
by brace-slicing them out of the shipped source and evaluating them
alone; it now also slices in the two new helpers those functions call,
using the same extraction technique, so the isolated harness still
resolves every call.
…ore isolated harnesses

Two more suites slice showVoteDetails and getActionDetails out of the
shipped source through content-source.js's clientSource() rather than
through source_text.js directly, so the earlier same-lane test fix
missed them. Same technique: slice in the new prefixed helpers those
functions call before evaluating the parent, so the isolated harness
still resolves every call.
…aders

Split setXChainParams, showTokenContent, showTokenInfo and
legacyJsonToXChainTIS into prefixed same-file helper functions so every
function stays at or under 60 lines while each file stays at or under
400 lines. Behaviour, comments and global names are unchanged apart
from the new prefixed helpers.

Restored the original statement order in showTokenContent: the
resolved artwork title is now computed inside the video/files/dns
helper, right after the video block, exactly where it ran before the
split, instead of after the helper returns.

One covering test isolates legacyJsonToXChainTIS by brace-slicing it
out of the shipped source and evaluating it alone; it now also slices
in the four new helpers that function calls, using the same extraction
technique, so the isolated harness still resolves every call.
…imitives.js part and the three renames

The four-copy merkle.js twin window (indexer canonical, explorer, sdk, sync),
one edit applied byte-for-byte to every carrier:

- the byte layer (version constants, domain-separated hashes, the frozen
  empty-subtree table, canonical encodings and SMT key derivations) moves
  verbatim into merkle/primitives.js beside the entry, required as
  ./merkle/primitives.js so the require text is the same in all four and
  the entries stay byte-identical; the entry goes from 445 to 336 lines
- the three underscore names lose their prefix: smtNode and nextPow2 stay
  module-private, SparseMerkleTree.entries() is the method; no caller
  outside the file used any of them in the four repos or xchain-e2e-test

The export surface is unchanged (40 names, same object), the golden
merkle vectors, the SMT and fixed-Merkle proofs, stateRoot and
blockMerkleLeaves compute the same bytes, and consensus identity reads
the same before and after (armed-map fingerprint 55891dfd, v2 9db471b7,
rules digest 26ba9cce, 33 gates resolved, 0 absent). The new part is
registered as a twin in root frozen-twins.json and reconcile-twins.sh in
the paired root commit.
… the replica

A validator's BTC indexer and hub read a Dogecoin indexer for the roll-call
signers and the anchor, archive and price-batch reads; a validator without
its own Dogecoin indexer had nothing to point at. The explorer already
replicates every indexer database, so it now answers getrollcallsigners,
getanchoraction, getanchorconfirmations, getarchiveanchor and
getpricebatches on POST /{COIN}/api/ with the indexer's result shapes and
errors, off the coin's replica, and refuses as not ready while that
replica's sync is halted.

The five methods sit behind EXPLORER_FEDERATION_READ_KEY (x-api-key,
constant-time, every batch element checked); with the key unset they fail
closed. ping, unknown methods and every other route are unchanged. The SQL
is byte-identical to the indexer's and a parity suite drives the same
fixtures through both handlers. manifest_hash is the explorer's own
manifest, which the image now ships.
…its parts

The canonical client (xchain-indexer src/hub/hub_db_sync.js) became an entry
plus a directory of parts (src/hub/hub_db_sync/, 26 files, two subdirectories);
this is the byte-identical re-vendor of both, produced by
xchain-indexer/bin/sync-hub-mirror-client.sh, which now syncs the parts
directory as a set (HUB_DIRS=).

The conformance suite walks src/hub/hub_db_sync/ on both sides and compares
every part byte for byte, compares the two part SETS so a part present on one
side only fails, floors the part count at 26, and pins HUB_DIRS= against the
sync script the way HUB_FILES= and DEP_FILES= already were. All of it rides
inside the suite's EXISTING cases (the entry's byte-identity case and the
HUB_FILES pin case), so the suite's title set is unchanged and the live
explorer identity pin does not move; each failure names the part. The
indexer-side parts guard (test/unit/hub/hub_db_sync/hub_db_sync_parts.test.js)
is an indexer-only suite and is not vendored.

The client's 13 underscore methods lost their prefix; the one explorer caller
(the vendored-copy price barrier suite) follows, with its pinned titles
verbatim. No explorer runtime code changes: sync_manager and the mirror pool
reach the same class through the same require.
…a_version.js

xchain-indexer renamed its canonical src/hub/hub-schema-version.js to
hub_schema_version.js. This is the byte-identical re-vendor produced by
xchain-indexer/bin/sync-hub-mirror-client.sh (the old copy removed, the four
client parts that require it re-synced), with sync --check OK.

The conformance suite's HUB_FILES list follows the script's HUB_FILES= line.
Its per-file case title is generated from the file name, and the live identity
pin freezes the title set, so the renamed file's case keeps the hyphenated title
through a one-entry PINNED_TITLE_NAME map while it compares the new file. The
schema-version unit suite loads the new path under its unchanged describe
title, and the coverage note names the new file.
…D76)

The twinned activation carriers become byte copies of the indexer's shims,
reading their tables from src/consensus/gate_registry (the consumer core and
the SHARED part files, whole-file twins of the hub's and the indexer's).
Every table value is unchanged (activation-registry row 15).

The explorer identity pin is re-pinned for the eight twin shim bytes only.
The collector reads its three regtest arming variables through a named table,
so the env-doc scanner sees the literal names in this repo too; bytes identical
to the indexer's (activation-registry rows 13 to 15).
Version 0.19.0 (the vendored xchain-vm snapshot version with it), the 0.19.0 changelog section, the README refresh measured on Linux, and the registry part shared_rows_5.js re-vendored byte-identical from the indexer with the TRAIN_ACTIVATION 0.19.0 row and the three per-chain testnet XCHAIN_BRIDGE_ACTIVATION heights sized at the cut.
TBTC reached the first sizing's train boundary (152716) at 16:33Z while the
freeze matrix was still in flight, so the ladder is re-cut from the tips read
at 16:33:48Z: train testnet 152787 (+71 at 508.8 s/blk), BTC bridge 152929
(+213), LTC bridge 4887898 (+254 at 141.8 s/blk), DOGE bridge 67902062 (+1314
at 27.4 s/blk). This is the explorer's byte-identical twin of the indexer's
registry row.
@jdogresorg
jdogresorg merged commit dd79d7f into master Sep 16, 2026
15 of 16 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant