Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
103f7cf
fix(hub-db-sync): a full drain certifies only on the connection gener…
jdogresorg Sep 17, 2026
94b50cd
test(utility): logTimer's assertion checks the real output shape
jdogresorg Sep 17, 2026
acdffc1
docs(consensus): the mirror admission gate header names its own file
jdogresorg Sep 17, 2026
b8579ba
ci: sibling checkouts follow the pull request's base branch, keeping …
jdogresorg Sep 17, 2026
e259097
refactor(consensus): centralize explorer activation maps
jdogresorg Sep 17, 2026
91bb6c4
refactor(explorer): split datatable and chart modules
jdogresorg Sep 17, 2026
1e39b4e
test(explorer): split oversized suite callbacks
jdogresorg Sep 17, 2026
b425229
test(security): split security suite callbacks
jdogresorg Sep 17, 2026
e40d791
fix(status): include decoder replica halts
jdogresorg Sep 17, 2026
59cf678
fix(ci): share fixture identity with conformance
jdogresorg Sep 17, 2026
afa00f3
fix(test): stub the default fileGetContents resolution on the base stub
jdogresorg Sep 17, 2026
b3e8108
fix(consensus): re-cut the LTC and DOGE mirror-admission heights onto…
jdogresorg Sep 17, 2026
6b9f0b4
fix(mirror): sync streamed match anchor stamps
jdogresorg Sep 17, 2026
26f7ea5
test(explorer): split the icon re-stale predicate suite and extract i…
jdogresorg Sep 19, 2026
e9a0daf
merge: level develop with master for the v0.20.1 patch train
jdogresorg Sep 19, 2026
95a04a4
feat(lists): mark multi-leg sends, multi-leg destroys and batches wit…
jdogresorg Sep 19, 2026
f1cf28d
fix(protocol): ship LTC:testnet mirror admission as null under dq4 (a)
jdogresorg Sep 19, 2026
61eb9ad
fix(consensus): re-slide v0.20.1 BTC and DOGE activation heights
jdogresorg Sep 19, 2026
4d31c22
test: parameterize fixture host ports
jdogresorg Sep 18, 2026
58027ca
docs(ci): correct .ci-siblings dispatcher comment to match ci-dispatc…
jdogresorg Sep 18, 2026
487b053
Render rollcall consensus gates
jdogresorg Sep 20, 2026
fd6e8b2
Land row L008-25 from cx-sharp-l008-25
jdogresorg Sep 20, 2026
c1ddde4
fix(explorer): stop token page bridge route calls
jdogresorg Sep 21, 2026
1a8a8bc
Carry the ROLLCALL activation heights on getrollcallsigners
jdogresorg Sep 21, 2026
27bc953
fix(hub-db-sync): vendor the socket-epoch drain certification from th…
jdogresorg Sep 21, 2026
fc73501
fix(consensus): vendor the mirror admission boundary correction from …
jdogresorg Sep 21, 2026
8d7c434
fix(explorer): serve bridge panel reads
jdogresorg Sep 21, 2026
a349e5f
fix(explorer): distinguish a not-yet-indexed action from a nonexisten…
jdogresorg Sep 21, 2026
134e4a0
Merge: fix(explorer): distinguish a not-yet-indexed action from a non…
jdogresorg Sep 22, 2026
1e1ebef
Merge: fix(explorer): serve bridge panel reads
jdogresorg Sep 22, 2026
e38cdc7
test: guard token description fixture charset
jdogresorg Sep 22, 2026
56e37ed
Merge: test: guard token description fixture charset
jdogresorg Sep 22, 2026
368dddb
fix(explorer): give a gated FILE response its real filename
jdogresorg Sep 22, 2026
1fe34b5
Merge: fix(explorer): give a gated FILE response its real filename
jdogresorg Sep 22, 2026
abe10bc
fix(explorer): scope datatable row state
jdogresorg Sep 22, 2026
610ebd5
Merge: fix(explorer): scope datatable row state
jdogresorg Sep 22, 2026
e2dba2a
chore(observability): vendor the hub canonical module, unmatched-rout…
jdogresorg Sep 22, 2026
33768a5
build(ci): grade the fast tier on a push, defer the heavy tiers to th…
jdogresorg Sep 22, 2026
f7f6bc5
Accept contract custody addresses in balance responses
jdogresorg Sep 22, 2026
1a7e49b
fix(explorer): surface contract gas in fee history
jdogresorg Sep 22, 2026
c443dd1
fix(explorer): move the gated-file filename header out of the res.sen…
jdogresorg Sep 23, 2026
38ae4bf
docs(explorer): cite the real contract ABI spec path and the actual s…
jdogresorg Sep 23, 2026
cdff47e
fix(explorer): broadcast every indexed action type, render XBRIDGE an…
jdogresorg Sep 23, 2026
1cf8a94
fix(explorer): honour a top-level TIS title only on converted legacy …
jdogresorg Sep 23, 2026
189ba98
fix(explorer): serve the generated OpenAPI spec with typed response s…
jdogresorg Sep 23, 2026
c59cae5
Merge: fix(explorer): surface contract gas in fee history
jdogresorg Sep 23, 2026
ae81d12
Merge: Accept contract custody addresses in balance responses
jdogresorg Sep 23, 2026
1224778
fix(explorer): escape link attribute values
jdogresorg Sep 23, 2026
a7ed68e
test(explorer): save/restore prior value in disarmExplorer/disarmSdk
jdogresorg Sep 23, 2026
a53caca
docs(explorer): document the BROADCAST fee key split between endpoints
jdogresorg Sep 23, 2026
c12b589
fix(explorer): render missing action lists as dashes
jdogresorg Sep 23, 2026
49a8a52
fix(explorer): title a not-found transaction page from the requested …
jdogresorg Sep 23, 2026
5bac0d9
Merge: fix(explorer): escape link attribute values
jdogresorg Sep 23, 2026
9aef2dc
Merge: test(explorer): save/restore prior value in disarmExplorer/dis…
jdogresorg Sep 23, 2026
746ef1a
Merge: docs(explorer): document the BROADCAST fee key split between e…
jdogresorg Sep 23, 2026
88106ef
Merge: fix(explorer): render missing action lists as dashes
jdogresorg Sep 23, 2026
b4fda81
Merge: fix(explorer): title a not-found transaction page from the req…
jdogresorg Sep 23, 2026
bddb98a
fix(ci): prefer exported fixture database settings
jdogresorg Sep 23, 2026
e5bef46
fix(explorer): answer an unmatched /{COIN}/api/... path with JSON, no…
jdogresorg Sep 23, 2026
f34f804
Merge: fix(ci): prefer exported fixture database settings
jdogresorg Sep 23, 2026
37c3dc1
Merge: fix(explorer): answer an unmatched /{COIN}/api/... path with J…
jdogresorg Sep 23, 2026
de78d23
chore(hub-mirror): re-vendor ensure_tables index convergence
jdogresorg Sep 23, 2026
781f763
fix(consensus): re-slide v0.20.1 BTC and DOGE activation heights, 40h…
jdogresorg Sep 23, 2026
ce5e5f7
fix(explorer): resync vendored hub_db_sync/instance_state.js from ind…
jdogresorg Sep 23, 2026
fcac341
Merge: chore(hub-mirror): re-vendor ensure_tables index convergence
jdogresorg Sep 23, 2026
8d5851d
chore(release): v0.20.1
jdogresorg Sep 23, 2026
7cab1df
chore(consensus): remove internal rollout label from public comments
jdogresorg Sep 23, 2026
d3ce317
fix(explorer): percent-encode the tick in token icon paths and decode…
jdogresorg Sep 23, 2026
fc126e9
fix(consensus): re-slide DOGE:testnet mirror admission to the 84h tra…
jdogresorg Sep 23, 2026
875dfe5
Merge branch 'cut/v0201-dq4' into cut/v0201-land
jdogresorg Sep 23, 2026
a695cc3
http: drop the dead fonts static mount and prove every mounted direct…
jdogresorg Sep 23, 2026
2753167
Pin the Node base image by digest to the consensus runtime
jdogresorg Sep 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .ci-siblings
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
# test/unit/sibling-coverage.test.js, which reports the surface this file leaves
# uncovered; the same gap applies to a sibling that is declared but missing.
#
# ci-dispatch.sh ships each of these at its origin/master (falling back to local
# HEAD) and REFUSES the push if one is not a checkout beside this repo, so a
# declared sibling can never be silently absent.
# ci-dispatch.sh ships each of these at the pushed branch (falling back to its
# origin/master, then local HEAD) and REFUSES the push if one is not a checkout
# beside this repo, so a declared sibling can never be silently absent.

# Indexer schema conformance, list-edit resolution and reorg DDL, the
# hub-connector contract, and federation read parity (which loads the indexer's
Expand Down
12 changes: 6 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ jobs:
# sibling snapshot against a sibling still declaring the old version. That
# is unsatisfiable: the snapshot must move for the release, and develop
# must not. Empty everywhere else, which keeps the existing behaviour.
siblings-ref: ${{ (startsWith(github.head_ref, 'release/') || startsWith(github.head_ref, 'hotfix/')) && github.head_ref || '' }}
siblings-ref: ${{ (startsWith(github.head_ref, 'release/') || startsWith(github.head_ref, 'hotfix/')) && github.head_ref || github.base_ref || '' }}
# Override the Node version for a repo if ever needed:
# node-version: "20"

Expand Down Expand Up @@ -147,15 +147,15 @@ jobs:
uses: actions/checkout@v4
with:
repository: XChain-Platform/xchain-indexer
ref: ${{ (startsWith(github.head_ref, 'release/') || startsWith(github.head_ref, 'hotfix/')) && github.head_ref || (github.ref == 'refs/heads/master' && 'master' || 'develop') }}
ref: ${{ (startsWith(github.head_ref, 'release/') || startsWith(github.head_ref, 'hotfix/')) && github.head_ref || github.base_ref || (github.ref == 'refs/heads/master' && 'master' || 'develop') }}
ssh-key: ${{ secrets.XCHAIN_INDEXER_DEPLOY_KEY }}
path: xchain-indexer

- name: Check out the real hub DDL (xchain-hub)
uses: actions/checkout@v4
with:
repository: XChain-Platform/xchain-hub
ref: ${{ startsWith(github.head_ref, 'release/') && github.head_ref || (startsWith(github.head_ref, 'hotfix/') && 'master') || (github.ref == 'refs/heads/master' && 'master' || 'develop') }}
ref: ${{ startsWith(github.head_ref, 'release/') && github.head_ref || (startsWith(github.head_ref, 'hotfix/') && 'master') || github.base_ref || (github.ref == 'refs/heads/master' && 'master' || 'develop') }}
ssh-key: ${{ secrets.XCHAIN_HUB_DEPLOY_KEY }}
path: xchain-hub

Expand Down Expand Up @@ -208,7 +208,7 @@ jobs:
uses: actions/checkout@v4
with:
repository: XChain-Platform/xchain-hub
ref: ${{ startsWith(github.head_ref, 'release/') && github.head_ref || (startsWith(github.head_ref, 'hotfix/') && 'master') || (github.ref == 'refs/heads/master' && 'master' || 'develop') }}
ref: ${{ startsWith(github.head_ref, 'release/') && github.head_ref || (startsWith(github.head_ref, 'hotfix/') && 'master') || github.base_ref || (github.ref == 'refs/heads/master' && 'master' || 'develop') }}
ssh-key: ${{ secrets.XCHAIN_HUB_DEPLOY_KEY }}
path: xchain-hub

Expand Down Expand Up @@ -240,7 +240,7 @@ jobs:
uses: actions/checkout@v4
with:
repository: XChain-Platform/xchain-indexer
ref: ${{ (startsWith(github.head_ref, 'release/') || startsWith(github.head_ref, 'hotfix/')) && github.head_ref || (github.ref == 'refs/heads/master' && 'master' || 'develop') }}
ref: ${{ (startsWith(github.head_ref, 'release/') || startsWith(github.head_ref, 'hotfix/')) && github.head_ref || github.base_ref || (github.ref == 'refs/heads/master' && 'master' || 'develop') }}
ssh-key: ${{ secrets.XCHAIN_INDEXER_DEPLOY_KEY }}
path: xchain-indexer

Expand Down Expand Up @@ -271,7 +271,7 @@ jobs:
# suite, so a sibling pinned at develop makes it measure the bundled
# snapshot against a version develop is never going to carry.
with:
ref: ${{ (startsWith(github.head_ref, 'release/') || startsWith(github.head_ref, 'hotfix/')) && github.head_ref || '' }}
ref: ${{ (startsWith(github.head_ref, 'release/') || startsWith(github.head_ref, 'hotfix/')) && github.head_ref || github.base_ref || '' }}

- name: Use Node.js 22
uses: actions/setup-node@v4
Expand Down
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

## [Unreleased]

## [0.20.1] - 2026-09-23

### Fixed
- Re-slid BTC/DOGE testnet activations with LTC inert; canonical admission is non-throwing, and INERT legacy-signature mismatches stay on the invalid-row path.


### Added
- List rows mark what a reader cannot judge at a glance: a multi-recipient send, a multi-leg destroy and a batch carry a count badge that opens the legs or members under the row, and a batch member names its batch.

## [0.20.0] - 2026-09-17

### Changed
Expand Down
11 changes: 7 additions & 4 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
# Pinned to node:22-bookworm: the optional xchain-vm dependency's isolated-vm
# native build only succeeds against Node 22 V8 headers (same pin as
# xchain-indexer / xchain-utxo-tracker). The explorer itself runs on any >=22.
FROM node:22-bookworm
# Pinned by digest to the node:22.23.2-bookworm build whose V8/ICU/unicode/cldr
# match xchain-vm's consensus runtime pin: the floating node:22-bookworm tag
# moved to a Node patch whose V8/ICU no longer match, which fails that check.
# The optional xchain-vm dependency's isolated-vm native build also needs
# Node 22 V8 headers (same pin as xchain-indexer / xchain-utxo-tracker); the
# explorer itself runs on any >=22.
FROM node:22.23.2-bookworm@sha256:dd5847a04b0deee391fa145f1f4c6d214196668b6bcc7988ebed67249f226844

RUN mkdir /XChainExplorer/
# xchain-vm is staged into the build context by xchain-node's install path
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# XChain Platform Explorer

<p align="center">
<img src="https://img.shields.io/badge/version-0.20.0-blue" alt="Version">
<img src="https://img.shields.io/badge/version-0.20.1-blue" alt="Version">
<img src="https://img.shields.io/badge/tests-5%2C275%2B%20passing-brightgreen" alt="Tests">
<img src="https://img.shields.io/badge/node-%3E%3D22-green" alt="Node">
<img src="https://img.shields.io/badge/license-AGPL--3.0--or--later-blue" alt="License">
Expand Down
75 changes: 51 additions & 24 deletions bin/ci-full.sh
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,11 @@
# which publishes the same port with the same fixture credentials. Docker is
# therefore REQUIRED for those tiers, never skipped, and the fixture is recycled
# between them so each tier meets a fresh database the way each GitHub job does.
# The conformance tier is the one that reads env, and it goes to the SAME
# fixture rather than to the venue's own MariaDB. It creates four databases of
# its own (XChain_Conformance_*) and builds the real DDL inside them, which
# needs a privileged user; the venue's `ci` user holds CREATE globally but ALL
# only on ci_%, so pointing this at CI_DB_* got the databases created and then
# failed mid-DDL with "INDEX command denied" (measured on DankServer). GitHub
# gives this job its own throwaway container with root for exactly that reason,
# and the fixture is that container. Nothing here echoes or logs a password.
# The conformance tier uses the fixture selected by fixture-preflight.js. On a
# venue that is the shared CI database identity and conformance uses disposable
# ci_* schemas covered by its grants. Everywhere else it is the root identity
# of the throwaway container. bin/run-conformance.js passes the password only
# in the child environment.
#
# SKIPPED-BY-DESIGN: none. Every run-step in ci.yml has a twin below. The
# actions-only steps (actions/checkout, setup-node, npm ci, and the two
Expand All @@ -70,7 +67,37 @@ SELF="$(pwd)"
SIB="$(cd .. && pwd)"

FAILED=""
# >>> ci-tier (generated block; re-run the tier wirer to update) >>>
# Tier classes. A push grades the FAST tier only: the unit job, the pin and
# drift guards, and the structure and hygiene checks the hook runs before it
# dispatches. The tiers named below (coverage re-runs, perf scenarios) are
# skipped when the gate sets CI_TIER=fast, and each skip is recorded so the
# closing verdict can never claim a green it did not earn. Nothing stops
# being graded: a scheduled sweep re-runs this same script with CI_TIER=full
# on every repo every three hours and before any release or deploy, and a
# red there is tracked down and fixed first. CI_TIER is unset for a hand
# run, so a bare `npm run ci:full` still runs every tier as it always did.
CI_TIER_FULL_ONLY=(
"db fixture for perf (mariadb on 3307)"
"perf (test:performance)"
"coverage ratchet (coverage:check)"
)
DEFERRED=""
ci_tier_deferred() {
[ "${CI_TIER:-full}" = "fast" ] || return 1
local t
for t in ${CI_TIER_FULL_ONLY[@]+"${CI_TIER_FULL_ONLY[@]}"}; do
if [ "$t" = "$1" ]; then
DEFERRED="$DEFERRED [$1]"
echo; echo "ci:full ===== $1 DEFERRED (CI_TIER=fast, runs in the full sweep) ====="
return 0
fi
done
return 1
}
# <<< ci-tier <<<
run_tier() {
ci_tier_deferred "$1" && return 0 # ci-tier guard (generated)
local name="$1"; shift
echo; echo "ci:full ===== $name ====="
if "$@"; then
Expand All @@ -93,11 +120,6 @@ need_sib() {
done
}

export CONFORMANCE_DB_HOST="${CONFORMANCE_DB_HOST:-127.0.0.1}"
export CONFORMANCE_DB_PORT="${CONFORMANCE_DB_PORT:-3307}"
export CONFORMANCE_DB_USER="${CONFORMANCE_DB_USER:-root}"
export CONFORMANCE_DB_PASS="${CONFORMANCE_DB_PASS:-testpass}"

need_sib xchain-indexer xchain-vm xchain-sdk xchain-decoder xchain-documentation \
xchain-encoder xchain-hub

Expand Down Expand Up @@ -158,17 +180,10 @@ db_tier "integration (test:integration)" npm run test:integration
# --- job: conformance (needs: ci) ------------------------------------------
# Loads the REAL indexer, hub and decoder DDL from the sibling checkouts (the
# suite resolves them as ../xchain-*/src/sql, which is why the layout above is
# not optional) into a real MariaDB. The fixture is recycled here too; when
# CONFORMANCE_DB_* points somewhere else, the suite follows the env and simply
# leaves the fresh fixture unused.
# A run that points CONFORMANCE_DB_* somewhere other than the fixture address
# does not need the fixture at all, so a failed bring-up must not stop it.
# not optional) into a real MariaDB. The fixture is recycled here too, and the
# launcher inherits the same identity selected by fixture-preflight.js.
run_tier "db fixture for conformance (mariadb on 3307)" db_fixture_reset
if [ "$CONFORMANCE_DB_HOST" = "127.0.0.1" ] && [ "$CONFORMANCE_DB_PORT" = "3307" ]; then
db_tier "conformance: schema canary (test:conformance)" npm run test:conformance
else
run_tier "conformance: schema canary (test:conformance)" npm run test:conformance
fi
db_tier "conformance: schema canary (test:conformance)" npm run test:conformance

npm run test:integration:down >/dev/null 2>&1
echo "ci:full: db fixture torn down (no DB tiers remain)"
Expand All @@ -193,8 +208,20 @@ run_tier "drift: hub-mirror-client byte-identity" sync_mirror_check
run_tier "coverage ratchet (coverage:check)" npm run coverage:check

echo
# >>> ci-tier summary (generated) >>>
echo "ci:full: tier class ${CI_TIER:-full}"
if [ -n "${DEFERRED:-}" ]; then
echo "ci:full: DEFERRED to the full sweep:$DEFERRED"
fi
# <<< ci-tier summary <<<
if [ -n "$FAILED" ]; then
echo "ci:full: RED tiers:$FAILED"
exit 1
fi
echo "ci:full: all tiers green (same set GitHub CI runs)"
# >>> ci-tier verdict (generated) >>>
if [ "${CI_TIER:-full}" = "fast" ]; then
echo "ci:full: all FAST tiers green; the DEFERRED tiers above were NOT graded here"
else
echo "ci:full: all tiers green (same set GitHub CI runs)"
fi
# <<< ci-tier verdict <<<
2 changes: 2 additions & 0 deletions bin/db-fixture.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,15 @@ const { spawnSync } = require('child_process');
const path = require('path');

const pre = require('../test/integration/helpers/fixture-preflight.js');
const fixturePorts = require('./fixture-ports.js');

const REPO = path.join(__dirname, '..');

function compose(args, opts) {
return spawnSync('docker', ['compose', '-f', pre.COMPOSE_FILE, ...args], {
cwd: REPO,
encoding: 'utf8',
env: fixturePorts.composeEnvironment(pre.COMPOSE_FILE),
...(opts || {})
});
}
Expand Down
101 changes: 101 additions & 0 deletions bin/fixture-ports.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
#!/usr/bin/env node
'use strict';

const fs = require('fs');
const path = require('path');
const { spawnSync } = require('child_process');

const REPO = path.join(__dirname, '..');
const SPECS = Object.freeze({
'test/integration/fixtures/docker-compose.test.yml': Object.freeze({
XCHAIN_EXPLORER_DB_PORT: 3307
}),
'test/chaos/fixtures/docker-compose.chaos.yml': Object.freeze({
XCHAIN_EXPLORER_CHAOS_API_PORT: 8474,
XCHAIN_EXPLORER_CHAOS_DB_PORT: 3307
})
});

function integer(value, label) {
const text = String(value);
if (!/^(0|[1-9][0-9]*)$/.test(text)) {
throw new Error(`${label} must be a non-negative integer, got ${JSON.stringify(text)}`);
}
return Number(text);
}

function offset(env) {
const source = env || process.env;
return source.CI_PORT_OFFSET === undefined || source.CI_PORT_OFFSET === ''
? 0
: integer(source.CI_PORT_OFFSET, 'CI_PORT_OFFSET');
}

function basePort(name) {
for (const spec of Object.values(SPECS)) {
if (Object.prototype.hasOwnProperty.call(spec, name)) return spec[name];
}
throw new Error(`unknown fixture port ${name}`);
}

function port(name, env) {
const source = env || process.env;
const value = source[name] === undefined || source[name] === ''
? basePort(name) + offset(source)
: integer(source[name], name);
if (value < 1 || value > 65535) throw new Error(`${name} resolves outside the TCP port range: ${value}`);
return value;
}

function composeEnvironment(file, env) {
const spec = SPECS[file];
if (!spec) throw new Error(`unknown fixture compose file ${file}`);
const result = { ...(env || process.env) };
for (const name of Object.keys(spec)) result[name] = String(port(name, result));
return result;
}

function render(file, env) {
const spec = SPECS[file];
if (!spec) throw new Error(`unknown fixture compose file ${file}`);
let source = fs.readFileSync(path.join(REPO, file), 'utf8');
for (const [name, base] of Object.entries(spec)) {
source = source.split(`\${${name}:-${base}}`).join(String(port(name, env)));
}
return source;
}

function compose(file, args, env) {
const result = spawnSync('docker', ['compose', '-f', file, ...args], {
cwd: REPO,
env: composeEnvironment(file, env),
stdio: 'inherit'
});
if (result.error) throw result.error;
return result.status === null ? 1 : result.status;
}

function main(argv) {
const [command, name, ...args] = argv;
if (command === 'render' && name && args.length === 0) {
process.stdout.write(render(name));
return 0;
}
if (command === 'port' && name && args.length === 0) {
process.stdout.write(String(port(name)) + '\n');
return 0;
}
if (command === 'compose' && name && args.length > 0) return compose(name, args);
throw new Error('usage: fixture-ports.js <render FILE|port NAME|compose FILE ARGS...>');
}

if (require.main === module) {
try {
process.exitCode = main(process.argv.slice(2));
} catch (err) {
console.error(err.message);
process.exitCode = 1;
}
}

module.exports = { SPECS, offset, port, composeEnvironment, render };
8 changes: 4 additions & 4 deletions bin/pins/at1-explorer-identity.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
"twins": [
{
"path": "src/consensus/equivocation_header.js",
"bytes": 4171,
"sha256": "441998fc0d7cbf9cb94f79933224f1b5839981e79fb639bdda5eb0bacb07b46d"
"bytes": 4357,
"sha256": "33795d35b6133135745471fd00c93da001aef942dd1d894ff929a4ebc53fb81e"
},
{
"path": "src/consensus/gates/mirror_admission_gate.js",
Expand All @@ -30,8 +30,8 @@
},
{
"path": "src/consensus/stake_weighted_quorum.js",
"bytes": 10112,
"sha256": "ca074be59873a47b30da94c98a812771e3fb3252fea83fd5e56dbf2bd5b26ddf"
"bytes": 10294,
"sha256": "946191601217a7b2ac0e6c50d37eb6a111ba30544680aeff434f52b9f5c2d661"
}
],
"routes": {
Expand Down
Loading
Loading