Skip to content

Releases: sentrix-labs/sentrix

v2.1.47 — eth_call → revm wiring + EIP-7825 gas cap fix

28 Apr 12:22
a2db4e1

Choose a tag to compare

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_estimateGas route through revm (#389) — backed by SentrixEvmDb::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 lowercase AccountDB keys.
  • EIP-7825 gas cap fix (#391) — adds TX_GAS_LIMIT_CAP = 16_777_216 constant to sentrix-evm::gas and clamps eth_call dry-run gas at this value instead of BLOCK_GAS_LIMIT (30M). revm with SpecId ≥ Osaka rejects gas_limit > cap with TxGasLimitGreaterThanCap even for read-only dry-runs; pre-fix every eth_call returned 0x empty.
  • Genesis comment (#390) — genesis/mainnet.toml clarifies 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.com

Mainnet 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

28 Apr 12:15
1bb9904

Choose a tag to compare

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 own self_stake without the phantom-mint that pre-PR-#384 force-unjail produced. Fork-gated at ADD_SELF_STAKE_HEIGHT=731245 on mainnet.
  • reset-trie CLI 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_URL env var pattern.
  • Workspace Cargo.toml (#388) — bumped version = "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

28 Apr 12:15
3ee0316

Choose a tag to compare

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-faucet release 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

27 Apr 06:33
b2dbbd2

Choose a tag to compare

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

27 Apr 04:19
b2bb135

Choose a tag to compare

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:

  1. Gossip block apply
  2. Direct peer block apply
  3. 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

27 Apr 01:31
f43741d

Choose a tag to compare

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):

  1. Set BFT_GATE_RELAX_HEIGHT=<future_height> on each validator's systemd EnvironmentFile
  2. Halt all + simultaneous-start (per feedback_mainnet_restart_cascade_jailing rule)

v2.1.40 — Explorer richlist percentage display fork-aware

26 Apr 23:21
2b7e42e

Choose a tag to compare

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 use bc.max_supply_for(bc.height()). Pre-fork: 210M, post-fork: 315M.
  • crates/sentrix-rpc/src/explorer_api.rsGET /accounts paginated percentage calc now fork-aware. Removed unused MAX_SUPPLY import.
  • crates/sentrix-rpc/src/routes/accounts.rsGET /accounts/richlist REST 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)

26 Apr 21:54
baf0309

Choose a tag to compare

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.rs chain_stats() max_supply_srx is fork-aware (was static MAX_SUPPLY)
  • Pre-fork RPC reports 210M, post-fork reports 315M
  • /chain/info, /sentrix_status now show consensus: "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.com aliases)
  • 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 live tagline)

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 check

All passing on the v2.1.39 commit.

Documentation

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_chainId returns 0x1bcf (mainnet), 0x1bd0 (testnet)

v2.1.25 — Emergency Pioneer override (Voyager rollback)

25 Apr 09:09
f3f6dae

Choose a tag to compare

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)

25 Apr 07:37
ec209f2

Choose a tag to compare

Closes #268 via Path B: SENTRIX_LEGACY_VALIDATION_HEIGHT env-gated tolerance for historical chain.db artifacts. Unfreezes mainnet deployment. See CHANGELOG.md.