Releases: sentrix-labs/sentrix
v2.1.47 — eth_call → revm wiring + EIP-7825 gas cap fix
Mainnet eth_call now actually executes against revm + live chain state. Previously stubbed; canonical-contract reads (WSRX.name(), Multicall3.getCurrentBlockTimestamp(), etc) returned 0x empty. Two PRs land the full fix: #389 wires the revm dispatch path, #391 caps the dry-run gas at the EIP-7825 limit so revm doesn't reject every call.
Highlights
eth_call+eth_estimateGasroute through revm (#389) — backed bySentrixEvmDb::from_account_db(&bc.accounts)so storage slots load on-demand from real chain state. Address normalization added so EIP-55 checksummed addresses resolve correctly against lowercaseAccountDBkeys.- EIP-7825 gas cap fix (#391) — adds
TX_GAS_LIMIT_CAP = 16_777_216constant tosentrix-evm::gasand clamps eth_call dry-run gas at this value instead ofBLOCK_GAS_LIMIT(30M). revm with SpecId ≥ Osaka rejectsgas_limit > capwithTxGasLimitGreaterThanCapeven for read-only dry-runs; pre-fix every eth_call returned0xempty. - Genesis comment (#390) —
genesis/mainnet.tomlclarifies v2 → v3 founder admin transfer history (block 444070, 2026-04-24). Comment-only. - Doc cleanup (#392, #394) — README + CHANGELOG + NETWORKS bump v2.1.44 → v2.1.46; CHANGELOG renames stale
[2.1.42]label to[2.1.45]to match git tag history.
Verify
After deploying this binary:
cast call 0x4693b113e523A196d9579333c4ab8358e2656553 "name()(string)" --rpc-url https://rpc.sentrixchain.com # → "Wrapped SRX"
cast call 0x4693b113e523A196d9579333c4ab8358e2656553 "decimals()(uint8)" --rpc-url https://rpc.sentrixchain.com # → 18
cast call 0xFd4b34b5763f54a580a0d9f7997A2A993ef9ceE9 "getCurrentBlockTimestamp()(uint256)" --rpc-url https://rpc.sentrixchain.comMainnet binary built from this exact tree was running on all 4 validators tonight after the recover-mainnet.sh smoke test.
See CHANGELOG.md for the full file-by-file changelog.
v2.1.46 — AddSelfStake mainnet activation + reset-trie CLI
Mainnet activation of StakingOp::AddSelfStake for non-phantom validator self-bond. vps3 unjailed via real-SRX self-bond. 4-of-4 validators active. Workspace version bumped 2.1.44 → 2.1.46 across root + every internal crate.
Highlights
StakingOp::AddSelfStake(#385) — supply-invariant validator self-bond. Validators can bond real SRX into their ownself_stakewithout the phantom-mint that pre-PR-#384force-unjailproduced. Fork-gated atADD_SELF_STAKE_HEIGHT=731245on mainnet.reset-trieCLI flag (#384) — unblock force-unjail recovery on non-genesis chains.- Operator-host references scrub (#386, #387) — IP-allowlist references in tools, source comments, audit docs replaced with generic
RPC_BASE_URLenv var pattern. - Workspace
Cargo.toml(#388) — bumpedversion = "2.1.44" → "2.1.46"across root + every internal crate + bin (uniform).
See CHANGELOG.md for the full file-by-file changelog.
v2.1.45 — Phase A→D consensus-jail full stack + testnet bootstrap
The asymmetric-application bug class is now fixed at the protocol level. Phase A (data types) shipped earlier in #359; this release ships Phase B (helpers + fork gate), Phase C (dispatch verification), and Phase D (proposer emission + Pass-1/Pass-2 wiring + 4-validator determinism harness). Default behavior unchanged: JAIL_CONSENSUS_HEIGHT=u64::MAX on default builds means the entire dispatch path is unreachable until an operator opts in.
Also bootstraps testnet activation (genesis/testnet.toml + faucet HTTP service binary) plus an internal-references hygiene scrub.
Highlights
- Phase A→D consensus-jail (#365, #366, #368, #369, #371, #372) — full stack code-complete, dormant pre-fork. Activation = halt-all + simul-start with
JAIL_CONSENSUS_HEIGHT=<height>. genesis/testnet.toml(#374) — chain_id 7120, mirrors mainnet allocations + 100M-SRX faucet wallet.bin/sentrix-faucet/(#374) — standalone HTTP faucet service with per-IP rate limiting + per-recipient cooldown.- NFT TokenOp data types (#379) — SRC-721 + SRC-1155 wire format stable, fork-gated dormant.
- EVM CREATE nonce fix (#381) — skip native nonce bump for EVM txs (Option A).
- Network log + zero-peer broadcast fix (#380).
- Internal-refs scrub round 2 (#373, #378).
- CI — workflow uploads
sentrix-faucetrelease binary as a workflow artifact (#375).
See CHANGELOG.md for the full file-by-file changelog.
v2.1.44 — distribute_reward + epoch tracking on libp2p apply paths
Extends PR #356 pattern (asymmetric record_block_signatures) to 2 more bookkeeping calls that were missing on libp2p apply paths.
Fixed
- distribute_reward now called from gossip + direct + sync libp2p apply paths
- epoch_manager.record_block now called from same paths
Why
Latent consensus-divergence bug. Validators catching up via libp2p sync had stale pending_rewards / delegator_rewards / epoch_manager state. ClaimRewards on stale state = different balances credited per validator = consensus break.
HIGH severity, masked by chain.db rsync recovery procedure but would manifest in long-running multi-validator network.
Deploy
SHA256: 388799c7a478c71b1d024599575102095b830d9883de6bdbab3880b739e8795d. Halt-all + simultaneous-start to all 4 mainnet validators 2026-04-27. Chain advancing post-deploy.
Tests
779 passed, 0 failed.
v2.1.43 — Root-cause fix for asymmetric recording bug
Fixes the asymmetric record_block_signatures pattern that caused the 2026-04-26 + 2026-04-27 jail-cascade stalls.
PRs #350-#355 shipped observability + bandaids (gate relaxation). This release ships the actual fix: libp2p apply paths now record liveness consistently with validator finalize paths.
Bug
record_block_signatures was called from validator finalize paths in main.rs (self-produce + BFT-finalize) but NOT from libp2p catch-up sync/gossip apply paths in libp2p_node.rs. Result: per-validator LivenessTracker carried ~33% baseline missed gap on peer-views vs ~99% self-view. Real downtime nudges peer-view below 30% threshold → divergent jail decisions → BFT stall.
Confirmed empirically on testnet at h=558000 (see audits/jail-cascade-root-cause-analysis.md empirical confirmation section).
Fix
3 sites in crates/sentrix-network/src/libp2p_node.rs now call slashing.record_block_signatures after each successful peer-block apply:
- Gossip block apply
- Direct peer block apply
- libp2p sync (catch-up)
Each: if block has BFT justification (post-Voyager), record precommit signers against active_set.
Behavior change
Pre-fix: peer-applied blocks DON'T record liveness → asymmetric tracker
Post-fix: ALL applied blocks record liveness → consistent tracker across fleet
Existing tracker state on running validators carries the asymmetric bug baseline; self-corrects over LIVENESS_WINDOW = 14400 blocks (~4 hours at 1s) as gappy entries roll out.
Tests
cargo test --workspace: 775 passed, 0 failed. Clippy clean.
Deploy
Built via docker bullseye. SHA256: e2a5e1ec0af9b354c307bfb62b5e1a5e0a0e3495b78f7a8a371b438c28b12132. Deployed to all 4 mainnet validators 2026-04-27 via halt-all + simultaneous-start. Chain advancing healthy post-deploy.
v2.1.41 — Jail-cascade observability + fork-gated BFT gate relaxation
Liveness fix bundle for the jail-cascade pattern observed 2x on 2026-04-26 (mainnet stalls h=633599 + h=662399).
Ships
1. Observability metric (PR #350)
DEBUG-level tracing snapshot of per-validator (signed_count, missed_count) every 1000 blocks. Operators diff per-validator counts via 'journalctl -u sentrix-node -g jail counter snapshot' to detect divergence early — halt-all-rsync preemptively before BFT stall.
2. Audit + design docs (PR #350)
- audits/jail-cascade-root-cause-analysis.md — full RCA
- audits/consensus-computed-jail-design.md — long-term fix design (4-6 week implementation)
3. Fork-gated BFT safety gate relaxation (PR #351)
- BFT_GATE_RELAX_HEIGHT env var (default u64::MAX = disabled)
- Pre-fork: gate uses MIN_BFT_VALIDATORS (=4) — current behavior, unchanged on default
- Post-fork: gate uses ⌈2/3 × total⌉ supermajority (= 3 for 4-validator network = 1-jail tolerance)
Default v2.1.41 binary behavior = identical to v2.1.40. Activation requires operator to set BFT_GATE_RELAX_HEIGHT env var per validator (after testnet bake).
Deploy
Binary built via docker bullseye (rust:1.95-bullseye). SHA256: 74bd3cd68af46600c4ad8c6693212bd42c4eb022ffd956ef94deaa54ba2f3144. Deployed to all 4 mainnet validators 2026-04-27 via halt-all + simultaneous-start.
Tests
cargo test --workspace: 774 passed, 0 failed, 11 ignored (was 772 in v2.1.40, +2 new regression tests for BFT gate). Clippy clean.
Migration
Drop-in chain.db compatible with v2.1.40. Hot-swap binary safe.
To activate fork (post-testnet-bake):
- Set BFT_GATE_RELAX_HEIGHT=<future_height> on each validator's systemd EnvironmentFile
- Halt all + simultaneous-start (per feedback_mainnet_restart_cascade_jailing rule)
v2.1.40 — Explorer richlist percentage display fork-aware
Display-only polish PR. Closes the last 3 sites that still used static MAX_SUPPLY (210M) for percentage-of-supply display, even though consensus + /chain/info RPC display were already fork-aware in v2.1.39.
After tokenomics v2 fork activated on mainnet at h=640800 (2026-04-26), /explorer/richlist HTML page, GET /accounts paginated endpoint, and GET /accounts/richlist REST endpoint were still calculating percentages against pre-fork 210M cap — making top holders look ~33% smaller than reality.
Fixed
crates/sentrix-rpc/src/explorer.rs— Rich List HTML: percentage calc + 'Total supply: N SRX' footer string both now usebc.max_supply_for(bc.height()). Pre-fork: 210M, post-fork: 315M.crates/sentrix-rpc/src/explorer_api.rs—GET /accountspaginated percentage calc now fork-aware. Removed unusedMAX_SUPPLYimport.crates/sentrix-rpc/src/routes/accounts.rs—GET /accounts/richlistREST endpoint percentage calc now fork-aware.
No consensus impact
Touches only sentrix-rpc (display layer). No changes to sentrix-bft, sentrix-core::block_executor, sentrix-trie, sentrix-staking::distribute_reward, sentrix-evm::executor. Drop-in chain.db compatible with v2.1.39.
Tests
cargo test --workspace: 772 passed, 0 failed, 11 ignored. cargo clippy --workspace --tests -- -D warnings: clean.
Migration
No operator action required. Hot-swap binary at any time. Recommend halt-all + simultaneous-start cadence (~5s downtime).
v2.1.39 — Tokenomics v2 fork (BTC-parity halving + 315M cap)
Tokenomics v2 fork — ACTIVE on mainnet since h=640800 (2026-04-26 evening)
This is the first major release since v2.1.25, rolling up the work of the 2026-04-26 marathon (intermediate versions v2.1.26 through v2.1.38 were deployed via fast-deploy without standalone GitHub Releases).
Highlights — tokenomics v2 fork
Re-targets emission curve to BTC-parity 4-year halving (126M blocks at 1s) + raises MAX_SUPPLY from 210M to 315M. Closes the v1 math gap (geometric series asymptoted at 84M from mining → 147M effective max, not the 210M originally documented).
Side benefits:
- Validator runway extended to ~year 20
- Premine ratio drops 30% nominal → 20% (industry-leading optics)
- Math correctness — 1 SRX × 126M × 2 + 63M premine = 315M (geometric series reaches cap)
Mainnet activation: h=640800 (2026-04-26 evening WIB)
Testnet activation: h=381651 (2026-04-26 afternoon WIB)
Activation procedure: halt-all + simultaneous-start (per feedback_mainnet_restart_cascade_jailing rule)
Consensus changes
MAX_SUPPLY_V2 = 315_000_000 × 100_000_000 sentri(315M SRX)HALVING_INTERVAL_V2 = 126_000_000 blocks(4-year cadence at 1s blocks)TOKENOMICS_V2_HEIGHT_DEFAULT = u64::MAX— env-gated activation- Runtime-aware dispatchers:
max_supply_for(h),halving_interval_for(h),halvings_at(h) get_block_reward()migrated to fork-aware dispatch — single dispatch surface
RPC display
chain_queries.rschain_stats()max_supply_srxis fork-aware (was staticMAX_SUPPLY)- Pre-fork RPC reports 210M, post-fork reports 315M
/chain/info,/sentrix_statusnow showconsensus: "DPoS+BFT"on mainnet
Cumulative roll-up: v2.1.26 → v2.1.39
Beyond the tokenomics fork, this release rolls up substantial work from the 2026-04-26 marathon:
Voyager mainnet activation (v2.1.26 → v2.1.30):
- Voyager DPoS+BFT activated on mainnet at h=579047 (2026-04-25)
- EVM activated on mainnet at h=579060
- Bootstrap-peers fix applied to all 4 validator systemd units
- Cold-start gate prevents BFT entry before peer mesh converges
V4 reward distribution v2 (v2.1.31):
- Coinbase 1 SRX/block routes to PROTOCOL_TREASURY (
0x0000…0002) - Validators + delegators claim escrowed rewards via
StakingOp::ClaimRewards - Treasury escrow proven end-to-end (Core claimed 2751 SRX successfully)
- Activation height: 590100 (2026-04-25)
libp2p hardening (v2.1.32 → v2.1.36):
- Connection-leak hardening (#319/#321/#323/#326 series)
- Multiaddr advertisement protocol (
sentrix/validator-adverts/1) - Peer auto-discovery + dial-tick (every 30s)
- Keystore unlock UX improvements
Mainnet P0 stall fix (v2.1.37/v2.1.38):
- libp2p sync cascade-bail race fix (#334)
- Legacy TCP-path deletion (~800 LOC removed)
- Cumulative skip-counter observability metric (
SYNC_SKIPPED_TOTAL) - 4-way chain.db divergence recovered via Treasury rsync (MD5 =
567c7165...)
Recent incidents (recovered)
2026-04-26 morning — h=604547 stall (libp2p sync cascade-bail). Recovered via chain.db rsync from Treasury canonical. Fix: PR #334 (v2.1.37 race-safe filter).
2026-04-26 evening — h=633599 stall (rolling-restart jail-cascade after TOKENOMICS_V2_HEIGHT env-var rollout). Recovered via halt-all + chain.db rsync from Treasury canonical. New rule: rolling restart on mainnet has same jail-cascade pattern as testnet — use halt-all + simultaneous-start for env-var changes.
Public infrastructure
- Chain RPC/API/explorer/faucet now canonically on
*.sentrixchain.com(was*.sentriscloud.comaliases) https://docs.sentrixchain.com— Docusaurus-powered documentation site live (self-hosted)- 35 production subdomains, 18 active emails
- Brand positioning locked-in 2026-04-26 (
Where real assets livetagline)
Migration
Drop-in chain.db compatible with all v2.1.x. Pre-fork blocks unaffected. total_minted continues monotonically. Cap check uses fork-aware max_supply_for(h).
PRs included
#316 → #347 (32 PRs total). Major:
- #336 consensus: tokenomics v2 fork — 126M halving + 315M cap
- #337 fix(rpc): /chain/info max_supply_srx is fork-aware
- #334 libp2p sync cascade-bail fix + legacy TCP deletion
- #330 V4 reward v2 + ClaimRewards
- #324 Voyager mode runtime check
- #319/#321/#323/#326 libp2p connection-leak hardening series
Tests
cargo test --workspace
cargo clippy --workspace --tests -- -D warnings
cargo deny checkAll passing on the v2.1.39 commit.
Documentation
- Whitepaper bumped to v3.4 (post tokenomics-v2 fork)
- Documentation site: https://docs.sentrixchain.com
- Whitepaper: https://github.com/sentrix-labs/sentrix/blob/main/WHITEPAPER.md
Verified state at release time
- Mainnet h~660K+, all 4 validators in BFT supermajority parity
- Public RPC: https://rpc.sentrixchain.com → 200,
consensus: "DPoS+BFT",max_supply_srx: 315000000 - Chain ID: 7119 mainnet, 7120 testnet
eth_chainIdreturns0x1bcf(mainnet),0x1bd0(testnet)
v2.1.25 — Emergency Pioneer override (Voyager rollback)
Hotfix released after the 2026-04-25 mainnet Voyager activation incident. SENTRIX_FORCE_PIONEER_MODE=1 forces Pioneer mode regardless of persistent voyager_activated flag. Mainnet recovery deployment used this binary. See CHANGELOG.md + incident doc.
v2.1.24 — Phase 1 mainnet legacy-compat (#268 closed)
Closes #268 via Path B: SENTRIX_LEGACY_VALIDATION_HEIGHT env-gated tolerance for historical chain.db artifacts. Unfreezes mainnet deployment. See CHANGELOG.md.