Release v0.19.0 - xchain-sdk - #13
Merged
Merged
Conversation
…it as a union
The suite-title pin compares file by file, and its rename map is one to one, so
a test file that becomes several cannot be declared: every part reads as added
and the old file as dropped, a wall of differences a reviewer ends up accepting
by eye. --split-map takes {old: [new, ...]} and requires the parts, taken together,
to carry the old file's titles exactly: none lost, none added, none carried
twice, and a title that left for a file the record does not name is reported as
moved, with its destination, rather than as a bare drop.
A structured rename map's declared title renames apply to the old file before
the union is graded, so a split can land beside a declared title rename.
The grading lives in bin/suite_title_map/split_map.js so the CLI does not grow.
bin/pins/suite-title-splits.json declares no split yet, and with it empty the
compare reports exactly what it reported without the flag.
…blocks by behavior
…blocks Break the single oversized describe into consecutive blocks that reuse the outer title, one per encoding path plus the caller-argument guard, so every full test title and assertion order stays unchanged.
Break the encoding-loop describe out of the single verification suite into its own block, keeping the standalone framing checks first so execution order matches what the suite ran before.
…locks Break the fitsSingleDeploy suite into consecutive blocks that reuse the same describe title, grouped by the invariant each block measures.
The helper resolves the fetch implementation and falls back to the global fetch it would otherwise be named after.
The helper fetches and parses a JSON body; json alone reads as the Response method it calls.
The helper lowercases a hex string; hx is not a name.
The helper builds the unverified result; no is not a name.
The validator helper builds an error record; error is the parameter name of the neighbouring leg helper and the global constructor family.
Every caller assigns the result to a local named file, so the helper says what it returns.
The option the method reads is awaitContract, so the method takes a name distinct from the flag.
legValue is the loop local of the sibling shared-value helper in the same class.
Both callers assign the result to a local named maxFeeRate; the signer function and the wallet method are renamed together.
supportsSegwit is the network table field the helper reads.
windowUsage is the local its caller assigns and a key of the usage object in the same file.
aesEncrypt is already the public wrapper on MessagingUtils that derives the key and calls this one.
aesDecrypt is already the public wrapper on MessagingUtils that derives the key and calls this one.
aesEncryptBytes is already the public wrapper on MessagingUtils that derives the key and calls this one.
aesDecryptBytes is already the public wrapper on MessagingUtils that derives the key and calls this one.
…hod lists The encoder and explorer public-method counts exclude underscore-prefixed members, so the helpers that dropped their prefix now count: 9 to 12 for EncoderClient and 123 to 133 for ExplorerClient, each named in the test.
Four prose mentions in the drift map follow the validator's renamed tick-name and delimiter helpers.
…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). src/config.js gains three named getters for the regtest arming variables.
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).
…f the underscore _validateField, _validateBatch, _validateBet and _validateBetDetails were split-born stubs delegating to a same-file imported helper of the stripped name. The prototype descriptor test pins all four by name, so each keeps a plain-named method on the prototype instead of the private spelling: validateFieldValue, validateBatchFields, validateBetFields and validateBetDetailsShape (the bare helper names were already taken by the same-file imports, so each takes a name after what it does). Callers in legs_and_actions.js and bet_rules.js repoint to the new names, and the prototype descriptor fixture and the one describe title that named the old spelling follow.
ActionWaiter's static _buildExplorer was a one-line stub delegating to buildExplorer from action_waiter/explorer_options.js, reached only from inside the class itself (the constructor, resolveExplorer and explorerOverridden). No test or sibling reaches it by name, so the three call sites now call buildExplorer directly and the stub is gone.
…entry
src/api/index.js called startApi() at module scope, so a require() opened a
socket on SDK_API_PORT as a side effect and a consumer could neither mount
the app nor start the server on its own terms. The module now exports
createApp(sdk) (the guard chain, controller and routes, synchronous and
listener-free) and startApi({ port }) (builds the SDK, runs hub discovery,
returns the http.Server), and calls startApi() only under
require.main === module. `node ./src/api/index.js` opens the same listener
on the same port with the same log line and middleware order.
api_listener.test.js drives all three shapes in child processes: a plain
require() issues no listen() and exits on its own, startApi({ port: 0 })
answers ping and releases the port on close(), and the entry still listens
on SDK_API_PORT. The api_guards.js header no longer claims the module cannot
be required.
…est headers The three guard suites explained their mount-the-guard-alone shape by saying src/api/index.js starts a live server at require time. It no longer does; the headers now give the reason that still holds (driving each guard without the SDK or the other guards in front of it) and point at api_listener.test.js. Every source anchor the suites read stays as it was.
…les instead of the W4-deleted shims (activation registry row 19) Comment-only: the preflight checks, constants, INDEXER-MAP and two tests name the registry key or the <feature>/<stem>_gate.js path the indexer W4 landed; lint_core.js carries the reworded byte-twinned note from the vm.
…p (activation registry row 19)
Version 0.19.0 for both published packages (the mcp package and its sdk range 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.
The first sizing (11:53Z) put the train boundary at TBTC 152716 and the chain reached it at 16:33Z on 2026-09-16 while the cut was still waiting on the e2e matrix, so the release gate's H_TRAIN > T_BTC no longer held. Re-cut from the tips and last-99-block cadences read in one sitting at 16:33Z with a 10 h lead (the origin at 3x): TRAIN_ACTIVATION 0.19.0 testnet 152787 (TBTC 152716 + 71 at 508.8 s/blk, about 10.0 h), XCHAIN_BRIDGE_ACTIVATION BTC:testnet 152929 (TBTC 152716 + 213, about 30.1 h, the origin, last), LTC:testnet 4887898 (TLTC 4887644 + 254 at 141.8 s/blk, about 10.0 h), DOGE:testnet 67902062 (TDOGE 67900748 + 1314 at 27.4 s/blk, about 10.0 h). Mainnet stays the sentinel and regtest 0. The pins and the tests that carry the literals follow.
…branch on a release PR The drift gate checked out xchain-hub, xchain-explorer and xchain-indexer at develop on every non-master run, so the v0.19.0 release PR read as handler drift as soon as indexer develop moved past the map this branch pins (the same head had passed hours earlier). The three checkouts now use the release-aware expression the shared workflow call already uses, so a release PR grades the release siblings.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.