Skip to content

Release v0.19.0 - xchain-e2e-test - #14

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

jdogresorg merged 294 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.

Split the oversized suite callback into consecutive same-title behavior blocks while preserving hook coverage and test order.
Split the oversized suite callback into consecutive same-title behavior blocks while preserving hook coverage and test order.
Split the oversized suite callback into consecutive same-title behavior blocks while preserving hook coverage and test order.
Split the oversized suite callback into consecutive same-title behavior blocks while preserving hook coverage and test order.
Split the oversized suite callback into consecutive same-title behavior blocks while preserving hook coverage and test order.
Split the oversized suite callback into consecutive same-title behavior blocks while preserving hook coverage and test order.
Split the oversized suite callback into consecutive same-title behavior blocks while preserving hook coverage and test order.
Keep the transaction helper entry API stable while distributing its
transaction paths into focused modules.
Rename the miner response helpers and tracker quiescence helper to
plain method names. Update their internal call sites without changing
connector behavior.
Relocate the bridge rail base support module into a support/ folder
and rename the attestation SDK support module so both match the
tracked test file naming rule; move the transaction helper parts into
a lib/ folder for the same reason. Update every require path that
pointed at the old locations.
Relocate the attestation split's shared setup into support/ so it
carries its explanatory comments the same way every other split's
support module does, and matches the tracked test file naming rule.
Split dispenser coverage across numerically ordered files and extract
bounded setup helpers. Preserve all test titles, assertions, comments,
and execution order. Wrap the four FIAT dispense polls this split
isolated into their own functions with requireRow() so a give-up
fails at the wait instead of surfacing several assertions later.
The dispenser and sdk splits landed in this round move some of their
cases into a <entry>.test/NN_*.test.js part directory, which broke
three unit-tier checks that assumed the watched file still held
everything itself: package.json's per-suite scripts named the entry
literally and never ran its new parts, fiatDispenserPairIsolation.test.js
read only the entry's source for its FIAT_* pins, and
seedSentinelCoverage.test.js pinned the entry's exact path as a seed
site. Wire the split parts into the affected npm scripts, and make
both source-pin tests treat entry+parts as the one logical suite a
split declares them to be.
xchain-indexer renamed src/attestation/providerRegistry.js to
provider_registry.js and src/hub/hub-schema-version.js to
hub_schema_version.js. The ROLLCALL gates suite loads the registry by its
snake_case name and falls back to the camelCase one only when that does not
resolve at all (any other load error still throws), and the attest-mirror venue
smoke suite reads the first of the two schema-version names that exists, so
both resolve against an indexer on either side of the rename.
Rename camelCase and hyphenated test/unit files to the snake_case form
the code-structure gate's test_file_names rule requires; no content
changes beyond a renamed file's own self-referential path comment.
Rename camelCase and hyphenated test/sdk, test/security, test/tools,
test/perf and test/parity files to snake_case, and repoint
run-multichain-parity.sh and priceSeedAnchor's require.resolve at the
renamed multichain_parity.test.js / ctlseed.test.js paths.
Rename camelCase and hyphenated test/actions, test/attestMirror,
test/contracts, test/drills and test/federation files to snake_case;
no content changes beyond a renamed file's own self-referential path
comment.
… scripts

Rename hyphenated test/integration files to snake_case. Repoint
package.json's script paths and test/integration/live-tier.json's roster
comment at every file this pass renamed; the operator's held bridge
commit changes package.json around venue:clear-rollcall-outsiders and
test:bridge-rail, so rollcallClearOutsiders.test.js and parityBoot.js
stay unrenamed there to avoid conflicting with that rebase.
seedSentinelCoverage.test.js's scan-coverage list and the two advisory
suites' fs.readFileSync(path.join(__dirname, ...)) calls named the
renamed nativeFeeLive.test.js and dependency-advisories.test.js by their
old literal strings; test:unit failed both until repointed.
The sdk renamed its private _requireEncoder to requireEncoder; the anchor
election suite drives the linked sdk and follows the rename.
…through the mirror, and deepen the split helper's fee require

Drive 18 read six reds that were one harness fault: the indexer's
getpendingbridgetransfers excludes finalized legs, so the settled-rail wait
declared the backlog drained the moment the venue federation signed it while
the destination had applied nothing. The wait now holds every hub's
bridge_transfers row against the destination's bridge_settlements, and the
AT6/AT7 invariant assertion is the identity in_flight 0 with the hub delta
equal to the measured non-bridge credits (D65 surplus), red on a double mint,
an unbacked mint, a lost credit or a wrong term.

AT5 and AT7 were refused for a stale DOGE/USD price because the venue indexers
price off their mirror, which only takes live rows from hub-emitted events:
refreshVenuePrices now inserts fresh rounds into every hub, drops the mirror
proxy sockets, and waits until each mirror holds the round before a priced
action. AT4's template row now copies a finalized non-at4 row with an
unsettled source leg, so the perturbations reach the settle pass instead of
being dropped as duplicates of an applied leg.

test/transactionHelper/lib/01_create_and_send_transaction.js required
../helpers/nativeFeeHelper from one directory too shallow after f81db26 moved
the split parts into lib/, which no unit tier loads and every rail send hit.
…nstead of keeping only the second

The venue indexer spawn spec carried two extraEnv keys, so the per-index
overlay silently replaced the venue-wide one whenever it was null. A bridge
drive's destination indexer then had no origin-chain endpoint and deferred
every in leg under the proof barrier instead of saying it was misconfigured.
mergeIndexerExtraEnv layers the per-index overlay over the venue-wide one and
stays null when neither is set, with unit tests for each half.
…ter W4 (activation registry row 19)

attestation_request_cap.test.js requires the moved
src/actions/attest/attest_request_cap_gate.js and rollcall_gates.test.js reads
attest_admission_activation.ATTEST_ADMISSION_ACTIVATION through
src/consensus/gate_registry.js activeAt (12/12 equal to the deleted shim across
four networks and three heights); db.js's comment cites the registry row.
…budget the mint wait by the relay margin

The reorg lever re-mined the invalidated blocks' transactions, so the lock it
meant to orphan came straight back and finalized. The lever now reads the
lock's confirming height from the node, mines empty replacement blocks to a
throwaway coinbase and refuses a chain that carried the lock back in. The
mint wait is budgeted from the hub's relay margin plus slack instead of a
constant equal to the margin, the retraction leg now asserts the retraction
the spec describes, row messages survive BigInt columns, and both suite roots
say their split parts belong on the same mocha line.
… the relay-margin case

The sibling-load guard refuses a bundled sibling required inside a catch
that skips, because a present checkout that fails to load must red the case
rather than hide it; the case now skips only on resolution failure.
…re reading the D65 surplus

The send helper returns on the standing indexer's grading while the surplus
case reads the venue indexer, which parses the same block on its own clock,
so the after-read could land a block early and report a credit that was not
parsed yet. The venue now exposes one wait for its indexer to reach a height,
the reorg suite's catch-up wait delegates to it, and the pure comparison has
unit tests.
…ation indexer follows

The out-leg case forges a record whose destination is the BTC chain, but
every case injected into the DOGE venue and read the DOGE indexer, whose
settle pass never selects a row destined elsewhere, so no refusal could be
logged. The case table now names the destination chain per row and the
injection, the tip wait, the balance and the settlement read all follow it.
Version 0.19.0 (the staged hub and sdk snapshot versions with it), the 0.19.0 changelog section and the README badges and script-table counts measured on Linux.
The lock now records the hub and sdk devDependency trees (eslint and its
acorn/@eslint tree) that the image npm ci resolves through the file: links.
…ts own fee address

nativeFeeHelper.resolveFeeDestination reads the generic FEE_DESTINATION env
before it asks the indexer, and an xchain-node e2e container sets it to the LEG
coin's address. withRail did not swap it, so every fee output injected on the
second chain paid the first chain's destination. Measured on the first two-stack
litecoin matrix leg (xchain-node run 35111751698): the BTC gas lock paid LTC's
regtest destination, the BTC indexer saw no fee output, fell back to
XCHAIN-balance mode and refused the lock with `insufficient funds (FEE)`.

FEE_DESTINATION joins RAIL_ENV. createRail resolves it on the credential ladder
(<CODE>_FEE_DESTINATION, then .env.<code>) and otherwise leaves it undefined,
which enterRail turns into a delete for the duration of the swap, so the helpers
discover that chain's destination from its own feeschedule. exitRail and
captureCurrentRail carry the leg coin's value back.
…n the bitcoin leg

The v0.19.0 freeze matrix bitcoin leg (run 35102834217) read 269 passing,
32 pending, 4 failing against the last green leg's 273 / 32 / 0, and all four
are harness drift from the structure passes. The unstaked-signature case in
attestation.test.js lost `contractIndex` from its destructure when the suite
was split (ReferenceError at line 174). The delegated-reward drill's minimal
db adapter mirrored the indexer's Database, but the indexer pass moved the
resolver's two SQL legs into named mixins (indexer 0bb77814) that the resolver
now calls on the db it is handed, so every resolution died inside the resolver
as "failed to resolve stake source"; the adapter carries both methods now,
SQL byte-identical to src/db/stakes/credit_source_reads.js and
src/db/delegations/index.js.
…e delegated-reward drill

The targeted re-run (35126895624) cleared three of the four cases and left
the slash-exclusion case dying on `_resolveActiveStakeSourceId`, which the
indexer structure pass renamed to resolveActiveStakeSourceId when it dropped
underscore methods; the drill calls the master mixin by its current name.
@jdogresorg
jdogresorg merged commit 1f9486c into master Sep 16, 2026
4 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