HARD-FORK HISTORY
Fork timeline — Testnet (h=0)
Below this height the node skips strict re-validation of historical blocks during MDBX warm-up, because the pre-cutover history was produced under looser invariants. From this height onward every block goes through the strict validator at boot.
Recovery path for validators that fall under `MIN_SELF_STAKE`: bond real SRX into `self_stake` directly via `StakingOp::AddSelfStake`. Pre-fork the only path was the `force-unjail` CLI, which mutated the registry without a corresponding balance debit and left the supply invariant slightly off.
Replaces the bootstrap Pioneer round-robin proposer with Voyager — Tendermint-style Propose → Prevote → Precommit → Finalize over a DPoS-elected validator set. From this height onward every block carries a `BlockJustification` with the precommits that finalised it, and finality at 2/3+1 stake weight is observable on-chain.
Pre-fork the block reward was credited directly to the proposer. Post-fork the coinbase deposits 1 SRX into the protocol treasury at `0x0000…0002`, and validators + delegators claim their accrued share via `StakingOp::ClaimRewards`. Keeps stake registry rewards and account balances in lock-step without per-block payouts.
Before this fork the chain ran native Sentrix transactions only. After activation the node embeds a revm interpreter and accepts standard EVM transactions, so Hardhat / Foundry / ethers.js / viem dApps work without any Sentrix-specific tooling.
Before this fork the block hash was computed without including the trie state root, so two validators could disagree on state and still produce identical block hashes — any disagreement only surfaced via balance queries. After activation the trie root is part of the block hash, so any state divergence triggers an immediate `previous_hash` mismatch on the next block and prevents silent forks.
Pre-fork the cap was 210M with 42M-block halvings. Post-fork: 315M cap, 126M-block halving (~4 years at 1s blocks). Tightens the issuance curve to BTC-parity for the long tail and restores the 20% premine ratio.
Originally BFT activation required every active validator to be connected at startup. Post-fork the gate relaxes to ⌈2/3 × N⌉, so the chain can recover from a single-validator outage without a coordinated halt-and-restart.
Replaces the legacy local-only `check_liveness` jail trigger with an epoch-boundary system transaction (`StakingOp::JailEvidenceBundle`, sender `PROTOCOL_TREASURY`, dispatch recompute-and-compare for auth). Every node applies identical jail state post-fork — closes the divergence class observed when LivenessTracker was per-node in-memory.
Wire format + Pass-1 gate shipped; the dispatch + storage layer that turns the parsed payload into state is not yet implemented, so activating this fork before the apply path lands would halt every validator on the first matching transaction. Stays dormant until the follow-up release ships the apply path.