Skip to content

Release v0.24.0 - #70

Merged
jdogresorg merged 70 commits into
masterfrom
release/v0.24.0
Oct 17, 2026
Merged

jdogresorg merged 70 commits into
masterfrom
release/v0.24.0

Conversation

@jdogresorg

Copy link
Copy Markdown
Contributor

What this release carries

Added

  • Scoped module database and user names to a non-default node prefix and proved the scope end to end.
  • Showed NOT READY in the process list from the indexer and decoder readiness verdicts.

Changed

  • Defaulted the bundled MariaDB buffer pool to 1G and kept it overridable.
  • Refused cross-major release downgrades and decoder or indexer setups that would share the default external database name.

Fixed

  • Built and signed the DOGE signer's reveal before broadcasting its commit, and kept the signed reveal when only its broadcast fails.
  • Classified containers by name only and preserved unreadable command locks.

Security

  • Replaced vulnerable Bitcoin signing dependencies and bumped js-yaml and brace-expansion.

Testnet activation

  • ORDER_MATCH_PRICE_CROSS_ACTIVATION on BTC:testnet at height 156908
  • ORDER_MATCH_PRICE_CROSS_ACTIVATION on LTC:testnet at height 4927400
  • ORDER_MATCH_PRICE_CROSS_ACTIVATION on DOGE:testnet at height 68005165
  • REMOTE_TOKEN_ADMISSION_ACTIVATION on BTC:testnet at height 156908
  • REMOTE_TOKEN_ADMISSION_ACTIVATION on LTC:testnet at height 4927400
  • REMOTE_TOKEN_ADMISSION_ACTIVATION on DOGE:testnet at height 68005165
  • GAS_CEILING_EXHAUSTED_ACTIVATION on BTC:testnet at height 156908
  • GAS_CEILING_EXHAUSTED_ACTIVATION on LTC:testnet at height 4927400
  • GAS_CEILING_EXHAUSTED_ACTIVATION on DOGE:testnet at height 68005165
  • RESOURCE_FAULT_SIGNAL_ACTIVATION on BTC:testnet at height 156908
  • RESOURCE_FAULT_SIGNAL_ACTIVATION on LTC:testnet at height 4927400
  • RESOURCE_FAULT_SIGNAL_ACTIVATION on DOGE:testnet at height 68005165
  • HOST_ERROR_STACK_STRIP_ACTIVATION on BTC:testnet at height 156908
  • HOST_ERROR_STACK_STRIP_ACTIVATION on LTC:testnet at height 4927400
  • HOST_ERROR_STACK_STRIP_ACTIVATION on DOGE:testnet at height 68005165
  • JSON_STRINGIFY_REENTRY_ACTIVATION on BTC:testnet at height 156908
  • JSON_STRINGIFY_REENTRY_ACTIVATION on LTC:testnet at height 4927400
  • JSON_STRINGIFY_REENTRY_ACTIVATION on DOGE:testnet at height 68005165
  • NATIVE_STACK_TERMINAL_ACTIVATION on BTC:testnet at height 156908
  • NATIVE_STACK_TERMINAL_ACTIVATION on LTC:testnet at height 4927400
  • NATIVE_STACK_TERMINAL_ACTIVATION on DOGE:testnet at height 68005165
  • VOTE_SETTLEMENT_EXACT_ACTIVATION on BTC:testnet at height 156908
  • VOTE_SETTLEMENT_EXACT_ACTIVATION on LTC:testnet at height 4927400
  • VOTE_SETTLEMENT_EXACT_ACTIVATION on DOGE:testnet at height 68005165
  • SETTLEMENT_BOUNDS_ACTIVATION on BTC:testnet at height 156908
  • SETTLEMENT_BOUNDS_ACTIVATION on LTC:testnet at height 4927400
  • SETTLEMENT_BOUNDS_ACTIVATION on DOGE:testnet at height 68005165
  • PASS_PROGRESS_RETIREMENT_ACTIVATION on BTC:testnet at height 156908
  • PASS_PROGRESS_RETIREMENT_ACTIVATION on LTC:testnet at height 4927400
  • PASS_PROGRESS_RETIREMENT_ACTIVATION on DOGE:testnet at height 68005165
  • SLASH_HISTORICAL_SET_ACTIVATION on BTC:testnet at height 156908
  • SLASH_HISTORICAL_SET_ACTIVATION on LTC:testnet at height 4927400
  • SLASH_HISTORICAL_SET_ACTIVATION on DOGE:testnet at height 68005165
  • ANCHOR_REWARD_COPY_SELECTION_ACTIVATION on BTC:testnet at height 156908
  • ANCHOR_REWARD_COPY_SELECTION_ACTIVATION on LTC:testnet at height 4927400
  • ANCHOR_REWARD_COPY_SELECTION_ACTIVATION on DOGE:testnet at height 68005165
  • TOKEN_SUPPLY_REPRESENTATION_ACTIVATION on BTC:testnet at height 156908
  • TOKEN_SUPPLY_REPRESENTATION_ACTIVATION on LTC:testnet at height 4927400
  • TOKEN_SUPPLY_REPRESENTATION_ACTIVATION on DOGE:testnet at height 68005165
  • DISPENSER_FIAT_PRICING_ACTIVATION on BTC:testnet at height 156908
  • DISPENSER_FIAT_PRICING_ACTIVATION on LTC:testnet at height 4927400
  • DISPENSER_FIAT_PRICING_ACTIVATION on DOGE:testnet at height 68005165
  • BRIDGE_POLICY_APPLY_ORDER_ACTIVATION on BTC:testnet at height 156908
  • BRIDGE_POLICY_APPLY_ORDER_ACTIVATION on LTC:testnet at height 4927400
  • BRIDGE_POLICY_APPLY_ORDER_ACTIVATION on DOGE:testnet at height 68005165
  • VM_EMISSION_AMOUNT_FORMAT_ACTIVATION on BTC:testnet at height 156908
  • VM_EMISSION_AMOUNT_FORMAT_ACTIVATION on LTC:testnet at height 4927400
  • VM_EMISSION_AMOUNT_FORMAT_ACTIVATION on DOGE:testnet at height 68005165
  • EXECUTE_FEE_CAP_ACTIVATION on BTC:testnet at height 156908
  • EXECUTE_FEE_CAP_ACTIVATION on LTC:testnet at height 4927400
  • EXECUTE_FEE_CAP_ACTIVATION on DOGE:testnet at height 68005165
  • VOTE_V3_TICK_EXISTENCE_ACTIVATION on BTC:testnet at height 156908
  • VOTE_V3_TICK_EXISTENCE_ACTIVATION on LTC:testnet at height 4927400
  • VOTE_V3_TICK_EXISTENCE_ACTIVATION on DOGE:testnet at height 68005165
  • MATCH_ORIGIN_OPEN_ACTIVATION on BTC:testnet at height 156908
  • MATCH_ORIGIN_OPEN_ACTIVATION on LTC:testnet at height 4927400
  • MATCH_ORIGIN_OPEN_ACTIVATION on DOGE:testnet at height 68005165
  • VM_LINT_SYNTAX_DEPTH_ACTIVATION on BTC:testnet at height 156908
  • VM_LINT_SYNTAX_DEPTH_ACTIVATION on LTC:testnet at height 4927400
  • VM_LINT_SYNTAX_DEPTH_ACTIVATION on DOGE:testnet at height 68005165
  • NESTED_EXECUTE_GAS_SUM_ACTIVATION on BTC:testnet at height 156908
  • NESTED_EXECUTE_GAS_SUM_ACTIVATION on LTC:testnet at height 4927400
  • NESTED_EXECUTE_GAS_SUM_ACTIVATION on DOGE:testnet at height 68005165
  • EMISSION_DEPTH_EXECUTE_ONLY on BTC:testnet at block time 1792303200
  • EMISSION_DEPTH_EXECUTE_ONLY on LTC:testnet at block time 1792303200
  • EMISSION_DEPTH_EXECUTE_ONLY on DOGE:testnet at block time 1792303200
  • ARCHIVE_REPLAY_WRAPPER_WATERMARK on BTC:testnet at block time 1792303200
  • ARCHIVE_REPLAY_WRAPPER_WATERMARK on LTC:testnet at block time 1792303200
  • ARCHIVE_REPLAY_WRAPPER_WATERMARK on DOGE:testnet at block time 1792303200
  • LEGACY_ANCHOR_REWARD_PIN on BTC:testnet at block time 1792303200
  • LEGACY_ANCHOR_REWARD_PIN on LTC:testnet at block time 1792303200
  • LEGACY_ANCHOR_REWARD_PIN on DOGE:testnet at block time 1792303200
  • GUARD_STAKE_SNAPSHOT_DECIMAL_STRINGS on BTC:testnet at block time 1792303200
  • GUARD_STAKE_SNAPSHOT_DECIMAL_STRINGS on LTC:testnet at block time 1792303200
  • GUARD_STAKE_SNAPSHOT_DECIMAL_STRINGS on DOGE:testnet at block time 1792303200
  • HOST_CALL_BOUNDS on BTC:testnet at block time 1792303200
  • HOST_CALL_BOUNDS on LTC:testnet at block time 1792303200
  • HOST_CALL_BOUNDS on DOGE:testnet at block time 1792303200
  • PER_ELEMENT_METER on BTC:testnet at block time 1792303200
  • PER_ELEMENT_METER on LTC:testnet at block time 1792303200
  • PER_ELEMENT_METER on DOGE:testnet at block time 1792303200
  • CALLBACK_ARGS_EXACT on BTC:testnet at block time 1792303200
  • CALLBACK_ARGS_EXACT on LTC:testnet at block time 1792303200
  • CALLBACK_ARGS_EXACT on DOGE:testnet at block time 1792303200
  • GAS_CEILING_EXHAUSTED_ACTIVATION on BTC:testnet at height 156908
  • GAS_CEILING_EXHAUSTED_ACTIVATION on LTC:testnet at height 4927400
  • GAS_CEILING_EXHAUSTED_ACTIVATION on DOGE:testnet at height 68005165
  • LINT_SYNTAX_DEPTH_ACTIVATION on BTC:testnet at height 156908
  • LINT_SYNTAX_DEPTH_ACTIVATION on LTC:testnet at height 4927400
  • LINT_SYNTAX_DEPTH_ACTIVATION on DOGE:testnet at height 68005165
  • RESOURCE_FAULT_SIGNAL_ACTIVATION on BTC:testnet at height 156908
  • RESOURCE_FAULT_SIGNAL_ACTIVATION on LTC:testnet at height 4927400
  • RESOURCE_FAULT_SIGNAL_ACTIVATION on DOGE:testnet at height 68005165
  • HOST_ERROR_STACK_STRIP_ACTIVATION on BTC:testnet at height 156908
  • HOST_ERROR_STACK_STRIP_ACTIVATION on LTC:testnet at height 4927400
  • HOST_ERROR_STACK_STRIP_ACTIVATION on DOGE:testnet at height 68005165
  • JSON_STRINGIFY_REENTRY_ACTIVATION on BTC:testnet at height 156908
  • JSON_STRINGIFY_REENTRY_ACTIVATION on LTC:testnet at height 4927400
  • JSON_STRINGIFY_REENTRY_ACTIVATION on DOGE:testnet at height 68005165
  • NATIVE_STACK_TERMINAL_ACTIVATION on BTC:testnet at height 156908
  • NATIVE_STACK_TERMINAL_ACTIVATION on LTC:testnet at height 4927400
  • NATIVE_STACK_TERMINAL_ACTIVATION on DOGE:testnet at height 68005165

Release v0.24.0

Base: master at 8592f7a1ce5f773d936e726e121d549b3041c86a
Head: release/v0.24.0 at b63479371f925179446ebb64324210f06133143a

Landed refs

  • b634793 Release v0.24.0
  • 4386c47 Merge master into develop to level it before the v0.24.0 cut
  • 1ad47d1 Merge: test: classify generated config module suites
  • ad83bb3 Merge: classify module test artifacts
  • 130097c Merge: Tighten command lock documentation
  • 7de8a6d test: classify generated config module suites
  • 4387d44 classify module test artifacts
  • 4f665d6 split config module test suites
  • 458d66a test: keep config module suites within structure limits
  • 6b4daf2 Tighten command lock documentation
  • 05911a3 Keep lock permission tests structurally scoped
  • bd7803a test config service modules directly
  • 479e5b5 test: cover split config service modules
  • d893578 Preserve unreadable command locks
  • b9f9246 Re-vendor coin registry for the mainnet genesis re-pin
  • 462efeb Default the bundled MariaDB buffer pool to 1G and keep it overridable
  • 010513d Fix review round findings for xchain-node (2026-10-14)
  • cef003a Build and sign the DOGE signer's reveal before broadcasting its commit, and keep the signed reveal when only its broadcast fails
  • 1b70fd2 Merge remote-tracking branch 'origin/develop' into land-node-ready
  • 801b82b Show NOT READY in ps from the indexer and decoder readiness verdicts
  • 97cf388 Hoist the crypto require and split the NODE_PREFIX scope suite into named steps
  • 6eef5c3 Prove NODE_PREFIX database scope end to end in the unit suite
  • e6f1447 Budget and disambiguate NODE_PREFIX database scope, route reset through configured names
  • e289177 Merge: Kill the gpg agent when the gpg tests clean up their temp home
  • 9e586b3 Kill the gpg agent when the gpg tests clean up their temp home
  • df2bfac Route contributions to develop and guard master against non-release pull requests
  • dfe11db Merge: Keep networks.js at the 400 line file limit
  • 7ad4645 Keep networks.js at the 400 line file limit
  • 158dc10 Pass publish switches through the hub host passthrough
  • 2caf0fa Bump js-yaml to 4.3.2 and brace-expansion in the lockfile
  • 219ab75 fix(discovery): classify containers by name only, never by image
  • b3a03a3 Merge: Trim networks.js to the 400 line file limit
  • ca806e5 Trim networks.js to the 400 line file limit
  • 9c18731 sync trunk
  • d431cf1 Merge: Split the configured database name lookup out of the precondition guard
  • 503c0ce Hoist hub passthrough lists out of configureHubBeforeKey
  • 7fee74a Split the configured database name lookup out of the precondition guard
  • 20bf629 Pass regtest gate switches through the node config
  • 8fdb9b7 Read migration precondition ledger from the configured database name
  • 860b29c Merge: Keep getDefaultConfig within the function length limit
  • 564f4a4 Keep getDefaultConfig within the function length limit
  • 5a114f5 Scope module database and DB user names to a non-default NODE_PREFIX
  • 70b85e5 Merge: Bring build_and_up.js back under the 400 line limit
  • b4a9eab Merge: Bring tracker archive height files under the readability limits
  • 75d9348 Merge: Bring CLI commands module back under the 400 line limit
  • a5fffc6 Stub the published host-port probe in the chaos module harnesses
  • 05a39bc Declare the message-signing overrides and restore elliptic in the lock
  • 92636ac Bring build_and_up.js back under the 400 line limit
  • c3559b1 Refuse decoder/indexer buildAndUp that would share the default external DB name
  • 6007234 Bring tracker archive height files under the readability limits
  • b993117 Bring CLI commands module back under the 400 line limit
  • 2d7a06b Record the tracker archive height from the frozen store
  • fd309ba Honour configured indexer DB name in bootstrap restore rehearsal
  • 3269ccb Merge: Replace vulnerable Bitcoin signing dependencies
  • fb1a5ff Replace vulnerable Bitcoin signing dependencies
  • 18db87c Refresh audited production dependencies
  • 7cd1075 Merge: Exercise sync passthrough through container config
  • 1183b8f Exercise sync passthrough through container config
  • 567e2c9 sync trunk
  • cd8c313 Split sync passthrough out of configureSharedAfterHubKey
  • 8b8d255 Scope INDEX_MAP_PARITY_CHECK passthrough to the sync module
  • 15617b9 Pass host INDEX_MAP_PARITY_CHECK through to the sync server container
  • df1dd28 Fix 14 review findings in xchain-node
  • 09c12df Merge: Split downgrade floor tests into short describe blocks
  • 02e8eb0 Split downgrade floor tests into short describe blocks
  • e08d36b Refuse cross-major release downgrades
  • ce72750 Merge master (v0.23.0 release) back into develop

Guard carrier self-update and manifest target resolution before mutation. Add a loud environment override and focused boundary coverage.
The single describe spanned 116 lines, above the 60 line function limit. Group the cases into self-update, manifest refusal and override blocks and hoist the shared sinon restore.
- Stake mint plan ignores mints.start_block/stop_block, which the explorer serves and the indexer enforces
- Per-address mint cap is checked against this run's shortfall, not cap minus what the address has already minted
- planMints treats MAX_MINT 0 as 'no open mint', but the indexer reads 0 as 'no per-transaction cap'
- MariaDB version drift between repositories
- Recreating the DB container over a persisted XCHAIN_NODE_DB_DATA_DIR saves an unapplied root password over the working one, locking the operator out
- Discovery lets a running container matched only by image take the registry row from the container matched by name
- CLI stop/start/restart report success when the docker operation failed; stop fails with no output at all
- Tracker/gate health contract is pinned only by hand-copied literals, with no live parity check across the seam
- xchain-node and xchain-utxo-tracker compare bootstrap.json identity with different case rules
- Hub install in preCheck ignores the tag a no-ref `update` already resolved and calls releases/latest a second time
- Refusal blast radius drops schema-satisfied manual migrations that an unscoped indexer migrate run still executes
- Bootstrap health gate header says any REORG_HALT row refuses a source, but the query only refuses a halt that no newer REORG_HALT_CLEARED supersedes
- Fractional XCHAIN balance gives a float-noise MINT AMOUNT the indexer rejects as over-precise
- Unstake keeps its own copies of readTip and isUndeactivated instead of using free_key's
Declare a SYNC_PASSTHROUGH_ENV view and copy its value into the shared service defaults, so a recreate of xchain-sync keeps the operator's setting.
Move the host value copy into configureSharedAfterHubKey, guarded by the sync module name, so only the xchain-sync server container receives it. Tests now cover the sync module and assert hub, explorer and db do not get it.
The function spanned 63 lines, over the 60 line limit. The INDEX_MAP_PARITY_CHECK sync-only passthrough now lives in configureSyncPassthrough, leaving the function at 55 lines with unchanged behaviour.
Drive the parity passthrough test through ConfigService.getDefaultConfig so removing the sync-specific wiring fails the focused acceptance. Keep the environment view documentation aligned with the current configuration stage.
Update compatible lockfile resolutions for fast-uri, hono, and ip-address to patched releases.
Resolve message signing through maintained compatible forks backed by noble curve primitives. Remove the legacy elliptic dependency chain while preserving SDK signing behavior.
The rehearsal read the derived default database name directly. Route it
through configuredDatabaseName so an operator-set INDEXER_DB_NAME is
the database compared against. Adds a unit test for the resolution.
Read the height of the archived directory right after the compress
(and before the fallback-path restart), and prefer it over the live
status readings when present. Falls back to the existing behavior
when the store reports nothing usable.
Compact the rehearsal source database helper and drop blank lines
between adjacent top-level functions so src/cli/commands.js holds
exactly 400 lines.
Condense two comments so tracker_archive.js is at most 400 lines, and
split the oversized describe blocks in the two height test files so no
function spans more than 60 lines.
…al DB name

Under a non-default NODE_PREFIX with an external database, a decoder or
indexer whose DB name is still the unprefixed default would read and
write the default stack's data. Refuse before anything is torn down.
Compact the legacy DB name collision check into one function and
tighten a few multi-line constructs so the file holds 400 lines.
Behaviour is unchanged.
The host-port conflict check fell back to a real docker ps when the docker_service stub omitted it, so the suites failed on any host with running containers.
getModuleDatabaseName and the decoder/indexer DB user names now carry the sanitized NODE_PREFIX when it is not the default; default names are unchanged. The prefix scope test snapshots and restores the src require cache and NODE_PREFIX.
Fold the prefixed module DB user call onto the existing defaults line and shorten the nodePrefixSegment comment to three lines.
The guard checked the derived default database name, so an operator who set
INDEXER_DB_NAME or DECODER_DB_NAME had the wrong database inspected. Resolve
the name through configuredDatabaseName, falling back to the default with a
warning when the config cannot be read.
Hand XC_OFFER_LIST_REGTEST_ACTIVATION to the hub and
EXACT_INTEGER_WIRE_FIELDS_REGTEST_TIME to a regtest indexer only, and
declare both in the env views. Adds a passthrough test.
…ull requests

Contributors now branch off develop and open pull requests against it, as the docs and PR template say. A new pull_request_target check fails any pull request into master that is not this repository's own develop, release/* or hotfix/* branch, and CI now runs on pull requests into develop.
Each throwaway keyring starts a gpg-agent bound to its homedir. Run
gpgconf --kill gpg-agent against that same home before removing it so the
agent and its socket do not outlive the run.
…gh configured names

Derived decoder and indexer database and user names now carry a segment that is
injective in the raw NODE_PREFIX (digest when folding is lossy or the prefix is long)
and is capped so the indexer name plus _HubMirror stays within 64 characters.
Database reset resolves targets through configuredDatabaseName, and the migration
precondition guard warns when a non-default prefix stack is on the unprefixed default
name.
Export resolveResetTargets and resolveCheckedDatabaseName so the suite
can drive them directly. Add tests that the legacy-collision refusal in
buildAndUp fires first for decoder and indexer, that reset targets and
the precondition precheck use the configured name, and that every raw
getModuleDatabaseName caller routes through configuredDatabaseName.
…amed steps

Brings the prefix-scoped database name change inside the code-structure baseline: require()
at the top of module_database_name.js, and the prefixed-load hooks and nested suites as named
functions so no test function runs past 60 lines.
A service can be alive and pass its healthcheck while not serving the chain: an
indexer reporting ready false on /status, an indexer holding a hub barrier past
its ceiling (which the stall reducer still calls a healthy defer), or a decoder
reporting ready false on /live. ps now reads those fields, appends NOT READY to
the row, records not_ready with its reasons, and prints a note naming them. An
older image without the fields, or a route that cannot be read, keeps the plain
running row.
…t, and keep the signed reveal when only its broadcast fails
Fixes the defects, doc drift and test gaps this repo carried on the
review board and the test-gap board, 37 files.
Synced from xchain-hub/src/coins by bin/sync-coins.sh: the BTC and DOGE
mainnet genesis ledgerHash and dumpHash move after BASE, DASH, HBAR, HOOD,
HYPE and NEAR left the genesis manifests. No testnet or regtest value moves.

The vendored-file identity pin is re-taken for the new coin file bytes.
Treat permission-denied lock and reclaim marker reads as held so stale reclamation cannot remove files whose ownership cannot be verified. Document the lock directory override and cover both permission errors.
Add direct unit coverage for filtering, network defaults, service defaults, and credential sidecars.
Add isolated coverage for argument resolution, coin defaults, database credentials, and shared defaults through the split module exports.
Place the unreadable-lock case in a dedicated test group so each callback remains within the repository readability limit.
Keep the acquisition behavior summary within the repository comment style limit.
Group related cases behind named registration functions so each test callback remains compact.
Keep each behavior-focused describe callback within the repository readability limit.
Keep the required direct module suites outside the authored directory size count.
Keep the required direct module entry points while excluding generated suites from readability directory counts.
The test named v0.23.0, which resolved without a network read only while the bundled manifest was 0.23.0; the v0.24.0 manifest made it fetch against an empty stub.
@jdogresorg
jdogresorg merged commit 44d65c2 into master Oct 17, 2026
8 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