Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
404 commits
Select commit Hold shift + click to select a range
54af229
chore: remove unused storage vars
mtabasco Jan 27, 2026
21b6519
WIP
mtabasco Jan 27, 2026
f5053f9
chore: remove unused storage vars (#373)
mtabasco Jan 27, 2026
3dfd3bd
chore: increase mocha tests timeout
yurii-ssv Jan 27, 2026
c79ea96
unit execute operator added
venimir-ssv Jan 27, 2026
98a9c7f
echidna tests fix
venimir-ssv Jan 27, 2026
4901296
Rename getters (#375)
yurii-ssv Jan 27, 2026
1554080
tests fixtures fix
venimir-ssv Jan 27, 2026
4607ff0
echidna stack too deep test fix
venimir-ssv Jan 27, 2026
b674dfa
run echidna always
venimir-ssv Jan 27, 2026
d6d5fff
echidna prebuild
venimir-ssv Jan 27, 2026
d108f4c
fix(ci): set FOUNDRY_OPTIMIZER=false for echidna to avoid stack too deep
venimir-ssv Jan 27, 2026
7fbb2d3
fix(foundry): disable optimizer to avoid stack too deep in echidna
venimir-ssv Jan 27, 2026
a0c27c4
Merge pull request #374 from ssvlabs/fix/operator-fee-change
venimir-ssv Jan 27, 2026
dc9f31b
chore: fetch proxy address from cli
yurii-ssv Jan 27, 2026
88f281d
feat: use baseline + deviation for operator vUnits accounting (#378)
mtabasco Jan 28, 2026
6415fde
gas optimizations on SSVOperators
yurii-ssv Jan 28, 2026
6cce1bf
fix: update ssvOperators on fork test
yurii-ssv Jan 28, 2026
79195b3
optimize accounting on reactivation (#381)
venimir-ssv Jan 28, 2026
84de659
feat: allow passing constructor parameters in scripts
yurii-ssv Jan 28, 2026
dd45669
chore: update abis
yurii-ssv Jan 28, 2026
8aea5c8
feat: update min operator fee
yurii-ssv Jan 28, 2026
401fe08
feat: update min liquidation threshold
yurii-ssv Jan 28, 2026
21ca037
fix: unit tests setup
yurii-ssv Jan 29, 2026
87a824c
Merge pull request #382 from ssvlabs/fix/unit-tests-setup
yurii-ssv Jan 29, 2026
c7bff0c
feat: add DAO-controlled minimum operator fee
venimir-ssv Jan 29, 2026
354d571
feat: update min liquidation threshold
yurii-ssv Jan 29, 2026
7c847bd
echidna fixed
venimir-ssv Jan 29, 2026
b3ffaee
Merge pull request #383 from ssvlabs/feat/dao-minimum-operator-fee
venimir-ssv Jan 29, 2026
9b8058c
feat: add totalSupply check on root commit
yurii-ssv Feb 2, 2026
8e9877a
feat: add test case for total supply check
yurii-ssv Feb 2, 2026
9b425e7
feat: replace total staked check with oracle weight
yurii-ssv Feb 2, 2026
ed5807e
feat: refactor zero weight test
yurii-ssv Feb 2, 2026
74c7de2
Merge pull request #384 from ssvlabs/feature/commit-total-supply-check
yurii-ssv Feb 2, 2026
c57bcb3
feat: fix type in cluster does not exist error
yurii-ssv Feb 3, 2026
5d05e89
feat: deprecate storage cssv address, weights and delegations
yurii-ssv Feb 3, 2026
42de9aa
feat: use total staked for weight calculation
yurii-ssv Feb 3, 2026
46a5dbf
feat: move cssv hook check to the module
yurii-ssv Feb 3, 2026
47c9f06
feat: update harnesses
yurii-ssv Feb 3, 2026
2eef963
feat: sync echidna with changes
yurii-ssv Feb 3, 2026
cc46967
feat: sync tests with weight calculation changes
yurii-ssv Feb 3, 2026
180f522
chore: remove unused imports
yurii-ssv Feb 4, 2026
b980c04
Merge pull request #386 from ssvlabs/feature/deprecate-delegations
yurii-ssv Feb 4, 2026
bbe3505
Dual-Scaling accounting (#390)
mtabasco Feb 9, 2026
e5c9e21
Remove max operator SSV fee setter and tests
venimir-ssv Feb 9, 2026
59468c0
feat: use structs as return types in getters
yurii-ssv Feb 9, 2026
8a5a08a
feat: sync tests with a new interface
yurii-ssv Feb 9, 2026
7b8cecf
Merge pull request #392 from ssvlabs/feature/strict-getter-types
yurii-ssv Feb 9, 2026
2987652
Merge pull request #391 from ssvlabs/remove-max-operator-ssv-fee
venimir-ssv Feb 9, 2026
0074b22
nat-spec (#387)
venimir-ssv Feb 9, 2026
ccc0d03
chore: remove doc
mtabasco Feb 9, 2026
621e2ff
init
venimir-ssv Feb 10, 2026
100b7c0
remove accounts fromhardhat config
venimir-ssv Feb 10, 2026
ba6bb90
skip initializing on runInTestUpgradePath
venimir-ssv Feb 10, 2026
b6e9887
feat: remove indexed from upgrade event
yurii-ssv Feb 10, 2026
60110a6
chore: sync abis
yurii-ssv Feb 10, 2026
94629d1
fix: migration accounting (#394)
yurii-ssv Feb 11, 2026
4a8e3a2
Merge branch 'ssv-staking' into feat/fork-deploy-test
mtabasco Feb 11, 2026
f6e9e9f
chore: add params in config
mtabasco Feb 11, 2026
473fefb
config updated
venimir-ssv Feb 11, 2026
2e18612
Merge pull request #393 from ssvlabs/feat/fork-deploy-test
venimir-ssv Feb 11, 2026
f8974fc
fix: settle EB balance on registration and removals (#400)
mtabasco Feb 11, 2026
67b70b3
fix: store cluster vunits on liquidation (#395)
yurii-ssv Feb 11, 2026
d15506e
DEFAULT_UNSTAKE_COOLDOWN added
venimir-ssv Feb 11, 2026
2be4d52
revert cooldown to timestamp 7 days
venimir-ssv Feb 11, 2026
16f9e4e
reuse default constants
venimir-ssv Feb 11, 2026
c1a447e
Merge pull request #402 from ssvlabs/fix/test
venimir-ssv Feb 11, 2026
c75f4b6
fix: migrated operator accounting (#399)
yurii-ssv Feb 11, 2026
5ccaf7b
fix: ignore removed operators on migration (#401)
yurii-ssv Feb 11, 2026
6045fef
Merge branch 'ssv-staking' into ssv-staking-pre-prod-fixes
mtabasco Feb 11, 2026
645ca90
fix(liquidation): prevent uint64 overflow in ETH liquidation threshold
venimir-ssv Feb 11, 2026
3d3e724
fix(accounting): prevent uint64 truncation in ETH fee settlement
venimir-ssv Feb 11, 2026
1ba16b1
fix: remove operator validators count on liquidation (#405)
yurii-ssv Feb 11, 2026
dd70c63
Merge pull request #404 from ssvlabs/fix/operator-earnings-overflow
venimir-ssv Feb 11, 2026
74f6bb7
Merge pull request #403 from ssvlabs/fix/liq-thres-overflow
venimir-ssv Feb 11, 2026
38791fa
Merge pull request #406 from ssvlabs/ssv-staking-pre-prod-fixes
venimir-ssv Feb 11, 2026
e354fd2
fix: remove double read from commit root
yurii-ssv Feb 11, 2026
460b8c9
test: add EB auto-liquidation F-2 reproduction tests
liorrutenberg Feb 11, 2026
d672184
fix: auto-liquidation now uses NEW vUnits after EB update (F-2)
liorrutenberg Feb 11, 2026
916b8ad
chore: remove comment
yurii-ssv Feb 11, 2026
e3e9534
Merge pull request #407 from ssvlabs/fix/double-read
venimir-ssv Feb 11, 2026
1f9e3a3
Merge pull request #408 from ssvlabs/test/eb-auto-liquidation-f2
venimir-ssv Feb 11, 2026
de9354d
clean DELEGATION_UPDATED event
venimir-ssv Feb 11, 2026
73c036c
fix typo
mtabasco Feb 11, 2026
bac47f0
clean unused code
venimir-ssv Feb 11, 2026
8cd3b54
Add nonReentrant to updateClusterBalance and reentrancy test
venimir-ssv Feb 11, 2026
54fbcba
Merge pull request #413 from ssvlabs/fix/update-cluster-balance-nonre…
venimir-ssv Feb 11, 2026
b431079
fix: forbid to create clusters with a removed operator (#410)
yurii-ssv Feb 11, 2026
e362e4d
fix: ignore removed operators validators count update (#412)
yurii-ssv Feb 11, 2026
a613f61
Merge pull request #409 from ssvlabs/fix/clean-unused
venimir-ssv Feb 12, 2026
95f6235
Deploy/testnet (#414)
venimir-ssv Feb 16, 2026
d8c6597
fix:slither-ci
venimir-ssv Feb 16, 2026
6223efb
fix(coverage): pin hardhat network hardfork to cancun
venimir-ssv Feb 16, 2026
f54a514
fix: simplify conditions for removed operators (#419)
mtabasco Feb 16, 2026
10a2d73
Merge pull request #418 from ssvlabs/fix/ci-slither
venimir-ssv Feb 16, 2026
1abace3
Operator getters return default ETH fee if SSV fee is set (#420)
mtabasco Feb 16, 2026
8bc1636
fix: emit reactivate event on liquidated cluster migration (#422)
yurii-ssv Feb 16, 2026
77e7797
prepara upgrade added
venimir-ssv Feb 17, 2026
b736bf8
remove ssvNetworkImplementation from prepare upgrade
venimir-ssv Feb 17, 2026
75d06dc
stage upgrade init
venimir-ssv Feb 17, 2026
e185633
update network proxy
venimir-ssv Feb 17, 2026
390c896
stage deployed
venimir-ssv Feb 17, 2026
35a9c5b
prepare upgrade testnet added
venimir-ssv Feb 17, 2026
147c21b
just command update
venimir-ssv Feb 17, 2026
7bbb226
fix: prevent double deviation cleanup on liquidated cluster validator…
liorrutenberg Feb 17, 2026
7e9110d
Merge pull request #429 from ssvlabs/fix/bug-4-double-deviation-cleanup
venimir-ssv Feb 17, 2026
fba4acb
Prepare upgrade (#425)
venimir-ssv Feb 17, 2026
01b2a2d
stage upgrade (#426)
venimir-ssv Feb 18, 2026
a6be20d
fix: prevent double deviation cleanup on liquidated cluster validator…
liorrutenberg Feb 17, 2026
a4d9c94
reinitializer version updated
venimir-ssv Feb 18, 2026
47d04e7
Merge branch 'ssv-staking' into testnet-prod-deploy
venimir-ssv Feb 18, 2026
c6e20cf
Merge pull request #430 from ssvlabs/testnet-prod-deploy
venimir-ssv Feb 18, 2026
192329f
testned upgraded (#436)
venimir-ssv Feb 19, 2026
8907edf
Fix/max unstake requests amount (#424)
yurii-ssv Feb 19, 2026
c92e001
fix(SEC-2): initialize quorumBps in upgrade initializer (#431)
liorrutenberg Feb 19, 2026
a20eabd
Refactor deployment scripts (#439)
mtabasco Feb 20, 2026
88f888a
Claude init (#427)
liorrutenberg Feb 24, 2026
9a100d8
feat: add tests for operator fees for added/removed validators (#443)
yurii-ssv Feb 25, 2026
bd61aa8
TEST-33: Mainnet governance config validation tests (#432)
liorrutenberg Feb 25, 2026
8dac0dc
fix(BUG-8): clarify cooldownDuration units as seconds in NatSpec (#433)
mtabasco Feb 25, 2026
61fb2e6
TEST-2 EB-weighted operator earnings accumulation (#444)
yurii-ssv Feb 25, 2026
a599fe2
chore: add | BUG-10 | Stale Merkle root vulnerability in
mtabasco Feb 25, 2026
4f99fb4
TEST-3 Balance delta assertions in liquidation paths (#445)
yurii-ssv Feb 25, 2026
4655fc3
TEST-4 updateClusterBalance on liquidated clusters (#447)
yurii-ssv Feb 25, 2026
aaade28
TEST-5 Oracle quorum edge cases (#449)
yurii-ssv Feb 25, 2026
6de2bde
TEST-6 EB decrease scenarios (#451)
yurii-ssv Feb 25, 2026
e6a3757
TEST-7 Reentrancy in staking functions (#452)
yurii-ssv Feb 25, 2026
076fb5d
TEST-8 Forbid creating clusters with removed operators (#453)
yurii-ssv Feb 26, 2026
638e0c9
| TEST-9 | Migration balance accounting verification (#456)
venimir-ssv Feb 26, 2026
6f3cc58
BUG-10 - Remove liquidation check in `withdraw` function (#455)
mtabasco Feb 26, 2026
f30b172
feat: tests for op with max validators
yurii-ssv Feb 27, 2026
ba4fcba
TEST - e2e scenario tests for v2.0.0 (#434)
liorrutenberg Feb 27, 2026
f11b88a
test: cover TEST-10 fee changes with EB burn-rate accounting
venimir-ssv Feb 27, 2026
19754d3
DEPLOY-4 - Remove unused error declarations
yurii-ssv Mar 2, 2026
c909a19
QUALITY-2 - Redundant SSVStorage.load() inside operator loops in SSVV…
yurii-ssv Mar 2, 2026
44fad65
DEPLOY-5 - Document operatorMinFee in DIP-X spec
yurii-ssv Mar 2, 2026
103d5a6
DEPLOY-6 - DIP-X unstaking flow doesn't match implementation
yurii-ssv Mar 2, 2026
4ed15e4
QUALITY-3 - withdraw inlines operator loop instead of using shared Op…
yurii-ssv Mar 2, 2026
401425c
TEST-11: verify network fee updates affect active cluster burn rates …
venimir-ssv Mar 2, 2026
503304a
TEST-19 - Operator removal impact on active ETH clusters
venimir-ssv Mar 2, 2026
5b343e2
TEST-32 - Add access control coverage for DAO governance functions
venimir-ssv Mar 2, 2026
1d7bb2a
TEST-10 Operator fee change + EB burn rate interaction
venimir-ssv Mar 2, 2026
57e9bb4
TEST-29 | Add contract ETH balance delta assertions to deposit tests
venimir-ssv Mar 2, 2026
2d1a171
TEST-21 EB boundary values (min/max per validator)
yurii-ssv Mar 2, 2026
8cfb515
TEST-34 Staking solvency invariant: cSSV supply must not exceed SSV h…
venimir-ssv Mar 3, 2026
27f5264
TEST-14 reactivation EB solvency checks (#472)
venimir-ssv Mar 3, 2026
94ade6e
TEST-22 Dust/precision edge cases (#473)
yurii-ssv Mar 3, 2026
9b9df56
TEST-13 multi-cycle accounting coverage (#474)
venimir-ssv Mar 3, 2026
de671c2
TEST-23 Max operator count (13) with EB
yurii-ssv Mar 3, 2026
08dca0e
TEST-24 Idempotency and double-operation checks
yurii-ssv Mar 3, 2026
fe158ee
TEST-12 multi-staker reward fairness coverage (#477)
venimir-ssv Mar 3, 2026
355ade5
TEST-26 Zero-validator cluster operation
yurii-ssv Mar 3, 2026
b79b558
TEST-25 Upgrade path (reinitializer) tests
yurii-ssv Mar 3, 2026
11e78bb
Merge branch 'ssv-staking' into test-10-fee-change-eb-burn-rate
venimir-ssv Mar 3, 2026
3fbddea
Merge pull request #482 from ssvlabs/test-10-fee-change-eb-burn-rate
venimir-ssv Mar 3, 2026
d8f8e0d
Merge branch 'ssv-staking' into fix/test-27
venimir-ssv Mar 3, 2026
0476dbd
Merge pull request #480 from ssvlabs/fix/test-27
venimir-ssv Mar 3, 2026
867516c
TEST-16 | View function coverage (SSVViews) | Unit Test Completeness …
venimir-ssv Mar 4, 2026
3969cc5
BUG-13 | Emit event when assigning default ETH fee to operators durin…
yurii-ssv Mar 4, 2026
58984fe
SSV-19 | Restrict oracle ID when replacing the default ones
yurii-ssv Mar 4, 2026
6081280
SEC-19 | `minBlocksBetweenUpdates` never initialized — EB update rate…
venimir-ssv Mar 5, 2026
dad5d6b
SEC-16b | Dust ETH stranded in `accrued` after full cSSV transfer + c…
venimir-ssv Mar 5, 2026
1ac7eca
BUG-14 & BUG-14b | Removed operator SSV fees skipped during `migrateC…
venimir-ssv Mar 7, 2026
4e17e32
SEC-13 - OperatorWithdrawn event doesn't distinguish ETH vs SSV withd…
yurii-ssv Mar 7, 2026
2704641
BUG-12 Fix — SSV Cluster removeValidator Support
venimir-ssv Mar 7, 2026
4d1689b
SSV-3 Validator registration can leave cluster immediately liquidatab…
yurii-ssv Mar 7, 2026
aa2fe76
SSV-2 Live cSSV Supply Used Per Vote in commitRoot Allows Supply Mani…
yurii-ssv Mar 8, 2026
135c880
SSV-17 - enforce latest-root-only EB updates and add unit+echidna… (#…
venimir-ssv Mar 8, 2026
0b39bf2
TEST-30 - replace deferred TODOs with exact ValidatorAdded as… (#495)
venimir-ssv Mar 9, 2026
583ea8b
SSV-16 - use SafeERC20 in rescueERC20 (#513)
venimir-ssv Mar 9, 2026
33cf842
S1 - Improve Error Handling (#514)
venimir-ssv Mar 10, 2026
0115cd8
S2 - Misleading Event Emission (#515)
venimir-ssv Mar 10, 2026
494abb8
S3 - Incorrect Code Comment (#516)
venimir-ssv Mar 10, 2026
0ff85f2
S4 - Gas Savings (#517)
venimir-ssv Mar 10, 2026
075d208
S-8 Remove unchecked arithmetic in loops (#519)
yurii-ssv Mar 10, 2026
baf079d
S-7 Code quality improvements (cluster invariants, reentrancy) (#520)
yurii-ssv Mar 10, 2026
3b1b4d1
upgrade STAGE
mtabasco Mar 10, 2026
f914b6f
chore: update spec & planning
mtabasco Mar 11, 2026
9baeaa2
TEST-28 Uncomment SSV reentrancy test assertions (#454)
yurii-ssv Mar 12, 2026
faf67fb
TEST-17 - coverage for EB-weighted staking rewards (#493)
venimir-ssv Mar 12, 2026
6186c51
ITEST-1 commitRoot -> updateClusterBalance E2E coverage (#497)
venimir-ssv Mar 12, 2026
d125e52
FUZZ-1 invariant hardening (#499)
venimir-ssv Mar 12, 2026
9e16828
BUG-15 - fix: respect operator snapshots on operator withdrawals
mtabasco Mar 12, 2026
cccb651
BUG-16 - fix: SSVNetworkViews enforce cluster version checks and unif…
yurii-ssv Mar 13, 2026
7c61ca1
QUALITY-9 - Clear fee change requests on operator removal (#526)
venimir-ssv Mar 13, 2026
00859f1
SSV-5 - fix/enforce operator fee bounds, align update function names …
venimir-ssv Mar 13, 2026
14d2629
QUALITY-5 — Remove duplicate `MaxValueExceeded` error declaration (#528)
yurii-ssv Mar 13, 2026
b702fed
chore: cleanup imports, update ABIs
mtabasco Mar 13, 2026
e1bc7e5
update MAINNET-READINESS
mtabasco Mar 16, 2026
78644b7
SEC-20 - QUALITY-10 (#536)
yurii-ssv Mar 16, 2026
7f17775
QUALITY-11 - Add RootProposed event on root commitment (#538)
yurii-ssv Mar 16, 2026
1db5247
add CONSOLIDATED-AUDIT-FINDINGS
mtabasco Mar 17, 2026
b24a5a8
BUG-17 - `commitRoot` quorum can become unreachable due to truncation…
mtabasco Mar 17, 2026
a2c97b5
QUALITY-12 - Add safecast uint128 -> uint64 (#539)
mtabasco Mar 17, 2026
3bd16b4
stage-v2.0.0-upgrade3
mtabasco Mar 17, 2026
1dfd2ff
prod-v2.0.0-upgrade2 - Metadata (#540)
mtabasco Mar 17, 2026
41a7c74
update MAINNET-READINESS CONSOLIDATED-AUDIT-FINDINGS
mtabasco Mar 18, 2026
d5eb7c7
update MAINNET-READINESS
mtabasco Mar 18, 2026
f5051df
update MAINNET-READINESS
mtabasco Mar 18, 2026
2b753b8
DEPLOY-8 - Add standalone post-upgrade config verify script (#541)
venimir-ssv Mar 18, 2026
139dc3d
OPS-1 - Create mainnet deployment runbook (#523)
mtabasco Mar 18, 2026
4010001
FUZZ-4 - Add 6 lower-priority echidna invariants (vUnit aggregation, …
yurii-ssv Mar 19, 2026
425920a
FUZZ-3 - Add 8 medium-priority echidna invariants (#483)
yurii-ssv Mar 19, 2026
b8c0eb0
add STAKING_TEST_PLAN
mtabasco Mar 19, 2026
0928826
OPS-1a - attestation proof generator (#542)
mtabasco Mar 19, 2026
336c556
QUALITY - 13 Refactor tests, fixtures, helpers and migrate e2e tests …
yurii-ssv Mar 19, 2026
390e76c
OPS-3 - .env.example updated for v2.0.0 workflows (#527)
venimir-ssv Mar 19, 2026
b5ffa66
TEST-20 - cover cooldown updates on pending unstake requests (#494)
venimir-ssv Mar 19, 2026
68b9661
TEST-31 - expand onCSSVTransfer reward-settlement scenarios (#496)
venimir-ssv Mar 19, 2026
15371ac
TEST-15 - Add legacy SSV accounting coverage for validator removal (#…
venimir-ssv Mar 19, 2026
5081e21
FUZZ-2 - complete high-priority Echidna invariants (#500)
venimir-ssv Mar 19, 2026
6463a06
TEST - SSV Staking Tests (#543)
venimir-ssv Mar 20, 2026
8e2b72b
ITEST-2 - migration coverage for multiple EB updates (#498)
venimir-ssv Mar 20, 2026
66dcc24
CI - Sync Echidna CI, runner, and README with all harnesses (#547)
venimir-ssv Mar 20, 2026
f057494
DEPLOYMENT - include json hashes in attestation output (#548)
mtabasco Mar 20, 2026
d68112a
mainnet config file
mtabasco Mar 22, 2026
7808147
mainnet deployment json
liorrutenberg Mar 23, 2026
c147556
mainnet msig batch upgrade
liorrutenberg Mar 23, 2026
a5b644a
mainnet deployment att data
liorrutenberg Mar 23, 2026
6bd035b
remove planning docs
mtabasco Mar 23, 2026
6b3c24f
audit report
mtabasco Mar 23, 2026
0c4b1d6
remove skill, metadata
mtabasco Mar 23, 2026
bbb26a2
updated ABIs
mtabasco Mar 23, 2026
04f8659
chore: cleanup todos
yurii-ssv Mar 23, 2026
97cf6b9
feat: update foundry optimizer runs
yurii-ssv Mar 23, 2026
b026733
feat: remove lib/forge-std
yurii-ssv Mar 23, 2026
44a4132
BUG-21 - `removeOperator` deletes `operatorEthVUnits` causing underfl…
yurii-ssv Mar 24, 2026
4264ae2
stage-v2.0.0-upgrade5
mtabasco Mar 24, 2026
a297d63
TEST - Global accounting invariants (#552)
venimir-ssv Mar 25, 2026
9d5d832
Tests - Add vUnits scenarios (#556)
mtabasco Mar 25, 2026
5a86047
TEST-35...38 - Fix: Enforce DAO minimum operator ETH fee when executi…
venimir-ssv Mar 27, 2026
8b75319
stagev-2.0.0-upgrade6
mtabasco Mar 30, 2026
d61c7a1
prod-v2.0.0-upgrade3 (#565)
mtabasco Apr 1, 2026
85f74dd
BUG-22: Fix frozen ETH index skipped for removed operators & refactor…
mtabasco Apr 3, 2026
5284ec3
stage v2.0.0-upgrade7
mtabasco Apr 6, 2026
142aa8c
[DEPLOYMENT-TOOLS] attach-module recipe uses env param (#602)
mtabasco Apr 7, 2026
fcfde8c
prod-v2.0.0-upgrade4
mtabasco Apr 7, 2026
5ad88f9
Test/improve echidna (#604)
mtabasco Apr 11, 2026
284fc6f
docs: add audit report
mtabasco Apr 14, 2026
a54328e
sync with ssv-staking
mtabasco Apr 17, 2026
c5f7912
remove previous deployment metadata, update upgradeTimestamp
mtabasco Apr 17, 2026
7e24ae2
feat: just smoke-test
mtabasco Apr 17, 2026
1211abd
chore: update smoke-test script
mtabasco Apr 17, 2026
08a6d14
chore: update config params
mtabasco Apr 17, 2026
790fa33
chore: update threshold params
mtabasco Apr 19, 2026
ece61c4
chore: update threshold values
mtabasco Apr 19, 2026
f186c87
chore: add v2.0.0 mainnet deployment artifacts (#608)
liorrutenberg Apr 19, 2026
f6d3cce
Pre-release cleanup - (#609)
mtabasco Apr 23, 2026
bfb9f8c
tenderly actions init
venimir-ssv Apr 28, 2026
575a53e
refactor(monitoring): trim Tenderly PoC to Hoodi stage withdrawal/rew…
venimir-ssv Apr 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
72 changes: 58 additions & 14 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,15 +1,59 @@
HOLESKY_ETH_NODE_URL=
HOLESKY_OWNER_PRIVATE_KEY=
MAINNET_ETH_NODE_URL=
MAINNET_OWNER_PRIVATE_KEY=
GAS_PRICE=
GAS=
# ── RPC endpoints ──
MAINNET_RPC_URL=
HOODI_RPC_URL=

# ── Signer private keys ──
# Must match the on-chain owner for live upgrades.
MAINNET_PRIVATE_KEY=
HOODI_PRIVATE_KEY=

# ── Optional SSV token address overrides for Hardhat network config ──
MAINNET_SSVTOKEN_ADDRESS=
HOODI_SSVTOKEN_ADDRESS=

# ── Block explorer verification ──
ETHERSCAN_KEY=
NODE_PROVIDER_KEY=
MINIMUM_BLOCKS_BEFORE_LIQUIDATION=100800
MINIMUM_LIQUIDATION_COLLATERAL=200000000
OPERATOR_MAX_FEE_INCREASE=3
DECLARE_OPERATOR_FEE_PERIOD=259200 # 3 days
EXECUTE_OPERATOR_FEE_PERIOD=345600 # 4 days
VALIDATORS_PER_OPERATOR_LIMIT=500
SSVTOKEN_ADDRESS=

# ── Fork test configuration ──
# These are ONLY used when running fork tests manually (npx hardhat test --network hardhat_forked).
# When using `just test-fork <env>`, all values are loaded from deployments/<env>/config.json
# and these .env values are ignored.

# Fork infrastructure (addresses, block, network)
FORK_BLOCK_NUMBER=
FORK_TEST_NETWORK=hardhat_forked
FORK_CONFIG_PATH=
FORK_SSV_NETWORK_ADDRESS=
FORK_SSV_NETWORK_VIEWS=
FORK_SSV_TOKEN=
FORK_CSSV_TOKEN=
FORK_DAO_ADDRESS=

# Fork test behavior flags
FORK_USE_DEPLOYED_STATE=true
FORK_STRICT_DEPLOYED_STATE=false
FORK_ALLOW_DEPLOYED_FALLBACK=true

# Fork protocol parameter overrides (manual runs only)
# For deployments and upgrades, the source of truth is deployments/<env>/config.json.
FORK_NETWORK_FEE_ETH=3550900000
FORK_NETWORK_FEE_SSV=
FORK_MIN_OPERATOR_ETH_FEE=1065200000
FORK_MAX_OPERATOR_ETH_FEE=5326300000
FORK_OPERATOR_MAX_FEE_INCREASE=1000
FORK_DECLARE_OPERATOR_FEE_PERIOD=604800
FORK_EXECUTE_OPERATOR_FEE_PERIOD=604800
FORK_MIN_LIQ_COLLATERAL=940000000000000
FORK_VALIDATORS_PER_OPERATOR_LIMIT=3000
FORK_DEFAULT_ORACLE_IDS=1,2,3,4
FORK_DEFAULT_UNSTAKE_COOLDOWN=604800

# ── Test and gas-report toggles ──
RUN_FORK=
NO_GAS_ENFORCE=
REPORT_GAS=
GAS_REPORT_DIR=.
BASELINE_TAG=v1.2.0
CURRENT_LABEL=current
GAS_COMPARE_OUTPUT=gas-compare.txt
COVERAGE=
5 changes: 5 additions & 0 deletions .github/renovate.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"extends": [
"github>ssvlabs/shared-configs//renovate/renovate.json"
]
}
9 changes: 6 additions & 3 deletions .github/workflows/code-coverage.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,13 @@ jobs:
name: Solidity code coverage
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v3
- uses: actions/setup-node@v4
with:
node-version: '20.x'
node-version: '22.x'
- run: npm ci
env:
GH_TOKEN: ${{ secrets.github_token }}
- run: SOLIDITY_COVERAGE=true NO_GAS_ENFORCE=1 npx hardhat coverage
- run: npx hardhat test --coverage
env:
NO_GAS_ENFORCE: '1'
COVERAGE: 'true'
80 changes: 80 additions & 0 deletions .github/workflows/echidna.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
name: Echidna Fuzzing

on:
push:
paths:
- 'contracts/**'
- 'test/echidna/**'
- 'foundry.toml'
- '.github/workflows/echidna.yaml'
workflow_dispatch:

jobs:
discover-contracts:
runs-on: ubuntu-latest
outputs:
contracts: ${{ steps.discover.outputs.contracts }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive

- name: Discover Echidna harnesses
id: discover
run: |
python3 - <<'PY' >> "$GITHUB_OUTPUT"
import json
from pathlib import Path

contracts = sorted(path.stem for path in Path("test/echidna").glob("*Echidna.sol"))
if not contracts:
raise SystemExit("No Echidna harnesses found under test/echidna")

print(f"contracts={json.dumps(contracts)}")
PY

echidna:
needs: discover-contracts
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
contract: ${{ fromJSON(needs.discover-contracts.outputs.contracts) }}

steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22.x'
cache: 'npm'

- name: Install dependencies
run: npm ci
env:
GH_TOKEN: ${{ secrets.github_token }}

- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1

- name: Run Echidna
uses: crytic/echidna-action@v2
with:
files: test/echidna/${{ matrix.contract }}.sol
contract: ${{ matrix.contract }}
config: test/echidna/echidna-ci.yaml
crytic-args: --compile-force-framework foundry
test-mode: property

- name: Upload corpus
uses: actions/upload-artifact@v4
if: always()
with:
name: echidna-corpus-${{ matrix.contract }}
path: crytic-export/
retention-days: 7
6 changes: 3 additions & 3 deletions .github/workflows/linter.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ jobs:
name: Solidity linter
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v3
- uses: actions/setup-node@v4
with:
node-version: '20.x'
node-version: '22.x'
- run: npm ci
env:
GH_TOKEN: ${{ secrets.github_token }}
- run: npx hardhat check
- run: npx solhint 'contracts/**/*.sol' --ignore-path .solhintignore
4 changes: 2 additions & 2 deletions .github/workflows/publish.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Use Node.js
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: '20'
node-version: '22.x'
registry-url: 'https://registry.npmjs.org'

- name: Install dependencies
Expand Down
17 changes: 15 additions & 2 deletions .github/workflows/slither.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,23 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22.x'

- name: Install dependencies
run: npm ci
env:
GH_TOKEN: ${{ secrets.github_token }}

- name: Compile contracts (Hardhat)
run: npx hardhat compile --force

- name: Run Slither
uses: crytic/slither-action@v0.3.2
id: slither
with:
node-version: 20
fail-on: high
slither-args: --exclude controlled-delegatecall,incorrect-return
target: .
slither-args: --hardhat-ignore-compile --exclude controlled-delegatecall,incorrect-return --filter-paths "contracts/test/" --exclude-informational --exclude-dependencies
37 changes: 28 additions & 9 deletions .github/workflows/tests-forked.yaml
Original file line number Diff line number Diff line change
@@ -1,20 +1,39 @@
name: Run tests

on: [push]
on: [push, pull_request]

jobs:
ci:
runs-on: ubuntu-latest
name: Hardhat unit test (forked network)
env: # Set environment variables for all steps in this job
FORK_TESTING_ENABLED: true
name: Hardhat fork tests
env:
GH_TOKEN: ${{ secrets.github_token }}
MAINNET_ETH_NODE_URL: ${{ secrets.mainnet_eth_node_url }}
NODE_PROVIDER_KEY: ${{ secrets.node_provider_key }}
FORK_BLOCK_NUMBER: ${{ secrets.fork_block_number }}
HOODI_RPC_URL: ${{ secrets.hoodi_rpc_url }}
MAINNET_RPC_URL: ${{ secrets.mainnet_rpc_url }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v3

- uses: actions/setup-node@v4
with:
node-version: '20.x'
node-version: '22.x'
cache: 'npm'

- run: npm ci
- run: npx hardhat test test-forked/*.ts
env:
GH_TOKEN: ${{ secrets.github_token }}

- name: Compile contracts
run: npx hardhat compile
env:
FORK_BLOCK_NUMBER: ${{ secrets.fork_block_number }}
HOODI_RPC_URL: ${{ secrets.hoodi_rpc_url }}

- name: Run fork tests
run: npx hardhat test test/test-forked/v2.0.0/fullIntegrationForked.test.ts
env:
REPORT_GAS: 'true'
NO_GAS_ENFORCE: '1'
FORK_BLOCK_NUMBER: ${{ secrets.fork_block_number }}
HOODI_RPC_URL: ${{ secrets.hoodi_rpc_url }}
MAINNET_RPC_URL: ${{ secrets.mainnet_rpc_url }}
Loading
Loading