luxfi/genesis 336c946 removed warpConfig from the mainnet upgrade schedule
and moved requirePrimaryNetworkSigners into the block-zero declaration,
because the EVM refuses to initialise when a live precompile is re-declared
with a different rule — a second declaration is admitted only to disable one.
These tests still asserted the arrangement that commit abandoned, so both
failed against a correct repository: one looked for a warpConfig entry that
is deliberately gone, the other compared a fixture still carrying it.
Red-review finding #8 is unchanged and now checked at its source: warp is
read from configs/mainnet/cchain.json and must require primary-network
signers, and the upgrade schedule must re-declare it nowhere. The mainnet
and testnet fixtures are re-vendored (48 entries each) and the hardcoded
canonical count follows.
Round-2 follow-up to the luxfi/genesis upgrade.json reschedule fix (17
live-at-genesis precompiles pinned to blockTimestamp 0; warp two-step
strict-PQ toggle moved after the zero-timestamp block; dead dexConfig
0x9010 dropped).
- relaunch_safety_test.go (new): drives the node's REAL fork-application
primitive extras.IsForkTransition (parent=nil reduces to fork <=
genesisTime, exactly what GetActivatingPrecompileConfigs evaluates when
a relaunched node builds its first rule set) against the embedded
canonical fixtures. Asserts the invariant: every precompile that
activates at/under the C-Chain genesis time (mainnet 1730446786 /
testnet 1730517266) is in the live-at-block-0 set AND pinned to exactly
0; every other entry is strictly future; and all 17 live precompiles are
present (no relaunch divergence). No entry sits in the (0, genesisTime]
retroactive-reschedule window.
- mainnet_upgrade_v46.json / testnet_upgrade_v47.json: regenerated
byte-for-byte from the corrected canonical genesis configs (46 / 44
entries; the 25 timestamp diffs were the 1766708400 -> 0 normalization
plus the warp reorder).
- precompile_upgrade_rollout_test.go: WarpRequiresPrimaryNetworkSigners
updated for the two-step toggle — warp is declared in the genesis
chainConfig, and the schedule carries disable@strictPQ-1 then
re-enable@strictPQ; the PQ signer-policy assertion targets the re-enable
entry, and same-key strict-increase is enforced (mirrors
verifyPrecompileUpgrades).
- upgrade_unmarshal_test.go / testnet_upgrade_unmarshal_test.go: fixture
doc comments rewritten to the live-at-0 / strict-PQ-toggle / BLS /
Quasar-Edition tier layout; RegressionProof entry-count assertion 45 ->
46 to match the embedded fixture.
Verified: go vet clean; CGO_ENABLED=0 go test ./params/extras/...
./params/extras_e2e_test/... — RelaunchSafe (mainnet+testnet),
IsForwardCompatibleWithLiveActivations, WarpRequiresPrimaryNetworkSigners,
PrecompileTimestampsAreMonotonic, RegressionProof all PASS.
node v1.30.27/28 dropped the 0x9010 DEX precompile; its config key
dexConfig is unregistered under the pinned luxfi/precompile v0.5.55, so
the vendored canonical fixtures carrying it made
TestMainnetUpgradeJSON_UnmarshalsAgainstRegistry FAIL with 'unknown
precompile config: dexConfig' (the C-Chain brick-on-boot the gate exists
to catch). Remove dexConfig from both fixtures (sync source: luxfi/genesis
configs/{mainnet,testnet}/upgrade.json, cleaned in lockstep), update the
canonical entry-count assertion 46->45, and drop dexConfig from the
lux-mainnet live-activations const so the forward-compat check stays
consistent. Verified CGO_ENABLED=0 go test ./params/extras_e2e_test/ -> ok.
Mirrors the mainnet UnmarshalJSON regression test for the lux-testnet
primary C-Chain. Embeds testnet_upgrade_v47.json (47 entries) and
asserts every key round-trips through extras.UpgradeConfig.UnmarshalJSON
against the live precompile registry.
If a future luxfi/precompile bump adds a new ConfigKey without the
corresponding RegisterModule(), or if the canonical
~/work/lux/genesis/configs/testnet/upgrade.json re-introduces an
unregistered EIP key (kzg4844Config / secp256r1Config / ed25519Config),
this test trips before the JSON ships to the cluster — closing the same
brick-on-boot footgun Red flagged on mainnet (vector 8 CRITICAL).
Sync rule: re-vendor testnet_upgrade_v47.json whenever the genesis
canonical changes — same pattern as mainnet_upgrade_v46.json.
params/extras_e2e_test/: new hermetic e2e regression-proof test that
unmarshals the canonical luxfi/genesis configs/mainnet/upgrade.json
(embedded via //go:embed) through extras.UpgradeConfig and asserts:
- precompileUpgrades count = 46
- all known config types resolve via the registry
- no unregistered EIP entries leak through
- networkUpgradeOverrides round-trip stable
Closes Red round-2 vector V12.
.github/workflows/ci.yml: drop `continue-on-error: true` from the
"Run short tests" step (kept on dependency-install and ci_setup
steps that legitimately have flaky external network deps).
CGO_ENABLED=0 still dodges the duplicate _randombytes symbol
collision from luxfi/accel cgo deps, but TEST FAILURES in that mode
must now gate CI per Red round-2 vector V19. Without this gate the
new e2e test could silently regress.