diff --git a/.gitignore b/.gitignore index 06143372..a7c2ed61 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,7 @@ cache # VS Code .vscode +*.code-workspace # Coverage coverage @@ -42,3 +43,6 @@ coverage.json addresses.json /.openzeppelin/unknown-31337.json /deployments/local.json + +# Python +.python-version diff --git a/.openzeppelin/holesky.json b/.openzeppelin/holesky.json index 5b6e16c8..6465633d 100644 --- a/.openzeppelin/holesky.json +++ b/.openzeppelin/holesky.json @@ -2496,8 +2496,8 @@ "0x16c35CC583b35c301D1884D4cdFb6e06A2dF45f2" ] }, - "6402168d6703a499a6de182f6ff77c66e31e03ac629495dfcbb281e1edf899f9": { - "address": "0x3E23ffA537955793de6FE3Ae701eFb8A1f0064Fb", + "8811e820ec89a37cd7ab96c24433ff301cb7295974eab531482a2925bbdb76b8": { + "address": "0xa95C0BAA54037b9Cf70Cfe8b59732246604C97D2", "layout": { "solcVersion": "0.8.22", "storage": [ @@ -2585,7 +2585,7 @@ "label": "_exitQueue", "offset": 0, "slot": "154", - "type": "t_struct(History)13839_storage", + "type": "t_struct(History)13998_storage", "contract": "VaultState", "src": "contracts/vaults/modules/VaultState.sol:29" }, @@ -2651,7 +2651,7 @@ "slot": "208", "type": "t_bytes32", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:31" + "src": "contracts/vaults/modules/VaultValidators.sol:39" }, { "label": "_validatorIndex", @@ -2659,7 +2659,7 @@ "slot": "209", "type": "t_uint256", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:34" + "src": "contracts/vaults/modules/VaultValidators.sol:42" }, { "label": "_validatorsManager", @@ -2667,15 +2667,23 @@ "slot": "210", "type": "t_address", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:36" + "src": "contracts/vaults/modules/VaultValidators.sol:44" }, { - "label": "__gap", + "label": "_initialDomainSeparator", "offset": 0, "slot": "211", - "type": "t_array(t_uint256)50_storage", + "type": "t_bytes32", + "contract": "VaultValidators", + "src": "contracts/vaults/modules/VaultValidators.sol:46" + }, + { + "label": "__gap", + "offset": 0, + "slot": "212", + "type": "t_array(t_uint256)49_storage", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:155" + "src": "contracts/vaults/modules/VaultValidators.sol:228" }, { "label": "__gap", @@ -2689,9 +2697,9 @@ "label": "_positions", "offset": 0, "slot": "311", - "type": "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)", + "type": "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:31" + "src": "contracts/vaults/modules/VaultOsToken.sol:32" }, { "label": "__gap", @@ -2699,7 +2707,7 @@ "slot": "312", "type": "t_array(t_uint256)50_storage", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:305" + "src": "contracts/vaults/modules/VaultOsToken.sol:294" }, { "label": "_ownMevEscrow", @@ -2781,7 +2789,7 @@ "label": "address", "numberOfBytes": "20" }, - "t_array(t_struct(Checkpoint)13833_storage)dyn_storage": { + "t_array(t_struct(Checkpoint)13992_storage)dyn_storage": { "label": "struct ExitQueue.Checkpoint[]", "numberOfBytes": "32" }, @@ -2789,6 +2797,10 @@ "label": "uint256[48]", "numberOfBytes": "1536" }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, "t_array(t_uint256)50_storage": { "label": "uint256[50]", "numberOfBytes": "1600" @@ -2797,7 +2809,7 @@ "label": "bytes32", "numberOfBytes": "32" }, - "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)": { + "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)": { "label": "mapping(address => struct IVaultOsToken.OsTokenPosition)", "numberOfBytes": "32" }, @@ -2809,7 +2821,7 @@ "label": "mapping(bytes32 => uint256)", "numberOfBytes": "32" }, - "t_struct(Checkpoint)13833_storage": { + "t_struct(Checkpoint)13992_storage": { "label": "struct ExitQueue.Checkpoint", "members": [ { @@ -2827,19 +2839,19 @@ ], "numberOfBytes": "32" }, - "t_struct(History)13839_storage": { + "t_struct(History)13998_storage": { "label": "struct ExitQueue.History", "members": [ { "label": "checkpoints", - "type": "t_array(t_struct(Checkpoint)13833_storage)dyn_storage", + "type": "t_array(t_struct(Checkpoint)13992_storage)dyn_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "32" }, - "t_struct(OsTokenPosition)12097_storage": { + "t_struct(OsTokenPosition)12235_storage": { "label": "struct IVaultOsToken.OsTokenPosition", "members": [ { @@ -2906,8 +2918,8 @@ } } }, - "038605a2ea7a538750bf0df037e9cdb984b5ead1fef82798fe9e3fd44e53cbf8": { - "address": "0x21647cB594ec32593Ca3d8dA141D36C7ae162c67", + "6039a152e8d8f6e65aaf4507771c19c58856daaac934ea2bebc5e8365a3327d7": { + "address": "0xff4e192710182C1C39859a224Ff92D9c5a858559", "layout": { "solcVersion": "0.8.22", "storage": [ @@ -2995,7 +3007,7 @@ "label": "_exitQueue", "offset": 0, "slot": "154", - "type": "t_struct(History)13839_storage", + "type": "t_struct(History)13998_storage", "contract": "VaultState", "src": "contracts/vaults/modules/VaultState.sol:29" }, @@ -3061,7 +3073,7 @@ "slot": "208", "type": "t_bytes32", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:31" + "src": "contracts/vaults/modules/VaultValidators.sol:39" }, { "label": "_validatorIndex", @@ -3069,7 +3081,7 @@ "slot": "209", "type": "t_uint256", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:34" + "src": "contracts/vaults/modules/VaultValidators.sol:42" }, { "label": "_validatorsManager", @@ -3077,15 +3089,23 @@ "slot": "210", "type": "t_address", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:36" + "src": "contracts/vaults/modules/VaultValidators.sol:44" }, { - "label": "__gap", + "label": "_initialDomainSeparator", "offset": 0, "slot": "211", - "type": "t_array(t_uint256)50_storage", + "type": "t_bytes32", + "contract": "VaultValidators", + "src": "contracts/vaults/modules/VaultValidators.sol:46" + }, + { + "label": "__gap", + "offset": 0, + "slot": "212", + "type": "t_array(t_uint256)49_storage", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:155" + "src": "contracts/vaults/modules/VaultValidators.sol:228" }, { "label": "__gap", @@ -3099,9 +3119,9 @@ "label": "_positions", "offset": 0, "slot": "311", - "type": "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)", + "type": "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:31" + "src": "contracts/vaults/modules/VaultOsToken.sol:32" }, { "label": "__gap", @@ -3109,7 +3129,7 @@ "slot": "312", "type": "t_array(t_uint256)50_storage", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:305" + "src": "contracts/vaults/modules/VaultOsToken.sol:294" }, { "label": "_ownMevEscrow", @@ -3223,7 +3243,7 @@ "label": "address", "numberOfBytes": "20" }, - "t_array(t_struct(Checkpoint)13833_storage)dyn_storage": { + "t_array(t_struct(Checkpoint)13992_storage)dyn_storage": { "label": "struct ExitQueue.Checkpoint[]", "numberOfBytes": "32" }, @@ -3231,6 +3251,10 @@ "label": "uint256[48]", "numberOfBytes": "1536" }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, "t_array(t_uint256)50_storage": { "label": "uint256[50]", "numberOfBytes": "1600" @@ -3243,7 +3267,7 @@ "label": "mapping(address => bool)", "numberOfBytes": "32" }, - "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)": { + "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)": { "label": "mapping(address => struct IVaultOsToken.OsTokenPosition)", "numberOfBytes": "32" }, @@ -3255,7 +3279,7 @@ "label": "mapping(bytes32 => uint256)", "numberOfBytes": "32" }, - "t_struct(Checkpoint)13833_storage": { + "t_struct(Checkpoint)13992_storage": { "label": "struct ExitQueue.Checkpoint", "members": [ { @@ -3273,19 +3297,19 @@ ], "numberOfBytes": "32" }, - "t_struct(History)13839_storage": { + "t_struct(History)13998_storage": { "label": "struct ExitQueue.History", "members": [ { "label": "checkpoints", - "type": "t_array(t_struct(Checkpoint)13833_storage)dyn_storage", + "type": "t_array(t_struct(Checkpoint)13992_storage)dyn_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "32" }, - "t_struct(OsTokenPosition)12097_storage": { + "t_struct(OsTokenPosition)12235_storage": { "label": "struct IVaultOsToken.OsTokenPosition", "members": [ { @@ -3352,8 +3376,8 @@ } } }, - "ceaaa2774316a6a794cb14bb030106346460e93a3f1c8bc43f973a1cad8cbc4f": { - "address": "0xA954d6b1694eFbEBcb19AB0b06A53F3fB46bD2F2", + "4d4e7b808074d5c83c0d00e37006208c1157a7374d65b4dbe826f8ec218b0b0f": { + "address": "0x6Fe6f9aD1f0657Db4855CC9D4B61252aD14501E6", "layout": { "solcVersion": "0.8.22", "storage": [ @@ -3441,7 +3465,7 @@ "label": "_exitQueue", "offset": 0, "slot": "154", - "type": "t_struct(History)13839_storage", + "type": "t_struct(History)13998_storage", "contract": "VaultState", "src": "contracts/vaults/modules/VaultState.sol:29" }, @@ -3507,7 +3531,7 @@ "slot": "208", "type": "t_bytes32", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:31" + "src": "contracts/vaults/modules/VaultValidators.sol:39" }, { "label": "_validatorIndex", @@ -3515,7 +3539,7 @@ "slot": "209", "type": "t_uint256", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:34" + "src": "contracts/vaults/modules/VaultValidators.sol:42" }, { "label": "_validatorsManager", @@ -3523,15 +3547,23 @@ "slot": "210", "type": "t_address", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:36" + "src": "contracts/vaults/modules/VaultValidators.sol:44" }, { - "label": "__gap", + "label": "_initialDomainSeparator", "offset": 0, "slot": "211", - "type": "t_array(t_uint256)50_storage", + "type": "t_bytes32", + "contract": "VaultValidators", + "src": "contracts/vaults/modules/VaultValidators.sol:46" + }, + { + "label": "__gap", + "offset": 0, + "slot": "212", + "type": "t_array(t_uint256)49_storage", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:155" + "src": "contracts/vaults/modules/VaultValidators.sol:228" }, { "label": "__gap", @@ -3545,9 +3577,9 @@ "label": "_positions", "offset": 0, "slot": "311", - "type": "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)", + "type": "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:31" + "src": "contracts/vaults/modules/VaultOsToken.sol:32" }, { "label": "__gap", @@ -3555,7 +3587,7 @@ "slot": "312", "type": "t_array(t_uint256)50_storage", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:305" + "src": "contracts/vaults/modules/VaultOsToken.sol:294" }, { "label": "_ownMevEscrow", @@ -3669,7 +3701,7 @@ "label": "address", "numberOfBytes": "20" }, - "t_array(t_struct(Checkpoint)13833_storage)dyn_storage": { + "t_array(t_struct(Checkpoint)13992_storage)dyn_storage": { "label": "struct ExitQueue.Checkpoint[]", "numberOfBytes": "32" }, @@ -3677,6 +3709,10 @@ "label": "uint256[48]", "numberOfBytes": "1536" }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, "t_array(t_uint256)50_storage": { "label": "uint256[50]", "numberOfBytes": "1600" @@ -3689,7 +3725,7 @@ "label": "mapping(address => bool)", "numberOfBytes": "32" }, - "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)": { + "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)": { "label": "mapping(address => struct IVaultOsToken.OsTokenPosition)", "numberOfBytes": "32" }, @@ -3701,7 +3737,7 @@ "label": "mapping(bytes32 => uint256)", "numberOfBytes": "32" }, - "t_struct(Checkpoint)13833_storage": { + "t_struct(Checkpoint)13992_storage": { "label": "struct ExitQueue.Checkpoint", "members": [ { @@ -3719,19 +3755,19 @@ ], "numberOfBytes": "32" }, - "t_struct(History)13839_storage": { + "t_struct(History)13998_storage": { "label": "struct ExitQueue.History", "members": [ { "label": "checkpoints", - "type": "t_array(t_struct(Checkpoint)13833_storage)dyn_storage", + "type": "t_array(t_struct(Checkpoint)13992_storage)dyn_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "32" }, - "t_struct(OsTokenPosition)12097_storage": { + "t_struct(OsTokenPosition)12235_storage": { "label": "struct IVaultOsToken.OsTokenPosition", "members": [ { @@ -3798,8 +3834,8 @@ } } }, - "9d8c067c2b30545a36accaf4586069c64536f407547379aa1f6bc14fc07de8c5": { - "address": "0x1C3c2173bb792A62f93b2181333e3312f8F59422", + "70d2335c7ba2905e217c2b51c37b3ca6d18c647658dc7e8a0063ad68b23825bf": { + "address": "0x34B16AF29C9807E1F6789171868fA3f98fB3a565", "layout": { "solcVersion": "0.8.22", "storage": [ @@ -3935,7 +3971,7 @@ "label": "_exitQueue", "offset": 0, "slot": "209", - "type": "t_struct(History)13839_storage", + "type": "t_struct(History)13998_storage", "contract": "VaultState", "src": "contracts/vaults/modules/VaultState.sol:29" }, @@ -4001,7 +4037,7 @@ "slot": "263", "type": "t_bytes32", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:31" + "src": "contracts/vaults/modules/VaultValidators.sol:39" }, { "label": "_validatorIndex", @@ -4009,7 +4045,7 @@ "slot": "264", "type": "t_uint256", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:34" + "src": "contracts/vaults/modules/VaultValidators.sol:42" }, { "label": "_validatorsManager", @@ -4017,15 +4053,23 @@ "slot": "265", "type": "t_address", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:36" + "src": "contracts/vaults/modules/VaultValidators.sol:44" }, { - "label": "__gap", + "label": "_initialDomainSeparator", "offset": 0, "slot": "266", - "type": "t_array(t_uint256)50_storage", + "type": "t_bytes32", + "contract": "VaultValidators", + "src": "contracts/vaults/modules/VaultValidators.sol:46" + }, + { + "label": "__gap", + "offset": 0, + "slot": "267", + "type": "t_array(t_uint256)49_storage", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:155" + "src": "contracts/vaults/modules/VaultValidators.sol:228" }, { "label": "__gap", @@ -4039,9 +4083,9 @@ "label": "_positions", "offset": 0, "slot": "366", - "type": "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)", + "type": "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:31" + "src": "contracts/vaults/modules/VaultOsToken.sol:32" }, { "label": "__gap", @@ -4049,7 +4093,7 @@ "slot": "367", "type": "t_array(t_uint256)50_storage", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:305" + "src": "contracts/vaults/modules/VaultOsToken.sol:294" }, { "label": "_ownMevEscrow", @@ -4139,7 +4183,7 @@ "label": "address", "numberOfBytes": "20" }, - "t_array(t_struct(Checkpoint)13833_storage)dyn_storage": { + "t_array(t_struct(Checkpoint)13992_storage)dyn_storage": { "label": "struct ExitQueue.Checkpoint[]", "numberOfBytes": "32" }, @@ -4147,6 +4191,10 @@ "label": "uint256[48]", "numberOfBytes": "1536" }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, "t_array(t_uint256)50_storage": { "label": "uint256[50]", "numberOfBytes": "1600" @@ -4159,7 +4207,7 @@ "label": "mapping(address => mapping(address => uint256))", "numberOfBytes": "32" }, - "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)": { + "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)": { "label": "mapping(address => struct IVaultOsToken.OsTokenPosition)", "numberOfBytes": "32" }, @@ -4175,7 +4223,7 @@ "label": "string", "numberOfBytes": "32" }, - "t_struct(Checkpoint)13833_storage": { + "t_struct(Checkpoint)13992_storage": { "label": "struct ExitQueue.Checkpoint", "members": [ { @@ -4193,19 +4241,19 @@ ], "numberOfBytes": "32" }, - "t_struct(History)13839_storage": { + "t_struct(History)13998_storage": { "label": "struct ExitQueue.History", "members": [ { "label": "checkpoints", - "type": "t_array(t_struct(Checkpoint)13833_storage)dyn_storage", + "type": "t_array(t_struct(Checkpoint)13992_storage)dyn_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "32" }, - "t_struct(OsTokenPosition)12097_storage": { + "t_struct(OsTokenPosition)12235_storage": { "label": "struct IVaultOsToken.OsTokenPosition", "members": [ { @@ -4272,8 +4320,8 @@ } } }, - "9122bcaa80029151f2ef2a51e585acd887faaaeee5506fb50280bbca28602074": { - "address": "0xF3E5cBD642395Fe4620e4D1A07743C2D3Ed5E690", + "d83e68bfb592db81d94c782791e8a25ebdf83ac83fd58b955e90f8776b842a97": { + "address": "0xEBF2570686B6701Ea46c546ad396d171a52E3BD5", "layout": { "solcVersion": "0.8.22", "storage": [ @@ -4409,7 +4457,7 @@ "label": "_exitQueue", "offset": 0, "slot": "209", - "type": "t_struct(History)13839_storage", + "type": "t_struct(History)13998_storage", "contract": "VaultState", "src": "contracts/vaults/modules/VaultState.sol:29" }, @@ -4475,7 +4523,7 @@ "slot": "263", "type": "t_bytes32", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:31" + "src": "contracts/vaults/modules/VaultValidators.sol:39" }, { "label": "_validatorIndex", @@ -4483,7 +4531,7 @@ "slot": "264", "type": "t_uint256", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:34" + "src": "contracts/vaults/modules/VaultValidators.sol:42" }, { "label": "_validatorsManager", @@ -4491,15 +4539,23 @@ "slot": "265", "type": "t_address", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:36" + "src": "contracts/vaults/modules/VaultValidators.sol:44" }, { - "label": "__gap", + "label": "_initialDomainSeparator", "offset": 0, "slot": "266", - "type": "t_array(t_uint256)50_storage", + "type": "t_bytes32", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:155" + "src": "contracts/vaults/modules/VaultValidators.sol:46" + }, + { + "label": "__gap", + "offset": 0, + "slot": "267", + "type": "t_array(t_uint256)49_storage", + "contract": "VaultValidators", + "src": "contracts/vaults/modules/VaultValidators.sol:228" }, { "label": "__gap", @@ -4513,9 +4569,9 @@ "label": "_positions", "offset": 0, "slot": "366", - "type": "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)", + "type": "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:31" + "src": "contracts/vaults/modules/VaultOsToken.sol:32" }, { "label": "__gap", @@ -4523,7 +4579,7 @@ "slot": "367", "type": "t_array(t_uint256)50_storage", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:305" + "src": "contracts/vaults/modules/VaultOsToken.sol:294" }, { "label": "_ownMevEscrow", @@ -4645,7 +4701,7 @@ "label": "address", "numberOfBytes": "20" }, - "t_array(t_struct(Checkpoint)13833_storage)dyn_storage": { + "t_array(t_struct(Checkpoint)13992_storage)dyn_storage": { "label": "struct ExitQueue.Checkpoint[]", "numberOfBytes": "32" }, @@ -4653,6 +4709,10 @@ "label": "uint256[48]", "numberOfBytes": "1536" }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, "t_array(t_uint256)50_storage": { "label": "uint256[50]", "numberOfBytes": "1600" @@ -4669,7 +4729,7 @@ "label": "mapping(address => mapping(address => uint256))", "numberOfBytes": "32" }, - "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)": { + "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)": { "label": "mapping(address => struct IVaultOsToken.OsTokenPosition)", "numberOfBytes": "32" }, @@ -4685,7 +4745,7 @@ "label": "string", "numberOfBytes": "32" }, - "t_struct(Checkpoint)13833_storage": { + "t_struct(Checkpoint)13992_storage": { "label": "struct ExitQueue.Checkpoint", "members": [ { @@ -4703,19 +4763,19 @@ ], "numberOfBytes": "32" }, - "t_struct(History)13839_storage": { + "t_struct(History)13998_storage": { "label": "struct ExitQueue.History", "members": [ { "label": "checkpoints", - "type": "t_array(t_struct(Checkpoint)13833_storage)dyn_storage", + "type": "t_array(t_struct(Checkpoint)13992_storage)dyn_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "32" }, - "t_struct(OsTokenPosition)12097_storage": { + "t_struct(OsTokenPosition)12235_storage": { "label": "struct IVaultOsToken.OsTokenPosition", "members": [ { @@ -4782,8 +4842,8 @@ } } }, - "d8fa008252896f0ed325ec1a355362f0bb079cc5cd889ca5c0f83d67219661eb": { - "address": "0xf2131930b13a736E44B83B1A73A129FCd75cfd51", + "a3078447c5f6c643c054f40f57e2fc262579f92f0ed885bf4199a753af31168a": { + "address": "0x2575845f4Ccc265fF393Ab1eB0F11e5Eb396f66c", "layout": { "solcVersion": "0.8.22", "storage": [ @@ -4919,7 +4979,7 @@ "label": "_exitQueue", "offset": 0, "slot": "209", - "type": "t_struct(History)13839_storage", + "type": "t_struct(History)13998_storage", "contract": "VaultState", "src": "contracts/vaults/modules/VaultState.sol:29" }, @@ -4985,7 +5045,7 @@ "slot": "263", "type": "t_bytes32", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:31" + "src": "contracts/vaults/modules/VaultValidators.sol:39" }, { "label": "_validatorIndex", @@ -4993,7 +5053,7 @@ "slot": "264", "type": "t_uint256", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:34" + "src": "contracts/vaults/modules/VaultValidators.sol:42" }, { "label": "_validatorsManager", @@ -5001,15 +5061,23 @@ "slot": "265", "type": "t_address", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:36" + "src": "contracts/vaults/modules/VaultValidators.sol:44" }, { - "label": "__gap", + "label": "_initialDomainSeparator", "offset": 0, "slot": "266", - "type": "t_array(t_uint256)50_storage", + "type": "t_bytes32", + "contract": "VaultValidators", + "src": "contracts/vaults/modules/VaultValidators.sol:46" + }, + { + "label": "__gap", + "offset": 0, + "slot": "267", + "type": "t_array(t_uint256)49_storage", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:155" + "src": "contracts/vaults/modules/VaultValidators.sol:228" }, { "label": "__gap", @@ -5023,9 +5091,9 @@ "label": "_positions", "offset": 0, "slot": "366", - "type": "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)", + "type": "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:31" + "src": "contracts/vaults/modules/VaultOsToken.sol:32" }, { "label": "__gap", @@ -5033,7 +5101,7 @@ "slot": "367", "type": "t_array(t_uint256)50_storage", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:305" + "src": "contracts/vaults/modules/VaultOsToken.sol:294" }, { "label": "_ownMevEscrow", @@ -5155,7 +5223,7 @@ "label": "address", "numberOfBytes": "20" }, - "t_array(t_struct(Checkpoint)13833_storage)dyn_storage": { + "t_array(t_struct(Checkpoint)13992_storage)dyn_storage": { "label": "struct ExitQueue.Checkpoint[]", "numberOfBytes": "32" }, @@ -5163,6 +5231,10 @@ "label": "uint256[48]", "numberOfBytes": "1536" }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, "t_array(t_uint256)50_storage": { "label": "uint256[50]", "numberOfBytes": "1600" @@ -5179,7 +5251,7 @@ "label": "mapping(address => mapping(address => uint256))", "numberOfBytes": "32" }, - "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)": { + "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)": { "label": "mapping(address => struct IVaultOsToken.OsTokenPosition)", "numberOfBytes": "32" }, @@ -5195,7 +5267,7 @@ "label": "string", "numberOfBytes": "32" }, - "t_struct(Checkpoint)13833_storage": { + "t_struct(Checkpoint)13992_storage": { "label": "struct ExitQueue.Checkpoint", "members": [ { @@ -5213,19 +5285,19 @@ ], "numberOfBytes": "32" }, - "t_struct(History)13839_storage": { + "t_struct(History)13998_storage": { "label": "struct ExitQueue.History", "members": [ { "label": "checkpoints", - "type": "t_array(t_struct(Checkpoint)13833_storage)dyn_storage", + "type": "t_array(t_struct(Checkpoint)13992_storage)dyn_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "32" }, - "t_struct(OsTokenPosition)12097_storage": { + "t_struct(OsTokenPosition)12235_storage": { "label": "struct IVaultOsToken.OsTokenPosition", "members": [ { @@ -5292,8 +5364,8 @@ } } }, - "c52c23a5d6ce4510e30d44a3451a903a7c9a7e3cd7559dd2743435607ea944be": { - "address": "0x74ca1C43b9516d73D32Dfd8A505D9eC5e6eDF614", + "b9fb311519a53f93ac39344505bf7056dc4c7f4e7d59f7ac220d33ce85204696": { + "address": "0xcC5E385EdB2fEaB9C9A6DE97b572f1d811312ae7", "layout": { "solcVersion": "0.8.22", "storage": [ @@ -5381,7 +5453,7 @@ "label": "_exitQueue", "offset": 0, "slot": "154", - "type": "t_struct(History)13839_storage", + "type": "t_struct(History)13998_storage", "contract": "VaultState", "src": "contracts/vaults/modules/VaultState.sol:29" }, @@ -5447,7 +5519,7 @@ "slot": "208", "type": "t_bytes32", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:31" + "src": "contracts/vaults/modules/VaultValidators.sol:39" }, { "label": "_validatorIndex", @@ -5455,7 +5527,7 @@ "slot": "209", "type": "t_uint256", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:34" + "src": "contracts/vaults/modules/VaultValidators.sol:42" }, { "label": "_validatorsManager", @@ -5463,15 +5535,23 @@ "slot": "210", "type": "t_address", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:36" + "src": "contracts/vaults/modules/VaultValidators.sol:44" }, { - "label": "__gap", + "label": "_initialDomainSeparator", "offset": 0, "slot": "211", - "type": "t_array(t_uint256)50_storage", + "type": "t_bytes32", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:155" + "src": "contracts/vaults/modules/VaultValidators.sol:46" + }, + { + "label": "__gap", + "offset": 0, + "slot": "212", + "type": "t_array(t_uint256)49_storage", + "contract": "VaultValidators", + "src": "contracts/vaults/modules/VaultValidators.sol:228" }, { "label": "__gap", @@ -5485,9 +5565,9 @@ "label": "_positions", "offset": 0, "slot": "311", - "type": "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)", + "type": "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:31" + "src": "contracts/vaults/modules/VaultOsToken.sol:32" }, { "label": "__gap", @@ -5495,7 +5575,7 @@ "slot": "312", "type": "t_array(t_uint256)50_storage", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:305" + "src": "contracts/vaults/modules/VaultOsToken.sol:294" }, { "label": "_ownMevEscrow", @@ -5585,7 +5665,7 @@ "label": "address", "numberOfBytes": "20" }, - "t_array(t_struct(Checkpoint)13833_storage)dyn_storage": { + "t_array(t_struct(Checkpoint)13992_storage)dyn_storage": { "label": "struct ExitQueue.Checkpoint[]", "numberOfBytes": "32" }, @@ -5593,6 +5673,10 @@ "label": "uint256[48]", "numberOfBytes": "1536" }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, "t_array(t_uint256)50_storage": { "label": "uint256[50]", "numberOfBytes": "1600" @@ -5601,7 +5685,7 @@ "label": "bytes32", "numberOfBytes": "32" }, - "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)": { + "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)": { "label": "mapping(address => struct IVaultOsToken.OsTokenPosition)", "numberOfBytes": "32" }, @@ -5613,7 +5697,7 @@ "label": "mapping(bytes32 => uint256)", "numberOfBytes": "32" }, - "t_struct(Checkpoint)13833_storage": { + "t_struct(Checkpoint)13992_storage": { "label": "struct ExitQueue.Checkpoint", "members": [ { @@ -5631,19 +5715,19 @@ ], "numberOfBytes": "32" }, - "t_struct(History)13839_storage": { + "t_struct(History)13998_storage": { "label": "struct ExitQueue.History", "members": [ { "label": "checkpoints", - "type": "t_array(t_struct(Checkpoint)13833_storage)dyn_storage", + "type": "t_array(t_struct(Checkpoint)13992_storage)dyn_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "32" }, - "t_struct(OsTokenPosition)12097_storage": { + "t_struct(OsTokenPosition)12235_storage": { "label": "struct IVaultOsToken.OsTokenPosition", "members": [ { @@ -5710,8 +5794,8 @@ } } }, - "44a4513aa1d40ffea313ecb7ccd15f3cc8b0a3f37738c34075fbf4055086afe3": { - "address": "0xEC81953B13B8D38226D647Bf8306e8a4F11Aa8eB", + "2305d0f568ae72d6f973f1c8e33e9878b07ae13414646d9f8587b275d6e72ab0": { + "address": "0xA63Da80Ba16c2C9e71B8E71AbAD8Ffcb57b12586", "layout": { "solcVersion": "0.8.22", "storage": [ @@ -5799,7 +5883,7 @@ "label": "_exitQueue", "offset": 0, "slot": "154", - "type": "t_struct(History)13839_storage", + "type": "t_struct(History)13998_storage", "contract": "VaultState", "src": "contracts/vaults/modules/VaultState.sol:29" }, @@ -5865,7 +5949,7 @@ "slot": "208", "type": "t_bytes32", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:31" + "src": "contracts/vaults/modules/VaultValidators.sol:39" }, { "label": "_validatorIndex", @@ -5873,7 +5957,7 @@ "slot": "209", "type": "t_uint256", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:34" + "src": "contracts/vaults/modules/VaultValidators.sol:42" }, { "label": "_validatorsManager", @@ -5881,15 +5965,23 @@ "slot": "210", "type": "t_address", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:36" + "src": "contracts/vaults/modules/VaultValidators.sol:44" }, { - "label": "__gap", + "label": "_initialDomainSeparator", "offset": 0, "slot": "211", - "type": "t_array(t_uint256)50_storage", + "type": "t_bytes32", + "contract": "VaultValidators", + "src": "contracts/vaults/modules/VaultValidators.sol:46" + }, + { + "label": "__gap", + "offset": 0, + "slot": "212", + "type": "t_array(t_uint256)49_storage", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:155" + "src": "contracts/vaults/modules/VaultValidators.sol:228" }, { "label": "__gap", @@ -5924,36 +6016,52 @@ "src": "contracts/vaults/modules/VaultEthStaking.sol:152" }, { - "label": "blocklistManager", + "label": "_restakeOperatorsManager", "offset": 0, "slot": "412", "type": "t_address", - "contract": "VaultBlocklist", - "src": "contracts/vaults/modules/VaultBlocklist.sol:17" + "contract": "VaultEthRestaking", + "src": "contracts/vaults/modules/VaultEthRestaking.sol:25" }, { - "label": "blockedAccounts", + "label": "_restakeWithdrawalsManager", "offset": 0, "slot": "413", - "type": "t_mapping(t_address,t_bool)", - "contract": "VaultBlocklist", - "src": "contracts/vaults/modules/VaultBlocklist.sol:20" + "type": "t_address", + "contract": "VaultEthRestaking", + "src": "contracts/vaults/modules/VaultEthRestaking.sol:26" }, { - "label": "__gap", + "label": "_eigenPods", "offset": 0, "slot": "414", + "type": "t_struct(AddressSet)8377_storage", + "contract": "VaultEthRestaking", + "src": "contracts/vaults/modules/VaultEthRestaking.sol:28" + }, + { + "label": "_eigenPodOwners", + "offset": 0, + "slot": "416", + "type": "t_struct(AddressSet)8377_storage", + "contract": "VaultEthRestaking", + "src": "contracts/vaults/modules/VaultEthRestaking.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "418", "type": "t_array(t_uint256)50_storage", - "contract": "VaultBlocklist", - "src": "contracts/vaults/modules/VaultBlocklist.sol:68" + "contract": "VaultEthRestaking", + "src": "contracts/vaults/modules/VaultEthRestaking.sol:164" }, { "label": "__gap", "offset": 0, - "slot": "464", + "slot": "468", "type": "t_array(t_uint256)50_storage", - "contract": "EthFoxVault", - "src": "contracts/vaults/ethereum/custom/EthFoxVault.sol:159" + "contract": "EthRestakeVault", + "src": "contracts/vaults/ethereum/restake/EthRestakeVault.sol:164" } ], "types": { @@ -6003,7 +6111,11 @@ "label": "address", "numberOfBytes": "20" }, - "t_array(t_struct(Checkpoint)13833_storage)dyn_storage": { + "t_array(t_bytes32)dyn_storage": { + "label": "bytes32[]", + "numberOfBytes": "32" + }, + "t_array(t_struct(Checkpoint)13992_storage)dyn_storage": { "label": "struct ExitQueue.Checkpoint[]", "numberOfBytes": "32" }, @@ -6011,6 +6123,10 @@ "label": "uint256[48]", "numberOfBytes": "1536" }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, "t_array(t_uint256)50_storage": { "label": "uint256[50]", "numberOfBytes": "1600" @@ -6019,10 +6135,6 @@ "label": "bytes32", "numberOfBytes": "32" }, - "t_mapping(t_address,t_bool)": { - "label": "mapping(address => bool)", - "numberOfBytes": "32" - }, "t_mapping(t_address,t_uint256)": { "label": "mapping(address => uint256)", "numberOfBytes": "32" @@ -6031,7 +6143,19 @@ "label": "mapping(bytes32 => uint256)", "numberOfBytes": "32" }, - "t_struct(Checkpoint)13833_storage": { + "t_struct(AddressSet)8377_storage": { + "label": "struct EnumerableSet.AddressSet", + "members": [ + { + "label": "_inner", + "type": "t_struct(Set)8062_storage", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Checkpoint)13992_storage": { "label": "struct ExitQueue.Checkpoint", "members": [ { @@ -6049,18 +6173,36 @@ ], "numberOfBytes": "32" }, - "t_struct(History)13839_storage": { + "t_struct(History)13998_storage": { "label": "struct ExitQueue.History", "members": [ { "label": "checkpoints", - "type": "t_array(t_struct(Checkpoint)13833_storage)dyn_storage", + "type": "t_array(t_struct(Checkpoint)13992_storage)dyn_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "32" }, + "t_struct(Set)8062_storage": { + "label": "struct EnumerableSet.Set", + "members": [ + { + "label": "_values", + "type": "t_array(t_bytes32)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "_positions", + "type": "t_mapping(t_bytes32,t_uint256)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, "t_uint128": { "label": "uint128", "numberOfBytes": "16" @@ -6110,8 +6252,8 @@ } } }, - "616ec5d5c7c6066b63423568053b5b08e1cc4ad1b3bec91e00178d95d011da33": { - "address": "0x32BD9819601CaB51c833E0530695FEd101460927", + "55aaab684c5635cfe4789b38794a0aa6d98bad5d67de77748ecec44853e34f27": { + "address": "0x92874D5e40588AB0Cd9f48f7338bCdF3006A4Ebd", "layout": { "solcVersion": "0.8.22", "storage": [ @@ -6199,7 +6341,7 @@ "label": "_exitQueue", "offset": 0, "slot": "154", - "type": "t_struct(History)13839_storage", + "type": "t_struct(History)13998_storage", "contract": "VaultState", "src": "contracts/vaults/modules/VaultState.sol:29" }, @@ -6265,7 +6407,7 @@ "slot": "208", "type": "t_bytes32", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:31" + "src": "contracts/vaults/modules/VaultValidators.sol:39" }, { "label": "_validatorIndex", @@ -6273,7 +6415,7 @@ "slot": "209", "type": "t_uint256", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:34" + "src": "contracts/vaults/modules/VaultValidators.sol:42" }, { "label": "_validatorsManager", @@ -6281,15 +6423,23 @@ "slot": "210", "type": "t_address", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:36" + "src": "contracts/vaults/modules/VaultValidators.sol:44" }, { - "label": "__gap", + "label": "_initialDomainSeparator", "offset": 0, "slot": "211", - "type": "t_array(t_uint256)50_storage", + "type": "t_bytes32", + "contract": "VaultValidators", + "src": "contracts/vaults/modules/VaultValidators.sol:46" + }, + { + "label": "__gap", + "offset": 0, + "slot": "212", + "type": "t_array(t_uint256)49_storage", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:155" + "src": "contracts/vaults/modules/VaultValidators.sol:228" }, { "label": "__gap", @@ -6343,7 +6493,7 @@ "label": "_eigenPods", "offset": 0, "slot": "414", - "type": "t_struct(AddressSet)8262_storage", + "type": "t_struct(AddressSet)8377_storage", "contract": "VaultEthRestaking", "src": "contracts/vaults/modules/VaultEthRestaking.sol:28" }, @@ -6351,7 +6501,7 @@ "label": "_eigenPodOwners", "offset": 0, "slot": "416", - "type": "t_struct(AddressSet)8262_storage", + "type": "t_struct(AddressSet)8377_storage", "contract": "VaultEthRestaking", "src": "contracts/vaults/modules/VaultEthRestaking.sol:29" }, @@ -6370,6 +6520,38 @@ "type": "t_array(t_uint256)50_storage", "contract": "EthRestakeVault", "src": "contracts/vaults/ethereum/restake/EthRestakeVault.sol:164" + }, + { + "label": "whitelister", + "offset": 0, + "slot": "518", + "type": "t_address", + "contract": "VaultWhitelist", + "src": "contracts/vaults/modules/VaultWhitelist.sol:17" + }, + { + "label": "whitelistedAccounts", + "offset": 0, + "slot": "519", + "type": "t_mapping(t_address,t_bool)", + "contract": "VaultWhitelist", + "src": "contracts/vaults/modules/VaultWhitelist.sol:20" + }, + { + "label": "__gap", + "offset": 0, + "slot": "520", + "type": "t_array(t_uint256)50_storage", + "contract": "VaultWhitelist", + "src": "contracts/vaults/modules/VaultWhitelist.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "570", + "type": "t_array(t_uint256)50_storage", + "contract": "EthRestakePrivVault", + "src": "contracts/vaults/ethereum/restake/EthRestakePrivVault.sol:118" } ], "types": { @@ -6423,7 +6605,7 @@ "label": "bytes32[]", "numberOfBytes": "32" }, - "t_array(t_struct(Checkpoint)13833_storage)dyn_storage": { + "t_array(t_struct(Checkpoint)13992_storage)dyn_storage": { "label": "struct ExitQueue.Checkpoint[]", "numberOfBytes": "32" }, @@ -6431,6 +6613,10 @@ "label": "uint256[48]", "numberOfBytes": "1536" }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, "t_array(t_uint256)50_storage": { "label": "uint256[50]", "numberOfBytes": "1600" @@ -6439,6 +6625,10 @@ "label": "bytes32", "numberOfBytes": "32" }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, "t_mapping(t_address,t_uint256)": { "label": "mapping(address => uint256)", "numberOfBytes": "32" @@ -6447,19 +6637,19 @@ "label": "mapping(bytes32 => uint256)", "numberOfBytes": "32" }, - "t_struct(AddressSet)8262_storage": { + "t_struct(AddressSet)8377_storage": { "label": "struct EnumerableSet.AddressSet", "members": [ { "label": "_inner", - "type": "t_struct(Set)7947_storage", + "type": "t_struct(Set)8062_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "64" }, - "t_struct(Checkpoint)13833_storage": { + "t_struct(Checkpoint)13992_storage": { "label": "struct ExitQueue.Checkpoint", "members": [ { @@ -6477,19 +6667,19 @@ ], "numberOfBytes": "32" }, - "t_struct(History)13839_storage": { + "t_struct(History)13998_storage": { "label": "struct ExitQueue.History", "members": [ { "label": "checkpoints", - "type": "t_array(t_struct(Checkpoint)13833_storage)dyn_storage", + "type": "t_array(t_struct(Checkpoint)13992_storage)dyn_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "32" }, - "t_struct(Set)7947_storage": { + "t_struct(Set)8062_storage": { "label": "struct EnumerableSet.Set", "members": [ { @@ -6556,8 +6746,8 @@ } } }, - "80aa97cb2c70fc7f5ea7b6ae147b0f8a0e743d0bc788fffa51a235a5e8de8425": { - "address": "0x75566a119206D8e154340B24584ecd905C02da6E", + "815e8192cb545e6c27a55dc8545050cc41cee26a9bb24ed2e15be4dc395de324": { + "address": "0xfa1E6003EfF3b50Fd02c450A51693c1A7CcE446b", "layout": { "solcVersion": "0.8.22", "storage": [ @@ -6645,7 +6835,7 @@ "label": "_exitQueue", "offset": 0, "slot": "154", - "type": "t_struct(History)13839_storage", + "type": "t_struct(History)13998_storage", "contract": "VaultState", "src": "contracts/vaults/modules/VaultState.sol:29" }, @@ -6711,7 +6901,7 @@ "slot": "208", "type": "t_bytes32", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:31" + "src": "contracts/vaults/modules/VaultValidators.sol:39" }, { "label": "_validatorIndex", @@ -6719,7 +6909,7 @@ "slot": "209", "type": "t_uint256", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:34" + "src": "contracts/vaults/modules/VaultValidators.sol:42" }, { "label": "_validatorsManager", @@ -6727,15 +6917,23 @@ "slot": "210", "type": "t_address", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:36" + "src": "contracts/vaults/modules/VaultValidators.sol:44" }, { - "label": "__gap", + "label": "_initialDomainSeparator", "offset": 0, "slot": "211", - "type": "t_array(t_uint256)50_storage", + "type": "t_bytes32", + "contract": "VaultValidators", + "src": "contracts/vaults/modules/VaultValidators.sol:46" + }, + { + "label": "__gap", + "offset": 0, + "slot": "212", + "type": "t_array(t_uint256)49_storage", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:155" + "src": "contracts/vaults/modules/VaultValidators.sol:228" }, { "label": "__gap", @@ -6789,7 +6987,7 @@ "label": "_eigenPods", "offset": 0, "slot": "414", - "type": "t_struct(AddressSet)8262_storage", + "type": "t_struct(AddressSet)8377_storage", "contract": "VaultEthRestaking", "src": "contracts/vaults/modules/VaultEthRestaking.sol:28" }, @@ -6797,7 +6995,7 @@ "label": "_eigenPodOwners", "offset": 0, "slot": "416", - "type": "t_struct(AddressSet)8262_storage", + "type": "t_struct(AddressSet)8377_storage", "contract": "VaultEthRestaking", "src": "contracts/vaults/modules/VaultEthRestaking.sol:29" }, @@ -6818,36 +7016,36 @@ "src": "contracts/vaults/ethereum/restake/EthRestakeVault.sol:164" }, { - "label": "whitelister", + "label": "blocklistManager", "offset": 0, "slot": "518", "type": "t_address", - "contract": "VaultWhitelist", - "src": "contracts/vaults/modules/VaultWhitelist.sol:17" + "contract": "VaultBlocklist", + "src": "contracts/vaults/modules/VaultBlocklist.sol:17" }, { - "label": "whitelistedAccounts", + "label": "blockedAccounts", "offset": 0, "slot": "519", "type": "t_mapping(t_address,t_bool)", - "contract": "VaultWhitelist", - "src": "contracts/vaults/modules/VaultWhitelist.sol:20" + "contract": "VaultBlocklist", + "src": "contracts/vaults/modules/VaultBlocklist.sol:20" }, { "label": "__gap", "offset": 0, "slot": "520", "type": "t_array(t_uint256)50_storage", - "contract": "VaultWhitelist", - "src": "contracts/vaults/modules/VaultWhitelist.sol:67" + "contract": "VaultBlocklist", + "src": "contracts/vaults/modules/VaultBlocklist.sol:68" }, { "label": "__gap", "offset": 0, "slot": "570", "type": "t_array(t_uint256)50_storage", - "contract": "EthRestakePrivVault", - "src": "contracts/vaults/ethereum/restake/EthRestakePrivVault.sol:118" + "contract": "EthRestakeBlocklistVault", + "src": "contracts/vaults/ethereum/restake/EthRestakeBlocklistVault.sol:115" } ], "types": { @@ -6901,7 +7099,7 @@ "label": "bytes32[]", "numberOfBytes": "32" }, - "t_array(t_struct(Checkpoint)13833_storage)dyn_storage": { + "t_array(t_struct(Checkpoint)13992_storage)dyn_storage": { "label": "struct ExitQueue.Checkpoint[]", "numberOfBytes": "32" }, @@ -6909,6 +7107,10 @@ "label": "uint256[48]", "numberOfBytes": "1536" }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, "t_array(t_uint256)50_storage": { "label": "uint256[50]", "numberOfBytes": "1600" @@ -6929,19 +7131,19 @@ "label": "mapping(bytes32 => uint256)", "numberOfBytes": "32" }, - "t_struct(AddressSet)8262_storage": { + "t_struct(AddressSet)8377_storage": { "label": "struct EnumerableSet.AddressSet", "members": [ { "label": "_inner", - "type": "t_struct(Set)7947_storage", + "type": "t_struct(Set)8062_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "64" }, - "t_struct(Checkpoint)13833_storage": { + "t_struct(Checkpoint)13992_storage": { "label": "struct ExitQueue.Checkpoint", "members": [ { @@ -6959,19 +7161,19 @@ ], "numberOfBytes": "32" }, - "t_struct(History)13839_storage": { + "t_struct(History)13998_storage": { "label": "struct ExitQueue.History", "members": [ { "label": "checkpoints", - "type": "t_array(t_struct(Checkpoint)13833_storage)dyn_storage", + "type": "t_array(t_struct(Checkpoint)13992_storage)dyn_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "32" }, - "t_struct(Set)7947_storage": { + "t_struct(Set)8062_storage": { "label": "struct EnumerableSet.Set", "members": [ { @@ -7038,495 +7240,13 @@ } } }, - "a018064992688a6eb7a021acc80b9ebd1fe196121b4dbbdd6da4c8ed5c742170": { - "address": "0x28Bd6b8d7EDd0Ae5DbE49DC4D6EFd41EE0fb92e0", + "005afde0f9bbdabfc365688f8711beba5ad68468a9beafd18341e17cd4414512": { + "address": "0xaD03b044b410F56d5afC5A0D55760A8dff3E7AF3", "layout": { "solcVersion": "0.8.22", "storage": [ { - "label": "admin", - "offset": 0, - "slot": "0", - "type": "t_address", - "contract": "VaultAdmin", - "src": "contracts/vaults/modules/VaultAdmin.sol:16" - }, - { - "label": "__gap", - "offset": 0, - "slot": "1", - "type": "t_array(t_uint256)50_storage", - "contract": "VaultAdmin", - "src": "contracts/vaults/modules/VaultAdmin.sol:49" - }, - { - "label": "__gap", - "offset": 0, - "slot": "51", - "type": "t_array(t_uint256)50_storage", - "contract": "VaultVersion", - "src": "contracts/vaults/modules/VaultVersion.sol:66" - }, - { - "label": "feeRecipient", - "offset": 0, - "slot": "101", - "type": "t_address", - "contract": "VaultFee", - "src": "contracts/vaults/modules/VaultFee.sol:21" - }, - { - "label": "feePercent", - "offset": 20, - "slot": "101", - "type": "t_uint16", - "contract": "VaultFee", - "src": "contracts/vaults/modules/VaultFee.sol:24" - }, - { - "label": "__gap", - "offset": 0, - "slot": "102", - "type": "t_array(t_uint256)50_storage", - "contract": "VaultFee", - "src": "contracts/vaults/modules/VaultFee.sol:62" - }, - { - "label": "_totalShares", - "offset": 0, - "slot": "152", - "type": "t_uint128", - "contract": "VaultState", - "src": "contracts/vaults/modules/VaultState.sol:23" - }, - { - "label": "_totalAssets", - "offset": 16, - "slot": "152", - "type": "t_uint128", - "contract": "VaultState", - "src": "contracts/vaults/modules/VaultState.sol:24" - }, - { - "label": "queuedShares", - "offset": 0, - "slot": "153", - "type": "t_uint128", - "contract": "VaultState", - "src": "contracts/vaults/modules/VaultState.sol:27" - }, - { - "label": "_unclaimedAssets", - "offset": 16, - "slot": "153", - "type": "t_uint128", - "contract": "VaultState", - "src": "contracts/vaults/modules/VaultState.sol:28" - }, - { - "label": "_exitQueue", - "offset": 0, - "slot": "154", - "type": "t_struct(History)13839_storage", - "contract": "VaultState", - "src": "contracts/vaults/modules/VaultState.sol:29" - }, - { - "label": "_exitRequests", - "offset": 0, - "slot": "155", - "type": "t_mapping(t_bytes32,t_uint256)", - "contract": "VaultState", - "src": "contracts/vaults/modules/VaultState.sol:31" - }, - { - "label": "_balances", - "offset": 0, - "slot": "156", - "type": "t_mapping(t_address,t_uint256)", - "contract": "VaultState", - "src": "contracts/vaults/modules/VaultState.sol:32" - }, - { - "label": "_capacity", - "offset": 0, - "slot": "157", - "type": "t_uint256", - "contract": "VaultState", - "src": "contracts/vaults/modules/VaultState.sol:34" - }, - { - "label": "totalExitingAssets", - "offset": 0, - "slot": "158", - "type": "t_uint128", - "contract": "VaultState", - "src": "contracts/vaults/modules/VaultState.sol:37" - }, - { - "label": "_totalExitingTickets", - "offset": 16, - "slot": "158", - "type": "t_uint128", - "contract": "VaultState", - "src": "contracts/vaults/modules/VaultState.sol:38" - }, - { - "label": "_totalExitedTickets", - "offset": 0, - "slot": "159", - "type": "t_uint256", - "contract": "VaultState", - "src": "contracts/vaults/modules/VaultState.sol:39" - }, - { - "label": "__gap", - "offset": 0, - "slot": "160", - "type": "t_array(t_uint256)48_storage", - "contract": "VaultState", - "src": "contracts/vaults/modules/VaultState.sol:330" - }, - { - "label": "_validatorsRoot", - "offset": 0, - "slot": "208", - "type": "t_bytes32", - "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:31" - }, - { - "label": "_validatorIndex", - "offset": 0, - "slot": "209", - "type": "t_uint256", - "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:34" - }, - { - "label": "_validatorsManager", - "offset": 0, - "slot": "210", - "type": "t_address", - "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:36" - }, - { - "label": "__gap", - "offset": 0, - "slot": "211", - "type": "t_array(t_uint256)50_storage", - "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:155" - }, - { - "label": "__gap", - "offset": 0, - "slot": "261", - "type": "t_array(t_uint256)50_storage", - "contract": "VaultEnterExit", - "src": "contracts/vaults/modules/VaultEnterExit.sol:270" - }, - { - "label": "_ownMevEscrow", - "offset": 0, - "slot": "311", - "type": "t_address", - "contract": "VaultMev", - "src": "contracts/vaults/modules/VaultMev.sol:20" - }, - { - "label": "__gap", - "offset": 0, - "slot": "312", - "type": "t_array(t_uint256)50_storage", - "contract": "VaultMev", - "src": "contracts/vaults/modules/VaultMev.sol:77" - }, - { - "label": "__gap", - "offset": 0, - "slot": "362", - "type": "t_array(t_uint256)50_storage", - "contract": "VaultEthStaking", - "src": "contracts/vaults/modules/VaultEthStaking.sol:152" - }, - { - "label": "_restakeOperatorsManager", - "offset": 0, - "slot": "412", - "type": "t_address", - "contract": "VaultEthRestaking", - "src": "contracts/vaults/modules/VaultEthRestaking.sol:25" - }, - { - "label": "_restakeWithdrawalsManager", - "offset": 0, - "slot": "413", - "type": "t_address", - "contract": "VaultEthRestaking", - "src": "contracts/vaults/modules/VaultEthRestaking.sol:26" - }, - { - "label": "_eigenPods", - "offset": 0, - "slot": "414", - "type": "t_struct(AddressSet)8262_storage", - "contract": "VaultEthRestaking", - "src": "contracts/vaults/modules/VaultEthRestaking.sol:28" - }, - { - "label": "_eigenPodOwners", - "offset": 0, - "slot": "416", - "type": "t_struct(AddressSet)8262_storage", - "contract": "VaultEthRestaking", - "src": "contracts/vaults/modules/VaultEthRestaking.sol:29" - }, - { - "label": "__gap", - "offset": 0, - "slot": "418", - "type": "t_array(t_uint256)50_storage", - "contract": "VaultEthRestaking", - "src": "contracts/vaults/modules/VaultEthRestaking.sol:164" - }, - { - "label": "__gap", - "offset": 0, - "slot": "468", - "type": "t_array(t_uint256)50_storage", - "contract": "EthRestakeVault", - "src": "contracts/vaults/ethereum/restake/EthRestakeVault.sol:164" - }, - { - "label": "blocklistManager", - "offset": 0, - "slot": "518", - "type": "t_address", - "contract": "VaultBlocklist", - "src": "contracts/vaults/modules/VaultBlocklist.sol:17" - }, - { - "label": "blockedAccounts", - "offset": 0, - "slot": "519", - "type": "t_mapping(t_address,t_bool)", - "contract": "VaultBlocklist", - "src": "contracts/vaults/modules/VaultBlocklist.sol:20" - }, - { - "label": "__gap", - "offset": 0, - "slot": "520", - "type": "t_array(t_uint256)50_storage", - "contract": "VaultBlocklist", - "src": "contracts/vaults/modules/VaultBlocklist.sol:68" - }, - { - "label": "__gap", - "offset": 0, - "slot": "570", - "type": "t_array(t_uint256)50_storage", - "contract": "EthRestakeBlocklistVault", - "src": "contracts/vaults/ethereum/restake/EthRestakeBlocklistVault.sol:115" - } - ], - "types": { - "t_bool": { - "label": "bool", - "numberOfBytes": "1" - }, - "t_struct(InitializableStorage)105_storage": { - "label": "struct Initializable.InitializableStorage", - "members": [ - { - "label": "_initialized", - "type": "t_uint64", - "offset": 0, - "slot": "0" - }, - { - "label": "_initializing", - "type": "t_bool", - "offset": 8, - "slot": "0" - } - ], - "numberOfBytes": "32" - }, - "t_struct(ReentrancyGuardStorage)229_storage": { - "label": "struct ReentrancyGuardUpgradeable.ReentrancyGuardStorage", - "members": [ - { - "label": "_status", - "type": "t_uint256", - "offset": 0, - "slot": "0" - } - ], - "numberOfBytes": "32" - }, - "t_uint256": { - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint64": { - "label": "uint64", - "numberOfBytes": "8" - }, - "t_address": { - "label": "address", - "numberOfBytes": "20" - }, - "t_array(t_bytes32)dyn_storage": { - "label": "bytes32[]", - "numberOfBytes": "32" - }, - "t_array(t_struct(Checkpoint)13833_storage)dyn_storage": { - "label": "struct ExitQueue.Checkpoint[]", - "numberOfBytes": "32" - }, - "t_array(t_uint256)48_storage": { - "label": "uint256[48]", - "numberOfBytes": "1536" - }, - "t_array(t_uint256)50_storage": { - "label": "uint256[50]", - "numberOfBytes": "1600" - }, - "t_bytes32": { - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_mapping(t_address,t_bool)": { - "label": "mapping(address => bool)", - "numberOfBytes": "32" - }, - "t_mapping(t_address,t_uint256)": { - "label": "mapping(address => uint256)", - "numberOfBytes": "32" - }, - "t_mapping(t_bytes32,t_uint256)": { - "label": "mapping(bytes32 => uint256)", - "numberOfBytes": "32" - }, - "t_struct(AddressSet)8262_storage": { - "label": "struct EnumerableSet.AddressSet", - "members": [ - { - "label": "_inner", - "type": "t_struct(Set)7947_storage", - "offset": 0, - "slot": "0" - } - ], - "numberOfBytes": "64" - }, - "t_struct(Checkpoint)13833_storage": { - "label": "struct ExitQueue.Checkpoint", - "members": [ - { - "label": "totalTickets", - "type": "t_uint160", - "offset": 0, - "slot": "0" - }, - { - "label": "exitedAssets", - "type": "t_uint96", - "offset": 20, - "slot": "0" - } - ], - "numberOfBytes": "32" - }, - "t_struct(History)13839_storage": { - "label": "struct ExitQueue.History", - "members": [ - { - "label": "checkpoints", - "type": "t_array(t_struct(Checkpoint)13833_storage)dyn_storage", - "offset": 0, - "slot": "0" - } - ], - "numberOfBytes": "32" - }, - "t_struct(Set)7947_storage": { - "label": "struct EnumerableSet.Set", - "members": [ - { - "label": "_values", - "type": "t_array(t_bytes32)dyn_storage", - "offset": 0, - "slot": "0" - }, - { - "label": "_positions", - "type": "t_mapping(t_bytes32,t_uint256)", - "offset": 0, - "slot": "1" - } - ], - "numberOfBytes": "64" - }, - "t_uint128": { - "label": "uint128", - "numberOfBytes": "16" - }, - "t_uint16": { - "label": "uint16", - "numberOfBytes": "2" - }, - "t_uint160": { - "label": "uint160", - "numberOfBytes": "20" - }, - "t_uint96": { - "label": "uint96", - "numberOfBytes": "12" - } - }, - "namespaces": { - "erc7201:openzeppelin.storage.ReentrancyGuard": [ - { - "contract": "ReentrancyGuardUpgradeable", - "label": "_status", - "type": "t_uint256", - "src": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol:40", - "offset": 0, - "slot": "0" - } - ], - "erc7201:openzeppelin.storage.Initializable": [ - { - "contract": "Initializable", - "label": "_initialized", - "type": "t_uint64", - "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69", - "offset": 0, - "slot": "0" - }, - { - "contract": "Initializable", - "label": "_initializing", - "type": "t_bool", - "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73", - "offset": 8, - "slot": "0" - } - ] - } - } - }, - "b81a247c4b13e12f4265cb9654ab8369c085a686c14b0020428d62a7b66575e1": { - "address": "0x113cE05f0A298396c49De145A75A57A181a6F4D8", - "layout": { - "solcVersion": "0.8.22", - "storage": [ - { - "label": "name", + "label": "name", "offset": 0, "slot": "0", "type": "t_string_storage", @@ -7657,7 +7377,7 @@ "label": "_exitQueue", "offset": 0, "slot": "209", - "type": "t_struct(History)13839_storage", + "type": "t_struct(History)13998_storage", "contract": "VaultState", "src": "contracts/vaults/modules/VaultState.sol:29" }, @@ -7723,7 +7443,7 @@ "slot": "263", "type": "t_bytes32", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:31" + "src": "contracts/vaults/modules/VaultValidators.sol:39" }, { "label": "_validatorIndex", @@ -7731,7 +7451,7 @@ "slot": "264", "type": "t_uint256", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:34" + "src": "contracts/vaults/modules/VaultValidators.sol:42" }, { "label": "_validatorsManager", @@ -7739,15 +7459,23 @@ "slot": "265", "type": "t_address", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:36" + "src": "contracts/vaults/modules/VaultValidators.sol:44" }, { - "label": "__gap", + "label": "_initialDomainSeparator", "offset": 0, "slot": "266", - "type": "t_array(t_uint256)50_storage", + "type": "t_bytes32", + "contract": "VaultValidators", + "src": "contracts/vaults/modules/VaultValidators.sol:46" + }, + { + "label": "__gap", + "offset": 0, + "slot": "267", + "type": "t_array(t_uint256)49_storage", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:155" + "src": "contracts/vaults/modules/VaultValidators.sol:228" }, { "label": "__gap", @@ -7809,7 +7537,7 @@ "label": "_eigenPods", "offset": 0, "slot": "519", - "type": "t_struct(AddressSet)8262_storage", + "type": "t_struct(AddressSet)8377_storage", "contract": "VaultEthRestaking", "src": "contracts/vaults/modules/VaultEthRestaking.sol:28" }, @@ -7817,7 +7545,7 @@ "label": "_eigenPodOwners", "offset": 0, "slot": "521", - "type": "t_struct(AddressSet)8262_storage", + "type": "t_struct(AddressSet)8377_storage", "contract": "VaultEthRestaking", "src": "contracts/vaults/modules/VaultEthRestaking.sol:29" }, @@ -7889,7 +7617,7 @@ "label": "bytes32[]", "numberOfBytes": "32" }, - "t_array(t_struct(Checkpoint)13833_storage)dyn_storage": { + "t_array(t_struct(Checkpoint)13992_storage)dyn_storage": { "label": "struct ExitQueue.Checkpoint[]", "numberOfBytes": "32" }, @@ -7897,6 +7625,10 @@ "label": "uint256[48]", "numberOfBytes": "1536" }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, "t_array(t_uint256)50_storage": { "label": "uint256[50]", "numberOfBytes": "1600" @@ -7921,19 +7653,19 @@ "label": "string", "numberOfBytes": "32" }, - "t_struct(AddressSet)8262_storage": { + "t_struct(AddressSet)8377_storage": { "label": "struct EnumerableSet.AddressSet", "members": [ { "label": "_inner", - "type": "t_struct(Set)7947_storage", + "type": "t_struct(Set)8062_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "64" }, - "t_struct(Checkpoint)13833_storage": { + "t_struct(Checkpoint)13992_storage": { "label": "struct ExitQueue.Checkpoint", "members": [ { @@ -7951,19 +7683,19 @@ ], "numberOfBytes": "32" }, - "t_struct(History)13839_storage": { + "t_struct(History)13998_storage": { "label": "struct ExitQueue.History", "members": [ { "label": "checkpoints", - "type": "t_array(t_struct(Checkpoint)13833_storage)dyn_storage", + "type": "t_array(t_struct(Checkpoint)13992_storage)dyn_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "32" }, - "t_struct(Set)7947_storage": { + "t_struct(Set)8062_storage": { "label": "struct EnumerableSet.Set", "members": [ { @@ -8030,8 +7762,8 @@ } } }, - "867d53815df191a7a0eda36b782e6c7c201a1589a4e7b70e65cefda680f56b05": { - "address": "0xDc1956b33EA8649Bd5aa03bE8d8Fec2C9b3D5bbF", + "805b30619fc57c82090817f2da45f661f5fb835f48b4170a8c3fb92f5b50e260": { + "address": "0x03a074511A399cbe8156cc5DfAC72958BeaFFA98", "layout": { "solcVersion": "0.8.22", "storage": [ @@ -8167,7 +7899,7 @@ "label": "_exitQueue", "offset": 0, "slot": "209", - "type": "t_struct(History)13839_storage", + "type": "t_struct(History)13998_storage", "contract": "VaultState", "src": "contracts/vaults/modules/VaultState.sol:29" }, @@ -8233,7 +7965,7 @@ "slot": "263", "type": "t_bytes32", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:31" + "src": "contracts/vaults/modules/VaultValidators.sol:39" }, { "label": "_validatorIndex", @@ -8241,7 +7973,7 @@ "slot": "264", "type": "t_uint256", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:34" + "src": "contracts/vaults/modules/VaultValidators.sol:42" }, { "label": "_validatorsManager", @@ -8249,15 +7981,23 @@ "slot": "265", "type": "t_address", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:36" + "src": "contracts/vaults/modules/VaultValidators.sol:44" }, { - "label": "__gap", + "label": "_initialDomainSeparator", "offset": 0, "slot": "266", - "type": "t_array(t_uint256)50_storage", + "type": "t_bytes32", + "contract": "VaultValidators", + "src": "contracts/vaults/modules/VaultValidators.sol:46" + }, + { + "label": "__gap", + "offset": 0, + "slot": "267", + "type": "t_array(t_uint256)49_storage", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:155" + "src": "contracts/vaults/modules/VaultValidators.sol:228" }, { "label": "__gap", @@ -8319,7 +8059,7 @@ "label": "_eigenPods", "offset": 0, "slot": "519", - "type": "t_struct(AddressSet)8262_storage", + "type": "t_struct(AddressSet)8377_storage", "contract": "VaultEthRestaking", "src": "contracts/vaults/modules/VaultEthRestaking.sol:28" }, @@ -8327,7 +8067,7 @@ "label": "_eigenPodOwners", "offset": 0, "slot": "521", - "type": "t_struct(AddressSet)8262_storage", + "type": "t_struct(AddressSet)8377_storage", "contract": "VaultEthRestaking", "src": "contracts/vaults/modules/VaultEthRestaking.sol:29" }, @@ -8431,7 +8171,7 @@ "label": "bytes32[]", "numberOfBytes": "32" }, - "t_array(t_struct(Checkpoint)13833_storage)dyn_storage": { + "t_array(t_struct(Checkpoint)13992_storage)dyn_storage": { "label": "struct ExitQueue.Checkpoint[]", "numberOfBytes": "32" }, @@ -8439,6 +8179,10 @@ "label": "uint256[48]", "numberOfBytes": "1536" }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, "t_array(t_uint256)50_storage": { "label": "uint256[50]", "numberOfBytes": "1600" @@ -8467,19 +8211,19 @@ "label": "string", "numberOfBytes": "32" }, - "t_struct(AddressSet)8262_storage": { + "t_struct(AddressSet)8377_storage": { "label": "struct EnumerableSet.AddressSet", "members": [ { "label": "_inner", - "type": "t_struct(Set)7947_storage", + "type": "t_struct(Set)8062_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "64" }, - "t_struct(Checkpoint)13833_storage": { + "t_struct(Checkpoint)13992_storage": { "label": "struct ExitQueue.Checkpoint", "members": [ { @@ -8497,19 +8241,19 @@ ], "numberOfBytes": "32" }, - "t_struct(History)13839_storage": { + "t_struct(History)13998_storage": { "label": "struct ExitQueue.History", "members": [ { "label": "checkpoints", - "type": "t_array(t_struct(Checkpoint)13833_storage)dyn_storage", + "type": "t_array(t_struct(Checkpoint)13992_storage)dyn_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "32" }, - "t_struct(Set)7947_storage": { + "t_struct(Set)8062_storage": { "label": "struct EnumerableSet.Set", "members": [ { @@ -8576,8 +8320,8 @@ } } }, - "197739cc1901e7d632d6d3e3930f03ea8055cced3bbe200278f490cadcf17957": { - "address": "0xafE868933a30061ccbEF0F37352e7E87672fE16F", + "02e8fd70a4efbe86fefa061086f6e4d04e38c77b871392421ada726eba4c890e": { + "address": "0x17CE5aaBB33121ed03cBdB97d296458810319703", "layout": { "solcVersion": "0.8.22", "storage": [ @@ -8713,7 +8457,7 @@ "label": "_exitQueue", "offset": 0, "slot": "209", - "type": "t_struct(History)13839_storage", + "type": "t_struct(History)13998_storage", "contract": "VaultState", "src": "contracts/vaults/modules/VaultState.sol:29" }, @@ -8779,7 +8523,7 @@ "slot": "263", "type": "t_bytes32", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:31" + "src": "contracts/vaults/modules/VaultValidators.sol:39" }, { "label": "_validatorIndex", @@ -8787,7 +8531,7 @@ "slot": "264", "type": "t_uint256", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:34" + "src": "contracts/vaults/modules/VaultValidators.sol:42" }, { "label": "_validatorsManager", @@ -8795,15 +8539,23 @@ "slot": "265", "type": "t_address", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:36" + "src": "contracts/vaults/modules/VaultValidators.sol:44" }, { - "label": "__gap", + "label": "_initialDomainSeparator", "offset": 0, "slot": "266", - "type": "t_array(t_uint256)50_storage", + "type": "t_bytes32", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:155" + "src": "contracts/vaults/modules/VaultValidators.sol:46" + }, + { + "label": "__gap", + "offset": 0, + "slot": "267", + "type": "t_array(t_uint256)49_storage", + "contract": "VaultValidators", + "src": "contracts/vaults/modules/VaultValidators.sol:228" }, { "label": "__gap", @@ -8865,7 +8617,7 @@ "label": "_eigenPods", "offset": 0, "slot": "519", - "type": "t_struct(AddressSet)8262_storage", + "type": "t_struct(AddressSet)8377_storage", "contract": "VaultEthRestaking", "src": "contracts/vaults/modules/VaultEthRestaking.sol:28" }, @@ -8873,7 +8625,7 @@ "label": "_eigenPodOwners", "offset": 0, "slot": "521", - "type": "t_struct(AddressSet)8262_storage", + "type": "t_struct(AddressSet)8377_storage", "contract": "VaultEthRestaking", "src": "contracts/vaults/modules/VaultEthRestaking.sol:29" }, @@ -8977,7 +8729,7 @@ "label": "bytes32[]", "numberOfBytes": "32" }, - "t_array(t_struct(Checkpoint)13833_storage)dyn_storage": { + "t_array(t_struct(Checkpoint)13992_storage)dyn_storage": { "label": "struct ExitQueue.Checkpoint[]", "numberOfBytes": "32" }, @@ -8985,6 +8737,10 @@ "label": "uint256[48]", "numberOfBytes": "1536" }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, "t_array(t_uint256)50_storage": { "label": "uint256[50]", "numberOfBytes": "1600" @@ -9013,19 +8769,19 @@ "label": "string", "numberOfBytes": "32" }, - "t_struct(AddressSet)8262_storage": { + "t_struct(AddressSet)8377_storage": { "label": "struct EnumerableSet.AddressSet", "members": [ { "label": "_inner", - "type": "t_struct(Set)7947_storage", + "type": "t_struct(Set)8062_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "64" }, - "t_struct(Checkpoint)13833_storage": { + "t_struct(Checkpoint)13992_storage": { "label": "struct ExitQueue.Checkpoint", "members": [ { @@ -9043,19 +8799,19 @@ ], "numberOfBytes": "32" }, - "t_struct(History)13839_storage": { + "t_struct(History)13998_storage": { "label": "struct ExitQueue.History", "members": [ { "label": "checkpoints", - "type": "t_array(t_struct(Checkpoint)13833_storage)dyn_storage", + "type": "t_array(t_struct(Checkpoint)13992_storage)dyn_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "32" }, - "t_struct(Set)7947_storage": { + "t_struct(Set)8062_storage": { "label": "struct EnumerableSet.Set", "members": [ { @@ -9121,6 +8877,98 @@ ] } } + }, + "295ab656c218d61652acceda8183568f83c8f7340e757c243368508476fdcaca": { + "address": "0x47e002D75dD386Fc9df8E0d0acDcF77B505A97CB", + "layout": { + "solcVersion": "0.8.22", + "storage": [ + { + "label": "vault", + "offset": 0, + "slot": "0", + "type": "t_address", + "contract": "EigenPodOwner", + "src": "contracts/vaults/ethereum/restake/EigenPodOwner.sol:37" + }, + { + "label": "eigenPod", + "offset": 0, + "slot": "1", + "type": "t_address", + "contract": "EigenPodOwner", + "src": "contracts/vaults/ethereum/restake/EigenPodOwner.sol:41" + }, + { + "label": "__gap", + "offset": 0, + "slot": "2", + "type": "t_array(t_uint256)50_storage", + "contract": "EigenPodOwner", + "src": "contracts/vaults/ethereum/restake/EigenPodOwner.sol:244" + } + ], + "types": { + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_struct(InitializableStorage)105_storage": { + "label": "struct Initializable.InitializableStorage", + "members": [ + { + "label": "_initialized", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "_initializing", + "type": "t_bool", + "offset": 8, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + } + }, + "namespaces": { + "erc7201:openzeppelin.storage.Initializable": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_uint64", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:69", + "offset": 0, + "slot": "0" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:73", + "offset": 8, + "slot": "0" + } + ] + } + } } } } diff --git a/.openzeppelin/unknown-10200.json b/.openzeppelin/unknown-10200.json index c78832fb..53ba0e54 100644 --- a/.openzeppelin/unknown-10200.json +++ b/.openzeppelin/unknown-10200.json @@ -2,15 +2,23 @@ "manifestVersion": "3.2", "proxies": [], "impls": { - "984b28604b451c53d185562526e48707e6e5a46cc4d1eedcc87f78079e348100": { - "address": "0xa0dE6A44177990a727978d83f71103132B1530DE", + "2328315ed971540ed0d9104b75e2a1e501e16c23c156b1980aa99ee6b5d61888": { + "address": "0x7044a5437aa9C731Db53C3F4994e58Ce4A70D783", "layout": { "solcVersion": "0.8.22", "storage": [ { - "label": "maxSlippage", + "label": "balancerPoolId", "offset": 0, "slot": "0", + "type": "t_bytes32", + "contract": "XdaiExchange", + "src": "contracts/misc/XdaiExchange.sol:50" + }, + { + "label": "maxSlippage", + "offset": 0, + "slot": "1", "type": "t_uint128", "contract": "XdaiExchange", "src": "contracts/misc/XdaiExchange.sol:53" @@ -18,7 +26,7 @@ { "label": "stalePriceTimeDelta", "offset": 16, - "slot": "0", + "slot": "1", "type": "t_uint128", "contract": "XdaiExchange", "src": "contracts/misc/XdaiExchange.sol:56" @@ -95,6 +103,10 @@ "label": "uint64", "numberOfBytes": "8" }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, "t_uint128": { "label": "uint128", "numberOfBytes": "16" @@ -152,8 +164,8 @@ } } }, - "4b6e90b3d5f20183383062c83f7f4a2b56bfe26f027ca9ba5a84c3fff35c4cba": { - "address": "0xd25F5780AD83cd6fd468DbfA22027FB89F6047Bc", + "3d11b761c80fc0941679798435786f5e38d36fa5097bbc3d4f0553897d263c9e": { + "address": "0x9722e2fcfb33Cfcb415577f70eCbf88f281754C5", "layout": { "solcVersion": "0.8.22", "storage": [ @@ -241,7 +253,7 @@ "label": "_exitQueue", "offset": 0, "slot": "154", - "type": "t_struct(History)13839_storage", + "type": "t_struct(History)13998_storage", "contract": "VaultState", "src": "contracts/vaults/modules/VaultState.sol:29" }, @@ -307,7 +319,7 @@ "slot": "208", "type": "t_bytes32", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:31" + "src": "contracts/vaults/modules/VaultValidators.sol:39" }, { "label": "_validatorIndex", @@ -315,7 +327,7 @@ "slot": "209", "type": "t_uint256", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:34" + "src": "contracts/vaults/modules/VaultValidators.sol:42" }, { "label": "_validatorsManager", @@ -323,15 +335,23 @@ "slot": "210", "type": "t_address", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:36" + "src": "contracts/vaults/modules/VaultValidators.sol:44" }, { - "label": "__gap", + "label": "_initialDomainSeparator", "offset": 0, "slot": "211", - "type": "t_array(t_uint256)50_storage", + "type": "t_bytes32", + "contract": "VaultValidators", + "src": "contracts/vaults/modules/VaultValidators.sol:46" + }, + { + "label": "__gap", + "offset": 0, + "slot": "212", + "type": "t_array(t_uint256)49_storage", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:155" + "src": "contracts/vaults/modules/VaultValidators.sol:228" }, { "label": "__gap", @@ -345,9 +365,9 @@ "label": "_positions", "offset": 0, "slot": "311", - "type": "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)", + "type": "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:31" + "src": "contracts/vaults/modules/VaultOsToken.sol:32" }, { "label": "__gap", @@ -355,7 +375,7 @@ "slot": "312", "type": "t_array(t_uint256)50_storage", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:305" + "src": "contracts/vaults/modules/VaultOsToken.sol:294" }, { "label": "_ownMevEscrow", @@ -437,7 +457,7 @@ "label": "address", "numberOfBytes": "20" }, - "t_array(t_struct(Checkpoint)13833_storage)dyn_storage": { + "t_array(t_struct(Checkpoint)13992_storage)dyn_storage": { "label": "struct ExitQueue.Checkpoint[]", "numberOfBytes": "32" }, @@ -445,6 +465,10 @@ "label": "uint256[48]", "numberOfBytes": "1536" }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, "t_array(t_uint256)50_storage": { "label": "uint256[50]", "numberOfBytes": "1600" @@ -453,7 +477,7 @@ "label": "bytes32", "numberOfBytes": "32" }, - "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)": { + "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)": { "label": "mapping(address => struct IVaultOsToken.OsTokenPosition)", "numberOfBytes": "32" }, @@ -465,7 +489,7 @@ "label": "mapping(bytes32 => uint256)", "numberOfBytes": "32" }, - "t_struct(Checkpoint)13833_storage": { + "t_struct(Checkpoint)13992_storage": { "label": "struct ExitQueue.Checkpoint", "members": [ { @@ -483,19 +507,19 @@ ], "numberOfBytes": "32" }, - "t_struct(History)13839_storage": { + "t_struct(History)13998_storage": { "label": "struct ExitQueue.History", "members": [ { "label": "checkpoints", - "type": "t_array(t_struct(Checkpoint)13833_storage)dyn_storage", + "type": "t_array(t_struct(Checkpoint)13992_storage)dyn_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "32" }, - "t_struct(OsTokenPosition)12097_storage": { + "t_struct(OsTokenPosition)12235_storage": { "label": "struct IVaultOsToken.OsTokenPosition", "members": [ { @@ -562,8 +586,8 @@ } } }, - "09ef894b143a2b2f2bf2a19c7ed0b37a16c4d05e126b16b3864c1e381b61dbe9": { - "address": "0x4DA15B86DBCCFB2a1AE739C6342D7f29b16fC00c", + "369beba60e0af439f39a578c8c3ea80b365b77612b2d5397dac602e0135ada47": { + "address": "0xDBB61F42741c7CA525078d2A7CDF512eF265E5fE", "layout": { "solcVersion": "0.8.22", "storage": [ @@ -651,7 +675,7 @@ "label": "_exitQueue", "offset": 0, "slot": "154", - "type": "t_struct(History)13839_storage", + "type": "t_struct(History)13998_storage", "contract": "VaultState", "src": "contracts/vaults/modules/VaultState.sol:29" }, @@ -717,7 +741,7 @@ "slot": "208", "type": "t_bytes32", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:31" + "src": "contracts/vaults/modules/VaultValidators.sol:39" }, { "label": "_validatorIndex", @@ -725,7 +749,7 @@ "slot": "209", "type": "t_uint256", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:34" + "src": "contracts/vaults/modules/VaultValidators.sol:42" }, { "label": "_validatorsManager", @@ -733,15 +757,23 @@ "slot": "210", "type": "t_address", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:36" + "src": "contracts/vaults/modules/VaultValidators.sol:44" }, { - "label": "__gap", + "label": "_initialDomainSeparator", "offset": 0, "slot": "211", - "type": "t_array(t_uint256)50_storage", + "type": "t_bytes32", + "contract": "VaultValidators", + "src": "contracts/vaults/modules/VaultValidators.sol:46" + }, + { + "label": "__gap", + "offset": 0, + "slot": "212", + "type": "t_array(t_uint256)49_storage", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:155" + "src": "contracts/vaults/modules/VaultValidators.sol:228" }, { "label": "__gap", @@ -755,9 +787,9 @@ "label": "_positions", "offset": 0, "slot": "311", - "type": "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)", + "type": "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:31" + "src": "contracts/vaults/modules/VaultOsToken.sol:32" }, { "label": "__gap", @@ -765,7 +797,7 @@ "slot": "312", "type": "t_array(t_uint256)50_storage", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:305" + "src": "contracts/vaults/modules/VaultOsToken.sol:294" }, { "label": "_ownMevEscrow", @@ -879,7 +911,7 @@ "label": "address", "numberOfBytes": "20" }, - "t_array(t_struct(Checkpoint)13833_storage)dyn_storage": { + "t_array(t_struct(Checkpoint)13992_storage)dyn_storage": { "label": "struct ExitQueue.Checkpoint[]", "numberOfBytes": "32" }, @@ -887,6 +919,10 @@ "label": "uint256[48]", "numberOfBytes": "1536" }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, "t_array(t_uint256)50_storage": { "label": "uint256[50]", "numberOfBytes": "1600" @@ -899,7 +935,7 @@ "label": "mapping(address => bool)", "numberOfBytes": "32" }, - "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)": { + "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)": { "label": "mapping(address => struct IVaultOsToken.OsTokenPosition)", "numberOfBytes": "32" }, @@ -911,7 +947,7 @@ "label": "mapping(bytes32 => uint256)", "numberOfBytes": "32" }, - "t_struct(Checkpoint)13833_storage": { + "t_struct(Checkpoint)13992_storage": { "label": "struct ExitQueue.Checkpoint", "members": [ { @@ -929,19 +965,19 @@ ], "numberOfBytes": "32" }, - "t_struct(History)13839_storage": { + "t_struct(History)13998_storage": { "label": "struct ExitQueue.History", "members": [ { "label": "checkpoints", - "type": "t_array(t_struct(Checkpoint)13833_storage)dyn_storage", + "type": "t_array(t_struct(Checkpoint)13992_storage)dyn_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "32" }, - "t_struct(OsTokenPosition)12097_storage": { + "t_struct(OsTokenPosition)12235_storage": { "label": "struct IVaultOsToken.OsTokenPosition", "members": [ { @@ -1008,8 +1044,8 @@ } } }, - "ea78e506844ebef90160b76c856f5a30ff30f47b3e49118cc27b5c17c9b202f2": { - "address": "0xf89d16d3150189CCfC91b0BA4186007Dd7D68d26", + "223da1cd9c4079c614cc92c0b8ddb924909b5ffd20a5078c78fa6ba8dc462cb3": { + "address": "0x91167861c590Fd68bEbE662951fBE30C9B23D759", "layout": { "solcVersion": "0.8.22", "storage": [ @@ -1097,7 +1133,7 @@ "label": "_exitQueue", "offset": 0, "slot": "154", - "type": "t_struct(History)13839_storage", + "type": "t_struct(History)13998_storage", "contract": "VaultState", "src": "contracts/vaults/modules/VaultState.sol:29" }, @@ -1163,7 +1199,7 @@ "slot": "208", "type": "t_bytes32", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:31" + "src": "contracts/vaults/modules/VaultValidators.sol:39" }, { "label": "_validatorIndex", @@ -1171,7 +1207,7 @@ "slot": "209", "type": "t_uint256", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:34" + "src": "contracts/vaults/modules/VaultValidators.sol:42" }, { "label": "_validatorsManager", @@ -1179,15 +1215,23 @@ "slot": "210", "type": "t_address", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:36" + "src": "contracts/vaults/modules/VaultValidators.sol:44" }, { - "label": "__gap", + "label": "_initialDomainSeparator", "offset": 0, "slot": "211", - "type": "t_array(t_uint256)50_storage", + "type": "t_bytes32", + "contract": "VaultValidators", + "src": "contracts/vaults/modules/VaultValidators.sol:46" + }, + { + "label": "__gap", + "offset": 0, + "slot": "212", + "type": "t_array(t_uint256)49_storage", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:155" + "src": "contracts/vaults/modules/VaultValidators.sol:228" }, { "label": "__gap", @@ -1201,9 +1245,9 @@ "label": "_positions", "offset": 0, "slot": "311", - "type": "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)", + "type": "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:31" + "src": "contracts/vaults/modules/VaultOsToken.sol:32" }, { "label": "__gap", @@ -1211,7 +1255,7 @@ "slot": "312", "type": "t_array(t_uint256)50_storage", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:305" + "src": "contracts/vaults/modules/VaultOsToken.sol:294" }, { "label": "_ownMevEscrow", @@ -1325,7 +1369,7 @@ "label": "address", "numberOfBytes": "20" }, - "t_array(t_struct(Checkpoint)13833_storage)dyn_storage": { + "t_array(t_struct(Checkpoint)13992_storage)dyn_storage": { "label": "struct ExitQueue.Checkpoint[]", "numberOfBytes": "32" }, @@ -1333,6 +1377,10 @@ "label": "uint256[48]", "numberOfBytes": "1536" }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, "t_array(t_uint256)50_storage": { "label": "uint256[50]", "numberOfBytes": "1600" @@ -1345,7 +1393,7 @@ "label": "mapping(address => bool)", "numberOfBytes": "32" }, - "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)": { + "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)": { "label": "mapping(address => struct IVaultOsToken.OsTokenPosition)", "numberOfBytes": "32" }, @@ -1357,7 +1405,7 @@ "label": "mapping(bytes32 => uint256)", "numberOfBytes": "32" }, - "t_struct(Checkpoint)13833_storage": { + "t_struct(Checkpoint)13992_storage": { "label": "struct ExitQueue.Checkpoint", "members": [ { @@ -1375,19 +1423,19 @@ ], "numberOfBytes": "32" }, - "t_struct(History)13839_storage": { + "t_struct(History)13998_storage": { "label": "struct ExitQueue.History", "members": [ { "label": "checkpoints", - "type": "t_array(t_struct(Checkpoint)13833_storage)dyn_storage", + "type": "t_array(t_struct(Checkpoint)13992_storage)dyn_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "32" }, - "t_struct(OsTokenPosition)12097_storage": { + "t_struct(OsTokenPosition)12235_storage": { "label": "struct IVaultOsToken.OsTokenPosition", "members": [ { @@ -1454,8 +1502,8 @@ } } }, - "9efb5ef1c6792ac7bf224c74c9e2e29ee9772f001f1ede60aac45720a9e64b9b": { - "address": "0x863aA927Cd65094F679A9be064914a851D0d7e46", + "f2509f1fe770c663fa3eea1a4e8f33bd49b705779f9a0ae35fc5a31a0e416d7f": { + "address": "0xfeac9628d5a9579c1AB8085a6409a35882901827", "layout": { "solcVersion": "0.8.22", "storage": [ @@ -1591,7 +1639,7 @@ "label": "_exitQueue", "offset": 0, "slot": "209", - "type": "t_struct(History)13839_storage", + "type": "t_struct(History)13998_storage", "contract": "VaultState", "src": "contracts/vaults/modules/VaultState.sol:29" }, @@ -1657,7 +1705,7 @@ "slot": "263", "type": "t_bytes32", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:31" + "src": "contracts/vaults/modules/VaultValidators.sol:39" }, { "label": "_validatorIndex", @@ -1665,7 +1713,7 @@ "slot": "264", "type": "t_uint256", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:34" + "src": "contracts/vaults/modules/VaultValidators.sol:42" }, { "label": "_validatorsManager", @@ -1673,15 +1721,23 @@ "slot": "265", "type": "t_address", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:36" + "src": "contracts/vaults/modules/VaultValidators.sol:44" }, { - "label": "__gap", + "label": "_initialDomainSeparator", "offset": 0, "slot": "266", - "type": "t_array(t_uint256)50_storage", + "type": "t_bytes32", + "contract": "VaultValidators", + "src": "contracts/vaults/modules/VaultValidators.sol:46" + }, + { + "label": "__gap", + "offset": 0, + "slot": "267", + "type": "t_array(t_uint256)49_storage", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:155" + "src": "contracts/vaults/modules/VaultValidators.sol:228" }, { "label": "__gap", @@ -1695,9 +1751,9 @@ "label": "_positions", "offset": 0, "slot": "366", - "type": "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)", + "type": "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:31" + "src": "contracts/vaults/modules/VaultOsToken.sol:32" }, { "label": "__gap", @@ -1705,7 +1761,7 @@ "slot": "367", "type": "t_array(t_uint256)50_storage", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:305" + "src": "contracts/vaults/modules/VaultOsToken.sol:294" }, { "label": "_ownMevEscrow", @@ -1795,7 +1851,7 @@ "label": "address", "numberOfBytes": "20" }, - "t_array(t_struct(Checkpoint)13833_storage)dyn_storage": { + "t_array(t_struct(Checkpoint)13992_storage)dyn_storage": { "label": "struct ExitQueue.Checkpoint[]", "numberOfBytes": "32" }, @@ -1803,6 +1859,10 @@ "label": "uint256[48]", "numberOfBytes": "1536" }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, "t_array(t_uint256)50_storage": { "label": "uint256[50]", "numberOfBytes": "1600" @@ -1815,7 +1875,7 @@ "label": "mapping(address => mapping(address => uint256))", "numberOfBytes": "32" }, - "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)": { + "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)": { "label": "mapping(address => struct IVaultOsToken.OsTokenPosition)", "numberOfBytes": "32" }, @@ -1831,7 +1891,7 @@ "label": "string", "numberOfBytes": "32" }, - "t_struct(Checkpoint)13833_storage": { + "t_struct(Checkpoint)13992_storage": { "label": "struct ExitQueue.Checkpoint", "members": [ { @@ -1849,19 +1909,19 @@ ], "numberOfBytes": "32" }, - "t_struct(History)13839_storage": { + "t_struct(History)13998_storage": { "label": "struct ExitQueue.History", "members": [ { "label": "checkpoints", - "type": "t_array(t_struct(Checkpoint)13833_storage)dyn_storage", + "type": "t_array(t_struct(Checkpoint)13992_storage)dyn_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "32" }, - "t_struct(OsTokenPosition)12097_storage": { + "t_struct(OsTokenPosition)12235_storage": { "label": "struct IVaultOsToken.OsTokenPosition", "members": [ { @@ -1928,8 +1988,8 @@ } } }, - "3e63d8674b8bcfa51a6dbf68e3e8fadbfab69d87cecf0eeb8a9afb5f071e0dce": { - "address": "0x164b93A15aEC519bDD5Aefe5C641906aD6E24a45", + "59639dfc22931138cab1634bb28f3bd7224fef607abe326811ea675ba2f18e81": { + "address": "0xA8138220195E3fE7317c3714Bf38Eb8606421311", "layout": { "solcVersion": "0.8.22", "storage": [ @@ -2065,7 +2125,7 @@ "label": "_exitQueue", "offset": 0, "slot": "209", - "type": "t_struct(History)13839_storage", + "type": "t_struct(History)13998_storage", "contract": "VaultState", "src": "contracts/vaults/modules/VaultState.sol:29" }, @@ -2131,7 +2191,7 @@ "slot": "263", "type": "t_bytes32", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:31" + "src": "contracts/vaults/modules/VaultValidators.sol:39" }, { "label": "_validatorIndex", @@ -2139,7 +2199,7 @@ "slot": "264", "type": "t_uint256", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:34" + "src": "contracts/vaults/modules/VaultValidators.sol:42" }, { "label": "_validatorsManager", @@ -2147,15 +2207,23 @@ "slot": "265", "type": "t_address", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:36" + "src": "contracts/vaults/modules/VaultValidators.sol:44" }, { - "label": "__gap", + "label": "_initialDomainSeparator", "offset": 0, "slot": "266", - "type": "t_array(t_uint256)50_storage", + "type": "t_bytes32", + "contract": "VaultValidators", + "src": "contracts/vaults/modules/VaultValidators.sol:46" + }, + { + "label": "__gap", + "offset": 0, + "slot": "267", + "type": "t_array(t_uint256)49_storage", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:155" + "src": "contracts/vaults/modules/VaultValidators.sol:228" }, { "label": "__gap", @@ -2169,9 +2237,9 @@ "label": "_positions", "offset": 0, "slot": "366", - "type": "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)", + "type": "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:31" + "src": "contracts/vaults/modules/VaultOsToken.sol:32" }, { "label": "__gap", @@ -2179,7 +2247,7 @@ "slot": "367", "type": "t_array(t_uint256)50_storage", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:305" + "src": "contracts/vaults/modules/VaultOsToken.sol:294" }, { "label": "_ownMevEscrow", @@ -2301,7 +2369,7 @@ "label": "address", "numberOfBytes": "20" }, - "t_array(t_struct(Checkpoint)13833_storage)dyn_storage": { + "t_array(t_struct(Checkpoint)13992_storage)dyn_storage": { "label": "struct ExitQueue.Checkpoint[]", "numberOfBytes": "32" }, @@ -2309,6 +2377,10 @@ "label": "uint256[48]", "numberOfBytes": "1536" }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, "t_array(t_uint256)50_storage": { "label": "uint256[50]", "numberOfBytes": "1600" @@ -2325,7 +2397,7 @@ "label": "mapping(address => mapping(address => uint256))", "numberOfBytes": "32" }, - "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)": { + "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)": { "label": "mapping(address => struct IVaultOsToken.OsTokenPosition)", "numberOfBytes": "32" }, @@ -2341,7 +2413,7 @@ "label": "string", "numberOfBytes": "32" }, - "t_struct(Checkpoint)13833_storage": { + "t_struct(Checkpoint)13992_storage": { "label": "struct ExitQueue.Checkpoint", "members": [ { @@ -2359,19 +2431,19 @@ ], "numberOfBytes": "32" }, - "t_struct(History)13839_storage": { + "t_struct(History)13998_storage": { "label": "struct ExitQueue.History", "members": [ { "label": "checkpoints", - "type": "t_array(t_struct(Checkpoint)13833_storage)dyn_storage", + "type": "t_array(t_struct(Checkpoint)13992_storage)dyn_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "32" }, - "t_struct(OsTokenPosition)12097_storage": { + "t_struct(OsTokenPosition)12235_storage": { "label": "struct IVaultOsToken.OsTokenPosition", "members": [ { @@ -2438,8 +2510,8 @@ } } }, - "3e0799ab3cffe8f10e34081a6d9247dc83fac2aaff980dade8d83b10c7f5d245": { - "address": "0x0BCeb24851034dF096e5Ee023Ddd9A64c5348EBF", + "5bf08b8fb8bb31e9757302e8e5ecb9e073695a91b596e6bd22ca8ce182cf78d3": { + "address": "0xcD82bb2C4AF57790Ea25Afd041960203Fa805ad5", "layout": { "solcVersion": "0.8.22", "storage": [ @@ -2575,7 +2647,7 @@ "label": "_exitQueue", "offset": 0, "slot": "209", - "type": "t_struct(History)13839_storage", + "type": "t_struct(History)13998_storage", "contract": "VaultState", "src": "contracts/vaults/modules/VaultState.sol:29" }, @@ -2641,7 +2713,7 @@ "slot": "263", "type": "t_bytes32", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:31" + "src": "contracts/vaults/modules/VaultValidators.sol:39" }, { "label": "_validatorIndex", @@ -2649,7 +2721,7 @@ "slot": "264", "type": "t_uint256", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:34" + "src": "contracts/vaults/modules/VaultValidators.sol:42" }, { "label": "_validatorsManager", @@ -2657,15 +2729,23 @@ "slot": "265", "type": "t_address", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:36" + "src": "contracts/vaults/modules/VaultValidators.sol:44" }, { - "label": "__gap", + "label": "_initialDomainSeparator", "offset": 0, "slot": "266", - "type": "t_array(t_uint256)50_storage", + "type": "t_bytes32", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:155" + "src": "contracts/vaults/modules/VaultValidators.sol:46" + }, + { + "label": "__gap", + "offset": 0, + "slot": "267", + "type": "t_array(t_uint256)49_storage", + "contract": "VaultValidators", + "src": "contracts/vaults/modules/VaultValidators.sol:228" }, { "label": "__gap", @@ -2679,9 +2759,9 @@ "label": "_positions", "offset": 0, "slot": "366", - "type": "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)", + "type": "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:31" + "src": "contracts/vaults/modules/VaultOsToken.sol:32" }, { "label": "__gap", @@ -2689,7 +2769,7 @@ "slot": "367", "type": "t_array(t_uint256)50_storage", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:305" + "src": "contracts/vaults/modules/VaultOsToken.sol:294" }, { "label": "_ownMevEscrow", @@ -2811,7 +2891,7 @@ "label": "address", "numberOfBytes": "20" }, - "t_array(t_struct(Checkpoint)13833_storage)dyn_storage": { + "t_array(t_struct(Checkpoint)13992_storage)dyn_storage": { "label": "struct ExitQueue.Checkpoint[]", "numberOfBytes": "32" }, @@ -2819,6 +2899,10 @@ "label": "uint256[48]", "numberOfBytes": "1536" }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, "t_array(t_uint256)50_storage": { "label": "uint256[50]", "numberOfBytes": "1600" @@ -2835,7 +2919,7 @@ "label": "mapping(address => mapping(address => uint256))", "numberOfBytes": "32" }, - "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)": { + "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)": { "label": "mapping(address => struct IVaultOsToken.OsTokenPosition)", "numberOfBytes": "32" }, @@ -2851,7 +2935,7 @@ "label": "string", "numberOfBytes": "32" }, - "t_struct(Checkpoint)13833_storage": { + "t_struct(Checkpoint)13992_storage": { "label": "struct ExitQueue.Checkpoint", "members": [ { @@ -2869,19 +2953,19 @@ ], "numberOfBytes": "32" }, - "t_struct(History)13839_storage": { + "t_struct(History)13998_storage": { "label": "struct ExitQueue.History", "members": [ { "label": "checkpoints", - "type": "t_array(t_struct(Checkpoint)13833_storage)dyn_storage", + "type": "t_array(t_struct(Checkpoint)13992_storage)dyn_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "32" }, - "t_struct(OsTokenPosition)12097_storage": { + "t_struct(OsTokenPosition)12235_storage": { "label": "struct IVaultOsToken.OsTokenPosition", "members": [ { @@ -2948,8 +3032,8 @@ } } }, - "951a10d1b17eefc72b0421cf095757b4165e70bcf1863d34f0252e877d3a7d5e": { - "address": "0x580d947959e0678d3C5af9dF9FD3d157938482f3", + "b6943b26332a0f6251c8ab225d8e82afc288fbdba99f2fd7ce8730697677255d": { + "address": "0x85bAFD85a6AFcdA5e1F83605d30a78cc87409a4e", "layout": { "solcVersion": "0.8.22", "storage": [ @@ -3037,7 +3121,7 @@ "label": "_exitQueue", "offset": 0, "slot": "154", - "type": "t_struct(History)13839_storage", + "type": "t_struct(History)13998_storage", "contract": "VaultState", "src": "contracts/vaults/modules/VaultState.sol:29" }, @@ -3103,7 +3187,7 @@ "slot": "208", "type": "t_bytes32", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:31" + "src": "contracts/vaults/modules/VaultValidators.sol:39" }, { "label": "_validatorIndex", @@ -3111,7 +3195,7 @@ "slot": "209", "type": "t_uint256", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:34" + "src": "contracts/vaults/modules/VaultValidators.sol:42" }, { "label": "_validatorsManager", @@ -3119,15 +3203,23 @@ "slot": "210", "type": "t_address", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:36" + "src": "contracts/vaults/modules/VaultValidators.sol:44" }, { - "label": "__gap", + "label": "_initialDomainSeparator", "offset": 0, "slot": "211", - "type": "t_array(t_uint256)50_storage", + "type": "t_bytes32", "contract": "VaultValidators", - "src": "contracts/vaults/modules/VaultValidators.sol:155" + "src": "contracts/vaults/modules/VaultValidators.sol:46" + }, + { + "label": "__gap", + "offset": 0, + "slot": "212", + "type": "t_array(t_uint256)49_storage", + "contract": "VaultValidators", + "src": "contracts/vaults/modules/VaultValidators.sol:228" }, { "label": "__gap", @@ -3141,9 +3233,9 @@ "label": "_positions", "offset": 0, "slot": "311", - "type": "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)", + "type": "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:31" + "src": "contracts/vaults/modules/VaultOsToken.sol:32" }, { "label": "__gap", @@ -3151,7 +3243,7 @@ "slot": "312", "type": "t_array(t_uint256)50_storage", "contract": "VaultOsToken", - "src": "contracts/vaults/modules/VaultOsToken.sol:305" + "src": "contracts/vaults/modules/VaultOsToken.sol:294" }, { "label": "_ownMevEscrow", @@ -3241,7 +3333,7 @@ "label": "address", "numberOfBytes": "20" }, - "t_array(t_struct(Checkpoint)13833_storage)dyn_storage": { + "t_array(t_struct(Checkpoint)13992_storage)dyn_storage": { "label": "struct ExitQueue.Checkpoint[]", "numberOfBytes": "32" }, @@ -3249,6 +3341,10 @@ "label": "uint256[48]", "numberOfBytes": "1536" }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, "t_array(t_uint256)50_storage": { "label": "uint256[50]", "numberOfBytes": "1600" @@ -3257,7 +3353,7 @@ "label": "bytes32", "numberOfBytes": "32" }, - "t_mapping(t_address,t_struct(OsTokenPosition)12097_storage)": { + "t_mapping(t_address,t_struct(OsTokenPosition)12235_storage)": { "label": "mapping(address => struct IVaultOsToken.OsTokenPosition)", "numberOfBytes": "32" }, @@ -3269,7 +3365,7 @@ "label": "mapping(bytes32 => uint256)", "numberOfBytes": "32" }, - "t_struct(Checkpoint)13833_storage": { + "t_struct(Checkpoint)13992_storage": { "label": "struct ExitQueue.Checkpoint", "members": [ { @@ -3287,19 +3383,19 @@ ], "numberOfBytes": "32" }, - "t_struct(History)13839_storage": { + "t_struct(History)13998_storage": { "label": "struct ExitQueue.History", "members": [ { "label": "checkpoints", - "type": "t_array(t_struct(Checkpoint)13833_storage)dyn_storage", + "type": "t_array(t_struct(Checkpoint)13992_storage)dyn_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "32" }, - "t_struct(OsTokenPosition)12097_storage": { + "t_struct(OsTokenPosition)12235_storage": { "label": "struct IVaultOsToken.OsTokenPosition", "members": [ { diff --git a/abi/IValidatorsChecker.json b/abi/IValidatorsChecker.json new file mode 100644 index 00000000..523abc44 --- /dev/null +++ b/abi/IValidatorsChecker.json @@ -0,0 +1,80 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "validatorsRegistryRoot", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "validators", + "type": "bytes" + }, + { + "internalType": "bytes32[]", + "name": "proof", + "type": "bytes32[]" + }, + { + "internalType": "bool[]", + "name": "proofFlags", + "type": "bool[]" + }, + { + "internalType": "uint256[]", + "name": "proofIndexes", + "type": "uint256[]" + } + ], + "name": "checkDepositDataRoot", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vault", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "validatorsRegistryRoot", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "validators", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "name": "checkValidatorsManagerSignature", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/contracts/interfaces/IValidatorsChecker.sol b/contracts/interfaces/IValidatorsChecker.sol new file mode 100644 index 00000000..9092b30c --- /dev/null +++ b/contracts/interfaces/IValidatorsChecker.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity =0.8.22; + +/** + * @title IValidatorsChecker + * @author StakeWise + * @notice Defines the interface for ValidatorsChecker + */ +interface IValidatorsChecker { + /** + * @notice Function for checking validators manager signature + * @param vault The address of the vault + * @param validatorsRegistryRoot The validators registry root + * @param validators The concatenation of the validators' public key, deposit signature, deposit root and optionally withdrawal address + * @param signature The validators manager signature + * @return Current block number + */ + function checkValidatorsManagerSignature( + address vault, + bytes32 validatorsRegistryRoot, + bytes calldata validators, + bytes calldata signature + ) external view returns (uint256); + + /** + * @notice Function for checking deposit data root + * @param vault The address of the vault + * @param validatorsRegistryRoot The validators registry root + * @param validators The concatenation of the validators' public key, deposit signature, deposit root and optionally withdrawal address + * @param proof The proof used for the merkle tree verification + * @param proofFlags The multi proof flags for the merkle tree verification + * @param proofIndexes The indexes of the leaves for the merkle tree multi proof verification + * @return Current block number + */ + function checkDepositDataRoot( + address vault, + bytes32 validatorsRegistryRoot, + bytes calldata validators, + bytes32[] calldata proof, + bool[] calldata proofFlags, + uint256[] calldata proofIndexes + ) external view returns (uint256); +} diff --git a/contracts/validators/EthValidatorsChecker.sol b/contracts/validators/EthValidatorsChecker.sol new file mode 100644 index 00000000..f5467f33 --- /dev/null +++ b/contracts/validators/EthValidatorsChecker.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity =0.8.22; + +import {ValidatorsChecker} from './ValidatorsChecker.sol'; + +/** + * @title EthValidatorsChecker + * @author StakeWise + * @notice Defines functionality for checking validators registration on Ethereum + */ +contract EthValidatorsChecker is ValidatorsChecker { + /** + * @dev Constructor + * @param validatorsRegistry The address of the beacon chain validators registry contract + * @param keeper The address of the Keeper contract + * @param vaultsRegistry The address of the VaultsRegistry contract + * @param depositDataRegistry The address of the DepositDataRegistry contract + */ + constructor( + address validatorsRegistry, + address keeper, + address vaultsRegistry, + address depositDataRegistry + ) ValidatorsChecker(validatorsRegistry, keeper, vaultsRegistry, depositDataRegistry) {} + + /// @inheritdoc ValidatorsChecker + function _depositAmount() internal pure override returns (uint256) { + return 32 ether; + } +} diff --git a/contracts/validators/GnoValidatorsChecker.sol b/contracts/validators/GnoValidatorsChecker.sol new file mode 100644 index 00000000..b84fc759 --- /dev/null +++ b/contracts/validators/GnoValidatorsChecker.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity =0.8.22; + +import {ValidatorsChecker} from './ValidatorsChecker.sol'; + +/** + * @title GnoValidatorsChecker + * @author StakeWise + * @notice Defines functionality for checking validators registration on Gnosis + */ +contract GnoValidatorsChecker is ValidatorsChecker { + /** + * @dev Constructor + * @param validatorsRegistry The address of the beacon chain validators registry contract + * @param keeper The address of the Keeper contract + * @param vaultsRegistry The address of the VaultsRegistry contract + * @param depositDataRegistry The address of the DepositDataRegistry contract + */ + constructor( + address validatorsRegistry, + address keeper, + address vaultsRegistry, + address depositDataRegistry + ) ValidatorsChecker(validatorsRegistry, keeper, vaultsRegistry, depositDataRegistry) {} + + /// @inheritdoc ValidatorsChecker + function _depositAmount() internal pure override returns (uint256) { + return 1 ether; + } +} diff --git a/contracts/validators/ValidatorsChecker.sol b/contracts/validators/ValidatorsChecker.sol new file mode 100644 index 00000000..538fee5c --- /dev/null +++ b/contracts/validators/ValidatorsChecker.sol @@ -0,0 +1,219 @@ +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity =0.8.22; + +import {MerkleProof} from '@openzeppelin/contracts/utils/cryptography/MerkleProof.sol'; +import {MessageHashUtils} from '@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol'; +import {SignatureChecker} from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol'; +import {IValidatorsRegistry} from '../interfaces/IValidatorsRegistry.sol'; +import {IKeeper} from '../interfaces/IKeeper.sol'; +import {IValidatorsChecker} from '../interfaces/IValidatorsChecker.sol'; +import {IVaultState} from '../interfaces/IVaultState.sol'; +import {IVaultVersion} from '../interfaces/IVaultVersion.sol'; +import {IDepositDataRegistry} from '../interfaces/IDepositDataRegistry.sol'; +import {IVaultsRegistry} from '../interfaces/IVaultsRegistry.sol'; +import {IVaultValidators} from '../interfaces/IVaultValidators.sol'; +import {Errors} from '../libraries/Errors.sol'; + +interface IVaultValidatorsV1 { + function validatorsRoot() external view returns (bytes32); + function validatorIndex() external view returns (uint256); +} + +/** + * @title ValidatorsChecker + * @author StakeWise + * @notice Defines the functionality for: + * * checking validators manager signature + * * checking deposit data root + */ +abstract contract ValidatorsChecker is IValidatorsChecker { + bytes32 private constant _registerValidatorsTypeHash = + keccak256('VaultValidators(bytes32 validatorsRegistryRoot,bytes validators)'); + + IValidatorsRegistry private immutable _validatorsRegistry; + IKeeper private immutable _keeper; + IVaultsRegistry private immutable _vaultsRegistry; + IDepositDataRegistry private immutable _depositDataRegistry; + + /** + * @dev Constructor + * @param validatorsRegistry The address of the beacon chain validators registry contract + * @param keeper The address of the Keeper contract + * @param vaultsRegistry The address of the VaultsRegistry contract + * @param depositDataRegistry The address of the DepositDataRegistry contract + */ + constructor( + address validatorsRegistry, + address keeper, + address vaultsRegistry, + address depositDataRegistry + ) { + _validatorsRegistry = IValidatorsRegistry(validatorsRegistry); + _keeper = IKeeper(keeper); + _vaultsRegistry = IVaultsRegistry(vaultsRegistry); + _depositDataRegistry = IDepositDataRegistry(depositDataRegistry); + } + + /// @inheritdoc IValidatorsChecker + function checkValidatorsManagerSignature( + address vault, + bytes32 validatorsRegistryRoot, + bytes calldata validators, + bytes calldata signature + ) external view override returns (uint256) { + if (_validatorsRegistry.get_deposit_root() != validatorsRegistryRoot) { + revert Errors.InvalidValidatorsRegistryRoot(); + } + if (!_vaultsRegistry.vaults(vault) || IVaultVersion(vault).version() < 2) { + revert Errors.InvalidVault(); + } + + // verify vault has enough assets + if ( + !_keeper.isCollateralized(vault) && IVaultState(vault).withdrawableAssets() < _depositAmount() + ) { + revert Errors.InsufficientAssets(); + } + + // compose signing message + bytes32 message = _getValidatorsManagerMessageHash(vault, validatorsRegistryRoot, validators); + + // verify validators manager ECDSA signature + if ( + !SignatureChecker.isValidSignatureNow( + IVaultValidators(vault).validatorsManager(), + message, + signature + ) + ) { + revert Errors.AccessDenied(); + } + + return block.number; + } + + /// @inheritdoc IValidatorsChecker + function checkDepositDataRoot( + address vault, + bytes32 validatorsRegistryRoot, + bytes calldata validators, + bytes32[] calldata proof, + bool[] calldata proofFlags, + uint256[] calldata proofIndexes + ) external view override returns (uint256) { + if (_validatorsRegistry.get_deposit_root() != validatorsRegistryRoot) { + revert Errors.InvalidValidatorsRegistryRoot(); + } + if (!_vaultsRegistry.vaults(vault)) revert Errors.InvalidVault(); + + // verify vault has enough assets + if ( + !_keeper.isCollateralized(vault) && IVaultState(vault).withdrawableAssets() < _depositAmount() + ) { + revert Errors.InsufficientAssets(); + } + + uint8 vaultVersion = IVaultVersion(vault).version(); + if (vaultVersion >= 2) { + address validatorsManager = IVaultValidators(vault).validatorsManager(); + + // verify vault did not set custom validators manager + if (validatorsManager != address(_depositDataRegistry)) revert Errors.AccessDenied(); + } + + uint256 currentIndex; + bytes32 depositDataRoot; + + if (vaultVersion >= 2) { + currentIndex = _depositDataRegistry.depositDataIndexes(vault); + depositDataRoot = _depositDataRegistry.depositDataRoots(vault); + } else { + currentIndex = IVaultValidatorsV1(vault).validatorIndex(); + depositDataRoot = IVaultValidatorsV1(vault).validatorsRoot(); + } + + // define leaves for multiproof + uint256 validatorsCount = proofIndexes.length; + if (validatorsCount == 0) revert Errors.InvalidValidators(); + bytes32[] memory leaves = new bytes32[](validatorsCount); + + // calculate validator length + uint256 validatorLength = validators.length / validatorsCount; + if (validatorLength == 0) revert Errors.InvalidValidators(); + + // calculate leaves + { + uint256 startIndex; + uint256 endIndex; + for (uint256 i = 0; i < validatorsCount; ) { + endIndex += validatorLength; + leaves[proofIndexes[i]] = keccak256( + bytes.concat(keccak256(abi.encode(validators[startIndex:endIndex], currentIndex))) + ); + + startIndex = endIndex; + unchecked { + // cannot realistically overflow + ++currentIndex; + ++i; + } + } + } + + // check matches merkle root and next validator index + if (!MerkleProof.multiProofVerifyCalldata(proof, proofFlags, depositDataRoot, leaves)) { + revert Errors.InvalidProof(); + } + + return block.number; + } + + /** + * @notice Get the hash to be signed by the validators manager + * @param vault The address of the vault + * @param validatorsRegistryRoot The validators registry root + * @param validators The concatenation of the validators' public key, deposit signature, deposit root and optionally withdrawal address + * @return The hash to be signed by the validators manager + */ + function _getValidatorsManagerMessageHash( + address vault, + bytes32 validatorsRegistryRoot, + bytes calldata validators + ) private view returns (bytes32) { + bytes32 domainSeparator = _computeVaultValidatorsDomain(vault); + return + MessageHashUtils.toTypedDataHash( + domainSeparator, + keccak256( + abi.encode(_registerValidatorsTypeHash, validatorsRegistryRoot, keccak256(validators)) + ) + ); + } + + /** + * @notice Computes the hash of the EIP712 typed data for the vault + * @dev This function is used to compute the hash of the EIP712 typed data + * @return The hash of the EIP712 typed data + */ + function _computeVaultValidatorsDomain(address vault) private view returns (bytes32) { + return + keccak256( + abi.encode( + keccak256( + 'EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)' + ), + keccak256(bytes('VaultValidators')), + keccak256('1'), + block.chainid, + vault + ) + ); + } + + /** + * @notice Get the amount of assets required for validator deposit + * @return The amount of assets required for deposit + */ + function _depositAmount() internal pure virtual returns (uint256); +} diff --git a/deployments/chiado.json b/deployments/chiado.json index 3229c1a6..26c1f4dc 100644 --- a/deployments/chiado.json +++ b/deployments/chiado.json @@ -1,19 +1,20 @@ { - "VaultsRegistry": "0x03d360c483014178bFB3d3c990448478b2Bf2575", - "Keeper": "0x6DfF9E878a83A2d84ef5AC242705E08BF0F33fdD", - "DepositDataRegistry": "0x197292Fb9893Bc06329ee8E3Fd07d8ceF29E4d13", - "XdaiExchange": "0xa0dE6A44177990a727978d83f71103132B1530DE", - "GnoGenesisVault": "0xF3d3071905A6495a4D2f8650E8b3baaAE827DD13", - "GnoVaultFactory": "0xfA14e7A35EA37c08eC006a15831dCC8eCcf2B51f", - "GnoPrivVaultFactory": "0x1A9ADdd9ca10338cFd146578b5DfE3caAa660Dfa", - "GnoBlocklistVaultFactory": "0x4684FD7aEd17C389f39b23138260DfC4E05ca5Ca", - "GnoErc20VaultFactory": "0x6A67A0caB72bF86a81A2E331949EC3890fcB37E5", - "GnoPrivErc20VaultFactory": "0xFD16734b47A570c7a446F879874A134dAa6ae496", - "GnoBlocklistErc20VaultFactory": "0xFD6920C6D8D9f5a291B798B2F805d1c51CeEFaDe", - "SharedMevEscrow": "0xb7c8c515317490dbB0FF1809B09EABa6432B6A83", - "OsToken": "0x2c72f8019BF6aab4D430f527DC35Ff8F903b7295", - "OsTokenConfig": "0xa567616A709dE0Ab69f12be0f0CD1bEABB9609AB", - "OsTokenVaultController": "0x6d0e8Ceb65Ed8B954CBB8b32eaC034580ec07A59", - "PriceFeed": "0xb948180A455ad82f5D1b2946F2972F6Cc15293a5", - "RewardSplitterFactory": "0xa2D8b88EB39909dD5309542B3623eFA5640D5f24" -} + "VaultsRegistry": "0x76C54Ec7E43974519eF72c283c2995B46A194a24", + "Keeper": "0x13Af1266d8664aF3da4c711E7C86725D4779EA72", + "DepositDataRegistry": "0xf9eB9EAd3d71516bF5206F702B8BD0c183045474", + "GnoValidatorsChecker": "0x5Fa9600FF682FA65Fff6085df06CCBB7dC01DF08", + "XdaiExchange": "0x7E98003222F5b44237CaA1315Bf2FC07e484C1b6", + "GnoGenesisVault": "0x0386467c4DfFA2A9Cf8b12dD9b62950065aa7e96", + "GnoVaultFactory": "0x3092C23185bCEFB440B0Bc8bFA1E340E40b3A410", + "GnoPrivVaultFactory": "0xEBAF5bEbFb199D7c08fE82347C6D37914d07de70", + "GnoBlocklistVaultFactory": "0x6e16fc22013e07B8C8e6d4b30280F44d42A60a97", + "GnoErc20VaultFactory": "0x951D3BAB6BebB42BEabf807df808b58a5c4FC55D", + "GnoPrivErc20VaultFactory": "0x81feD710De1aC9D3D860F6C9aB4f150B1dfF621d", + "GnoBlocklistErc20VaultFactory": "0xdd9e0dBFb218fb17f0A2f96E77224e00dF095bf2", + "SharedMevEscrow": "0x069a8fF3cD84B2F861F9554E4b2c3FFA3F89b6bD", + "OsToken": "0x11Bd460C704b74Dc84Fce0C45d7dDA49EffCA59f", + "OsTokenConfig": "0x80EF36dFf50a03d2333469122B08c0943bb55D97", + "OsTokenVaultController": "0x28637130e692F821843eBAbeB8708dAB3F82cFa5", + "PriceFeed": "0x6228CD90A4aB2949eb27763205dA288E23dC09d1", + "RewardSplitterFactory": "0x63De511Ff504E70109Bb8312d1329f2C88c14f77" +} \ No newline at end of file diff --git a/deployments/holesky-upgrade-tx.json b/deployments/holesky-upgrade-tx.json new file mode 100644 index 00000000..037c9e1d --- /dev/null +++ b/deployments/holesky-upgrade-tx.json @@ -0,0 +1,232 @@ +[ + { + "to": "0xAa773c035Af95721C518eCd8250CadAC0AAB7ed0", + "operation": "0", + "value": "0.0", + "data": "0x4b37c73f0000000000000000000000001428bb71261f01bbc03ce4ec7ceea674f94b5f18", + "method": "removeFactory(address)", + "params": [ + "0x1428BB71261f01BbC03ce4eC7cEEA674f94b5F18" + ] + }, + { + "to": "0xAa773c035Af95721C518eCd8250CadAC0AAB7ed0", + "operation": "0", + "value": "0.0", + "data": "0x29ce1ec5000000000000000000000000d68ef965d4e32b99fd2d014fc35304f3c273277e", + "method": "addFactory(address)", + "params": [ + "0xd68ef965D4E32b99Fd2D014Fc35304f3C273277E" + ] + }, + { + "to": "0xAa773c035Af95721C518eCd8250CadAC0AAB7ed0", + "operation": "0", + "value": "0.0", + "data": "0xaff7947d000000000000000000000000a95c0baa54037b9cf70cfe8b59732246604c97d2", + "method": "addVaultImpl(address)", + "params": [ + "0xa95C0BAA54037b9Cf70Cfe8b59732246604C97D2" + ] + }, + { + "to": "0xAa773c035Af95721C518eCd8250CadAC0AAB7ed0", + "operation": "0", + "value": "0.0", + "data": "0x4b37c73f0000000000000000000000009741f8e49ffa322714511b5d17bd052698eafa43", + "method": "removeFactory(address)", + "params": [ + "0x9741f8e49fFa322714511b5D17bD052698eAFA43" + ] + }, + { + "to": "0xAa773c035Af95721C518eCd8250CadAC0AAB7ed0", + "operation": "0", + "value": "0.0", + "data": "0x29ce1ec500000000000000000000000009fd091483d64b3b9d5474f374ddfe6039f79aad", + "method": "addFactory(address)", + "params": [ + "0x09fD091483d64b3b9d5474F374ddFE6039F79aAd" + ] + }, + { + "to": "0xAa773c035Af95721C518eCd8250CadAC0AAB7ed0", + "operation": "0", + "value": "0.0", + "data": "0xaff7947d000000000000000000000000ff4e192710182c1c39859a224ff92d9c5a858559", + "method": "addVaultImpl(address)", + "params": [ + "0xff4e192710182C1C39859a224Ff92D9c5a858559" + ] + }, + { + "to": "0xAa773c035Af95721C518eCd8250CadAC0AAB7ed0", + "operation": "0", + "value": "0.0", + "data": "0x29ce1ec5000000000000000000000000473a94abe8f173cac48a6213f61335e21b913875", + "method": "addFactory(address)", + "params": [ + "0x473a94aBe8f173cac48A6213f61335E21B913875" + ] + }, + { + "to": "0xAa773c035Af95721C518eCd8250CadAC0AAB7ed0", + "operation": "0", + "value": "0.0", + "data": "0xaff7947d0000000000000000000000006fe6f9ad1f0657db4855cc9d4b61252ad14501e6", + "method": "addVaultImpl(address)", + "params": [ + "0x6Fe6f9aD1f0657Db4855CC9D4B61252aD14501E6" + ] + }, + { + "to": "0xAa773c035Af95721C518eCd8250CadAC0AAB7ed0", + "operation": "0", + "value": "0.0", + "data": "0x4b37c73f0000000000000000000000004c1140f4a5e3dd459de642a46bd1df6fbe287e1b", + "method": "removeFactory(address)", + "params": [ + "0x4C1140F4A5E3DD459De642A46bd1df6FBe287e1B" + ] + }, + { + "to": "0xAa773c035Af95721C518eCd8250CadAC0AAB7ed0", + "operation": "0", + "value": "0.0", + "data": "0x29ce1ec500000000000000000000000010c5066fb5da1c0d7eb189de4dfa26d23e8e4ada", + "method": "addFactory(address)", + "params": [ + "0x10C5066FB5DA1C0D7eb189DE4dfA26d23e8e4aDa" + ] + }, + { + "to": "0xAa773c035Af95721C518eCd8250CadAC0AAB7ed0", + "operation": "0", + "value": "0.0", + "data": "0xaff7947d00000000000000000000000034b16af29c9807e1f6789171868fa3f98fb3a565", + "method": "addVaultImpl(address)", + "params": [ + "0x34B16AF29C9807E1F6789171868fA3f98fB3a565" + ] + }, + { + "to": "0xAa773c035Af95721C518eCd8250CadAC0AAB7ed0", + "operation": "0", + "value": "0.0", + "data": "0x4b37c73f000000000000000000000000930a2d0adebf4e69bb929f6456c3d4bcabf52796", + "method": "removeFactory(address)", + "params": [ + "0x930A2D0ADEbF4E69Bb929F6456C3D4bcabf52796" + ] + }, + { + "to": "0xAa773c035Af95721C518eCd8250CadAC0AAB7ed0", + "operation": "0", + "value": "0.0", + "data": "0x29ce1ec50000000000000000000000005da7d1de2e84047de2a7988a7e01b494d54284e7", + "method": "addFactory(address)", + "params": [ + "0x5da7d1De2e84047De2A7988a7E01B494d54284e7" + ] + }, + { + "to": "0xAa773c035Af95721C518eCd8250CadAC0AAB7ed0", + "operation": "0", + "value": "0.0", + "data": "0xaff7947d000000000000000000000000ebf2570686b6701ea46c546ad396d171a52e3bd5", + "method": "addVaultImpl(address)", + "params": [ + "0xEBF2570686B6701Ea46c546ad396d171a52E3BD5" + ] + }, + { + "to": "0xAa773c035Af95721C518eCd8250CadAC0AAB7ed0", + "operation": "0", + "value": "0.0", + "data": "0x29ce1ec50000000000000000000000003a945fd94a1d810b5e1c4536747f0de358d32854", + "method": "addFactory(address)", + "params": [ + "0x3A945FD94A1d810B5e1c4536747F0de358d32854" + ] + }, + { + "to": "0xAa773c035Af95721C518eCd8250CadAC0AAB7ed0", + "operation": "0", + "value": "0.0", + "data": "0xaff7947d0000000000000000000000002575845f4ccc265ff393ab1eb0f11e5eb396f66c", + "method": "addVaultImpl(address)", + "params": [ + "0x2575845f4Ccc265fF393Ab1eB0F11e5Eb396f66c" + ] + }, + { + "to": "0xAa773c035Af95721C518eCd8250CadAC0AAB7ed0", + "operation": "0", + "value": "0.0", + "data": "0xaff7947d000000000000000000000000cc5e385edb2feab9c9a6de97b572f1d811312ae7", + "method": "addVaultImpl(address)", + "params": [ + "0xcC5E385EdB2fEaB9C9A6DE97b572f1d811312ae7" + ] + }, + { + "to": "0xAa773c035Af95721C518eCd8250CadAC0AAB7ed0", + "operation": "0", + "value": "0.0", + "data": "0x29ce1ec5000000000000000000000000390c320ae2b001c7cb31a690e2500b55313ac986", + "method": "addFactory(address)", + "params": [ + "0x390C320Ae2B001C7CB31A690e2500b55313aC986" + ] + }, + { + "to": "0xAa773c035Af95721C518eCd8250CadAC0AAB7ed0", + "operation": "0", + "value": "0.0", + "data": "0x29ce1ec50000000000000000000000002a7fbfaaa33cfdb9e0eb3eb3f6ab01ea985354f2", + "method": "addFactory(address)", + "params": [ + "0x2a7FBFAaa33CFDB9E0EB3eb3F6aB01eA985354F2" + ] + }, + { + "to": "0xAa773c035Af95721C518eCd8250CadAC0AAB7ed0", + "operation": "0", + "value": "0.0", + "data": "0x29ce1ec50000000000000000000000009e345cfa4a00aa2714264e9072800b89787aa826", + "method": "addFactory(address)", + "params": [ + "0x9e345cFa4A00aA2714264E9072800B89787aa826" + ] + }, + { + "to": "0xAa773c035Af95721C518eCd8250CadAC0AAB7ed0", + "operation": "0", + "value": "0.0", + "data": "0x29ce1ec500000000000000000000000067e134aa61ee3903665a8045ec32886bfdf0b2b5", + "method": "addFactory(address)", + "params": [ + "0x67E134aa61ee3903665a8045EC32886bfdf0B2B5" + ] + }, + { + "to": "0xAa773c035Af95721C518eCd8250CadAC0AAB7ed0", + "operation": "0", + "value": "0.0", + "data": "0x29ce1ec5000000000000000000000000860c75a594966f78fbd7c07d1748219ce9c42c39", + "method": "addFactory(address)", + "params": [ + "0x860c75A594966f78fbd7c07D1748219CE9c42c39" + ] + }, + { + "to": "0xAa773c035Af95721C518eCd8250CadAC0AAB7ed0", + "operation": "0", + "value": "0.0", + "data": "0x29ce1ec5000000000000000000000000d14013f989825037196089a498e8b7d3763b8695", + "method": "addFactory(address)", + "params": [ + "0xd14013F989825037196089A498E8b7D3763B8695" + ] + } +] \ No newline at end of file diff --git a/deployments/holesky-vault-upgrades.json b/deployments/holesky-vault-upgrades.json new file mode 100644 index 00000000..27f651e8 --- /dev/null +++ b/deployments/holesky-vault-upgrades.json @@ -0,0 +1,41 @@ +{ + "0xd92dbcef7ed61a67c0eefa7cafcc41f41d9402a5046486977364b4724c821f8b": { + "2": "0xa95C0BAA54037b9Cf70Cfe8b59732246604C97D2" + }, + "0xa90b5863127e5f962890f832f07b9f40c8df2fc043326a0e4b538552d600f2d9": { + "2": "0xff4e192710182C1C39859a224Ff92D9c5a858559" + }, + "0xa2d618745a84ee1647adb00f6b31dcca3bb90ddc2b1211d1d4d9757016d93d20": { + "2": "0x6Fe6f9aD1f0657Db4855CC9D4B61252aD14501E6" + }, + "0x9480c4a5d7e604111fbc986cd90c895a458ca155fe13c10879b93c4592ce29fd": { + "2": "0x34B16AF29C9807E1F6789171868fA3f98fB3a565" + }, + "0x3c60bf85548481aa53872c99e20f566d08c7fc12e0f05302f4002dedc8d45e4d": { + "2": "0xEBF2570686B6701Ea46c546ad396d171a52E3BD5" + }, + "0xad566d041ad0a21d208459166a94a853aa7fc34cc68f5e214ca9b0cadefaba2c": { + "2": "0x2575845f4Ccc265fF393Ab1eB0F11e5Eb396f66c" + }, + "0x11a6b7bef0f97d298d56e5af2aa94330353808e861cbac86172faad21b10c505": { + "2": "0xcC5E385EdB2fEaB9C9A6DE97b572f1d811312ae7" + }, + "0x43d6c07ac63953f42a28f0366affe9895fd54f84336314dd012087bd0941df67": { + "2": "0xA63Da80Ba16c2C9e71B8E71AbAD8Ffcb57b12586" + }, + "0x333122211e64a98ebf9b5890e3a33144b1208484d235be41b9d0a827eb1b5b0c": { + "2": "0x92874D5e40588AB0Cd9f48f7338bCdF3006A4Ebd" + }, + "0x903c7cfddba46ee63384d0bf7016d55c117fc01332779257355a1400c68e97d1": { + "2": "0xfa1E6003EfF3b50Fd02c450A51693c1A7CcE446b" + }, + "0x778168b2049c66a50853dfa28c8d05dfb083907876871d6640cd612be7e580f2": { + "2": "0xaD03b044b410F56d5afC5A0D55760A8dff3E7AF3" + }, + "0x737a47bb3e695a159ef397f75d47c2ca71c770e380ac29b104d3b82ee61be3c8": { + "2": "0x03a074511A399cbe8156cc5DfAC72958BeaFFA98" + }, + "0x813d21398e0f42fde0737b550f7475616bb950f32cd3f6012ad8b7d81b6c415f": { + "2": "0x17CE5aaBB33121ed03cBdB97d296458810319703" + } +} \ No newline at end of file diff --git a/deployments/holesky.json b/deployments/holesky.json index 605bc119..ed86ed72 100644 --- a/deployments/holesky.json +++ b/deployments/holesky.json @@ -1,26 +1,26 @@ { "VaultsRegistry": "0xAa773c035Af95721C518eCd8250CadAC0AAB7ed0", "Keeper": "0xB580799Bf7d62721D1a523f0FDF2f5Ed7BA4e259", - "DepositDataRegistry": "0x1Dfb40a149940300f183d21E5B200c5DaaF3A842", + "DepositDataRegistry": "0xf25f9A254F38aF10Dc352bF8F446Dc09a820ca76", + "EthValidatorsChecker": "0x23FCd08f2e85f765d329027AB6D4323a0BC057A7", "EthGenesisVault": "0xf42cEAFa21Beb670573f32C31485E84233AFDB6b", - "EthFoxVault": "0x3c4ae629bf823475192124E02b9879D3C1fd4538", - "EthVaultFactory": "0xc93C070124Cb78fE9Dee9F0527168F81850a384b", - "EthPrivVaultFactory": "0xDe0b026f1A7b143A650732EdcCce5a30784BFe20", - "EthBlocklistVaultFactory": "0x1F05A6F83e72732046DF4cac3215d1fd00E2Bc5C", - "EthErc20VaultFactory": "0x2B324944213F5781A23A07ea3f55884b535DcF36", - "EthPrivErc20VaultFactory": "0x400f8E12c8503D6803141E3F5CCc3e0C01A44899", - "EthBlocklistErc20VaultFactory": "0x76FC9b44D4b18eef3CdF8FEeee0B926775F00e6e", - "EthRestakeVaultFactory": "0x2743ccaB0E680eE34cca12C0fc7229FEBAE52cC7", - "EthRestakePrivVaultFactory": "0xA6bd7Ac90CD328a9384646694dc8edC6B23Ad0FF", - "EthRestakeBlocklistVaultFactory": "0xAF4095e0f13bad0aC60a6c058Ed29a4b33B57576", - "EthRestakeErc20VaultFactory": "0x0649ddc18cD3c7D88A5F9495243c324cFA75fC6c", - "EthRestakePrivErc20VaultFactory": "0x9Fc8C7F3C1ff6d0DF39EcB5870884d59777Ea2Bb", - "EthRestakeBlocklistErc20VaultFactory": "0xdD1dfbc8b403823E947D358e35C85d2bf3bD7f90", + "EthVaultFactory": "0xd68ef965D4E32b99Fd2D014Fc35304f3C273277E", + "EthPrivVaultFactory": "0x09fD091483d64b3b9d5474F374ddFE6039F79aAd", + "EthBlocklistVaultFactory": "0x473a94aBe8f173cac48A6213f61335E21B913875", + "EthErc20VaultFactory": "0x10C5066FB5DA1C0D7eb189DE4dfA26d23e8e4aDa", + "EthPrivErc20VaultFactory": "0x5da7d1De2e84047De2A7988a7E01B494d54284e7", + "EthBlocklistErc20VaultFactory": "0x3A945FD94A1d810B5e1c4536747F0de358d32854", + "EthRestakeVaultFactory": "0x390C320Ae2B001C7CB31A690e2500b55313aC986", + "EthRestakePrivVaultFactory": "0x2a7FBFAaa33CFDB9E0EB3eb3F6aB01eA985354F2", + "EthRestakeBlocklistVaultFactory": "0x9e345cFa4A00aA2714264E9072800B89787aa826", + "EthRestakeErc20VaultFactory": "0x67E134aa61ee3903665a8045EC32886bfdf0B2B5", + "EthRestakePrivErc20VaultFactory": "0x860c75A594966f78fbd7c07D1748219CE9c42c39", + "EthRestakeBlocklistErc20VaultFactory": "0xd14013F989825037196089A498E8b7D3763B8695", "SharedMevEscrow": "0xc98F25BcAA6B812a07460f18da77AF8385be7b56", "OsToken": "0xF603c5A3F774F05d4D848A9bB139809790890864", - "OsTokenConfig": "0x8f347eb308707DC1FA1acCF3ea889CF554b6B8A5", + "OsTokenConfig": "0x191599BAF9ad40Ae28EeD7ee6F5C38B5325746E7", "OsTokenVaultController": "0x7BbC1733ee018f103A9a9052a18fA9273255Cf36", "PriceFeed": "0xe31FAf135A6047Cbe595F91B4b6802cDB9B46E2b", - "RewardSplitterFactory": "0x384B388A040C6b32c9B5927aB25891F2bAd4E5f7", + "RewardSplitterFactory": "0x7Fcb1857011BAF51003018e9299deE9012de0967", "CumulativeMerkleDrop": "0x6737277a4A9071AF88cCa91042d77b4237f368C4" } \ No newline at end of file diff --git a/helpers/constants.ts b/helpers/constants.ts index 365a7758..b101d8b6 100644 --- a/helpers/constants.ts +++ b/helpers/constants.ts @@ -1,6 +1,6 @@ import { NetworkConfig, Networks } from './types' import { parseEther } from 'ethers' -import { MAX_UINT128, MAX_UINT256, ZERO_BYTES32 } from '../test/shared/constants' +import { MAX_UINT128, MAX_UINT256 } from '../test/shared/constants' export const NETWORKS: { [network in Networks]: NetworkConfig @@ -168,8 +168,8 @@ export const NETWORKS: { // OsToken treasury: '0xFF2B6d2d5c205b99E2e6f607B6aFA3127B9957B6', - osTokenFeePercent: 1000, // 10 % - osTokenCapacity: parseEther('200000'), // 200k osGNO + osTokenFeePercent: 500, // 5 % + osTokenCapacity: parseEther('500000'), // 500k osGNO osTokenName: 'Staked GNO', osTokenSymbol: 'osGNO', @@ -181,10 +181,10 @@ export const NETWORKS: { // GnoGenesisVault genesisVault: { admin: '0xFF2B6d2d5c205b99E2e6f607B6aFA3127B9957B6', - poolEscrow: '0x10C5066FB5DA1C0D7eb189DE4dfA26d23e8e4aDa', - rewardToken: '0x3A945FD94A1d810B5e1c4536747F0de358d32854', - capacity: parseEther('200000'), // 200k GNO - feePercent: 2000, // 20% + poolEscrow: '0x6c3F8A4efdABf90126f1889893cA386bdb70A677', + rewardToken: '0x0d6736e4ee767B1Bdfc1daeEfB74150643a50C15', + capacity: parseEther('1000000'), // 1m GNO + feePercent: 1500, // 15% }, priceFeedDescription: 'osGNO/GNO', @@ -194,7 +194,7 @@ export const NETWORKS: { gnoPriceFeed: '0xcC5E385EdB2fEaB9C9A6DE97b572f1d811312ae7', daiPriceFeed: '0x390C320Ae2B001C7CB31A690e2500b55313aC986', balancerVault: '0x8b6c2C9E09c6022780D164F3cFd882808b8bDBF0', - balancerPoolId: ZERO_BYTES32, + balancerPoolId: '0xa99fd9950b5d5dceeaf4939e221dca8ca9b938ab000100000000000000000025', maxSlippage: 1000, // 10% stalePriceTimeDelta: MAX_UINT128, // unlimited }, diff --git a/helpers/types.ts b/helpers/types.ts index f09255d3..524a3329 100644 --- a/helpers/types.ts +++ b/helpers/types.ts @@ -75,3 +75,12 @@ export type NetworkConfig = { eigenDelegationManager: string eigenDelayedWithdrawalRouter: string } + +export type GovernorCall = { + to: string + operation: string + value: string + data: string + method: string + params: any[] +} diff --git a/helpers/utils.ts b/helpers/utils.ts index e17afdd2..068e3c9a 100644 --- a/helpers/utils.ts +++ b/helpers/utils.ts @@ -1,6 +1,7 @@ import { Contract } from 'ethers' import { HardhatRuntimeEnvironment } from 'hardhat/types/runtime' import '@openzeppelin/hardhat-upgrades/dist/type-extensions' +import { GovernorCall } from './types' export async function deployContract( hre: HardhatRuntimeEnvironment, @@ -67,3 +68,19 @@ export async function verify( } } } + +export async function encodeGovernorContractCall( + contract: Contract, + method: string, + params: any[] +): Promise { + const data = contract.interface.encodeFunctionData(method, params) + return { + to: await contract.getAddress(), + operation: '0', + value: '0.0', + data, + method, + params, + } +} diff --git a/slither.config.json b/slither.config.json index 4fc9fb01..f3011039 100644 --- a/slither.config.json +++ b/slither.config.json @@ -1,3 +1,7 @@ { - "filter_paths": "node_modules/@openzeppelin/contracts-upgradeable|node_modules/@openzeppelin/contracts|contracts/mocks" + "filter_paths": "node_modules/@openzeppelin/contracts-upgradeable|node_modules/@openzeppelin/contracts|contracts/mocks", + "hardhat_ignore_compile": true, + "exclude_informational": true, + "exclude_low": true, + "exclude_medium": true } diff --git a/tasks/eth-full-deploy-local.ts b/tasks/eth-full-deploy-local.ts index 31955f5e..0341f2e8 100644 --- a/tasks/eth-full-deploy-local.ts +++ b/tasks/eth-full-deploy-local.ts @@ -128,6 +128,15 @@ task('eth-full-deploy-local', 'deploys StakeWise V3 for Ethereum to local networ ]) const depositDataRegistryAddress = await depositDataRegistry.getAddress() + // Deploy ValidatorsChecker + const ethValidatorsChecker = await deployContract(hre, 'EthValidatorsChecker', [ + validatorsRegistryAddress, + keeperAddress, + vaultsRegistryAddress, + depositDataRegistryAddress, + ]) + const ethValidatorsCheckerAddress = await ethValidatorsChecker.getAddress() + const factories: string[] = [] for (const vaultType of [ 'EthVault', @@ -274,12 +283,20 @@ task('eth-full-deploy-local', 'deploys StakeWise V3 for Ethereum to local networ console.log('Added EthFoxVault to VaultsRegistry') // Deploy EigenPodOwner implementation - const eigenPodOwnerImpl = await deployContract(hre, 'EigenPodOwner', [ + constructorArgs = [ networkConfig.eigenPodManager, networkConfig.eigenDelegationManager, networkConfig.eigenDelayedWithdrawalRouter, - ]) + ] + const eigenPodOwnerImpl = await deployContract(hre, 'EigenPodOwner', constructorArgs) + const eigenPodOwnerFactory = await ethers.getContractFactory('EigenPodOwner') const eigenPodOwnerImplAddress = await eigenPodOwnerImpl.getAddress() + await simulateDeployImpl( + hre, + eigenPodOwnerFactory, + { constructorArgs }, + eigenPodOwnerImplAddress + ) // Deploy restake vaults for (const vaultType of [ @@ -309,8 +326,9 @@ task('eth-full-deploy-local', 'deploys StakeWise V3 for Ethereum to local networ vaultImplAddress ) - // Deploy Vault Factory - const vaultFactory = await deployContract(hre, 'EthVaultFactory', [ + // Deploy Restake Vault Factory + const vaultFactory = await deployContract(hre, 'EthRestakeVaultFactory', [ + networkConfig.governor, vaultImplAddress, vaultsRegistryAddress, ]) @@ -358,6 +376,7 @@ task('eth-full-deploy-local', 'deploys StakeWise V3 for Ethereum to local networ VaultsRegistry: vaultsRegistryAddress, Keeper: keeperAddress, DepositDataRegistry: depositDataRegistryAddress, + EthValidatorsChecker: ethValidatorsCheckerAddress, EthFoxVault: foxVaultAddress, EthVaultFactory: factories[0], EthPrivVaultFactory: factories[1], @@ -386,8 +405,9 @@ task('eth-full-deploy-local', 'deploys StakeWise V3 for Ethereum to local networ fs.mkdirSync(DEPLOYMENTS_DIR) } + // save addresses fs.writeFileSync(fileName, json, 'utf-8') - console.log('Saved to', fileName) + console.log('Addresses saved to', fileName) console.log( 'NB! EthGenesisVault is not configured properly as ' + diff --git a/tasks/eth-full-deploy.ts b/tasks/eth-full-deploy.ts index 97e4210b..fc708494 100644 --- a/tasks/eth-full-deploy.ts +++ b/tasks/eth-full-deploy.ts @@ -141,6 +141,20 @@ task('eth-full-deploy', 'deploys StakeWise V3 for Ethereum').setAction(async (ta ) const depositDataRegistryAddress = await depositDataRegistry.getAddress() + // Deploy ValidatorsChecker + const ethValidatorsChecker = await deployContract( + hre, + 'EthValidatorsChecker', + [ + networkConfig.validatorsRegistry, + keeperAddress, + vaultsRegistryAddress, + depositDataRegistryAddress, + ], + 'contracts/validators/EthValidatorsChecker.sol:EthValidatorsChecker' + ) + const ethValidatorsCheckerAddress = await ethValidatorsChecker.getAddress() + const factories: string[] = [] for (const vaultType of [ 'EthVault', @@ -305,12 +319,20 @@ task('eth-full-deploy', 'deploys StakeWise V3 for Ethereum').setAction(async (ta console.log('Added EthFoxVault to VaultsRegistry') // Deploy EigenPodOwner implementation - const eigenPodOwnerImpl = await deployContract(hre, 'EigenPodOwner', [ + constructorArgs = [ networkConfig.eigenPodManager, networkConfig.eigenDelegationManager, networkConfig.eigenDelayedWithdrawalRouter, - ]) + ] + const eigenPodOwnerImpl = await deployContract( + hre, + 'EigenPodOwner', + constructorArgs, + 'contracts/vaults/ethereum/restake/EigenPodOwner.sol:EigenPodOwner' + ) + const eigenPodOwnerFactory = await ethers.getContractFactory('EigenPodOwner') const eigenPodOwnerImplAddress = await eigenPodOwnerImpl.getAddress() + await simulateDeployImpl(hre, eigenPodOwnerFactory, { constructorArgs }, eigenPodOwnerImplAddress) // Deploy restake vaults for (const vaultType of [ @@ -345,12 +367,12 @@ task('eth-full-deploy', 'deploys StakeWise V3 for Ethereum').setAction(async (ta vaultImplAddress ) - // Deploy Vault Factory + // Deploy Restake Vault Factory const vaultFactory = await deployContract( hre, - 'EthVaultFactory', - [vaultImplAddress, vaultsRegistryAddress], - 'contracts/vaults/ethereum/EthVaultFactory.sol:EthVaultFactory' + 'EthRestakeVaultFactory', + [networkConfig.governor, vaultImplAddress, vaultsRegistryAddress], + 'contracts/vaults/ethereum/restake/EthRestakeVaultFactory.sol:EthRestakeVaultFactory' ) const vaultFactoryAddress = await vaultFactory.getAddress() factories.push(vaultFactoryAddress) @@ -408,6 +430,7 @@ task('eth-full-deploy', 'deploys StakeWise V3 for Ethereum').setAction(async (ta VaultsRegistry: vaultsRegistryAddress, Keeper: keeperAddress, DepositDataRegistry: depositDataRegistryAddress, + EthValidatorsChecker: ethValidatorsCheckerAddress, EthGenesisVault: genesisVaultAddress, EthFoxVault: foxVaultAddress, EthVaultFactory: factories[0], @@ -437,8 +460,9 @@ task('eth-full-deploy', 'deploys StakeWise V3 for Ethereum').setAction(async (ta fs.mkdirSync(DEPLOYMENTS_DIR) } + // save addresses fs.writeFileSync(fileName, json, 'utf-8') - console.log('Saved to', fileName) + console.log('Addresses saved to', fileName) console.log('NB! Commit and accept StakeWise V2 PoolEscrow ownership to EthGenesisVault') }) diff --git a/tasks/eth-upgrade.ts b/tasks/eth-upgrade.ts index 10549ccb..d613653b 100644 --- a/tasks/eth-upgrade.ts +++ b/tasks/eth-upgrade.ts @@ -2,9 +2,9 @@ import fs from 'fs' import '@openzeppelin/hardhat-upgrades/dist/type-extensions' import { simulateDeployImpl } from '@openzeppelin/hardhat-upgrades/dist/utils' import { task } from 'hardhat/config' -import { deployContract } from '../helpers/utils' +import { deployContract, encodeGovernorContractCall } from '../helpers/utils' import { NETWORKS } from '../helpers/constants' -import { NetworkConfig } from '../helpers/types' +import { GovernorCall, NetworkConfig } from '../helpers/types' const DEPLOYMENTS_DIR = 'deployments' @@ -33,6 +33,11 @@ task('eth-upgrade', 'upgrades StakeWise V3 for Ethereum').setAction(async (taskA const priceFeedAddress = deployment.PriceFeed const cumulativeMerkleDropAddress = deployment.CumulativeMerkleDrop + // accumulate governor transaction + const governorTransaction: GovernorCall[] = [] + const vaultUpgrades: Record> = {} + const vaultsRegistry = await ethers.getContractAt('VaultsRegistry', vaultsRegistryAddress) + // Deploy OsTokenConfig const osTokenConfig = await deployContract( hre, @@ -101,13 +106,30 @@ task('eth-upgrade', 'upgrades StakeWise V3 for Ethereum').setAction(async (taskA 'contracts/vaults/ethereum/EthVaultFactory.sol:EthVaultFactory' ) const vaultFactoryAddress = await vaultFactory.getAddress() + factories.push(vaultFactoryAddress) + + // add vault implementation updates + const vaultId = await vaultImpl.vaultId() + if (!(vaultId in vaultUpgrades)) { + vaultUpgrades[vaultId] = {} + } + const vaultVersion = await vaultImpl.version() + vaultUpgrades[vaultId][vaultVersion.toString()] = vaultImplAddress - console.log( - `NB! Remove V1 ${vaultType}Factory from VaultsRegistry: ${deployment[vaultType + 'Factory']}` + // encode governor calls + if (vaultType + 'Factory' in deployment) { + governorTransaction.push( + await encodeGovernorContractCall(vaultsRegistry, 'removeFactory(address)', [ + deployment[vaultType + 'Factory'], + ]) + ) + } + governorTransaction.push( + await encodeGovernorContractCall(vaultsRegistry, 'addFactory(address)', [vaultFactoryAddress]) + ) + governorTransaction.push( + await encodeGovernorContractCall(vaultsRegistry, 'addVaultImpl(address)', [vaultImplAddress]) ) - console.log(`NB! Add V2 ${vaultType}Factory to VaultsRegistry: ${vaultFactoryAddress}`) - console.log(`NB! Add ${vaultType} V2 implementation to VaultsRegistry: ${vaultImplAddress}`) - factories.push(vaultFactoryAddress) } // Deploy EthGenesisVault implementation @@ -133,42 +155,37 @@ task('eth-upgrade', 'upgrades StakeWise V3 for Ethereum').setAction(async (taskA const genesisVaultFactory = await ethers.getContractFactory('EthGenesisVault') await simulateDeployImpl(hre, genesisVaultFactory, { constructorArgs }, genesisVaultImplAddress) - console.log('NB! Remove EthGenesisVault V1 implementation from VaultsRegistry') - console.log( - `NB! Add EthGenesisVault V2 implementation to VaultsRegistry ${genesisVaultImplAddress}` + // add vault implementation update + const vaultId = await genesisVaultImpl.vaultId() + if (!(vaultId in vaultUpgrades)) { + vaultUpgrades[vaultId] = {} + } + const vaultVersion = await genesisVaultImpl.version() + vaultUpgrades[vaultId][vaultVersion.toString()] = genesisVaultImplAddress + + // encode governor calls + governorTransaction.push( + await encodeGovernorContractCall(vaultsRegistry, 'addVaultImpl(address)', [ + genesisVaultImplAddress, + ]) ) console.log(`NB! Upgrade EthGenesisVault to V2: ${genesisVaultImplAddress}`) - // Deploy EthFoxVault implementation + // Deploy EigenPodOwner implementation constructorArgs = [ - keeperAddress, - vaultsRegistryAddress, - networkConfig.validatorsRegistry, - sharedMevEscrowAddress, - depositDataRegistryAddress, - networkConfig.exitedAssetsClaimDelay, + networkConfig.eigenPodManager, + networkConfig.eigenDelegationManager, + networkConfig.eigenDelayedWithdrawalRouter, ] - const foxVaultImpl = await deployContract( + const eigenPodOwnerImpl = await deployContract( hre, - 'EthFoxVault', + 'EigenPodOwner', constructorArgs, - 'contracts/vaults/ethereum/custom/EthFoxVault.sol:EthFoxVault' + 'contracts/vaults/ethereum/restake/EigenPodOwner.sol:EigenPodOwner' ) - const foxVaultImplAddress = await foxVaultImpl.getAddress() - const foxVaultFactory = await ethers.getContractFactory('EthFoxVault') - await simulateDeployImpl(hre, foxVaultFactory, { constructorArgs }, foxVaultImplAddress) - - console.log('NB! Remove EthFoxVault V1 implementation from VaultsRegistry') - console.log(`NB! Add EthFoxVault V2 implementation to VaultsRegistry ${foxVaultImplAddress}`) - console.log(`NB! Upgrade EthFoxVault to V2: ${foxVaultImplAddress}`) - - // Deploy EigenPodOwner implementation - const eigenPodOwnerImpl = await deployContract(hre, 'EigenPodOwner', [ - networkConfig.eigenPodManager, - networkConfig.eigenDelegationManager, - networkConfig.eigenDelayedWithdrawalRouter, - ]) + const eigenPodOwnerFactory = await ethers.getContractFactory('EigenPodOwner') const eigenPodOwnerImplAddress = await eigenPodOwnerImpl.getAddress() + await simulateDeployImpl(hre, eigenPodOwnerFactory, { constructorArgs }, eigenPodOwnerImplAddress) // Deploy restake vaults for (const vaultType of [ @@ -203,17 +220,28 @@ task('eth-upgrade', 'upgrades StakeWise V3 for Ethereum').setAction(async (taskA vaultImplAddress ) - // Deploy Vault Factory + // Deploy Restake Vault Factory const vaultFactory = await deployContract( hre, - 'EthVaultFactory', - [vaultImplAddress, vaultsRegistryAddress], - 'contracts/vaults/ethereum/EthVaultFactory.sol:EthVaultFactory' + 'EthRestakeVaultFactory', + [networkConfig.governor, vaultImplAddress, vaultsRegistryAddress], + 'contracts/vaults/ethereum/restake/EthRestakeVaultFactory.sol:EthRestakeVaultFactory' ) const vaultFactoryAddress = await vaultFactory.getAddress() factories.push(vaultFactoryAddress) - console.log(`NB! Add V2 ${vaultType}Factory to VaultsRegistry: ${vaultFactoryAddress}`) + // add vault implementation updates + const vaultId = await vaultImpl.vaultId() + if (!(vaultId in vaultUpgrades)) { + vaultUpgrades[vaultId] = {} + } + const vaultVersion = await vaultImpl.version() + vaultUpgrades[vaultId][vaultVersion.toString()] = vaultImplAddress + + // encode governor calls + governorTransaction.push( + await encodeGovernorContractCall(vaultsRegistry, 'addFactory(address)', [vaultFactoryAddress]) + ) } // Deploy RewardSplitter Implementation @@ -234,11 +262,26 @@ task('eth-upgrade', 'upgrades StakeWise V3 for Ethereum').setAction(async (taskA ) const rewardSplitterFactoryAddress = await rewardSplitterFactory.getAddress() + // Deploy ValidatorsChecker + const ethValidatorsChecker = await deployContract( + hre, + 'EthValidatorsChecker', + [ + networkConfig.validatorsRegistry, + keeperAddress, + vaultsRegistryAddress, + depositDataRegistryAddress, + ], + 'contracts/validators/EthValidatorsChecker.sol:EthValidatorsChecker' + ) + const ethValidatorsCheckerAddress = await ethValidatorsChecker.getAddress() + // Save the addresses const addresses = { VaultsRegistry: vaultsRegistryAddress, Keeper: keeperAddress, DepositDataRegistry: depositDataRegistryAddress, + EthValidatorsChecker: ethValidatorsCheckerAddress, EthGenesisVault: genesisVaultAddress, EthVaultFactory: factories[0], EthPrivVaultFactory: factories[1], @@ -260,13 +303,26 @@ task('eth-upgrade', 'upgrades StakeWise V3 for Ethereum').setAction(async (taskA RewardSplitterFactory: rewardSplitterFactoryAddress, CumulativeMerkleDrop: cumulativeMerkleDropAddress, } - const json = JSON.stringify(addresses, null, 2) - const fileName = `${DEPLOYMENTS_DIR}/${networkName}.json` + let json = JSON.stringify(addresses, null, 2) + let fileName = `${DEPLOYMENTS_DIR}/${networkName}.json` if (!fs.existsSync(DEPLOYMENTS_DIR)) { fs.mkdirSync(DEPLOYMENTS_DIR) } + // save addresses + fs.writeFileSync(fileName, json, 'utf-8') + console.log('Addresses saved to', fileName) + + // save governor transactions + json = JSON.stringify(governorTransaction, null, 2) + fileName = `${DEPLOYMENTS_DIR}/${networkName}-upgrade-tx.json` + fs.writeFileSync(fileName, json, 'utf-8') + console.log('Governor transaction saved to', fileName) + + // save vault upgrades + json = JSON.stringify(vaultUpgrades, null, 2) + fileName = `${DEPLOYMENTS_DIR}/${networkName}-vault-upgrades.json` fs.writeFileSync(fileName, json, 'utf-8') - console.log('Saved to', fileName) + console.log('Vault upgrades saved to', fileName) }) diff --git a/tasks/gno-full-deploy.ts b/tasks/gno-full-deploy.ts index f7ccb7da..4612e4b8 100644 --- a/tasks/gno-full-deploy.ts +++ b/tasks/gno-full-deploy.ts @@ -141,6 +141,20 @@ task('gno-full-deploy', 'deploys StakeWise V3 for Gnosis').setAction(async (task ) const depositDataRegistryAddress = await depositDataRegistry.getAddress() + // Deploy ValidatorsChecker + const gnoValidatorsChecker = await deployContract( + hre, + 'GnoValidatorsChecker', + [ + networkConfig.validatorsRegistry, + keeperAddress, + vaultsRegistryAddress, + depositDataRegistryAddress, + ], + 'contracts/validators/GnoValidatorsChecker.sol:GnoValidatorsChecker' + ) + const gnoValidatorsCheckerAddress = await gnoValidatorsChecker.getAddress() + // Deploy XdaiExchange implementation const xdaiExchangeConstructorArgs = [ networkConfig.gnosis.gnoToken, @@ -337,6 +351,7 @@ task('gno-full-deploy', 'deploys StakeWise V3 for Gnosis').setAction(async (task VaultsRegistry: vaultsRegistryAddress, Keeper: keeperAddress, DepositDataRegistry: depositDataRegistryAddress, + GnoValidatorsChecker: gnoValidatorsCheckerAddress, XdaiExchange: xdaiExchangeAddress, GnoGenesisVault: genesisVaultAddress, GnoVaultFactory: factories[0], @@ -359,8 +374,9 @@ task('gno-full-deploy', 'deploys StakeWise V3 for Gnosis').setAction(async (task fs.mkdirSync(DEPLOYMENTS_DIR) } + // save addresses fs.writeFileSync(fileName, json, 'utf-8') - console.log('Saved to', fileName) + console.log('Addresses saved to', fileName) console.log('NB! Commit and accept StakeWise V2 PoolEscrow ownership to GnoGenesisVault') }) diff --git a/test/ValidatorsChecker.spec.ts b/test/ValidatorsChecker.spec.ts new file mode 100644 index 00000000..17d4c7d0 --- /dev/null +++ b/test/ValidatorsChecker.spec.ts @@ -0,0 +1,384 @@ +import { SignTypedDataVersion, signTypedData } from '@metamask/eth-sig-util' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' +import { Contract, Signer, Wallet } from 'ethers' +import { ethers } from 'hardhat' +import { + DepositDataRegistry, + EthValidatorsChecker, + GnoValidatorsChecker, + EthVault, + Keeper, + VaultsRegistry, +} from '../typechain-types' +import { MAX_UINT256, ZERO_ADDRESS } from './shared/constants' +import { getEthVaultV1Factory } from './shared/contracts' +import { expect } from './shared/expect' +import { + createEthValidatorsChecker, + deployEthVaultV1, + encodeEthVaultInitParams, + ethVaultFixture, +} from './shared/fixtures' +import { + EthValidatorsData, + createEthValidatorsData, + getValidatorsManagerSigningData, + getValidatorsMultiProof, +} from './shared/validators' +import { createGnoValidatorsChecker } from './shared/gnoFixtures' + +const networks = ['ETHEREUM', 'GNOSIS'] + +networks.forEach((network) => { + describe(`ValidatorsChecker [${network}]`, () => { + let validatorDeposit = ethers.parseEther('32') + if (network == 'GNOSIS') { + validatorDeposit = ethers.parseEther('1') + } + + const capacity = MAX_UINT256 + const feePercent = 1000 + const metadataIpfsHash = 'bafkreidivzimqfqtoqxkrpge6bjyhlvxqs3rhe73owtmdulaxr5do5in7u' + + let admin: Signer, adminV1: Signer, other: Wallet + let vault: EthVault, + keeper: Keeper, + validatorsRegistry: Contract, + vaultsRegistry: VaultsRegistry, + depositDataRegistry: DepositDataRegistry, + validatorsChecker: EthValidatorsChecker | GnoValidatorsChecker, + vaultV1: Contract, + vaultNotDeposited: EthVault + let validatorsData: EthValidatorsData + let validators: Buffer[] + let validatorsRegistryRoot: string + + beforeEach('deploy fixture', async () => { + ;[admin, adminV1, other] = await (ethers as any).getSigners() + + const fixture = await loadFixture(ethVaultFixture) + validatorsRegistry = fixture.validatorsRegistry + keeper = fixture.keeper + depositDataRegistry = fixture.depositDataRegistry + vaultsRegistry = fixture.vaultsRegistry + + if (network == 'ETHEREUM') { + validatorsChecker = await createEthValidatorsChecker( + validatorsRegistry, + keeper, + vaultsRegistry, + depositDataRegistry + ) + } else if (network == 'GNOSIS') { + validatorsChecker = await createGnoValidatorsChecker( + validatorsRegistry, + keeper, + vaultsRegistry, + depositDataRegistry + ) + } else { + throw Error('unknown network') + } + + vault = await fixture.createEthVault(admin, { + capacity, + feePercent, + metadataIpfsHash, + }) + vaultV1 = await deployEthVaultV1( + await getEthVaultV1Factory(), + adminV1, + keeper, + vaultsRegistry, + validatorsRegistry, + fixture.osTokenVaultController, + fixture.osTokenConfig, + fixture.sharedMevEscrow, + encodeEthVaultInitParams({ + capacity, + feePercent, + metadataIpfsHash, + }) + ) + // get real admin in the case of mainnet fork + admin = await ethers.getImpersonatedSigner(await vault.admin()) + + validatorsData = await createEthValidatorsData(vault) + const numValidators = 5 + validators = validatorsData.validators.slice(0, numValidators) + + validatorsRegistryRoot = await validatorsRegistry.get_deposit_root() + await vault.connect(other).deposit(other.address, ZERO_ADDRESS, { value: validatorDeposit }) + await vaultV1.connect(other).deposit(other.address, ZERO_ADDRESS, { value: validatorDeposit }) + + vaultNotDeposited = await fixture.createEthVault( + admin, + { + capacity, + feePercent, + metadataIpfsHash, + }, + true, // own mev escrow + true // skip fork + ) + // Remember about security deposit 1 gwei, so vault balance is not zero at this point. + let validatorDepositIncomplete = ethers.parseEther('31') + if (network == 'GNOSIS') { + validatorDepositIncomplete = ethers.parseEther('0.9') + } + await vaultNotDeposited + .connect(other) + .deposit(other.address, ZERO_ADDRESS, { value: validatorDepositIncomplete }) + + await depositDataRegistry + .connect(admin) + .setDepositDataRoot(await vault.getAddress(), validatorsData.root) + + await vaultV1.connect(adminV1).setValidatorsRoot(validatorsData.root) + await depositDataRegistry + .connect(admin) + .setDepositDataRoot(await vaultNotDeposited.getAddress(), validatorsData.root) + }) + + describe('check validators manager signature', () => { + // I need explicit privateKey to create EIP-712 signature + const validatorsManager = new Wallet( + '0x798ce32ec683f3287dab0594b9ead26403a6da9c1d216d00e5aa088c9cf36864' + ) + const fakeValidatorsManager = new Wallet( + '0xb4942e4f87ddfd23ddf833a47ebcf6bb37e0da344a2d6e229fd593c0b22bdb68' + ) + + beforeEach('set validators manager', async () => { + await vault.connect(admin).setValidatorsManager(validatorsManager.address) + }) + + it('fails for invalid validators registry root', async () => { + const fakeRoot = Buffer.alloc(32).fill(1) + await expect( + validatorsChecker + .connect(admin) + .checkValidatorsManagerSignature(await vault.getAddress(), fakeRoot, '0x', '0x') + ).to.be.revertedWithCustomError(validatorsChecker, 'InvalidValidatorsRegistryRoot') + }) + + it('fails for non-vault', async () => { + await expect( + validatorsChecker + .connect(admin) + .checkValidatorsManagerSignature(other.address, validatorsRegistryRoot, '0x', '0x') + ).to.be.revertedWithCustomError(validatorsChecker, 'InvalidVault') + }) + + it('fails for vault v1', async () => { + await expect( + validatorsChecker + .connect(admin) + .checkValidatorsManagerSignature( + await vaultV1.getAddress(), + validatorsRegistryRoot, + '0x', + '0x' + ) + ).to.be.revertedWithCustomError(validatorsChecker, 'InvalidVault') + }) + + it('fails for vault not collateralized not deposited', async () => { + await expect( + validatorsChecker + .connect(admin) + .checkValidatorsManagerSignature( + await vaultNotDeposited.getAddress(), + validatorsRegistryRoot, + '0x', + '0x' + ) + ).to.be.revertedWithCustomError(validatorsChecker, 'InsufficientAssets') + }) + + it('fails for signer who is not validators manager', async () => { + const vaultAddress = await vault.getAddress() + const typedData = await getValidatorsManagerSigningData( + Buffer.concat(validators), + vault, + validatorsRegistryRoot + ) + const signature = signTypedData({ + privateKey: Buffer.from(ethers.getBytes(fakeValidatorsManager.privateKey)), + data: typedData, + version: SignTypedDataVersion.V4, + }) + await expect( + validatorsChecker + .connect(admin) + .checkValidatorsManagerSignature( + vaultAddress, + validatorsRegistryRoot, + Buffer.concat(validators), + ethers.getBytes(signature) + ) + ).to.be.revertedWithCustomError(validatorsChecker, 'AccessDenied') + }) + + it('succeeds', async () => { + const vaultAddress = await vault.getAddress() + const typedData = await getValidatorsManagerSigningData( + Buffer.concat(validators), + vault, + validatorsRegistryRoot + ) + const signature = signTypedData({ + privateKey: Buffer.from(ethers.getBytes(validatorsManager.privateKey)), + data: typedData, + version: SignTypedDataVersion.V4, + }) + const blockNumber = await ethers.provider.getBlockNumber() + + expect( + await validatorsChecker + .connect(admin) + .checkValidatorsManagerSignature( + vaultAddress, + validatorsRegistryRoot, + Buffer.concat(validators), + ethers.getBytes(signature) + ) + ).to.eq(blockNumber) + }) + }) + + describe('check deposit data root', () => { + let proof: string[], proofFlags: boolean[], proofIndexes: number[] + + beforeEach('set multiproof', () => { + // Proof is empty list when passing all validators + // I need non-empty proof for some test cases + // Slice validators because of that + + const multiProof = getValidatorsMultiProof(validatorsData.tree, validators, [ + ...Array(validators.length).keys(), + ]) + const sortedVals = multiProof.leaves.map((v) => v[0]) + + ;(proof = multiProof.proof), + (proofFlags = multiProof.proofFlags), + (proofIndexes = validators.map((v) => sortedVals.indexOf(v))) + }) + + it('fails for invalid validators registry root', async () => { + const fakeRoot = Buffer.alloc(32).fill(1) + + await expect( + validatorsChecker + .connect(admin) + .checkDepositDataRoot( + await vault.getAddress(), + fakeRoot, + Buffer.concat(validators), + proof, + proofFlags, + proofIndexes + ) + ).to.be.revertedWithCustomError(validatorsChecker, 'InvalidValidatorsRegistryRoot') + }) + + it('fails for non-vault', async () => { + await expect( + validatorsChecker + .connect(admin) + .checkDepositDataRoot( + other.address, + validatorsRegistryRoot, + Buffer.concat(validators), + proof, + proofFlags, + proofIndexes + ) + ).to.be.revertedWithCustomError(validatorsChecker, 'InvalidVault') + }) + + it('fails for vault not collateralized not deposited', async () => { + await expect( + validatorsChecker + .connect(admin) + .checkDepositDataRoot( + await vaultNotDeposited.getAddress(), + validatorsRegistryRoot, + Buffer.concat(validators), + proof, + proofFlags, + proofIndexes + ) + ).to.be.revertedWithCustomError(validatorsChecker, 'InsufficientAssets') + }) + + it('fails for validators manager not equal to deposit data registry', async () => { + await vault.connect(admin).setValidatorsManager(other.address) + + await expect( + validatorsChecker + .connect(admin) + .checkDepositDataRoot( + await vault.getAddress(), + validatorsRegistryRoot, + Buffer.concat(validators), + proof, + proofFlags, + proofIndexes + ) + ).to.be.revertedWithCustomError(validatorsChecker, 'AccessDenied') + }) + + it('fails for invalid proof', async () => { + proof[0] = '0x' + '1'.repeat(64) + + await expect( + validatorsChecker + .connect(admin) + .checkDepositDataRoot( + await vault.getAddress(), + validatorsRegistryRoot, + Buffer.concat(validators), + proof, + proofFlags, + proofIndexes + ) + ).to.be.revertedWithCustomError(validatorsChecker, 'InvalidProof') + }) + + it('succeeds for vault v1', async () => { + const blockNumber = await ethers.provider.getBlockNumber() + + expect( + await validatorsChecker + .connect(admin) + .checkDepositDataRoot( + await vaultV1.getAddress(), + validatorsRegistryRoot, + Buffer.concat(validators), + proof, + proofFlags, + proofIndexes + ) + ).to.eq(blockNumber) + }) + + it('succeeds for vault v2', async () => { + const blockNumber = await ethers.provider.getBlockNumber() + + expect( + await validatorsChecker + .connect(admin) + .checkDepositDataRoot( + await vault.getAddress(), + validatorsRegistryRoot, + Buffer.concat(validators), + proof, + proofFlags, + proofIndexes + ) + ).to.eq(blockNumber) + }) + }) + }) +}) diff --git a/test/shared/fixtures.ts b/test/shared/fixtures.ts index 51ce0aed..6504e22b 100644 --- a/test/shared/fixtures.ts +++ b/test/shared/fixtures.ts @@ -53,6 +53,7 @@ import { VaultsRegistry__factory, DepositDataRegistry, DepositDataRegistry__factory, + EthValidatorsChecker__factory, } from '../../typechain-types' import { getEthValidatorsRegistryFactory, getOsTokenConfigV1Factory } from './contracts' import { @@ -257,6 +258,23 @@ export const createDepositDataRegistry = async function ( return DepositDataRegistry__factory.connect(await contract.getAddress(), signer) } +export const createEthValidatorsChecker = async function ( + validatorsRegistry: Contract, + keeper: Keeper, + vaultsRegistry: VaultsRegistry, + depositDataRegistry: DepositDataRegistry +) { + const signer = await ethers.provider.getSigner() + const factory = await ethers.getContractFactory('EthValidatorsChecker') + const contract = await factory.deploy( + await validatorsRegistry.getAddress(), + await keeper.getAddress(), + await vaultsRegistry.getAddress(), + await depositDataRegistry.getAddress() + ) + return EthValidatorsChecker__factory.connect(await contract.getAddress(), signer) +} + export const createOsTokenVaultController = async function ( keeperAddress: string, registry: VaultsRegistry, diff --git a/test/shared/gnoFixtures.ts b/test/shared/gnoFixtures.ts index e9984542..455af3a9 100644 --- a/test/shared/gnoFixtures.ts +++ b/test/shared/gnoFixtures.ts @@ -46,6 +46,7 @@ import { XdaiExchange__factory, PriceFeedMock, PriceFeedMock__factory, + GnoValidatorsChecker__factory, } from '../../typechain-types' import { getGnoValidatorsRegistryFactory } from './contracts' import { @@ -710,3 +711,20 @@ export const gnoVaultFixture = async function (): Promise { }, } } + +export const createGnoValidatorsChecker = async function ( + validatorsRegistry: Contract, + keeper: Keeper, + vaultsRegistry: VaultsRegistry, + depositDataRegistry: DepositDataRegistry +) { + const signer = await ethers.provider.getSigner() + const factory = await ethers.getContractFactory('GnoValidatorsChecker') + const contract = await factory.deploy( + await validatorsRegistry.getAddress(), + await keeper.getAddress(), + await vaultsRegistry.getAddress(), + await depositDataRegistry.getAddress() + ) + return GnoValidatorsChecker__factory.connect(await contract.getAddress(), signer) +}