LIPs implemented
Audits
- 07-2026 Certora Staking Router v3 Security Audit Report
- 07-2026 MixBytes Staking Router v3 Upgrade Audit Report
- 07-2026 Statemind Staking Router v3 Audit Report
PRs included
Features
- feat: staking router 3.0 consolidation by @mkurayan in #1431
- feat: MaxEB initial deposits by @Amuhar in #1412
- feat: SRv3 accounting by @eddort in #1445
- feat: sr refactor + share target allocation strategy lib by @krogla in #1447
- feat: set withdrawalCredentials02 in migration_v4 by @Amuhar in #1456
- feat: top up merkle proofs & predeposits by @Amuhar in #1616
- feat: SRv3 pull model by @Amuhar in #1635
- feat: remove pending deposits proofs/balance proofs, change obtainDepositData sign for top up by @Amuhar in #1642
- feat: SR3 FastLane, report-dependent deposit pause, MinFirstAllocLib by @krogla in #1644
- feat: SRv3 consolidation by @eddort in #1639
- feat: top up debug event by @Amuhar in #1659
- feat: SRv3 report hook fix by @krogla in #1661
- feat: add module maxEB getter by @krogla in #1668
- feat: VEBO SRv3 fix by @krogla in #1669
- feat: VEBO(srv3) rework sanity checks number of requests -> balance by @hweawer in #1643
- feat: align getProcessingState interface by @mkurayan in #1684
- feat: replace FastLane with buffered ether allocation by @Psirex in #1690
- feat: track only pending batches in the consolidation bus by @mkurayan in #1692
- feat: add updateModuleShares method to SR by @mkurayan in #1694
- feat: staking router 3.0 AO checks review notes by @mkurayan in #1698
- feat: pause consolidation requests processing when DSM stopped deposits by @mkurayan in #1699
- feat: use AccessControlEnumerable for non-upgradable contracts by @mkurayan in #1707
- feat: AO sanity checks by @eddort in #1681
- feat: staking router 3.0 pending deposits sanity checks by @eddort in #1714
- feat: SRv3 Lido prevent deposits by @krogla in #1719
- feat: staking router 3.0 WV refactoring by @mkurayan in #1713
- feat: bump oracle version by @mkurayan in #1721
- feat: staking router 3.0 deposit allocation by @mkurayan in #1717
- feat: rename CL top up verifier -> CL validator verifier by @Amuhar in #1732
- feat: staking router 3.0 consolidation improvements by @mkurayan in #1736, #1744
- feat: enforce consistent modules fee by @krogla in #1748
- feat: new deposit tracker by @krogla in #1729
- feat: wrap consolidation requests to struct by @mkurayan in #1752
- feat: replace GateSeal with CircuitBreaker in scratch deploy by @failingtwice in #1761
- feat: add external pending balance cap to OracleReportSanityChecker by @eddort in #1771
- feat: TopUpGateway duplicates algorithm optimization & gas test by @Amuhar in #1760
- feat: deploy SRv3 on Hoodi testnet by @F4ever in #1773
- feat: update UpgradeTemplate for Hoodi by @eddort in #1780
- feat: SRv3 upgrade-voting script by @krogla in #1715
- feat: add consolidation GW pauser by @krogla in #1794
- feat: expose sanity checker migrations getters by @eddort in #1842
- feat: SRv3 update 1 by @krogla in #1821, #1887
- feat: deploy external staking modules in scratch by @skhomuti in #1845
- feat: register staking module circuit breaker pausers by @skhomuti in #1901
- feat: SRv3 deployment by @tamtamchik in #1900, #1912
- feat: implement top-up integration by @eddort in #1914
Fixes
- fix: oracle reporting by @krogla in #1455
- fix: tracker by @Amuhar in #1452
- fix: consolidation fixes by @mkurayan in #1486
- fix: staking router v3 deploy upgrade step by @Amuhar in #1525
- fix: deposit tracker by @Amuhar in #1544
- fix: consolidation migration validator by @eddort in #1650
- fix: disable _checkAnnualBalancesIncrease for devnet 1 by @eddort in #1651
- fix: Lido size, v4 migration by @krogla in #1660
- fix: migration v4 fix + review by @Amuhar in #1665
- fix: deposits flow review fixes by @Amuhar in #1670
- fix: external -> public BeaconChainDepositor lib by @Amuhar in #1676
- fix: SRv3 constructor params by @krogla in #1687
- fix: console warnings by @mkurayan in #1683
- fix: pubkey length error name & sr balance after deposit check by @Amuhar in #1689
- fix: extend module state getters with balances by @krogla in #1696
- fix: storage slots optimization, minor refactor by @krogla in #1697
- fix: remove key index from checks by @hweawer in #1695
- fix: top up gateway slot check -> timestamp check & sr deposits 0 revert by @Amuhar in #1703
- fix: some updates based on review by @tamtamchik in #1702
- fix: add REMOVE_ROLE, minor refactor by @krogla in #1705
- fix: SR roles storage migration by @krogla in #1706
- fix: disable upgrade until report by @krogla in #1725
- fix: prevent sr finalize until report by @krogla in #1726
- fix: module balance sanity checks and add integration coverage by @eddort in #1735
- fix: update consensusVersion for accounting and VEBO by @eddort in #1758
- fix: update sanity checker deploy params for testnet by @eddort in #1759
- fix: sanity checker cold start by @eddort in #1762
- fix: deploy and upgrades scripts by @krogla in #1798
- fix: add upgrade checks (cons. migrator) by @krogla in #1800
- fix: top up max value and pause + Statemind audit fixes by @Amuhar in #1820
- fix: Statemind audit fixes by @krogla in #1818
- fix: SRv3 sanity checker by @eddort in #1803
- fix: SRv3 add DSM version to sig by @eddort in #1837
- fix: remove IStakingRouter interface wrap by @Amuhar in #1841
- fix: broken simulation exactly in refSlot + naming refactor by @krogla in #1835
- fix: move duplicated indices check into common cycle, remove extra withdrawable_epoch check by @Amuhar in #1848
- fix: minor fixes by @krogla in #1849
- fix: skip deactivated node operator by @failingtwice in #1859, #1860
- fix: vote items count by @mkurayan in #1866
- fix: remove nonexistent roles from sanity checker voting validation by @mkurayan in #1867
- fix: GW pauser by @krogla in #1870
- fix: small CSM fixes by @madlabman in #1871
- fix(srv3): AOSC handling of 36-day report gaps, adjustedWindowBalance invariant, docs by @eddort in #1865
- fix: revert DSM version in message by @Amuhar in #1878
- fix: update gIndex for top-up gateway by @mkurayan in #1893
- fix: CSM deploy dir by @vgorkavenko in #1889
- fix: deployer signer, streamline artifacts by @krogla in #1907
Refactor & chore
- refactor: improve comments by @mkurayan in #1674
- chore: SRv3 code cleanup by @krogla in #1675
- refactor: rename balance by @mkurayan in #1682
- refactor: clean-up code by @mkurayan in #1688
- refactor: unify modules interface by @mkurayan in #1686
- refactor: fix typo in executor role name by @mkurayan in #1700
- refactor: pause and resume roles keccak by @mkurayan in #1708
- chore: rename interface by @mkurayan in #1712
- chore: remove dead code by @tamtamchik in #1710
- chore: try to bypass code complexity by @tamtamchik in #1720
- chore: fix dev comment for DSM canDeposit method by @Amuhar in #1722
- refactor: SR modules data validation flow by @eddort in #1751
- chore: SRv3 voting script review by @mkurayan in #1765
- chore: configure source and target module for consolidation migrator in scratch deploy by @mkurayan in #1768
- chore: fix CSM module naming by @chasingrainbows in #1802
- chore: SRv3 vote checker migration by @krogla in #1801
- chore: scripts for redeploy WV impl by @krogla in #1815
- chore: canDeposit description by @Amuhar in #1823
- chore: SRv3 refactor by @eddort in #1772
- chore: delete canTopUp & unnecessary depositable keys check by @Amuhar in #1824
- chore: SRv3 upgrade vote fixes by @krogla in #1853
- chore: remove canDeposit from DSM by @Amuhar in #1856
- chore: ET factories permissions update by @madlabman in #1861
- chore: vote script comments and edits by @dgusakov in #1863
- chore: SRv3 Hoodi interim upgrade by @krogla in #1858, #1883
- chore: cleanup upgrade contracts by @krogla in #1868
- chore: cleanup checks by @krogla in #1872
- chore: DSM review comments by @Amuhar in #1879
- chore: deploy scripts, artifacts for AO fix by @krogla in #1885
- chore: SRv3 refine comments by @mkurayan in #1888
- chore: deploy scripts tidying up by @krogla in #1876
- chore: comments fixes by @mkurayan in #1896
- chore: script to run docker HardHat fork node by @krogla in #1895
- chore: code format by @mkurayan in #1898
- chore: improve voting item names by @dgusakov in #1899
- chore: upgrade vote and script fixes by @krogla in #1903
- chore: add addresses for modules to the vote config by @dgusakov in #1905
- chore: redeploy correct SRLib on Hoodi by @krogla in #1904
- chore: add ET factories to mainnet config by @madlabman in #1906
- chore: set initial epoch for CMv2 on mainnet by @madlabman in #1909
- chore: allow bypass mock upgrade steps when VOTE_ID/PROPOSAL_ID provided by @mkurayan in #1929
- chore: remove todo comment by @Amuhar in #1672
Tests
- test: unit tests for consolidation gateway by @mkurayan in #1450
- test: CLTopUpVerifier with static proofs by @Amuhar in #1646
- test: SRv3 test fixes by @krogla in #1679
- test: 10k runs for fuzz in deep profile by @dry914 in #1663
- test: fix allocation tests by @mkurayan in #1704
- test: add tests for VEB coverage by @hweawer in #1709
- test: skip circuit breaker integration tests on mainnet by @tamtamchik in #1779
- test: add CMv2 to protocol context, partial fix related tests by @krogla in #1784
- test: integration tests fix by @Amuhar in #1785
- test: fix broken state after consolidation tests, fix deposit reserve test by @krogla in #1789
- test: e2e SRv3 by @eddort in #1788, #1913
- test: top up gateway gas test scratch by @Amuhar in #1790
- test: skip consolidation tests for non-scratch environment by @mkurayan in #1791
- test: fix integration tests that depend on burner shares by @dry914 in #1793
- test: SRv3 checker tests by @mkurayan in #1799
- test: e2e oracles Hoodi by @eddort in #1792
- test: report tests deposit logic by @krogla in #1797
- test: SRv3 migration unit test by @eddort in #1786
- test: fuzzing updated by @tamtamchik in #1570
- test: fix gindex fuzz config by @dry914 in #1854
- test: e2e tests upg-params-reduce by @eddort in #1862
- test: SRv3 spec e2e by @eddort in #1869
- test: refactor integration tests by @eddort in #1886
- test: CM vote asserts by @skhomuti in #1894
- test: e2e mainnet by @eddort in #1890
- test: improve eligible node operator retrieval by @eddort in #1910
- test: simplify condition to skip CircuitBreaker integration tests by @eddort in #1911
New Contributors
- @skhomuti made their first contribution in #1845
- @vgorkavenko made their first contribution in #1889
Full Changelog: v3.0.2...v4.0.0